深入理解Sql的四种连接

1、内连接

(典型的连接运算,使用= 或<> 之类的比较运算比较符)包括相等连接的自然连接
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索student 和course表中学生标识号相同的所有行。
(1)innner join:有两种,显式和隐式的,返回连接表中符合连接条件和查询条件的数据行(所谓连接表就是数据库在做查询形成的中间表)
*

  1. 隐式的内连接没有inner join,形成的中间表经过on条件过滤后的笛卡尔积* ,如下
SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C,ORDERS O
WHERE C.ID=O.CUSTOMER_ID;

2 显式内连接,有inner join,形成的中间表经过on条件过滤后的笛卡尔积

select t1.c1, t2.c2 
from t1 
inner join t2 
on t1.c3 = t2.c3

sql server内联表值型函数和多语句表值函数 sql中的内连接_sql


内连接与左右连接不同,内连接的代码中,inner join 两边的t1和t2表的位置可以互换,结果都是一样的。

左连接

左连接:left [outer] join,左连接从左表(t1)取出所有记录,与右表(t2)匹配。如果没有匹配,以null值代表右边表的列。outer 可以不写,默认情况下不写outer关键字

select t1.c1, t2.c2 
from t1 
left join t2 
on t1.c3 = t2.c3

下面表结构显示学生信息存在student表中,学生分数存在score表中,我想知道每个学生每科成绩和个人信息,显然这里主表是score表,因为它存储每科每个学生成绩,每个学生对应多个成绩,如果是student表的话每个人只有一条记录,没有办法表示每科成绩。这里我们使用左连接,score表为左表,student表为右表

sql server内联表值型函数和多语句表值函数 sql中的内连接_数据库_02


左表score表写在left join前面是主表,因此左表的数据记录全部会出现在结果集中,而右表student中的记录如果在主表中没找到匹配,就不会出现在结果集中,上面的s_id=8的记录就没有出现在最终结果中

左连接还有一种情况,就是我只需要取出左表中不在右表的部分数据:

select t1.c1, t2.c2 
from t1 
left join t2 
on t1.c3 = t2.c3
where t1.c3 is nul

sql server内联表值型函数和多语句表值函数 sql中的内连接_右连接_03

右连接

右连接:right [outer] join,右连接从右表(t2)取出所有记录,与左表(t1)匹配。如果没有匹配,以null值代表左边表的列

select t1.c1, t2.c2 
from t1 
right join t2 
on t1.c3 = t2.c3

实际上,右连接取出的结果和左连接取出的结果是一样的,唯一的不同时字段顺序不同,两者的字段顺序是相反的,左连接的左表结果在右连接的右边,左连接的右表结果在右连接的左边;而对于每种连接来说,哪张表写在前面,哪张表的字段默认就会出现在结果集的左边(select后指定字段的情况除外)

sql server内联表值型函数和多语句表值函数 sql中的内连接_database_04


右连接还有一种情况,就是我只需要取出右表中不在左表的部分数据:

sql server内联表值型函数和多语句表值函数 sql中的内连接_右连接_05

select t1.c1, t2.c2 
from t1 
right join t2 
on t1.c3 = t2.c3
where t2.c3 is null

内连接(inner on)

内连接,也叫等值连接, inner join得出同时存在t1表和t2表的数据集,通俗一点说就是求两个表的交集。

select t1.c1, t2.c2 
from t1 
inner join t2 
on t1.c3 = t2.c3

sql server内联表值型函数和多语句表值函数 sql中的内连接_右连接_06


与左连接和右连接不同,内连接的代码中,“inner join”两边的t1表和t2表的位置可以互换,结果都一样。上面的s_id=8的记录没有出现在score表中所以就不是交集,被排出