子查询
子查询就是指一个查询语句嵌套在另一个查询语句内部的查询
- 子查询从MySQL4.1开始引入
- SQL中的子查询的使用大大增强了SELECT查询的能力,因为很多的时候查询需要从结果集中先获取数据,或者从一个表中先计算得出一个数据结果,然后通过第一次查询的结果在作为判断条件进行第二次查询,我们有了子查询之后对于这种情况我们在一个SELECT语句中就可以完成
我们通过下面的一个例题来理解子查询
问题: 查询员工表中比Abel工资高的人的姓名
- 对于这个问题我们有三种解决方式
方式一: 使用两次SELECT语句
SELECT salary
FROM employees
WHERE last_name = 'abel';
- 这个时候我们就要先查询出员工表中名为abel的的员工的工资,这个时候查询出的abel的工资假如为11000
SELECT last_name,salry
FROM employees
WHERE salary >11000;
- 然后这里我们就是查询员工表中工资比abel工资(11000)高的人的姓名(last_name)
总结: 这种使用两次单独的SELECT语句查询的效率太低了,因为这个时候我们的数据库管理系统和数据库要进行两次交互,效率就会很差
方式二: 自连接的方式(多表查询的方式之一)
SELECT last_name,salry
FROM employees
WHERE salary >11000;
- 这里我们就是通过第一次查询出来的abel的员工的工资(11000)作为这一次查询的比较条件,然后就可以计算出工资比abel工资高的人的姓名
总结:这种使用两次select语句进行查询的效率是很低的,因为这个时候我们使用两个SELECT语句那么数据库管理系统和数据库进行了两次交互,所以效率比较低
方式二: 自连接的方式(多表查询方式之一)
SELECT e2.last_name,e2.salary
FROM employyees e1,employeese2
WHERE e2.salary>e1.salary
AND e1.last_name = 'abel';
- 这个时候时候就是进行了自连接,这个时候有两张一样的表e1,和e2,这个时候我们的多表连接条件是e2的记录会匹配e1表中比该记录工资低的记录,然后后面我们还进行了条件筛选,也就是筛选出了e1表中姓名为abel的记录,那么这个时候查询的结果就是e2表中所有比e1表中的abel工资高的员工的姓名和工资
总结:这种自连接的方式只用了一次SELECT语句,那么查询效率也是比较高的,那么为什么还要提出子查询? — 因为不是所的可以用子查询解决的问题都可以使用自连接的方式来解决,这里只是刚刚好这个问题既可以使用子查询的方式解决,又可以使用自连接的方式解决
方式三: 子查询的方式
SELECT last_name,salary
FROM employees
WHERE salary > (SELECT salary
FROM employees
WHERE last_name = 'abel');
- 这个时候就是使用了子查询的方式进行了查询,这个时候在SELECT语句的内部又使用了一个SELECT语句,将这种查询中嵌套的查询就称之为子查询
称谓的规范: 外查询(主查询) , 内查询(子查询)
注意:
- 子查询(内查询)在主查询(外查询)之前执行完成
- 也就是先执行子查询,然后执行主查询
- 子查询的结果被主查询(外查询)使用
- 子查询要包含在一对小括号内
- 如果我们将子查询放在比较条件中,那么我们一般都是放在比较条件的右侧(可以提高代码的美观性)
- 单行操作对应单行子查询,多行操作符对应多行子查询
子查询的分类:
- 这里我们通过两个角度进行分类
角度一: 从内查询返回的结果的条目数
单行子函数 vs 多行子查询
角度二 内查询是否是否被执行多次
相关子查询 vs 不相子查询
- 如果内查询被执行多次,我们就称之为相关子查询,那么为什么执行多次内查询就是相关了?
- 其实这个时候我们研究之后可以发现,只有内查询和外查询有关的时候内查询才会执行多次