SQL教學
SQL RDBMS概念
SQL簡介
SQL NOT NULL約束
SQL DEFAULT約束
SQL唯一約束
SQL主鍵
SQL外鍵
SQL CHECK約束
SQL示例數據庫
SQL索引約束
SQL NULL值
數據庫 - 第一範式(1NF)
數據庫 - 第二範式(2NF)
數據庫 - 第三範式(3NF)
SQL RDBMS數據庫
SQL語法
SQL數據類型
SQL操運算符
SQL算術運算符
SQL比較運算符
SQL邏輯運算符
SQL表達式
SQL創建數據庫(CREATE DATABASE)
SQL丟棄或刪除數據庫(DROP DATABASE)
SQL選擇數據庫(SELECT Database, USE語句)
SQL創建表(CREATE Table)
SQL從現有表創建表
SQL刪除表(DROP或DELETE Table)
SQL INSERT INTO插入查詢
SQL SELECT查詢語句
SQL WHERE子句
SQL AND和OR運算符
SQL UPDATE更新查詢
SQL DELETE刪除查詢
SQL LIKE子句
SQL TOP,LIMIT,ROWNUM子句
SQL ORDER BY排序子句
SQL GROUP BY(分組)
SQL Distinct關鍵字
SQL排序結果
SQL約束
SQL Join聯接
SQL INNER JOIN(內部連接)
SQL LEFT JOIN(左連接)
SQL RIGHT JOIN(右連接)
SQL FULL JOIN(全連接)
SQL自連接
SQL笛卡爾或交叉連接
SQL UNION子句/操作符
SQL INTERSECT子句
SQL EXCEPT子句
SQL別名語法
SQL索引
SQL ALTER TABLE(修改表)
SQL TRUNCATE TABLE(截斷表)
SQL View(視圖)
SQL Having子句
SQL事務
SQL通配符運算符
SQL日期函數
SQL ADDDATE()函數
SQL ADDTIME()函數
SQL CONVERT_TZ()函數
SQL CURDATE()函數
SQL CURRENT_DATE()函數
SQL CURTIME()函數
SQL CURRENT_TIME()函數
SQL CURRENT_TIMESTAMP()方法
SQL DATE(expr)函數
SQL DATEDIFF()方法
SQL DATE_ADD()和DATE_SUB()方法
SQL DATE_FORMAT()函數
SQL DATE_SUB()方法
SQL DAY()函數
SQL DAYNAME()函數
SQL DAYOFMONTH()函數
SQL DAYOFWEEK()函數
SQL DAYOFYEAR()函數
SQL EXTRACT()函數
SQL FROM_DAYS()函數
SQL FROM_UNIXTIME()函數
SQL HOUR()方法
SQL LAST_DAY()函數
SQL LOCALTIME和LOCALTIME()函數
SQL LOCALTIMESTAMP和LOCALTIMESTAMP()函數
SQL MAKEDATE()函數
SQL MAKETIME()函數
SQL MICROSECOND()函數
SQL MINUTE()函數
SQL MONTH()函數
SQL MONTHNAME()函數
SQL NOW()函數
SQL PERIOD_ADD()函數
SQL PERIOD_DIFF()函數
SQL QUARTER()函數
SQL SECOND()函數
SQL SEC_TO_TIME()函數
SQL STR_TO_DATE()函數
SQL SUBDATE()函數
SQL SUBTIME()函數
SQL SYSDATE()函數
SQL TIME()函數
SQL TIMEDIFF()函數
SQL TIMESTAMP()函數
SQL TIMESTAMPADD()函數
SQL TIMESTAMPDIFF()函數
SQL TIME_FORMAT()函數
SQL TIME_TO_SEC()函數
SQL TO_DAYS()函數
SQL UNIX_TIMESTAMP()函數
SQL UTC_DATE()函數
SQL UTC_TIME()函數
SQL UTC_TIMESTAMP()函數
SQL WEEK()函數
SQL WEEKDAY()函數
SQL WEEKOFYEAR()函數
SQL YEAR()函數
SQL YEARWEEK()函數
SQL臨時表
SQL克隆表
SQL子查詢
SQL使用序列(自動遞增)
SQL DISTINCT重複處理
SQL注入
SQL實用函數
SQL MAX()函數
SQL MIN()函數
SQL AVG()函數
SQL SUM()函數
SQL SQRT()函數
SQL RAND()函數
SQL CONCAT()函數
SQL數值函數
SQL ABS()函數
SQL ACOS()函數
SQL ASIN(X)函數
SQL ATAN(X)函數
SQL ATAN2()函數
SQL BIT_AND()函數
SQL BIT_COUNT()函數
SQL BIT_OR()函數
SQL CEIL()函數
SQL CONV()函數
SQL COS()函數
SQL COT()函數
SQL DEGREES()函數
SQL EXP(X)函數
SQL FLOOR(X)函數
SQL FORMAT(X,D)函數
SQL GREATEST()函數
SQL INTERVAL()函數
SQL LEAST()函數
SQL LOG()函數
SQL LOG10(X)函數
SQL MOD()函數
SQL OCT(N)函數
SQL PI()函數
SQL POW()函數
SQL RADIANS()函數
SQL ROUND()函數
SQL SIGN(X)函數
SQL SIN(X)函數
SQL SQRT(X)函數
SQL STD()函數
SQL TAN(X)函數
SQL TRUNCATE()函數
SQL字符串函數
SQL ASCII(str)函數
SQL BIN(N)函數
SQL BIT_LENGTH()函數
SQL CHAR()函數
SQL CHAR_LENGTH()函數
SQL CHARACTER_LENGTH()函數
SQL字符串CONCAT()函數
SQL CONCAT_WS()函數
SQL CONV(N,from_base,to_base)函數
SQL ELT()函數
SQL EXPORT_SET()函數
SQL FIELD()函數
SQL FIND_IN_SET()函數
SQL FORMAT()函數
SQL HEX()函數
SQL INSERT()函數
SQL INSTR()函數
SQL LCASE()函數
SQL LEFT()函數
SQL LENGTH()函數
SQL LOAD_FILE()函數
SQL LOCATE()函數
SQL LOWER()函數
SQL LPAD()函數
SQL LTRIM()函數
SQL MAKE_SET()函數
SQL MID()函數
SQL OCT()函數
SQL OCTET_LENGTH()函數
SQL ORD()函數
SQL POSITION()函數
SQL QUOTE()函數
SQL REGEXP模式
SQL REPEAT()函數
SQL REPLACE()函數
SQL REVERSE()函數
SQL RIGHT()函數
SQL RPAD()函數
SQL SOUNDEX()函數
SQL SPACE()函數
SQL STRCMP()函數
SQL SUBSTRING()函數
SQL SUBSTRING_INDEX()函數
SQL TRIM()函數
SQL UCASE()函數
SQL UNHEX()函數
SQL UPPER()函數

SQL相關子查詢

在本教程中,您將瞭解SQL相關子查詢,它是使用外部查詢中的值的子查詢。

1. SQL相關子查詢簡介

下面通過一個例子開始。

請參閱示例數據庫中的employees表:

desc employees;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| employee_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| first_name    | varchar(20)  | YES  |     | NULL    |                |
| last_name     | varchar(25)  | NO   |     | NULL    |                |
| email         | varchar(100) | NO   |     | NULL    |                |
| phone_number  | varchar(20)  | YES  |     | NULL    |                |
| hire_date     | date         | NO   |     | NULL    |                |
| job_id        | int(11)      | NO   | MUL | NULL    |                |
| salary        | decimal(8,2) | NO   |     | NULL    |                |
| manager_id    | int(11)      | YES  | MUL | NULL    |                |
| department_id | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
10 rows in set

以下查詢查找薪水大於所有員工平均薪水的員工:

SELECT 
    employee_id, 
    first_name, 
    last_name, 
    salary
FROM
    employees
WHERE
    salary > (SELECT 
            AVG(salary)
        FROM
            employees);

執行上面查詢語句,得到以下結果:

+-------------+------------+-----------+--------+
| employee_id | first_name | last_name | salary |
+-------------+------------+-----------+--------+
|         100 | Steven     | Lee       | 24000  |
|         101 | Neena      | Wong      | 17000  |
|         102 | Lex        | Liang     | 17000  |
|         103 | Alexander  | Lee       | 9000   |
|         108 | Nancy      | Chen      | 12000  |
|         109 | Daniel     | Chen      | 9000   |
|         110 | John       | Chen      | 8200   |
|         114 | Avg        | Su        | 11000  |
|         121 | Max        | Han       | 8200   |
|         145 | John       | Liu       | 14000  |
|         146 | Karen      | Liu       | 13500  |
|         176 | Jonathon   | Yang      | 8600   |
|         177 | Jack       | Yang      | 8400   |
|         201 | Michael    | Zhou      | 13000  |
|         204 | Hermann    | Wu        | 10000  |
|         205 | Shelley    | Wu        | 12000  |
|         206 | William    | Wu        | 8300   |
+-------------+------------+-----------+--------+
17 rows in set

在此示例中,子查詢在WHERE子句中使用。可以從此查詢中看到一些要點:

首先,可以執行子查詢,此子查詢獨立返回所有員工的平均工資。

SELECT 
    AVG(salary)
FROM
    employees;

其次,數據庫系統只需要對子查詢進行一次評估。

第三,外部查詢使用從子查詢返回的結果。 外部查詢依賴於子查詢的值。 但是,子查詢不依賴於外部查詢。 有時,我們稱這個子查詢是一個普通的子查詢。

與普通子查詢不同,相關子查詢是使用外部查詢中的值的子查詢。 此外,可以針對外部查詢選擇的每一行評估相關子查詢一次。 因此,使用相關子查詢的查詢可能很慢。

相關子查詢也稱爲重複子查詢或同步子查詢。

2. SQL相關的子查詢示例

讓我們看一下相關子查詢的一些例子,以便更好地理解它們。

2.1. WHERE子句示例中的SQL相關子查詢

以下查詢查找薪水高於其部門員工平均薪水的所有員工:

SELECT 
    employee_id,first_name,last_name,salary,department_id
FROM
    employees e
WHERE
    salary > (SELECT 
            AVG(salary)
        FROM
            employees
        WHERE
            department_id = e.department_id)
ORDER BY 
    department_id ,  first_name , last_name;

執行上面查詢語句,得到以下結果:

SQL相關子查詢

在此示例中,外部查詢是:

SELECT 
    employee_id, 
    first_name, 
    last_name, 
    salary, 
    department_id
FROM
    employees e
WHERE
    salary >
...

相關子查詢是:

SELECT
    AVG( list_price )
FROM
    products
WHERE
    category_id = p.category_id

對於每個員工,數據庫系統必須執行一次相關子查詢,以計算當前員工部門中員工的平均工資。

2.2. SELECT子句示例中的SQL相關子查詢

以下查詢返回員工及其部門中所有員工的平均薪水:

SELECT 
    employee_id,
    first_name,
    last_name,
    department_name,
    salary,
    (SELECT 
            ROUND(AVG(salary),0)
        FROM
            employees
        WHERE
            department_id = e.department_id) avg_salary_in_department
FROM
    employees e
        INNER JOIN
    departments d ON d.department_id = e.department_id
ORDER BY 
    department_name, 
    first_name, 
    last_name;

執行上面查詢語句,得到以下結果:

+-------------+------------+-----------+-----------------+--------+--------------------------+
| employee_id | first_name | last_name | department_name | salary | avg_salary_in_department |
+-------------+------------+-----------+-----------------+--------+--------------------------+
|         103 | Alexander  | Lee       | IT              | 9000   | 5760                     |
|         104 | Bruce      | Wong      | IT              | 6000   | 5760                     |
|         105 | David      | Liang     | IT              | 4800   | 5760                     |
|         107 | Diana      | Chen      | IT              | 4200   | 5760                     |
|         106 | Valli      | Chen      | IT              | 4800   | 5760                     |
|         203 | Susan      | Zhou      | 人力資源        | 6500   | 6500                     |
|         205 | Shelley    | Wu        | 會計            | 12000  | 10150                    |
... ...
|         119 | Karen      | Zhang     | 採購            | 2500   | 4150                     |
|         116 | Shelli     | Zhang     | 採購            | 2900   | 4150                     |
|         117 | Sigal      | Zhang     | 採購            | 2800   | 4150                     |
|         179 | Charles    | Yang      | 銷售            | 6200   | 9617                     |
|         177 | Jack       | Yang      | 銷售            | 8400   | 9617                     |
|         145 | John       | Liu       | 銷售            | 14000  | 9617                     |
|         176 | Jonathon   | Yang      | 銷售            | 8600   | 9617                     |
|         146 | Karen      | Liu       | 銷售            | 13500  | 9617                     |
|         178 | Kimberely  | Yang      | 銷售            | 7000   | 9617                     |
+-------------+------------+-----------+-----------------+--------+--------------------------+
40 rows in set

對於每個員工,數據庫系統必須執行一次相關子查詢,以計算員工部門的平均工資。

2.3. SQL將子查詢與EXISTS運算符示例相關聯

經常使用與EXISTS運算符相關的子查詢。 例如,以下查詢返回沒有依賴項的所有員工:

SELECT 
    employee_id, first_name, last_name
FROM
    employees e
WHERE
    NOT EXISTS( SELECT 
            *
        FROM
            dependents d
        WHERE
            d.employee_id = e.employee_id)
ORDER BY first_name , last_name;

執行上面查詢語句,得到以下結果:
SQL相關子查詢

在本教程中,您瞭解了SQL相關子查詢以及如何將其應用於形成複雜查詢。