SQL 语句的分类
- DQL (数据查询语言):查询语句,所有 select 语句都是 DQL。
- DML (数据操作语言):inset、update、delete,对表中的数据进行增、删、改。
- DDDL(数据定义语言):create、drop、alter,对表的结构进行增、删、改。
- TCL (事务控制语言):commit 提交事务、rollback 回滚事务。
- DCL (数据控制语言):grant 授权、revoke 撤销权限等。
Mysql 常用命令
登录 Mysql:$ mysql -u账号 -p密码 // 登录mysql$ mysql -u账号 -p // -p 后按下回车键可以输入不可见的密码。查看数据库:$ show databases;创建数据库:$ create database 数据库名称;使用数据库:$ use 数据库名称;查看数据库中的表:$ show tables;运行 sql 脚本:$ source sql脚本地址; // 可以直接把 sql 脚本拖到 DOS 窗口上。查看当前使用的数据库:$ select database();查看 Mysql 版本:$ select version();结束一条语句:$ \c退出 Mysql:$ exit;
SQL 查询语句(DQL)
注:
- SQL 语句必须以分号结尾。- SQL 不区分大小写。
简单查询语句
基础语句:$ select 字段1,字段2, 字段3 from 表名;查询全部字段:$ select * from 表名; -- 但效率较低,实际项目中不推荐使用.起别名:$ select 字段 as 别名 from 表名; -- as 起别名, 也可以省略, 使用空格隔开也可.例如:$ select ename, sal from emp; -- 查询 emp 表, 获取 ename, sal 字段.$ select ename, sal * 12 from emp; -- sql 语句中可以参与数学运算.$ select ename, sal * 12 as salary from emp; -- 起别名
条件查询
条件查询:根据指定条件进行、过滤.$ select 字段名 from 表明 where 条件;例如:-- 薪水大约 1000 的$ select ename, sal from emp where sal > 1000;-- 薪水大于 1000 且小于 5000$ select ename, sal from emp where sal > 1000 and sal < 5000;-- 薪水不等于 null 的$ select ename, sal from emp where sal is not null;-- 模糊查询 ename 中带有 M 的$ select ename, sal from emp where ename like '%M%';-- 获取 sal > 1000 并且部门编号为20 或 部门编号为 30的$ 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 | 模糊查询,配合 % 和 使用,( %: 一个或多个字符, _: 一个字符 ) |
查询排序
排序:$ select 字段 from 表明 order by 排序字段名 排序方式(asc: 升序 / desc: 降序)例如:-- 根据 sal 倒叙排列$ select ename, sal from emp order by sal desc;-- 默认为升序排序, 所以 asc 可以省略$ select ename, sal from emp order by sal;-- 先按照 sal 升序排序,在 sal 排序的基础上再按照 ename 降序排序$ select ename, sal from emp order by sal asc, ename desc;/** 注: 在使用多个字段排序时, 前面的字段起主导作用, 只有当前面的字段无法完成排序时,才会启用* 后面的字段.*/
分组函数
分组函数又名多行处理函数,分组函数是对一组数据进行处理,产生一个输出,分组函数的特点如下:- 输入多行,输出一行- 自动忽略 null- 分组函数不能直接用在 where 后面,因为分组函数是配合 group by 使用的,在 group by 之后才会执行分组函数,但是 where 是在 group by 之前执行的。
分组函数如下:
- max: 求最大值- min: 求最小值- sum: 求和- avg: 求平均值- count: 计数
例如:-- 获取 emp 表中有多少条数据$ select count(*) from emp;-- 获取最高薪水$ select max(sal) from emp;
单行处理函数:
单行处理函数:输入一行,输出一行,在单行处理函数中是不会忽略 null,所以如果出现 null 进行数学运算时需要进行判断处理:
注:所有数据库都规定 null 参与数学运算时运算结果还是 null。
例如:-- 获取年薪:月工资 + 补助,因为补助 为 null 所以要进行判断。$ select ename, (sal + ifnull(comm, 0)) * 12 from emp;-- ifnull 用来判断值是不是 null 如果是 null 则用另一个值代替$ ifnull(需要判断的值, 如果是 null 使用的值)
count(*) 和 count(字段) 的区别:
$ count(*); -- 为获取表中总记录的条数$ count(字段); -- 为获取表中改字段记录的条数, 这个会忽略 null.
分组查询 group by 和 having
分组查询:根据某个字段或某些字段进行分组,一般分组函数都会配和分组函数进行使用,这也是(max、min)等称为分组函数的原因,每一个分组函数都是在 group by 分组之后执行的,当语句中没有使用 group by 时所有数据会自成一组。
分组查询语句:$ select 字段 from 表 group by 分组字段;例如:-- 获取每个部门下的最高薪资$ select deptno, max(sal) from emp group by deptno;/** 注: 使用 group by 时, select 后面跟的字段只能时参与分组的字段或者分组函数,像下面这个写法就是错误的.* 这是因为分组查出来的字段会变少, 而 ename 未参与分组也不是分组函数, 他查询出来的还是全部条数, 比如: deptno 分组查出来* 是 3 条, 而 ename 为 15 条, 所以数据就对不上了, 在 Oracle 中这样的写法会直接报错, 而 Mysql 不会, 但是查询出来的数据是* 没意义的.*/$ select deptno, ename from emp group by deptno;
多字段分组查询:
多个字段分组查询语句:$ select 字段 from 表 group by 分组字段, 分组字段;例如:-- 获取每个部门下的不同工作岗位的最高薪资$ select max(sal), job, deptno from emp group by deptno, job;-- ! 前面的字段分组完成后再根据后面的字段进行分组.
having:
having 语句是对分完组之后的数据进行筛选过滤和 where 差不多,但是 having 的效率不高,如果能有 where 完成的过滤的就优先使用 where,实在不行的话在使用 having。
having 语句:$ select 字段 from 表 group by 分组字段, 分组字段 having 条件;例如:-- 获取每个部门下的最高薪资, 且展示 >= 3000 的.$ select max(sal), deptno from emp group by deptno having max(sal) >= 3000;-- 上面的语句可以正确执行, 但是效率不高, 因为在分完组了又进行了数据过滤, 而完全可以在查询的阶段直接过滤掉, 也就是通过 where$ select max(sal), deptno from emp where sal >= 3000 group by deptno;下面这个例子就必须使用 having 了:-- 获取每个部门下的平均薪资,且只展示 > 2000 的, 因为 where 后面不能跟分组函数.$ select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000;
去除重复记录
使用 distinct 可以去除查询的重复记录:$ select distinct 字段名 from 表名:例如:-- 统计岗位数量:$ select count(distinct job) from emp;-- 注: distinct 只能放在所有字段的最前面, 如果放在后面那么前后字段查询出来的条数就不对应了, 是一个错误的语法:$ select ename, distinct job from emp; -- bad$ select distinct ename, job from emp; -- good-- distinct 后面跟多个字段时, 是根据这多个字段一起判断是否重复去除.
SQL 的执行顺序
-- 一个完成的 DQL 语句和执行顺序如下select 5...from 1...where 2...group by 3...having 4...order by 6...
