505最新ARPG《迷失之刃》中字戰鬥預告片曝光
阿新 • • 發佈:2021-12-16
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中其他都可以宣告子查詢。