查询测试表结构内容如下:
员工表(部分),employees:
MySQL子查询概述
子查询
含义:出现在其他语句中的select语句,称为子查询或者是内查询。
外部的查询语句,称为主查询或者是外查询。
分类:
按照查询出现的位置
select 后面:
仅仅支持标量子查询
from 后面:
支持表子查询
where或者是having后面:
支持标量子查询
支持列子查询
支持行子查询
exists后面(称为相关子查询):
支持表子查询
按照结果集的行列数不同:
标量子查询 (结果集只有一行一列)
列子查询 (结果集只有一列多行)
行子查询 (结果集只有一行多列)
表子查询 (结果集为多行多列)
where后面的标量子查询
一、where或者是having后面
1.标量子查询(单行子查询)
2.列子查询(多行子查询)
3.行子查询(多行多列)
特点:
①:子查询放在小括号以内
②:子查询一般放置在条件的右侧
③:标量子查询,一般搭配着当行操作符使用,常见的单行操作符有:> , < , >= , <= , = , <>
列子查询,一般搭配着多行操作符使用,常见的多行操作符有: in, any/some, all
④:子查询的执行都是优先于主查询执行的,主查询的条件用到了子查询的结果。
-----标量子查询,结果为一个一行一列的记录-----
使用测试1:查询比指定字段的相关记录,如:查询工资比Abel高的相关记录
①:先查询Abel的相关工资记录
②:查询员工的信息,并满足salary > ①的结果
使用测试2:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id 和工资
①查询141号员工的job_id
②查询143号员工的salary
③查询员工的姓名,job_id 和工资,要求job_id=①并且salary>②
-----非法使用标量子查询-----
情况1:查询的结果不是一个标量子查询,而是一个列子查询,这一个时候匹配当行操作符'>',‘<’等,这一个时候报错。如:
情况2:结果是一个空值情况。不能够达到我们的预期效果
where后面的列子查询(多行查询)
要实现多行子查询,就需要使用多行比较操作符,常见的多行操作符如下:
in / not in : 等于列表中的任意一个
any / some : 和子查询返回的某一个值比较
all : 和子查询返回的所有值比较
使用举例:
a = in (10,20,30); 只要a的值是10或20或30即视为满足条件。
a > any(10,20,30); 只要a的值大于10或者大于20或者大于30即视为满足条件。该条件可以使用min替换
a > all(10,20,30); 满足a的值大于10且大于20且大于30即视为满足条件。
使用测试1: 返回location_id是1400或1700的部门中的所有员工姓名
①查询location_id是1400或1700的部门编号
②查询员工姓名,要求部门号是①列表中的某一个
使用测试2:返回其它工种中比job_id为‘IT_PROG’工种任一工资低的员工的员工号、姓名、job_id 以及salary
①查询job_id为‘IT_PROG’部门任一工资
②查询员工号、姓名、job_id 以及salary,salary<(①)的任意一个 (使用any,的时候也可以使用其他来代替)
where后面的行子查询(一行/多行 多列查询)
使用测试:查询员工编号最小并且工资最高的员工信息
①查询最小的员工编号
②查询最高工资
③查询员工编号最小并且工资最高的员工信息
直接使用行子查询实现:直接可以进行括号里面的内容和值进行匹配,然后再进行查询