首页 > 数据库 >《高级 SQL 技巧:提升查询效率与灵活性》

《高级 SQL 技巧:提升查询效率与灵活性》

时间:2024-11-10 12:44:45浏览次数:3  
标签:salary JOIN 灵活性 查询 SQL department id SELECT

在 SQL 中,有许多高级技巧可以帮助开发人员和数据库管理员更高效、更灵活地执行复杂的查询和操作。这些技巧不仅可以提高查询性能,还能增强 SQL 的可读性和可维护性。以下是一些常见的高级 SQL 技巧:

1. 窗口函数 (Window Functions)

窗口函数是 SQL 中非常强大的功能,用于在查询结果的行上执行计算。窗口函数不会改变查询结果的行数,而是通过在查询结果的“窗口”中对数据进行聚合或分析来进行计算。

常用窗口函数:

  • ROW_NUMBER(): 为每行返回一个唯一的序号。
  • RANK()DENSE_RANK(): 为结果集中的行排序并分配等级。
  • NTILE(n): 将数据集分成 n 个部分。
  • LEAD()LAG(): 获取当前行之后或之前的值。
  • SUM()AVG()COUNT():在窗口中对数据进行聚合。

示例:

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

这将根据每个部门的薪资对员工进行排名。

2. 子查询与派生表 (Subqueries & Derived Tables)

子查询和派生表允许你在查询中使用临时表或嵌套查询结果。子查询可用于 SELECTWHEREFROMHAVING 中,但它们有时会导致性能问题,特别是在子查询返回大量数据时。

  • 内联视图/派生表:通过 FROM 子句中的子查询返回临时数据表。
  • 相关子查询:子查询中使用外部查询中的字段。

示例:

SELECT department_id, MAX(salary) AS max_salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees) GROUP BY department_id;

该查询返回那些薪资高于全公司平均薪资的部门及其最高薪资。

3. CTE (公用表表达式)

公用表表达式 (CTE) 是一个临时的结果集,它的作用类似于派生表,但在查询中多次使用时更加简洁和清晰。CTE 的语法通常比嵌套子查询更易于阅读和维护。

WITH DepartmentSalary AS ( SELECT department_id, AVG( salary ) AS avg_salary FROM employees GROUP BY department_id ) SELECT
e.employee_id,
e.department_id,
e.salary,
ds.avg_salary 
FROM
	employees e
	JOIN DepartmentSalary ds ON e.department_id = ds.department_id 
WHERE
	e.salary > ds.avg_salary;

在这个例子中,我们首先创建一个 CTE DepartmentSalary,然后在外部查询中使用它来找出高薪员工。

4. CASE 表达式

CASE 表达式允许你在 SQL 查询中进行条件判断,类似于编程语言中的 if-else 语句。它可以在 SELECTUPDATEDELETE 等 SQL 语句中使用。

示例:

SELECT
	employee_id,
	salary,
CASE
		
		WHEN salary > 5000 THEN
		'High' 
		WHEN salary BETWEEN 3000 
		AND 5000 THEN
			'Medium' ELSE 'Low' 
			END AS salary_range 
FROM
	employees;

该查询根据员工薪资将其分类为高薪、中薪、低薪。

5. 优化查询:使用索引、避免全表扫描

查询性能优化是 SQL 中一个非常重要的部分,尤其是在处理大量数据时。你可以通过合理使用索引、避免全表扫描等方式来优化查询。

  • 使用索引:为经常用于 WHEREJOIN 或 ORDER BY 的列创建索引。
  • 避免 SELECT *:只选择需要的列,减少不必要的数据传输。
  • 避免不必要的 JOIN:尽量避免多表联接,尤其是在大表上进行联接时。
  • 合理使用聚合函数和子查询:避免在大数据集上执行大量计算。

示例:

-- 创建索引 CREATE INDEX idx_employee_department ON employees(department_id);

这个索引能加速基于 department_id 字段的查询。

6. UNION 和 INTERSECT

UNIONINTERSECT 是用于组合多个查询结果集的操作符。UNION 返回两个查询结果的并集,INTERSECT 返回两个查询结果的交集。

  • UNION ALL:与 UNION 不同,UNION ALL 不会去除重复记录,适用于性能要求较高的场景。
  • INTERSECT:返回两个查询中都存在的记录。

示例:

-- 获取两个表中共同的记录 
SELECT employee_id FROM employees WHERE department_id = 1 INTERSECT SELECT employee_id FROM employees WHERE salary > 5000;

该查询返回在部门 1 中且薪资大于 5000 的员工 ID。

7. 分区表与分区查询

分区表可以将大表分成多个更小、更易管理的部分。你可以基于某个字段(如日期、ID 范围等)来分区。使用分区表可以显著提升查询性能,尤其是对于范围查询。

  • PARTITION BY:在创建表时通过分区指定某个字段进行分区。
  • 使用 RANGELISTHASH 等分区方法。

示例:

CREATE TABLE sales ( sale_id INT, sale_date DATE, amount DECIMAL ) PARTITION BY RANGE (
YEAR ( sale_date )) ( PARTITION p2019 VALUES LESS THAN ( 2020 ), PARTITION p2020 VALUES LESS THAN ( 2021 ), PARTITION p2021 VALUES LESS THAN ( 2022 ) );

这个表将按年分区,每年一个分区。

8. 复杂的 JOIN 操作

JOIN 是 SQL 中非常重要的操作,可以通过多种方式来连接多个表。常见的 JOIN 类型有 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN

  • 交叉连接 (CROSS JOIN):返回笛卡尔积,即两个表中每一行的组合。
  • 自连接 (Self-Join):一个表连接到自身。

示例:

-- 自连接示例

SELECT
	e1.employee_id,
	e1.manager_id,
	e2.employee_id AS manager_employee_id 
FROM
	employees e1
	LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;

这个查询获取员工及其经理的 ID。

9. JSON 和 XML 操作

许多现代数据库支持 JSON 或 XML 数据类型,可以使用 SQL 来查询和操作这些结构化的数据。对于 JSON 数据,可以使用专门的函数来查询嵌套数据。

-- 查询 JSON 数据中的字段 SELECT JSON_EXTRACT(user_data, '$.address.city') AS city FROM users;

这个查询从 user_data JSON 字段中提取城市信息。

10. 批量更新和删除 (Batch Updates and Deletes)

批量更新或删除数据时,直接在 WHERE 子句中使用条件来避免逐行更新。这比在应用层做循环更新效率更高。

示例:

UPDATE employees 
SET salary = salary * 1.1 
WHERE
	department_id IN ( 1, 2, 3 );

这个查询为部门 1、2 和 3 的所有员工薪资增加 10%。


这些高级 SQL 技巧可以帮助你编写更高效、可维护的查询。在实际开发中,根据具体的场景和需求灵活使用这些技巧,将大大提升你的数据库操作能力和查询性能。

标签:salary,JOIN,灵活性,查询,SQL,department,id,SELECT
From: https://blog.csdn.net/m0_58223765/article/details/143659214

相关文章

  • 4,MySQL数据库的设计
    准备阶段创建用户CREATEUSER'luck'@'localhost'IDENTIFIEDBY'1111';GRANTALLPRIVILEGESONtest_db.*TO'luck'@'localhost';root修改普通用户权限GRANTALLPRIVILEGESON.TO'existinguser'@'%'IDEN......
  • SQL练习
    数据库练习1--期末成绩表(学号(21个字符的字符串,全数字,无重复),姓名,学校,年级,语数英成绩)createtablescore( sidchar(21)primarykey, namevarchar(20), schoolvarchar(50), gradeint, classint, chinese_scoreint, math_scoreint, english_scoreint, tota......
  • MySQL中的事务与锁
    目录事务InnoDB和ACID模型 原⼦性的实现持久性的实现 ​隔离性的实现锁隔离级别 ​多版本控制(MVCC)事务1.什么是事务?事务是把⼀组SQL语句打包成为⼀个整体,在这组SQL的执⾏过程中,要么全部成功,要么全部失败,这组SQL语句可以是⼀条也可以是多条示例:转账的......
  • SQL基础操作全解析:从多表查询到表管理与约束
    一、引言SQL(StructuredQueryLanguage)是用于管理关系数据库的标准语言,在数据库操作中起着至关重要的作用。无论是数据的检索、插入、更新还是删除,以及数据库结构的创建和管理,都离不开SQL语句。本文将详细讲解SQL中的多表查询、创建和管理表(DDL)、数据处理(DML)以及约束等方面......
  • 计算机毕设设计项目 基于PHP+MySQL校园购物网站的设计与实现
    标题: 基于PHP+MySQL校园购物网站的设计与实现基于PHP和MySQL的校园购物网站旨在为在校师生提供一个便捷的在线购物平台。以下是一些主要的功能模块及其详细说明:1.用户管理•注册与登录:•注册:用户可以通过邮箱、手机号或其他方式进行注册。•登录:用户通过用户名和密码......
  • 50个广泛使用的SQL关键字
    1.SELECT:用于从一个或多个数据表中检索数据。2.FROM:指定`SELECT`查询中数据来源的表。3.WHERE:用于过滤查询结果,指定选择条件。4.INSERTINTO:用于向表中插入新行。5.UPDATE:用于修改表中的数据。6.DELETE:用于从表中删除数据。7.CREATETABLE:用于创建新表。8.DROPT......
  • sql语句练习-心得及体会
    `我我我,又郁闷了,每次在本应该掌握的地方出问题,我的问题:代码:values=','.join(['%s']*len(data))与 k=', '.join('%s' * len(data)) 第一个问题:为什么要在'%s'外加个[]?在', '.['%s']*len(data)的返回结果是['%s......
  • AI 扩展开发者思维方式:以 SQL 查询优化为例
    在现代软件开发中,AI技术的兴起让开发者的思维方式发生了显著变化。尤其是在SQL查询优化、代码重构以及算法设计等领域,AI提供的建议不仅扩展了开发者的思考路径,还帮助他们发现以往没有意识到的潜在解决方案。1.传统思维模式下的SQL查询过去,开发者在编写SQL查询时通常......
  • 【MyBatis源码】SQL 语句构建器AbstractSQL
    文章目录介绍org.apache.ibatis.jdbc.SQLSQL类使用示例@SelectProvider搭配动态SQLAbstractSQL类源码分析介绍当我们需要使用Statement对象执行SQL时,SQL语句会嵌入Java代码中。SQL语句比较复杂时,我们可能会在代码中对SQL语句进行拼接,查询条件不固定时,还需要根据不同......
  • SQL经典实例(第2版) ([美] 安东尼 • 莫利纳罗 [澳] 罗伯特 • 德 • 格拉夫)
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqsoSQL基础与高级特性:概述SQL的基本语法和常用操作,并介绍一些高级特性,如窗口函数、递归查询等。统计分析应用:展示如何使用SQL进行统计分析,包括数据的汇总、分组、排序以及趋势分析等。报表制作技巧:介绍如何使用SQL制作报表,包......