分享7种SQL的进阶用法

摘要:SQL(结构化查询语言)是用于管理和操作关系数据库的标准编程语言。本文将分享7种 SQL 的进阶用法,帮助您更高效地处理数据库数据。

一、子查询

子查询是 SQL 查询中的一部分,用于从表中检索数据。子查询可以嵌套,即一个查询作为另一个查询的条件。

  1. 单行子查询:
sql 复制代码
SELECT column_name
FROM table_name
WHERE column_name = (SELECT column_name FROM sub_table WHERE condition);

例如,从 students 表中选择所有选修了 Math 课程的学生:

sql 复制代码
SELECT s.name
FROM students s
WHERE s.course_id = (SELECT course_id FROM courses WHERE name = 'Math');
  1. 多行子查询:
sql 复制代码
SELECT column_name
FROM table_name
WHERE column_name IN (SELECT column_name FROM sub_table WHERE condition);

例如,从 students 表中选择所有选修了 MathPhysics 课程的学生:

sql 复制代码
SELECT s.name
FROM students s
WHERE s.course_id IN (SELECT course_id FROM courses WHERE name IN ('Math', 'Physics'));

二、连接查询

连接查询用于合并两个或多个表中的数据。连接查询有多种类型,包括内连接、左连接、右连接和全连接。

  1. 内连接:
sql 复制代码
SELECT column1, column2
FROM table1
INNER JOIN table2
ON table1.column1 = table2.column2;

例如,从 studentscourses 表中选择学生及其选修的课程:

sql 复制代码
SELECT s.name, c.name AS course_name
FROM students s
INNER JOIN courses c ON s.course_id = c.course_id;
  1. 左连接:
sql 复制代码
SELECT column1, column2
FROM table1
LEFT JOIN table2
ON table1.column1 = table2.column2;

例如,从 students 表中选择所有学生及其选修的课程(即使某些学生没有选修课程):

sql 复制代码
SELECT s.name, c.name AS course_name
FROM students s
LEFT JOIN courses c ON s.course_id = c.course_id;

三、聚合函数

聚合函数用于对一组数据进行汇总,如求和、平均、最大值、最小值等。

  1. SUM():求和函数。
sql 复制代码
SELECT SUM(column_name)
FROM table_name;

例如,计算 sales 表中所有销售额的总和:

sql 复制代码
SELECT SUM(amount)
FROM sales;
  1. AVG():平均值函数。
sql 复制代码
SELECT AVG(column_name)
FROM table_name;

例如,计算 employees 表中平均工资:

sql 复制代码
SELECT AVG(salary)
FROM employees;

四、GROUP BY 和 HAVING

GROUP BY 用于对查询结果进行分组,而 HAVING 用于过滤分组后的结果。

  1. GROUP BY:
sql 复制代码
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name;

例如,按部门统计员工数量:

sql 复制代码
SELECT department, COUNT(*)
FROM employees
GROUP BY department;
  1. HAVING:
sql 复制代码
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 5;

例如,筛选出员工数量超过5的部门:

sql 复制代码
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

五、窗口函数

窗口函数用于对查询结果进行分组和聚合,如计算排名、分组统计等。

  1. RANK():排名函数。
sql 复制代码
SELECT column_name, RANK() OVER (PARTITION BY column_name ORDER BY another_column)
FROM table_name;

例如,按销售额对销售人员进行排名:

sql 复制代码
SELECT name, RANK() OVER (PARTITION BY department ORDER BY amount DESC)
FROM sales;

六、CASE 语句

CASE 语句用于在 SQL 查询中实现条件判断和分支。

sql 复制代码
SELECT column_name,
       CASE
           WHEN condition1 THEN result1
           WHEN condition2 THEN result2
           ELSE default_result
       END AS calculated_column
FROM table_name;

例如,根据性别计算员工的工资:

sql 复制代码
SELECT name,
       CASE
           WHEN gender = 'Male' THEN salary * 0.9
           WHEN gender = 'Female' THEN salary * 1.1
           ELSE salary
       END AS adjusted_salary
FROM employees;

七、事务处理

事务处理用于确保一组操作要么全部执行,要么全部不执行。

  1. 开始事务:
sql 复制代码
BEGIN TRANSACTION;
  1. 提交事务:
sql 复制代码
COMMIT;
  1. 回滚事务:
sql 复制代码
ROLLBACK;

例如,执行一个更新操作,如果操作成功,则提交事务;如果操作失败,则回滚事务:

sql 复制代码
BEGIN TRANSACTION;
UPDATE table_name SET column_name = new_value WHERE condition;
COMMIT;

或者:

sql 复制代码
BEGIN TRANSACTION;
UPDATE table_name SET column_name = new_value WHERE condition;
IF @@ROWCOUNT > 0
    COMMIT;
ELSE
    ROLLBACK;
END TRANSACTION;

总结

本文分享了7种 SQL 的进阶用法,包括子查询、连接查询、聚合函数、GROUP BY 和 HAVING、窗口函数、CASE 语句和事务处理。这些高级特性可以帮助您更高效地处理数据库数据,实现复杂的业务逻辑。随着 SQL 技术的不断发展,您可以学习更多高级特性,以进一步提高开发效率和性能。

相关推荐
鱼跃鹰飞2 分钟前
面试题:解释一下什么是全字段排序和rowid排序
数据结构·数据库·mysql
Aloudata技术团队14 分钟前
完美应对千亿级明细数据计算:Aloudata CAN 双引擎架构详解
数据库·数据分析·数据可视化
Dxy123931021615 分钟前
MySQL连表查询讲解:从基础到实战
数据库·mysql
DemonAvenger15 分钟前
Redis数据迁移与扩容实战:平滑扩展的技术方案
数据库·redis·性能优化
毕设十刻24 分钟前
基于Vue的民宿管理系统st4rf(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
人工智能知识库30 分钟前
2026年HCCDP-GaussDB工作级开发者题库(详细解析)
数据库·华为·gaussdb·题库·hccdp-gaussdb·工作级开发者认证
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ44 分钟前
sql 如果字段为空就用另一个字段
数据库·sql
一人の梅雨1 小时前
亚马逊SP-API商品评论接口实战:情感分析+商业洞察挖掘的差异化方案
运维·前端·数据库
qq_435139571 小时前
多级缓存(Caffeine+Redis)技术实现文档
数据库·redis·缓存
程序修理员1 小时前
oracle备份表还原
数据库·oracle