目录
- 前言
- 子查询分类
- 放在where或having后面
- 标量子查询(单行子查询)
- 列子查询(多行子查询)
- 行子查询(结果集一行多列或多行多列)
- 放在select后面
- 放在from后面
- 放在exists后面(相关子查询)
前言
介绍MySQL的子查询操作我们选择使用可视化软件Navicat,对应的数据库使用了某公司员工数据库,该数据库包含员工信息表、部门信息表、公司地址信息表、工作职业信息表、员工等级表。
各个表的字段即字段类型如下:
子查询分类
子查询
:我们出现在其他语句中的select语句,称为子查询或内查询;而在外部的查询语句称为主查询或外查询。
按结果集的列数不同
:
按子查询出现的位置
:
下面以子查询出现的位置进行详细的介绍。
放在where或having后面
标量子查询(单行子查询)
放在where之后
:
示例一:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和 工资(先求出141号员工的job_id,143号员工的salary,然后进行匹配)
示例二:返回公司工资最少的员工的last_name,job_id和salary(先求工资最少的员工工资)
放在having之后
:
示例三:查询最低工资大于50号部门最低工资的部门id与其最低工资(先求50部门的最低工资)
列子查询(多行子查询)
首先介绍一下列子查询的基本操作符:
操作符 | 含义 |
IN / NOT IN | 等于列表中的 |
ANY / SOME | 和子查询返回的 |
ALL | 和子查询返回的 |
示例一:返回location_id是1400或1700的部门中的所有员工姓名(先求出location_id是1400或1700的部门id,然后使用部门id去匹配符合的员工姓名)
示例二:返回其他工种中比job_id=”IT_PROG“工种任一工资低的员工的员工号、姓名、job_id和salary
行子查询(结果集一行多列或多行多列)
通常将要查询的多个行结果值放在一个括号中当作一个字段。
示例一:查询员工编号最小并且工资最高的员工信息
放在select后面
一般可以用连接查询来求解该类问题。
示例一:查询每个部门的员工个数
示例二:查询员工号为102的部门名
放在from后面
该种情况下将子查询结果充当一张表,要求必须起别名。
示例一:查询每个部门的平均工资的工资等级
放在exists后面(相关子查询)
exists 语法
:exists(完整的查询语句),返回结果为布尔值0或1。
示例一:查询没有员工的部门名