目录
所有总结公用表
表sax:select * from sax
表sex:select * from sex
关联
一、union 与 union all 关键字(联合查询,以行形式合并获取数据)
注意:(1)多个目标表,可直接为多张已有的表,也可以是通过select查询得到的表。
(2)多个表要查询的字段列数必须相同
(3)不需要对每一个select结果集用order by子句来进行排序,在最后一条后使用order by对整个结果进行排序
1、union 语法及其用法
(1)语法:<表1> union <表2> union <...>
(2)作用:用于多张表按行合并数据,对多个结果集进行并集操作(不包括重复行),同时进行默认规则的排序。
(3)例子:
select name,age,study from sax union select name,age,study from sex
2、union all 语法及其用法
(1)语法:<表1> union all <表2> union all <...>
(2)作用:用于多张表按行合并数据,对多个结果集进行并集操作(包括重复行),不排序。
(3)例子:
select name,age,study from sax union all select name,age,study from sex
二、join 关键字
1.内连接(inner join 简称join)
(1)表示交集,也就是两张表的共同数据
(2)例子,表在顶部
select * from sax join sex on sax.id=sex.id
2.左外连接(left join)
(1)sax与sex的交集+sax的全部
(2)例子,表在顶部
select * from sax left join sex on sax.id=sex.id
3.右外连接(right join)
(1)sax与sex的集+sex的全部
(2)例子,表在顶部
select * from sax right join sex on sax.id=sex.id
4.全外连接(full outer join 在oracle中适用,在mysql中用联合查询union)
(1)并集,sax与sex的集+sex的全部+sax的全部
(2)例子,表在顶部
select * from sax full outer join sex on sax.id=sex.id
select name,age,study from sax union select name,age,study from sex
5.sax的独有
(1)sax独自拥有的
(2)例子,表在顶部
select * from sax left join sex on sax.id=sex.id where sex.id is null
6.sex的独有
(1)sex独自拥有的
(2)例子,表在顶部
select * from sax right join sex on sax.id=sex.id where sax.id is null
7.sax独有+sex独有(full outer join 在oracle中适用,在mysql中用联合查询union)
(1)sax独有+sex独有
(2)例子,表在顶部
select * from sax full outer join sex on sax.id=sex.id
where sax.id is null or sex.id is null
select * from sax left join sex on sax.id=sex.id where sex.id is null
union
select * from sax right join sex on sax.id=sex.id where sax.id is null
去重
三、distinct 和 union 区别
1.区别
(1)两者都具有去重的效果
(2)单表上有重复记录只能使用distinct,多表查询建议用union all
(3)从效率上说:distinct不建议使用,效率较低。union all和union 而言,union all效率更高。因为union相当于多表查询出的数据,进行去重,然后在进行排序后返回,而union all是多表查询合并后不排序就直接返回。使用union all多表查询的前提是要查的数据没有重复数据。
2.例子,表信息在顶部
(1)distinct
select distinct name,age,study from sax
(2)union
select name,age,study from sax union select name,age,study from sex
3.exists只检查行对的存在性,distinct用于禁止重复行的显示,而且distinct在禁止重复行的显示前需要排序检索的行,所以exists的性能比distinct好。