SQL 查詢詳解:連接查詢、子查詢和聚合函數(shù)
作為 SQL 數(shù)據(jù)庫的核心功能,連接查詢、子查詢以及聚合函數(shù)在實際開發(fā)中有著廣泛的應用。本文將詳細介紹這些查詢方式,并通過具體的示例幫助讀者更好地理解和應用。
連接查詢
連接查詢是從多個表中選擇數(shù)據(jù)的方式,通常使用外鍵來關(guān)聯(lián)表。常見的連接方式有 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN。
1.INNER JOIN (內(nèi)連接)
INNER JOIN 返回兩個表中滿足連接條件的所有行。如果沒有匹配的行,則不會返回結(jié)果。
示例代碼:
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
在上述例子中,我們從employees表和departments表中選擇名稱,并使用department_id進行連接。
2.LEFT JOIN (左外連接)
LEFT JOIN 返回左表中的所有行,即使右表中沒有匹配的記錄。如果右表中沒有匹配的記錄,會以 NULL 值表示。
示例代碼:
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
該查詢返回所有員工及其對應的部門,如果某個員工沒有部門,則部門名稱會顯示為 NULL。
3.RIGHT JOIN (右外連接)
RIGHT JOIN 返回右表中的所有行,即使左表中沒有匹配的記錄。如果左表中沒有匹配的記錄,會以 NULL 值表示。
示例代碼:
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
這個查詢返回所有部門及其對應的員工,如果某個部門沒有員工,則員工名稱會顯示為 NULL。
4.FULL OUTER JOIN (全外連接)
FULL OUTER JOIN 返回兩個表中的所有行,不論是否有匹配記錄。如果沒有匹配的記錄,會以 NULL 值表示。
示例代碼:
SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments
ON employees.department_id = departments.id;
該查詢返回所有員工及所有部門,即使沒有匹配的記錄。
子查詢
子查詢是嵌套在其它查詢中的查詢,分為嵌套查詢和相關(guān)子查詢。
1.嵌套查詢
將一個查詢的結(jié)果作為另一個查詢的條件,子查詢作為外部查詢的一部分并先于外部查詢執(zhí)行。
示例代碼:
SELECT name
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
WHERE name = 'Sales'
);
上述查詢選擇所有在"Sales"部門工作的員工。
2.相關(guān)子查詢
子查詢中的條件引用了外層查詢的列,相關(guān)子查詢依賴于外部查詢,每次執(zhí)行外部查詢時都會執(zhí)行一次子查詢。
示例代碼:
SELECT name, salary
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);
這條查詢選擇所有薪資高于其部門平均薪資的員工。
3.子查詢的優(yōu)化
- 使用適當?shù)乃饕捍_保在相關(guān)列上有適當?shù)乃饕?/li>
- 簡化子查詢:將復雜的子查詢簡化為視圖或臨時表。
- 避免SELECT:只選擇必須的列以減少數(shù)據(jù)傳輸量。
聚合函數(shù)
聚合函數(shù)用于對結(jié)果集中的值進行計算,如 COUNT、SUM、AVG、MAX 和 MIN。
1.COUNT
COUNT 函數(shù)返回結(jié)果集中的行數(shù)。
示例代碼:
SELECT COUNT(*)
FROM employees;
這條查詢返回員工表中的總行數(shù)。
2.SUM
SUM 函數(shù)返回數(shù)值列的總和。
示例代碼:
SELECT SUM(salary)
FROM employees;
這條查詢返回所有員工薪資的總和。
3.AVG
AVG 函數(shù)返回數(shù)值列的平均值。
示例代碼:
SELECT AVG(salary)
FROM employees;
這條查詢返回所有員工薪資的平均值。
4.MAX
MAX 函數(shù)返回數(shù)值列的最大值。
示例代碼:
SELECT MAX(salary)
FROM employees;
這條查詢返回員工中的最高薪資。
5.MIN
MIN 函數(shù)返回數(shù)值列的最小值。
示例代碼:
SELECT MIN(salary)
FROM employees;
這條查詢返回員工中的最低薪資。
6.GROUP BY
GROUP BY 語句用于根據(jù)一個或多個列對結(jié)果集進行分組,并對每個分組應用聚合函數(shù)。
示例代碼:
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id;
這條查詢返回每個部門的員工人數(shù)。
結(jié)語
本文詳細介紹了 SQL 中的連接查詢、子查詢以及聚合函數(shù)的使用方法和應用場景。通過這些知識,您可以更有效地查詢和管理數(shù)據(jù)庫數(shù)據(jù)。在實際應用中,合理使用和優(yōu)化這些查詢方法,可以大大提高數(shù)據(jù)庫操作的性能和效率。