JOIN关键字
一、前置条件
有如下两张表:用户表和用户详情表:
SELECT * FROM `user`
SELECT * FROM `user_info`
二、INNER JOIN 关键字
内连接,又叫等值连接,只返回两个表中连接字段相等的行。
注释:INNER JOIN 与 JOIN 是相同的。在 INNER JOIN 中条件放在 on 中和 where 中,返回的结果集是相同的。
内连接查询示例
SELECT * FROM `user` u JOIN `user_info` i ON u.id = i.id
或SELECT * FROM `user` u JOIN `user_info` i WHERE u.id = i.id
总结:
只返回匹配的行,没有匹配的行则不返回。没有主表的概念。
三、LEFT/RIGHT JOIN 关键字
- LEFT JOIN 即使右表中没有匹配,也从左表返回所有的行。
- RIGHT JOIN 则是即使左表中没有匹配,也从右表返回所有的行
注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。而 RIGHT JOIN 称为 RIGHT OUTER JOIN。
左连接查询示例【user为主表】
SELECT * FROM `user` u LEFT JOIN `user_info` i ON u.id = i.id
右连接查询示例
- 将上述的左连接转换为右连接【user为主表】:
SELECT * FROM `user_info` i RIGHT JOIN `user` u ON u.id = i.id
- 右连接查询【user_info为主表】
SELECT * FROM `user` u RIGHT JOIN `user_info` i ON u.id = i.id
总结:
- 左连接查询是以左表为主表,查询该表所有的数据。其次是查右表,如果右表中没有匹配,则结果用NULL来填充;
- 外连接条件只能放在 on 中;
- 左连接和右连接可以互相转换。
四、ON 和 Where关键字的区别
数据库在通过连接 (join) 两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left join 时,格式:【表1 left jion 表2 on 连接条件 where 过滤条件】,on 和 where 条件的区别如下:
1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
记住:所有的外连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。(会报语法错误)