MySQL数据库:第九章:子查询

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL数据库:第九章:子查询

回退至Mysql数据库理论与实战

#子查询

概念:出现在其他语句内部的select语句,称为子查询或内查询

其他语法:可以是select语句,也可以是create、insert、update等。只是select语句出现的较多

外面如果是select语句,称为主查询或外查询

位置:

子查询可以放在select语句中的select后面、from后面、where或having后面、exists后面

分类:(放在where或having后面)

单行子查询:子查询的结果只有一行

多行子查询:子查询的结果可以有多行

特点:

①子查询一般需要使用小括号括起来,为了提高阅读性

②子查询一般放在条件的右侧

③子查询优先于主查询执行,主查询使用到了子查询的结果

④单行子查询一般搭配单行操作符使用

单行操作符:> < = <> >= <=

多行子查询一般搭配多行操作符使用

多行操作符:in/not in、any、all


#一、单行子查询


注意:

单行子查询的结果肯定是一行一列,不能是多行,也不能是空值


#案例1:谁的工资比 Abel 高?
#①查询Abel的工资
SELECT salary 
FROM employees
WHERE last_name = 'Abel'
#②查询哪个员工的工资>①
SELECT last_name,salary
FROM employees
WHERE salary>(
  SELECT salary 
  FROM employees
  WHERE last_name = 'Abel'
);
#案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资
#①查询141号员工的job_id
SELECT job_id
FROM employees
WHERE employee_id = 141
#②查询143号员工的salary
SELECT salary
FROM employees
WHERE employee_id = 143
#③查询job_id = ① 并且salary>②的员工姓名,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
);
#案例3:返回公司工资最少的员工的last_name,job_id和salary
#①查询最低工资
SELECT MIN(salary)
FROM employees
#②查询last_name,job_id,salary,要求salary= ①
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
  SELECT MIN(salary)
  FROM employees
);
SELECT * FROM employees;
#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
#①查询50号部门的最低工资
SELECT MIN(salary) 
FROM employees
WHERE department_id = 50
#②查询每个部门的最低工资,筛选条件:哪个部门最低工资>①
SELECT MIN(salary) 最低工资,department_id
FROM employees
GROUP BY department_id
HAVING 最低工资>(
  SELECT MIN(salary) 
  FROM employees
  WHERE department_id = 50
);

#二、多行子查询


in/not in:判断某个字段是否属于子查询结果的某个值

any/some:一般搭配条件运算符使用 【用的较少】

where sal>any(1,2,3,4) 0.5

all: 一般搭配条件运算符使用 【用的较少】

where sal > all(1,2,3,4) 4.5


#题目:返回location_id是1400或1700的部门中的所有员工姓名
#①查询location_id是1400或1700的部门
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
#②查询员工姓名,要求:department_id 属于①列表
SELECT last_name
FROM employees
WHERE department_id IN(
  SELECT DISTINCT department_id
  FROM departments
  WHERE location_id IN (1400,1700)
);
#题目:返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
#①查询job_id为‘IT_PROG’部门的工资
SELECT DISTINCT salary 
FROM employees
WHERE job_id = 'IT_PROG'
#②查询其它部门中salary<any(①)
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ANY(
  SELECT DISTINCT salary 
  FROM employees
  WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工 的员工号、姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ALL(
  SELECT DISTINCT salary 
  FROM employees
  WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#等价于
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<(
  SELECT MIN(salary)
  FROM employees
  WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#1. 查询和 Zlotkey 相同部门的员工姓名和工资
#①查询Zlotkey的部门
SELECT  department_id
FROM employees
WHERE last_name = 'Zlotkey'
#②查询姓名和工资,要求部门号 = ①
SELECT last_name,salary
FROM employees
WHERE department_id = (
  SELECT  department_id
  FROM employees
  WHERE last_name = 'Zlotkey'
);
#2. 查询工资比公司平均工资高的员工的员工号,姓名和工资。
#①公司平均工资
SELECT AVG(salary)
FROM employees
#②查询salary>①的员工号,姓名和工资。
SELECT employee_id,last_name,salary
FROM employees
WHERE salary>(
  SELECT AVG(salary)
  FROM employees
);
#3. 查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
#①查询各部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
#②将①结果集和employees表进行连接查询,关联条件为老个表的department_id一致
SELECT employee_id,last_name,salary,e.department_id
FROM employees e
JOIN (
  SELECT AVG(salary) ag,department_id
  FROM employees
  GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE e.salary > ag_dep.ag;
#6. 查询管理者是 King 的员工姓名和工资
#①查询king的员工号
SELECT employee_id
FROM employees
WHERE last_name = 'k_ing'
#②查询哪个员工的领导号是①
SELECT last_name,salary
FROM employees
WHERE manager_id IN(
  SELECT employee_id
  FROM employees
  WHERE last_name = 'k_ing'
);
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
|
5月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用子查询
【8月更文挑战第12天】
264 0
在 MySQL 中使用子查询
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询练习——EXISTS(存在)
MySQL数据库子查询练习——EXISTS(存在)
87 1
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询——in多个数据查询的示例
MySQL数据库子查询——in多个数据查询的示例
43 1
|
7月前
|
关系型数据库 分布式数据库 数据库
数据库内核那些事|PolarDB IMCI让你和复杂低效的子查询说拜拜
PolarDB IMCI(In-Memory Column Index)确实是数据库领域的一项重要技术,特别是当它面对复杂和低效的子查询时,表现尤为出色。以下是关于PolarDB IMCI如何助力解决
|
4月前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
|
5月前
|
SQL 数据库 数据安全/隐私保护
什么是数据库子查询?
【8月更文挑战第2天】
197 14
什么是数据库子查询?
|
6月前
|
存储 缓存 监控
如何优化数据库子查询?
【7月更文挑战第22天】如何优化数据库子查询?
116 15
|
5月前
|
SQL 数据处理 数据库
SQL进阶之路:深入解析数据更新与删除技巧——掌握批量操作、条件筛选、子查询和事务处理,提升数据库维护效率与准确性
【8月更文挑战第31天】在数据库管理和应用开发中,数据的更新和删除至关重要,直接影响数据准确性、一致性和性能。本文通过具体案例,深入解析SQL中的高级更新(UPDATE)和删除(DELETE)技巧,包括批量更新、基于条件的删除以及使用子查询和事务处理复杂场景等,帮助读者提升数据处理能力。掌握这些技巧能够有效提高数据库性能并确保数据一致性。
104 0
|
6月前
|
关系型数据库 MySQL 数据库
MySQL—子查询
MySQL—子查询