MySQL数据排序、分组查询

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:

  1. 找出工资总和:select sum(SAL) from EMP;
  2. 找出最高工资:select max(SAL) from EMP;
  3. 找出最低工资:select min(SAL) from EMP;
  4. 找出平均工资:select avg(SAL) from EMP;
  5. 找出总人数: 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 

发布了20 篇原创文章 · 获赞 5 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/Until_U/article/details/104222846