当前位置: 首页 > news >正文

MySQL 高级(进阶) SQL 语句

MySQL 是一种功能强大的关系型数据库管理系统。为了有效地利用其高级功能,需要掌握一些进阶的 SQL 语句和技巧。本文将介绍几种常用的高级 SQL 语句,包括窗口函数、子查询、联合查询、复杂的连接操作以及事务处理等。

1. 窗口函数

窗口函数是一种高级的 SQL 功能,用于在查询结果集中计算某些聚合值,同时保留详细数据行。常用的窗口函数包括 ROW_NUMBER()RANK()DENSE_RANK()SUM()AVG() 等。

示例

SELECTemployee_id,department_id,salary,RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as salary_rank
FROMemployees;
​
 
 

此查询为每个部门的员工按薪资排名。

2. 子查询

子查询是嵌套在其他 SQL 语句中的查询,用于解决复杂的查询需求。子查询可以分为标量子查询、多行子查询、多列子查询和相关子查询等类型。

示例

标量子查询

SELECTemployee_id,salary
FROMemployees
WHEREsalary > (SELECT AVG(salary) FROM employees);
​
 
 

此查询返回薪资高于平均薪资的员工。

相关子查询

SELECTe1.employee_id,e1.salary
FROMemployees e1
WHEREe1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e1.department_id = e2.department_id);
​
 
 

此查询返回薪资高于其部门平均薪资的员工。

3. 联合查询

联合查询使用 UNIONUNION ALLINTERSECT 和 EXCEPT 等操作符来合并多个查询的结果集。

示例

SELECTemployee_id,first_name,last_name
FROMemployees
WHEREdepartment_id = 10
UNION ALL
SELECTemployee_id,first_name,last_name
FROMemployees
WHEREdepartment_id = 20;
​
 
 

此查询返回部门 ID 为 10 和 20 的所有员工。

4. 复杂连接操作

连接操作是 SQL 查询的基础,但高级的连接操作能够处理更复杂的业务需求。常见的连接类型包括内连接、左连接、右连接、全连接和自连接。

示例

内连接

SELECTe.employee_id,e.first_name,d.department_name
FROMemployees e
INNER JOINdepartments d ON e.department_id = d.department_id;
​
 
 

此查询返回所有员工及其所属部门的名称。

自连接

SELECTe1.employee_id AS employee,e2.employee_id AS manager
FROMemployees e1
LEFT JOINemployees e2 ON e1.manager_id = e2.employee_id;
​
 
 

此查询返回员工及其经理的对应关系。

5. 事务处理

事务处理是保证数据库操作的原子性、一致性、隔离性和持久性(ACID 属性)的关键。MySQL 支持使用 START TRANSACTIONCOMMIT 和 ROLLBACK 来控制事务。

示例

START TRANSACTION;UPDATE accounts
SET balance = balance - 100
WHERE account_id = 1;UPDATE accounts
SET balance = balance + 100
WHERE account_id = 2;-- 检查条件,决定提交还是回滚
IF (condition) THENCOMMIT;
ELSEROLLBACK;
END IF;
​
 
 

此事务示例实现了从一个账户转账到另一个账户的操作。

6. 分区表

分区表是将大表的数据分成更小的、易于管理的部分。分区可以提高查询性能和管理效率。

示例

创建分区表:

CREATE TABLE sales (id INT,sale_date DATE,amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p0 VALUES LESS THAN (2020),PARTITION p1 VALUES LESS THAN (2021),PARTITION p2 VALUES LESS THAN (2022)
);
​
 
 

此示例根据销售日期年份对表进行分区。

http://www.sczhlp.com/news/5234/

相关文章:

  • Integer缓存IntegerCache详解
  • 普科科技电流互感器在电力系统继电保护领域替代皮尔逊电流互感器的测试案例
  • 隐藏滚动条但不影响使用 - Joshua
  • 【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR_EL0 CLIDR CCSIDR CSSELR 使用详解 1】
  • GitLab项目导入远程代码执行漏洞分析(CVE-2022-2185)
  • 自用思源笔记CSS配色记录
  • 定期删除全量和增量备份
  • JUC学习-23-线程池拒绝策略
  • RS485硬件电路设计参考:工业数据交互的基石
  • Kubernetes v1.33:HPA 可配置容差
  • Java学习:Java与C++数组初始化全对比
  • Revit高版本载入低版本族库,软件卡死 - Andy
  • ​​Linux CentOS 命名空间(Namespace)​​ 的应用场景及命令详解
  • 洛谷P1364 医院设置(dfs\树形dp\树重心)
  • Modbus转Profinet协议网关与微型空气质量监测系统
  • VLAN 0 1 4095
  • [CTF Reverse] 初见SMC
  • 深入指南:在SCSS中高效使用@font-face引入自定义字体
  • 题解:qoj9564 Hey, Have You Seen My Kangaroo?
  • BT137-800-ASEMI工业自动化BT137-800
  • 8.4
  • Java数组
  • appium安装文档
  • 正之和软件
  • Linux CentOS 系统中 X11(X Window System)​​ 的详细解析
  • 使用OpenAI文本转语音(Text to Speech)详解
  • 深入解析:jmeter--While控制器--循环直到接口响应符合条件
  • Git基本使用
  • 又是周一,又要上班
  • 杂交瘤细胞构建|单克隆抗体筛选|高效抗体制备