小伙伴们元旦快乐!这几天事情比较多, 文章有时候会迟到,但不会缺席哈。
前面几篇讲到SQL数据库的一些查询的基本语句,今天分享一下联合查询与视图,这些在实际项目中用的也很多,问题也不少。
一、联合查询: 关键词Union 和 Union all
我们先看下会用到的2张表:TableA ,TableB
现在我们做几个实验:
(1)将TableA中的第一条和第三条记录联合显示:
select * from TableA WHERE xh=1union all select * from TableA WHERE xh=3
结果如下:
(2)分别用union 和union all来联合查询,观察遇到重复记录时的处理结果:
select * from TableA WHERE xh=1union select * from TableA WHERE xh=1select * from TableA WHERE xh=1union all select * from TableA WHERE xh=1
(3) 常见错误一:列数量不一致导致报错
select xh,xm from TableAunion all select xh,xm,sex from TableB
(4)常见错误二:列数据类型不一致导致报错
select xh,xm, age from TableAunion all select xh,xm,sex from TableB
总结:(1)使用union 和 union all 都可以达到联合查询的效果,将数据并集显示,但是union在合并数据集时会自动去重,也就是只显示不重复的数据,而union all则会原封不动的显示所有数据,这点在做财务统计的时候一定要注意,用的不对就会导致差账;
(2)union 和union all 在合并数据集的时候,要求待合并的集合字段数量和字段数据类型必须一样,如果不一样就会报错,上面第4个例子中的错误,如果改成下面的语句,就不会报错:
select xh,xm, convert(varchar(10),age) from TableAunion all select xh,xm,sex from TableB
二、视图:关键词View
这个视图其实在前面讲数据库对象的时候就已经提到了,它是由物理表构成的逻辑上的数据集,现在以TableC为例,进行以下实验:
(1)创建视图V_tc,字段取TableC中的 gh,name,bm 三个字段:
create view V_tcasselect gh,name,bm from TableCselect * from V_tc
(2)使用update直接更新V_tc 视图里的记录,查看结果:
update V_tc set name ='王一九' where gh='001'select * from V_tc
(3)修改视图,使用union all 语句关联查询出并集,并重复第(2)步中的操作:
alter view V_tcasselect gh,name,bm from TableC where gh='001'union all select gh,name,bm from TableC where gh='002'update V_tc set name ='王一九' where gh='001'
(4)将视图的字段加上表TableC中的yj ,并刷新视图,观察结果:
alter view V_tcasselect gh,name,bm,yj from TableC where gh='001'union all select gh,name,bm,yj from TableC where gh='002'sp_refreshview V_tcselect * from V_tc
总结:(1)创建视图用create,修改视图结构用alter, 这个在前面讲数据库对象的修改和创建时候讲到了;
(2)当视图是由单一数据集构成时,可以用update命令进行更新,更新操作会直接影响到组成视图的物理表;但是当视图里是由多组数据集联合表达的时候,那不允许直接update,必须更新底层的物理表;
(3)视图里面也可以使用union 和 union all,只要被联合的数据集,同样满足字段数量和数据类型一致的条件;且一般在变更完视图的结构以后,必须用sp_refreshview去刷新下视图。
最后,我们结合以上的两个方面内容,将视图V_tc修改一下,满足日常统计上的需求,代码如下(手机上看代码可以左右拖动):
alter view V_tcasselect * from TableC union all select '--','--' ,bm+'小计',sum(yj) from TableC group by bmunion all select '--','--' , '总计',sum(yj) from TableC select * from V_tc order by bm,gh
怎么样,是不是日常用到的统计报表就出来了? 其实MSSQL是一门非常简单的工具语言,用好了做查询很方便的。
今天的分享就是这么多,更多精彩内容,进公众号里慢慢看吧。