众所周知,MySQL SELECT可以一次从一个表中检索信息,但是不能仅使用一个表来回答所有问题。因此,出于上述目的,即利用存储在多个表中的信息,我们可以使用Join操作。
基本上,MySQL join是一种基于两个或多个表之间的公共列值链接数据的方法,结果是一个新的临时表。换句话说,我们可以说MySQL联接使我们能够从新临时表中的两个或多个逻辑相关的表中检索记录。基于两个表共享的列创建新的临时表,该列表示有意义的比较列。
公用值通常是在要连接的两个参与表中都出现的相同列名和数据类型。这些列称为联接键或公共键。
MySQL支持以下类型的联接:
实际上,交叉联接是联接的基本形式。如果我们有两个表,它将使用table1的每一行并将其追加到table2的每一行。因此,如果table1有3行,而table2有2行,那么在交叉连接这些表后,我们将总共得到6行。为了理解这一点,我们以两个名为tbl_1和tbl_2的表为例,它们具有以下数据:
mysql> Select * from tbl_1; +----+--------+ | Id | Name | +----+--------+ | 1 | Gaurav | | 2 | Rahul | | 3 | Raman | | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from tbl_2; +----+---------+ | Id | Name | +----+---------+ | A | Aarav | | B | Mohan | | C | Jai | | D | Harshit | +----+---------+ 4 rows in set (0.00 sec)
现在,下面的查询将在上述表之间进行CROSS JOIN。
mysql> Select tbl_1.id, tbl_2.id FROM tbl_1 CROSS JOIN tbl_2; +----+----+ | id | id | +----+----+ | 1 | A | | 2 | A | | 3 | A | | 4 | A | | 1 | B | | 2 | B | | 3 | B | | 4 | B | | 1 | C | | 2 | C | | 3 | C | | 4 | C | | 1 | D | | 2 | D | | 3 | D | | 4 | D | +----+----+ 16 rows in set (0.00 sec)
要形成内部联接,我们需要指定一个特殊的条件,称为联接谓词。实际上,内部联接或等效联接需要两个联接表中的行具有匹配的列值。为了理解它,以下查询将内部联接名为“ tbl_1”和“ tbl_2”的表。
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+----+ | id | id | +----+----+ | 4 | A | +----+----+ 1 row in set (0.00 sec)
结果集显示,列名称在tbl_1中的id = 4和在tbl_2中的id ='A'具有相同的值。
左联接也需要联接谓词,内部联接也需要。唯一的区别是使用LEFT联接联接两个表时,引入了left table和right table的概念。它返回左表中的所有行,其中包括满足join-predicate的行以及不满足join-predicate的行。对于与联接谓词不匹配的行,NULL出现在结果集中右表的列中。要理解它,请在使用表tbl_1和tbl_2的查询之后执行LEFT连接:
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+------+ | id | id | +----+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | A | +----+------+ 4 rows in set (0.02 sec)
它与LEFT连接类似,除了表的处理方式相反。使用RIGHT联接时,右表中的每一行都将出现在结果集中。对于右表中没有左表中匹配行的行,左表中的列将显示NULL。为了理解它,在使用表tbl_1和tbl_2的查询之后执行RIGHT连接:
mysql> SELECT tbl_1.id,tbl_2.id -> FROM tbl_1 RIGHT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +------+----+ | id | id | +------+----+ | 4 | A | | NULL | B | | NULL | C | | NULL | D | +------+----+ 4 rows in set (0.00 sec)