创建视图报错ora00928_基本技能篇:SQL联合查询与视图

小伙伴们元旦快乐!这几天事情比较多, 文章有时候会迟到,但不会缺席哈。

前面几篇讲到SQL数据库的一些查询的基本语句,今天分享一下联合查询与视图,这些在实际项目中用的也很多,问题也不少。

一、联合查询: 关键词Union  和 Union all

我们先看下会用到的2张表:TableA ,TableB

db6e2390fdb9aa222f7c2d3619c080b7.png

现在我们做几个实验:

(1)将TableA中的第一条和第三条记录联合显示:

select   * from TableA WHERE xh=1union  all select   * from TableA WHERE xh=3

结果如下:

e2638284cce27b3b456098354fcb10a5.png

(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

aa00e0a6db8e99155420172b6cd3b121.png

(3) 常见错误一:列数量不一致导致报错

select xh,xm  from  TableAunion  all select xh,xm,sex  from  TableB

f79ecbd6d462ce2c31ac27791cd0fed6.png

(4)常见错误二:列数据类型不一致导致报错

select xh,xm, age from  TableAunion  all select xh,xm,sex  from  TableB

f2bf5fe7795d5f99d2445ce03677d5ea.png

总结:(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

a7f45779b136746cb0ccc38d4fae8662.png

二、视图:关键词View

这个视图其实在前面讲数据库对象的时候就已经提到了,它是由物理表构成的逻辑上的数据集,现在以TableC为例,进行以下实验:

f7a0fe64658dbf92c317ebc8326949a8.png

(1)创建视图V_tc,字段取TableC中的 gh,name,bm 三个字段:

create  view V_tcasselect  gh,name,bm from  TableCselect  * from  V_tc

8d22cc4f800b19fa52d750dccfa5a05a.png

(2)使用update直接更新V_tc 视图里的记录,查看结果:

update  V_tc set name ='王一九' where gh='001'select  * from V_tc

4cd8dd0ddfacf9030318e3cbb0f57a52.png

(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'

532abb9f0defe6080c9d7060b4bc9cb6.png

(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

a6bd44d8a2ee72b25b4830273fe1e39a.png

总结:(1)创建视图用create,修改视图结构用alter, 这个在前面讲数据库对象的修改和创建时候讲到了;

(2)当视图是由单一数据集构成时,可以用update命令进行更新,更新操作会直接影响到组成视图的物理表;但是当视图里是由多组数据集联合表达的时候,那不允许直接update,必须更新底层的物理表;

(3)视图里面也可以使用union 和 union all,只要被联合的数据集,同样满足字段数量和数据类型一致的条件;且一般在变更完视图的结构以后,必须用sp_refreshview去刷新下视图。

7d034f67ba357b642d54896ece0d4427.png

最后,我们结合以上的两个方面内容,将视图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

666a6aa4c4a270b6b743b947b9332bb6.png

怎么样,是不是日常用到的统计报表就出来了? 其实MSSQL是一门非常简单的工具语言,用好了做查询很方便的。

今天的分享就是这么多,更多精彩内容,进公众号里慢慢看吧。

2212789d3cc07d40fbbbe67cba6bc288.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值