SQL的四种连接-左外连接、右外连接、内连接、全连接
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL的四种连接-左外连接、右外连接、内连接、全连接SQL的四种连接-左外连接、右外连接、内连接、全连接
联接条件可在FROM或WHERE⼦句中指定,建议在FROM⼦句中指定联接条件。
WHERE和HAVING⼦句也可以包含搜索条件,以进⼀步筛选联接条件所选的⾏。
联接可分为以下⼏类:
1、内联接(典型的联接运算,使⽤像 = 或 <> 之类的⽐较运算符)。
包括相等联接和⾃然联接。
内联接使⽤⽐较运算符根据每个表共有的列的值匹配两个表中的⾏。
例如,检索 students和courses表中学⽣标识号相同的所有⾏。
2、外联接。
外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM⼦句中指定外联接时,可以由下列⼏组关键字中的⼀组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER⼦句中指定的左表的所有⾏,⽽不仅仅是联接列所匹配的⾏。
如果左表的某⾏在右表中没有匹配⾏,则在相关联的结果集⾏中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。
将返回右表的所有⾏。
如果右表的某⾏在左表中没有匹配⾏,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有⾏。
当某⾏在另⼀个表中没有匹配⾏时,则另⼀个表的选择列表列包含空值。
如果表之间有匹配⾏,则整个结果集⾏包含基表的数据值。
3、交叉联接
交叉联接返回左表中的所有⾏,左表中的每⼀⾏与右表中的所有⾏组合。
交叉联接也称作笛卡尔积。
FROM ⼦句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,⽤左或右向外联接指定表或视图时,表或视图的顺序很重要。
有关使⽤左或右向外联接排列表的更多信息,请参见使⽤外联接。
例⼦:
-------------------------------------------------
a表 id name b表 id job parent_id
1 张3 1 23 1
2 李四 2 34 2
3 王武 3 3
4 4
a.id同parent_id 存在关系
--------------------------------------------------
1)内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
2)左连接
select a.*,b.* from a left join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null
3)右连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
4)完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null
第⼀部分、连接查询
⼀、内连接
内连接查询操作列出与连接条件匹配的数据⾏,它使⽤⽐较运算符⽐较被连接列的列值。
内连接分三种:
1、等值连接:在连接条件中使⽤等于号(=)运算符⽐较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接:在连接条件使⽤除等于运算符以外的其它⽐较运算符⽐较被连接的列的列值。
这些运算符包括>、>=、<=、<、!>、!<和<>。
3、⾃然连接:在连接条件中使⽤等于(=)运算符⽐较被连接列的列值,但它使⽤选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
⼆、外连接
返回到查询结果集合中的不仅包含符合连接条件的⾏,⽽且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据⾏。
三、交叉连接
交叉连接不带WHERE ⼦句,它返回被连接的两个表所有数据⾏的笛卡尔积,返回到结果集合中的数据⾏数等于第⼀个表中符合查询条件的数据⾏数乘以第⼆个表中符合查询条件的数据⾏数。
例,titles表中有6类图书,⽽publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48⾏。
第⼆部分、实例说明(实例参考底部链接)
⼀、内连接
select *
from [Book] as b,[Student] as s
where b.StudentId=s.StudentId
等价于如下(也可以不要关键字inner,此为系统默认)
select *
from [Book] as b inner join [Student] as s
ON b.StudentId=s.StudentId
执⾏过程
相当于内连接的向右连接。
以from [Book] inner join [Student]等式右边为基准,即以Student表(等式右表,s表)的s.StudentId为基准,遍历Book表(等式左表,Book表)中与之匹配的b.StudentId,然后拼接返回。
结果含有重复的列,b.StudentId和s.StudentId。
说明
这与where b.StudentId=s.StudentId或者s.StudentId=b.StudentId位置没有关系。
它仅仅代表满⾜条件⽽已,不判定谁为基准。
以下外连接,交叉连接相同操作。
⼆、外连接
1、左外连接
代码
select *
from [Book] as b left join [Student] as s
ON b.StudentId=s.StudentId
执⾏过程
即以from [Book] left join [Student]的Book表为基准,即以Book表(b表)的b.StudentId为基准。
遍历Student表(s表)中与之匹配的b.StudentId。
若b.StudentId含有s.StudentId匹配项,则进⾏拼接,然后遍历Student表的下⼀条s.StudentId,当查询完毕则进⼊下⼀条b.StudentId。
若
b.StudentId没有相应s.StudentId匹配项时,则显⽰左表的项,拼接右表的项显⽰为NULL。
2、右外连接
代码
select *
from [Book] as b right join [Student] as s
ON b.StudentId=s.StudentId
结果
执⾏过程
即以from [Book] right join [Student]的Student表为基准,即以Student表(s表)的s.StudentId为基准。
遍历Book表(b表)中与之匹配的s.StudentId。
若s.StudentId含有b.StudentId匹配项,则进⾏拼接,然后遍历Book表的下⼀条b.StudentId,当查询完毕则进⼊下⼀条s.StudentId。
若s.StudentId没有相应b.StudentId匹配项时,则显⽰右表的项,拼接左表的项显⽰为NULL。
3、全外连接
代码
select *
from [Book] as b full outer join [Student] as s
ON b.StudentId=s.StudentId
结果
执⾏过程
即以from [Book] full outer join [Student]中先以Book表进⾏左外连接,然后以Student表进⾏右外连接。
三、交叉连接
代码
select *
from [Book] as b CROSS Join [Student] as a
Order by b.BookId
结果
执⾏过程
即是按照Order排序的Id,把要Join的右表⽆条件拼接过来。
这样依次执⾏,这样这种记录便为两个表的记录的笛卡尔积。
总结:
格式:
select *
from [Book] as b left join [Student] as s
ON b.StudentId=s.StudentId
项⽬⽰例:
$sql="select m.id,,p.id,p.sysset,p.readerset,p.bookset,p.borrowback,p.sysquery from tb_manager as m left join tb_purview as p on m.id=p.id where name='$_SESSION[admin_name]'";
注意到field即查询域多个表的是写在⼀起的,同时⽤到了别名的⽅法特别实⽤,后⾯还可以多家⼀条where筛选语句。