1. 程式人生 > 其它 >MySQL-sql99-子查詢-列子查詢、行子查詢

MySQL-sql99-子查詢-列子查詢、行子查詢

列子查詢(多行子查詢)

案例:返回location_id是1400或1700的部門中所有員工姓名

# ①查詢location_id是1400或1700的部門編號
SELECT `department_id`
FROM `departments`
WHERE `location_id` IN(1400,1700);

是1列多行

滿足列子查詢

# ②查詢員工姓名,要求部門號是①列表中的某一個
SELECT `last_name`
FROM `employees`
WHERE `department_id` IN (
	SELECT `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';

# ②查詢員工號、姓名、job_id以及salary salary<any(①)
SELECT `last_name`,`employee_id`,`job_id`,`salary`
FROM `employees`
WHERE `salary`<ANY(
	SELECT DISTINCT `salary`
	FROM `employees`
	WHERE `job_id`='IT_PROG')
AND job_id<>'IT_PROG';

也可以用max()來代替any()

# ①查詢job_id為'IT_PROG'部門任一工資
SELECT DISTINCT `salary`
FROM `employees`
WHERE `job_id`='IT_PROG';

# ②查詢員工號、姓名、job_id以及salary salary<any(①)
SELECT `last_name`,`employee_id`,`job_id`,`salary`
FROM `employees`
WHERE `salary`<(
	SELECT MAX(`salary`)
	FROM `employees`
	WHERE `job_id`='IT_PROG')
AND job_id<>'IT_PROG';

結果還是一樣的

返回其它部門中比job_id為'IT_PROG'部門所有工資部低的員工的員工號、姓名、job_id 以及salary

#返回其它部門中比job_id為'IT_PROG'部門所有工資部低的員工的員工號、姓名、job_id 以及salary
#① 先查詢job_id為'IT_PROG'部門的所有工資
SELECT DISTINCT `salary`
FROM `employees`
WHERE `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';


或者換成min(salary)

#① 先查詢job_id為'IT_PROG'部門的所有工資
SELECT DISTINCT `salary`
FROM `employees`
WHERE `job_id`='IT_PROG';

#② 查詢員工的員工號、姓名、job_id 以及salary,並且工資比①中都低
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';

同樣的效果

其中第一個案例

案例:返回location_id是1400或1700的部門中所有員工姓名

# 案例:返回location_id是1400或1700的部門中所有員工姓名
SELECT `last_name`
FROM `employees`
WHERE `department_id` in (
	SELECT `department_id`
	FROM `departments`
	WHERE `location_id` IN(1400,1700)
);

程式碼是上面的 也可以用any代替in

# 案例:返回location_id是1400或1700的部門中所有員工姓名
SELECT `last_name`
FROM `employees`
WHERE `department_id` =ANY (
	SELECT `department_id`
	FROM `departments`
	WHERE `location_id` IN(1400,1700)
);

效果是一樣的

行子查詢(結果集一行多列或多行多列)

引入

案例:查詢員工編號最小並且工資最高的員工資訊

#①查詢最小的員工編號
SELECT MIN(`employee_id`)
FROM `employees`;

#查詢最高工資
SELECT MAX(`salary`)
FROM `employees`;

#查詢員工資訊
SELECT *
FROM `employees`
WHERE `employee_id`=(
	SELECT MIN(`employee_id`)
	FROM `employees`
)
AND `salary`=(
	SELECT MAX(`salary`)
	FROM `employees`
)

行子查詢是有條件的 當篩選條件全部都是等於的情況時候 用行子查詢

select *
from `employees`
where (`employee_id`,`salary`)=
(
select min(`employee_id`),max(`salary`)
from `employees`
);