第九章、练习题.sql 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. #第九章、练习题
  2. #1、查询和Zlotkey相同部门的员工姓名和工资。
  3. SELECT last_name,salary
  4. FROM employees
  5. WHERE department_id IN (
  6. SELECT department_id
  7. FROM employees
  8. WHERE last_name = 'Zlotkey'
  9. );
  10. #2、查询工资比公司平均工资高的员工的员工号,姓名和工资。
  11. SELECT employee_id,last_name,salary
  12. FROM employees
  13. WHERE salary > (
  14. SELECT AVG(salary)
  15. FROM employees
  16. );
  17. #3、选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的
  18. #员工的last_name,job_id,salary。
  19. SELECT last_name,job_id,salary
  20. FROM employees
  21. WHERE salary > ALL (
  22. SELECT salary
  23. FROM employees
  24. WHERE job_id = 'SA_MAN'
  25. );
  26. #4、查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名。
  27. SELECT employee_id,last_name
  28. FROM employees
  29. WHERE department_id IN (
  30. SELECT department_id
  31. FROM employees
  32. WHERE last_name LIKE '%u%'
  33. );
  34. #老师做的
  35. SELECT employee_id,last_name
  36. FROM employees
  37. WHERE department_id IN (
  38. SELECT DISTINCT department_id
  39. FROM employees
  40. WHERE last_name LIKE '%u%'
  41. );
  42. #5、查询在部门的location_id为1700的部门工作的员工的员工号。
  43. SELECT employee_id,last_name,department_id
  44. FROM employees
  45. WHERE department_id IN (
  46. SELECT department_id
  47. FROM departments
  48. WHERE location_id = 1700
  49. );
  50. #6、查询管理者是King的员工姓名和工资。
  51. SELECT e1.last_name,e1.salary,e1.manager_id
  52. FROM employees e1
  53. WHERE manager_id IN (
  54. SELECT employee_id
  55. FROM employees e2
  56. WHERE last_name = 'King'
  57. );
  58. #老师做的
  59. SELECT last_name,salary,manager_id
  60. FROM employees
  61. WHERE manager_id IN (
  62. SELECT employee_id
  63. FROM employees
  64. WHERE last_name = 'King'
  65. );
  66. #还可以用exists做
  67. #7、查询工资最低的员工信息:last_name,salary。
  68. SELECT last_name,salary
  69. FROM employees
  70. WHERE salary IN (
  71. SELECT MIN(salary)
  72. FROM employees
  73. );
  74. #8、查询平均工资最低的部门信息。
  75. SELECT *
  76. FROM departments
  77. WHERE department_id = (SELECT department_id
  78. FROM employees
  79. GROUP BY department_id
  80. HAVING AVG(salary) <= ALL(
  81. SELECT AVG(salary) avg_dsal
  82. FROM employees
  83. GROUP BY department_id
  84. )
  85. );
  86. #老师做的
  87. #方式一
  88. SELECT *
  89. FROM departments
  90. WHERE department_id = (
  91. SELECT department_id
  92. FROM employees
  93. GROUP BY department_id
  94. HAVING AVG(salary) = (
  95. SELECT MIN(avg_sal)
  96. FROM (
  97. SELECT AVG(salary) avg_sal
  98. FROM employees
  99. GROUP BY department_id
  100. ) t_dept_avg_sal
  101. )
  102. );
  103. #方式二
  104. SELECT *
  105. FROM departments
  106. WHERE department_id = (
  107. SELECT department_id
  108. FROM employees
  109. GROUP BY department_id
  110. HAVING AVG(salary) <= ALL (
  111. SELECT AVG(salary)
  112. FROM employees
  113. GROUP BY department_id
  114. )
  115. );
  116. #方式三:使用LIMIT
  117. SELECT *
  118. FROM departments
  119. WHERE department_id = (
  120. SELECT department_id
  121. FROM employees
  122. GROUP BY department_id
  123. HAVING AVG(salary) = (
  124. SELECT AVG(salary) avg_sal
  125. FROM employees
  126. GROUP BY department_id
  127. ORDER BY avg_sal
  128. LIMIT 0,1
  129. )
  130. );
  131. #方式四
  132. SELECT d.*
  133. FROM departments d,(
  134. SELECT department_id,AVG(salary) avg_sal
  135. FROM employees
  136. GROUP BY department_id
  137. ORDER BY avg_sal ASC
  138. LIMIT 0,1
  139. ) t_dept_avg_sal
  140. WHERE d.department_id = t_dept_avg_sal.department_id;
  141. #9、查询平均工资最低的部门信息和该部门的平均工资(相关子查询)。
  142. #我做的,差平均工资未做
  143. SELECT *
  144. FROM departments
  145. WHERE department_id = (
  146. SELECT department_id
  147. FROM employees
  148. GROUP BY department_id
  149. HAVING AVG(salary) <= ALL(
  150. SELECT AVG(salary)
  151. FROM employees
  152. GROUP BY department_id
  153. )
  154. );
  155. #老师做的
  156. #方式一
  157. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) AS d_avg_sal
  158. FROM departments d
  159. WHERE department_id = (
  160. SELECT department_id
  161. FROM employees
  162. GROUP BY department_id
  163. HAVING AVG(salary) = (
  164. SELECT MIN(avg_sal)
  165. FROM (
  166. SELECT AVG(salary) avg_sal
  167. FROM employees
  168. GROUP BY department_id
  169. ) t_dept_avg_sal
  170. )
  171. );
  172. #方式二
  173. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) AS d_avg_sal
  174. FROM departments d
  175. WHERE department_id = (
  176. SELECT department_id
  177. FROM employees
  178. GROUP BY department_id
  179. HAVING AVG(salary) <= ALL (
  180. SELECT AVG(salary)
  181. FROM employees
  182. GROUP BY department_id
  183. )
  184. );
  185. #方式三:使用LIMIT
  186. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) AS d_avg_sal
  187. FROM departments d
  188. WHERE department_id = (
  189. SELECT department_id
  190. FROM employees
  191. GROUP BY department_id
  192. HAVING AVG(salary) = (
  193. SELECT AVG(salary) avg_sal
  194. FROM employees
  195. GROUP BY department_id
  196. ORDER BY avg_sal
  197. LIMIT 0,1
  198. )
  199. );
  200. #方式四
  201. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) AS d_avg_sal
  202. FROM departments d,(
  203. SELECT department_id,AVG(salary) avg_sal
  204. FROM employees
  205. GROUP BY department_id
  206. ORDER BY avg_sal ASC
  207. LIMIT 0,1
  208. ) t_dept_avg_sal
  209. WHERE d.department_id = t_dept_avg_sal.department_id;
  210. #10、查询平均工资最高的job信息。
  211. SELECT *
  212. FROM jobs
  213. WHERE job_id = (SELECT job_id
  214. FROM employees
  215. GROUP BY job_id
  216. HAVING AVG(salary) >= ALL(
  217. SELECT AVG(salary)
  218. FROM employees
  219. GROUP BY job_id
  220. )
  221. );
  222. #老师做的
  223. #方式一:
  224. SELECT *
  225. FROM jobs
  226. WHERE job_id = (
  227. SELECT job_id
  228. FROM employees
  229. GROUP BY job_id
  230. HAVING AVG(salary) = (
  231. SELECT MAX(avg_sal)
  232. FROM (
  233. SELECT AVG(salary) avg_sal
  234. FROM employees
  235. GROUP BY job_id
  236. ) t_dept_avg_sal
  237. )
  238. );
  239. #方式二
  240. SELECT *
  241. FROM jobs
  242. WHERE job_id = (
  243. SELECT job_id
  244. FROM employees
  245. GROUP BY job_id
  246. HAVING AVG(salary) >= ALL (
  247. SELECT AVG(salary)
  248. FROM employees
  249. GROUP BY job_id
  250. )
  251. );
  252. #方式三
  253. SELECT *
  254. FROM jobs
  255. WHERE job_id = (
  256. SELECT job_id
  257. FROM employees
  258. GROUP BY job_id
  259. HAVING AVG(salary) = (
  260. SELECT AVG(salary) avg_sal
  261. FROM employees
  262. GROUP BY job_id
  263. ORDER BY avg_sal DESC
  264. LIMIT 0,1
  265. )
  266. );
  267. #方式四
  268. SELECT j.*
  269. FROM jobs j,(
  270. SELECT job_id,AVG(salary) avg_sal
  271. FROM employees
  272. GROUP BY job_id
  273. ORDER BY avg_sal DESC
  274. LIMIT 0,1
  275. ) t_dept_avg_sal
  276. WHERE j.job_id = t_dept_avg_sal.job_id;
  277. #11、查询平均工资高于公司平均工资的部门有哪些?
  278. #我做的,不对
  279. SELECT department_id
  280. FROM employees
  281. GROUP BY department_id
  282. HAVING (
  283. SELECT AVG(salary)
  284. FROM employees
  285. ) < ANY (
  286. SELECT AVG(salary)
  287. FROM employees
  288. GROUP BY department_id
  289. )
  290. #老师做的
  291. SELECT department_id
  292. FROM employees
  293. WHERE department_id IS NOT NULL
  294. GROUP BY department_id
  295. HAVING AVG(salary) > (
  296. SELECT AVG(salary)
  297. FROM employees
  298. );
  299. #12、查询出公司中所有manager的详细信息。
  300. SELECT *
  301. FROM employees
  302. WHERE employee_id IN (
  303. SELECT manager_id
  304. FROM employees
  305. GROUP BY manager_id
  306. );
  307. #老师做的(讲EXISTS时的练习题)
  308. #方式一:自连接
  309. SELECT DISTINCT mgr.employee_id,mgr.last_name,mgr.job_id,mgr.department_id
  310. FROM employees emp JOIN employees mgr
  311. ON emp.manager_id = mgr.employee_id;
  312. #方式二:子查询
  313. SELECT DISTINCT employee_id,last_name,job_id,department_id
  314. FROM employees emp
  315. WHERE employee_id IN (
  316. SELECT DISTINCT manager_id
  317. FROM employees
  318. );
  319. #方式三:EXISTS
  320. SELECT employee_id,last_name,job_id,department_id
  321. FROM employees e1
  322. WHERE EXISTS (
  323. SELECT *
  324. FROM employees e2
  325. WHERE e1.employee_id = e2.manager_id
  326. );
  327. #13、各个部门中,最高工资中最低的那个部门的最低工资是多少?
  328. #我做的,不对
  329. SELECT MIN(salary)
  330. FROM employees
  331. WHERE department_id = (
  332. SELECT department_id
  333. FROM (
  334. SELECT MAX(salary),department_id
  335. FROM employees
  336. ) d_max
  337. );
  338. #老师做的
  339. #方式一
  340. SELECT MIN(salary)
  341. FROM employees
  342. WHERE department_id = (
  343. SELECT department_id
  344. FROM employees
  345. GROUP BY department_id
  346. HAVING MAX(salary) = (
  347. SELECT MIN(max_sal)
  348. FROM(
  349. SELECT MAX(salary) max_sal
  350. FROM employees
  351. GROUP BY department_id
  352. ) t_dept_max_sal
  353. )
  354. );
  355. #方式二
  356. SELECT MIN(salary)
  357. FROM employees
  358. WHERE department_id = (
  359. SELECT department_id
  360. FROM employees
  361. GROUP BY department_id
  362. HAVING MAX(salary) <= ALL (
  363. SELECT MAX(salary)
  364. FROM employees
  365. GROUP BY department_id
  366. )
  367. );
  368. #方式三
  369. SELECT MIN(salary)
  370. FROM employees
  371. WHERE department_id = (
  372. SELECT department_id
  373. FROM employees
  374. GROUP BY department_id
  375. HAVING MAX(salary) = (
  376. SELECT MAX(salary) max_sal
  377. FROM employees
  378. GROUP BY department_id
  379. ORDER BY max_sal ASC
  380. LIMIT 0,1
  381. )
  382. );
  383. #方式四
  384. SELECT MIN(salary)
  385. FROM employees e,(
  386. SELECT department_id,MAX(salary) max_sal
  387. FROM employees
  388. GROUP BY department_id
  389. ORDER BY max_sal ASC
  390. LIMIT 0,1
  391. ) t_dept_max_sal
  392. WHERE e.department_id = t_dept_max_sal.department_id;
  393. #14、查询平均工资最高的部门的manager的详细信息:
  394. # last_name,department_id,email,salary
  395. SELECT last_name,department_id,email,salary
  396. FROM employees
  397. WHERE employee_id IN (
  398. SELECT DISTINCT manager_id
  399. FROM employees
  400. WHERE department_id = (SELECT department_id
  401. FROM employees
  402. GROUP BY department_id
  403. HAVING AVG(salary) >= ALL (
  404. SELECT AVG(salary)
  405. FROM employees
  406. GROUP BY department_id
  407. )
  408. )
  409. )
  410. #老师做的
  411. #方式一
  412. SELECT last_name,department_id,email,salary
  413. FROM employees
  414. WHERE employee_id IN (
  415. SELECT DISTINCT manager_id
  416. FROM employees
  417. WHERE department_id = (
  418. SELECT department_id
  419. FROM employees
  420. GROUP BY department_id
  421. HAVING AVG(salary) = (
  422. SELECT MAX(avg_sal)
  423. FROM(
  424. SELECT AVG(salary) avg_sal
  425. FROM employees
  426. GROUP BY department_id
  427. ) t_dept_avg_sal
  428. )
  429. )
  430. );
  431. #方式二
  432. SELECT last_name,department_id,email,salary
  433. FROM employees
  434. WHERE employee_id IN (
  435. SELECT DISTINCT manager_id
  436. FROM employees
  437. WHERE department_id = (
  438. SELECT department_id
  439. FROM employees
  440. GROUP BY department_id
  441. HAVING AVG(salary) >= ALL (
  442. SELECT AVG(salary)
  443. FROM employees
  444. GROUP BY department_id
  445. )
  446. )
  447. );
  448. #方式三
  449. SELECT last_name,department_id,email,salary
  450. FROM employees
  451. WHERE employee_id IN (
  452. SELECT DISTINCT manager_id
  453. FROM employees e,(
  454. SELECT department_id,AVG(salary) avg_sal
  455. FROM employees
  456. GROUP BY department_id
  457. ORDER BY avg_sal DESC
  458. LIMIT 0,1
  459. ) t_dept_avg_sal
  460. WHERE e.department_id = t_dept_avg_sal.department_id
  461. );
  462. #15、查询部门的部门号,其中不包括job_id是“ST_CLERK"的部门号。
  463. #我做的也对,只是使用的表是employees,换成departments表就和老师做的结果一样
  464. SELECT DISTINCT department_id
  465. FROM employees
  466. WHERE department_id <> (
  467. SELECT department_id
  468. FROM employees
  469. WHERE job_id = 'ST_CLERK'
  470. GROUP BY job_id
  471. );
  472. #老师做的
  473. #方式一
  474. SELECT department_id
  475. FROM departments
  476. WHERE department_id NOT IN (
  477. SELECT DISTINCT department_id
  478. FROM employees
  479. WHERE job_id = 'ST_CLERK'
  480. );
  481. #方式二
  482. SELECT department_id
  483. FROM departments d
  484. WHERE NOT EXISTS(
  485. SELECT *
  486. FROM employees e
  487. WHERE d.department_id = e.department_id
  488. AND e.job_id = 'ST_CLERK'
  489. );
  490. #16、选择所有没有管理者的员工的last_name。
  491. #我做的,所得结果与老师的代码一致
  492. SELECT last_name
  493. FROM employees
  494. WHERE manager_id IS NULL;
  495. #老师做的
  496. SELECT emp.last_name
  497. FROM employees emp
  498. WHERE NOT EXISTS (
  499. SELECT *
  500. FROM employees mgr
  501. WHERE emp.manager_id = mgr.employee_id
  502. );
  503. #17、查询员工号、姓名、雇佣时间、工资,其中员工的管理者为“De Haan”。
  504. SELECT employee_id,last_name,hire_date,salary
  505. FROM employees
  506. WHERE manager_id = (
  507. SELECT employee_id
  508. FROM employees
  509. WHERE last_name = 'De Haan'
  510. );
  511. #老师做的
  512. #方式一
  513. SELECT employee_id,last_name,hire_date,salary
  514. FROM employees
  515. WHERE manager_id IN (
  516. SELECT employee_id
  517. FROM employees
  518. WHERE last_name = 'De Haan'
  519. );
  520. #方式二
  521. SELECT e1.employee_id,e1.last_name,e1.hire_date,e1.salary
  522. FROM employees e1
  523. WHERE EXISTS (
  524. SELECT *
  525. FROM employees e2
  526. WHERE e1.manager_id = e2.employee_id
  527. AND e2.last_name = 'De Haan'
  528. );
  529. #18、查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资(相关子查询)
  530. #在相关子查询课程中已作为例题讲解
  531. #方式一:使用相关子查询
  532. SELECT last_name,salary,department_id
  533. FROM employees e1
  534. WHERE salary > (
  535. SELECT AVG(salary)
  536. FROM employees e2
  537. WHERE department_id = e1.department_id
  538. );
  539. #方式二:在FROM中声明子查询
  540. SELECT e.last_name,e.salary,e.department_id
  541. FROM employees e,(
  542. SELECT department_id,AVG(salary) avg_sal
  543. FROM employees
  544. GROUP BY department_id
  545. ) t_dept_avg_sal
  546. WHERE e.department_id = t_dept_avg_sal.department_id
  547. AND e.salary > t_dept_avg_sal.avg_sal;
  548. #19、查询每个部门下的部门人数大于5的部门名称(相关子查询)
  549. SELECT d.department_name
  550. FROM departments d
  551. WHERE 5 < (
  552. SELECT COUNT(*)
  553. FROM employees e
  554. WHERE e.department_id = d.department_id
  555. );
  556. #20、查询每个国家下的部门个数大于2的国家编号(相关子查询)
  557. SELECT * FROM locations
  558. SELECT country_id
  559. FROM locations l
  560. WHERE 2 < (
  561. SELECT COUNT(*)
  562. FROM departments d
  563. WHERE l.location_id = d.location_id
  564. );
  565. /*
  566. 子查询的编写技巧(或步骤):(1)、从里往外写 (2)、从外往里写
  567. 如何选择?
  568. 1、如果子查询相对较简单,建议从外往里写。一旦子查询结构较复杂,则建议从里往外写。
  569. 2、如果是相关子查询,通常都是从外往里写。
  570. */