SQL 总结(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3700+ 小伙伴加入学习 ,欢迎点击围观

在当今数据驱动的世界中,SQL 总结是每位开发者必须掌握的核心技能之一。无论是分析用户行为、优化业务流程,还是构建数据仓库,SQL(结构化查询语言)都是连接数据库与业务需求的桥梁。本文将从基础语法到高级技巧,通过实际案例和形象比喻,帮助读者系统性地理解 SQL 的核心概念,为编程初学者和中级开发者提供一份清晰的 SQL 总结指南。


一、SQL 的核心概念:数据库的“对话语言”

1.1 数据库的三层模型:库、表、行

想象一个图书馆:

  • 数据库(Database) 是整个图书馆,包含多个书架(表)。
  • 表(Table) 是书架,存放特定主题的书籍(行)。
  • 行(Row) 是一本具体的书,每一行代表一条数据记录。
  • 列(Column) 是书籍的分类标签,如“书名”“作者”“出版日期”。

代码示例:创建一个简单的“用户表”

CREATE TABLE users (  
    id INT PRIMARY KEY,  
    name VARCHAR(50),  
    age INT,  
    registration_date DATE  
);  

1.2 SQL 的四大核心操作:CRUD

  • Create(创建):通过 INSERT 向表中添加数据。
    INSERT INTO users (id, name, age, registration_date)  
    VALUES (1, 'Alice', 28, '2023-01-15');  
    
  • Read(查询):通过 SELECT 从表中检索数据(后文详细讲解)。
  • Update(更新):通过 UPDATE 修改现有记录。
  • Delete(删除):通过 DELETE 移除数据。

二、基础查询:SELECT 的深度解析

2.1 SELECT 的基本语法与选择性检索

核心语法

SELECT [DISTINCT] column1, column2  
FROM table_name  
WHERE condition;  
  • DISTINCT:去除重复值,类似“筛子过滤”。
  • WHERE:筛选条件,支持比较运算符(=><LIKE 等)。

案例:查找年龄大于 30 岁的用户

SELECT name, age  
FROM users  
WHERE age > 30;  

2.2 排序与分组:ORDER BY 和 GROUP BY

  • ORDER BY:对结果排序,如按年龄降序排列。
    SELECT * FROM users ORDER BY age DESC;  
    
  • GROUP BY:按列分组,常与聚合函数(COUNTSUM 等)结合使用。
    案例:统计不同年龄段的用户数量
    SELECT age_band, COUNT(*) AS user_count  
    FROM (  
        SELECT  
            CASE  
                WHEN age BETWEEN 18 AND 25 THEN '18-25'  
                WHEN age BETWEEN 26 AND 35 THEN '26-35'  
                ELSE '36+'  
            END AS age_band  
        FROM users  
    ) AS age_groups  
    GROUP BY age_band;  
    

三、连接表数据:JOIN 的逻辑与实践

3.1 JOIN 的本质:拼图式数据整合

假设有一个订单表 orders 和用户表 users,要查询每个订单的用户信息,需通过 user_id 进行连接。

常见 JOIN 类型
| 类型 | 描述 | 比喻 |
|--------------|-----------------------------|-------------------------------|
| INNER JOIN | 两个表共同匹配的记录 | 两个拼图块完全重叠的部分 |
| LEFT JOIN | 左表所有记录,右表匹配则保留 | 左手拿着所有拼图,右手补充匹配 |
| RIGHT JOIN | 右表所有记录,左表匹配则保留 | 右手拿着所有拼图,左手补充匹配 |
| FULL OUTER JOIN | 两个表所有记录,不匹配则为 NULL | 两组拼图全部展示,缺失处留空 |

代码示例:左连接用户与订单表

SELECT users.name, orders.order_id, orders.amount  
FROM users  
LEFT JOIN orders ON users.id = orders.user_id;  

3.2 子查询:嵌套查询的“俄罗斯套娃”

子查询是嵌套在主查询中的 SELECT 语句,用于动态筛选条件。

案例:查找销售额高于平均值的订单

SELECT order_id, amount  
FROM orders  
WHERE amount > (SELECT AVG(amount) FROM orders);  

四、高级技巧:窗口函数与事务控制

4.1 窗口函数:动态计算的“滑动窗口”

窗口函数(如 ROW_NUMBER()SUM()RANK())允许在不改变表结构的情况下,对分区数据进行计算。

案例:按月份统计销售额,并计算累计销售额

SELECT  
    EXTRACT(MONTH FROM order_date) AS month,  
    SUM(amount) AS monthly_sales,  
    SUM(SUM(amount)) OVER (ORDER BY EXTRACT(MONTH FROM order_date)) AS cumulative_sales  
FROM orders  
GROUP BY month  
ORDER BY month;  

4.2 事务(Transaction):数据操作的“安全网”

事务确保多个操作要么全部成功,要么全部失败。通过 BEGIN TRANSACTIONCOMMITROLLBACK 控制。

案例:转账操作的事务示例

BEGIN TRANSACTION;  
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;  
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;  
COMMIT;  -- 若中间出错,可执行 ROLLBACK  

五、性能优化:SQL 的“减肥计划”

5.1 索引:数据检索的“导航仪”

索引类似书本的目录,能大幅加速查询速度。但需谨慎创建,过多索引会降低写入性能。

创建索引示例

CREATE INDEX idx_user_age ON users(age);  

5.2 避免全表扫描:优化查询的“瘦身秘诀”

  • 使用 WHERE 条件:让数据库利用索引过滤数据。
  • **减少 SELECT * **:只选择必要字段。
  • 避免函数在列上:如 WHERE YEAR(date) = 2023,可改为 WHERE date BETWEEN '2023-01-01' AND '2023-12-31'

结论

通过本文的 SQL 总结,读者应已掌握从基础查询到高级技巧的完整知识体系。SQL 不仅是一种语言,更是一种思维方式——它教会我们如何通过结构化的方式解决问题。无论是处理小规模数据还是构建复杂系统,SQL 的核心逻辑始终是数据工程的基石。

建议读者通过实际操作巩固所学内容,例如:

  1. 在本地安装 MySQL 或 PostgreSQL 进行实验;
  2. 参与开源项目,分析其 SQL 脚本;
  3. 阅读官方文档,探索更多高级功能。

掌握 SQL 是通往数据世界的钥匙,而持续实践将使这把钥匙愈发锋利。希望本文能成为您 SQL 总结 的起点,并在后续的学习中收获更多价值。

最新发布