SQL 子查詢

摘要:在本教程中,您將學習如何使用 SQL 子查詢來構建靈活的查詢,以從資料庫中檢索資料。

SQL 子查詢簡介 #

子查詢是巢狀在另一個 查詢 中的 SQL 查詢。包含子查詢的查詢稱為外部查詢。

要編寫子查詢,您需要對 SELECT 語句有深入的瞭解。

SELECT
  select_list
FROM
  table1
  INNER JOIN table2 ON join_condition
WHERE
  filter_condition;Code language: SQL (Structured Query Language) (sql)

請注意,連線可以是 INNER JOINLEFT JOINRIGHT JOINFULL JOIN

在此語法中:

  • SELECT 子句可以接受單個值,該值可以是列或表示式。
  • FROMINNER JOIN 子句可以接受結果集,例如表。
  • WHERE 子句可以接受單個值,該值可以是列或表示式。

根據每個子句接受的資料形式,您可以嵌入適當的子查詢。

  • SELECT 子句中的子查詢可以返回單個值。
  • FROMINNER JOIN 子句中的子查詢可以返回一個結果集。
  • WHERE 子句中的子查詢可以返回單個值。

WHERE 子句中的 SQL 子查詢 #

我們將使用 HR 示例資料庫中的 employees 表。

SQL Subquery - employees Table

以下語句使用子查詢來查詢薪水最高的員工。

SELECT
  first_name,
  salary
FROM
  employees
WHERE
  salary = (
    SELECT
      MAX(salary)
    FROM
      employees
  );Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name |  salary
------------+----------
 Steven     | 24000.00Code language: SQL (Structured Query Language) (sql)

查詢工作原理:

首先,子查詢從 employees 表的 salary 列返回最高薪水。

SELECT
  MAX(salary)
FROM
  employeesCode language: SQL (Structured Query Language) (sql)

其次,外部查詢使用子查詢返回的值,並返回薪水最高的員工。

以下示例使用子查詢來查詢薪水高於平均薪水的員工。

SELECT
  first_name,
  salary
FROM
  employees
WHERE
  salary > (
    SELECT
      AVG(salary)
    FROM
      employees
  )
ORDER BY
  salary;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name |  salary
------------+----------
 John       |  8200.00
 Adam       |  8200.00
 William    |  8300.00
 Jack       |  8400.00
 Jonathon   |  8600.00
...Code language: SQL (Structured Query Language) (sql)

帶 IN 運算子的 SQL 子查詢 #

如果一個值等於值列表中的任何值,IN 運算子將返回 true。您可以使用子查詢為 IN 運算子返回一個值列表。

IN subqueryCode language: SQL (Structured Query Language) (sql)

例如,以下查詢使用帶有 IN 運算子的子查詢來查詢所有職位名稱與 Sales 相關的員工。

SELECT
  first_name,
  last_name
FROM
  employees
WHERE
  job_id IN (
    SELECT
      job_id
    FROM
      jobs
    WHERE
      job_title LIKE '%Sales%'
  );Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name | last_name
------------+------------
 John       | Russell
 Karen      | Partners
 Jonathon   | Taylor
 Jack       | Livingston
 Kimberely  | Grant
 Charles    | JohnsonCode language: SQL (Structured Query Language) (sql)

查詢工作原理:

首先,子查詢返回職位名稱中包含單詞 "Sales" 的職位 ID 列表。

SELECT
  job_id
FROM
  jobs
WHERE
  job_title LIKE '%Sales%'Code language: SQL (Structured Query Language) (sql)

輸出

 job_id
--------
     15
     16Code language: SQL (Structured Query Language) (sql)

其次,外部查詢選擇 job_id 在職位 ID 列表 (15, 16) 中的員工。

SELECT 子句中的子查詢 #

以下示例在 SELECT 子句中使用子查詢來檢索所有員工的名字、薪水和平均薪水。

SELECT
  first_name,
  salary,
  (
    SELECT
      ROUND(AVG(salary),2) average_salary
    FROM
      employees
  )
FROM
  employees
ORDER BY
  salary;Code language: SQL (Structured Query Language) (sql)

試一試

 first_name  |  salary  | average_salary
-------------+----------+----------------
 Karen       |  2500.00 |        8060.00
 Guy         |  2600.00 |        8060.00
 Irene       |  2700.00 |        8060.00
 Sigal       |  2800.00 |        8060.00
 Shelli      |  2900.00 |        8060.00
...Code language: SQL (Structured Query Language) (sql)

FROM 子句中的子查詢 #

以下示例展示瞭如何在 FROM 子句中使用子查詢。

SELECT
  ROUND(AVG(department_salary), 0) average_department_salary
FROM
  (
    SELECT
      department_id,
      SUM(salary) department_salary
    FROM
      employees
    GROUP BY
      department_id
  );Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 average_department_salary
---------------------------
                     29309Code language: SQL (Structured Query Language) (sql)

它的工作原理如下:

首先,子查詢返回一個結果集,其中包括每個部門的 department_id 和總薪水。

SELECT
  department_id,
  SUM(salary) department_salary
FROM
  employees
GROUP BY
  department_id;Code language: SQL (Structured Query Language) (sql)

其次,外部查詢計算所有部門的平均總薪水,並將其四捨五入到沒有小數位。

INNER JOIN 子句中的子查詢 #

以下示例在外部查詢的 INNER JOIN 子句中使用子查詢,以檢索薪水高於公司平均薪水的員工。

SELECT
  first_name,
  last_name,
  salary,
  s.avg_salary
FROM
  employees e
  INNER JOIN (
    SELECT
      ROUND(AVG(salary), 0) AS avg_salary
    FROM
      employees
  ) s ON e.salary > s.avg_salary
ORDER BY
  salary;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name | last_name  |  salary  | avg_salary
------------+------------+----------+------------
 John       | Chen       |  8200.00 |       8060
 Adam       | Fripp      |  8200.00 |       8060
 William    | Gietz      |  8300.00 |       8060
 Jack       | Livingston |  8400.00 |       8060
 Jonathon   | Taylor     |  8600.00 |       8060
...Code language: SQL (Structured Query Language) (sql)

查詢工作原理:

  • 首先,子查詢計算公司的平均薪水。
  • 其次,外部查詢檢索薪水高於該平均薪水的員工。

摘要 #

  • 子查詢是巢狀在外部查詢中的查詢。
  • 在查詢的 SELECTFROMWHEREINNER JOIN 子句中嵌入適當的子查詢。

測驗 #

資料庫 #

本教程是否有幫助?
© .