SQL基本查询语句(三)

2021-05-18 10:35:58 浏览数 (1)

多表查询

多表查询的结果是表的乘积,不是显示多个表。这个非常不好用,因为很容易就导致表很大。下面是个例子。

代码语言:javascript复制
SELECT * FROM students,classes;

其实就是这张表变成了40行记录了,如果你有两张1万行记录的表,你去查询它,那么将导致表的记录变成了1亿。

连接查询

连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。

现在,我们希望结果集同时包含所在班级的名称,上面的结果集只有class_id列,缺少对应班级的name列。我们可以将students表作为主表,把classes表中的name列连接在主表上。

代码语言:javascript复制
SELECT s.id, 
s.class_id, 
c.name class_name, 
s.name,
s.gender, 
s.score 
FROM students s 
INNER JOIN classes c 
ON s.class_id = c.id;

ON后面是限制条件,表示students表的class_id列与classes表的id列相同的行需要连接。INNER JOIN是内连接。除此之外,还有外连接(OUTER JOIN)。把上面的内连接改成外连接。

代码语言:javascript复制
SELECT s.id,
s.class_id, 
c.name class_name, 
s.name,
s.gender, 
s.score 
FROM students s 
RIGHT OUTER JOIN classes c 
ON s.class_id = c.id;

INNER JOIN只返回同时存在于两张表的行数据,由于students表的class_id包含1,2,3,classes表的id包含1,2,3,4,所以,INNER JOIN根据条件s.class_id = c.id返回的结果集仅包含1,2,3。

RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。

LEFT OUTER JOIN则返回左表都存在的行。如果我们给students表增加一行,并添加class_id=5,由于classes表并不存在id=5的行,所以,LEFT OUTER JOIN的结果会增加一行,对应的class_nameNULL

代码语言:javascript复制
SELECT s.id, s.class_id, c.name class_name, s.name,s.gender, s.score FROM students s LEFT OUTER JOIN classes c ON s.class_id = c.id;

0 人点赞