1. #1.取得每个部门最高薪水的人员名称
    2. select deptno,max(sal) as maxsal from emp group by deptno #取得每个部门的最高薪水(按照部门编号分组,取最大值)
    3. #将以上查询结果看做一张临时表t
    4. select
    5. e.ename,t.*
    6. from
    7. emp e
    8. join(select deptno,max(sal) as maxsal from emp group by deptno) t
    9. on
    10. t.deptno = e.DEPTNO and e.sal = t.maxsal;
    11. #2.哪些人的薪水在部门的平均薪水之上
    12. select deptno,avg(sal) as avgsal from emp group by deptno; #找出每个部门的平均薪水
    13. # 将以上查询结果当做t表,t和emp表连接
    14. #条件:部门编号相同,并且emp的sal大于avgsal
    15. select
    16. e.ename,e.sal,t.*
    17. from
    18. emp e
    19. join (select deptno,avg(sal) as avgsal from emp group by deptno) t
    20. on
    21. t.deptno = e.deptno and e.sal > t.avgsal;
    22. #3.取得部门中所有人的平均的薪水等级
    23. select avg(sal) as avgsal from emp;
    24. #第一步:找出每个人的薪水等级
    25. #emp e和salgrade s表连接
    26. #连接条件:e.sal between s.losal and s.hisal
    27. select
    28. e.ename,e.deptno,e.sal,s.grade
    29. from
    30. emp e
    31. join
    32. salgrade s
    33. on
    34. e.sal between s.losal and s.hisal
    35. order by
    36. deptno ;
    37. #第二步:基于以上结果继续按照deptno分组,求grade的平均值
    38. select
    39. e.deptno,avg(s.grade)
    40. from
    41. emp e
    42. join
    43. salgrade s
    44. on
    45. e.sal between s.losal and s.hisal
    46. group by
    47. e.deptno;
    48. #4.不准用组函数(Max),取得最高薪水(给出两种解决方案)
    49. #第一种方案:降序 limit1
    50. select
    51. ename,sal
    52. from
    53. emp
    54. order by
    55. sal desc
    56. limit 1;
    57. #第二种方案:表的自连接
    58. /*
    59. a和b是同一张表 拿来做大于小于的比对的话 除了最大的那个值 其他的值是肯定会打印出来的
    60. 最大工资不会小于b表的任何一个数据 所以去重之后他就不在表里了
    61. 此时采用not in 输出的正好是最大的值
    62. */
    63. select sal from emp where sal not in(select distinct a.sal from emp a join emp b on a.sal < b.sal);
    64. select
    65. distinct a.sal
    66. from
    67. emp a
    68. join
    69. emp b
    70. on
    71. a.sal < b.sal
    72. #5.取得平均薪资最高的部门编号
    73. #第一种方案:
    74. #第一步:找出每个部门的平均薪水
    75. select deptno,avg(sal) as avgsal from emp group by deptno;
    76. #第二步:降序选第一个
    77. select deptno,avg(sal) as avgsal from emp group by deptno order by avgsal desc limit 1;
    78. #第二种方案:max
    79. select max(t.avgsal) as avgsal from (select avg(sal) as avgsal from emp group by deptno)t;
    80. select
    81. deptno,avg(sal) as avgsal
    82. from
    83. emp
    84. group by
    85. deptno
    86. having
    87. avgsal = (select max(t.avgsal) as avgsal from (select avg(sal) as avgsal from emp group by deptno)t);
    88. #6.取得平均薪水最高的部门名称
    89. select
    90. d.dname,avg(e.sal) as avgsal
    91. from
    92. emp e
    93. join
    94. dept d
    95. on
    96. d.DEPTNO = e.DEPTNO
    97. group by
    98. d.dname
    99. order by
    100. avgsal desc
    101. limit
    102. 1;
    103. #7.求平均薪水的等级最低的部门的部门名称
    104. #第一步:找出每个部门的平均薪水
    105. select deptno,avg(sal) as avgsal from emp group by deptno;
    106. #第二步:找出每个部门的平均薪水的等级
    107. select
    108. t.* ,s.GRADE
    109. from
    110. (select deptno,avg(sal) as avgsal from emp group by deptno) t
    111. join
    112. salgrade s
    113. on
    114. t.avgsal between s.LOSAL and s.HISAL
    115. group by
    116. deptno;
    117. #找出最低等级
    118. #薪水最低,等级一定最低,但是薪水不是最低,等级也有可能是最低的
    119. select avg(sal) as avgsal from emp group by deptno order by avgsal limit 1;
    120. select grade from salgrade where (select avg(sal) as avgsal from emp group by deptno order by avgsal limit 1) between LOSAL and hisal;
    121. select
    122. t.* ,s.GRADE
    123. from
    124. (select d.dname,avg(sal) as avgsal from emp e join dept d on d.DEPTNO = e.DEPTNO group by dname) t
    125. join
    126. salgrade s
    127. on
    128. t.avgsal between s.LOSAL and s.HISAL
    129. where
    130. s.grade = (select grade from salgrade where (select avg(sal) as avgsal from emp group by deptno order by avgsal limit 1) between LOSAL and hisal);
    131. #8.取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名
    132. select distinct mgr from emp where mgr is not null;
    133. #员工编号没有出现在以上范围内的都是普通员工
    134. #第一步:找出普通员工的最高薪水
    135. #not in在使用的时候,后面的小括号中记得排除null
    136. select max(sal) from emp where empno not in(select distinct mgr from emp where mgr is not null);
    137. #第二步:找出高于1600的
    138. select ename,sal from emp where sal > (select max(sal) from emp where empno not in(select distinct mgr from emp where mgr is not null));
    139. #9.取得薪水最高的前五名
    140. select sal from emp order by sal desc limit 5;
    141. #10.取得薪水最高的第六到第十名员工
    142. select
    143. sal
    144. from
    145. emp
    146. order by
    147. sal desc
    148. limit
    149. 5,5;
    150. #11.取得最后入职的5名员工
    151. select hiredate from emp order by hiredate desc;
    152. select
    153. ename,hiredate
    154. from
    155. emp
    156. order by
    157. hiredate desc
    158. limit
    159. 5;
    160. #12.取得每个薪水等级有多少个员工
    161. #第一步:找出每个员工的薪水等级
    162. select
    163. e.ename,e.sal,s.grade
    164. from
    165. emp e
    166. join
    167. salgrade s
    168. on
    169. e.sal between s.LOSAL and s.HISAL;
    170. #第二步,继续按照grade分组统计数量
    171. select
    172. s.grade,count(*)
    173. from
    174. emp e
    175. join
    176. salgrade s
    177. on
    178. e.sal BETWEEN s.LOSAL and s.HISAL
    179. group by
    180. s.grade;
    181. /*
    182. 13.有三个表 S(学生表) C(课程表) SC(学生选课表)
    183. S(SNO,SNAME) 代表(学号,姓名)
    184. C(CNO,CNAME,CTEACHER) 代表(课号,课名,教师)
    185. SC(SNO,CNO,SCGRADE) 代表 (学号,课号,成绩)
    186. 问题:
    187. 1.找出没选过“黎明”老师的所有学生姓名
    188. 2.列出2门以上(含两门)不及格学生姓名及平均成绩
    189. 3.既学过一号课程又学过2号课程的所有学生的姓名
    190. */
    191. #14.列出所有员工及领导的姓名
    192. SELECT
    193. a.ename '员工',b.ename'领导'
    194. from
    195. emp a
    196. left join
    197. emp b
    198. on
    199. a.mgr = b.empno;
    200. #15.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
    201. select
    202. a.ename '员工',a.hiredate,b.ename'领导',b.hiredate,d.dname
    203. from
    204. emp a
    205. left join
    206. emp b
    207. on
    208. a.mgr = b.empno
    209. join
    210. dept d
    211. on
    212. a.DEPTNO = d.deptno
    213. where
    214. a.HIREDATE < b.HIREDATE;
    215. #16.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
    216. select
    217. e.*,d.dname
    218. from
    219. emp e
    220. join
    221. dept d
    222. on
    223. e.DEPTNO = d.DEPTNO;
    224. #17.列出至少有五个员工的所有部门
    225. #按照部门编号分组,计数,筛选出 >= 5
    226. select
    227. deptno
    228. from
    229. emp
    230. group by
    231. deptno
    232. having
    233. count(*) >= 5;
    234. #18.列出薪金比“SMITH”多的所有员工信息
    235. select sal from emp where ename = 'SMITH';
    236. select ename,sal from emp where sal > (select sal from emp where ename = 'SMITH');
    237. #19.列出所有“CLERK”(办事员)的姓名及部门名称,部门人数
    238. select ename,job from emp where job='CLERK';
    239. select
    240. e.ename,e.job,d.dname,d.deptno
    241. from
    242. emp e
    243. join
    244. dept d
    245. on
    246. e.DEPTNO = d.DEPTNO
    247. where
    248. e.job = 'CLERK';
    249. #每个部门的人数
    250. select deptno,count(*) as deptcount from emp group by deptno;
    251. select
    252. t1.*,t2.deptcount
    253. from
    254. (select e.ename,e.job,d.dname,d.deptno from emp e join dept d on e.DEPTNO = d.DEPTNO where e.job = 'CLERK') t1
    255. join
    256. (select deptno,count(*) as deptcount from emp group by deptno) t2
    257. on
    258. t1.deptno = t2.deptno;
    259. #20.列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数
    260. #按照工作岗位分组求最小值
    261. select job,count(*) from emp group by job having min(sal) > 1500;
    262. #21.列出在部门“SALES”<销售部>工作的员工姓名,假定不知道销售部的部门编号
    263. select deptno from dept where dname = 'SALES';
    264. select ename from emp where deptno = (select deptno from dept where dname = 'SALES');
    265. #22.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级
    266. SELECT
    267. e.ename '员工',d.dname,l.ename '领导',s.grade
    268. FROM
    269. emp e
    270. JOIN
    271. dept d
    272. ON
    273. e.deptno = d.deptno
    274. LEFT JOIN
    275. emp l
    276. ON
    277. e.mgr = l.empno
    278. JOIN
    279. salgrade s
    280. ON
    281. e.sal BETWEEN s.LOSAL and s.HISAL
    282. WHERE
    283. e.sal > (SELECT avg(sal) FROM emp);
    284. #23.列出与“SCOTT”从事相同工作的所有员工及部门名称
    285. SELECT job FROM emp WHERE ename = 'SCOTT';
    286. SELECT
    287. e.ename,e.job,d.dname
    288. FROM
    289. emp e
    290. JOIN
    291. dept d
    292. ON
    293. e.deptno = d.deptno
    294. WHERE
    295. e.job = (SELECT job FROM emp WHERE ename = 'SCOTT')
    296. AND
    297. e.ename <> 'SCOTT';
    298. #24.列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金
    299. SELECT DISTINCT sal FROM emp WHERE deptno = 30;
    300. SELECT
    301. ename,sal
    302. FROM
    303. emp
    304. WHERE
    305. sal IN(SELECT DISTINCT sal FROM emp WHERE deptno = 30)
    306. AND deptno <> 30;
    307. #25.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金,部门名称
    308. SELECT max(sal) FROM emp WHERE deptno = 30;
    309. SELECT
    310. e.ename,e.sal,d.dname
    311. FROM
    312. emp e
    313. JOIN
    314. dept d
    315. ON
    316. e.deptno = d.deptno
    317. WHERE
    318. e.sal > (SELECT max(sal) FROM emp WHERE deptno = 30);
    319. #26.列出在每个部门工作的员工数量,平均工资和平均服务期限
    320. #timestampdiff(时间间隔,前一个日期,后一个日期)
    321. SELECT
    322. d.*,count(e.ename) ecount, ifnull(avg(e.sal),0) as avgsal,ifnull(avg(TIMESTAMPDIFF(YEAR,hiredate,now())),0) as avgyservicetime
    323. FROM
    324. emp e
    325. RIGHT JOIN
    326. dept d
    327. ON
    328. e.deptno = d.deptno
    329. GROUP BY
    330. d.deptno,d.dname,d.loc;
    331. #列出所有员工的姓名、部门名称和工资
    332. SELECT
    333. e.ename,d.dname,e.sal
    334. FROM
    335. emp e
    336. JOIN
    337. dept d
    338. ON
    339. e.deptno = d.deptno;
    340. #28.列出所有部门的详细信息和人数
    341. SELECT
    342. d.deptno,d.dname,d.loc,count(e.ename)
    343. FROM
    344. emp e
    345. RIGHT JOIN
    346. dept d
    347. ON
    348. e.deptno = d.deptno
    349. GROUP BY
    350. d.deptno,d.dname,d.loc;
    351. #29.列出各种工作的最低工资以及从事此工作的雇员姓名
    352. SELECT
    353. job,min(sal) as minsal
    354. FROM
    355. emp
    356. GROUP BY
    357. job;
    358. SELECT
    359. e.ename,t.*
    360. FROM
    361. emp e
    362. JOIN
    363. (SELECT job,min(sal) as minsal FROM emp GROUP BY job)t
    364. ON
    365. e.job = t.job and e.sal = t.minsal;
    366. #30.列出各个部门的MANAGER的最低薪金
    367. SELECT
    368. deptno,min(sal) as minsal
    369. FROM
    370. emp
    371. WHERE
    372. job = 'MANAGER'
    373. GROUP BY
    374. deptno;
    375. #31.列出所有员工的年薪,按年薪从低到高排序
    376. SELECT
    377. ename,(sal + IFNULL(comm,0)) * 12 as yearsal
    378. FROM
    379. emp
    380. order by
    381. yearsal asc;
    382. #32.求出员工领导的薪水超过3000的员工名称与领导
    383. SELECT
    384. a.ename '员工',b.ename '领导'
    385. FROM
    386. emp a
    387. JOIN
    388. emp b
    389. ON
    390. a.mgr = b.empno
    391. WHERE
    392. b.sal > 3000;
    393. #求出部门名称中,带‘S’字符的部门员工的工资合计、部门人数
    394. SELECT
    395. d.deptno,d.dname,d.loc,count(e.ename),IFNULL(sum(e.sal),0) as sumsal
    396. FROM
    397. emp e
    398. RIGHT JOIN
    399. dept d
    400. ON
    401. e.deptno = d.deptno
    402. WHERE
    403. d.dname like '%S%'
    404. GROUP BY
    405. d.deptno,d.dname,d.loc;
    406. #34.给任职日期超过30年的员工加薪百分之10
    407. update emp set sal = sal * 1.1 where TIMESTAMPDIFF(YEAR,hiredate,now()) > 30;
    408. select * from emp;