子查詢就是指的在一個完整的查詢語句之中,嵌套若干個不一樣功能的小查詢,從而一塊兒完成複雜查詢的一種編寫形式,爲了讓讀者更加清楚子查詢的概念。
子查詢返回結果
子查詢能夠返回的數據類型一共分爲四種:
- 單行單列:返回的是一個具體列的內容,能夠理解爲一個單值數據;
- 單行多列:返回一行數據中多個列的內容;
- 多行單列:返回多行記錄之中同一列的內容,至關於給出了一個操做範圍;
- 多行多列:查詢返回的結果是一張臨時表;
在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);
--有數據,但取返,沒有內容輸出