Menu

SQL 命令大全:常用 SQL 语句及示例

你每天都会用到的 SQL 命令,按用途分组(DDL、DML、DQL 和 TCL),每条都附有可以在 SQLite 中运行的示例。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

SQL 命令一览

SQL 命令按用途可以分成几组。下表列出了你最常用的那些,下面每一节都会运行其中一条。

命令分组作用
CREATE TABLEDDL定义一张新表及其列
ALTER TABLEDDL添加或重命名列,或重命名表
DROP TABLEDDL删除一张表及其所有行
INSERTDML添加新行
UPDATEDML修改已有行中的值
DELETEDML删除行
SELECTDQL读取行,用 WHERE 筛选,用 ORDER BY 排序
BEGIN, COMMIT, ROLLBACKTCL把多个修改打包,让它们一起成功或一起失败

DDL 是数据定义语言,DML 是数据操作语言,DQL 是数据查询语言,TCL 是事务控制语言。名字没那么重要,重要的是这个划分:DDL 改变数据库的结构,DML 改变数据库里的内容。

CREATE TABLE:定义表

CREATE TABLE 给表命名,并列出各列及其类型和规则。本页的其他所有命令都需要一张表来操作。

CREATE TABLE 页面介绍了 NOT NULL、UNIQUE 和 DEFAULT 等规则。

INSERT:添加行

INSERT INTO 可以添加一行或多行。先列出列,再按相同顺序给出值。

id 列自动填上了:省略 INTEGER PRIMARY KEY 列时,它会得到下一个编号。详见 INSERT。

SELECT:读取行

SELECT 是你写得最多的命令。选择列,用 WHERE 筛选行,用 ORDER BY 排序。

只有通过 WHERE 条件的行才会返回,成绩最高的排在最前。详见 SELECT 基础和 WHERE。

UPDATE:修改行

UPDATE 给已有的行设置新值。WHERE 子句决定改哪些行;省略它,每一行都会被修改。

不确定 WHERE 子句会匹配哪些行时,先把它当作 SELECT 运行一遍。UPDATE 页面有更多写法。

DELETE:删除行

DELETE FROM 删除与 WHERE 子句匹配的行。和 UPDATE 一样,缺少这个子句时它会影响每一行。

Chen 的那一行没了,其他行都没有变。详见 DELETE。

ALTER TABLE 和 DROP TABLE:修改或删除表

ALTER TABLE 修改一张已有的表,不会丢失其中的行。DROP TABLE 则彻底删除这张表。

新加的列在已有的行中一开始是 NULL,直到你填上值。ALTER 和 DROP TABLE 列出了 SQLite 允许的操作。

JOIN:合并表

JOIN 同时从两张表中读取行,按它们共有的一列进行匹配。

Boris 没有选课记录,所以 INNER JOIN 不包含他。LEFT JOIN 会保留他,课程一栏为空。

GROUP BY:汇总行

GROUP BY 把值相同的行合并成一行,再用 COUNT 或 AVG 这样的聚合函数汇总每一组。

聚合函数和 GROUP BY 与 HAVING 会讲得更深入。

BEGIN、COMMIT 和 ROLLBACK:把修改打包

事务让多个修改被当作一个整体。COMMIT 保留全部修改;ROLLBACK 撤销全部修改。

转账已提交,第二次修改被回滚,所以最后 Ada 有 70,Boris 有 80。事务一页解释了什么时候该用它们。

SQLite 的不同之处

本页的命令都是标准 SQL,在这里学到的东西可以迁移到 MySQL 和 PostgreSQL。不过可运行的示例是为 SQLite 写的,换到更大的数据库上,有三个细节会不同:

  • 列出表。 示例读取的是 sqlite_master,也就是 SQLite 自己的表结构表。MySQL 用 SHOW TABLES,PostgreSQL 用 information_schema.tables 视图(在 psql 中也可以用 \dt)。
  • 自动编号的 id。 在 SQLite 中,声明为 INTEGER PRIMARY KEY 的列会自动给新行编号,所以 INSERT 示例都省略了 id。MySQL 需要在这一列上加 AUTO_INCREMENT,PostgreSQL 需要标识列(GENERATED BY DEFAULT AS IDENTITY)或 SERIAL。
  • 权限和表结构修改。 SQLite 没有 GRANT 和 REVOKE,因为 SQLite 数据库就是一个文件,没有用户账号;它的 ALTER TABLE 也不能修改列的类型。

常见问题

基本的 SQL 命令有哪些?

日常工作大多靠这五条:CREATE TABLE 定义表,INSERT 添加行,SELECT 读取行,UPDATE 修改行,DELETE 删除行。接下来是 ALTER TABLE、DROP TABLE、JOIN、GROUP BY,以及事务命令 BEGIN、COMMIT 和 ROLLBACK。

DDL 和 DML 有什么区别?

DDL(数据定义语言)改变数据库的结构:CREATE、ALTER 和 DROP。DML(数据操作语言)改变表中的行:INSERT、UPDATE 和 DELETE。SELECT 只负责读取,所以常被单独列为 DQL。

SQL 命令区分大小写吗?

不区分。SELECT、select 和 Select 都可以。关键字用大写是一种约定,让它们和表名、列名区分开。不过引号里的文本是按原样比较的,所以在 SQLite 中 'Ada' 和 'ada' 是不同的字符串,除非你要求不区分大小写的比较。

这些命令在 MySQL 和 PostgreSQL 中用法一样吗?

这些语句都是标准 SQL,在三者中含义相同,所以在这里学到的东西可以直接迁移。不过可运行的示例是为 SQLite 写的:这里列出表要读取 sqlite_master,自动编号的 id 在 MySQL 中需要 AUTO_INCREMENT,在 PostgreSQL 中需要标识列,而 SQLite 没有 GRANT 和 REVOKE。

Coddy 编程语言插图

和 Coddy 一起学编程

开始