MySQL 7种Join的定义&图解&示范&结果(所有join范例)
MySQL 7种Join的定义&图解&示范&结果(所有join范例)https://img-blog.csdnimg.cn/img_convert/26e341a4cfacfb59edf731fa31de28ff.png
根本知识
笛卡尔积
笛卡尔(Descartes)乘积又叫直积。假设聚集A={a,b},聚集B={0,1,2},则两个聚集的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}
建表&填凑数据
create table t_user(
id int auto_increment primary key,
account varchar(64) ,
age int ,
name varchar(16)
)
create table t_body(
id int auto_increment primary key,
account varchar(64) ,
high int ,
weight varchar(16)
)
每个表都留了一条另一个表没有的数据(account对应不上)
https://img-blog.csdnimg.cn/img_convert/a72910c61f7f5cb0af71018435250d88.png
https://img-blog.csdnimg.cn/img_convert/83196f1a1eaf8bd1ec7288cec8a902c3.png
1-Join
join其实就是inner join,是inner join缩写
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
https://img-blog.csdnimg.cn/img_convert/a6b241655dda02b7438a979eafdddea6.png
不带条件
select * from t_userjoin t_body;
返回的笛卡尔积
https://img-blog.csdnimg.cn/img_convert/bfe61d16945c5a44f78f1df0f38611c8.png
account筛选
select * from t_userjoin t_bodyon t_user.account = t_body.account;
https://img-blog.csdnimg.cn/img_convert/4a5842d8c87422b40cd79c6fe2c69a61.png
1-Inner Join 内连接
内连接返回两个表中匹配的行。实现方式可以是使用等值连接(ON条件),或者使用隐式的交叉连接(WHERE条件)。
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
https://img-blog.csdnimg.cn/img_convert/d839cd75069bf230fdfdbc007df3ab0b.png
不带条件
select * from t_user inner join t_body;
可以看到不带条件的时间其实就是两个聚集笛卡尔积的结果
https://img-blog.csdnimg.cn/img_convert/1f48a4a659ef988ad1d74bec2ee9550e.png
account相同
select * from t_user inner join t_body on t_user.account = t_body.account ;
得到的是在左右两个表account相同的记载
https://img-blog.csdnimg.cn/img_convert/2460c9f6502a520f7468ef79338bc92f.png
where筛选
select * from t_user inner join t_body where t_user.account = t_body.account ;
https://img-blog.csdnimg.cn/img_convert/017f66aed6f2694a354eb37a25ee0e87.png
玩点特殊的
select * from t_user inner join t_body on t_user.age = t_body.high ;
https://img-blog.csdnimg.cn/img_convert/a5f2d93f72c610fde328ce2b114ae60d.png
跨字段试试
加一条记载给t_body
https://img-blog.csdnimg.cn/img_convert/90523ef2a1b275e51ed719d744169301.png
select * from t_user inner join t_body on t_user.id = t_body.account ;
可以看到结果也被正确筛选出来了,我们删除这条刚加的继承往下试
https://img-blog.csdnimg.cn/img_convert/f13531181cb6ef2a4e0bb77f1cfc94a7.png
2-Left Join 左连接
左连接返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则返回NULL值。
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
https://img-blog.csdnimg.cn/img_convert/65345dd81d0de8268551830befbac680.png
不带条件
select * from t_user left join t_body ;
https://img-blog.csdnimg.cn/img_convert/24b06625e86fcbf7176b379f45b5fe31.png
account筛选
select * from t_user left join t_body on t_user.account= t_body.account;
也就是左边表的所有行都保留,右边的如果有匹配上了就有数据,匹配不到就把字段的值设置为NULL
https://img-blog.csdnimg.cn/img_convert/eba8e3cb8655575a0a6119c047fe84fc.png
3-Right Join 右连接
右连接返回右表中的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则返回NULL值。
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
https://img-blog.csdnimg.cn/img_convert/f36bff0189a2378ba45bfcf74be92bff.png
不带条件
select * from t_user right join t_body;
https://img-blog.csdnimg.cn/img_convert/ac2c52f9796c03e2c86ca9d4ba18e6b8.png
account筛选
https://img-blog.csdnimg.cn/img_convert/4b671e280d17dfb81301062e40cf1ee0.png
4-Outer Join 全连接
全连接返回左表和右表中的所有行,如果左表或右表中没有匹配的行,则返回NULL值。
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
https://img-blog.csdnimg.cn/img_convert/a8836eaebad504e61c27ec7174554181.png
4.1-Full Outer Join 全外连接
不带条件
mysql不支持直接全连接操作,可以把左连接和右连接的结果组装到一起就是了,但是不发起如许做,性能差
select * from t_user full outer join t_body;
https://img-blog.csdnimg.cn/img_convert/e592ac5310a5a0dce981839a0c3d05ec.png
account筛选
SELECT *
FROM t_user
LEFT JOIN t_body ON t_user.account = t_body.account
UNION
SELECT *
FROM t_user
RIGHT JOIN t_body ON t_user.account = t_body.account
WHERE t_user.account IS NULL;
https://img-blog.csdnimg.cn/img_convert/0e7cb9cce9b097e70caf0aaef40fe87a.png
4.2-Left Outer Join 左外连接
不带参数
select * from t_user left outer joint_body
https://img-blog.csdnimg.cn/img_convert/b96d561f24970169f5b0bf2c26192048.png
account筛选
select * from t_user left outer joint_body
on t_user.account= t_body.account; 跟left join是一个样的
https://img-blog.csdnimg.cn/img_convert/0590f9d48e897c550c2ead63259bb6fc.png
4.3-Right Outer Join 右外连接
select * from t_user right outer joint_body on t_user.account= t_body.account;
跟right join是一样的
https://img-blog.csdnimg.cn/img_convert/2ab26403dae2daacdcf90896e6060a5c.png
5-Left Excluding Join 左排除连接
左排除连接返回左表中没有在右表中找到匹配的行。它只返回左表中没有与右表匹配的行,而右表中匹配的行将被排除在结果集之外。
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL https://img-blog.csdnimg.cn/img_convert/9242dbe624d37469593f14d87e6fba5a.png
select * from t_user left join t_body on t_user.account= t_body.account where t_body.account is null ;
https://img-blog.csdnimg.cn/img_convert/31afb4d81e15ea0958178b36d6899e8f.png
6-Right Excluding Join 右排除连接
右排除连接返回右表中没有在左表中找到匹配的行。它只返回右表中没有与左表匹配的行,而左表中匹配的行将被排除在结果集之外。
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL https://img-blog.csdnimg.cn/img_convert/64bf38be7214cdb233679af345fa5fbb.png
select * from t_user right join t_body on t_user.account= t_body.account where t_user.account is null ;
https://img-blog.csdnimg.cn/img_convert/62be9858b52aa379176a48bd81226ff2.png
7-Outer Excluding Join 外部排除连接
外部排除连接是左排除连接和右排除连接的结合,返回左表和右表中没有匹配的行。它返回左表和右表中没有与对方表匹配的行,而匹配的行将被排除在结果集之外。
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL https://img-blog.csdnimg.cn/img_convert/a20eee42be7ab8d57059641f2d4b91cb.png
full outer join 在mysql是不支持的,需要组合实现,将左连接和右连接筛选出的数据组合
select * from t_user leftjoin t_body on t_user.account= t_body.account wheret_user.account is null or t_body.account is null
union
select * from t_user rightjoin t_body on t_user.account= t_body.account wheret_user.account is null or t_body.account is null;
https://img-blog.csdnimg.cn/img_convert/ba3b362c579fbda0e5e964c7f86318ae.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]