Menu
CoddyTech

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 一步步学到连接和窗口函数。
这份速查表适合初学者吗?

适合。内容从最常用的操作(查询和筛选)一直讲到进阶操作(窗口函数),第一天就能用上前面几部分,再慢慢掌握其余内容。

Coddy 编程语言插图

在 Coddy 学习 SQL

开始