使用子查询

简介: 一、语法 SELECT SELECT_LIST FROM TABLE WHERE EXPR OPERATOR (SELECT SELECT_LIST FROM TABLE);子查询(内查询)在主查询(外查询)之前执行。

一、语法

SELECT SELECT_LIST
  FROM TABLE
 WHERE EXPR OPERATOR (SELECT SELECT_LIST FROM TABLE);
子查询(内查询)在主查询(外查询)之前执行。
主查询使用子查询结果。

二、单行子查询

WHERE子句中使用单行子查询时,可以使用单行比较运算符(=,>,>=,<,<=,<>),将子查询的返回结果当做单一数值来使用。
需要小心的是子查询返回的结果的不确定,即返回空值或多值。具体分为三种情况:
1、返回单行:即为单行子查询。
2、未返回任何行:如果子查询未返回任何行(相当于返回NULL),则主查询将不再执行,所以主查询也不会返回任何结果。
3、返回多行:是多行子查询,此时不允许使用单行比较运算符,否则出错。

三、多行子查询

在WHERE子句中使用多行子查询时,可以使用多行比较运算符(IN,ALL,ANY),将子查询的返回结果当做数值集合来使用。其中,ALL和ANY运算符必须与单行比较运算符(=,>,>=,<,<=,<>)结合使用。例如WHERE sal>ALL(子查询)。

1、IN:等于任何一个
2、ALL:和子查询返回的所有值比较。例如:sal>ALL(1,2,3)等价于sal>3,即大于所有。
3、ANY:和子查询返回的任意一个值比较。例如:sal>ANY(1,2,3)等价于sal>1,即大于任意一个就可以。
4、EXISTS:判断子查询是否有返回结果(不关心具体行数和内容),如果返回则为TRUE,否则为FALSE。(常用于相关子查询)

四、例子

--单行子查询
--1.如何查得所有比“CLARK”工资高的员工的信息
--普通查询
SELECT ENAME, SAL FROM EMP WHERE ENAME = 'CLARK';
SELECT * FROM EMP WHERE SAL > 2450;

--子查询
SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'CLARK');
--2.查询工资高于平均工资的雇员名字和工资
SELECT ENAME, SAL FROM EMP WHERE SAL > (SELECT AVG(SAL) FROM EMP);

--多行子查询
--any:查询工资低于任何一个“CLERK”的工资的雇员信息。
select *
from emp
where sal < any(
      select sal from emp where job='CLERK'
);


--all:查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。
select empno, ename, sal
from emp
where sal>all(
      select sal
      from emp
      where job='SALESMAN'
)
 
--in:查询部门20中职务同部门10的雇员一样的雇员信息。
select * 
from emp
where job in(
      select job 
      from emp
      where deptno=10
) and deptno=20;  
目录
相关文章
|
3月前
(头哥)多表查询与子查询
(头哥)多表查询与子查询
49 0
|
3月前
|
SQL
深入了解关联查询和子查询
深入了解关联查询和子查询
26 0
|
4月前
聚合函数、子查询
聚合函数、子查询
|
6月前
|
SQL 关系型数据库 MySQL
第9章_子查询
第9章_子查询
46 0
|
11月前
|
SQL 索引
相关子查询
相关子查询
173 0
|
11月前
|
SQL 关系型数据库 MySQL
第09章_子查询
第09章_子查询
71 0
|
11月前
|
SQL
联合查询和子查询
联合查询和子查询
|
数据库 Python
子查询
子查询
130 0
|
数据库管理
子查询(2)
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
子查询(2)
|
SQL 关系型数据库 MySQL
子查询(1)
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
子查询(1)