INNER JOIN内连接:
将一个表中的行与其他表中的行进行匹配
SELECT
column_list
FROM
t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...
WHERE where_conditions;
由于连接使用的是同一个列,所以可以使用这种格式:
SELECT
productCode, productName, textDescription
FROM
products
INNER JOIN productlines USING (productline);
LEFT JOIN
当使用LEFT JOIN
子句将t1
表加入t2
表时,如果来自左表t1
的行与基于连接条件(t1.c1 = t2.c1
)的右表t2
匹配,则该行将被包含在结果集中。
如果左表中的行与右表中的行不匹配,则还将选择左表中的行并与右表中的“假”行组合。“假”行对于SELECT
子句中的所有相应列都包含NULL
值。
换句话说,LEFT JOIN
子句允许您从匹配的左右表中查询选择行记录,连接左表(t1
)中的所有行,即使在右表(t2
)中找不到匹配的行也显示出来,但使用NULL
值代替。
下图可帮助您可视化LEFT JOIN
子句的工作原理。 两个圆圈之间的交点是两个表中匹配的行,左圆的剩余部分(白色部分)是t1
表中不存在t2
表中任何匹配行的行。 因此,左表中的所有行都包含在结果集中。
同上,查询相同列的时候使用USING(列名)更加方便
左连接可以用于查询两个表中不匹配的行
CROSS JOIN:
从连接的表返回行的笛卡儿积
假设使用CROSS JOIN
连接两个表。 结果集将包括两个表中的所有行,其中结果集中的每一行都是第一个表中的行与第二个表中的行的组合。 当连接的表之间没有关系时,会使用这种情况。
要特别注意的是,如果每个表有1000
行,那么结果集中就有1000 x 1000 = 1,000,000
行,那么数据量是非常巨大的。
selct * from t1 cross join t2 where t1.id = t2.id
也可以用INNER JOIN,LEFT JOIN进行自连接