SQL 速查表
最后更新
查询数据(SELECT)
SQL 的核心:从一张或多张表中读取行。
| 操作 | 语法 |
|---|---|
| 查询所有列 | SELECT * FROM users; |
| 查询指定列 | SELECT id, name FROM users; |
| 给列重命名(别名) | SELECT name AS full_name FROM users; |
| 去重 | SELECT DISTINCT country FROM users; |
| 限制行数 | SELECT * FROM users LIMIT 10; |
| 跳过若干行再取(分页) | SELECT * FROM users LIMIT 10 OFFSET 20; |
| 统计行数 | SELECT COUNT(*) FROM users; |
筛选行(WHERE)
缩小查询返回的行。
| 操作 | 语法 |
|---|---|
| 等于 / 比较 | WHERE age >= 18 |
| 多个条件 | WHERE age >= 18 AND country = 'US' |
| 满足任一条件 | WHERE role = 'admin' OR role = 'owner' |
| 在集合中 | WHERE country IN ('US', 'CA', 'MX') |
| 在某个范围内 | WHERE price BETWEEN 10 AND 50 |
| 模式匹配 | WHERE email LIKE '%@gmail.com' |
| 为空 / 不为空 | WHERE deleted_at IS NULL |
| 取反 | WHERE status NOT IN ('archived') |
排序与分组
| 操作 | 语法 |
|---|---|
| 升序排序(默认) | ORDER BY created_at |
| 降序排序 | ORDER BY created_at DESC |
| 按多列排序 | ORDER BY country, name DESC |
| 分组 | SELECT country, COUNT(*) FROM users GROUP BY country; |
| 筛选分组 | GROUP BY country HAVING COUNT(*) > 100 |
连接(JOIN)
按匹配的列把两张表的行组合起来。
| 连接类型 | 返回 | 语法 |
|---|---|---|
| INNER JOIN | 只返回两张表中都匹配的行 | FROM orders o INNER JOIN users u ON o.user_id = u.id |
| LEFT JOIN | 左表的所有行 + 匹配的行(不匹配时为 NULL) | FROM users u LEFT JOIN orders o ON o.user_id = u.id |
| RIGHT JOIN | 右表的所有行 + 匹配的行 | FROM orders o RIGHT JOIN users u ON o.user_id = u.id |
| FULL OUTER JOIN | 两边的所有行 | FROM a FULL OUTER JOIN b ON a.id = b.a_id |
| CROSS JOIN | 所有组合(笛卡尔积) | FROM sizes CROSS JOIN colors |
| 自连接 | 表与自身连接 | FROM employees e JOIN employees m ON e.manager_id = m.id |
聚合函数
对一组行计算出单个值。
| 函数 | 作用 |
|---|---|
COUNT(*) | 行数 |
COUNT(col) | 非空值的个数 |
SUM(col) | 数值列的总和 |
AVG(col) | 平均值 |
MIN(col) / MAX(col) | 最小值 / 最大值 |
STRING_AGG(col, ',') | 拼接多个值(Postgres;MySQL 中用 GROUP_CONCAT) |
窗口函数
在一组行上计算,但不把它们合并成一行。
| 函数 | 语法 |
|---|---|
| 行号 | ROW_NUMBER() OVER (ORDER BY score DESC) |
| 排名(有间隔) | RANK() OVER (PARTITION BY country ORDER BY score DESC) |
| 密集排名 | DENSE_RANK() OVER (ORDER BY score DESC) |
| 累计求和 | SUM(amount) OVER (ORDER BY created_at) |
| 上一行 / 下一行 | LAG(score) OVER (ORDER BY date), LEAD(score) OVER (...) |
修改数据(INSERT、UPDATE、DELETE)
| 操作 | 语法 |
|---|---|
| 插入一行 | INSERT INTO users (name, email) VALUES ('Ada', 'ada@x.com'); |
| 插入多行 | INSERT INTO users (name) VALUES ('Ada'), ('Alan'); |
| 更新行 | UPDATE users SET active = true WHERE id = 1; |
| 删除行 | DELETE FROM users WHERE active = false; |
| 插入或更新(Postgres/SQLite) | INSERT ... ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name; |
定义表(DDL)
| 操作 | 语法 |
|---|---|
| 创建表 | CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL); |
| 添加列 | ALTER TABLE users ADD COLUMN age INTEGER; |
| 删除列 | ALTER TABLE users DROP COLUMN age; |
| 删除表 | DROP TABLE users; |
| 创建索引 | CREATE INDEX idx_users_email ON users (email); |
| 外键 | FOREIGN KEY (user_id) REFERENCES users (id) |
常用的 SQL 语句、子句和连接,全都在这一页。这份 SQL 速查表是查询和修改关系型数据的快速参考:SELECT 子句、四种 JOIN 类型、聚合,以及用来创建和更新表的 DDL 和 DML。
除非特别说明,这里的语法都是标准 ANSI SQL,可以在 PostgreSQL、MySQL、SQLite 和 SQL Server 中使用。需要什么就复制什么,也可以在 SQL 在线编辑器里直接运行每条查询,无需安装数据库。刚接触数据库?Coddy 的免费交互式 SQL 课程会一步步讲解查询、连接和聚合。
SQL 速查表常见问题
这份 SQL 速查表免费吗?
免费。这份 SQL 速查表完全免费,无需注册。收藏起来,需要查某个子句、连接或函数时随时回来看。
这些语法适用于 MySQL、PostgreSQL 和 SQLite 吗?
基本适用。这里的
SELECT、WHERE、JOIN、GROUP BY 和 DDL 语法都是标准 ANSI SQL,在 MySQL、PostgreSQL、SQLite 和 SQL Server 中的写法相同。少数高级功能因数据库方言而异,最常见的是插入或更新(upsert)和字符串聚合,相关的行已经注明了区别。INNER JOIN 和 LEFT JOIN 有什么区别?
INNER JOIN 只返回在两张表中都有匹配的行。LEFT JOIN 返回左表(第一张表)的每一行,右表没有匹配时,右表的列用 NULL 填充。如果你想列出所有用户,包括没有下过订单的用户,就用它。可以在线练习这些 SQL 命令吗?
可以。打开 SQL 在线编辑器,就能在浏览器里对真实的数据库运行这份速查表中的任何查询,无需安装。想要系统学习的话,Coddy 的免费交互式 SQL 课程会带你从
SELECT 一步步学到连接和窗口函数。这份速查表适合初学者吗?
适合。内容从最常用的操作(查询和筛选)一直讲到进阶操作(窗口函数),第一天就能用上前面几部分,再慢慢掌握其余内容。