刚开始学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
它的运行过程是:
- 首先选出所有列名(也就是SELECT * 操作)。
- 然后看第一条记录“1 Pirate”,我们需要从TableB中找到一条和它在name字段相等的记录,也就是TableB中的“2 Pirate”,然后把它们连接起来组成新的记录“1 Pirate 2 Pirate”。
- 接着看第TableA的第二条记录“2 Mokey”,TableB中并没有和它相同name的记录,所以抛弃这一条记录。
- 最后我们把TableA后面的几条记录都做同样的操作,输出结果就如上所示(只有两个记录出来,没有匹配的记录都不输出)
inner join相当于找了两个表的在满足条件condition的情况下的交集
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