• 第09章_子查询


    1. #第09章_子查询
    2. #需求:谁的工资比Abel的高?
    3. #方式1:
    4. SELECT last_name,salary
    5. FROM employees
    6. WHERE last_name = 'Abel';
    7. SELECT last_name,salary
    8. FROM employees
    9. WHERE salary > 10000;
    10. #方式2:自连接
    11. SELECT e2.last_name,e2.salary
    12. FROM employees e1, employees e2
    13. WHERE e1.salary < e2.salary#多表的连接条件
    14. AND e1.last_name = 'Abel';
    15. #3.子查询:引入子查询:
    16. SELECT last_name,salary
    17. FROM employees
    18. WHERE salary > (
    19. SELECT salary
    20. FROM employees
    21. WHERE last_name = 'Abel'
    22. );
    23. #2.称谓的规范:外查询(主查询) ,内查询(子查询)
    24. /*
    25. 子查询(内查询)在主查询之前一次执行完成。
    26. 子查询的结果被主查询(外查询)使用。
    27. 注意事项:
    28. 子查询要包含在括号内
    29. 将子查询放在比较条件的右侧
    30. 单行操作符对应单行子查询,多行操作符对应多行子查询
    31. */
    32. /*
    33. 3.子查询的分类:
    34. 角度1:单行子查询(子查询返回一个结果供外查询使用)vs多行子查询(子查询返回多个结果供外查询使用)
    35. 角度2:内查询是否被执行多次:
    36. 相关子查询 vs 不相关子查询
    37. */
    38. #4.单行子查询:
    39. #4.1单行操作符:= > >= < <= <>
    40. #子查询编写步骤:从里往外 或者 从外往里写
    41. SELECT last_name, salary
    42. FROM employees
    43. WHERE salary > (
    44. SELECT salary
    45. FROM employees
    46. WHERE employee_id = 149
    47. );
    48. SELECT last_name,job_id, salary
    49. FROM employees
    50. WHERE salary > (
    51. SELECT salary
    52. FROM employees
    53. WHERE employee_id = 143
    54. ) AND job_id = (
    55. SELECT job_id
    56. FROM employees
    57. WHERE employee_id = 141
    58. );
    59. SELECT last_name,job_id, salary
    60. FROM employees
    61. WHERE salary = (
    62. SELECT MIN(salary)
    63. FROM employees
    64. );
    65. SELECT employee_id,manager_id,department_id
    66. FROM employees
    67. WHERE manager_id = (
    68. SELECT manager_id
    69. FROM employees
    70. WHERE employee_id = 141
    71. )
    72. AND department_id = (
    73. SELECT department_id
    74. FROM employees
    75. WHERE employee_id = 141
    76. )
    77. AND employee_id <> 141;#不等于,排除了141号本身!
    78. #5.多行子查询:
    79. #5.1操作符 IN ANY ALL SOME(ANY)
    80. #IN
    81. #ANY ALL
    82. #题目:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的
    83. #员工号、姓名、job_id 以及salary
    84. SELECT employee_id,last_name,job_id ,salary
    85. FROM employees
    86. WHERE job_id <> 'IT_PROG'
    87. AND salary < ANY(
    88. SELECT salary
    89. FROM employees
    90. WHERE job_id = 'IT_PROG'
    91. );
    92. #题目:返回其它job_id中比job_id为‘IT_PROG’部门所有工资低的员工的
    93. #员工号、姓名、job_id 以及salary
    94. SELECT employee_id,last_name,job_id ,salary
    95. FROM employees
    96. WHERE job_id <> 'IT_PROG'
    97. AND salary < ALL(
    98. SELECT salary
    99. FROM employees
    100. WHERE job_id = 'IT_PROG'
    101. );
    102. #查询平均工资最低的部门id
    103. #在MySQL中聚合函数不能嵌套。
    104. #方式一:
    105. SELECT MIN(avg_sal)
    106. FROM(
    107. SELECT AVG(salary) avg_sal
    108. FROM employees
    109. GROUP BY department_id
    110. )
    111. #方式二:
    112. SELECT department_id
    113. FROM employees
    114. GROUP BY department_id
    115. HAVING department_id IS NOT NULL
    116. AND AVG(salary) <= ALL(
    117. SELECT AVG(salary)
    118. FROM employees
    119. GROUP BY department_id
    120. HAVING department_id IS NOT NULL
    121. );
    122. #5.3空值问题:
    123. #6 相关子查询:
    124. #方式1
    125. SELECT last_name ,salary,department_id
    126. FROM employees e1
    127. WHERE e1.salary > (
    128. SELECT AVG(salary)
    129. FROM employees e2
    130. GROUP BY department_id
    131. HAVING department_id = e1.department_id
    132. );
    133. #方式二:在from中声明子查询:
    134. SELECT e1.last_name ,e1.salary,e1.department_id
    135. FROM employees e1,(
    136. SELECT AVG(salary) avg_sal,department_id
    137. FROM employees
    138. GROUP BY department_id
    139. ) avg_sal_dep
    140. WHERE e1.department_id = avg_sal_dep.department_id
    141. AND e1.salary > avg_sal_dep.avg_sal
    142. #题目:查询员工的id,salary,按照department_name 排序
    143. SELECT employee_id,salary
    144. FROM employees e
    145. ORDER BY (
    146. SELECT department_name
    147. FROM departments d
    148. WHERE e.department_id = d.department_id
    149. )
    150. #结论:在SELECT 中除了GROUP BY和LIMIT都可以写子查询。
    151. #sql99语法:
    152. /*
    153. SELECT ...字段1,...字段2,...(存在聚合函数)
    154. FROM ...(LEFT / RIGHT)JOIN...ON 多表的连接条件
    155. (LEFT / RIGHT)JOIN...ON 多表的连接条件
    156. WHERE 不包含聚合函数的过滤条件
    157. GROUP BY ...,...
    158. HAVING 包含聚合函数的过滤条件
    159. ORDER BY ...,...(ASC,DESC)
    160. LIMIT ...(分页操作)
    161. */
    162. #题目:若employees表中employee_id与job_history表中employee_id相同的数目不小于2
    163. #输出这些相同id的员工的employee_id,last_name和其job_id
    164. SELECT *
    165. FROM employees
    166. SELECT *
    167. FROM job_history
    168. SELECT employee_id,last_name,job_id
    169. FROM employees e
    170. WHERE 2 <= (
    171. SELECT COUNT(*)
    172. FROM job_history j
    173. WHERE e.employee_id = j.employee_id
    174. )
    175. #EXISTS NOT EXISTS关键字
    176. #题目:查询公司管理者的employee_id,last_name,job_id,department_id信息
    177. #方式1
    178. SELECT DISTINCT mgr.employee_id,mgr.last_name,mgr.job_id,mgr.department_id
    179. FROM employees emp JOIN employees mgr
    180. ON emp.manager_id = mgr.employee_id
    181. #方式2
    182. SELECT employee_id,last_name,job_id,department_id
    183. FROM employees e
    184. WHERE employee_id IN (
    185. SELECT DISTINCT manager_id
    186. FROM employees
    187. );
    188. #方式3:使用EXIST关键字
    189. SELECT employee_id,last_name,job_id,department_id
    190. FROM employees e1
    191. WHERE EXISTS(
    192. SELECT *
    193. FROM employees e2
    194. WHERE e1.`employee_id` = e2.`manager_id`
    195. );
    196. #题目:查询departments表中,不存在于employees表中的部门的department_id和department_name
    197. #方式1
    198. SELECT d.department_id, d.department_name
    199. FROM employees e RIGHT JOIN departments d
    200. ON e.department_id = d.department_id
    201. WHERE e.`department_id` IS NULL;
    202. #方式2
    203. SELECT department_id,department_name
    204. FROM departments d
    205. WHERE NOT EXISTS(
    206. SELECT *
    207. FROM employees e
    208. WHERE d.department_id = e.department_id
    209. );
    210. SELECT employee_id,last_name
    211. FROM employees
    212. WHERE department_id IN (
    213. SELECT DISTINCT department_id
    214. FROM employees
    215. WHERE last_name LIKE '%u%'
    216. );
    217. #

  • 相关阅读:
    Himall商城-公共方法
    如何将EasyCVR平台RTSP接入的设备数据迁移到EasyNVR中?
    如何使用企业内容管理 (ECM) 软件工具节约时间和金钱,提高企业效率和效益
    java面向对象(上)
    Exception in thread “main“ java.lang.NoClassDefFoundError: org/apache/flink/
    记录扩充linux服务器centos-root目录过程
    旋转验证码分析 rotatecaptcha
    后端存储实战课总结(上)
    为什么多数情况下GPT-3.5比LLaMA 2更便宜?
    SpringBoot项目--电脑商城【加入购物车】
  • 原文地址:https://blog.csdn.net/m0_63104578/article/details/126186960