MySQL數(shù)據(jù)庫:第九章:子查詢
回退至Mysql數(shù)據(jù)庫理論與實(shí)戰(zhàn)
#子查詢
概念:出現(xiàn)在其他語句內(nèi)部的select語句,稱為子查詢或內(nèi)查詢
其他語法:可以是select語句,也可以是create、insert、update等。只是select語句出現(xiàn)的較多
外面如果是select語句,稱為主查詢或外查詢
位置:
子查詢可以放在select語句中的select后面、from后面、where或having后面、exists后面
分類:(放在where或having后面)
單行子查詢:子查詢的結(jié)果只有一行
多行子查詢:子查詢的結(jié)果可以有多行
特點(diǎn):
①子查詢一般需要使用小括號括起來,為了提高閱讀性
②子查詢一般放在條件的右側(cè)
③子查詢優(yōu)先于主查詢執(zhí)行,主查詢使用到了子查詢的結(jié)果
④單行子查詢一般搭配單行操作符使用
單行操作符:> < = <> >= <=
多行子查詢一般搭配多行操作符使用
多行操作符:in/not in、any、all
#一、單行子查詢
注意:
單行子查詢的結(jié)果肯定是一行一列,不能是多行,也不能是空值
#案例1:誰的工資比 Abel 高?
#①查詢Abel的工資
SELECT salary
FROM employees
WHERE last_name = 'Abel'
#②查詢哪個(gè)員工的工資>①
SELECT last_name,salary
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
#案例2:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id 和工資
#①查詢141號員工的job_id
SELECT job_id
FROM employees
WHERE employee_id = 141
#②查詢143號員工的salary
SELECT salary
FROM employees
WHERE employee_id = 143
#③查詢job_id = ① 并且salary>②的員工姓名,job_id 和工資
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
) AND salary>(
SELECT salary
FROM employees
WHERE employee_id = 143
);
#案例3:返回公司工資最少的員工的last_name,job_id和salary
#①查詢最低工資
SELECT MIN(salary)
FROM employees
#②查詢last_name,job_id,salary,要求salary= ①
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
SELECT * FROM employees;
#案例4:查詢最低工資大于50號部門最低工資的部門id和其最低工資
#①查詢50號部門的最低工資
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
#②查詢每個(gè)部門的最低工資,篩選條件:哪個(gè)部門最低工資>①
SELECT MIN(salary) 最低工資,department_id
FROM employees
GROUP BY department_id
HAVING 最低工資>(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
#二、多行子查詢
in/not in:判斷某個(gè)字段是否屬于子查詢結(jié)果的某個(gè)值
any/some:一般搭配條件運(yùn)算符使用 【用的較少】
where sal>any(1,2,3,4) 0.5
all: 一般搭配條件運(yùn)算符使用 【用的較少】
where sal > all(1,2,3,4) 4.5
#題目:返回location_id是1400或1700的部門中的所有員工姓名
#①查詢location_id是1400或1700的部門
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
#②查詢員工姓名,要求:department_id 屬于①列表
SELECT last_name
FROM employees
WHERE department_id IN(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
);
#題目:返回其它部門中比job_id為‘IT_PROG’部門任一工資低的員工的員工號、姓名、job_id 以及salary
#①查詢job_id為‘IT_PROG’部門的工資
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
#②查詢其它部門中salary<any(①)
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ANY(
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#題目:返回其它部門中比job_id為‘IT_PROG’部門所有工資都低的員工 的員工號、姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ALL(
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#等價(jià)于
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<(
SELECT MIN(salary)
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#1. 查詢和 Zlotkey 相同部門的員工姓名和工資
#①查詢Zlotkey的部門
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey'
#②查詢姓名和工資,要求部門號 = ①
SELECT last_name,salary
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey'
);
#2. 查詢工資比公司平均工資高的員工的員工號,姓名和工資。
#①公司平均工資
SELECT AVG(salary)
FROM employees
#②查詢salary>①的員工號,姓名和工資。
SELECT employee_id,last_name,salary
FROM employees
WHERE salary>(
SELECT AVG(salary)
FROM employees
);
#3. 查詢各部門中工資比本部門平均工資高的員工的員工號, 姓名和工資
#①查詢各部門的平均工資
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
#②將①結(jié)果集和employees表進(jìn)行連接查詢,關(guān)聯(lián)條件為老個(gè)表的department_id一致
SELECT employee_id,last_name,salary,e.department_id
FROM employees e
JOIN (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE e.salary > ag_dep.ag;
#6. 查詢管理者是 King 的員工姓名和工資
#①查詢king的員工號
SELECT employee_id
FROM employees
WHERE last_name = 'k_ing'
#②查詢哪個(gè)員工的領(lǐng)導(dǎo)號是①
SELECT last_name,salary
FROM employees
WHERE manager_id IN(
SELECT employee_id
FROM employees
WHERE last_name = 'k_ing'
);