DQL_SQL语法详解
where条件查询
从物理磁盘上读取数据时的查询操作,只能逐行操作。
-运算符 | -说明 | 例子 |
---|---|---|
= | 等于 | select * from emp where sal = 1000; |
注意: |
当运算符的优先级不确定的时候加小括号。and的优先级大于or>
1 | select * from emp where ename = '黎明' and (sal=1000 or sal =3000); |
%代表任意多个字符 _代表一个字符, \具有转义作用
查询名字中带有下划线的
1 | select * from emp where ename like '%\_%'; |
排序 order by
默认升序:asc
降序:desc
1 | select * from emp order by sal desc; |
按照工资的降序排,当工资相同时在按照名字升序排
1 | select * from emp order by sal desc,ename asc; |
多重排序:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候才启用后面的字段。
排序能使用字段名,还能使用数字,使用数字时需要注意当数字所在字段变化时,排序的字段将变化,所有不推荐使用
1 | select ename,sal from emp order by 2; #注意是根据sal排序的 |
-语句 | -执行顺序 |
---|---|
select | 5 |
字段 | |
from | 1 |
表名 | |
where | 2 |
条件 | |
group by | 3 |
having | 4 |
order by | 6 |
……. |
分组函数(多行处理函数)
所有的分组函数都是对某一组数据进行的操作
-分组函数 | -举例 |
---|---|
count() | select count(*) from emp; |
sum() | select sum(sal) from emp; |
max() | select max(sal) from emp; |
min() | select min(sal) from emp; |
avg() | select avg(sal) from emp; |
多行处理函数的特点:输入多行,输出一行
注意:
分组函数会自动忽略null
单行处理函数:ifnull()
单行处理函数的特点:输入几行,输出几行
所有数据库规定:只要有null参与的运算结果一定为null
1 | select ename,(sal+ifnull(comm,0))*12 as yearsal from emp; |
count(\) 和 count(具体的某个字段) 的区别*
count(*):不是统计某个字段中数据的个数,而是统计总记录条数(和某个字段无关)。
count(具体的某个字段):表示统计某个字段的总记录数,如果存在null,那么会被忽略。
group by 和 having
group by:按照某个字段或者某些字段进行分组。
having:对分组之后的数据进行再次过滤。没有group by就没有having,但是having可以没有
注意:
分组函数一般都会和group by联合使用,这也是分组函数的来源,并且分组函数在group by执行之后才执行
当一条语句中有group by语句时,select后面只能跟分组函数和参与分组的字段
能使用where过滤的,尽量使用where,效率高,不能的则使用having
where后面不能使用分组函数
查询同一部门的员工最高工资高于3000的
1 | select deptno,max(sal) from emp group by deptno having max(sal) > 3000; |
1 | select deptno,max(sal) from emp where sal>3000 group by deptno; #效率更高 |
多字段联合分组:
1 | select deptno,job,max(sal) from emp group by deptno,job; #每个部门不同工作岗位的最高薪资 |