多关系查询
怎样在 FROM 中引入多个表?
- 写法: FROM 子句列出多个表名, 逗号分隔;
- 语义: 先做笛卡尔积, 再由 WHERE 挑选满足连接条件的元组;
SELECT title AS name, length AS duration
FROM Movies, MovieExec
WHERE title = 'StarWars' AND producerC = cert;
两个表有同名属性时怎样区分?
- 手段: 用
关系名.属性名限定; - 用途: 避免同名属性产生歧义, 也让连接条件写得明确;
SELECT MovieStar.name, MovieExec.name
FROM MovieStar, MovieExec
WHERE MovieStar.address = MovieExec.address;
怎样让同一个表在一句查询里出现两次?
- 手段: 在 FROM 中给表起两个不同的别名;
- 用途: 自连接, 例如找出住址相同的两位影星;
SELECT Star1.name, Star2.name
FROM MovieStar Star1, MovieStar Star2
WHERE Star1.address = Star2.address;
查询结果之间怎样做并、交、差?
| 运算 | 关键字 | 结果 |
|---|---|---|
| 并 | UNION | 出现在任一侧的元组 |
| 交 | INTERSECT | 同时出现在两侧的元组 |
| 差 | EXCEPT | 只出现在左侧的元组 |
(SELECT name, address FROM MovieStar WHERE gender = 'F')
UNION
(SELECT name, address FROM MovieExec WHERE netWorth > 10000000);
- 前提: 两侧查询的属性个数与对应类型一致;
- 重复: 默认消除重复, 保留重复需加
ALL, 见 重复与聚集;
(source: 050-sql.md §多关系查询)