首页 > 经验记录 > 数据库 > 数据库中的子查询操作

数据库中的子查询操作

子查询就是在一个查询里面,继续嵌套其他的查询,并且可能会同时嵌套多个子查询

子查询大概使用的地方

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子句中出现子查询的几率是很高的。

 

 

 


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00