zoukankan      html  css  js  c++  java
  • MYSQL基础

    一、

    1、打开mysql服务

    sudo service mysql start

    2、root用户登录

    mysql -uroot

    3、查看数据库

    show databases;

    4、选择连接库

    use <数据库名>

    5、查看当前正在使用的库

    select database();

    6、查看表

    show tables;

    7、退出

    quit或者exit

    二、

    1、新建数据库

    出于严谨,而且便于区分保留字和变量名,保留字大写,变量和数据小写

    CREATE DATABASE <数据库名字>;  

    2、新建数据表

    CREATE TABLE 表的名字

    (

    列名a 数据类型(数据长度),

    列名b 数据类型(数据长度),

    列名c 数据类型(数据长度)

    );

      数据类型

      CHAR 和 VARCHAR 的区别: 

      CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。

      ENUM和SET的区别: 

      ENUM 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 SET 类型的值则可以多选。

      想要了解更多关于 MySQL 数据类型的信息,可以参考下面两篇博客。

        https://www.cnblogs.com/bukudekong/archive/2011/06/27/2091590.html

        https://blog.csdn.net/anxpp/article/details/51284106#comments

    3、插入数据

    INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);

      数据类型是 CHAR、VARCHAR、TEXT、DATE、TIME、ENUM 等的数据需要用单引号修饰,而 INT,FLOAT,DOUBLE 等则不需要。

    三、SQL约束

    CREATE DATABASE mysql_shiyan;

    use mysql_shiyan;

    CREATE TABLE department
    (
    dpt_name CHAR(20) NOT NULL,
    people_num INT(10) DEFAULT '10',
    CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)#dpt_pk主键名(自定义)
    );

    CREATE TABLE employee
    (
    id INT(10) PRIMARY KEY,#主键
    name CHAR(20),
    age INT(10),
    salary INT(10) NOT NULL,
    phone INT(12) NOT NULL,
    in_dpt CHAR(20) NOT NULL,
    UNIQUE (phone),
    CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)#emp_fk外键名字(自定义),in_dpt为外键,参考列为department表的dpt_name列。
    );

    CREATE TABLE project
    (
    proj_num INT(10) NOT NULL,
    proj_name CHAR(20) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE DEFAULT '2015-04-01',
    of_dpt CHAR(20) REFERENCES department(dpt_name),
    CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)#proj_pk主键名字(自定义),proj_num,proj_name复合主键
    );

    AUTO_INCREMENT 自增

    四、SELECT语句

    建表语句
    CREATE DATABASE mysql_shiyan;

    use mysql_shiyan;

    CREATE TABLE department
    (
    dpt_name CHAR(20) NOT NULL,
    people_num INT(10) DEFAULT '10',
    CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)
    );

    CREATE TABLE employee
    (
    id INT(10) PRIMARY KEY,
    name CHAR(20),
    age INT(10),
    salary INT(10) NOT NULL,
    phone INT(12) NOT NULL,
    in_dpt CHAR(20) NOT NULL,
    UNIQUE (phone),
    CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)
    );

    CREATE TABLE project
    (
    proj_num INT(10) NOT NULL,
    proj_name CHAR(20) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE DEFAULT '2015-04-01',
    of_dpt CHAR(20) REFERENCES department(dpt_name),
    CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
    );

    插入数据

    #INSERT INTO department(dpt_name,people_num) VALUES('部门',人数);

    INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
    INSERT INTO department(dpt_name,people_num) VALUES('dpt2',12);
    INSERT INTO department(dpt_name,people_num) VALUES('dpt3',10);
    INSERT INTO department(dpt_name,people_num) VALUES('dpt4',15);


    #INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(编号,'名字',年龄,工资,电话,'部门');

    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(01,'Tom',26,2500,119119,'dpt4');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(02,'Jack',24,2500,120120,'dpt2');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(03,'Rose',22,2800,114114,'dpt3');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(04,'Jim',35,3000,100861,'dpt1');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(05,'Mary',21,3000,100101,'dpt2');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(06,'Alex',26,3000,123456,'dpt1');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(07,'Ken',27,3500,654321,'dpt1');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(08,'Rick',24,3500,987654,'dpt3');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(09,'Joe',31,3600,110129,'dpt2');
    INSERT INTO employee(id,name,age,salary,phone,in_dpt) VALUES(10,'Mike',23,3400,110110,'dpt4');
    INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(11,'Jobs',3600,019283,'dpt2');
    INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(12,'Tony',3400,102938,'dpt3');

    #INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(编号,'工程名','开始时间','结束时间','部门名');

    INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(01,'proj_a','2015-01-15','2015-01-31','dpt2');
    INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(02,'proj_b','2015-01-15','2015-02-15','dpt1');
    INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(03,'proj_c','2015-02-01','2015-03-01','dpt4');
    INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(04,'proj_d','2015-02-15','2015-04-01','dpt3');
    INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(05,'proj_e','2015-02-25','2015-03-01','dpt4');
    INSERT INTO project(proj_num,proj_name,start_date,end_date,of_dpt) VALUES(06,'proj_f','2015-02-26','2015-03-01','dpt2');

    基本格式:SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;

    1、查询表的所有内容

    SELECT * FROM 表名字 WHERE 限制条件;

    2、IN 和 NOT IN

      IN 用于筛选“在”某个范围内的结果

      NOT IN 用于筛选“不在”某个范围内的结果

    3、通配符

    关键字 LIKE 可用于实现模糊查询,常见于搜索功能中。

    和 LIKE 联用的通常还有通配符,代表未知字符。

    SQL中的通配符是 _ 和 % 。其中 _ 代表一个未指定字符,% 代表不定个未指定字符

    4、对结果排序

     ORDER BY 对结果按某一列来排序

    默认情况下,ORDER BY 的结果是升序排列,而使用关键词 ASC 和 DESC可指定升序或降序排序

    5、SQL 内置函数和计算

     SQL 有 5 个内置函数,这些函数都对 SELECT 的结果做操作:

     COUNT:计数,可用于任何数据类型

    SUM:求和,只能对数字类数据类型做计算

    AVG:求平均值,只能对数字类数据类型做计算

    MAX:最大值,可用于数值、字符串或是日期时间数据类型

    MIN:最小值,可用于数值、字符串或是日期时间数据类型

    6、子查询

        

    想要知道名为 "Tom" 的员工所在部门做了几个工程。员工信息储存在 employee 表中,但工程信息储存在 project 表中。

    SELECT of_dpt,COUNT(proj_name) AS count_project FROM project GROUP BY of_dpt HAVING of_dpt IN (SELECT in_dpt FROM employee WHERE name='Tom');

    HAVING 关键字的作用和 WHERE 是一样的,都是说明接下来要进行条件筛选操作。区别在于 HAVING 用于对分组后的数据进行筛选

     

    7、连接查询

    在处理多个表时,子查询只有在结果来自一个表时才有用。但如果需要显示两个表或多个表中的数据,这时就必须使用连接 (join) 操作。 连接的基本思想是把两个或多个表当作一个新的表来操作,如下:

    各员工所在部门的人数,其中员工的 id 和 name 来自 employee 表,people_num 来自 department 表:

    SELECT id,name,people_num FROM employee,department WHERE employee.in_dpt = department.dpt_name ORDER BY id;

    或:

    SELECT id,name,people_num FROM employee JOIN department ON employee.in_dpt = department.dpt_name ORDER BY id;

    使用连接查询的方式,查询出各员工所在部门的人数与工程数,工程数命名为 count_project。(连接 3 个表,并使用 COUNT 内置函数)

    分组不可或缺,否则会出现无意义的数据(一般来说连接查询语句中有 COUNT 就会有 GROUP BY)

    正解

     mysql> SELECT name, people_num, COUNT(proj_name) AS count_project -> FROM employee, department, project -> WHERE in_dpt = dpt_name AND of_dpt = dpt_name -> GROUP BY name, people_num;

    五、数据库及表的修改和删除

    1、删除数据库

    DROP DATABASE test_01;

    2、重命名一张表

    RENAME TABLE 原名 TO 新名字;

    或:

    ALTER TABLE 原名 RENAME 新名;

    或:

    ALTER TABLE 原名 RENAME TO 新名;

    3、删除一张表

    DROP TABLE 表名字;

    4、增加一列(新增加的列,被默认放置在这张表的最右边)

    ALTER TABLE 表名字 ADD COLUMN 列名字 数据类型 约束;

    或:

    ALTER TABLE 表名字 ADD 列名字 数据类型 约束;

    ALTER TABLE employee ADD height INT(4) DEFAULT 170;
    

       提醒:语句中的 INT(4) 不是表示整数的字节数,而是表示该值的显示宽度,如果设置填充字符为 0,则 170 显示为 0170

    5、增加一列(增加的列插入在指定位置)

    需要在语句的最后使用AFTER关键词(“AFTER 列1” 表示新增的列被放置在 “列1” 的后面)。

    ALTER TABLE employee ADD weight INT(4) DEFAULT 120 AFTER age;

    6、增加一列(放在第一列的位置)

    使用 FIRST 关键词

    ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;

     7、删除一列

    ALTER TABLE 表名字 DROP COLUMN 列名字;

    或:

    ALTER TABLE 表名字 DROP 列名字;

    8、重命名一列

    ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;
    
    注意:这条重命名语句后面的 “数据类型” 不能省略,否则重命名失败。

    9、改变数据类型

    ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;(当原列名和新列名相同的时候,指定新的数据类型或约束,就可以用于修改数据类型或约束。

    或:
    ALTER TABLE 表名字 MODIFY 列名字 新数据类型;
    需要注意的是,修改数据类型可能会导致数据丢失,所以要慎重使用。

     10、修改表中某个值

    UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 条件;

    注意:一定要有 WHERE 条件,否则会出现你不想看到的后果

    11、删除一行记录

    DELETE FROM 表名字 WHERE 条件;
    
    注意: 删除表中的一行数据,也必须加上 WHERE 条件

    六、其他基本操作

    1、索引:可以加快查询速度

      对一张表中的某个列建立索引

      ALTER TABLE 表名字 ADD INDEX 索引名 (列名);

      或:

      CREATE INDEX 索引名 ON 表名字 (列名);

      查看新建的索引

      SHOW INDEX FROM 表名字; 

    在使用 SELECT 语句查询的时候,语句中 WHERE 里面的条件,会自动判断有没有可用的索引。

    2、视图:是一种虚拟存在的表

      创建视图的语句格式为:

      CREATE VIEW 视图名(列a,列b,列c) AS SELECT 列1,列2,列3 FROM 表名字;

    3、导入:从文件中导入数据到表  

      导入一个纯数据文件 

     LOAD DATA INFILE '文件路径和文件名' INTO TABLE 表名字;

     SQL 语句的导入方式

      source *.sql 

    4、导出:从表中导出到文件中

    SELECT 列1,列2 INTO OUTFILE '文件路径和文件名' FROM 表名字;
    

      注意:语句中 “文件路径” 之下不能已经有同名文件。

    5、备份:mysqldump 备份数据库到文件

      备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。

      mysqldump -u root 数据库名>备份文件名; #备份整个数据库

      mysqldump -u root 数据库名 表名字>备份文件名; #备份整个表

    6、恢复:从文件恢复数据库

     source *.sql 

    或:

      CREATE DATABASE test; #新建一个名为test的数据库

     mysql -u root test < bak.sql#退出 MySQL,然后输入语句进行恢复,把备份的 bak.sql 恢复到 test 数据库:

    做个题吧(新东方的面试题)

    现有三张库表,分别为账号表Account、考试成绩表Exam、课程信息表Course,字段定义如下:

    写sql输出高三年级人数大于50人的班的各学科平均分,按班级人数降序排序,查询结果形如下表:

    SELECT 班级,班级人数,考试科目,班级平均分 from (select account.class as 班级,exam.course as 考试科目,avg(exam.score)as 班级平均分 from account join exam
    on account.ID = exam.ID and account.class like '高三%' and account.class in(select class from account group by class having count(class)>50)
    group by exam.course,account.class) as a join (select class,count(*)AS 班级人数 FROM account GROUP BY class HAVING count(class)>50) as b on a.班级=b.class ORDER BY 班级人数 DESC ;

    优化:

    select a.class,b.count,c.course,avg(score) FROM
    account a
    INNER JOIN
    (select class,count(1) count from account where class like '高三%' group by class HAVING count(1)>50) b
    on a.class=b.class
    INNER JOIN
    exam c
    ON
    c.id=a.id
    group by a.class,c.course
    order by b.count desc

    有人说这个题目都不严谨,你发现了吗

    
    




     

     

     

     
























































  • 相关阅读:
    devpress 的gridview 控件的行拖拽 z
    JAVA常见算法题(八)
    JAVA常见算法题(七)
    JAVA常见算法题(六)
    JAVA常见算法题(五)
    JAVA常见算法题(四)
    JAVA常见算法题(三)
    JAVA常见算法题(二)
    JAVA常见算法题(一)
    SpringBoot 框架整合webservice
  • 原文地址:https://www.cnblogs.com/suitcases/p/11339256.html
Copyright © 2011-2022 走看看