SQL 命令一览
SQL 命令按用途可以分成几组。下表列出了你最常用的那些,下面每一节都会运行其中一条。
| 命令 | 分组 | 作用 |
|---|---|---|
CREATE TABLE | DDL | 定义一张新表及其列 |
ALTER TABLE | DDL | 添加或重命名列,或重命名表 |
DROP TABLE | DDL | 删除一张表及其所有行 |
INSERT | DML | 添加新行 |
UPDATE | DML | 修改已有行中的值 |
DELETE | DML | 删除行 |
SELECT | DQL | 读取行,用 WHERE 筛选,用 ORDER BY 排序 |
BEGIN, COMMIT, ROLLBACK | TCL | 把多个修改打包,让它们一起成功或一起失败 |
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。