1. 程式人生 > 遊戲 >505最新ARPG《迷失之刃》中字戰鬥預告片曝光

505最新ARPG《迷失之刃》中字戰鬥預告片曝光

4 子查詢

#誰的工資比ABEL高
#方式一
SELECT salary
FROM employees
WHERE last_name='Abel';
#獲得Abel的工資為11000
SELECT last_name,salary
FROM employees
WHERE salary>11000;
#方式二
SELECT e1.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.salary>e2.salary
AND e2.last_name = 'ABEL';
#方式三——子查詢
SELECT last_name,salary
FROM employees
WHERE salary>(SELECT salary
              FROM employees
              WHERE last_name='Abel');

4.1 規定

  • 外層的成為外查詢(主查詢)
  • 內層的稱為內查詢(子查詢)
  • 子查詢在主查詢之前執行,結果被主查詢使用
  • 將子查詢寫在比較條件的右側

4.2 子查詢的分類

4.2.1 單行子查詢和多行子查詢
  • 子查詢分為單行子查詢和多行子查詢
  • 子查詢計算出一個結果由主查詢使用,則成為單行子查詢
  • 子查詢計算出多個結果由主查詢使用,則成為多行子查詢
4.2.1.1 單行子查詢的比較符
  • 基本只使用'>'、'>='、'='、'<'、'<='、'<>'
#查詢工資大於149號員工的員工資訊
SELECT employee_id,last_name,salary
FROM employees
WHERE salary>(SELECT salary
             FROM employees
             WHERE department_id =149);
#題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id和工資
SELECT last_name,job_id,salary
FROM employees
WHERE job_id =(SELECT job_id
              FROM employees
              WHERE empolyee_id = 141)
AND salary>(SELECT salary
              FROM employees
              WHERE empolyee_id = 143);
4.2.1.2 HAVING子查詢
#查詢最低工資大於50好部門最低工資的部門ID和其最低工資
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(SELECT MIN(salary)
                   FROM employees
                   WHERE department_id =50
                   );
4.2.1.3 CASE子查詢
#題目:顯式員工的employee_id,last_name和location。其中,若員工department id與location_id為1800的department_id相同,則location為' canada',其餘則為'USA'。
SELECT employee_id,last_name,CASE department_id WHEN (SELECT department_id
                                                      FROM departments
                                                      WHERE location_id = 1800) 
THEN 'Canana'
ELSE 'USA' END
FROM employees
4.2.1.4 子查詢空值問題
  • 如果子查詢結果是空值,則外查詢也是控制

4.2.1.5 非法子查詢
  • Subquery returns more than 1 row
  • 在單行查詢中,子查詢返回了超過1行的資料
4.2.1.6 多行子查詢
  • 多行子查詢使用的操作符
操作符 含義
IN 等於列表中的任意一個
ANY 需要和單行比較操作符一起使用,和子查詢返回的某一個值比較
ALL 需要和單行比較操作符一起使用,和子查詢返回的所有值比較
SOME 實際上是ANY的別名,作用相同,一般常使用ANY
#題目:返回其它job id中比job id為'IT_PROG'部門任一工資低的員工的員工號、姓名、job_ id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id <>'IT_PROG'
AND salary < ANY (SELECT salary
                 FROM employees
                 WHERE job_id ='IT_PROG');
               
#題目:返回其它job id中比job id為'IT_PROG'部門所有工資低的員工的員工號、姓名、job_ id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id <>'IT_PROG'
AND salary < ALL (SELECT salary
                 FROM employees
                 WHERE job_id ='IT_PROG');
#查詢平均工資最低的部門ID
#方法一
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 0,1;
#方法二
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) =(
						SELECT MIN(min_salary)
						FROM (
									SELECT department_id,AVG(salary) min_salary
									FROM employees
									GROUP BY department_id
									)	able_dept	
								);

#將子查詢作為表返回時,必須給表起一個名字
#聚合函式不能巢狀聚合函式
#將聚合函式的結果作為一個表時,則可以進行巢狀。
#方法三
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL(
						SELECT department_id,AVG(salary) min_salary
						FROM employees
						GROUP BY department_id
						)	
#只要小於等於所有的平均值,則自身為最小。								
4.2.2 相關子查詢和不相關子查詢
  • 子查詢返回的結果不因主查詢的內容而改變,則成為不相關子查詢
  • 需要將外查詢的資訊傳入內查詢
#相關子查詢的需求:查詢工資大於本部門平均工資的員工資訊
SELECT last_name,department_id
FROM employees e1
WHERE salary> (SELECT AVG(salary)
               FROM employees e2
               WHERE e2department_id =e1.department_id
              )
#方法2
SELECT last_name,e1.department_id
FROM employees e1,(SELECT department_id,AVG(salary) avg_salary
                  FROM employees
                  GROUP BY department_id) table_department_avg_salary
WHERE e1.department_id =table_department_avg_salary.department_id
AND e1.salary>table_department_avg_salary.avg_salary

4.3 結論

  • 出了GROUP BY和LIMIT中其他都可以宣告子查詢。