数据库中的子查询操作
子查询就是在一个查询里面,继续嵌套其他的查询,并且可能会同时嵌套多个子查询
子查询大概使用的地方
WHERE子句:子查询一般会返回单行单列、单行多列、多行单列的数据
HAVING子句:子查询会返回单行单列,同时表示要使用统计函数
FROM子句:子查询返回多行多列数据(表结构)
SELECT子句:一般不在这使用,返回单行单列
在WHERE子句中使用子查询。
WHERE子句的作用是进行数据行的筛选操作的
范例:查询出低于工资平均工资的雇员信息
应该先统计出公司的平均工资SELECT AVG(sal) FROM emp;得到这个数值后才能进行计算是否低于平均水平。所以应当使用子查询
例如:
SELECT *
FROM emp
WHERE sal<(SELECT AVG(sal) FROM emp);
此时就是正确的结果,以上的查询返回单行单列,可以作为WHERE子句使用的过滤条件使用
范例:查询出公司最早雇佣的雇员信息
首先得使用MIN()函数找到最早的雇用日期: SELECT MIN(hiredate) FROM emp;返回的是单行单列数据,这个时候把他塞到WHERE子句里面去作为一个子查询:
SELECT *
FROM emp
WHERE hiredate=(SELECT MIN(hiredate) FROM emp);
此时出来的就是公司雇佣最早雇佣的雇员信息
范例:与SCOTT从事同一工作,并且工资相同的雇员信息
首先得知道SCOTT的工作和工资,他会返回一行两列
SELECT job,sal FROM emp WHERE ename=’SCOTT’; 这样就能得到SCOTT的信息
然后要得到与SCOTT在职位和工资上相同的雇员信息则:
SELECT *
FROM emp
WHERE(job,sal)=(SELECT job,sal FROM emp WHERE ename=’SCOTT’);
此时的确实现了这个条件的查询
如果说子查询返回的内容是多行单列的话,那么就表示一个操作的数据范围。所以说对于此类的判断在SQL语句之中提供有三个操作符 IN、ANY、ALL
1、IN操作:指的是与子查询返回的内容相同 比如:
SELECT * FROM emp
WHERE sal IN(SELECT sal FROM emp WHERE job=’MANAGER’);–查询所有的经理。通过所有的经理查询出所有经理的工资
此过程与简单查询语句中的IN操作完全相同,唯一的区别在于简单查询中IN的范围内容是自己设置的。而此时是通过子查询而来的。既然有IN操作,那就有NOT IN操作。
但是如果使用NOT IN,那么就有个问题出现了。子查询里面不能返回NULL,如果返回了空则最终不会有任何结果出现。
2、ANY操作:一共分为三种形式:
=ANY:功能与IN操作一样
SELECT * FROM emp
WHERE sal =ANY(SELECT sal FROM emp WHERE job=’MANAGER’);–查询所有的经理。通过所有的经理查询出所有经理的工资
>ANY:比子查询返回的最小值要大
SELECT * FROM emp
WHERE sal >ANY(SELECT sal FROM emp WHERE job=’MANAGER’);–查询所有的经理。通过所有的经理查询出所有的大于拿最少钱经理的人,此结果不包含那个拿最少钱的经理
<ANY:同上,比返回的最大值要小
3、ALL操作:一共分为两种形式
>ALL:比子查询返回的最大值还要大
<ALL:比子查询返回的最小值还要小
在实际的开发之中,在WHERE子句中出现子查询的几率是很高的。