当前位置:   article > 正文

高级查询 group by 子查询

group by 子查询

1.分组函数

MIN(某列名) 最小   MAX(某列名) 最大    SUM(某列名) 和    AVG(某列名) 平均   

  1. 查询所有员工平均工资、最低工资、最高工资、工资和。
  2. SELECT AVG(sal), MAX(sal),MIN(sal), SUM(sal)
  3. FROM emp;

COUNT(某列名 或者*)数据行数  代表所查数据有多少行数据 返回满足条件的非空值数据的行数

  1. 查询部门30有多少个员工
  2. SELECT COUNT(*)
  3. FROM emp
  4. where deptno = 30;
  5. 显示结果为所有记录条数14

组函数中的DISTINCT  会合并重复的数据

  1. 查询emp表中工作种类有哪些
  2. SELECT COUNT(DISTINCT job)
  3. FROM emp;

组函数中的空值 IFNULL

其他函数运行时也会自动忽略为空值的数据 可以用ifnull来强制性控制函数包括空值运行

  1. 此时 由于函数会自动忽略空值计算 平均奖金是把四个有奖金的人除以4来计算 不是除以总人数14 
  2. SELECT AVG(comm) FROM emp;
  3. 所以此时可以强制代码包括空值 使用ifnull函数
  4. SELECT AVG(IFNULL(comm,0)) FROM emp;

2.创建数据组 GROUP BY

通过 GROUP BY 子句可将表中满足WHERE条件的记录按照指定的列划分成若干个小组

GROUP BY子句指定要分组的列

SELECT 里面如果想写列名 那必须也要写在GROUP BY字句里

按多个列分组

group by 后面可以写多个列名

  1. 查询 每个部门 每个岗位 的工资总和
  2. 因为select后面需要返回job 和 deptno 所以group by 后面也需要写deptno和job
  3. SELECT deptno,job,SUM(sal)
  4. FROM emp
  5. GROUP BY deptno,job;
  6. 但凡出现每个修饰的列名都需要写在GROUP BY里面分组
  1. 查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。
  2. SELECT dname,dept.deptno,job,COUNT(ename),MAX(sal),MIN(sal),SUM(sal),AVG(sal)
  3. FROM dept
  4. LEFT JOIN emp
  5. ON emp.deptno = dept.deptno
  6. GROUP BY dname,dept.deptno,job
  7. ORDER BY dept.deptno

3.子查询

1.使用子查询

  • 单行运算符:>、=、>=、<、<>、<=
  • 多行运算符: IN、ANY、ALL

子查询可以嵌于 where from having子句中

  1. 查询出比JONES为雇员工资高的其他雇员
  2. SELECT ename
  3. FROM emp
  4. WHERE sal >
  5. (SELECT sal
  6. FROM emp
  7. WHERE ename='JONES');

2.多行子查询

in 意为其中之一 只能用于等值的子查询中

any意为其中之一 可以连接><=来使用

all意为所有 可以连接><=来使用

  1. 查询入职日期比10部门其中一个员工晚的员工姓名、入职日期,不包括10部门员工
  2. SELECT ename,hiredate
  3. FROM emp
  4. WHERE hiredate > ANY(SELECT hiredate FROM emp WHERE deptno = 10 )
  5. AND deptno !=10;
  6. 查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
  7. SELECT ename,hiredate
  8. FROM emp
  9. where hiredate > ALL(select hiredate FROM emp WHERE deptno =10)
  10. AND deptno !=10;
  11. 查询职位和10部门其中一个员工职位相同的员工姓名,职位,不包括10部门员工
  12. SELECT ename,job
  13. FROM emp
  14. WHERE job in(SELECT job FROM emp WHERE deptno =10)
  15. AND deptno !=10;

3.子查询中的空值

只要空值有可能成为子查询结果集合中的一部分,就不能使用NOT IN 运算符

4.多列子查询

  1. 查询每个部门最低工资的员工
  2. select *
  3. from emp
  4. where (deptno, sal) in (select deptno, min(sal) from emp);

5.在 FROM 子句中使用子查询

  1. 查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
  2. SELECT a.ename, a.sal, a.deptno, b.salavg
  3. FROM emp a, (SELECT deptno, AVG(sal) salavg
  4. FROM emp
  5. GROUP BY deptno) b
  6. WHERE a.deptno = b.deptno AND a.sal > b.salavg;
  7. 显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序
  8. SELECT manager.ename,manager.empno,worker.aa
  9. FROM (SELECT mgr,MIN(sal) aa
  10. FROM emp
  11. GROUP BY mgr
  12. ) worker
  13. LEFT JOIN emp manager
  14. ON worker.mgr = manager.empno
  15. WHERE worker.aa >= 3000;

6.相关子查询

可以把子连接条件写在子查询里面

  1. 查询比自己部门平均工资高的员工姓名,工资
  2. select ename, sal
  3. from emp e
  4. where sal > (select avg(sal) from emp where deptno = e.deptno);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/959599
推荐阅读
相关标签
  

闽ICP备14008679号