JOIN
2017-07-24 本文已影响0人
禾线子
1.语法结构
... FROM table1 INNER|LEFT|RIGHT JOIN table2 on condition
组成 | 含义 |
---|---|
table1 | 左表 |
table2 | 右表 |
INNER JOIN | 获取两个表中存在连接匹配关系的记录 |
LEFT JOIN | 获取左表完全记录,即使右表并无对应匹配记录 |
RIGHT JOIN | 与 LEFT JOIN 相反 |
2.原始表
左表(join_a).jpg 右表(join_b).jpg3.INNER JOIN
基础INNER JOIN.jpgINNER JOIN 是基于条件两张表的交集。在不指定条件(ON)的时候,得到的是两张表的笛卡尔积(即两张表所有的组合可能)。
可以看到,join_a 表中 id 为 1的记录出现了两次,这是因为在 join_b 表中有两个 name 为 Alice 的记录。
同时,可以看到,在 ON 条件的时候,name 字段加了引号,这应该就是 MySql 对语句中出现的特殊字符的处理吧。
然后,可以使用示例中的小技巧为结果增加行号。但奇怪的是,* 必须在@num := @num + 1 AS NUMBER
前面, 如果 * 在后面就会报错。
INNER JOIN 中可以使用 AND。
SET @num = 0;
SELECT
*, @num := @num + 1 AS NUMBER
FROM
join_a
INNER JOIN join_b ON join_a.`name` = join_b.`name`
AND join_a.id = join_b.id
INNER JOIN + AND.jpg
4.LEFT JOIN
LEFT JOIN,(或 LEFT OUTER JOIN,在Mysql中两者等价,推荐使用 LEFT JOIN)左连接从左表产生一套完整的记录,与匹配的记录(右表) 。如果没有匹配,右侧将包含 NULL。
基础 LEFT JOIN.jpgLEFT JOIN 还可以通过 WHERE 来模拟 INNER JOIN。
SELECT
*
FROM
join_a
LEFT JOIN join_b ON join_b.`name` = join_a.`name`
WHERE
join_b.id IS NOT NULL
LEFT JOIN + WHERE 模拟 INNER JOIN.jpg
LEFT JOIN + RIGHT JOIN 求差集。
SELECT
*
FROM
join_a
LEFT JOIN join_b ON join_a.`name` = join_b.`name`
WHERE
join_b.id IS NULL
UNION
SELECT
*
FROM
join_a
RIGHT JOIN join_b ON join_a.`name` = join_b.`name`
WHERE
join_a.id IS NULL
求差集.jpg
5.RIGHT JOIN
参见 LEFT JOIN。
6.STRAIGHT JOIN
STRAIGHT JOIN 完全等同于 INNER JOIN 只不过,JOIN 语法是根据“哪个表的结果集小,就以哪个表为驱动表”来决定谁先载入的,而 STRAIGHT JOIN 会强制选择其左边的表先载入。
往往我们在分析 MySql 处理性能时,如(Explain),如果发现MySql 在载入顺序不合理的情况下,可以使用这个语句,但往往mysql能够自动的分析并处理好。