联合
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;