子查询,所谓子查询就是查询中的查询。比如可以在一个SQL语句的where子句中写子查询,以获得所需要且之前未知的条件值。
1.子查询引入
例如:查询工资比编号为7369的员工工资高且编号为30的员工信息;
select * from emp where sal>(select sal from emp where empno=7369) and deptno = 30;
结果:
子查询是一个SQL语句,是嵌在另一个select语句中的子句。使用子查询可以用简单的语句构建功能强大的语句,当需要从表中获取依赖于表本身的数据选择行时,子查询是非常有用的。
子查询可以放在WHERE子句中,同时也可以放在from子句以及之后要介绍的UPDATE语句、INSERT语句、CREATE VIEW语句、CREATE TABLE语句,HAVING 子句、INTO 子句和UPDATE语句的SET子句中。
2.单行子查询
从子查询中返回一行结果的查询,称为单行子查询;对应的,如果返回多行的结果,就是多行子查询。另外还有多列子查询,即从查询语句中返回多列的查询。
单行子查询是从子查询返回一行的查询,对单行子查询的结果可以使用单行比较操作符。
例如:
select * from emp where sal>(select sal from emp where empno=7369);
结果:
例如:
select * from emp where sal>(select sal from emp where empno=7369) and deptno=30;
结果:
3.多行子查询
子查询返回多行被称为多行子查询,对多行子查询要使用多行运算符而不是单行运算符,例如IN、ANY和ALL三个多行运算符。
- IN运算符
例如:查询编号为20工资与编号为30相同的员工信息
select * from emp where deptno=20 and sal in(select sal from emp where deptno = 30);
结果:
- ANY运算符(同SOME运算符)和ALL运算符
ANY运算符用于比较一个值和子查询返回的任一个值,而ALL运算符用于比较一个值与子查询返回的每个值。
<ANY子查询:小于子查询的最大值。
>ANY子查询:大于子查询的最小值。
=ANY子查询:等同于IN子查询结果。
<ALL子查询:小于子查询的最小值。
>ALL子查询:大于子查询的最大值。
例如:查询编号为30的小于编号为20的最低工资的员工的员工信息:
select * from emp where deptno =30 and sal < all(select sal from emp where deptno=20);
结果: