为了从数据库导出数据直接生成excel表,为了客户对比数据使用,根据条件查找并去重等众多艰难险阻,不断百度和查看大量操作方式和实验得出这么几条经验,拿出来给大家分享一下,如果有哪里不对或者探讨请联系我,在此谢过!
Union(union all): 指令的目的是将两个 SQL 语句的结果集合并起来,得到你所需要的查询结果。
网上对这两者之间的一个总结:
- Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
- Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
- Union可以对字段名不同但数据类型相同的结果集进行合并;
- 如果字段名不同的结果集进行Union,那么对此字段的Order by子句将失效。
- 可以在最后一个结果集中指定Order by子句改变排序方式
举例:对于同一张表的不同操作取并集,对于score这个字段会自动排序,就是对于第一个字段会排序
select score,id,name
from student
where id > 2
union
select score,id,name
from student
where id < 4
使用union all排序:
select score,id,name
from student
where id > 2 and id < 7
union
select score,id,name
from student
where id < 4
union
select score,id,name
from student
where id > 8
order by id desc
order by子句必须写在最后一个结果集里,并且其排序规则将改变操作后的排序结果。对于Union、Union All都有效。
上面是对于基础的union操作下面是对于union all匹配问题
对于union all,不同表之间的查询需要同时显示的问题
查询所有字段是根据第一个查询字段来匹配的,就是必须和第一个查询字段的对应的个数 数据类型一样举例:
新建table1 和table2
create table A(
id INTEGER not null,
name VARCHAR2(100),
age NUMBER(21,6),
createDate DATE
)
create table B(
ids INTEGER not null,
name VARCHAR2(100),
address VARCHAR2(100),
sex NUMBER(21,6),
endDate DATE,
aID INTEGER
)
B通过aID存储A的id 通过union all可以显示所有信息 ,两个表也可以没有任何联系,存储aid是为了后面讲到的左右连接
下面就是查询A表和B表所有的信息了:↓
select
name,
age,
creadeDate,
address,
sex,
endDate
from
(select
name,
age,
createDate
'' address,
0 sex,
to_date('2000-01-01', 'yyyy-mm-dd') endDate
from A)
union all
(select
'' name,
0 age,
to_date('2000-01-01', 'yyyy-mm-dd') createDate
address,
sex,
endDate
from B
)
也可以通过左右内连接外连接查询所有信息 :↓
select
id,
name,
age,
creadeDate,
aid,
ids,
address,
sex,
endDate
from
(
(select
id,
name,
age,
createDate
0 aid,
0 ids,
'' address,
0 sex,
to_date('2000-01-01', 'yyyy-mm-dd') endDate
from A)H
right join
(select
0 id,
'' name,
0 age,
to_date('2000-01-01', 'yyyy-mm-dd') createDate
aid,
ids,
address,
sex,
endDate
from B
)T
on
H.id=T.aid
)
以上就是对于查询问题解决,查询所有信息根据第一个查询的所有字段,没有的可以使用类似占位符占据。对应个数类型需要一一对应,字符串可以使用 ' ' 数字类型可以使用0 日期类型使用 to_date('2000-01-01', 'yyyy-mm-dd'),其中2000-01-01可以随意填入,为了格式化日期使用