SQL中JOIN和UNION区别及用法
转载:http://chengheng1984.blog.163.com/blog/static/17947412201012215738844/
JOIN用于按照ON条件联接两个表,主要有四种:
INNER JOIN:内部联接两个表中的记录,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。我理解的是只要记录不符合ON条件,就不会显示在结果集内。
LEFT JOIN / LEFT OUTER JOIN:外部联接两个表中的记录,并包含左表中的全部记录。如果左表的某记录在右表中没有匹配记录,则在相关联的结果集中右表的所有选择列表列均为空值。理解为即使不符合ON条件,左表中的记录也全部显示出来,且结果集中该类记录的右表字段为空值。
RIGHT JOIN / RIGHT OUTER JOIN:外部联接两个表中的记录,并包含右表中的全部记录。简单说就是和LEFT JOIN反过来。
FULL JOIN / FULL OUTER JOIN: 完整外部联接返回左表和右表中的所有行。就是LEFT JOIN和RIGHT JOIN和合并,左右两表的数据都全部显示。
JOIN的基本语法:
Select table1.* FROM table1 JOIN table2 ON table1.id=table2.id
UNION运算符
将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同。另一个Select语句的结果集列名将被忽略。
其中两种不同的用法是UNION和UNION ALL,区别在于UNION从结果集中删除重复的行。如果使用UNION ALL 将包含所有行并且将不删除重复的行。
(ZZ)
1.交集
Inner Join, 等价于select * from a b where a.id=b.id ,*表示a.*,b.*,一笔纪录你可以取出a,b的栏位
left join 或right join 可以表示差集 ,一笔纪录你可以取出a,b的栏位
full join才是表示并集,select * from a full join b on a.id=b.id
,a.id=b.id 为一笔纪录,其他不等的纪录都可以显示,例如a的栏位和null栏位组合,或者null栏位和a组合~
另外一个cross join,如果不加上where条件,就是a的纪录和b的纪录任一组合,加入a有15笔,b有15笔,那么 a cross join b就有225笔,不会有null栏位(当然原来表有另当别论)
cross join加上where 就是inner join
select * from a crossjoin b where a.id = b.id等价于select * from a full join b on a.id=b.id
P.S. not in-->select * from a where a.id in (select b.id from b),*表示a你只可以取出a,b的栏位,not exists,也是如此,这些其实不算是交集或者差集的讨论的范围,每次只是对一个表的纪录进行选取而已,看这句select * from a where a.id not in ('1','2')这个算就不能算是差集
2.UNION表示并集,我觉得不可以完全这样讲
union 和join不一样,union这个运算子是将资料列合并,而join是将栏位合并(我前面所讲)!
如果从栏位合并来讲,full join 算是并集,inner join 算是交集!left join 或right join 不完全是差集,也包括交集的结果,具体你的语句的查询结果如何还是要看实际的语句,就如cross join,加上where就变成inner join,前后的结果相差甚远
网上找了一遍,发现一些新东西:
并集 :union: select × from a union (all) select × from b aUb
交集: intersect: select × from a intersect select × from b anb
差集: minus: select × from a minus select × from b a-b