目录
文章导航
一、什么是表连接
在关系型数据库中,数据存放在不同的表中,若需要同时使用多张表的数据,就需要用到表连接。表连接(JOIN)是在多个表中间通过一定的连接条件,使表之间发生关联进而能从多个表之间获取数据。这种操作通常用于从多个相关表中获取并组合数据。实际使用中最常用的是左连接(left join)。
二、表连接的分类
现在有一张表A包含(日期,系统,接口成功率)三个字段,共24条记录
一张表B包含(日期,系统,故障数)三个字段,共14条记录
1.内连接 (Inner Join)
a.介绍:只返回两个表中匹配的行。
b.语法:SELECT … FROM table1 INNER JOIN table2 ON table1.column = table2.column;
c.常用场景:当你想从两个表中检索匹配的记录时。
select A.TIME,A.SYSNAME,A.SUC,B.NUM from test_20240229 A
INNER JOIN
test_20240229_B B
ON A.TIME=B.TIME AND A.SYSNAME=B.SYSNAME;
结果如下:可以看到只返回了两个表中匹配的行,共14条
2.左连接 (Left Join 或 Left Outer Join)
a.介绍:返回左表的所有行,以及右表中匹配的行。如果右表中没有匹配的行,则返回 NULL。
b.语法:SELECT … FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
c.常用场景:当你想查询左表中的所有记录,并且还想查询与右表匹配的记录时。
select A.TIME,A.SYSNAME,A.SUC,B.NUM from test_20240229 A
LEFT JOIN
test_20240229_B B
ON A.TIME=B.TIME AND A.SYSNAME=B.SYSNAME;
结果如下:可以看到返回了左表的所有行,以及右表中匹配的行,且右表中没有匹配的行,返回了 NULL,共24条
3.右连接 (Right Join 或 Right Outer Join)
a.介绍:返回右表的所有行,以及左表中匹配的行。如果左表中没有匹配的行,则返回 NULL。
b.语法:SELECT … FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
c.常用场景:较少使用,通常当你想查询右表中的所有记录,并且还想查询与左表匹配的记录时。
select A.TIME,A.SYSNAME,A.SUC,B.NUM from test_20240229 A
RIGHT JOIN
test_20240229_B B
ON A.TIME=B.TIME AND A.SYSNAME=B.SYSNAME;
结果如下:可以看到返回了右表的所有行,以及左表中匹配的行,且左表中没有匹配的行,返回了 NULL,共14条
4.全连接 (Full Join 或 Full Outer Join)
a.介绍:返回左表和右表中的所有行。如果某侧没有匹配的行,则返回 NULL。
b.语法:SELECT … FROM table1 FULL JOIN table2 ON table1.column = table2.column;
c.常用场景:当你想查询两个表中的所有记录,无论它们是否匹配时。
select A.TIME,A.SYSNAME,A.SUC,B.NUM from test_20240229 A
FULL JOIN
test_20240229_B B
ON A.TIME=B.TIME AND A.SYSNAME=B.SYSNAME;
在表B中新增一条记录,这个系统D在表A中不存在
结果如下:可以看到返回了左表和右表中的所有行。且某侧没有匹配的行,则返回 了NULL,共25条
5.交叉连接(CROSS JOIN)
a.介绍:交叉连接返回左表中的所有行与右表中的所有行的组合。
b.语法:SELECT … FROM table1 FULL JOIN table2 ON table1.column = table2.column;
c.常用场景:当你想查询两个表中的所有记录的笛卡尔积时。
select A.TIME,A.SYSNAME,A.SUC,B.NUM from test_20240229 A
,test_20240229_B B
where a.TIME=to_date('2024-02-01','yyyy-mm-dd') and a.sysname='系统A';
结果如下:可以看到仅仅是2月1日的系统A就有15条数据(如果表A有M条记录,表B有N条记录,那么交叉连接的结果将包含M * N条记录)
三、总结
连接方式 | 定义 | 图示 |
---|---|---|
内连接 | 内连接返回两个表中连接字段相等的行。如果一行在其中一个表中没有匹配,那么该行就不会出现在结果集中 | ![]() |
左连接 | 左连接返回左表中的所有行,以及右表中连接字段相等的行。如果左表的某行在右表中没有匹配行,则结果集中对应的右表部分将包含空值 | ![]() |
右连接 | 右连接返回右表中的所有行,以及左表中连接字段相等的行。如果右表的某行在左表中没有匹配行,则结果集中对应的左表部分将包含空值 | ![]() |
全连接 | 全连接返回左表和右表中的所有行。如果某行在另一个表中没有匹配行,则另一个表的选择列表列将包含空值 | ![]() |
交叉连接 | 交叉连接返回左表中的所有行与右表中的所有行的组合。这种连接也称为笛卡尔积。 | A的记录数*B的记录数 |