• MySQL——子查询


    2023.9.8

            相关学习笔记:

    1. #子查询
    2. /*
    3. 含义:
    4. 出现在其他语句中的select语句,称为子查询或内查询
    5. 外部的查询语句,称为主查询或外查询
    6. 分类:
    7. 按子查询出现的位置:
    8. select后面:
    9. 仅仅支持标量子查询
    10. from后面:
    11. 支持表子查询
    12. where或having后面:★
    13. 标量子查询(单行) √
    14. 列子查询 (多行) √
    15. 行子查询
    16. exists后面(相关子查询)
    17. 表子查询
    18. 按结果集的行列数不同:
    19. 标量子查询(结果集只有一行一列)
    20. 列子查询(结果集只有一列多行)
    21. 行子查询(结果集有一行多列)
    22. 表子查询(结果集一般为多行多列)
    23. */
    24. #一、wherehaving后面
    25. /*
    26. 1、标量子查询(单行子查询)
    27. 2、列子查询(多行子查询)
    28. 3、行子查询(多列多行)
    29. 特点:
    30. ①子查询放在小括号内
    31. ②子查询一般放在条件的右侧
    32. ③标量子查询,一般搭配着单行操作符使用
    33. > < >= <= = <>
    34. 列子查询,一般搭配着多行操作符使用
    35. in、any/some、all
    36. ④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
    37. */
    38. #1.标量子查询(重点)
    39. #案例1:谁的工资比 Abel 高?
    40. SELECT `last_name`
    41. FROM `employees`
    42. WHERE salary>(SELECT salary FROM `employees` WHERE `last_name`='Abel');
    43. #案例2:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和工资
    44. SELECT `last_name`,`job_id`,`salary`
    45. FROM `employees`
    46. WHERE `job_id` = (SELECT `job_id` FROM `employees` WHERE `employee_id`=141)
    47. AND salary > (SELECT salary FROM `employees` WHERE `employee_id`=143);
    48. #案例3:返回公司工资最少的员工的last_name,job_id和salary
    49. SELECT `last_name`,`job_id`,`salary`
    50. FROM `employees`
    51. WHERE salary=(SELECT MIN(salary) FROM `employees`);
    52. #案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
    53. SELECT `department_id`,MIN(salary)
    54. FROM `employees`
    55. GROUP BY `department_id`
    56. HAVING MIN(salary)>(SELECT MIN(salary) FROM `employees` WHERE `department_id`=50);
    57. #2.列子查询(多行子查询)
    58. #案例1:返回location_id是14001700的部门中的所有员工姓名
    59. SELECT `last_name`
    60. FROM `employees`
    61. WHERE `department_id` IN
    62. (SELECT `department_id`
    63. FROM `departments`
    64. WHERE `location_id` IN (1400,1700));
    65. #案例2:返回其它工种中比job_id为‘IT_PROG’工种任一工资低的员工的员工号、姓名、job_id 以及salary
    66. SELECT `employee_id`,`last_name`,`job_id`,`salary`
    67. FROM `employees`
    68. WHERE salary < ANY
    69. (SELECT salary
    70. FROM `employees`
    71. WHERE `job_id` = 'IT_PROG')
    72. AND `job_id` != 'IT_PROG';
    73. #案例3:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id 以及salary
    74. SELECT last_name,employee_id,job_id,salary
    75. FROM employees
    76. WHERE salary<ALL(
    77. SELECT DISTINCT salary
    78. FROM employees
    79. WHERE job_id = 'IT_PROG'
    80. ) AND job_id<>'IT_PROG';
    81. #3、行子查询(结果集一行多列或多行多列)
    82. #案例:查询员工编号最小并且工资最高的员工信息
    83. SELECT *
    84. FROM `employees`
    85. WHERE (`employee_id`,`salary`) =
    86. (SELECT MIN(`employee_id`),MAX(salary) FROM `employees`);
    87. #二、select后面
    88. /*
    89. 仅仅支持标量子查询
    90. */
    91. #案例:查询每个部门的员工个数
    92. SELECT d.`department_name`,(
    93. SELECT COUNT(*) FROM `employees` e WHERE e.`department_id` = d.`department_id`
    94. ) 员工人数
    95. FROM `departments` d;
    96. #案例2:查询员工号=102的部门名
    97. SELECT `department_name`
    98. FROM `departments` d
    99. INNER JOIN `employees` e
    100. ON d.`department_id` = e.`department_id`
    101. WHERE `employee_id` = 102;
    102. #三、from后面
    103. /*
    104. 将子查询结果充当一张表,要求必须起别名
    105. */
    106. #案例:查询每个部门的平均工资的工资等级
    107. SELECT Ag_dep.*,j.`grade_level`
    108. FROM(
    109. SELECT `department_id`,AVG(salary) ag
    110. FROM `employees`
    111. GROUP BY `department_id`
    112. ) Ag_dep
    113. INNER JOIN `job_grades` j
    114. ON Ag_dep.ag BETWEEN `lowest_sal` AND `highest_sal`;
    115. #四、exists后面(相关子查询)
    116. /*
    117. 语法:
    118. exists(完整的查询语句)
    119. 结果:
    120. 1或0
    121. */
    122. SELECT EXISTS(SELECT employee_id FROM employees WHERE salary=300000);
    123. #案例1:查询有员工的部门名
    124. #用exists实现
    125. SELECT `department_name`
    126. FROM `departments` d
    127. WHERE EXISTS(
    128. SELECT *
    129. FROM `employees` e
    130. WHERE d.`department_id`=e.`department_id`
    131. );
    132. #用in来实现
    133. SELECT `department_name`
    134. FROM `departments` d
    135. WHERE d.`department_id` IN (
    136. SELECT `department_id`
    137. FROM `employees`);
    138. #案例2:查询没有女朋友的男神信息
    139. #in实现
    140. SELECT bo.*
    141. FROM `boys` bo
    142. WHERE bo.`id` NOT IN (
    143. SELECT `boyfriend_id`
    144. FROM `beauty`);
    145. #exists实现
    146. SELECT bo.*
    147. FROM `boys` bo
    148. WHERE NOT EXISTS(
    149. SELECT `boyfriend_id`
    150. FROM `beauty` b
    151. WHERE bo.`id`=b.`boyfriend_id`);

            课后习题:

    1. #课后习题
    2. #1.查询和Zlotkey相同部门的员工姓名和工资
    3. SELECT `last_name`,salary
    4. FROM `employees`
    5. WHERE `department_id` = (
    6. SELECT `department_id`
    7. FROM `employees`
    8. WHERE `last_name`='Zlotkey');
    9. #2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
    10. SELECT `employee_id`,`last_name`,salary
    11. FROM `employees`
    12. WHERE salary>(
    13. SELECT AVG(salary)
    14. FROM `employees`);
    15. #3.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
    16. SELECT `employee_id`,`last_name`,`salary`
    17. FROM `employees` e
    18. INNER JOIN (
    19. SELECT `department_id`,AVG(salary) ag
    20. FROM `employees`
    21. GROUP BY `department_id`
    22. ) b
    23. ON e.`department_id`=b.`department_id`
    24. WHERE salary > b.ag;
    25. #4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
    26. SELECT `employee_id`,`last_name`
    27. FROM `employees`
    28. WHERE `department_id` IN(
    29. SELECT `department_id`
    30. FROM `employees`
    31. WHERE `last_name` LIKE '%u%'
    32. );
    33. #5. 查询在部门的location_id为1700的部门工作的员工的员工号
    34. SELECT `employee_id`
    35. FROM `employees`
    36. WHERE `department_id` IN(
    37. SELECT `department_id`
    38. FROM `departments`
    39. WHERE `location_id`=1700
    40. );
    41. #6.查询管理者是King的员工姓名和工资
    42. SELECT `last_name`,`salary`
    43. FROM `employees`
    44. WHERE `manager_id` IN (
    45. SELECT `employee_id`
    46. FROM `employees`
    47. WHERE `last_name`='K_ing'
    48. );
    49. #7.查询工资最高的员工的姓名,要求first_name和last_name显示为一列,列名为 姓.名
    50. SELECT CONCAT(`last_name`,`first_name`) '姓.名'
    51. FROM `employees`
    52. WHERE salary=(
    53. SELECT MAX(salary)
    54. FROM `employees`
    55. );

    2023.9.11

            更新一下子查询经典案例习题,这些题拿下了子查询基本就掌握了。

    1. #子查询经典案例
    2. # 1. 查询工资最低的员工信息: last_name, salary
    3. SELECT `last_name`,salary
    4. FROM `employees`
    5. WHERE salary = (
    6. SELECT MIN(salary)
    7. FROM `employees`
    8. );
    9. # 2. 查询平均工资最低的部门信息
    10. # 本人解法(用到两个select):
    11. # 先查各部门的平均工资,再按平均工资升序排序,再用limit取第一行结果,此时得到的是个一行两列的表。再将此表和`departments`表内连接,连接条件为`department_id`字段相同,即可。
    12. SELECT d.`department_id`,d.`department_name`,d.`manager_id`,d.`location_id`
    13. FROM `departments` d
    14. INNER JOIN
    15. (SELECT AVG(salary) ag,d.`department_id`
    16. FROM `departments` d
    17. INNER JOIN `employees` e
    18. ON d.`department_id`=e.`department_id`
    19. GROUP BY `department_id`
    20. ORDER BY ag ASC
    21. LIMIT 1) b
    22. ON d.`department_id`=b.`department_id`;
    23. # 上述办法可以优化一下,自己构造的那个表可以只查询`department_id`字段
    24. SELECT *
    25. FROM `departments`
    26. WHERE `department_id`=(
    27. SELECT `department_id`
    28. FROM `employees`
    29. GROUP BY `department_id`
    30. ORDER BY AVG(salary)
    31. LIMIT 1
    32. );
    33. #(尚硅谷老师用的方式一这里就不列出来了)
    34. # 3. 查询平均工资最低的部门信息和该部门的平均工资
    35. # ps:和上一题差不多,把该部门的平均工资select出来即可
    36. SELECT d.`department_id`,d.`department_name`,d.`manager_id`,d.`location_id`,b.ag
    37. FROM `departments` d
    38. INNER JOIN
    39. (SELECT AVG(salary) ag,d.`department_id`
    40. FROM `departments` d
    41. INNER JOIN `employees` e
    42. ON d.`department_id`=e.`department_id`
    43. GROUP BY `department_id`
    44. ORDER BY ag ASC
    45. LIMIT 1) b
    46. ON d.`department_id`=b.`department_id`;
    47. # 4. 查询平均工资最高的 job 信息
    48. SELECT * FROM `jobs`
    49. WHERE `job_id` = (
    50. SELECT `job_id` FROM `employees`
    51. GROUP BY `job_id`
    52. ORDER BY AVG(`salary`) DESC
    53. LIMIT 1
    54. );
    55. # 5. 查询平均工资高于公司平均工资的部门有哪些?
    56. SELECT `department_id` FROM `employees`
    57. GROUP BY `department_id`
    58. HAVING AVG(salary) > (
    59. SELECT AVG(salary) FROM `employees`
    60. );
    61. # 6. 查询出公司中所有 manager 的详细信息.
    62. SELECT * FROM `employees`
    63. WHERE `employee_id` IN (
    64. SELECT `manager_id` FROM `employees`
    65. );
    66. # 7. 各个部门中 最高工资中最低的那个部门的 最低工资是多少
    67. SELECT MIN(salary) ,department_id
    68. FROM employees
    69. WHERE department_id=(
    70. SELECT department_id
    71. FROM employees
    72. GROUP BY department_id
    73. ORDER BY MAX(salary)
    74. LIMIT 1
    75. );
    76. # 8. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
    77. SELECT `last_name`,e.`department_id`,`email`,`salary`
    78. FROM `employees` e
    79. INNER JOIN `departments` d
    80. ON d.`manager_id`=e.`employee_id`
    81. WHERE d.`department_id` = (
    82. SELECT `department_id`
    83. FROM `employees`
    84. GROUP BY `department_id`
    85. ORDER BY AVG(salary) DESC
    86. LIMIT 1
    87. );

  • 相关阅读:
    计算机视觉——图像视觉显著性检测
    2023年海南省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程
    3年测试经验,测试用例应该达到这个水平才合格
    Pikachu靶场——XXE 漏洞
    Network(三)动态路由与ACL配置
    20 C++设计模式之迭代器(Iterator)模式
    从autojs到冰狐智能辅助的心里历程
    pytorch深度学习实战19
    视频分辨率/帧率/码率选择参考
    【0119】PostgreSQL FMS(Free Space Map)
  • 原文地址:https://blog.csdn.net/m0_61028090/article/details/132768002