多表查询
多表查询
SELECT 查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:**SELECT * FROM <表 1> <表 2>**。
例如:
1 | SELECT * FROM students, classes; |
这种一次查询两个表的数据,查询的结果也是一个二维表,它是 students 表和 classes 表的“乘积”,即 students 表的每一行与 classes 表的每一行都两两拼在一起返回。结果集的列数是 students 表和 classes 表的列数之和,行数是 students 表和 classes 表的行数之积。这种多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有 100 行记录的表进行笛卡尔查询将返回 1 万条记录,对两个各自有 1 万行记录的表进行笛卡尔查询将返回 1 亿条记录。
你可能还注意到了,上述查询的结果集有两列 id 和两列 name,两列 id 是因为其中一列是 students 表的 id,而另一列是 classes 表的 id,但是在结果集中,不好区分。两列 name 同理
要解决这个问题,我们仍然可以利用投影查询的“设置列的别名”来给两个表各自的 id 和 name 列起别名:
1 | SELECT |
注意,多表查询时,要使用表名.列名这样的方式来引用列和设置别名,这样就避免了结果集的列名重复问题。但是,用表名.列名这种方式列举两个表的所有列实在是很麻烦,所以 SQL 还允许给表设置一个别名,让我们在投影查询中引用起来稍微简洁一点:
1 | SELECT |
注意到 FROM 子句给表设置别名的语法是 FROM <表名 1> <别名 1>, <表名 2> <别名 2>。这样我们用别名 s 和 c 分别表示 students 表和 classes 表。
多表查询也是可以添加 WHERE 条件的,我们来试试:
1 | SELECT |