【MySQL】详解20道例题带你学习子查询,偷偷做卷王(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 【MySQL】详解20道例题带你学习子查询,偷偷做卷王(二)

例题3

查询与141号员工的manager_id和department_id相同的其他员工的employee_id,

manager_id,department_id
SELECT employee_id,manager_id,department_id
FROM employees
WHERE manager_id = (
      SELECT manager_id
      FROM employees
      WHERE employee_id = 141
     )
AND department_id = (
      SELECT department_id
      FROM employees
      WHERE employee_id = 141
     )
AND employee_id <> 141;
#解题思路:分别查询141号员工的manager_id和department_id,并且最终要出去141号员工本身


例题4

查询最低工资大于50号部门最低工资的部门id和其最低工资


SELECT department_id , MIN(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING MIN(salary) > 
    (SELECT MIN(salary) FROM employees 
      WHERE department_id = 50);
#解题思路:因为有聚合函数,所以要考虑分组查询;按照department_id分组后查询其最低工资大于50号部门的最低工资,这里用到了having中的子查询


例题5

显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’,这里用到了流程控制,小伙伴们要是流程控制不熟悉的话,可以看看我写的流程控制总结:MySQL流程控制大总结
SELECT employee_id, last_name,
       (CASE department_id
        WHEN
             (SELECT department_id FROM departments
       WHERE location_id = 1800)           
        THEN 'Canada' 
        ELSE 'USA' 
        END) AS location
FROM   employees;
#这里用到了case中嵌套子查询


2、多行子查询例题

例题6

查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id

employee_id,manager_id,department_id
SELECT employee_id,manager_id,department_id
FROM employees
WHERE manager_id IN(
  SELECT manager_id FROM employees WHERE employee_id IN (141,171)
)
AND department_id IN (
  SELECT department_id FROM employees WHERE employee_id IN (141,174)
)
AND employee_id <> 141 AND 174;
#这里与例题3类似,只是返回的结果是多个值,属于多行子查询



例题7

返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、

job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY (
  SELECT salary
  FROM employees
  WHERE job_id = 'IT_PROG'
  );
#这里重点是使用关键字any,意思就是满足其中一个条件即可


例题8

查询平均工资最低的部门id (题目虽短,但是有一定的难度)


#方式1:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
    SELECT MIN(avg_sal)
    FROM (
    SELECT AVG(salary) avg_sal
    FROM employees
    GROUP BY department_id
    ) dept_avg_sal
    )
#解题思路:1、先根据部门id分组查询各个部门的平均工资
   2、然后把 1 中的查询结果当成一个新的表,并且要给该表取表名(dept_avg_sal)
   3、然后从新表中查询最低的平均工资
   4、1 2 3 步一起组成一个内查询,实现题目要求
#方式2:
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
    SELECT AVG(salary) avg_sal
    FROM employees
    GROUP BY department_id
)
#对比方式一,这个就比较好理解了,要查询的平均工资只要不大于所有部门的平均工资就可以了



3、相关子查询例题

例题9

查询员工的id,salary,按照department_name 排序


SELECT employee_id,salary
FROM employees e
ORDER BY (
   SELECT department_name
   FROM departments d
   WHERE e.`department_id` = d.`department_id`
  );
#解题思路:因为员工表中没有部门名,但是可以根据e.`department_id` = d.`department_id`
#这一条件来进行关联,即内查询用到了主查询,这就是相关子查询


例题10

在employees中增加一个department_name字段,数据为员工对应的部门名称


UPDATE employees e
SET department_name =  (SELECT department_name 
                        FROM   departments d
                        WHERE  e.department_id = d.department_id);
#这里用到了相关更新的操作,使用相关子查询依据一个表中的数据更新另一个表的数据,道理是一样的


例题11

删除表employees中,其与emp_history表皆有的数据


DELETE FROM employees e
WHERE employee_id in  
           (SELECT employee_id
            FROM   emp_history 
            WHERE  employee_id = e.employee_id);
#这里用到了相关删除的操作,使用相关子查询依据一个表中的数据删除另一个表的数据


4、综合例题

例题12

查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
SELECT employee_id,last_name
FROM employees 
WHERE department_id IN (
    SELECT DISTINCT department_id
    FROM employees
    WHERE last_name LIKE '%u%'
    );
#解题思路:还是老方法,先查询姓名中包含字母U的员工部门号,注意用到了关键字IN


例题13

查询工资最低的员工信息: last_name, salary


SELECT last_name,salary
FROM employees
WHERE salary = (
  SELECT MIN(salary)
  FROM employees
  );
#这里用到了聚合函数


例题14

查询出公司中所有 manager 的详细信息


SELECT employee_id,last_name,job_id,department_id
FROM employees e1
WHERE EXISTS (
        SELECT *
        FROM employees e2
        WHERE e1.`employee_id` = e2.`manager_id`
      );
#这里使用了EXISTS关键字,当e1.`employee_id` = e2.`manager_id`成立,内查询为true时,就继续执行


例题15

查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号


SELECT department_id
FROM departments d
WHERE NOT EXISTS (
  SELECT *
  FROM employees e
  WHERE d.`department_id` = e.`department_id`
  AND e.`job_id` = 'ST_CLERK'
  );
#这里用到了关键字 NOT EXISTS,与EXISTS 相反,只有为false时,才继续执行


例题16

选择所有没有管理者的员工的last_name


SELECT last_name
FROM employees emp
WHERE NOT EXISTS (
  SELECT *
  FROM employees mgr
  WHERE emp.`manager_id` = mgr.`employee_id`
  );


例题17

查询员工号、姓名、雇用时间、工资,其中员工的管理者为 ‘De Haan’


SELECT employee_id,last_name,hire_date,salary
FROM employees e1
WHERE EXISTS (
  SELECT *
  FROM employees e2
  WHERE e1.`manager_id` = e2.`employee_id`
  AND e2.last_name = 'De Haan'
  );


例题18

查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资


SELECT last_name,salary,department_id
FROM employees e1
WHERE salary > (
  SELECT AVG(salary)
  FROM employees e2
  WHERE department_id = e1.`department_id`
  );
#这里考察相关子查询的使用


例题19

查询每个部门下的部门人数大于 5 的部门名称(相关子查询)


SELECT department_name
FROM departments d
WHERE 5 < (
    SELECT COUNT(*)
    FROM employees e
    WHERE d.department_id = e.`department_id`
   );


例题20

查询工资最低的员工信息: last_name, salary


SELECT *
FROM departments
WHERE department_id = (
    SELECT department_id
    FROM employees
    GROUP BY department_id
    HAVING AVG(salary ) =(
      SELECT AVG(salary) avg_sal
      FROM employees
      GROUP BY department_id
      ORDER BY avg_sal ASC
      LIMIT 1  
      )
    );
#这里用到了LIMIT关键字,
# 1 分组排序后用limit获取最低的工资
# 2 再根据部门id分组后筛选平均工资等于 1 中的结果
# 3 根据 2 获取的查询结果,实现题目要求
# 难度有点高,实现方式不止一种。


总结

可以说,子查询是SQL查询语句难度到达了顶峰,与前面学习到的排序、分页、分组查询等等相结合。我应该没事巩固例题,加强训练,相信自己一定可以搞明白子查询,最后再画出脉络图!

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
360 5
|
3月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
76 1
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
181 6
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
90 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
103 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
83 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
133 0
|
12月前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1033 56
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
12月前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
556 5
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
508 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。

推荐镜像

更多