SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:SELECT * FROM <表1> <表2>。
SELECT * FROM classes,students
1 一班 1 1 小明 M 90
2 二班 1 1 小明 M 90
3 三班 1 1 小明 M 90
4 四班 1 1 小明 M 90
1 一班 2 1 小红 F 95
2 二班 2 1 小红 F 95
3 三班 2 1 小红 F 95
4 四班 2 1 小红 F 95
1 一班 3 1 小军 M 88
2 二班 3 1 小军 M 88
3 三班 3 1 小军 M 88
4 四班 3 1 小军 M 88
1 一班 4 1 小米 F 73
2 二班 4 1 小米 F 73
3 三班 4 1 小米 F 73
4 四班 4 1 小米 F 73
1 一班 5 2 小白 F 81
2 二班 5 2 小白 F 81
3 三班 5 2 小白 F 81
4 四班 5 2 小白 F 81
1 一班 6 2 小兵 M 55
2 二班 6 2 小兵 M 55
3 三班 6 2 小兵 M 55
4 四班 6 2 小兵 M 55
1 一班 7 2 小林 M 85
2 二班 7 2 小林 M 85
3 三班 7 2 小林 M 85
4 四班 7 2 小林 M 85
1 一班 8 3 小新 F 91
2 二班 8 3 小新 F 91
3 三班 8 3 小新 F 91
4 四班 8 3 小新 F 91
1 一班 9 3 小王 M 89
2 二班 9 3 小王 M 89
3 三班 9 3 小王 M 89
4 四班 9 3 小王 M 89
1 一班 10 3 小丽 F 85
2 二班 10 3 小丽 F 85
3 三班 10 3 小丽 F 85
4 四班 10 3 小丽 F 85
正式如同上面这个数据一样,本来很小的两个表,现在变成了40条数据。
结果集的列数
是students表和classes表的列数之和,行数
是students表和classes表的行数之积。
这种多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有100行记录的表进行笛卡尔查询将返回1万条记录,对两个各自有1万行记录的表进行笛卡尔查询将返回1亿条记录。
SELECT classes.id cid,classes.`name` cname,students.id sid from classes,students
来点操作,把东西玩花
对于这样的写法,我只能说一句舒服了!
SELECT
c.id cid,
c.`name` cname,
s.id sid,
s.`name` sname
FROM
classes c,
students s
再次体会,SQL语句的执行顺序是从后往前执行的,告诉SQL要查询哪个表,就会把哪个表中的列读取出来
根据实际情况需要使用就行了
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;
使用多表查询可以获取M x N行记录;
多表查询的结果集可能非常巨大,要小心使用。
连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
我们希望在结果集同时包含所在的班级名称
SELECT
s.id,
s. NAME,
s.class_id,
c. NAME class_name,
s.gender,
s.score
FROM
students s
INNER JOIN classes c ON s.class_id = c.id;
1 小明 1 一班 M 90
2 小红 1 一班 F 95
3 小军 1 一班 M 88
4 小米 1 一班 F 73
5 小白 2 二班 F 81
6 小兵 2 二班 M 55
7 小林 2 二班 M 85
8 小新 3 三班 F 91
9 小王 3 三班 M 89
10 小丽 3 三班 F 85
内连接的注意事项
使用别名不是必须的,但可以更好地简化查询语句。
tableA看作左表,把tableB看成右表
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;
---
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
FULL OUTER JOIN classes c
ON s.class_id = c.id;
JOIN查询需要先确定主表,然后把另一个表的数据“附加”到结果集上;
INNER JOIN是最常用的一种JOIN查询,它的语法是SELECT … FROM <表1> INNER JOIN <表2> ON <条件…>;
JOIN查询仍然可以使用WHERE条件和ORDER BY排序。