子查询就是指的在一个完整的查询语句之中,嵌套若干个不一样功能的小查询,从而一块儿完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念。
子查询返回结果
子查询能够返回的数据类型一共分为四种:
- 单行单列:返回的是一个具体列的内容,能够理解为一个单值数据;
- 单行多列:返回一行数据中多个列的内容;
- 多行单列:返回多行记录之中同一列的内容,至关于给出了一个操做范围;
- 多行多列:查询返回的结果是一张临时表;
在WHERE子句中使用子查询
在WHERE子句之中处理单行单列子查询、多行单列子查询、单行多列子查询。
单行单列子查询
示例1、查询公司之中工资最低的雇员的完整信息
--查询公司之中工资最低的雇员的完整信息
SELECT
*
FROM emp e
WHERE e.sal
=(
SELECT
MIN(sal)
FROM emp);
示例2、查询出基本工资比ALLEN低的所有雇员信息
-- 查询出基本工资比ALLEN低的所有雇员信息
SELECT
*
FROM emp e
WHERE e.sal
<(
SELECT sal
FROM emp
WHERE ename
=
'ALLEN' );
示例3、查询基本工资高于公司平均薪金的所有雇员信息
--查询基本工资高于公司平均薪金的所有雇员信息
SELECT
*
FROM emp e
WHERE e.sal
>(
SELECT
AVG(sal)
FROM emp);
单行多列子查询。
示例4、查找出与ALLEN从事同一工做,而且基本工资高于雇员编号为7521的所有雇员信息,
--查找出与ALLEN从事同一工做,而且基本工资高于雇员编号为7521的所有雇员信息,
SELECT
*
FROM emp e
WHERE e.job
=(
SELECT job
FROM emp
WHERE ename
=
'ALLEN')
AND e.sal
>(
SELECT sal
FROM emp
WHERE empno
=
7521);
示例5、查询与SCOTT从事同一工做且工资相同的雇员信息
SELECT
*
FROM emp e
WHERE (e.job,e.sal)
= (
SELECT job,sal
FROM emp
WHERE ename
=
'SCOTT')
AND ename
<>
'SCOTT';
示例6、查询与雇员7566从事同一工做且领导相同的所有雇员信息
--查询与雇员7566从事同一工做且领导相同的所有雇员信息
SELECT
*
FROM emp e
WHERE (e.job,e.mgr)
=(
SELECT job,mgr
FROM emp
WHERE empno
=
7566 );
示例7、查询与ALLEN从事同一工做且在同一年雇佣的所有雇员信息(包括ALLEN)
--查询与ALLEN从事同一工做且在同一年雇佣的所有雇员信息(包括ALLEN)
SELECT
*
FROM emp e
WHERE (e.job,to_char(e.hiredate,
'yyyy'))
=(
SELECT job,to_char(hiredate,
'YYYY')
FROM emp
WHERE ename
=
'ALLEN' );
多行单列子查询
主要使用三种操做符:IN、ANY、ALL
IN操做
示例8、查询出与每一个部门中最低工资相同的所有雇员信息
--查询出与每一个部门中最低工资相同的所有雇员信息
SELECT
*
FROM emp e
WHERE e.sal
IN(
SELECT
MIN(sal)
FROM emp
GROUP
BY deptno );
示例9、查询出不与每一个部门中最低工资相同的所有雇员信息
--查询出不与每一个部门中最低工资相同的所有雇员信息
SELECT
*
FROM emp e
WHERE e.sal
NOT
IN(
SELECT
MIN(sal)
FROM emp
GROUP
BY deptno );
ANY在使用中有以下三种使用形式:
=ANY:表示与子查询中的每一个元素进行比较,功能与IN相似(然而<>ANY不等价于NOT IN)
>ANY:比子查询中返回结果的最小的要大(还包含了>=ANY)
<ANY:比子查询中返回结果的最大的要小(还包含了<=ANY)
示例10、查询出每一个部门经理的工资
--查询出每一个部门经理的工资
SELECT
*
FROM emp
WHERE sal
=
ANY (
SELECT
MIN (sal)
FROM emp
WHERE job
=
'MANAGER'
GROUP
BY deptno );
示例11、查询出每一个部门大于经理的工资
--查询出每一个部门大于经理的工资
SELECT
*
FROM emp
WHERE sal
>
ANY (
SELECT
MIN (sal)
FROM emp
WHERE job
=
'MANAGER'
GROUP
BY deptno );
示例12、查询出每一个部门小于经理的工资
--查询出每一个部门小于经理的工资
SELECT
*
FROM emp
WHERE sal
<
ANY (
SELECT
MIN (sal)
FROM emp
WHERE job
=
'MANAGER'
GROUP
BY deptno );
ALL操做符有如下三种用法:
<>ALL:等价于NOT IN(可是=ALL并不等价于IN)
>ALL:比子查询中最大的值还要大(还包含了>=ALL)
<ALL:比子查询中最小的值还要小(还包含了<=ALL)
示例十3、查询出每一个部门不等于经理的工资
--查询出每一个部门不等于经理的工资
SELECT
*
FROM emp
WHERE sal
<>
ALL (
SELECT
MIN (sal)
FROM emp
WHERE job
=
'MANAGER'
GROUP
BY deptno );
示例十4、
SELECT
*
FROM emp
WHERE sal
<
ALL (
SELECT
MIN (sal)
FROM emp
WHERE job
=
'MANAGER'
GROUP
BY deptno );
示例十5、
SELECT
*
FROM emp
WHERE sal
>ALL (
SELECT
MIN (sal)
FROM emp
WHERE job
=
'MANAGER'
GROUP
BY deptno );
空数据判断
在SQL之中提供了一个exists结构用于判断子查询是否有数据返回。若是子查询中有数据返回,则exists结构返回true,反之返回false。
示例十5、验证exists结构
--验证exists结构
SELECT
*
FROM emp
WHERE
EXISTS(
--返回空值,没有内容输出
SELECT
*
FROM emp
WHERE empno
=
9999);
--没有这个编号的员工
示例十6、
SELECT
*
FROM emp
WHERE
EXISTS(
SELECT
*
FROM emp);
--有内容将返回数据
示例十7、
SELECT
*
FROM emp
WHERE
NOT
EXISTS(
SELECT
*
FROM emp);
--有数据,但取返,没有内容输出