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;	#每个部门不同工作岗位的最高薪资