移動端是指手機還是電腦優(yōu)化大師如何刪掉多余的學生
在數(shù)據(jù)處理與分析領域,高級SQL技巧是提升效率與準確性的關鍵。本文將結合參考資料,對高級SQL技巧進行系統(tǒng)的整理與解讀,并通過實例展示其應用。
一、窗口函數(shù)
窗口函數(shù)是一種在SQL中執(zhí)行復雜計算的強大工具,它們允許用戶在一組行(稱為窗口)上執(zhí)行計算,而不會將這些行合并成單個結果行。窗口函數(shù)在處理排名、累計和運行總和等場景中非常有用。
基本語法:
<窗口函數(shù)> OVER([PARTITION BY <分區(qū)列>][ORDER BY <排序列>])
常見窗口函數(shù):
- ROW_NUMBER():為每一行分配一個唯一的序號。
- RANK():為每一行分配一個序號,但序號間可能有跳躍(如有兩行數(shù)據(jù)相同,則它們共享同一序號,下一行的序號將跳過)。
- DENSE_RANK():為每一行分配一個序號,序號間無跳躍(即使兩行數(shù)據(jù)相同,也會為下一行分配連續(xù)的序號)。
- LEAD() 和 LAG():用于訪問同一窗口中前一行或后一行的數(shù)據(jù)。
實例:
SELECT employee_id, department_id, salary,ROW_NUMBER() OVER(PARTITION BY department_id ORDER BY salary DESC) AS row_num,RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS rank,DENSE_RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) AS dense_rank,LAG(salary, 1) OVER(PARTITION BY department_id ORDER BY salary DESC) AS previous_salary
FROM employees;
二、遞歸查詢
遞歸查詢允許用戶在一個查詢中多次引用同一個表,這在處理樹形結構數(shù)據(jù)(如組織架構、目錄結構)時非常有用。
基本語法:
WITH RECURSIVE cte_name AS (初始查詢UNION ALL遞歸查詢
)
SELECT * FROM cte_name;
實例:
WITH RECURSIVE EmployeeCTE AS (SELECT employee_id, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULLUNION ALLSELECT e.employee_id, e.manager_id, ecte.level + 1FROM employees eINNER JOIN EmployeeCTE ecte ON e.manager_id = ecte.employee_id
)
SELECT employee_id, employee_name, level
FROM EmployeeCTE
ORDER BY level, employee_id;
三、公共表表達式(CTEs)
CTE是一種臨時的結果集,只在單個查詢的執(zhí)行周期內有效。它有助于使復雜查詢更加易讀和易維護。
基本語法:
WITH cte_name AS (查詢語句
)
SELECT * FROM cte_name;
實例:
WITH SalesCTE AS (SELECT employee_id, SUM(amount) AS total_salesFROM salesGROUP BY employee_id
)
SELECT employee_id, total_sales
FROM SalesCTE
WHERE total_sales > 10000;
四、子查詢
子查詢是嵌套在另一個查詢中的查詢,常用于篩選條件和數(shù)據(jù)過濾。
實例:
SELECT employee_id, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
五、集合操作
集合操作允許用戶將兩個或多個查詢結果集進行合并或比較。常見的集合操作符包括UNION、INTERSECT和EXCEPT。
實例:
-- 合并兩個查詢結果集
SELECT name FROM customers
UNION
SELECT name FROM suppliers;-- 找出兩個查詢結果集的交集
SELECT name FROM customers
INTERSECT
SELECT name FROM suppliers;-- 找出只在第一個查詢結果集中存在的記錄
SELECT name FROM customers
EXCEPT
SELECT name FROM suppliers;
六、其他高級技巧
- 臨時函數(shù):在支持的數(shù)據(jù)庫中(如PostgreSQL),可以定義臨時函數(shù)來封裝復雜的邏輯,增強代碼重用性。
- 日期時間操作:包括日期加減、日期格式轉換等。
- 索引優(yōu)化:創(chuàng)建適當?shù)乃饕梢燥@著提高查詢性能。
- 自聯(lián)結:一個表與自身進行聯(lián)結,常用于處理相對數(shù)據(jù)。
- 分頁:使用LIMIT子句進行分頁查詢,減少大偏移量