前言
由于师父的缘故,平常获取数据都是从单个表获取,然后再PHP
中拼接。自我感觉,对于初学者,这是有好处的,锻炼了我们的逻辑。但同时,害处也显而易见,没有充分的利用好数据库自带的一些功能,对于表结构的优化也知道的比较少。
在蛋糕组,虽然接触了一些两表联查的情况,但大多数是底层框架完成的,我也只有一个浅层的了解。唯一会用的也只有LEFT JOIN
,而且还不知所云。
现在看了一些资料,对于JOIN
从句有那几种用法,哪种用法用于哪种场景,有了一个较为清晰的了解。
JOIN
(内链接)
将两张表的公共部分作为新的结果集(如图,深色部分)。
SELECT * FROM `table_a` AS a JOIN `table_b` AS b ON a.`key` = b.`key`;
INNER JOIN
LEFT JOIN
(左外链接)
获取存在于左表的数据(如图,深色部分)。
SELECT * FROM `table_a` AS a LEFT JOIN `table_b` AS b ON a.`key` = b.`key`;
获取存在于左表的数据
获取只存在于左表的数据(如图,深色部分)。
SELECT * FROM `table_a` AS a LEFT JOIN `table_b` AS b ON a.`key` = b.`key` WHERE b.`key` IS NULL;
获取只存在于左表的数据
RIGHT JOIN
(右外链接)
获取存在于右表的数据(如图,深色部分)。
SELECT * FROM `table_a` AS a RIGHT JOIN `table_b` AS b ON a.`key` = b.`key`;
获取存在于右表的数据
获取只存在于右表的数据(如图,深色部分)。
SELECT * FROM `table_a` AS a RIGHT JOIN `table_b` AS b ON a.`key` = b.`key` WHERE a.`key` IS NULL;
获取只存在于右表的数据
FULL OUTER JOIN
(全外链接)
获取两表中所有符合条件的数据,没有的值用NULL代替(如图,深色部分)。
SELECT * FROM `table_a` AS a FULL JOIN `table_b` AS b ON a.`key` = b.`key`;
获取两表中所有符合条件的数据,没有的值用NULL代替
获取两表中所有符合条件的,但不相同的数据,不存在的值用NULL
代替(如图,深色部分)。
SELECT * FROM `table_a` AS a FULL JOIN `table_b` AS b ON a.`key` = b.`key` WHERE a.`key` IS NULL OR b.`key` IS NULL;
获取两表中所有符合条件的,但不相同的数据,不存在的值用NULL代替
由于MySQL
不支持FULL JOIN
,可以使用其他方式来代替,比如左链接UNION ALL
右链接。
SELECT * FROM `table_a` AS a LEFT JOIN `table_b` AS b ON a.`key` = b.`key` UNION ALL SELECT * FROM `table_a` AS a RIGHT JOIN `table_b` AS b ON a.`key` = b.`key`;
CROSS JOIN
(交叉链接)不知意义何在
获取的数据是A×B
的,比如表A中有5条数据,表B中有5条数据,则总共查出的有25条数据。
SELECT * FROM `table_a` AS a CROSS JOIN `table_b` AS b;
-- EOF --
本文转载自IMJCW
原文链接:JOIN从句
网友评论