天天看點

Mysql學習筆記09——子查詢細枝末節分類

細枝末節

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

繼續閱讀