1. MySQL 连接类型
![](https://img.haomeiwen.com/i20154612/0acb2d7e73eb53b9.png)
CROSS JOIN (交叉连接 或 笛卡尔积)
交叉连接返回两个集合的笛卡尔积,即表中的所有行的所有可能组合
INNER JOIN(内连接 或 等值连接)
内连接是最常用的连接操作,从数学的角度讲就是求两个表的交集,从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录
LEFT JOIN (左连接)
从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录
RIGHT JOIN (右连接)
从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录
MySQL 目前不支持全连接 FULL OUTER JOIN
2. 交叉连接 CROSS JOIN
交叉连接返回两个集合的笛卡尔积,即两个表中的所有行的所有可能的组合。这相当于内连接没有连接条件或者连接条件永远为真。
如果一个有 m 行的表和另一个有 n 行的表,它们交叉连接将返回 m * n 行数据
The CROSS JOIN keyword returns all records from both tables (table1 and table2).
![](https://img.haomeiwen.com/i20154612/04dfcbcf4844c4ad.png)
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
3. 内连接 INNER JOIN
INNER JOIN 返回两个表中满足连接条件的匹配行
![](https://img.haomeiwen.com/i20154612/7bae85499f79fb29.png)
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SELECT * FROM table1 INNER JOIN table2 ON table1.tradeId = table2.tradeId;
-- JOIN(省略INNER)
SELECT * FROM table1 JOIN table2 ON table1.tradeId = table2.tradeId;
-- where 关键词替代
SELECT * FROM table1, table2 WHERE table1.id = table2.id;
4. 左连接:LEFT JOIN
LEFT JOIN 返回左表的所有行,并包括右表中匹配的行,如果右表中没有匹配的行,将返回 NULL 值
![](https://img.haomeiwen.com/i20154612/c083f3fb6abb9cf8.png)
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
5. 右连接:RIGHT JOIN
RIGHT JOIN 返回右表的所有行,并包括左表中匹配的行,如果左表中没有匹配的行,将返回 NULL 值
![](https://img.haomeiwen.com/i20154612/471d564be1a9e3cb.png)
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
6. LEFT JOIN ON AND 和 LEFT JOIN ON WHERE
LEFT JOIN ON AND:在连接过程中直接应用条件,确保即使右侧表无匹配记录,只要左侧表记录满足 ON 子句中的 AND 条件,该记录就会出现在结果集中,保持 LEFT JOIN 的特性。
LEFT JOIN ON WHERE:在连接操作完成后对临时结果集进行过滤,可能导致原本应由 LEFT JOIN 保留的左侧表记录(无匹配右侧记录的情况)因不符合 WHERE 子句条件而被误删,失去 LEFT JOIN 的保留左侧表全记录的特性,结果更接近于 INNER JOIN
参考文档
https://www.w3schools.com/mysql/mysql_join.asp
- MySQL JOIN
https://www.sjkjc.com/mysql/join/
网友评论