1、排序:默认是升序,可以指定升序(asc),降序(desc)。
select ENAME,SAL from EMP order by SAL;//升序
select ENAME,SAL from EMP order by SAL asc;//升序
select ENAME,SAL from EMP order by SAL desc;//降序
按照工资的降序排列,当工资相同时再按照,名字的升序排列,注意前面的字段起主导作用,前面相同时再匹配后面的。
select ENAME,SAL from EMP order by SAL desc;
select ENAME,SAL from EMP order by SAL desc,ENAME asc;
找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列:
select ENAME,JOB,SAL from EMP where JOB ='SALESMAN' order by SAL desc;
2、分组函数(多行处理函数),特点输入多行最终输出的结果是1行。
count(计数)、sum(求和)、avg(平均值)、max(最大值)、min(最小值)
注意所有的分组函数都是对某一组数据进行操作的。
eg:
- 找出工资总和:select sum(SAL) from EMP;
- 找出最高工资:select max(SAL) from EMP;
- 找出最低工资:select min(SAL) from EMP;
- 找出平均工资:select avg(SAL) from EMP;
- 找出总人数: select count(*) from EMP;或者select count(ENAME) from EMP;
分组函数自动忽略NULL,所以一般查询语句后面无需额外添加过滤条件。
select count(COMM) from EMP;
3、单行处理函数(输入一行,输出一行)
计算每个员工的年薪:
select ENAME,(SAL+COMM)*12 as yearsal from EMP;//(数据库规定,只要有NULL参与运算,结果为NULL)
要使用ifnull函数
select ENAME,(SAL+(ifnull(COMM,0)))*12 as yearsal from EMP; //如果COMM为NULL则当0处理)
分组函数可以组合一起用:
select count(*),sum(SAL),avg(SAL),max(SAL),min(SAL) from EMP;
where后可以再接一个查询语句,如找出工资高于平均工资的员工:
select ENAME,SAl from EMP where SAL>(select avg(SAL) from EMP);
4、SQL中有一个语法规则,分组函数不可直接使用在where子句当中。因为group by是在where执行后才会执行。
5、group by(按照某个字段或者某些字段进行分组) 和having(对分组之后的数据进行再过滤)
分组函数一般都会和group by联合使用,这就是它被称为分组函数的原因。
还有一个规则,当一条语句有group by的话,select后面只能和分组函数和参与分组的字段。如:
select ENAME,MAX(SAL),JOB from EMP group by JOB;//这和在Oracle数据库会报错,MySQL中不报错,但没有意义。
group by案例:
找出每个工作岗位的最高薪资:
select max(SAL),JOB from EMP group by JOB;
每个工作岗位的平均薪资:
select JOB,avg(SAL) from EMP group by JOB;
多个字段联合起来一块分组,如找出每个部门不同岗位的最高薪资:
select DEPTNO,JOB,max(SAL) from EMP group by DEPTNO,JOB;
having案例:
找出每个部门的最高薪资,要求显示薪资大于2900的数据:
select max(SAL),DEPTNO from EMP group by DEPTNO having max(SAL)>2900; //效率比较低
或:select max(SAL),DEPTNO from EMP where SAL>2900 group by DEPTNO;//效率较高建议使用where过滤
有时候就必须用having过滤,如找出每个部门的平均薪资并要求薪资大于2000的数据:
select DEPTNO,avg(SAL) from EMP group by DEPTNO having avg(SAL)>2000;
注意只有出现了group by才能使用having