【高级SQL技巧】— 提升查询效率

大家好,我是摇光~

虽然基础的SQL语句如SELECT、INSERT、UPDATE和DELETE对于大多数数据操作已经足够,但在处理复杂数据分析和操作时,掌握一些高级SQL技巧能够显著提升你的数据库查询能力和效率。

以下是一些高级SQL技巧,帮助你更好地驾驭数据库查询。


1. 窗口函数(Window Functions)

窗口函数允许你在数据集的一个“窗口”上执行计算,这个窗口由一组行组成,这些行与当前行有着某种关系(如前后n行)。

  • 常见的窗口函数包括ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()和LAG()等。

示例:计算每个员工在部门内的薪资排名:

SELECT 
    department_id,
    employee_id,
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROM 
    employees;

2. 公共表表达式(Common Table Expressions, CTEs)

CTE是一种临时的结果集,可以在一个查询的WITH子句中定义,并在后续的查询中引用。CTE有助于简化复杂查询,使它们更具可读性和可维护性。

示例:计算每个部门的平均薪资,并找出薪资高于平均值的员工:

WITH avg_salary_cte AS ( # 计算出每个部门的平均薪资,放入avg_salary_cte临时结果集 
    SELECT 
        department_id,
        AVG(salary) AS avg_salary		# 计算平均薪资
    FROM employees
    GROUP BY department_id
)
SELECT 
    e.department_id,
    e.employee_id,
    e.salary
FROM employees e
JOIN avg_salary_cte a					# 关联临时结果集,取到各个部门的平均薪资
ON   e.department_id = a.department_id 	# 用部门进行关联
WHERE e.salary > a.avg_salary;			# 找到薪资比平均薪资高的人员

3. 递归查询(Recursive Queries)

递归查询允许你在数据库中处理层次结构数据,如组织结构图、文件系统目录树等。在SQL中,递归查询通常使用CTE来实现。

例如:你的表里有员工号、每个员工对应一个管理员工号,那么我们需要得到一个组织架构图,将每个员工进行层级划分。

示例:构建一个组织结构图的递归查询:

WITH RECURSIVE employee_hierarchy AS (
    SELECT employee_id,manager_id,employee_name,1 AS level
      FROM employees
     WHERE manager_id IS NULL -- 从顶层管理者开始
    UNION ALL
    SELECT employee_id,manager_id,employee_name,eh.level + 1
      FROM employees e
      JOIN employee_hierarchy eh
        ON e.manager_id = eh.employee_id
)
SELECT *
  FROM employee_hierarchy
 ORDER BY level, manager_id, employee_id;

4. 条件逻辑(Case Statements)

条件逻辑允许你在SQL查询中根据条件应用不同的计算或值。这类似于编程语言中的if-else语句。

示例:根据员工薪资水平分类:

SELECT 
    employee_id,
    employee_name,
    salary,
    CASE 
        WHEN salary < 3000 THEN 'Low'
        WHEN salary BETWEEN 3000 AND 7000 THEN 'Medium'
        ELSE 'High'
    END AS salary_category
FROM 
    employees;

5. 子查询与连接(Subqueries and Joins)

子查询可以在SELECT、FROM、WHERE和HAVING子句中使用,而连接则允许你在多个表之间建立关系,并获取关联数据。

示例:使用子查询找出薪资最高的员工:

SELECT 
    employee_id,
    employee_name,
    salary
FROM 
    employees
WHERE 
    salary = (SELECT MAX(salary) FROM employees);

6. 优化查询性能

高级SQL技巧不仅涉及复杂的查询语法,还包括优化查询性能的策略。
这包括使用索引、避免全表扫描、限制结果集大小、优化连接操作等。

示例:为常用查询创建索引:

CREATE INDEX idx_employee_salary ON employees(salary);

示例:使用LIMIT和OFFSET来分页查询结果:

SELECT 
    employee_id,
    employee_name,
    salary
FROM 
    employees
ORDER BY 
    salary DESC
LIMIT 10 OFFSET 20; -- 获取第21到第30条记录

猜你喜欢

转载自blog.csdn.net/qq_41877371/article/details/145137705
今日推荐