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:按列分组,常与聚合函数(
COUNT、SUM等)结合使用。
案例:统计不同年龄段的用户数量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 TRANSACTION、COMMIT、ROLLBACK 控制。
案例:转账操作的事务示例
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 的核心逻辑始终是数据工程的基石。
建议读者通过实际操作巩固所学内容,例如:
- 在本地安装 MySQL 或 PostgreSQL 进行实验;
- 参与开源项目,分析其 SQL 脚本;
- 阅读官方文档,探索更多高级功能。
掌握 SQL 是通往数据世界的钥匙,而持续实践将使这把钥匙愈发锋利。希望本文能成为您 SQL 总结 的起点,并在后续的学习中收获更多价值。