联合

1.内部联合

  • 等值联合与不等值联合
  • 多个联合与多个条件
  • 交叉联合
  • 自联合

交叉联合:

不存在ON子句,将列举出所有表中的所有记录行。结果集是两个表的笛卡尔积:一个表中的所有行组合另一个表中的所有行。

select category,street from category cross join location order by street;

自联合:

select MD1.MemberId,MD1.Firstname,MD1.lastname,MD2.memberid,MD2.firstname,MD2.lastname,MD1.ZIPCODE,MD2.zipcode,MD1.street,MD2.street from MemberDetails as MD1 inner join MemberDetails as MD2 on MD1.street=MD2.Street and MD1.ZipCode=MD2.ZipCode and MD1.MemberId<MD2.MemberId;    --找到2个住址完全一样的人

2.外部联合

内部联合要求包含在联合中的两个表必须具有匹配的记录,ON子句的条件必须为真。

外部联合不需要两个表具有匹配记录,可以指定一个表总是返回结果,无论ON子句的条件是否为真,结果仍然服从任何where子句的过滤效果。

(1)左外部联合

outer join左边表中的所有记录都被返回在结果中。

--返回一个关于所有电影类型及其相应的电影的一个表。即使没有电影的电影类也要列举出来。
select category,filmname from category left outer join films on category.Categoryid=films.CategoryId;

select location.Street,MemberDetails.Street from location left outer join MemberDetails on Location.Street=MemberDetails.Street;

(2)右外部联合

outer join右边表中的所有记录都被返回在结果中。和左外部联合不存在功能上的差异。

select location.Street,MemberDetails.Street from location right outer join MemberDetails on Location.Street=MemberDetails.Street;

(3)完全外部联合

左外部联合和右外部联合的组合。返回左右两个表中的全部记录,当在另一个表中不存在匹配记录时,将返回一个NULL值。

select location.Street,MemberDetails.Street from location full outer join MemberDetails on Location.Street=MemberDetails.Street;

3.UNION的使用

将2个或多个select查询结果联合到一个结果集中。每个查询必须产生相同的列,列的数据类型必须相同,列的数据类型和顺序必须匹配。

默认情况下,UNION运算符合并了两个查询,但是仅仅包含不重复的记录,若要返回所有的记录,不管是否唯一,则需要使用ALL语句。

可以用ORDER BY 来排序结果。但是仅能添加一个ORDER BY子句,并且只可以使用第一个SELECT语句中的列名,但是会对整个查询结果排序。ORDER BY子句放在最后。

select filmname,yearreleased from films
union all
select lastname,year(dateofbirth) from MemberDetails
union all
select city,null from location
order by filmname;

原文地址:https://www.cnblogs.com/wy1290939507/p/4532059.html