深入理解Sql的四种连接
1、内连接
(典型的连接运算,使用= 或<> 之类的比较运算比较符)包括相等连接的自然连接
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索student 和course表中学生标识号相同的所有行。
(1)innner join:有两种,显式和隐式的,返回连接表中符合连接条件和查询条件的数据行(所谓连接表就是数据库在做查询形成的中间表)
*
- 隐式的内连接没有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
内连接与左右连接不同,内连接的代码中,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表为右表
左表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
右连接
右连接:right [outer] join,右连接从右表(t2)取出所有记录,与左表(t1)匹配。如果没有匹配,以null值代表左边表的列
select t1.c1, t2.c2
from t1
right join t2
on t1.c3 = t2.c3
实际上,右连接取出的结果和左连接取出的结果是一样的,唯一的不同时字段顺序不同,两者的字段顺序是相反的,左连接的左表结果在右连接的右边,左连接的右表结果在右连接的左边;而对于每种连接来说,哪张表写在前面,哪张表的字段默认就会出现在结果集的左边(select后指定字段的情况除外)
右连接还有一种情况,就是我只需要取出右表中不在左表的部分数据:
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
与左连接和右连接不同,内连接的代码中,“inner join”两边的t1表和t2表的位置可以互换,结果都一样。上面的s_id=8的记录没有出现在score表中所以就不是交集,被排出