1、语法
SELECT ... FROM <表1> <表2>
2、举例
例如,同时从students表和classes表的“乘积”,即查询数据,可以这么写:
SELECT * FROM students, classes;
结果如下,有很多:
id | class_id | name | gender | score | id | name |
1 | 1 | 小明 | M | 90 | 1 | 一班 |
1 | 1 | 小明 | M | 90 | 2 | 二班 |
1 | 1 | 小明 | M | 90 | 3 | 三班 |
1 | 1 | 小明 | M | 90 | 4 | 四班 |
2 | 1 | 小红 | F | 95 | 1 | 一班 |
2 | 1 | 小红 | F | 95 | 2 | 二班 |
2 | 1 | 小红 | F | 95 | 3 | 三班 |
2 | 1 | 小红 | F | 95 | 4 | 四班 |
3 | 1 | 小军 | M | 88 | 1 | 一班 |
3 | 1 | 小军 | M | 88 | 2 | 二班 |
3 | 1 | 小军 | M | 88 | 3 | 三班 |
3 | 1 | 小军 | M | 88 | 4 | 四班 |
4 | 1 | 小米 | F | 73 | 1 | 一班 |
4 | 1 | 小米 | F | 73 | 2 | 二班 |
4 | 1 | 小米 | F | 73 | 3 | 三班 |
4 | 1 | 小米 | F | 73 | 4 | 四班 |
5 | 2 | 小白 | F | 81 | 1 | 一班 |
5 | 2 | 小白 | F | 81 | 2 | 二班 |
5 | 2 | 小白 | F | 81 | 3 | 三班 |
5 | 2 | 小白 | F | 81 | 4 | 四班 |
6 | 2 | 小兵 | M | 55 | 1 | 一班 |
6 | 2 | 小兵 | M | 55 | 2 | 二班 |
6 | 2 | 小兵 | M | 55 | 3 | 三班 |
6 | 2 | 小兵 | M | 55 | 4 | 四班 |
7 | 2 | 小林 | M | 85 | 1 | 一班 |
7 | 2 | 小林 | M | 85 | 2 | 二班 |
7 | 2 | 小林 | M | 85 | 3 | 三班 |
7 | 2 | 小林 | M | 85 | 4 | 四班 |
8 | 3 | 小新 | F | 91 | 1 | 一班 |
8 | 3 | 小新 | F | 91 | 2 | 二班 |
8 | 3 | 小新 | F | 91 | 3 | 三班 |
8 | 3 | 小新 | F | 91 | 4 | 四班 |
9 | 3 | 小王 | M | 89 | 1 | 一班 |
9 | 3 | 小王 | M | 89 | 2 | 二班 |
9 | 3 | 小王 | M | 89 | 3 | 三班 |
9 | 3 | 小王 | M | 89 | 4 | 四班 |
10 | 3 | 小丽 | F | 88 | 1 | 一班 |
10 | 3 | 小丽 | F | 88 | 2 | 二班 |
10 | 3 | 小丽 | F | 88 | 3 | 三班 |
10 | 3 | 小丽 | F | 88 | 4 | 四班 |
这种多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有100行记录的表进行笛卡尔查询将返回1万条记录,对两个各自有1万行记录的表进行笛卡尔查询将返回1亿条记录。
你可能还注意到了,上述查询的结果集有两列id和两列name,两列id是因为其中一列是students表的id,而另一列是classes表的id,但是在结果集中,不好区分。两列name同理
要解决这个问题,我们仍然可以利用投影查询的“设置列的别名”来给两个表各自的id和name列起别名:
SELECT students.id sid, students.name, students.gender, students.score, classes.id cid, classes.name cname FROM students, classes;
用表名.列名这种方式列举两个表的所有列实在是很麻烦,所以SQL还允许给表设置一个别名,让我们在投影查询中引用起来稍微简洁一点:
SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname FROM students s, classes c;
多表查询也是可以添加WHERE条件的:
SELECT s.id sid, s.name, s.gender, s.score, c.id cid, c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;
结果:
sid | name | gender | score | cid | cname |
1 | 小明 | M | 90 | 1 | 一班 |
3 | 小军 | M | 88 | 1 | 一班 |
6 | 小兵 | M | 55 | 1 | 一班 |
7 | 小林 | M | 85 | 1 | 一班 |
9 | 小王 | M | 89 | 1 | 一班 |
3、小结
- 使用多表查询可以获取M x N行记录;
- 多表查询的结果集可能非常巨大,要小心使用;
- 多表查询后面依然可以接WHERE条件