爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      MySQL子查询篇(精选20道子查询练习题)

      首页 知识中心 数据库 文章详情页

      MySQL子查询篇(精选20道子查询练习题)

      2024-11-08 08:54:34 阅读次数:36

      MySQL

      子查询

      说白了子查询就是嵌套查询

      SQL 中子查询的使用大大增强了 SELECT 查询的能力

      因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。

      需求分析

      如果我们遇见下面这种问题,就要用到子查询了

      MySQL子查询篇(精选20道子查询练习题)

      现有方法:

      • 先查出Abel的工资,然后那结果在查询一次进行筛选
      #方式一:
      SELECT salary
      FROM employees
      WHERE last_name = 'Abel';

      SELECT last_name,salary
      FROM employees
      WHERE salary > 11000;
      • 自连接
      SELECT
      e2.last_name,
      e2.salary
      FROM
      employees e1,
      employees e2
      WHERE
      e1.last_name = 'Abel'
      AND e1.`salary` < e2.`salary`
      • 子查询
      SELECT
      last_name,
      salary
      FROM
      employees
      WHERE
      salary > (
      SELECT
      salary
      FROM
      employees
      WHERE
      last_name = 'Abel')

      子查询的分类

      单行、多行子查询

      按查询的结果返回一条还是多条记录,将子查询分为单行子查询、多行子查询

      • 子查询(内查询)在主查询之前一次执行完成。
      • 子查询的结果被主查询(外查询)使用 。
      • 注意事项
      • 子查询要包含在括号内
      • 将子查询放在比较条件的右侧(提高可读性)
      • 单行操作符对应单行子查询,多行操作符对应多行子查询
      • 单行子查询就是子查询查出的结果就一条
      • 多行子查询就是子查询查出的结果不止一条

      MySQL子查询篇(精选20道子查询练习题)

      相关、不相关子查询

      我们按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询 。

      子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条 件进行执行,那么这样的子查询叫做不相关子查询。(子查询的结果是固定的)

      同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查 询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。(子查询的结果不固定,会根据外面传过来的值改变)

      单行子查询

      单行比较操作符

      什么是单行操作符

      就是它只能匹配一行数据,如果你的子查询查出了多条数据,那么它就报错

      MySQL子查询篇(精选20道子查询练习题)

      代码示例

      题目:查询工资大于149号员工工资的员工的信息

      MySQL子查询篇(精选20道子查询练习题)

      题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资

      写子查询什么思路呢?

      根据题目,先单独写出子查询,最后添加到查询语句中

      比如题目说返回job_id与141号员工相同,那我们就可以先写出141号员工的job_id是多少的查询语句,之后在放到总查询语句中

      SELECT
      last_name,
      job_id,
      salary
      FROM
      employees
      WHERE
      job_id = ( SELECT job_id FROM employees WHERE employee_id = 141 )
      AND salary > ( SELECT salary FROM employees WHERE employee_id = 143 )

      题目:返回公司工资最少的员工的last_name,job_id和salary

      先通过子查询获得工资最少的工资数,然后把这个当成筛选条件获取是谁的工资这么低

      SELECT
      last_name,
      job_id,
      salary
      FROM
      employees
      WHERE
      salary = ( SELECT MIN(salary) FROM employees )

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

      最后的AND employee_id NOT IN (174, 141);是为了去掉141、174员工它们本身,因为题目要求是求其他员工的…

      这里的IN属于多行子查询操作符,这里提前用到了。因为子查询结果不唯一

      -- 不成对比较
      SELECT
      employee_id,
      manager_id,
      department_id
      FROM
      employees
      WHERE
      manager_id IN ( SELECT manager_id FROM employees WHERE employee_id IN ( 174, 141 ) )
      AND department_id IN ( SELECT department_id FROM employees WHERE employee_id IN ( 174, 141 ) )
      AND employee_id NOT IN ( 174, 141 );

      (manager_id,department_id)这里为什么要给条件加上括号呢?
      和后面的结果做匹配

      -- 成对比较
      SELECT
      employee_id,
      manager_id,
      department_id
      FROM
      employees
      WHERE
      ( manager_id, department_id ) IN ( SELECT manager_id, department_id FROM employees WHERE employee_id IN ( 174, 141 ) )
      AND employee_id NOT IN ( 174, 141 );

      HAVING 中的子查询

      • 首先执行子查询。
      • 向主查询中的HAVING 子句返回结果。

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

      SELECT
      department_id,
      MIN( salary )
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      MIN( salary ) > ( SELECT MIN( salary ) FROM employees WHERE department_id = 50 );

      CASE中的子查询

      题目:显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800 的department_id相同,则location为’Canada’,其余则为’USA’。

      若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’
      这题明显的CASE,也就是SWITCH形式的
      1、根据location_id为1800的department_id先写出这个查询
      2、然后CASE后面跟的条件就是department_id,拿CASE后面跟的条件去和子查询查出的条件相比即可
      3、给它起个别名location

      SELECT
      employee_id,
      last_name,
      ( CASE department_id WHEN ( SELECT department_id FROM departments WHERE location_id = 1800 ) THEN location = 'Canada' ELSE 'USA' END ) location
      FROM
      employees;

      空值问题

      意思就是子查询查出来的结果是空值,导致外面的查询对应的结果也是空值

      SELECT
      last_name,
      job_id
      FROM
      employees
      WHERE
      job_id = ( SELECT job_id FROM employees WHERE last_name = 'Haas' );

      非法使用子查询

      Subquery returns more than 1 row

      MySQL子查询篇(精选20道子查询练习题)

      多行子查询

      什么是多行子查询?

      • 内查询返回多行
      • 使用多行比较操作符

      多行比较操作符

      操作符

      含义

      IN

      等于列表中的任意一个

      ANY

      需要和单行比较操作符一起使用,和子查询返回的某一个值去比较

      ALL

      需要和单行比较操作符一起使用,使子查询返回所有值比较

      SOME

      实际上是ANY的别名,作用相同,一般常使用ANY

      代码示例

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

      -- 1、job_id为‘IT_PROG’部门员工的工资
      SELECT salary FROM employees WHERE job_id = 'IT_PROG'

      -- 2、比上面任一结果低的信息
      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' );

      题目:返回其它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 < ALL ( SELECT salary FROM employees WHERE job_id = 'IT_PROG' );

      题目:查询平均工资最低的部门id

      1、这道题的关键就是要把查出来的平均工资数据当成一个新的表来查

      2、聚合函数不能嵌套查询(MIN(AVG(SALARY)))

      3、派生表要有自己的别名,不然会出现如下错误:

      Every derived table must have its own alias(每个派生表都必须有自己的别名)

      4、为了最后结果SQL的美观,前面做的小查询最好把它写成简写形式

      -- 1.每个部门的平均工资
      SELECT AVG(salary) FROM employees WHERE department_id IS NOT NULL GROUP BY department_id;

      -- 2.平均工资最低
      SELECT MIN(avg_salary) FROM (
      SELECT AVG(salary) avg_salary FROM employees WHERE department_id IS NOT NULL GROUP BY department_id) avg_emp_salary

      -- 3.平均工资最低的部门
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) = ( SELECT MIN( avg_salary ) FROM ( SELECT AVG( salary ) avg_salary FROM employees WHERE department_id IS NOT NULL GROUP BY department_id ) avg_emp_salary );

      方式二:让平均工资小于所有平均工资最小的,那直接就满足条件了

      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) <= ALL ( SELECT AVG( salary ) FROM employees GROUP BY department_id );

      空值问题

      意思就是子查询查出来的结果是空值,导致外面的查询对应的结果也是空值

      SELECT last_name
      FROM employees
      WHERE employee_id NOT IN (
      SELECT manager_id
      FROM employees
      )

      相关子查询

      相关子查询执行流程

      子查询的结果不固定,会根据外面传过来的值改变

      相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。

      MySQL子查询篇(精选20道子查询练习题)

      子查询中使用主查询中的列,这句话是重点!

      代码示例

      题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id

      方式一:相关子查询

      在内部查询中使用外部的表建立关联关系即可实现相关子查询

      举个例子:

      当外部查出第一条数据的时候department_id为10,那么进到子查询就是查department_id为10的平均工资

      当外部查出第二条数据的时候department_id为20,那么进到子查询就是查department_id为20的平均工资

      …

      -- 1.60号部门的平均工资
      SELECT AVG(salary) FROM employees WHERE department_id=60
      -- 2.员工中工资大于60号部门的平均工资
      SELECT
      last_name,
      salary
      FROM
      employees
      WHERE
      salary > (SELECT AVG(salary) FROM employees WHERE department_id=60)
      -- 3.那本部门怎么表示呢?
      -- 在内部查询中使用外部的表建立关联关系即可
      SELECT
      last_name,
      salary
      FROM
      employees e1
      WHERE
      salary > (SELECT AVG(salary) FROM employees e2 WHERE department_id=e1.department_id);

      方式二:在 FROM 中使用子查询

      1、先把部门平均工资查询出来,把查询结果当成新表e2来用

      2、和员工表e1进行连接

      3、通过添加条件**e1.salary > e2.avg_salay(员工的工资大于每个部门的平均工资)**进行筛选

      4、FROM使用的情况就是很多时候我们想查询的时候数据是不存在的,我们需要先把数据查出来然后把这个查出来的数据当成一个新的表来使用

      SELECT
      e1.last_name,
      e1.salary
      FROM
      employees e1,(
      SELECT AVG( salary ) avg_salay, department_id FROM employees e2 GROUP BY department_id ) e2
      WHERE
      e1.department_id = e2.department_id
      AND e1.salary > e2.avg_salay;

      from型的子查询:子查询是作为from的一部分,子查询要用()引起来,并且要给这个子查询取别 名, 把它当成一张“临时的虚拟的表”来使用。

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

      很明显department_name 在department表中,所以这又是一个相关子查询,还是带多写

      SELECT
      employee_id,
      salary
      FROM
      employees e
      ORDER BY
      (SELECT department_name FROM departments d WHERE e.department_id = d.department_id )

      题目:若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同 id的员工的employee_id,last_name和其job_id

      SELECT
      employee_id,
      last_name,
      job_id
      FROM
      employees e
      WHERE
      2 <= ( SELECT COUNT(*) FROM job_history WHERE employee_id = e.employee_id );

      结论:在查询语句中,除了GROUP BY和LIMIT之外,其他位置都可以声明子查询

      SELECT … , … ,…(存在聚合函数)

      FROM … (LEFT/ RIGHT)JOIN …ON多表的连接条件(LEFT /RIGHT)JOIN …ON …

      WHERE不包含聚合函数的过滤条件GROUP BY …,…

      HAVING包含聚合函数的过滤条件ORDER BY …, … (AsC / DESC )LIMIT …,… .

      题目:若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同 id的员工的employee_id,last_name和其job_id

      SELECT
      employee_id,
      last_name,
      job_id
      FROM
      employees e
      WHERE
      2 <= ( SELECT COUNT(*) FROM job_history WHERE employee_id = e.employee_id );

      EXISTS 与 NOT EXISTS关键字

      • 关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。
      • 如果在子查询中不存在满足条件的行:
      • 条件返回FALSE
      • 继续在子查询中查找
      • 如果在子查询中存在满足条件的行:
      • 不在子查询中继续查找
      • 条件返回TRUE
      • NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE。

      题目:查询公司管理者的employee_id,last_name,job_id,department_id信息

      -- 自连接
      SELECT
      DISTINCT
      e1.employee_id,
      e1.last_name,
      e1.job_id,
      e1.department_id
      FROM
      employees e1 JOIN employees e2
      WHERE
      e1.employee_id = e2.manager_id

      -- 子查询1
      -- 如果能用自连接的话最好使用自连接,因为它的速度快,效率高
      -- 这个子查询的思路是:
      -- 1、先查出所有员工的manage_id,并进行去重,因为多个员工可能有共同的领导
      -- 2、外查询在进行获取manage_id的信息
      SELECT
      employee_id,
      last_name,
      job_id,
      department_id
      FROM
      employees
      WHERE
      employee_id IN (SELECT DISTINCT manager_id FROM employees)


      -- 子查询2
      -- EXISTS关键字是用来检查子查询中是否存在满足的条件
      -- 满足返回true,打印
      -- 不满足继续找,直到true为止
      -- 那么NOT EXISTS意思就是和EXISTS相反
      SELECT
      employee_id,
      last_name,
      job_id,
      department_id
      FROM
      employees e1
      WHERE
      EXISTS (SELECT * FROM employees WHERE e2.manager_id = e1.employee_id)方式一:

      题目:查询departments表中,不存在于employees表中的部门的department_id和department_name

      NOT EXISTS不存在返回true停止查找子查询,存在返回false,继续查找子查询

      SELECT
      department_id,
      department_name
      FROM
      departments d
      WHERE
      NOT EXISTS(SELECT DISTINCT department_id FROM employees e WHERE d.department_id = e.department_id)

      相关更新

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

      -- 1.增加字段
      ALTER TABLE employees ADD(department_name VARCHAR(14));

      -- 2.插入数据
      UPDATE employees e
      SET department_name = ( SELECT department_name FROM departments d WHERE e.department_id = d.department_id );

      相关删除

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

      DELETE FROM employees e
      WHERE employee_id IN (SELECT employee_id FROM emp_history e2 WHERE e.employee_id = e2.employee_id )

      练习

      表的数据尚硅谷来获取…

      #1.查询和Zlotkey相同部门的员工姓名和工资
      -- 1.分析题,找出定语"查询和Zlotkey相同部门"(一般"的"前面的做定于修饰后面的句子)
      -- 2.写出定语的查询语句SELECT department_id FROM employees WHERE last_name = 'Zlotkey'找出了Zlotkey部门ID
      -- 3.完成题目
      SELECT
      last_name,
      salary
      FROM
      employees
      WHERE
      department_id = ( SELECT department_id FROM employees WHERE last_name = 'Zlotkey' );


      #2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
      -- 1.分析题,找出定语"工资比公司平均工资高"
      -- 2.写出定语的查询语句salary > (SELECT AVG(salary) avg_emp FROM employees)
      -- 3.完成题目
      SELECT
      employee_id,
      last_name,
      salary
      FROM
      employees
      WHERE
      salary > (SELECT AVG(salary) avg_emp FROM employees)


      #3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary
      -- 1.分析题,找出定语"工资大于所有JOB_ID = 'SA_MAN'的员工"
      -- 2.写出定语的查询语句salary > ALL (SELECT salary FROM employees WHERE JOB_ID = 'SA_MAN')
      -- 3.完成题目
      SELECT
      last_name,
      job_id,
      salary
      FROM
      employees
      WHERE
      salary > ALL (SELECT salary FROM employees WHERE job_id = 'SA_MAN')


      #4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
      -- 1.分析题,找出定语"姓名中包含字母u的员工在相同部门的员工"
      -- 2.写出定语的查询语句SELECT department_id,last_name FROM employees WHERE last_name LIKE '%u%'
      -- 3.完成题目
      SELECT
      employee_id,
      last_name
      FROM
      employees
      WHERE
      (department_id,last_name) IN (SELECT department_id,last_name FROM employees WHERE last_name LIKE '%u%' );

      #5.查询在部门的location_id为1700的部门工作的员工的员工号
      -- 1.分析题,找出定语"部门的location_id为1700的部门工作的员工"
      -- 2.写出定语的查询语句SELECT department_id FROM departments WHERE location_id = 1700
      -- 3.完成题目
      SELECT
      employee_id
      FROM
      employees
      WHERE
      department_id IN (SELECT department_id FROM departments WHERE location_id = 1700)


      #6.查询管理者是King的员工姓名和工资
      -- 1.分析题,找出定语"管理者是King"
      -- 2.写出定语的查询语句SELECT employee_id FROM employees WHERE last_name = 'King'
      -- 3.完成题目
      SELECT
      last_name,
      salary
      FROM
      employees
      WHERE
      manager_id IN (SELECT employee_id FROM employees WHERE last_name = 'King')


      #7.查询工资最低的员工信息: last_name, salary
      -- 1.分析题,找出定语"工资最低"
      -- 2.写出定语的查询语句SELECT MIN(salary) FROM employees
      -- 3.完成题目
      SELECT
      last_name,
      salary
      FROM
      employees
      WHERE
      salary = (SELECT MIN(salary) FROM employees)

      #8.查询平均工资最低的部门信息
      -- 1.分析题,找出定语"平均工资最低的部门"
      -- 2.写出定语的查询语句
      -- SELECT MIN( avg_salary ) FROM ( SELECT AVG( salary ) avg_salary FROM employees GROUP BY department_id ) t_avg_salary
      -- 3.找到平均工资后,在把这个平均工资当成一个新表来用即可.需要注意的点就是要给新表起别名,要给平均薪资字段起别名
      -- 方式一:先求出平均工资,在求最低工资,因为前两次求的是平均工资最低的数据,所以最后条件要用AVG函数来接收
      SELECT
      *
      FROM
      departments
      WHERE
      department_id = (
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) = ( SELECT MIN( avg_salary ) FROM ( SELECT AVG( salary ) avg_salary FROM employees GROUP BY department_id ) t_avg_salary )
      )


      -- 方式二:求出各部门最低工资后,直接设置条件让它等于查出结果中最小的那个即可
      SELECT
      *
      FROM
      departments
      WHERE
      department_id = (
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) <= ALL ( SELECT AVG( salary ) avg_salary FROM employees GROUP BY department_id )
      )


      -- 方式三:求出各部门平均工资后,进行升序排序,然后通过分页查询取第一条数据即可
      SELECT
      *
      FROM
      departments
      WHERE
      department_id = (
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary )=(
      SELECT
      AVG( salary ) avg_salary
      FROM
      employees
      GROUP BY
      department_id
      ORDER BY
      avg_salary
      LIMIT 0,
      1
      ));

      -- 方式四
      -- 查询出各部门平均工资后,把数据当成新表来用,与旧表进行自连接
      SELECT
      d.*
      FROM
      departments d,(
      SELECT department_id,AVG(salary) avg_sal
      FROM employees
      GROUP BY department_id
      ORDER BY avg_sal
      LIMIT 0,1) t_avg_sal
      WHERE d.department_id = t_avg_sal.department_id



      #9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询)
      -- 方式一:
      -- 1.这里部门信息采用子查询查到的平均工资最低的数值
      -- 2.通过平均工资最低的数值在进行查询到部门ID
      -- 3.根据部门ID获取部门信息
      -- 4.平均工资通过在select语句中在进行相关子查询,获得该部门的平均工资
      -- 这种方式呢,是通过平均工资最低数值来获取部门ID,其实部门ID是可以直接获取的,这里相当于多走一步
      SELECT
      d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) avg_salary
      FROM
      departments d
      WHERE
      department_id = (
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) <= ALL ( SELECT AVG( salary ) avg_salary FROM employees GROUP BY department_id )
      )

      -- 方式二:
      -- 在方式一基础上,获取最低工资的方式不在是和全部部门的工资作比较,而是直接让工资等于升序过后的第一个工资
      SELECT d.*,( SELECT AVG( salary ) FROM employees WHERE department_id = d.department_id ) avg_salary
      FROM
      departments d
      WHERE
      department_id = (
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) = ( SELECT AVG( salary ) avg_salary FROM employees GROUP BY department_id ORDER BY avg_salary LIMIT 0, 1 )
      );

      -- 方式三:
      -- 1.通过MIN聚合函数来获取最低平均工资
      -- 2.然后在筛选平均工资为最低平均工资的部门
      -- 3.获取部门信息....
      SELECT d.*,( SELECT AVG( salary ) FROM employees WHERE department_id = d.department_id ) avg_salary
      FROM
      departments d
      WHERE
      department_id = (
      SELECT
      department_id
      FROM
      employees
      GROUP BY
      department_id
      HAVING
      AVG( salary ) = ( SELECT MIN( avg_salary ) FROM ( SELECT AVG( salary ) avg_salary FROM employees GROUP BY department_id ) t_avg_salary ));


      -- 方式四:
      -- 平均工资最低的部门
      SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG(salary) LIMIT 0,1
      -- 部门信息和该部门的平均工资
      -- 1.这里部门信息采用子查询查到的平均工资最低的部门ID来获取部门信息
      -- 2.平均工资通过在select语句中在进行相关子查询,获得该部门的平均工资
      SELECT d.*,( SELECT AVG( salary ) FROM employees e WHERE d.department_id = e.department_id GROUP BY department_id ) avg_sala
      FROM
      departments d
      WHERE
      department_id = ( SELECT department_id FROM employees GROUP BY department_id ORDER BY AVG( salary ) LIMIT 0, 1 );

      -- 方式五:
      -- 效率最高,通过自连接
      SELECT d.*,t_avg_sal.avg_sal
      FROM departments d,(
      SELECT
      department_id,
      AVG(salary) avg_sal
      FROM
      employees
      GROUP BY
      department_id
      ORDER BY
      AVG( salary )
      LIMIT 0,1) t_avg_sal
      WHERE d.department_id = t_avg_sal.department_id



      #10.查询平均工资最高的 job 信息
      -- 1.分析题,找出定语"平均工资最高"
      -- 2.写出定语的查询语句AVG( salary ) >= ALL(SELECT AVG( salary ) avg_salary FROM employees GROUP BY job_id)
      -- 3.完成题目
      SELECT
      j.*
      FROM
      jobs j,
      ( SELECT job_id, AVG( salary ) avg_salary FROM employees GROUP BY job_id ORDER BY avg_salary DESC LIMIT 0, 1 ) t_avg_salary
      WHERE
      j.job_id = t_avg_salary.job_id;

      #11.查询平均工资高于公司平均工资的部门有哪些?
      -- 1.分析题,找出定语"平均工资高于公司平均工资的部门"
      -- 2.写出定语的查询语句AVG(salary) > (SELECT AVG(salary) FROM employees)
      -- 3.完成题目
      SELECT
      department_id
      FROM
      employees
      WHERE
      department_id IS NOT NULL
      GROUP BY
      department_id
      HAVING
      AVG(salary) > (SELECT AVG(salary) FROM employees)



      #12.查询出公司中所有 manager 的详细信息
      -- 1.分析题,找出定语"公司中所有 manager "
      -- 2.写出定语的查询语句employee_id IN (SELECT DISTINCT manager_id FROM employees)
      -- 3.完成题目
      SELECT
      employee_id,
      last_name,
      salary
      FROM
      employees
      WHERE
      employee_id IN (SELECT DISTINCT manager_id FROM employees)

      SELECT
      employee_id,
      last_name,
      salary
      FROM
      employees e1
      WHERE
      EXISTS (SELECT * FROM employees e2 WHERE e2.manager_id = e1.employee_id)


      -- 自连接
      SELECT
      e1.employee_id,
      e1.last_name,
      e1.salary
      FROM
      employees e1 JOIN employees e2
      WHERE
      e1.employee_id = e2.manager_id



      #13.各个部门中最高工资中最低的那个部门的 最低工资是多少?
      -- 1.分析题,找出定语"各个部门中最高工资中最低的那个部门 "
      -- 2.写出定语的查询语句salary <= ALL(SELECT MAX(salary) FROM employees GROUP BY department_id)
      -- 3.完成题目
      SELECT
      MIN(salary)
      FROM
      employees
      WHERE
      salary <= ALL(SELECT MAX(salary) FROM employees GROUP BY department_id)

      -- 自连接
      SELECT
      salary
      FROM
      employees e1,(SELECT department_id,MAX(salary) max_salary FROM employees GROUP BY department_id ORDER BY max_salary LIMIT 0,1
      ) t_max_salay
      WHERE
      e1.department_id = t_max_salay.department_id


      #14.查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
      -- 1.分析题,找出定语"平均工资最高的部门 "
      -- 2.写出定语的查询语句salary >= ALL(SELECT AVG(salary) FROM employees GROUP BY department_id)获取最高部门的ID
      -- 3.获得所有manager的信息
      -- 4.设置限制条件进行匹配
      SELECT
      last_name,
      department_id,
      email,
      salary
      FROM
      employees
      WHERE
      employee_id IN (SELECT DISTINCT manager_id FROM employees)
      AND department_id = (SELECT department_id FROM employees WHERE salary>=ALL (
      SELECT AVG(salary) FROM employees GROUP BY department_id))


      -- 平均工资最高的部门
      SELECT department_id,AVG(salary) avg_sal
      FROM employees
      GROUP BY department_id
      ORDER BY avg_sal DESC
      LIMIT 0,1

      -- 自连接方式
      SELECT *
      FROM employees
      WHERE employee_id IN (SELECT DISTINCT manager_id
      FROM employees e,(
      SELECT department_id,AVG(salary) avg_sal
      FROM employees
      GROUP BY department_id
      ORDER BY avg_sal DESC
      LIMIT 0,1
      )t_avg_sal
      WHERE
      e.department_id = t_avg_sal.department_id)

      #15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号
      -- 这里注意,题目说的是部门中的部门号,不是员工表中的部门号,所以也要进行子查询
      SELECT
      department_id
      FROM
      departments
      WHERE
      department_id NOT IN (
      SELECT DISTINCT
      department_id
      FROM
      employees
      WHERE
      job_id = 'ST_CLERK'
      )


      #16. 选择所有没有管理者的员工的last_name
      SELECT
      last_name
      FROM
      employees
      WHERE
      manager_id IS NULL


      #17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'
      SELECT
      employee_id,
      last_name,
      hire_date,
      salary
      FROM
      employees
      WHERE
      manager_id = (SELECT employee_id FROM employees WHERE last_name = 'De Haan')


      #18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
      -- 1.分析题,找出定语"各部门中工资比本部门平均工资高的员工 "
      -- 2.写出定语的查询语句SELECT AVG( salary ) FROM employees e2 WHERE e2.department_id = e1.department_id GROUP BY department_id
      -- 3.设置限制条件进行匹配
      SELECT
      e1.employee_id,
      e1.last_name,
      e1.salary
      FROM
      employees e1
      WHERE
      salary > ( SELECT AVG( salary ) FROM employees e2 WHERE e2.department_id = e1.department_id GROUP BY department_id );

      #19.查询每个部门下的部门人数大于 5 的部门名称
      -- 1.分析题,找出定语"查询每个部门下的部门人数大于 5 "
      -- 2.写出定语的查询语句5 < (SELECT COUNT(*) FROM employees e2 WHERE e2.department_id = e1.department_id )
      -- 3.设置限制条件进行匹配
      SELECT DISTINCT
      department_name
      FROM
      employees e1
      WHERE
      5 < (SELECT COUNT(*) FROM employees e2 WHERE e2.department_id = e1.department_id )

      #20.查询每个国家下的部门个数大于 2 的国家编号
      -- 1.分析题,找出定语"查询每个国家下的部门个数大于2"
      -- 2.写出定语的查询语句2 < (SELECT COUNT(*) FROM departments d WHERE l.location_id=d.location_id)
      -- 3.设置限制条件进行匹配
      SELECT
      country_id
      FROM
      locations l
      WHERE
      2 < (
      SELECT COUNT(*)
      FROM departments d
      WHERE l.location_id = d.location_id
      )
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/xiaocaicoding/6007876,作者:小蔡coding,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:每日一练

      下一篇:shell 字符串定长,空格填充

      相关文章

      2025-05-19 09:05:01

      Navicat 连接MySQL 8.0.11 出现2059错误 解决

      Navicat 连接MySQL 8.0.11 出现2059错误 解决

      2025-05-19 09:05:01
      MySQL , Navicat , 解决 , 连接
      2025-05-19 09:04:38

      mysql只有在任务处于完成状态才能运行

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38
      MySQL , 任务 , 数据库 , 查询 , 状态
      2025-05-16 09:15:24

      MySQL 表的内外连接

      MySQL 表的内外连接

      2025-05-16 09:15:24
      MySQL , 显示 , 连接
      2025-05-14 10:03:13

      MySQL 索引优化以及慢查询优化

      MySQL 是一种广泛使用的关系型数据库管理系统,因其性能优异和使用便捷而备受欢迎。然而,随着数据量的增长和查询复杂度的增加,性能瓶颈也变得越来越明显。

      2025-05-14 10:03:13
      MySQL , 优化 , 使用 , 性能 , 数据库 , 查询 , 索引
      2025-05-14 09:51:21

      mysql数据库中decimal数据类型比较大小

      在MySQL中,DECIMAL数据类型用于存储精确的数值,它非常适合用于需要高精度计算的场景,如金融应用。当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时,可以使用标准的比较运算符,如>, <, >=, <=, = 和 <>(或!=)。

      2025-05-14 09:51:21
      MySQL , SQL , 数据类型 , 查询 , 比较 , 示例
      2025-05-14 09:51:15

      mysql 语句如何优化

      MySQL语句的优化是一个复杂但重要的过程,因为它可以显著提高数据库的性能。

      2025-05-14 09:51:15
      JOIN , MySQL , 优化 , 使用 , 排序 , 查询 , 索引
      2025-05-13 09:53:13

      mysql 存储函数及调用

      在MySQL中,存储函数(Stored Function)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单和高效。

      2025-05-13 09:53:13
      MySQL , 函数 , 存储 , 示例 , 触发器 , 语句 , 调用
      2025-05-13 09:49:12

      JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

      JDBC(Java Database Connectivity)事务是指一系列作为单个逻辑工作单元执行的数据库操作,这些操作要么全部成功——>提交,要么全部失败——>回滚,从而确保数据的一致性和完整性。

      2025-05-13 09:49:12
      MySQL , 事务 , 执行 , 提交 , 操作 , 数据库
      2025-05-08 09:04:49

      MySQL-备份+日志:介质故障与数据库恢复

      MySQL-备份+日志:介质故障与数据库恢复

      2025-05-08 09:04:49
      mysql , MySQL , 备份 , 恢复 , 数据库 , 文件 , 日志
      2025-05-06 09:19:51

      MySQL 数据库备份与恢复详解

      数据库备份是防止数据丢失的有效手段。无论是由于硬件故障、软件问题还是人为错误,定期备份都能有效保护数据。适当的备份策略可以在数据损失时快速恢复系统,减少业务损失。

      2025-05-06 09:19:51
      bash , MySQL , 备份 , 恢复 , 数据库
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5231803

      查看更多

      最新文章

      Navicat 连接MySQL 8.0.11 出现2059错误 解决

      2025-05-19 09:05:01

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38

      MySQL 表的内外连接

      2025-05-16 09:15:24

      MySQL 索引优化以及慢查询优化

      2025-05-14 10:03:13

      mysql数据库中decimal数据类型比较大小

      2025-05-14 09:51:21

      mysql 语句如何优化

      2025-05-14 09:51:15

      查看更多

      热门文章

      Confluence 6 MySQL 输入你的数据库细节

      2023-04-27 08:03:27

      MySQL timestamp(3)问题

      2023-04-27 08:00:12

      MySQL安全小技巧

      2023-05-06 10:22:49

      MySQL数据库的安装(安装以及简单数据库操作)

      2023-05-06 10:22:26

      MySQL的数据库database(二)

      2023-04-23 09:35:19

      MySQL的子查询(二十)

      2022-12-27 10:00:39

      查看更多

      热门标签

      数据库 mysql 字符串 数据结构 MySQL 算法 redis oracle java sql python 数据 索引 SQL 查询
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

      MySQL用户管理与权限管理

      【设备监测数据分析处理算法】

      #yyds干货盘点# MySQL 一些常见问题

      eclipsel连接MySQL

      MySQL索引之空间索引(SPATIAL)

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号