天天看点

MySql之SQL语句学习总结

 分类

  * DDL(Data DefinitionLanguage):数据定义语言,用来定义数据库对象:库、表、列等;

  * DML(Data ManipulationLanguage):数据操作语言,用来定义数据库记录(数据);

  * DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;

  * DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

1、DDL

1.1 基本操作

 *  查看所有数据库名称:SHOW DATABASES; 

 *  切换数据库:USE mydb1,切换到mydb1数据库;

1.2 操作数据库

 *  创建数据库:Create DATABASE IF NOT EXISTS  mydb1  default charset utf8 COLLATE utf8_general_ci;

     创建数据库,例如:CREATE DATABASE mydb1,创建一个名为mydb1的数据库。如果这个数据已经存在,那么会报错。

     例如:CREATE DATABASE IF NOT EXISTS mydb1,在名为mydb1的数据库不存在时创建该库,这样可以避免报错。

 *  删除数据库:DROP DATABASE [IF EXISTS] mydb1;

     删除数据库,例如:DROP DATABASE mydb1,删除名为mydb1的数据库。如果这个数据库不存在,那么会报错。

     例如:DROP DATABASE IF EXISTS mydb1,就算mydb1不存在,也不会的报错。

 *  修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8

     修改数据库mydb1的编码为utf8。注意,在MySQL中所有的UTF-8编码都不能使用中间的“-”,即UTF-8要书写为UTF8。

1.3 数据类型

 MySQL与Java一样,也有数据类型。MySQL中数据类型主要应用在列上。

 常用类型:

 *  int:整型

 *  double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;

 *  decimal:泛型型,在表单钱方面使用该类型,因为不会出现精度缺失问题;

 *  char:固定长度字符串类型;

 *  varchar:可变长度字符串类型;

 *  text:字符串类型;

 *  blob:字节类型;

 *  date:日期类型,格式为:yyyy-MM-dd;

 *  time:时间类型,格式为:hh:mm:ss

 *  timestamp:时间戳类型;

1.4 操作表

 *  创建表:

     CREATE TABLE 表名(

       列名 列类型,

       列名 列类型,

       ......

     );

 *  查看当前数据库中所有表名称:SHOW TABLES; 

 *  查看指定表的创建语句:SHOW CREATE TABLE emp,查看emp表的创建语句;

 *  查看表结构:DESC emp,查看emp表结构;

 *  删除表:DROP TABLE emp,删除emp表;

 *  修改表:

     1.       修改之添加列:给stu表添加classname列:

               ALTER TABLE stu ADD (classname varchar(100));

     2.       修改之修改列类型:修改stu表的gender列类型为CHAR(2):

                ALTER TABLE stu MODIFY gender CHAR(2);

     3.       修改之修改列名:修改stu表的gender列名为sex:

                ALTER TABLE stu change gender sex CHAR(2);

     4.       修改之删除列:删除stu表的classname列:

                ALTER TABLE stu DROP classname;

     5.       修改之修改表名称:修改stu表名称为student:

                ALTER TABLE stu RENAME TO student;

2、DML

2.1 插入数据

语法:

INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2)

INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');
INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');

 语法:

INSERT INTO 表名 VALUES(值1,值2,…)

因为没有指定要插入的列,表示按创建表时列的顺序插入所有列的值:

INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

注意:所有字符串数据必须使用单引用!

2.2 修改数据

语法:

UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件]

UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;
UPDATE stu SET sname=’liSi’, age=’20’ WHERE age>50 AND gender=’male’;
UPDATE stu SET sname=’wangWu’, age=’30’ WHERE age>60 OR gender=’female’;

UPDATE stu SET gender=’female’ WHERE gender IS NULL

UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;

2.3 删除数据

语法:

DELETE FROM 表名 [WHERE 条件]

DELETE FROM stu WHERE sid=’s_1001’003B
DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;
DELETE FROM stu;

语法:

TRUNCATE TABLE 表名

TRUNCATE TABLE stu; 

虽然TRUNCATE和DELETE都可以删除表的所有记录,但有原理不同。DELETE的效率没有TRUNCATE高!

TRUNCATE其实属性DDL语句,因为它是先DROP TABLE,再CREATE TABLE。而且TRUNCATE删除的记录是无法回滚的,

但DELETE删除的记录是可以回滚的(回滚是事务的知识!)。

3、DCL

3.1 创建用户

语法:

CREATE USER 用户名@地址 IDENTIFIED BY '密码';

CREATE USER [email protected] IDENTIFIED BY ‘123’; 
CREATE USER user2@’%’ IDENTIFIED BY ‘123’;

user1用户只能在localhost这个IP登录mysql服务器 

user2用户可以在任何电脑上登录mysql服务器

3.2 给用户授权

语法:

GRANT 权限1, … , 权限n ON 数据库.* TO 用户名

GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO [email protected];
GRANT ALL ON mydb1.* TO [email protected];

3.3 撤销授权

语法:

REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名

REVOKE CREATE,ALTER,DROP ON mydb1.* FROM [email protected];

 3.4 查看用户权限

语法:

SHOW GRANTS FOR用户名

SHOW GRANTS FOR [email protected];

3.5 删除用户

语法:

DROP USER 用户名

DROP USER [email protected];

 3.6 修改用户密码

语法:

USE mysql;

UPDATE USER SETPASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;

FLUSHPRIVILEGES;

UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;

FLUSH PRIVILEGES;

4、DQL

DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。

语法:

SELECT selection_list

FROM table_list

WHERE condition

GROUP BY grouping_columns

HAVING condition

ORDER BY sorting_columns

LIMIT offset_start, row_count

4.1 基础查询

 *  查询所有列

    SELECT* FROM stu;

 *  查询指定列

    SELECTsid, sname, age FROM stu;

4.2 条件查询

 条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

 *  =、!=、<>、<、<=、>、>=;

 *  BETWEEN…AND;

 *  IN(set);

 *  IS NULL;

 *  AND;

 *  OR;

 *  NOT;

 例如:

 >查询性别为女,并且年龄小于50的记录

   SELECT * FROM stu  WHEREgender='female' AND ge<50;

 >查询学号为S_1001,或者姓名为liSi的记录

   SELECT * FROM stu  WHERE sid ='S_1001' OR  sname='liSi';

 >查询学号为S_1001,S_1002,S_1003的记录

   SELECT * FROM stu  WHERE sid IN('S_1001','S_1002','S_1003');

 >查询学号不是S_1001,S_1002,S_1003的记录

   SELECT * FROM tab_student  WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

 >查询年龄为null的记录

   SELECT * FROM stu  WHERE age IS NULL;

 >查询年龄在20到40之间的学生记录

   SELECT * FROM stu  WHERE age>=20 AND age<=40;

    或者

   SELECT * FROM stu  WHERE age BETWEEN 20 AND 40;

 >查询性别非男的学生记录

   SELECT * FROM stu  WHERE gender!='male';

   或者

   SELECT * FROM stu  WHERE gender<>'male';

   或者

   SELECT * FROM stu  WHERE NOT gender='male';

 >查询姓名不为null的学生记录

   SELECT * FROM stu  WHERE NOT sname IS NULL;

   或者

   SELECT * FROM stu  WHERE sname IS NOT NULL;

4.3 模糊查询

 当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。

 *  查询姓名由5个字母构成的学生记录

     SELECT * FROM stu  WHERE sname LIKE '_____';

     模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。

 *  查询姓名由5个字母构成,并且第5个字母为“i”的学生记录

    SELECT * FROM stu  WHERE sname LIKE '____i';

 *  查询姓名以“z”开头的学生记录

     SELECT * FROM stu  WHERE sname LIKE 'z%';

     其中“%”匹配0~n个任何字母。

 *  查询姓名中第2个字母为“i”的学生记录

     SELECT * FROM stu  WHERE sname LIKE '_i%';

 *  查询姓名中包含“a”字母的学生记录

     SELECT * FROM stu  WHERE sname LIKE '%a%';

4.4 字段控制查询

 *  去除重复记录

     去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。

     当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:

     SELECT DISTINCT sal FROM emp;

 *  查看雇员的月薪与佣金之和

     因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。

     SELECT *,sal+comm FROM emp;

 *  comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。

     下面使用了把NULL转换成数值0的函数IFNULL:

     SELECT *,sal+IFNULL(comm,0) FROM emp;

  *  给列名添加别名

      在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:

      SELECT *, sal+IFNULL(comm,0) AStotal FROM emp;

      给列起别名时,是可以省略AS关键字的:

      SELECT *,sal+IFNULL(comm,0)total FROM emp;

4.5 排序

 *  查询所有学生记录,按年龄升序排序

    SELECT * FROM stu  ORDER BY sage ASC;

    或者

    SELECT * FROM stu  ORDER BY sage;

 *  查询所有学生记录,按年龄降序排序

    SELECT * FROM stu  ORDER BY age DESC;

 *  查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序

     SELECT * FROM emp  ORDER BY sal DESC,empno ASC; 

4.6 聚合函数

 聚合函数是用来做纵向运算的函数:

 >  COUNT():统计指定列不为NULL的记录行数;

 >  MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

 >  MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

 >  SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

 >  AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

 *  COUNT

     当需要纵向统计时可以使用COUNT()。

     >查询emp表中记录数:

       SELECT COUNT(*) AS cnt FROM emp;

     >查询emp表中有佣金的人数:

       SELECT COUNT(comm) cnt FROM emp;

       注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。

     >查询emp表中月薪大于2500的人数:

       SELECT COUNT(*)  FROM emp  WHERE sal > 2500;

     >统计月薪与佣金之和大于2500元的人数:

       SELECT COUNT(*) AS cnt FROM empWHERE sal+IFNULL(comm,0) > 2500;

     >查询有佣金的人数,以及有领导的人数:

       SELECT COUNT(comm), COUNT(mgr)FROM emp;

 *  SUM和AVG

     当需要纵向求和时使用sum()函数。

     >查询所有雇员月薪和:

       SELECT SUM(sal) FROM emp;

     >查询所有雇员月薪和,以及所有雇员佣金和:

       SELECT SUM(sal), SUM(comm) FROM emp;

     >查询所有雇员月薪+佣金和:

       SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

     >统计所有员工平均工资:

       SELECT SUM(sal), COUNT(sal) FROMemp;

       或者

       SELECT AVG(sal) FROM emp;

 *  MAX和MIN

     >查询最高工资和最低工资:

       SELECT MAX(sal), MIN(sal) FROM emp;

4.7 分组查询

 当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。

 *  分组查询

     >查询每个部门的部门编号和每个部门的工资和:

       SELECT deptno, SUM(sal) FROM emp  GROUP BY deptno;

     >查询每个部门的部门编号以及每个部门的人数:

       SELECT deptno,COUNT(*) FROM emp  GROUP BY deptno;

     >查询每个部门的部门编号以及每个部门工资大于1500的人数:

       SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

 *  HAVING子句

     >查询工资总和大于9000的部门编号以及工资和:

       SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;

 注意,WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;

    而HAVING是对分组后数据的约束。

4.8 LIMIT

 LIMIT用来限定查询结果的起始行,以及总行数。

 *  查询5行记录,起始行从0开始

    SELECT * FROM emp LIMIT 0, 5;

     注意,起始行从0开始,即第一行开始!

 *  查询10行记录,起始行从3开始

    SELECT* FROM emp LIMIT 3, 10;