SQL 简介
在动手装数据库之前,我们先认识一下 SQL 到底是什么、为什么值得学、能用它做什么。理解了背景,学习的时候会更有的放矢。
SQL 是什么?
SQL(全称 Structured Query Language,结构化查询语言)是专门用来操作关系型数据库(RDBMS)的语言。它和我们平时学的 Java、Python 不一样——不是用来写通用程序的,而是和数据库对话:存数据、查数据、统计数据,都靠它。
看一条最经典的 SQL:
-- 经典的 SQL 查询:从学生表里找出所有成年人
SELECT name, age
FROM students
WHERE age >= 18
ORDER BY name;
-- 结果返回一张表(行 + 列),和 Excel 长得很像是不是很像"自然语言版的 Excel 操作"?SELECT(选哪些列) FROM(从哪张表) WHERE(满足什么条件) ORDER BY(怎么排序)。这种声明式风格是 SQL 的核心:你说"我要什么",数据库自己决定"怎么找",不用关心底层算法。
诞生历史:从一篇论文到工业标准
SQL 的故事可以追溯到 1970 年。那一年,IBM 研究员 Edgar F. Codd 发表了一篇划时代的论文,提出"关系模型"——把数据组织成一张张二维表(行 + 列),表之间通过共同的字段关联。这成了所有关系型数据库的理论基础,Codd 也因此获得了图灵奖。
随后 IBM 在 1970 年代开发了 SEQUEL 语言(后改名 SQL,因为 SEQUEL 是英国某公司的商标),用来实现 Codd 的关系模型。1979 年,Oracle 公司的前身 Relational Software 把 SQL 做成了第一款商业数据库产品,SQL 从此走向工业标准。1986 年 ANSI(美国国家标准学会)和 ISO 把 SQL 列为国际标准,从此它成了关系数据库的通用语言。
SQL 标准至今已迭代多次(SQL-86、SQL-92、SQL:1999、SQL:2003、SQL:2008、SQL:2011、SQL:2016、SQL:2023),每次都加入新特性(窗口函数、JSON、GraphQL 互操作等),但核心语法四十多年几乎没变——这也是它"学了能用一辈子"的原因。
关系模型:把世界看成一张张表
理解 SQL 的前提是理解关系模型。Codd 的洞见是:任何复杂数据都能拆成二维表,表和表之间用"外键"关联。比如一个电商系统:
- 用户表 users:id、name、email、注册时间。
- 商品表 products:id、名称、价格、库存。
- 订单表 orders:id、user_id(指向 users.id)、总价、下单时间。
- 订单明细表 order_items:id、order_id、product_id、数量、单价。
这种"拆成多张表、用外键关联"的设计避免了数据冗余——同一条商品信息只存一次,不会因为出现在多个订单里而重复。要查"小明买了什么",就用 JOIN 把 orders 和 users 连起来。
关系模型的核心概念有三个:表(Table,又称 Relation)、行(Row,又称 Tuple/Record)、列(Column,又称 Field/Attribute)。SQL 的所有操作都围绕这三个概念展开。
主流关系型数据库
虽然 SQL 是标准,但实现它的数据库产品很多,各有侧重:
-- 主流关系型数据库(语法大同小异,核心 SELECT/INSERT/UPDATE/DELETE 通用)
-- MySQL 互联网最流行,WordPress / 淘宝早期都在用
-- PostgreSQL 功能最强、开源,支持 JSON / 地理空间 / 全文搜索
-- SQLite 单文件、零配置,手机 App / 浏览器内置
-- Oracle 企业级老大,银行 / 电信首选
-- SQL Server 微软系,.NET 生态标配
-- MariaDB MySQL 的社区分支,完全兼容好消息是:虽然各家有些"方言"(比如取当前时间 MySQL 用 NOW()、PostgreSQL 用 CURRENT_TIMESTAMP),但 SQL 核心语法——SELECT、INSERT、UPDATE、DELETE、JOIN、GROUP BY——在所有数据库都通用。本教程讲的 90% 内容,换个数据库一样能用。
SQL 都用在哪?典型应用场景
只要项目需要"持久化存储 + 复杂查询",SQL 几乎都在场:
-- 场景 1:用户登录验证
SELECT id, name, password_hash
FROM users
WHERE email = 'xm@example.com';
-- 场景 2:统计昨天的销售额
SELECT SUM(amount) AS total
FROM orders
WHERE DATE(created_at) = CURDATE() - INTERVAL 1 DAY;
-- 场景 3:推荐好友(共同好友数排序)
SELECT friend_id, COUNT(*) AS mutual
FROM friendships
WHERE user_id IN (SELECT friend_id FROM friendships WHERE user_id = 1)
GROUP BY friend_id
ORDER BY mutual DESC
LIMIT 10;更广义地说,下面这些场景全是 SQL 的舞台:
- Web 后端:任何有用户系统的网站都要存用户、订单、文章。
- 数据分析 / BI:产品经理看的报表、运营看的漏斗,都是 SQL 算出来的。
- 金融系统:银行账户、交易流水,对 ACID 事务要求极高。
- ERP / CRM:企业内部的所有业务数据。
- 日志与监控:虽然也用 NoSQL,但 ClickHouse 这类分析型数据库也是 SQL 接口。
SQL vs NoSQL
近十年 NoSQL(MongoDB、Redis、Cassandra)崛起,常有人问"SQL 会被取代吗?"答案是:不会,它们解决不同问题。
- SQL / 关系库:强 schema、强一致、复杂查询、多表关联。适合核心业务数据(账户、订单)。
- NoSQL:灵活 schema、横向扩展容易、特定场景性能极强。Redis 适合缓存、MongoDB 适合文档、Elasticsearch 适合搜索。
真实项目里两者常常配合使用:核心数据存 MySQL,热点数据缓存到 Redis,搜索走 Elasticsearch,日志写 ClickHouse。SQL 是这套生态的"地基",学它是绕不开的。
该不该学 SQL?
无论你是后端工程师、数据分析师、产品经理、运维,只要和"数据"打交道,SQL 都是必修课。它是为数不多"学了能用一辈子"的技能——编程语言十年一换,数据库的核心概念四十多年几乎没变。学完本系列,你将能独立设计数据库表结构、写出复杂的多表统计查询、用索引优化慢查询、用事务保证数据一致性。
← 返回 SQL 教程目录
下一篇 SELECT 基础语法 →