跳到主要内容

多关系查询

怎样在 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 §多关系查询)