SQL - 子查詢解決查詢問題



1. 以下哪些是子查詢的型別?

  1. 有序子查詢
  2. 分組子查詢
  3. 單行子查詢
  4. 以上都不是

答案:C. 子查詢是巢狀在另一個查詢的 SELECT、FROM、HAVING 或 WHERE 子句中的完整查詢。子查詢必須用括號括起來,至少包含 SELECT 和 FROM 子句。單行子查詢和多行子查詢是子查詢的主要型別。

2. 關於子查詢,以下哪一項是正確的?

  1. 它們在主查詢執行後執行
  2. 它們與主查詢並行執行
  3. 使用者可以先執行主查詢,然後根據需要執行子查詢
  4. 它們在主查詢執行前執行。

答案:D. 子查詢總是在主查詢執行之前執行。子查詢先完成。子查詢的結果用作外部查詢的輸入。

3. 關於子查詢的結果,以下哪一項是正確的?

  1. 執行時通常會忽略子查詢的結果。
  2. 子查詢的結果不會產生結果,它只是有助於加快主查詢的執行速度
  3. 子查詢的結果被主查詢使用。
  4. 子查詢的結果始終為 NULL

答案:C. 子查詢先完成。子查詢的結果用作外部查詢的輸入。

4. 子查詢中必須使用以下哪個子句?

  1. SELECT
  2. WHERE
  3. ORDER BY
  4. GROUP BY

答案:A. 子查詢就像任何其他查詢一樣,必須以 SELECT 子句開頭。它們包含在外部查詢中。

5. 在主查詢中編寫子查詢的方法是什麼?

  1. 使用 JOIN
  2. 使用 WHERE 子句
  3. 使用 GROUP BY 子句
  4. 在另一個 SELECT 語句的子句中嵌入 SELECT 語句

答案:D. 子查詢是巢狀在另一個查詢的 SELECT、FROM、HAVING 或 WHERE 子句中的完整查詢。子查詢必須用括號括起來,至少包含 SELECT 和 FROM 子句。

6. 在給定的場景中,哪一個能恰當地證明使用子查詢的合理性?

  1. 當我們需要對值求和時
  2. 當我們需要將字元值轉換為日期或數值時
  3. 當我們需要從表中選擇行,而條件取決於相同表或不同表中的資料時。
  4. 以上都不是

答案:C.

7. 子查詢可以在以下哪個子句中使用?

  1. HAVING
  2. WHERE
  3. FROM
  4. 以上所有

答案:D. 子查詢與普通查詢沒有什麼不同。它可以使用 SELECT 語句的所有主要子句。

8. 以下哪些單行運算子可用於編寫子查詢?

  1. >=
  2. <
  3. =
  4. 以上所有

答案:D. 單行運算子包括 =、>、<、>=、<= 和 <>。

9. 以下哪些多行運算子可與子查詢一起使用?

  1. IN
  2. ANY
  3. ALL
  4. 以上所有

答案:D. 多行子查詢返回多於一行結果。可與多行子查詢一起使用的運算子包括 IN、ALL、ANY 和 EXISTS。

10. 關於從子查詢獲得的輸出,哪一項是正確的?

  1. 它保留在緩衝區快取中
  2. 它保留在子查詢中,以後需要時可以使用
  3. 它用於完成外部(主)查詢
  4. A 和 C

答案:C. 子查詢先完成。子查詢的結果用作外部查詢的輸入。

11. 您需要查詢所有薪水高於“ABC”公司副總裁的員工的薪水。以下哪個查詢將為您提供所需的結果?(考慮給定的表結構)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
  1.  SELECT first_name, last_name, salary
    FROM employees 
    WHERE salary > (SELECT salary
    FROM employees 
    WHERE job_id = 'VICE-PRESIDENT'); 
  2. SELECT first_name, last_name, salary
    FROM employees 
    WHERE salary = (SELECT salary
    FROM employees 
    WHERE job_id = 'VICE-PRESIDENT'); 
  3. SELECT first_name, last_name, salary
    FROM employees 
    WHERE job_id = 'VICE-PRESIDENT'); 
  4. 以上都不是

答案:A. 在選項“A”中,內部子查詢將副總裁的薪水作為結果提供給外部查詢。

12. 關於子查詢,以下哪一項是正確的?

  1. 子查詢可以寫在比較運算子的兩側
  2. 子查詢不需要括號
  3. 單行子查詢可以使用多行運算子,反之則不行
  4. 以上所有

答案:A. 子查詢可以根據查詢縮排和可用性放置在比較運算子的左側或右側。

13. 以下查詢的結果是什麼?(考慮給定的表結構)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT first_name, last_name, salary
FROM employees
WHERE salary ANY (SELECT salary FROM employees); 
  1. 它成功執行並給出所需的結果
  2. 它成功執行,但沒有給出所需的結果
  3. 它丟擲 ORA 錯誤
  4. 它成功執行併為結果集中的每一行給出兩個值

答案:C. 多行運算子不能用於單行子查詢,反之亦然。

14. 關於單行子查詢,以下哪一項是正確的?

  1. 它們從主查詢中給出一個結果
  2. 它們在結果集中只給出一行
  3. 它們只從內部 SELECT 語句返回一行
  4. 它們從主(外部)查詢中給出多行

答案:C. 單行子查詢最多可以返回一個值。

15. 關於多行子查詢,哪一項是正確的?

  1. 它們可以返回內查詢結果的多於一列
  2. 它們在主查詢中返回多行,但在內部查詢中只返回單個結果集
  3. 它們在主查詢中返回單行,但在內部子查詢中返回多行
  4. 它們從內部 SELECT 語句返回多於一行

答案:D. 多列子查詢在結果集中返回多於一列,多行子查詢從內部查詢返回多於一行。

16. 關於單行子查詢,以下哪一項是正確的?

  1. 它們只返回一行
  2. 它們使用單行運算子
  3. A 和 B
  4. 以上都不是

答案:C.

17. 以下哪些運算子不能在子查詢中使用?

  1. AND
  2. <
  3. >
  4. <>

答案:A. 單行運算子包括 =、>、<、>=、<= 和 <>。可與多行子查詢一起使用的多行運算子包括 IN、ALL、ANY 和 EXISTS。

檢視圖表並回答接下來的第 18 至 21 題。

Table EMPLOYEES Table DEPARTMENTS

18. 您需要找出所有屬於與員工“Jessica Butcher”(在 100 部門工作,員工 ID 為 40)相同部門的員工的姓名。以下哪個查詢是正確的?

  1. SELECT first_name, last_name
    FROM employees
    WHERE last_name = 'Butcher'
    And first_name = 'Jessica'; 
  2. SELECT first_name, last_name
    FROM employees
    WHERE department =100; 
  3. SELECT first_name, last_name
    FROM employees
    WHERE department  = (SELECT department
    FROM employees
    WHERE first_name = 'Jessica'
    AND last_name = 'Butcher'); 
  4. SELECT first_name, last_name
    FROM employees
    WHERE department  = (SELECT department
    FROM employees
    WHERE first_name = 'Jessica'
    AND last_name = 'Butcher'
    AND department = 100
    AND employee_id = 40); 

答案:D. “D”比“C”更合適,因為它過濾了唯一的員工 ID,並確保子查詢只返回單行。“C”如果有多個員工擁有相同的姓名,可能會失敗。

19. 您需要找出屬於“Jessica Butcher”部門且薪水高於員工 ID 為 40 的“Jessica Butcher”薪水的員工。以下哪個查詢有效?

  1. SELECT first_name, last_name
    FROM employees
    WHERE last_name = 'Butcher'
    AND first_name = 'Jessica'
    AND salary > 10000; 
  2. SELECT first_name, last_name
    FROM employees
    WHERE department = 100; 
  3. SELECT first_name, last_name
    FROM employees
    WHERE department = (SELECT department
    			FROM employees
    			WHERE first_name = 'Jessica'
    			AND last_name = 'Butcher'
    			AND employee_id = 40)
    AND salary > (SELECT salary
    			 FROM employees
    			 WHERE first_name = 'Jessica'
    			 AND last_name = 'Butcher'
    			 AND employee_id = 40); 
  4. SELECT first_name, last_name
    FROM employees
    WHERE department  = (SELECT department
    			FROM employees
    			WHERE first_name = 'Jessica'
    			AND last_name = 'Butcher'
    			AND department = 100); 

答案:C. 可以在一個 SQL 語句中編寫多個子查詢以新增多個條件。

20. 基於第 18 題和第 19 題的答案,它們使用了哪種型別的子查詢?

  1. 單行子查詢
  2. 多行子查詢
  3. A 和 B
  4. 內聯子查詢

答案:A. 上面給出的第 18 題和第 19 題演示了在 SELECT 語句中使用子查詢。

21. 考慮關於 SQL 子查詢中外部查詢和內部查詢的兩個陳述?

i. 內部查詢只能從一個表獲取資料

ii. 內部查詢可以從多個表獲取資料

以上哪些陳述是正確的?

  1. (i)
  2. (ii)
  3. (i) 和 (ii)
  4. (i) 和 (ii) 都不是

答案:B. 子查詢可以從多個表中獲取資料。

檢視以下表結構並回答接下來的第 22 至 27 題

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)

22. 以下查詢的結果是什麼?(選擇最合適的答案)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT last_name, job_id, salary
FROM employees
WHERE salary = (SELECT max(salary)
FROM employees); 
  1. 它成功執行並給出薪水等於最高薪水的員工。
  2. 它成功執行,但沒有給出所需的結果
  3. 它丟擲一個錯誤,因為在子查詢中使用了組函式
  4. 它丟擲一個錯誤,因為單行子查詢應該包含多行運算子

答案:A. 可以在子查詢中使用組函式。

23. 以下查詢的結果是什麼?

SELECT first_name, last_name, min(salary)
FROM employees
GROUP BY department_id 
HAVING MIN(salary) > 
		(SELECT min(salary)
		FROM employees
		WHERE department_id = 100); 
  1. 它成功執行並給出所有員工的姓名和大於 100 部門的最低薪水
  2. 它成功執行並給出 100 部門員工的薪水
  3. 它成功執行並給出所有員工的姓名和最低薪水。
  4. 它丟擲一個錯誤。

答案:A. 如所示,HAVING 子句可在子查詢中使用

24. 您需要找到平均薪水最高的職位。以下哪個查詢將為您提供所需的結果?

  1. SELECT job_id, avg(salary)
    FROM employees
    GROUP BY job_id; 
  2. SELECT job_id, avg(salary)
    FROM employees
    GROUP BY job_id
    HAVING job_id in (SELECT max(avg(salary) FROM employees); 
  3. SELECT job_id, avg(salary)
    FROM employees
    GROUP BY job_id
    HAVING max(avg(salary) in (SELECT max(avg(salary) FROM employees); 
  4. SELECT job_id, avg(salary)
    FROM employees
    GROUP BY job_id
    HAVING avg(salary) in (SELECT max(avg(salary) FROM employees GROUP BY job_id); 

答案:D. 子查詢可以使用組函式和 HAVING 子句來限制組。

25. 以下查詢丟擲一個錯誤。選擇選項中給出的錯誤的正確原因。

SELECT first_name, last_name
FROM employees
WHERE commission_pct  = (SELECT min(commission_pct )
          FROM employees
          GROUP BY department_id); 
  1. 子查詢不需要 GROUP BY 子句
  2. 子查詢 SELECT 語句中不能使用函式
  3. 單行子查詢給出多條記錄
  4. “=”運算子的使用無效;IN 運算子將正確工作

答案:C、D。GROUP BY 子句為每個部門提供了最小 commission_pct,因此多個結果被提取到主查詢中,從而導致錯誤。

26.考慮以下查詢。上述查詢將返回多少條記錄?(假設公司中不存在job id 為XX的員工)

SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT salary
		FROM employees
		WHERE job_id = 'XX');
  1. 1
  2. NULL
  3. 0
  4. 該查詢引發 ORA 錯誤,因為子查詢無效。

答案:C。由於公司中沒有 job_id 為“XX”的員工,因此子查詢不返回任何結果,當與主查詢中的 job_id 比較時,結果為 0。

27.如果將問題 26 中查詢的 WHERE 條件替換為一個新的條件(WHERE job_id IS NOT NULL)會發生什麼?(假設 'employees' 表中的記錄數為 14)。

  1. 1
  2. 14
  3. 0
  4. ORA 錯誤

答案:D。查詢執行引發異常“ORA-01427: single-row subquery returns more than one row”。

28.以下哪些是用於子查詢的有效多行運算子?

  1. <=
  2. ANY >=
  3. !=
  4. >=

答案:B。多行子查詢返回多行結果。可用於多行子查詢的運算子包括 IN、ALL、ANY 和 EXISTS。多行運算子 IN、ANY、ALL 必須與單行運算子一起使用,如選項 B 所示。

檢查給出的表結構。考慮以下查詢並回答接下來的問題 29 到 33。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT first_name, last_name, salary, commission_pct 
FROM employees 
WHERE salary < ANY  (SELECT salary
		FROM employees
		WHERE department_id  = 100)
AND department_id  <> 101; 

29.上述查詢中 ANY 運算子計算結果是什麼?

  1. TRUE
  2. FALSE
  3. NULL
  4. 0

答案:A。多行運算子返回布林值結果。由於部門 100 中存在 salary 的結果,因此返回 TRUE。如果結果為 0,則計算結果為 FALSE。

30.如果我們假設部門 100 只有一個員工,查詢的結果是什麼?

  1. 它成功執行並返回一個結果
  2. 它成功執行並返回所有員工的工資
  3. NULL
  4. 它丟擲 ORA 錯誤

答案:D。如果部門 100 有一個結果(單行子查詢),則 < ANY 運算子會報錯,因為它是一個多行運算子。

31.如果將上述查詢中的 < ANY 運算子替換為 = ANY 運算子,結果將會怎樣?

  1. Oracle 將像使用 IN 運算子一樣處理子查詢返回的每個 salary 值
  2. 結果將沒有區別
  3. 結果將有所不同
  4. 執行將丟擲一個 ORA 錯誤

答案:A。= ANY 運算子等效於 IN 運算子。

32.關於上述查詢中的 < ANY 運算子,可以說什麼?

  1. 它給出工資的最大值
  2. 它給出工資的最小值
  3. 這意味著它給出小於最高值的值
  4. 以上都不是

答案:C。多行運算子 < ANY 計算結果為子查詢的“小於最大值”語句。'> ALL' 大於子查詢返回的最高值。'< ALL' 小於子查詢返回的最低值。'< ANY' 小於子查詢返回的最高值。'> ANY' 大於子查詢返回的最低值。'= ANY' 等於子查詢返回的任何值(與 IN 相同)。'[NOT] EXISTS' 行必須與子查詢中的值匹配

<

33.假設將 < ANY 運算子替換為 > ANY。關於此運算子,哪個說法是正確的?

  1. 它給出最高工資
  2. 它只查詢子查詢中的最高工資
  3. 它給出大於最低工資的值
  4. 它給出最低工資

答案:C。多行運算子 > ANY 計算結果為子查詢的“大於最小值”語句。'> ALL' 大於子查詢返回的最高值。'< ALL' 小於子查詢返回的最低值。'< ANY' 小於子查詢返回的最高值。'> ANY' 大於子查詢返回的最低值。'= ANY' 等於子查詢返回的任何值(與 IN 相同)。'[NOT] EXISTS' 行必須與子查詢中的值匹配

<

34.檢查給定的表結構並考慮以下查詢

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT employee_id, first_name, last_name
FROM employees
WHERE salary IN (SELECT max(salary)
		FROM employees
		GROUP BY department_id ); 

以下哪個 WHERE 子句等效於上述查詢中的 WHERE 子句?(假設工資為 2500、3000、3500、4000)

  1. WHERE salary < ANY (SELECT max(salary)
    			FROM employees
    			GROUP BY department_id ); 
  2. WHERE salary < ALL (SELECT max(salary)
    			FROM employees
    			GROUP BY department_id ); 
  3. WHERE salary = (SELECT max(salary)
    			FROM employees
    			GROUP BY department_id ); 
  4. WHERE salary IN (2500,3000,3500,4000); 

答案:D。當使用 IN 運算子時,Oracle 會像選項 D 中所示那樣處理子查詢的各個結果。

檢查 EMPLOYEES 表的結構如下,並回答接下來的問題 35 到 37。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
<

35.您需要找出哪些員工的工資低於 job ID 為 'FIN_ACT' 的員工的工資。以下哪個查詢將為您提供所需的結果?

  1. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary < ALL 
    		(SELECT salary
    		 FROM employees
    		 WHERE job_id = 'FIN_ACT')
    		 AND job_id <> 'FIN_ACT'; 
  2. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary > ALL 
    		(SELECT salary
    		FROM employees
    		WHERE job_id = 'FIN_ACT')
    		AND job_id <> 'FIN_ACT'; 
  3. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary < ANY 
    		(SELECT salary
    		FROM employees
    		WHERE job_id = 'FIN_ACT')
    		AND job_id <> 'FIN_ACT'; 
  4. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary = 	(SELECT salary
    		FROM employees
    		WHERE job_id = 'FIN_ACT')
    		AND job_id <> 'FIN_ACT'; 

答案:A。< ALL 表示小於最小值。'> ALL' 大於子查詢返回的最高值。'< ALL' 小於子查詢返回的最低值。'< ANY' 小於子查詢返回的最高值。'> ANY' 大於子查詢返回的最低值。'= ANY' 等於子查詢返回的任何值(與 IN 相同)。'[NOT] EXISTS' 行必須與子查詢中的值匹配

36.如果將上述查詢(上題中的選項 A)中的 < ALL 替換為 >ALL,結果將會怎樣?

  1. 它將成功執行並返回相同的結果。
  2. 它將丟擲一個 ORA 錯誤
  3. 它將成功執行,但會給出工資低於所有 job_id 為 'FI_ACCOUNTANT' 的員工的員工的詳細資訊。
  4. 以上都不是

答案:C。>ALL 表示小於最小值。'> ALL' 大於子查詢返回的最高值。'< ALL' 小於子查詢返回的最低值。'< ANY' 小於子查詢返回的最高值。'> ANY' 大於子查詢返回的最低值。'= ANY' 等於子查詢返回的任何值(與 IN 相同)。'[NOT] EXISTS' 行必須與子查詢中的值匹配

37.您需要查詢不在部門 100 的所有員工的工資。以下哪個查詢將為您提供所需的結果?

  1. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary !=ALL 
    		(SELECT salary
    		FROM employees
    		WHERE department_id  = 100)
    		AND department_id  <> 100; 
  2. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary NOT IN 
    		(SELECT salary
    		FROM employees
    		WHERE department_id  = 100)
    		AND department_id  <> 100; 
  3. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary NOT ALL 
    		(SELECT salary
    		FROM employees
    		WHERE department_id  = 100)
    		AND department_id  <> 100; 
  4. SELECT employee_id, first_name, last_name
    FROM employees
    WHERE salary != (SELECT salary
    		FROM employees
    		WHERE department_id  = 100)
    		AND department_id  <> 100; 

答案:C。NOT 可用於多行運算子 IN、ANY 和 ALL。

檢查給出的表結構。考慮以下查詢並回答接下來的問題 38 和 39。您需要查詢沒有下屬向其彙報的員工。(假設預期結果為 0)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT first_name, last_name 
FROM employees
WHERE employee_id NOT IN 
		(SELECT manager_id
		FROM employees); 

38.上述查詢的結果是什麼?

  1. 10
  2. NULL
  3. ORA 錯誤
  4. 0

答案:D。內部子查詢中的一個值為 NULL(並非所有員工都是經理!)

39.應向上述查詢新增/修改以下哪個 WHERE 子句才能得到預期的結果?

  1. WHERE employee_id != (SELECT manager_id FROM employees); 
  2. WHERE employee_id IN (SELECT manager_id FROM employees);  
  3. WHERE employee_id <>ALL (SELECT manager_id FROM employees); 
  4. WHERE employee_id NOT IN (SELECT manager_id
    			FROM employees
    			WHERE manager_id is NOT NULL); 

答案:B、D。如果子查詢可能包含 NULL 值,請不要使用 NOT IN 運算子,或者如果使用,請使用附加的 WHERE 子句修改子查詢(選項 D)

40.一般來說,關於子查詢,哪個說法是正確的?

  1. 子查詢必須與主查詢分開執行
  2. 子查詢可以根據使用者的意願執行,它們與主查詢的執行無關
  3. 子查詢等於兩個順序查詢,其中內部查詢的結果由主查詢使用
  4. 以上所有

答案:C.

41.關於子查詢,以下哪個說法是正確的?

  1. 子查詢可以返回 0 行或多行
  2. 子查詢只能用於 SELECT 子句
  3. 子查詢的巢狀限制為 2 層
  4. 分組函式不能用於子查詢

答案:A。子查詢是在另一個查詢的 SELECT、FROM、HAVING 或 WHERE 子句中巢狀的完整查詢。子查詢必須括在括號中,並且至少具有 SELECT 和 FROM 子句。單行子查詢最多可以返回一個值。多列子查詢向外部查詢返回多列。

42.檢查給出的表結構。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)

考慮以下查詢。

SELECT first_name, last_name 
FROM employees
WHERE employee_id NOT IN 
		(SELECT manager_id, hire_date
		FROM employees 
		WHERE manager_id is not null); 

此查詢返回錯誤。錯誤的原因是什麼?

  1. 使用的 NOT IN 運算子無效
  2. 子查詢中的 WHERE 子句編寫不正確
  3. 當主查詢中使用不等式時,子查詢 SELECT 子句中的列應只有一個
  4. 子查詢使用與主查詢相同的表

答案:C。子查詢中選擇的列應與比較運算子另一側的列相同。任何資料型別或列數的不等都會導致 ORA 錯誤。

43.需要提取一份報告,顯示分配了一個或多個員工的所有部門。以下哪個查詢將提供所需的結果?(考慮給定的表結構)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
  1. SELECT department_name
    FROM employees
    WHERE department_id  IN (SELECT distinct (department_id )
    			FROM employees); 
  2. SELECT department_name
    FROM employees
    WHERE department_id  ANY (SELECT distinct (department_id )
    			FROM employees); 
  3. SELECT department_name
    FROM employees
    WHERE department_id  < ANY (SELECT distinct (department_id )
    			FROM employees); 
  4. SELECT department_name
    FROM employees
    WHERE department_id  = ANY (SELECT distinct (department_id )
    			FROM employees); 

答案:A、D。

44.在單個 SQL 語句中,Oracle 中允許的最大子查詢巢狀級別是多少?

  1. 20
  2. 50
  3. 無限制
  4. 255

答案:D。Oracle 支援將查詢巢狀到 255 層。

45.當我們知道需要將哪些值傳遞到 Oracle 查詢中的主查詢時,應該遵循什麼最佳實踐?

  1. 使用 GROUP BY
  2. 使用子查詢
  3. 使用 HAVING
  4. 以上都不是

答案:D。子查詢可能會產生 NULL 結果,從而導致主結果中為 0 行;因此,只有在我們知道需要哪些值時才最好使用它們。

檢查給出的表結構。考慮以下查詢並回答接下來的問題 46 和 47。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT employee_id, first_name, last_name, job_id
FROM employees
WHERE job_id = (SELECT job_id FROM employees); 

46.您需要查詢所有 job ID 與 ID 為 210 的員工的 job ID 相同的員工。為了實現此結果,您將新增/修改以下哪個 WHERE 子句?(考慮給定的表結構

  1. WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 210); 
  2. WHERE job_id IN (SELECT job_id FROM employees WHERE employee_id = 210); 
  3. WHERE job_id > (SELECT job_id FROM employees WHERE employee_id = 210); 
  4. WHERE job_id >= (SELECT job_id FROM employees WHERE employee_id = 210); 

答案:A。

47.假設您將問題 46 中選項 A 中的 WHERE 子句更改為以下內容。

WHERE job_id = (SELECT job_id FROM employees WHERE employee_id < 210); 

此更改的結果是什麼?

  1. 結果將相同
  2. 執行時丟擲 ORA 錯誤
  3. 結果將有所不同
  4. 查詢將成功執行並返回 0 行。

答案:B。給定更改後,子查詢返回多個結果,因此應將主查詢中給出的“=”替換為多行運算子。

48.檢查如下所示的表結構。

Table EMPLOYEES Table GRADE

您需要顯示工資最高的員工的姓名。以下哪個 SQL 語句是正確的?

  1. SELECT first_name, last_name, grade
    FROM employees, grade
    WHERE (SELECT max (salary) FROM employees) BETWEEN losal and hisal; 
  2. SELECT first_name, last_name, grade
    FROM employees, grade
    WHERE (SELECT max (salary) FROM employees) BETWEEN losal and hisal
    AND salary BETWEEN losal and hisal; 
  3. SELECT first_name, last_name, grade
    FROM employees, grade
    WHERE salary = (SELECT max (salary) FROM employees) 
    AND salary BETWEEN losal and hisal; 
  4. SELECT first_name, last_name, grade
    FROM employees, grade
    WHERE salary IN (SELECT max (salary) FROM employees) 
    AND max(salary) BETWEEN losal and hisal; 

答案:B、C。子查詢可以寫在運算子的兩側

49.SQL 語句的 FROM 子句中的子查詢是什麼?(選擇最合適的答案)

  1. 單行子查詢
  2. 多行子查詢
  3. 內聯檢視
  4. 相關子查詢

答案:C。如果子查詢出現在 SELECT 語句的 FROM 子句中,則它構成一個內聯檢視。Oracle 在內部為查詢執行建立一個臨時檢視。

50.內聯檢視型別子查詢允許的最大巢狀級別是多少?

  1. 255
  2. 300
  3. 216
  4. 無限制

答案:D。由於可以連線的表數量沒有限制,因此查詢中內聯檢視的數量也沒有限制。

51.關於相關子查詢,哪個說法是正確的?

  1. 主查詢中使用的表也用於相關子查詢
  2. 引用主查詢中使用的列的子查詢稱為相關子查詢。
  3. 不帶括號編寫的子查詢稱為相關子查詢。
  4. 強制使用與主查詢中使用的表不同的表的子查詢稱為相關子查詢。

答案:B。相關子查詢引用外部查詢中的列,併為外部查詢中的每一行執行一次子查詢,而非相關子查詢先執行子查詢,然後將值傳遞給外部查詢。

52.以下哪個語句不能作為子查詢的父語句?

  1. SELECT
  2. GROUP BY
  3. UPDATE
  4. DELETE

答案:B。其餘選項可以作為子查詢的主查詢(父查詢)。

53.關於相關子查詢,哪個說法是正確的?

  1. 它只為父查詢評估一次。
  2. 它只為父查詢評估三次。
  3. 它為父查詢處理的每一行評估一次。
  4. 以上所有

答案:C。相關子查詢引用外部查詢中的列,併為外部查詢中的每一行執行一次子查詢;EXISTS 運算子用於測試是否存在關係或連結。

54.檢查給定的表結構。你需要編寫一個查詢,返回薪水超過其各自部門平均薪水的員工姓名。以下哪個選項有效?(選擇最合適的答案)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
  1. SELECT employee_id, first_name, last_name
    FROM employees e
    WHERE salary > (SELECT avg (salary)
    		FROM employees
    		WHERE e.department_id  = department_id )
    		ORDER BY department_id ; 
  2. SELECT employee_id, first_name, last_name
    FROM employees e
    WHERE salary > ANY (SELECT avg(salary)
    		FROM employees
    		WHERE e.department_id  = department_id )
    		ORDER BY department_id ; 
  3. SELECT employee_id, first_name, last_name
    FROM employees e
    WHERE salary = (SELECT avg(salary)
    		FROM employees
    		WHERE e.department_id  = department_id )
    		ORDER BY department_id ; 
  4. SELECT employee_id, first_name, last_name
    FROM employees e
    WHERE salary < ANY  (SELECT avg(salary)
    		FROM employees
    		WHERE e.department_id  = department_id )
    		ORDER BY department_id ; 

答案:A。這裡獲取部門 ID,用於評估父查詢,如果該行中的薪水大於該行部門的平均薪水,則返回該結果。

55.檢查給定的表結構。以下哪個查詢將顯示 EMPLOYEES 表中的重複記錄?

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
  1. SELECT *
    FROM employees E
    WHERE exists (SELECT 1 FROM employees E1
    		WHERE E.employee_id = E1.employee_id); 
  2. SELECT *
    FROM employees E
    WHERE exists (SELECT 1 FROM employees E1
    		WHERE E.employee_id = E1.employee_id
    		AND E.ROWID < E1.ROWID); 
  3. SELECT *
    FROM employees E
    WHERE exists (SELECT 1 FROM employees E1
    		WHERE E.ROWID < E1.ROWID); 
  4. SELECT *
    FROM employees E
    WHERE = ANY (SELECT 1 FROM employees E1
    		WHERE E.employee_id = E1.employee_id
    		And E.ROWID < E1.ROWID); 

答案:A。相關子查詢引用外部查詢中的列,併為外部查詢中的每一行執行一次子查詢;EXISTS 運算子用於測試是否存在關係或連結。它可以用來查詢表中重複的行,其中重複性取決於一個列或一組列。

檢查 DEPARTMENTS 和 EMPLOYEES 表的結構,並回答接下來的問題 56 和 57。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SQL> DESC departments
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 DEPARTMENT_ID		 NOT NULL NUMBER(4)
 DEPARTMENT_NAME	 NOT NULL VARCHAR2(30)
 MANAGER_ID			  NUMBER(6)
 LOCATION_ID			  NUMBER(4)

56.以下哪個查詢將顯示系統日期以及 DEPARTMENTS 和 EMPLOYEES 表中的記錄計數?

  1. SELECT sysdate,
    		(SELECT * FROM departments) dept_count,
    		(SELECT * FROM employees) emp_count
    FROM DUAL; 
  2. SELECT sysdate,
    		(SELECT count(*) FROM departments) dept_count,
    		(SELECT count(*) FROM employees) emp_count
    FROM DUAL
    GROUP BY department_id ; 
  3. SELECT sysdate,
    		(SELECT * FROM departments) dept_count,
    		(SELECT * FROM employees) emp_count
    FROM DUAL
    GROUP BY employee_id; 
  4. SELECT sysdate,
    		(SELECT count(*) FROM departments) dept_count,
    		(SELECT count(*) FROM employees) emp_count
    FROM DUAL; 

答案:D。單行子查詢也可以巢狀在外層查詢的 SELECT 子句中。在這種情況下,子查詢返回的值可用於外層查詢生成的每一行輸出。通常,此技術用於使用子查詢生成的數值執行計算。

57.以下哪個查詢將判斷給定的員工是否為“XYZ”公司的經理?

  1. SELECT employee_id, manager_id
    FROM employees A
    WHERE employee_id ANY (SELECT manager_id from employees B)
    ORDER BY manager_id desc; 
  2. SELECT employee_id, manager_id
    FROM employees A
    WHERE employee_id < ALL (SELECT manager_id from employees B)
  3. SELECT employee_id, manager_id
    FROM employees A
    WHERE employee_id IN (SELECT manager_id from employees B)
    ORDER BY manager_id desc; 
  4. SELECT employee_id, manager_id
    FROM employees A
    WHERE employee_id in (SELECT manager_id from employees B)
    GROUP BY department_id ; 

答案:C.

檢查圖表並回答接下來的問題 58。

Table EMPLOYEES Table DEPARTMENTS Table LOCATIONS

58.以下哪個查詢將提供特定城市中員工的最高薪水?

  1. SELECT max (salary), city
    FROM
    (SELECT salary, department_id , loc, city
    FROM employees natural join departments natural join locations); 
  2. SELECT salary, city
    FROM
    (SELECT salary, department_id , loc, city
    FROM employees natural join departments natural join locations); 
  3. SELECT max (salary), city
    FROM
    (SELECT salary, department_id , loc, city
    FROM employees natural join departments natural join locations)
    GROUP BY city; 
  4. SELECT max (avg(salary)), city
    FROM
    (SELECT salary, department_id , loc, city
    FROM employees natural join departments natural join locations); 

答案:C。當多列子查詢用於外層查詢的 FROM 子句中時,它會建立一個臨時表,其他外層查詢子句可以引用該表。這個臨時表更正式地稱為內聯檢視。子查詢的結果被視為 FROM 子句中的任何其他表。如果臨時表包含分組資料,則分組子集被視為表中的單獨資料行。

檢查如下所示的表結構。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SQL> DESC departments
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 DEPARTMENT_ID		 NOT NULL NUMBER(4)
 DEPARTMENT_NAME	 NOT NULL VARCHAR2(30)
 MANAGER_ID			  NUMBER(6)
 LOCATION_ID			  NUMBER(4)

考慮以下查詢並回答接下來的問題 59 到 62。

SELECT  department_name
FROM departments d INNER JOIN employees e
ON (d.employee_id = e.employee_id)
GROUP BY department_name; 

59.以下哪個查詢可以使用子查詢替換上面的查詢,並得到相同的結果?

  1. SELECT department_name
    FROM departments
    WHERE department_id  = ANY (SELECT department_id  FROM employees); 
  2. SELECT department_name
    FROM departments
    WHERE department_id  IN (SELECT distinct(department_id ) FROM employees); 
  3. SELECT department_name
    FROM departments
    WHERE department_id  = (SELECT distinct(department_id ) FROM employees); 
  4. SELECT department_name
    FROM departments
    WHERE department_id  ANY (SELECT distinct(department_id ) FROM employees); 

答案:A,B。

60.假設上面查詢中顯示的子查詢修改如下。

(SELECT distinct (department_id ) FROM employees ORDER BY department_id ); 

此更改的結果是什麼?(選擇最合適的答案)

  1. 它將對從子查詢獲取的 department_id 進行排序,並按升序顯示它們。
  2. 由於 ORDER BY 子句應與 GROUP BY 子句一起使用,因此它將丟擲 ORA 錯誤。
  3. 它將丟擲 ORA 錯誤,因為在子查詢中不能使用 ORDER BY 子句。
  4. 它將成功執行。

答案:C。除了 FROM 子句中的子查詢外,子查詢不能有 ORDER BY 子句。如果需要按特定順序顯示輸出,請將 ORDER BY 子句作為外層查詢的最後一個子句。

61.假設上面給出的查詢修改如下。

SELECT department_name
FROM departments
WHERE department_id  = ANY (SELECT department_id  FROM employees)
ORDER BY department_id  desc; 

此更改的結果是什麼?(選擇最合適的答案)

  1. 它將對從子查詢獲取的 department_id 進行排序,並按升序顯示它們。
  2. 它將對從子查詢獲取的 department_id 進行排序,並按降序顯示它們。
  3. 它將丟擲 ORA 錯誤,因為在子查詢中不能使用 ORDER BY 子句。
  4. 以上都不是

答案:D。除了 FROM 子句中的子查詢外,子查詢不能有 ORDER BY 子句。如果需要按特定順序顯示輸出,請將 ORDER BY 子句作為外層查詢的最後一個子句。

62.以下哪個可以用來對子查詢中的結果進行排序?

  1. ORDER BY
  2. HAVING
  3. GROUP BY
  4. 以上所有

答案:C。預設情況下,GROUP BY 子句在子查詢中執行排序。

檢查下面的圖表,並回答接下來的問題 63 到 65。

Table AUDIT

考慮以下查詢

SELECT au_id, au_title
FROM audit
WHERE au_details in (SELECT au_details
		  FROM audit
		  WHERE au_title like 'S%')
		  ORDER BY au_title; 

63.上面給出的查詢的結果是什麼?

  1. 它提供所有以字母“S%”開頭的 AU_ID 和 AU_TITLE。
  2. 它提供所有以字母“S%”開頭的 AU_ID 和 AU_TITLE,並按標題升序排序。
  3. 它丟擲 ORA 錯誤
  4. 它返回 0 值。

答案:C。在子查詢中不能使用帶有 CLOB、BLOB、NCLOB 或陣列的列。

64.以下查詢的結果是什麼?

SELECT *
FROM employees
WHERE salary BETWEEN (SELECT max(salary)
			FROM employees
			WHERE department_id  = 100) 
AND (SELECT min(salary) FROM employees where department_id  = 100); 

此查詢返回錯誤。錯誤的原因是什麼?

  1. 由於使用了 MAX 函式,因此應使用 GROUP BY 子句。
  2. 兩個子查詢不能在同一個外層查詢中使用相同的 department ID。
  3. BETWEEN 運算子不能與子查詢一起使用。
  4. SELECT 子句應該提到列,而不是星號 (*)。

答案:C。BETWEEN 運算子可以在子查詢中使用,但不能與子查詢一起使用。

65.關於在查詢中使用 NOT IN 與子查詢一起編寫時,哪個說法是正確的?

  1. NOT IN 忽略所有 NULL 值,只給出非 NULL 值。
  2. NOT IN 將所有 NULL 值放在最後,並首先顯示非 NULL 值。
  3. 如果結果集預期為 NULL 值,則不應使用 NOT IN。
  4. NOT IN 只是 IN 運算子的否定,可以隨意更改。

答案:C。SQL 以不同的方式處理 NULL 值,因此如果結果集可能包含 NULL 值,最好避免使用 NOT IN。

考慮以下表結構,並回答接下來的問題 66 到 72。

Table EMPLOYEES Table DEPARTMENTS

66.你需要找出最低薪水高於部門 10 中最高薪水的部門的名稱和 ID。以下哪個查詢將給出所需的結果。

  1. SELECT department_id , min(salary)
    FROM employees
    GROUP BY department_id 
    HAVING min(salary) >
    		(
    		select max(salary)
    		FROM employees
    		where department_id  = 10
    		)
  2. SELECT department_id , min(salary)
    FROM employees
    GROUP BY department_id 
    HAVING min(salary) > ANY
    		(
    		select max(salary)
    		FROM employees
    		)
  3. SELECT department_id , min(salary)
    FROM employees
    HAVING max(salary) < ANY
    		(
    		select min(salary)
    		FROM employees
    		where department_id  = 10
    		)
  4. SELECT department_id , min(salary)
    FROM employees
    GROUP BY department_id 
    HAVING min(salary) > ALL
    		(
    		select max(salary)
    		FROM employees
    		where department_id  = 10
    		)

答案:A。

67.編寫一個查詢,查詢薪水等於部門 ID 為 10 的至少一名員工薪水的員工。(選擇最佳答案)

  1. SELECT employee_id, Salary
    FROM employees
    WHERE salary in
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  2. SELECT employee_id, Salary
    FROM employees
    WHERE salary =ANY
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  3. SELECT employee_id, Salary
    FROM employees
    WHERE salary ALL
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  4. SELECT employee_id, Salary
    FROM employees
    WHERE salary  < ANY
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)

答案:A,B。

68.你需要找出所有薪水高於部門 10 中至少一名員工薪水的員工。以下哪個查詢將給出所需的輸出?

  1. SELECT employee_id, Salary
    FROM employees
    WHERE salary >= ANY
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  2. SELECT employee_id, Salary
    FROM employees
    WHERE salary > ANY
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  3. SELECT employee_id, Salary
    FROM employees
    WHERE salary < ANY
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  4. SELECT employee_id, Salary
    FROM employees
    WHERE salary = ALL
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)

答案:B。

69.你需要找出所有薪水低於部門 10 中所有員工薪水的員工。以下哪個查詢將給出所需的輸出?

  1. SELECT employee_id, Salary
    FROM employees
    WHERE salary > ALL
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  2. SELECT employee_id, Salary
    FROM employees
    WHERE salary =ALL
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  3. SELECT employee_id, Salary
    FROM employees
    WHERE salary < ALL
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)
  4. SELECT employee_id, Salary
    FROM employees
    WHERE salary < ANY
    		(
    		SELECT salary
    		FROM employees
    		where department_id  = 10
    		)

答案:C。多行子查詢返回多行結果。可用於多行子查詢的運算子包括 IN、ALL、ANY 和 EXISTS。多列子查詢向外層查詢返回多列。資料列按子查詢的 SELECT 子句中列出的順序傳遞給外層查詢。

70.你需要找出所有其經理和部門與員工 ID 為 121 或 200 的員工匹配的員工。以下哪個查詢將給出所需的輸出?

  1. SELECT employee_id, manager_id,department_id 
    FROM employees
    WHERE (manager_id,department_id ) = ANY
    		(
    		select manager_id,
    		department_id 
    		FROM employees
    		where employee_id in (121,200)
    		)
  2. SELECT employee_id, manager_id,department_id 
    FROM employees
    WHERE (manager_id,department_id ) < ANY
    		(
    		select manager_id,
    		department_id 
    		FROM employees
    		where employee_id in (121,200)
    		)
  3. SELECT employee_id, manager_id,department_id 
    FROM employees
    WHERE (manager_id,department_id ) > ANY
    		(
    		select manager_id,
    		department_id 
    		FROM employees
    		where employee_id in (121,200)
    		)
  4. SELECT employee_id, manager_id,department_id 
    FROM employees
    WHERE (manager_id,department_id ) in
    		(
    		select manager_id,
    		department_id 
    		FROM employees
    		where employee_id in (121,200)
    		)

答案:A,D。多行子查詢返回多行結果。可用於多行子查詢的運算子包括 IN、ALL、ANY 和 EXISTS。多列子查詢向外層查詢返回多列。資料列按子查詢的 SELECT 子句中列出的順序傳遞給外層查詢。

71.你需要查詢員工 ID 為 200 的員工的部門名稱。以下哪個查詢是正確的?(選擇最合適的答案)

  1. SELECT employee_id, first_name, last_name,department_id ,
    (SELECT department_name
    FROM departments d, employees E
    WHERE d.department_id  = e.department_id 
    And employee_id = 200
    )
    FROM employees e
  2. SELECT employee_id, first_name, last_name,department_id ,
    (SELECT department_ID
    FROM departments d
    WHERE d.department_id  = department_id 
    )
    FROM employees e
    WHERE employee_id = 200; 
  3. SELECT employee_id, first_name, last_name,department_id ,
    (SELECT department_name
    FROM departments d
    WHERE d.department_id  = e.department_id 
    And employee_id = 200
    )
    FROM employees e
  4. SELECT employee_id, first_name, last_name,department_id ,
    (SELECT department_name
    FROM departments d,employee E 
    WHERE d.department_id  = e.department_id 
    )
    FROM employees e

答案:C.

72.你需要查詢職位 ID 為“SA_REP”的收入最高的員工。以下哪個查詢是正確的?(選擇最合適的答案)

  1. SELECT job_id, employee_id, Salary
    FROM employees e
    WHERE job_id  =
    (
    SELECT  distinct salary
    FROM employees E1
    WHERE E.job_id  = E1.job_id 
    AND E.salary <=  E1.salary
    AND job_id  = 'SA_REP' 
    
  2. SELECT department_id , employee_id, Salary
    FROM employees E
    WHERE 1 =
    (
    SELECT  count(distinct salary)
    FROM employees E1
    WHERE E.job_id  = E1.job_id 
    AND E.salary <=  E1.salary
    AND job_id  = 'SA_REP'
    )
  3. SELECT department_id , employee_id, Salary
    FROM employees E
    WHERE 0 =
    (
    SELECT  count(distinct salary)
    FROM employees E1
    WHERE E.job_id  = E1.job_id 
    AND E.salary =  E1.salary
    AND job_id  = 'SA_REP'
    )
  4. SELECT department_id , employee_id, Salary
    FROM employees E
    WHERE 1 =
    (
    SELECT salary
    FROM employees E1
    WHERE E.job_id  < E1.job_id 
    AND E.salary <=  E1.salary
    AND job_id  = 'SA_REP'
    )

答案:B。

考慮 EMPLOYEES 表結構,如圖表所示,並回答接下來的問題 73 到 77。

Table EMPLOYEES

73.你需要找到至少有一名員工的職位。以下哪個查詢是正確的?(選擇最合適的答案)

  1. SELECT employee_id, Job_id
    FROM employees E
    WHERE exists
    (
    SELECT 1
    FROM employees E1
    WHERE E.job_id  = E1.job_id )
  2. SELECT employee_id, Job_id 
    FROM employees E
    WHERE exists
    (
    SELECT *
    FROM employees E1
    WHERE E.job_id  = E1.job_id )
  3. SELECT employee_id, Job_id 
    FROM employees E
    WHERE not exists
    (
    SELECT *
    FROM employees E1
    WHERE E.job_id  = E1.job_id )
  4. SELECT employee_id, Job_id 
    FROM employees E
    WHERE exists
    (
    SELECT 1
    FROM employees E1
    WHERE E.job_id  < E1.job_id )

答案:A。EXISTS 運算子用於檢查和匹配查詢之間的記錄。它返回布林值。相關子查詢引用外部查詢中的列,併為外部查詢中的每一行執行一次子查詢;EXISTS 運算子用於測試是否存在關係或連結。非相關子查詢先執行子查詢,然後將值傳遞給外部查詢。

74.你需要找到沒有員工的職位。以下哪個查詢是正確的?(選擇最合適的答案)

  1. SELECT employee_id, Job_id 
    FROM employees E
    WHERE exists
    (
    SELECT *
    FROM employees E1
    WHERE E.job_id  = E1.job_id )
  2. SELECT employee_id, Job_id 
    FROM employees E
    WHERE not exists
    (
    SELECT 1
    FROM employees E1
    WHERE E.job_id  = E1.job_id )
  3. SELECT employee_id, Job_id 
    FROM employees E
    WHERE not exists
    (
    SELECT *
    FROM employees E1
    WHERE E.job_id  = E1.job_id )
  4. SELECT employee_id, Job_id 
    FROM employees E
    WHERE exists
    (
    SELECT 1
    FROM employees E1
    WHERE E.job_id  < E1.job_id )

答案:B。NOT EXISTS 是 EXISTS 的否定運算子。

75.你需要從 EMPLOYEES 表中找到第三高的薪水。以下哪個查詢將給出所需的結果?(選擇最合適的答案)

  1. SELECT * 
    FROM employees E
    WHERE salary = (SELECT count(distinct salary ) 
    		FROM employees 
    		WHERE e.salary = salary 
    		); 
  2. SELECT * 
    FROM employees E
    WHERE 1 = (SELECT count(distinct salary ) 
    		FROM employees 
    		WHERE e.salary < salary 
    		); 
  3. SELECT * 
    FROM employees E
    WHERE 2 = (SELECT count(distinct salary ) 
    		FROM employees 
    		WHERE e.salary >salary 
    		); 
  4. SELECT * 
    FROM employees E
    WHERE 3 = (SELECT count(distinct salary ) 
    		FROM employees 
    		WHERE e.salary <= salary 
    		); 

答案:D。

76.你需要使用使用者輸入來獲取 N 的值來查詢最高薪水。以下哪個查詢將給出所需的結果?(選擇最合適的答案)

  1. SELECT salary FROM 
    (
    	SELECT rowid as user_sal 
    	FROM (SELECT distinct salary  from employees ORDER BY salary  desc)
    ) 
    WHERE user_sal=&N ; 
  2. SELECT salary FROM 
    (	
    	SELECT rownum as user_sal
    	FROM (SELECT distinct salary  FROM employees   		GROUP BY salary )
    ) 
    WHERE user_sal <= &N ; 
  3. SELECT salary FROM 
    (
    	SELECT rownum as user_sal, salary 	FROM (SELECT distinct salary  FROM employees 		 ORDER BY salary  desc)
    ) 
    WHERE user_sal=&N ; 
  4. SELECT salary FROM 
    (
    	SELECT max(rownum) as user_sal, salary 	FROM (SELECT distinct salary  FROM employees 		ORDER BY salary  desc)
    ) 
    WHERE user_sal=&N ; 

答案:C。ROWNUM 是用於查詢第 n 個順序結果的偽列。

77.如果在上述查詢(第76題的選項C)中提供給&N變數的值與任何行都不匹配,將會發生什麼?(選擇最佳答案)

  1. 語句將丟擲一個ORA錯誤
  2. 語句將返回表中的所有行
  3. 語句將返回NULL作為輸出結果。
  4. 語句將不返回任何結果行。

答案:D。

78.子查詢可以巢狀的最大級別是多少?

  1. 255
  2. 100
  3. 2
  4. 16

答案:A。

79.關於SQL查詢中EXISTS運算子與子查詢的關係,哪個說法是正確的?

  1. 子查詢中選擇的列很重要
  2. 內部查詢應該返回行,任何結果都很重要,而不是選擇的列。
  3. A 和 B
  4. A和B都不對

答案:B。

80.關於用於子查詢的ANY運算子,哪個說法是正確的?

  1. 返回與列表/子查詢中所有值匹配的行
  2. 返回與列表/子查詢中前5個值匹配的行
  3. 返回與列表/子查詢中任何值匹配的行
  4. 當所有行都與列表/子查詢中的值匹配時,返回0值

答案:C.

81.關於用於子查詢的ALL運算子,哪個說法最準確?(選擇最合適的答案。)

  1. 返回與列表/子查詢中所有值匹配的行
  2. 返回僅與列表/子查詢中某些值匹配的行
  3. 僅當所有值都與列表/子查詢中匹配時才返回行
  4. 以上所有

答案:C. '> ALL' 大於子查詢返回的最高值。'< ALL' 小於子查詢返回的最低值。'< ANY' 小於子查詢返回的最高值。'> ANY' 大於子查詢返回的最低值。'= ANY' 等於子查詢返回的任何值(與IN相同)。'[NOT] EXISTS' 行必須與子查詢中的值匹配。

82.關於在Oracle的INSERT語句中使用子查詢,哪個說法是正確的?

  1. 它們可以在INSERT子句中不受任何限制地使用
  2. 它們只能在INSERT子句中用於數值
  3. 子查詢的SELECT列表應該與INSERT語句的列列表相同。
  4. 以上都不是

答案:C.

查看下錶結構,並回答接下來的第83到86題。

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SQL> DESC departments
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 DEPARTMENT_ID		 NOT NULL NUMBER(4)
 DEPARTMENT_NAME	 NOT NULL VARCHAR2(30)
 MANAGER_ID			  NUMBER(6)
 LOCATION_ID			  NUMBER(4)

83.你需要查詢所有在2013年6月被聘用擔任職位ID為'SA_REP'的員工的詳細資訊。以下哪個查詢將給出所需的結果?(考慮給出的表結構)

  1. SELECT first_name 
    FROM employees 
    WHERE employee_id  =
    (	SELECT employee_id 
    	FROM employees 
    	WHERE to_char(hiredate, 'MM/YYYY')= '02/1981'
    	AND job_id  = 'SA_REP'
    ); 
  2. SELECT first_name 
    FROM employees 
    WHERE employee_id  = ANY
    (	SELECT employee_id 
    	FROM employees 
    	WHERE to_char(hiredate, 'MM/YYYY')= '02/1981'
    	AND job_id  = 'SA_REP'
    ); 
  3. SELECT first_name 
    FROM employees 
    WHERE employee_id  ANY
    (	SELECT employee_id 
    	FROM employees 
    	WHERE to_char(hiredate, 'MM/YYYY')= '02/1981'
    	AND job_id  = 'SA_REP'
    ); 
  4. SELECT first_name 
    FROM employees 
    WHERE employee_id  exists
    (	SELECT employee_id 
    	FROM employees 
    	WHERE to_char(hiredate, 'MM/YYYY')= '02/1981'
    	AND job_id  = 'SA_REP'
    ); 

答案:B。

84.以下哪些語句是等價的?

  1. SELECT employee_id , salary
    FROM employees 
    WHERE salary < ALL (SELECT salary FROM employees WHERE department_id=100); 
  2. SELECT employee_id , salary
    FROM employees WHERE salary < (SELECT min(salary) FROM employees WHERE department_id=100); 
  3. SELECT employee_id 
    FROM employees 
    WHERE salary not >= ANY (SELECT salary FROM employees WHERE department_id=100); 
  4. 以上都不是

答案:A,B。

85.考慮以下兩個查詢

查詢1
SELECT first_name 
FROM employees e join departments d
ON e.department_id  = d.department_id
WHERE department_name='ACCOUNTS'; 
查詢2
SELECT first_name 
FROM employees  e 
WHERE department_id  = ANY (SELECT department_id 		FROM departments d 
		WHERE department_name='ACCOUNTS'); 

關於這兩個語句,可以說什麼?

  1. 兩個查詢都應該生成相同的結果。
  2. 兩個查詢都將丟擲錯誤。
  3. 如果有兩個部門名稱相同,則兩個查詢都將失敗。
  4. 即使存在多個名為'ACCOUNTS'的部門,兩個查詢也將成功執行。

答案:A、D。

86.你需要顯示部門100中擁有最高工資的所有員工。你執行以下查詢。

 
SELECT E.first_name, E.last_name , E.salary
FROM employees E
WHERE E.salary > ALL (SELECT E1.salary
      FROM employees E1
      WHERE E.department_id  =E1.department_id 
      AND E.department_id  = 100); 

上述查詢的結果是什麼?

  1. 它成功執行並給出所需的結果
  2. 它成功執行,但沒有給出所需的輸出
  3. 執行時會丟擲ORA錯誤
  4. 當>ALL被替換為>=ALL時,它成功執行並給出所需的結果

答案:B, D. >ALL不會給出所需的結果,因為可能有兩名員工擁有相同的工資,並且是部門100中收入最高的員工

考慮展品中顯示的表結構,並回答接下來的第87到89題

Table EMPLOYEES Table DEPARTMENTS

87.你需要按反向字母順序獲取部門ID = 100中所有員工的姓名(firstName),並且這些員工在職位ID = 'SA_REP'中擁有最高工資。以下哪個查詢將給出所需的輸出?(選擇最合適的輸出)

  1. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary =
    		(SELECT max(salary)
    		FROM employees E1
    		WHERE E1.department_id  = 100
    		GROUP BY job_id )
    AND job_id  = 'SA_REP'
    ORDER BY first_name; 
  2. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary in
    		(SELECT max(salary)
    		FROM employees E1
    		where E1.department_id  = 100)
    ORDER BY first_name; 
  3. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary IN
    		(SELECT max(salary)
    		FROM employees E1
    		where job_id  = 'SA_REP'
    		GROUP BY job_id )
    AND WHERE E.department_id  = 100
    ORDER BY first_name desc; 
  4. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary IN
    		(SELECT max(salary)
    		FROM employees E1
    		WHERE E1.department_id  = 100
    		GROUP BY job_id )
    ORDER BY first_name ; 

答案:C.

88.在上文中給出的查詢中(選項C是正確的答案),你需要顯示所有職位ID為'SA_REP'並且在部門100中擁有最高工資的員工。以下哪個查詢將給出所需的輸出?

  1. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary IN
    		(SELECT max(salary)
    		FROM employees E1
    		WHERE E1.department_id  = 100
    		GROUP BY job_id )
    AND job_id  = 'SA_REP'
    ORDER BY first_name; 
  2. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary in
    		(SELECT max(salary)
    		FROM employees E1
    		WHERE E1.department_id  = 100)
    ORDER BY first_name; 
  3. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary in
    		(SELECT max(salary)
    		FROM employees E1
    		WHERE job_id  = 'SA_REP'
    		GROUP BY job_id )
    And WHERE E.department_id  = 100
    ORDER BY first_name desc; 
  4. SELECT E.first_name, job_id , salary
    FROM employees E
    WHERE salary in
    		(SELECT max(salary)
    		FROM employees E1
    		WHERE E1.department_id  = 100
    		GROUP BY job_id )
    ORDER BY first_name ; 

答案:A。

89.選擇一個查詢,該查詢將提供最高工資和最高佣金百分比。如果最高薪員工獲得最高佣金百分比,則該查詢還應提供支付的最高佣金百分比。

  1. SELECT employee_id, max(salary), max(commission_pct )
    FROM employees E
    GROUP BY salary, commission_pct ; 
  2. SELECT employee_id, max(salary), max(commission_pct )
    FROM employees E
    GROUP BY salary; 
  3. SELECT employee_id, max(salary)
    FROM employees E
    GROUP BY salary, commission_pct 
    HAVING max(commission_pct ) = 100; 
  4. SELECT employee_id,
    (SELECT max(salary) FROM employees) * (SELECT max(commission_pct ) FROM employees)
    FROM DUAL; 

答案:D。單行子查詢也可以巢狀在外層查詢的 SELECT 子句中。在這種情況下,子查詢返回的值可用於外層查詢生成的每一行輸出。通常,此技術用於使用子查詢生成的數值執行計算。

90.關於在SQL語句的SELECT子句中使用的子查詢,哪個說法是正確的?

  1. 這些子查詢在各個方面都與在FROM或WHERE子句中使用的子查詢相同
  2. 這些子查詢必須是單行子查詢
  3. 在編寫此類子查詢時,我們可以使用多行運算子
  4. 以上都不是

答案:B。

91.以下查詢的結果是什麼?(考慮給出的表結構)

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT sysdate,
(SELECT max(salary) FROM employees GROUP BY department_id )
FROM DUAL; 
  1. 它給出系統日期和每個部門的最高工資
  2. 它給出所有部門的最高工資
  3. 它丟擲 ORA 錯誤
  4. 它成功執行,但返回0行

答案:C. 不能在SQL語句的SELECT子句中使用多行子查詢。只能在外部查詢的SELECT子句中巢狀單行子查詢。

檢視給定的表結構。考慮以下查詢,並回答接下來的第92到95題

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT salary
FROM employees
WHERE salary > ALL (10, 20, 30); 

92.以下哪些查詢與上述查詢等效?

  1. SELECT salary
    FROM employees
    WHERE salary >10 or salary > 20 and salary >30; 
  2. SELECT salary
    FROM employees
    WHERE salary <10 and salary < 20 and salary <30; 
  3. SELECT salary
    FROM employees
    WHERE salary >10 and salary > 20 and salary >30; 
  4. SELECT salary
    FROM employees
    WHERE salary >10 and salary > 20 or salary < 30; 

答案:C. 問題以簡化方式顯示了ALL子句,在後面跟著一個列表。

93.如果在上文中查詢中,列表(10,20,30)被子查詢替換,則以下哪個查詢將為部門號100給出所需的輸出?

  1. SELECT E.salary
    FROM employees E
    WHERE E.salary > (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  2. SELECT E.salary
    FROM employees E
    WHERE E.salary >ALL (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  3. SELECT E.salary
    FROM employees E
    WHERE E.salary = (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  4. SELECT E.salary
    FROM employees E
    WHERE E.salary >= (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 

答案:B. 問題以簡化方式顯示了ALL子句,在後面跟著一個子查詢。

94.關於上面的第14題,如果必須將ALL替換為ANY,則以下哪個查詢將是等效的?

  1. SELECT E.salary
    FROM employees E
    WHERE NOT EXISTS (E.salary =ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  2. SELECT E.salary
    FROM employees E
    WHERE E.salary >ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  3. SELECT E.salary
    FROM employees E
    WHERE E.salary =ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  4. SELECT E.salary
    FROM employees E
    WHERE NOT ( E.salary <= ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100)); 

答案:D. 在使用'<= ANY'時使用的NOT運算子用於對子查詢返回的結果進行否定。

95.關於第94題,如果不使用ANY運算子,則以下哪個查詢是正確的?

  1. SELECT E.salary
    FROM employees E
    WHERE NOT EXISTS (E.salary = ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  2. SELECT E.salary
    FROM employees E
    WHERE NOT EXISTS (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100
    And E.salary <= E1.salary); 
  3. A或B
  4. 以上都不是

答案:B. 相關子查詢引用外部查詢中的列,併為外部查詢中的每一行執行一次子查詢;EXISTS運算子用於測試是否存在關係或連結。非相關子查詢先執行子查詢,然後將值傳遞給外部查詢。

檢視給定的表結構。考慮以下查詢,並回答接下來的第96到98題

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT salary
FROM employees
WHERE salary > ANY (10, 20, 30); 

96.以下哪些查詢與上述查詢等效?

  1. SELECT salary
    FROM employees
    WHERE salary >10 or salary > 20 and or >30; 
  2. SELECT salary
    FROM employees
    WHERE salary <10 and salary < 20 and salary <30; 
  3. SELECT salary
    FROM employees
    WHERE salary >10 and salary > 20 or salary >30; 
  4. SELECT salary
    FROM employees
    WHERE salary >10 and salary > 20 or salary < 30; 

答案:A. 問題以簡化方式顯示了ANY子句,在後面跟著一個列表。

97.在上文中查詢中,如果列表(10, 20, 30)被子查詢替換,則以下哪個查詢將為部門號100給出所需的輸出?

  1. SELECT E.salary
    FROM employees E
    WHERE E.salary > (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  2. SELECT E.salary
    FROM employees E
    WHERE E.salary >ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  3. SELECT E.salary
    FROM employees E
    WHERE E.salary = (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  4. SELECT E.salary
    FROM employees E
    WHERE E.salary >= (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 

答案:B. 問題以簡化方式顯示了ANY子句,在後面跟著一個子查詢。

98.關於上面的第97題,如果刪除ANY,則以下哪個查詢將是等效的?

  1. SELECT E.salary
    FROM employees E
    WHERE NOT EXISTS (E.salary =ANY (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 
  2. SELECT E.salary
    FROM employees E
    WHERE EXISTS (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100
    And E.salary >E1.salary); 
  3. SELECT E.salary
    FROM employees E
    WHERE EXISTS (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100
    ); 
  4. SELECT E.salary
    FROM employees E
    WHERE IN (SELECT  E1.salary
    FROM employees E1
    WHERE E1.department_id  = 100); 

答案:B. EXISTS運算子可以替代ANY運算子。相關子查詢引用外部查詢中的列,併為外部查詢中的每一行執行一次子查詢;EXISTS運算子用於測試是否存在關係或連結。

99.檢視給定的表結構。如果提到的子查詢返回0行,將生成多少行?

SQL> DESC employees
 Name			 Null?	  Type
 ----------------------- -------- ----------------
 EMPLOYEE_ID		 NOT NULL NUMBER(6)
 FIRST_NAME			  VARCHAR2(20)
 LAST_NAME		 NOT NULL VARCHAR2(25)
 EMAIL			 NOT NULL VARCHAR2(25)
 PHONE_NUMBER			  VARCHAR2(20)
 HIRE_DATE		 NOT NULL DATE
 JOB_ID 		 NOT NULL VARCHAR2(10)
 SALARY 			  NUMBER(8,2)
 COMMISSION_PCT 		  NUMBER(2,2)
 MANAGER_ID			  NUMBER(6)
 DEPARTMENT_ID			  NUMBER(4)
SELECT E.salary
FROM employees E
WHERE E.salary > ANY ( select E1.salary FROM employees E1 where E1.department_id  = 100); 
  1. 1行
  2. 0行
  3. A或B
  4. 以上都不是

答案:B. 如果子查詢返回零行,則'> ANY'條件將評估為FALSE,因此不返回任何行。

100.如果滿足以下哪個條件,則必須將子查詢放在外部查詢的HAVING子句中?

  1. 內部查詢需要引用返回給外部查詢的值。
  2. 內部查詢返回的值需要與外部查詢中的分組資料進行比較。
  3. 子查詢返回多個值給外部查詢。
  4. 以上都不對。子查詢不能用於外部查詢的HAVING子句中。

答案:B. 當需要根據某些條件限制查詢的組結果時,使用HAVING子句。如果子查詢的結果必須與組函式進行比較,則必須將內部查詢巢狀在外部查詢的HAVING子句中。

廣告