内外连接的目的就是将多个表的所有栏位汇集成一个表形式的集合显示出来!后续再自己选择要显示哪些栏位。
--先创建2个表:A1、A2
CREATE TABLE A1
(
ID INT,
NAME VARCHAR(20)
)
CREATE TABLE A2
(
ID INT,
WeekDay VARCHAR(20)
)
INSERT INTO A1 VALUES(1,'n123'),(2,'NIKI'),(3,'LUCY'),(4,'QIQI')
INSERT INTO A2 VALUES(1,'Monday'),(1,'Tuesday'),(4,'Wednesday'),(3,'Thursday'),(6,'Friday')
go
/*内外连接的目的就是将多个表的所有栏位汇集成一个表形式的集合显示出来。后续再自己选择要显示哪些栏位。*/
一、《内连接》:
--<内连接>inner join/join
select * from A1
select * from A2
--下面2句的结果一样:
select * from A1 inner join A2 ON A1.ID=A2.ID --A1是主,A1的栏位排在前面。
select * from A1 join A2 on A1.ID=A2.ID --A1是主,A1的栏位排在前面。
--select * from A2 join A1 on A1.ID=A2.ID /*A2是主,总体结果集是一样的,但是顺序不一样,A2的栏位排在前面。*/
结果:
二、《外连接》:
1.左外连接left join / left outer join
--左外连接left join/left outer join
select * from A1
select * from A2
--下面2句的结果一样:
select * from A1 left join A2 ON A1.ID=A2.ID
select * from A1 LEFT OUTER JOIN A2 ON A1.ID=A2.ID
结果:
2.右外连接right join / right outer join
--右外连接right join/right outer join
select * from A1
select * from A2
--下面2句的结果一样:
select * from A1 right join A2 ON A1.ID=A2.ID
select * from A1 RIGHT OUTER JOIN A2 ON A1.ID=A2.ID
结果:
3.全外连接full join / full outer join
--全外连接full join/full outer join
select * from A1
select * from A2
--下面2句的结果一样:
select * from A1 full join A2 ON A1.ID=A2.ID --A1的栏位显示在前面
select * from A1 full outer join A2 ON A1.ID=A2.ID --A1的栏位显示在前面
--select * from A2 full join A1 ON A1.ID=A2.ID --A2的栏位显示在前面
/*最后这句与上面2句总的结果是一样的,但是匹配顺序不一样。因为A2的栏位显示在前面,匹配的表是A1。
即A2先拿第一条出来,然后去A1查找匹配,若在A1存在满足条件的条目,就返回结果集,继续A2的下一条,
直到A2全部拿完出来。最后A1那些全部不满足条件(无法匹配A2)的条目都返回结果集,而A2的相应栏位显示为null。*/
结果:
三、《记录合并》:
union all和union,即联合,就是将查出来的记录合并成一个集合显示出来,与上面内外连接时后者结果集并排水平显示在后面不同的是,这里是直接竖直方向连接在第一个查询结果集的后面。
union all不会对结果集排序,而union会对结果集进行默认规则的排序。
可以将多个结果集合并串起来,而不仅仅是两个。使用union和union all必须保证各个select 集合的结果有相同个数的列,并且对应的列的类型是一样的,但列名则不一定需要相同,因最后会将第一个select 集合的结果的列名作为总的结果集的列名。
【Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All。几个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致)。】
(因为最后得到的总的结果集的栏位名是第一个查询结果集的栏位名,所以,前后查询的栏位数要一样,对应的栏位类型也要一样!)
--union all
/*目标的栏位数量要一样,对应的栏位类型也要一样(类型具体是多少位或多少字符不管,只要类型一样就行)!!!
最后所得的总的结果集的栏位名是union all前面的查询所得到的栏位名。
同时,会罗列出所有条目,包括重复的条目(本查询包含的重复条目、本查询结果与另一查询结果重复的条目)!*/
select * from A1
union all
select * from AAA_7
--union
/*目标的栏位数量要一样,对应的栏位类型也要一样(类型具体是多少位或多少字符不管,只要类型一样就行)!!!
最后所得的总的结果集的栏位名是union all前面的查询所得到的栏位名。
同时,会去除所有重复条目(包括本查询包含的重复条目、本查询结果与另一查询结果重复的条目),只显示一条!*/
select * from A1
union
select * from AAA_7
结果:
附A1、AAA_7表查询结果: