SQL - 子查詢

Hello, 動手學習SQL的熱情者們!我很興奮能成為你們在這個充滿刺激的SQL子查詢世界中的引路人。作為一位教導計算機科學多年的老師,我可以告訴你們,子查詢就像是秘製醬汁,能讓你的SQL技能從普通變得卓越。所以,讓我們一起潛入水中,揭開子查詢的神秘面紗吧!

SQL - Sub Queries

SQL 子查詢

子查詢是什麼?

想像一下你在做三明治。麵包是你的主要查詢,但讓它真正美味的則是裡面的填料 - 那就是你的子查詢!在SQL的術語中,子查詢是嵌套在另一個查詢中的查詢。這就像是在一個問題中提問,讓你能夠執行一些可能只用單一查詢無法完成的複雜操作。

讓我們看一個簡單的例子:

SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');

在這個查詢中,括號內的部分就是我们的子查詢。它尋找市場部的department_id,然後外層查詢使用這個結果來找到該部門的所有員工。

需遵循的規則

在我們深入探討之前,讓我們複習一些使用子查詢的重要規則:

  1. 子查詢必須被括號括起。
  2. 子查詢的SELECT子句通常只返回一列,除非主查詢中有多列用於比對。
  3. 子查詢中不能使用ORDER BY命令,儘管主查詢可以使用ORDER BY。
  4. 返回多行的子查詢只能與多值運算符(如IN運算符)一起使用。

下面是一個總結這些規則的便捷表格:

規則 描述
括號 子查詢必須被括號括起
單列 子查詢SELECT通常返回只有一列
無ORDER BY 子查詢中不能使用ORDER BY
多行 返回多行的子查詢使用多值運算符

在SELECT語句中使用子查詢

子查詢最常與SELECT語句一起使用。它們在根據動態條件检索數據時非常強大。讓我們看一個更複雜的例子:

SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

這個查詢選擇所有單價高於所有產品平均單價的產品。子查詢計算平均價格,而主查詢使用這個結果來過濾產品。

這裡還有一個在SELECT子句中使用子查詢的例子:

SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;

這個查詢不僅檢索每個員工的名稱和薪資,還包括每行中的所有員工的平均薪資。這就像為每個員工提供了一份小型報告!

在INSERT語句中使用子查詢

子查詢還可以與INSERT語句一起使用,從另一個表中填充數據到表中。這裡有一個例子:

INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

這個查詢將所有薪資超過平均薪資1.5倍的員工插入到high_salary_employees表中。這就像創建了一個公司高薪員工的VIP名單!

在UPDATE語句中使用子查詢

子查詢可以使你的UPDATE語句更強大。讓我們看一個例子:

UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');

這個查詢將'Electronics'類別中所有產品的價格提高10%。子查詢找到'Electronics'的category_id,然後主查詢使用這個結果來更新正確的產品。

在DELETE語句中使用子查詢

最後,讓我們看看子查詢如何與DELETE語句一起使用:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);

這個查詢刪除所有過去一年內沒有下訂單的客戶的訂單。子查詢找到所有這樣的客戶,然後主查詢刪除他們的訂單。

現在,各位,我們已經穿越了SQL子查詢的領地,從基本概念到更複雜的應用。記住,熟能生巧,所以不要害怕在您自己的數據庫中嘗試這些查詢。

就像我總是告訴我的學生,SQL就像瑞士軍刀一樣 - 而子查詢就是那個能讓你脫困的隱藏刀片。所以請持續探索,持續查詢,最重要的是,持續學習!

Credits: Image by storyset