MySQL 7种Join的定义&图解&示范&结果(所有join范例) ...

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

MySQL 7种Join的定义&图解&示范&结果(所有join范例)


根本知识

笛卡尔积

笛卡尔(Descartes)乘积又叫直积。假设聚集A={a,b},聚集B={0,1,2},则两个聚集的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}
建表&填凑数据

  1. create table t_user(
  2. id int auto_increment primary key,
  3. account varchar(64) ,
  4. age int ,
  5. name varchar(16)
  6. )
  7. create table t_body(
  8. id int auto_increment primary key,
  9. account varchar(64) ,
  10. high int ,
  11. weight varchar(16)
  12. )
复制代码
  每个表都留了一条另一个表没有的数据(account对应不上)
  


1-Join

join其实就是inner join,是inner join缩写
  1. SELECT <select_list>
  2. FROM Table_A A
  3. INNER JOIN Table_B B
  4. ON A.Key = B.Key
复制代码

不带条件

  1. select * from t_user  join t_body  ;
复制代码
返回的笛卡尔积

account筛选

  1. select * from t_user  join t_body  on t_user.account = t_body.account;
复制代码

1-Inner Join 内连接

内连接返回两个表中匹配的行。实现方式可以是使用等值连接(ON条件),或者使用隐式的交叉连接(WHERE条件)。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. INNER JOIN Table_B B
  4. ON A.Key = B.Key
复制代码

不带条件

  1. select * from t_user inner join t_body  ;
复制代码
可以看到不带条件的时间其实就是两个聚集笛卡尔积的结果

account相同

  1. select * from t_user inner join t_body on t_user.account = t_body.account ;
复制代码
得到的是在左右两个表account相同的记载

where筛选

  1. select * from t_user inner join t_body where t_user.account = t_body.account ;
复制代码

玩点特殊的

  1. select * from t_user inner join t_body on t_user.age = t_body.high ;
复制代码

跨字段试试
加一条记载给t_body

  1. select * from t_user inner join t_body on t_user.id = t_body.account ;
复制代码
可以看到结果也被正确筛选出来了,我们删除这条刚加的继承往下试

2-Left Join 左连接

左连接返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则返回NULL值。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. LEFT JOIN Table_B B
  4. ON A.Key = B.Key
复制代码

不带条件

  1. select * from t_user left join t_body ;
复制代码

account筛选

  1. select * from t_user left join t_body on t_user.account  = t_body.account;
复制代码
也就是左边表的所有行都保留,右边的如果有匹配上了就有数据,匹配不到就把字段的值设置为NULL

3-Right Join 右连接

右连接返回右表中的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则返回NULL值。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. RIGHT JOIN Table_B B
  4. ON A.Key = B.Key
复制代码

不带条件

  1. select * from t_user right join t_body  ;
复制代码

account筛选


4-Outer Join 全连接

全连接返回左表和右表中的所有行,如果左表或右表中没有匹配的行,则返回NULL值。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. FULL OUTER JOIN Table_B B
  4. ON A.Key = B.Key
复制代码

4.1-Full Outer Join 全外连接

不带条件

mysql不支持直接全连接操作,可以把左连接和右连接的结果组装到一起就是了,但是不发起如许做,性能差
  1. select * from t_user full outer join t_body  ;
复制代码

account筛选

  1. SELECT *
  2. FROM t_user
  3. LEFT JOIN t_body ON t_user.account = t_body.account
  4. UNION
  5. SELECT *
  6. FROM t_user
  7. RIGHT JOIN t_body ON t_user.account = t_body.account
  8. WHERE t_user.account IS NULL;
复制代码

4.2-Left Outer Join 左外连接

不带参数

  1. select * from t_user left outer join  t_body
复制代码

account筛选

  1. select * from t_user left outer join  t_body
  2. on t_user.account  = t_body.account  ;
复制代码
跟left join是一个样的

4.3-Right Outer Join 右外连接

  1. select * from t_user right outer join  t_body on t_user.account  = t_body.account  ;
复制代码
跟right join是一样的

5-Left Excluding Join 左排除连接

左排除连接返回左表中没有在右表中找到匹配的行。它只返回左表中没有与右表匹配的行,而右表中匹配的行将被排除在结果集之外。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. LEFT JOIN Table_B B
  4. ON A.Key = B.Key
  5. WHERE B.Key IS NULL
复制代码

  1. select * from t_user left join t_body on t_user.account  = t_body.account where t_body.account is null ;
复制代码

6-Right Excluding Join 右排除连接

右排除连接返回右表中没有在左表中找到匹配的行。它只返回右表中没有与左表匹配的行,而左表中匹配的行将被排除在结果集之外。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. RIGHT JOIN Table_B B
  4. ON A.Key = B.Key
  5. WHERE A.Key IS NULL
复制代码

  1. select * from t_user right join t_body on t_user.account  = t_body.account where t_user.account is null ;
复制代码

7-Outer Excluding Join 外部排除连接

外部排除连接是左排除连接和右排除连接的结合,返回左表和右表中没有匹配的行。它返回左表和右表中没有与对方表匹配的行,而匹配的行将被排除在结果集之外。
  1. SELECT <select_list>
  2. FROM Table_A A
  3. FULL OUTER JOIN Table_B B
  4. ON A.Key = B.Key
  5. WHERE A.Key IS NULL OR B.Key IS NULL
复制代码

full outer join 在mysql是不支持的,需要组合实现,将左连接和右连接筛选出的数据组合
  1. select * from t_user left  join t_body on t_user.account  = t_body.account where  t_user.account is null or t_body.account is null
  2. union
  3. select * from t_user right  join t_body on t_user.account  = t_body.account where  t_user.account is null or t_body.account is null;
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表