SQL 语句的分类

  • DQL (数据查询语言):查询语句,所有 select 语句都是 DQL。
  • DML (数据操作语言):inset、update、delete,对表中的数据进行增、删、改。
  • DDDL(数据定义语言):create、drop、alter,对表的结构进行增、删、改。
  • TCL (事务控制语言):commit 提交事务、rollback 回滚事务。
  • DCL (数据控制语言):grant 授权、revoke 撤销权限等。

Mysql 常用命令

  1. 登录 Mysql:
  2. $ mysql -u账号 -p密码 // 登录mysql
  3. $ mysql -u账号 -p // -p 后按下回车键可以输入不可见的密码。
  4. 查看数据库:
  5. $ show databases;
  6. 创建数据库:
  7. $ create database 数据库名称;
  8. 使用数据库:
  9. $ use 数据库名称;
  10. 查看数据库中的表:
  11. $ show tables;
  12. 运行 sql 脚本:
  13. $ source sql脚本地址; // 可以直接把 sql 脚本拖到 DOS 窗口上。
  14. 查看当前使用的数据库:
  15. $ select database();
  16. 查看 Mysql 版本:
  17. $ select version();
  18. 结束一条语句:
  19. $ \c
  20. 退出 Mysql:
  21. $ exit;

SQL 查询语句(DQL)

注:

  1. - SQL 语句必须以分号结尾。
  2. - SQL 不区分大小写。

简单查询语句

  1. 基础语句:
  2. $ select 字段1,字段2, 字段3 from 表名;
  3. 查询全部字段:
  4. $ select * from 表名; -- 但效率较低,实际项目中不推荐使用.
  5. 起别名:
  6. $ select 字段 as 别名 from 表名; -- as 起别名, 也可以省略, 使用空格隔开也可.
  7. 例如:
  8. $ select ename, sal from emp; -- 查询 emp 表, 获取 ename, sal 字段.
  9. $ select ename, sal * 12 from emp; -- sql 语句中可以参与数学运算.
  10. $ select ename, sal * 12 as salary from emp; -- 起别名

条件查询

  1. 条件查询:根据指定条件进行、过滤.
  2. $ select 字段名 from 表明 where 条件;
  3. 例如:
  4. -- 薪水大约 1000
  5. $ select ename, sal from emp where sal > 1000;
  6. -- 薪水大于 1000 且小于 5000
  7. $ select ename, sal from emp where sal > 1000 and sal < 5000;
  8. -- 薪水不等于 null
  9. $ select ename, sal from emp where sal is not null;
  10. -- 模糊查询 ename 中带有 M
  11. $ select ename, sal from emp where ename like '%M%';
  12. -- 获取 sal > 1000 并且部门编号为20 部门编号为 30
  13. $ select ename, sal from where sal > 1000 and deptno = 20 or (deptno = 30);

条件查询支持的条件运算如下:

运算符 说明
= 等于
> 大于
< 小于
<> 或 != 不等于
<= 小于等于
>= 大于等于
between 值 and 值 两个值之间,等同于 <= and >=
is null 等于 null
is not null 不等于 null
and 并且
or 或者
in(值1, 值2) 需要包含在 in 后面指定的值内
not in (值1, 值2) 不包含在 in 后面指定的值内
like 模糊查询,配合 % 和 使用,( %: 一个或多个字符, _: 一个字符 )

查询排序

  1. 排序:
  2. $ select 字段 from 表明 order by 排序字段名 排序方式(asc: 升序 / desc: 降序)
  3. 例如:
  4. -- 根据 sal 倒叙排列
  5. $ select ename, sal from emp order by sal desc;
  6. -- 默认为升序排序, 所以 asc 可以省略
  7. $ select ename, sal from emp order by sal;
  8. -- 先按照 sal 升序排序,在 sal 排序的基础上再按照 ename 降序排序
  9. $ select ename, sal from emp order by sal asc, ename desc;
  10. /*
  11. * 注: 在使用多个字段排序时, 前面的字段起主导作用, 只有当前面的字段无法完成排序时,才会启用
  12. * 后面的字段.
  13. */

分组函数

  1. 分组函数又名多行处理函数,分组函数是对一组数据进行处理,产生一个输出,分组函数的特点如下:
  2. - 输入多行,输出一行
  3. - 自动忽略 null
  4. - 分组函数不能直接用在 where 后面,因为分组函数是配合 group by 使用的,在 group by 之后才会执行分组函数,但是 where 是在 group by 之前执行的。

分组函数如下:

  1. - max: 求最大值
  2. - min 求最小值
  3. - sum: 求和
  4. - avg: 求平均值
  5. - count: 计数
  1. 例如:
  2. -- 获取 emp 表中有多少条数据
  3. $ select count(*) from emp;
  4. -- 获取最高薪水
  5. $ select max(sal) from emp;

单行处理函数:
单行处理函数:输入一行,输出一行,在单行处理函数中是不会忽略 null,所以如果出现 null 进行数学运算时需要进行判断处理:

注:所有数据库都规定 null 参与数学运算时运算结果还是 null。

  1. 例如:
  2. -- 获取年薪:月工资 + 补助,因为补助 null 所以要进行判断。
  3. $ select ename, (sal + ifnull(comm, 0)) * 12 from emp;
  4. -- ifnull 用来判断值是不是 null 如果是 null 则用另一个值代替
  5. $ ifnull(需要判断的值, 如果是 null 使用的值)

count(*) 和 count(字段) 的区别:

  1. $ count(*); -- 为获取表中总记录的条数
  2. $ count(字段); -- 为获取表中改字段记录的条数, 这个会忽略 null.

分组查询 group by 和 having

分组查询:根据某个字段或某些字段进行分组,一般分组函数都会配和分组函数进行使用,这也是(max、min)等称为分组函数的原因,每一个分组函数都是在 group by 分组之后执行的,当语句中没有使用 group by 时所有数据会自成一组。

  1. 分组查询语句:
  2. $ select 字段 from group by 分组字段;
  3. 例如:
  4. -- 获取每个部门下的最高薪资
  5. $ select deptno, max(sal) from emp group by deptno;
  6. /*
  7. * 注: 使用 group by 时, select 后面跟的字段只能时参与分组的字段或者分组函数,像下面这个写法就是错误的.
  8. * 这是因为分组查出来的字段会变少, 而 ename 未参与分组也不是分组函数, 他查询出来的还是全部条数, 比如: deptno 分组查出来
  9. * 是 3 条, 而 ename 为 15 条, 所以数据就对不上了, 在 Oracle 中这样的写法会直接报错, 而 Mysql 不会, 但是查询出来的数据是
  10. * 没意义的.
  11. */
  12. $ select deptno, ename from emp group by deptno;

多字段分组查询:

  1. 多个字段分组查询语句:
  2. $ select 字段 from group by 分组字段, 分组字段;
  3. 例如:
  4. -- 获取每个部门下的不同工作岗位的最高薪资
  5. $ select max(sal), job, deptno from emp group by deptno, job;
  6. -- ! 前面的字段分组完成后再根据后面的字段进行分组.

having:
having 语句是对分完组之后的数据进行筛选过滤和 where 差不多,但是 having 的效率不高,如果能有 where 完成的过滤的就优先使用 where,实在不行的话在使用 having。

  1. having 语句:
  2. $ select 字段 from group by 分组字段, 分组字段 having 条件;
  3. 例如:
  4. -- 获取每个部门下的最高薪资, 且展示 >= 3000 的.
  5. $ select max(sal), deptno from emp group by deptno having max(sal) >= 3000;
  6. -- 上面的语句可以正确执行, 但是效率不高, 因为在分完组了又进行了数据过滤, 而完全可以在查询的阶段直接过滤掉, 也就是通过 where
  7. $ select max(sal), deptno from emp where sal >= 3000 group by deptno;
  8. 下面这个例子就必须使用 having 了:
  9. -- 获取每个部门下的平均薪资,且只展示 > 2000 的, 因为 where 后面不能跟分组函数.
  10. $ select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000;

去除重复记录

  1. 使用 distinct 可以去除查询的重复记录:
  2. $ select distinct 字段名 from 表名:
  3. 例如:
  4. -- 统计岗位数量:
  5. $ select count(distinct job) from emp;
  6. -- 注: distinct 只能放在所有字段的最前面, 如果放在后面那么前后字段查询出来的条数就不对应了, 是一个错误的语法:
  7. $ select ename, distinct job from emp; -- bad
  8. $ select distinct ename, job from emp; -- good
  9. -- distinct 后面跟多个字段时, 是根据这多个字段一起判断是否重复去除.

SQL 的执行顺序

  1. -- 一个完成的 DQL 语句和执行顺序如下
  2. select 5
  3. ...
  4. from 1
  5. ...
  6. where 2
  7. ...
  8. group by 3
  9. ...
  10. having 4
  11. ...
  12. order by 6
  13. ...