SQL_各种join解析(inner join,left join,right join,full join)

刚开始学sql的时候,碰到join语句一脸蒙蔽,搞不清各种join都是干什么,最近在跑模型,有点闲工夫写博客,就记录一下学习join的过程。

join是用于连接两个或者多个表的语句,注意,这里的“连接”并不是你想象的直接把两个表拼起来,而是按照一定的规则来连接。它基本的语法是:

SELECT colum_name 
FROM table1
JOIN table2
ON condition

其中join关键字是可以替换成别的join的。它的意思是在table2中找到和table1中每一条记录满足条件condition的记录,最后选出指定名字的column。

1. inner join

inner join(也叫join),它为table1的每一条记录从table2的记录中找到符合条件的,然后按照column_name列出来,table1剩余那些找不到匹配的记录则抛弃不管。用下面这个例子来说明吧:

id name         id name 
-- ----         -- ---- 
1 Pirate        1 Rutabaga 
2 Monkey        2 Pirate 
3 Ninja         3 Darth Vader 
4 Spaghetti     4 Ninja 

现在有两个表(左表TableA和右表TableB),每个表里有4条记录,并都有两列(id和name)

我们现在运行join语句:

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

输出结果为:

id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja  4 NinjaInner 

它的运行过程是:

  1. 首先选出所有列名(也就是SELECT * 操作)。
  2. 然后看第一条记录“1 Pirate”,我们需要从TableB中找到一条和它在name字段相等的记录,也就是TableB中的“2 Pirate”,然后把它们连接起来组成新的记录“1 Pirate 2 Pirate”。
  3. 接着看第TableA的第二条记录“2 Mokey”,TableB中并没有和它相同name的记录,所以抛弃这一条记录。
  4. 最后我们把TableA后面的几条记录都做同样的操作,输出结果就如上所示(只有两个记录出来,没有匹配的记录都不输出)

inner join相当于找了两个表的在满足条件condition的情况下的交集

扫描二维码关注公众号,回复: 1787786 查看本文章

2. left join

这里我们还用上面那个例子的两个表格。上面讲join的时候说了在没有找到匹配的记录时,它不会输出,而left join会输出这条记录,同时,因为TableB没有匹配项,所以没有匹配的列名用null填充了。运行left join语句:

输出的结果为:

id  name      id  name
--  ----      --  ----
1   Pirate    2  Pirate
2   Monkey    null null
3   Ninja     4  Ninja
4   Spaghetti null null

可以看到结果把TableA的两列都输出了,由于第二条和第四条记录在TableB中没有和A的name匹配的记录,所以用null填充了。

3.right join

right join 和left join的原理一样,只不过right join会保留TableB中的所有记录,对于那些没有匹配的,则用null填充:

SELECT * FROM TableA
RIGHT JOIN TableB
ON TableA.name = TableB.name
输出结果为:
1 Pirate 2 Pirate
3 Ninja 4 Ninja
null null 1 Rutabaga
null null 3 Darth Vader

TableB中的记录都输出了,A中没有匹配的都用null填充

4.full join

full join就是同时保留TableA和TableB中的所有项,没有匹配的就都用null 保存:

SELECT * FROM TableA
FULL JOIN TableB
ON TableA.name = TableB.name
输出结果:
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja  4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader

猜你喜欢

转载自blog.csdn.net/yeshen4328/article/details/80849259