程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 子查詢一(WHERE中的子查詢),子查詢where中

子查詢一(WHERE中的子查詢),子查詢where中

編輯:Oracle教程

子查詢一(WHERE中的子查詢),子查詢where中


子查詢

子查詢就是指的在一個完整的查詢語句之中,嵌套若干個不同功能的小查詢,從而一起完成復雜查詢的一種編寫形式,為了讓讀者更加清楚子查詢的概念。

子查詢返回結果
子查詢可以返回的數據類型一共分為四種:

WHERE子句中使用子查詢

在WHERE子句之中處理單行單列子查詢、多行單列子查詢、單行多列子查詢。

單行單列子查詢

 示例一、查詢公司之中工資最低的雇員的完整信息
--查詢公司之中工資最低的雇員的完整信息
SELECT * 
FROM emp e
WHERE e.sal=(
  SELECT MIN(sal) 
  FROM emp);

示例二、查詢出基本工資比ALLEN低的全部雇員信息

-- 查詢出基本工資比ALLEN低的全部雇員信息
SELECT * 
FROM emp e
WHERE e.sal<(
 SELECT sal 
 FROM emp 
 WHERE ename='ALLEN'
);

示例三、查詢基本工資高於公司平均薪金的全部雇員信息

 
--查詢基本工資高於公司平均薪金的全部雇員信息
SELECT *
FROM emp e
WHERE e.sal>(
SELECT AVG(sal)
FROM emp);

單行多列子查詢。

示例四、查找出與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);

示例五、查詢與SCOTT從事同一工作且工資相同的雇員信息

SELECT *
FROM emp e
WHERE (e.job,e.sal) = (
  SELECT job,sal
  FROM emp 
  WHERE ename='SCOTT')
  AND ename<>'SCOTT';

示例六、查詢與雇員7566從事同一工作且領導相同的全部雇員信息

  --查詢與雇員7566從事同一工作且領導相同的全部雇員信息
SELECT *
FROM emp e
WHERE (e.job,e.mgr) =(
        SELECT job,mgr
        FROM emp
      WHERE empno=7566
);

示例七、查詢與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操作

示例八、查詢出與每個部門中最低工資相同的全部雇員信息

--查詢出與每個部門中最低工資相同的全部雇員信息
SELECT *
FROM emp e
WHERE e.sal IN(
     SELECT MIN(sal)
    FROM emp
    GROUP BY deptno
);

示例九、查詢出不與每個部門中最低工資相同的全部雇員信息

--查詢出不與每個部門中最低工資相同的全部雇員信息
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)

示例十、查詢出每個部門經理的工資

--查詢出每個部門經理的工資

SELECT  * 
FROM emp 
WHERE sal = ANY (
   SELECT MIN (sal)
  FROM emp
  WHERE job='MANAGER'
  GROUP BY deptno
);

示例十一、查詢出每個部門大於經理的工資

--查詢出每個部門大於經理的工資
SELECT  * 
FROM emp 
WHERE sal > ANY (
   SELECT MIN (sal)
  FROM emp
  WHERE job='MANAGER'
  GROUP BY deptno
);

示例十二、查詢出每個部門小於經理的工資

--查詢出每個部門小於經理的工資
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)

示例十三、查詢出每個部門不等於經理的工資

--查詢出每個部門不等於經理的工資
SELECT  * 
FROM emp 
WHERE sal <> ALL (
   SELECT MIN (sal)
  FROM emp
  WHERE job='MANAGER'
  GROUP BY deptno
);

示例十四、

SELECT  * 
FROM emp 
WHERE sal < ALL (
   SELECT MIN (sal)
  FROM emp
  WHERE job='MANAGER'
  GROUP BY deptno
);

示例十五、

SELECT  * 
FROM emp 
WHERE sal >ALL (
   SELECT MIN (sal)
  FROM emp
  WHERE job='MANAGER'
  GROUP BY deptno
);
空數據判斷 在SQL之中提供了一個exists結構用於判斷子查詢是否有數據返回。如果子查詢中有數據返回,則exists結構返回true,反之返回false。

示例十五、驗證exists結構

 
--驗證exists結構
SELECT * FROM emp
    WHERE EXISTS(   --返回空值,沒有內容輸出
      SELECT * FROM emp WHERE empno=9999); --沒有這個編號的員工

示例十六、

 SELECT * FROM emp
 WHERE EXISTS(SELECT * FROM emp);--有內容將返回數據

示例十七、

  SELECT * FROM emp
 WHERE NOT EXISTS(SELECT * FROM emp);--有數據,但取返,沒有內容輸出

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved