连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。例如,我们想要选出students表的所有学生信息,可以用一条简单的SELECT语句完成:
-- 选出所有学生 ---- SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;
但是,假设我们希望结果集同时包含所在班级的名称,上面的结果集只有class_id列,缺少对应班级的name列。
现在问题来了,存放班级名称的name列存储在classes表中,只有根据students表的class_id,找到classes表对应的行,再取出name列,就可以获得班级名称。
这时,连接查询就派上了用场。我们先使用最常用的一种内连接——INNER 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;
注意INNER JOIN查询的写法是:
先确定主表,仍然使用FROM的语法;再确定需要连接的表,使用INNER JOIN的语法;然后确定连接条件,使用ON,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;可选:加上WHERE子句、ORDER BY等子句。
使用别名不是必须的,但可以更好地简化查询语句。
那什么是内连接(INNER JOIN)呢?先别着急,有内连接(INNER JOIN)就有外连接(OUTER JOIN)。我们把内连接查询改成外连接查询,看看效果:
-- 使用OUTER JOIN ---- 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.cl