MySQL-day5

132 阅读1分钟

找出没个工作岗位的最高薪资:

当 存在group by的时候,select 后面允许跟参加分组的字段和分组函数,其他都不能跟,比如 几个ename是错的!(虽然在mysql能过,但毫无意义)

mysql> select max(sal),job from emp group by job;
+----------+-----------+
| max(sal) | job       |
+----------+-----------+
|  3000.00 | ANALYST   |
|  1300.00 | CLERK     |
|  2975.00 | MANAGER   |
|  5000.00 | PRESIDENT |
|  1600.00 | SALESMAN  |
+----------+-----------+
5 rows in set (0.03 sec)

多个字段能不能联合起来分组:

案例:找出每个部门不同工作岗位的最高薪资

mysql> select deptno,job,max(sal) from emp group by deptno,job;
+--------+-----------+----------+
| deptno | job       | max(sal) |
+--------+-----------+----------+
|     10 | CLERK     |  1300.00 |
|     10 | MANAGER   |  2450.00 |
|     10 | PRESIDENT |  5000.00 |
|     20 | ANALYST   |  3000.00 |
|     20 | CLERK     |  1100.00 |
|     20 | MANAGER   |  2975.00 |
|     30 | CLERK     |   950.00 |
|     30 | MANAGER   |  2850.00 |
|     30 | SALESMAN  |  1600.00 |
+--------+-----------+----------+
  • 找出每个部门的最高薪资,要求显示薪资大于2900:
mysql> select max(sal) from emp group by deptno having max(sal)>2900 ;
+----------+
| max(sal) |
+----------+
|  5000.00 |
|  3000.00 |
+----------+
2 rows in set (0.01 sec)

效率低!!!!!!!!!!

mysql> select max(sal) from emp where sal>2900 group by deptno;
+----------+
| max(sal) |
+----------+
|  5000.00 |
|  3000.00 |
+----------+
2 rows in set (0.00 sec)

参加分组的数据变少 效率高,能用where尽量用where

找出每个部门的平均薪资,要求显示薪资大于2000

mysql> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
+--------+-------------+
2 rows in set (0.00 sec)

总结一个完整的DQL语句 select .. from..where.. group bt .. having ..order by..

5 1 2 3 4 6

image.png