SQLite - 子查詢:初學者指南

你好,有抱負的程式設計師們!今天,我們將踏上一段令人興奮的旅程,探索 SQLite 子查詢的世界。別擔心你對編程還是新手——我將成為你友善的導遊,一步步為你解釋一切。我們一起來看看吧!

SQLite - Subqueries

什麼是子查詢?

在我們深入細節之前,讓我們先了解子查詢是什麼。想像你正在計劃一個派對,並需要製作一個賓客名單。你可能會先列出一個所有朋友的名單,然後再篩選出那些住得近的人。在 SQL 中,子查詢就像是第二步——一個查詢中的查詢,幫助你精煉結果。

在 SELECT 認句中使用子查詢

讓我們從子查詢最常見的使用方式開始——在 SELECT 認句中。

基本子查詢範例

SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

在這個範例中,我們正在尋找那些薪水高於平均水平的員工。內部查詢 (SELECT AVG(salary) FROM employees) 計算平均薪水,而外部查詢則使用這個結果來篩選員工。

FROM 子句中的子查詢

SELECT department, avg_salary
FROM (
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
) AS dept_salaries
WHERE avg_salary > 50000;

在這裡,我們創建了一個臨時表,列出了每個部門的平均薪水,然後選擇平均薪水超過 50,000 的部門。

在 INSERT 認句中使用子查詢

子查詢也可以用於根據現有信息插入數據。

INSERT INTO high_earners (employee_id, name)
SELECT id, name
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

這個查詢將那些薪水超過平均薪水 1.5 倍的員工插入到 'high_earners' 表中。

在 UPDATE 認句中使用子查詢

根據子查詢更新數據是另一個強大的功能。

UPDATE employees
SET bonus = salary * 0.1
WHERE department_id IN (
SELECT id
FROM departments
WHERE performance_rating > 8
);

這個查詢給那些在高績效評級的部門工作的員工發放 10% 的獎金。

在 DELETE 認句中使用子查詢

最後,讓我們看看子查詢如何幫助我們刪除數據。

DELETE FROM products
WHERE id NOT IN (
SELECT product_id
FROM orders
WHERE order_date > DATE('now', '-1 year')
);

這個查詢刪除那些在過去一年內沒有被訂購的產品。

子查詢方法

這裡是一個總結我們所介紹的不同方法的表格:

方法 描述 範例
SELECT 與子查詢 使用子查詢過濾或為主查詢計算值 SELECT ... WHERE column > (SELECT AVG(...))
FROM 子句中的子查詢 創建一個派生表以供查詢 SELECT ... FROM (SELECT ...) AS derived_table
INSERT 與子查詢 根據子查詢插入數據 INSERT INTO ... SELECT ... WHERE ...
UPDATE 與子查詢 根據子查詢更新數據 UPDATE ... SET ... WHERE column IN (SELECT ...)
DELETE 與子查詢 根據子查詢刪除數據 DELETE FROM ... WHERE column NOT IN (SELECT ...)

結論

恭喜你!你剛剛踏入了 SQLite 子查詢的世界。記住,就像學習騎自行車一樣,掌握子查詢需要練習。如果一開始不能立即理解,不要氣餒——繼續嘗試不同的查詢,很快你就能輕鬆地編寫複雜的子查詢。

當我們結束這個話題時,這裡有一個來自我教學經驗的小故事:我曾經有一個學生在子查詢上遇到了困難。她將子查詢比作俄羅斯套娃——查詢中的查詢。這個比喻幫助她形象化這個概念,很快她就成為了班上寫子查詢最擅長的人之一。

所以,無論你將子查詢看作是套娃,還是看作是一場寶藏尋找遊戲,每個查詢都會讓你更接近獎品,請繼續練習和探索。數據的世界是廣闊而令人興奮的,而子查詢是打開其秘密的關鍵!

快樂查詢,並記住——在數據庫的世界裡,好奇心是你的最佳朋友。繼續提問,你將會找到答案!

Credits: Image by storyset