目录
一.内连接与外连接
1.内连接(inner join)
2.外连接(outer join)
二.两表连接
1.我们先来试试看内连接:
2.我们再来试试外连接
三.单表外连接
四.总结
一.内连接与外连接
先得介绍内连接和外连接两个概念:
要将两张表连接,有两种方式一种是内连接(inner join),第二种是内连接(outer join)
1.内连接(inner join)
这种连接需要:A,B表值都存在情况
2.外连接(outer join)
外连接又分左外连接和右外连接
左外连接是取A表全部,B表没有对应的值,则为null
右外连接是取B表全部,A表没有对应的值,则为null
语法:
SELECT 列名
FROM 左表
LEFT JOIN 右表
ON 左表.列名 = 右表.列名;
这样介绍概念可能还是比较抽象,来看下面的例题:
二.两表连接
例题链接:https://leetcode.cn/problems/combine-two-tables/description/
1.我们先来试试看内连接:
select firstname,lastname,city,state
from person,address
where person.personid=address.personid
我们可以发现输出结果比答案结果少了一个Allen的数据,我们观察上面的Person和Address表
我们发现Address表中的personid没有allen的id,由于内连接是取交集所以Allen没有被选中。
这就是在前面概念中叙述的:A,B表值都存在情况
2.我们再来试试外连接
select firstname,lastname,city,state
from person left join address
on person.personid=address.personid;
这样输出就对了。
我们可以可以这样理解外连接,当左外连接时固定住左表,去右表中依据on之后跟的条件去寻找符合条件的行,若是没寻找到则在那行写null,即左表原有的数据全部不变,只是通过右表扩充列。 right join 则反之。
这就是前面说的:左外连接是取A表全部,B表没有对应的值,则为null
三.单表外连接
例题链接:https://leetcode.cn/problems/rising-temperature/description/
单表外连接用于检索一个表中的所有数据
这题用内连接也能做出来,但是消耗的时间比外连接高太多了
上面时内连接,下面时外连接
所以我们直接来讲怎么用外连接解决这题:
select w1.id
from weather w1
left join weather w2
on datediff(w1.recordDate, w2.recordDate) = 1 #把每一天与前一天连接
where w1.temperature > w2.temperature #where 选择下温度大的
所以在有的时候用left join可以优化计算时间
四.总结
内连接和外连接都是用于连接多个表的查询操作。内连接是指只返回两个表中符合条件的行,而外连接则会返回符合条件的行以及不符合条件的行。
当需要查询两个表中有关联的数据,并且只想返回符合条件的数据时,应该使用内连接。内连接可以通过使用JOIN关键字或者WHERE子句来实现。
当需要查询两个表中有关联的数据,并且希望返回符合条件的数据以及不符合条件的数据时,应该使用外连接。外连接可以分为左外连接、右外连接和全外连接,分别表示返回左表中的所有数据、返回右表中的所有数据以及返回两个表中的所有数据。
因此,根据查询需求来选择使用内连接或外连接,可以更有效地获取所需的数据。