第 6 章 · 第一节
从建表转向取数
前面五章都在建和装,从这一章起开始往外取。

重 点
查询是数据库里用得最多的一件事,一天要写几十遍,建表一年才写一次。
打个比方
前面像是把货码进仓库,这一章是拿着单子去仓库里挑货。
知道更多查询不改数据
SELECT 只读不写,写错了顶多查不出来,不会把表里的数据弄坏。
前面五章都在建和装,从这一章起开始往外取。

查询是数据库里用得最多的一件事,一天要写几十遍,建表一年才写一次。
前面像是把货码进仓库,这一章是拿着单子去仓库里挑货。
SELECT 只读不写,写错了顶多查不出来,不会把表里的数据弄坏。
从一张表查起,然后是多张表、子查询和集合运算。

| 这一节 | 解决的问题 |
|---|---|
| 单关系查询 | 只查一张表 |
| 多关系查询 | 把几张表连起来 |
| 子查询 | 条件里的值现查 |
| 集合运算 | 两个结果并一起 |
四种写法难度递增,但用的还是同一条 SELECT 语句,只是子句越写越全。
七个子句,前两个必写,后五个按需要挑。

书写顺序一个字都不能颠倒,写反了机器直接报 1064 语法错。
为什么 WHERE 里不能用 SELECT 起的别名?
只有 SELECT 和 FROM 的查询,等于关系代数里的投影。

字段名的先后由 SELECT 后面的次序决定,和表里原来的列序无关。
| 写法 | 什么时候用 |
|---|---|
| 列出全部字段名 | 想控制列序 |
| 用一个星号 | 临时看看全表 |
星号在正式程序里是忌讳,表一加列,程序拿到的东西就变了。
AS 只改结果里的表头,表里的字段名一个字没动。

别名在结果里顶替原字段名显示,中文别名让结果一眼能看懂。
像给学生贴个座位牌,牌子换了,人还是那个人。
AS 这个词能省掉,直接在字段名后面空一格写别名也认。
关系代数投影自动去重,SQL 不去,得写 DISTINCT。

DISTINCT 紧跟在 SELECT 后面,管的是整行,不是某一列。
DISTINCT 把教师号相同的行合成一行,剩几位教师就是几行。
表有几万行时先加个 LIMIT,别让屏幕刷个不停。

LIMIT 写在所有子句的最后,它砍的是最终结果,不是中间过程。
不加 ORDER BY 就写 LIMIT,取到的是哪几行完全看机器心情。
一张表有十万行,你会先加 LIMIT 还是先加 WHERE?