1. MySQL 连接类型
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).
-- 笛卡尔积
SELECT column_name(s)
FROM table1
CROSS JOIN table2;
-- or
SELECT column_name(s)
FROM table1, table2;
-- 注意与 INNER JOIN 的区别
-- SELECT * FROM table1, table2 WHERE table1.id = table2.id;
3. 内连接 INNER JOIN
INNER JOIN 返回两个表中满足连接条件的匹配行
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 值
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
- left join 中左表的全部记录将被全部查询,on 后面的条件不起作用
- 加上 where 后可对左表进行筛选
- on 可对右表进行限制
5. 右连接:RIGHT JOIN
RIGHT JOIN 返回右表的所有行,并包括左表中匹配的行,如果左表中没有匹配的行,将返回 NULL 值
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/
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
暂无评论内容