SQLite - 子查詢:初學者指南
你好,有抱負的程式設計師們!今天,我們將踏上一段令人興奮的旅程,探索 SQLite 子查詢的世界。別擔心你對編程還是新手——我將成為你友善的導遊,一步步為你解釋一切。我們一起來看看吧!
什麼是子查詢?
在我們深入細節之前,讓我們先了解子查詢是什麼。想像你正在計劃一個派對,並需要製作一個賓客名單。你可能會先列出一個所有朋友的名單,然後再篩選出那些住得近的人。在 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