細枝末節
1. 子查詢又叫内查詢,是出現在其他語句中的SELECT語句
2. 與子查詢對應的是主查詢,又叫外查詢
3. 子查詢一般放在小括号中
4. 子查詢一般放在條件右側
5. 标量子查詢一般搭配單行操作符:>,<,>=,<=,=,<>
6. 列子查詢一般搭配多行操作符:IN,ANY/SOME,ALL
7. 子查詢的執行優先于主查詢執行,主查詢的條件用到了子查詢的結果
分類
按結果集的行列數
1. 标量子查詢: 結果集為一行一列
2. 列子查詢: 結果集為一列多行
3. 行子查詢: 結果集為一行多列
4. 表子查詢: 結果集為多行多列
按子查詢出現位置
1. SELECT後面: 支援标量子查詢
2. FROM後面: 支援表子查詢
3. WHEREE或HAVING後面: 支援标量子查詢,列子查詢,行子查詢
4. EXISTS後面: 支援表子查詢
WHERE或HAVING後面
支援标量子查詢,列子查詢,行子查詢
示例
查詢工資比Abel高的員工資訊
/* 1. 查詢Abel的工資 */
SELECT salary
FROM emp
WHERE name = 'Abel';
/* 2. 查詢salary>1中結果的員工資訊 */
SELECT *
WHERE salary > (
SELECT salary
FROM emp
WHERE name = 'Abel'
);
查詢最低工資大于50号部門最低工資的部門id及其最低工資
/* 1. 查詢50号部門的最低工資 */
SELECT MIN(salary)
WHERE dept_id = 50;
/* 2. 查詢每個部門的最低工資 */
SELECT MIN(salary), dept_id
GOURP BY dept_id;
/* 3. 在2的結果集上進行篩選,滿足MIN(salary)>1中結果 */
SELECT dept_id, MIN(salary)
GROUP BY dept_id
HAVING MIN(salary) > (
SELECT MIN(salary)
WHERE dept_id = 50
列子查詢(多行子查詢)
查詢location_id是1400或1700的部門的所有員工姓名
/* 1. 查詢location_id是1400或1700的部門 */
SELECT id
FROM dept
WHERE loc_id IN(1400, 1700);
/* 2. 在1的結果中查詢所有員工姓名 */
SELECT name
WHERE dept_id IN(
SELECT id
FROM dept
WHERE loc_id IN(1400, 1700)
EXISTS後面
格式
/* 子查詢有元素,結果為1;子查詢無元素,結果為0 */
EXISTS(子查詢)
查詢有員工的部門名
WHERE EXISTS(
SELECT *
WHERE dept.id = emp.dept_id