transact---sql高级查询(下)

5:使用having关键字来筛选结果

6:使用compute和compute by子句

7:使用嵌套查询

8:分布式查询

E:使用having关键字来筛选结果

当完成对数据结果的查询和统计后,可以使用having关键字来对查询和计算的结果进行一步的筛选

例:检索出work表中学历是大专或者是中专的人数

select 学历,count(学历) from work group by 学历 having 学历 in("'大专"',"'中专"')

说明:1:having关键字都与group by用在一起.

2:having不支持对列分配的别名

例如:select 学历,"'大于5的人数"'=count(学历) from work group by 学历 having 大于5的人数>5 [错错]

改为:select 学历,"'大于5的人数"'=count(学历) from work group by 学历 having count(学历)>5

F:使用compute和compute by

使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列

select * from work [查询所得到的各列的数据的细节]

compute max(基本工资),min(基本工资) [统计之后的结果]

这个例子中没有使用by关键字,返回的结果是最后添加了一行基本工资的最大值和最小值,也可增加by关键字.

例:select * from work order by 学历

compute max(基本工资),min(基本工资) by 学历

比较:select 学历,max(基本工资),min(基本工资) from work group by 学历

说明:1:compute子句必须与order by子句用在一起

2:compute子句可以返回多种结果集.一种是体现数据细节的数据集,可以按分类要求进行正确的分类;另一种在分类的基础上进行汇总产生结果.

3:而group by子句对每一类数据分类之后只能产生一个结果,不能知道细节

G:使用嵌套查询

查询中再查询,通常是以一个查询作为条件来供另一个查询使用

例:有work表和部门表

A:检索出在部门表中登记的所有部门的职工基本资料

select * from work where 部门编号 in [not in](select 部门编号 from dbo.部门)

B:检索出在work表中每一个部门的最高基本工资的职工资料

select * from work a where 基本工资=(select max(基本工资) from work b where a.部门名称=b.部门名称)

说明:由外查询提供一个部门名称给内查询,内查询利用这个部门名称找到该部门的最高基本工资,然后外查询根据基本工资判断是否等于最高工资,如果是的,则显示出来.

相当于:select * from work,(select 部门名称,max(基本工资) as 基本工资 from work group by 部门名称 as t) where work.基本工资=t.基本工资 and work.部门名称=t.部门名称

C:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料

select * from 嵌套work where 职工号 in (select 职工号 from 嵌套部门) and 姓名 in (select 姓名 from 嵌套部门) [察看结果,分析原因]

改:select * from 嵌套work a,嵌套部门 b where a.职工号=b.职工号 and a.姓名=b.姓名

改:select * from 嵌套work where 职工号=(select 职工号 from 嵌套部门) and 姓名=(select 姓名 from 嵌套部门) [行吗?为什么,分析原因?]

在嵌套中使用exists关键字[存在]

例:1:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料

select * from 嵌套work a where exists (select * from 嵌套部门 b where a.姓名=b.姓名 and a.职工号=b.职工号)

2:在work表检索出在部门表没有的职工

select * from work where not exists (select * from 部门 where 部门.部门编号=work.部门编号)

能否改成:select * from work where exists (select * from 部门 where 部门.部门编号<>work.部门编号)

在列清单中使用select

例:1:在work1表和部门表中检索出所有部门的部门名称和基本工资总和

select 部门名称,(select sum(基本工资) from work1 b where a.部门编号=b.部门编号) from 部门 a

2:检索各部门的职工人数

select 部门编号,部门名称,(select count(职工号) from work1 a where a.部门编号=b.部门编号) as 人数 from 部门 b

3:在商品表和销售表中查询每一职工的姓名,所属部门,销售总量

select 姓名,所属部门,(select sum(销售量) from 商品销售 a where a.职工号=b.职工号) as 销售总量 from 嵌套部门 b

H:分布式查询

我们以前的查询都只是基于一个服务器中的一个数据库的查询,如果一个查询是要跨越一个服务器,像这样的查询就是分布式查询,那么我们以看到分布查询就是数据源自于两个服务器.要进行分布式查询必须先创建一个“链接服务器”,以便让本地的用户能够映射到过程服务器.

“链接服务器”的创立

A:在“链接服务器”里面输入以后为了方便访问该链接服务器的名称[任意]

B:在“提供程序名称”里面选择“Microsoft OLE DB Provider for SQL Server”

C:在“数据源”里面输入服务器的网络名

D:本地登录,远程用户和远程密码里面分别输入一个本地登录用户,远程登录和远程密码以便让本地SQL Server登录映射为链接服务器上的用户

E:访问方法:格式:链接服务器的名称.数据库名.dbo.表名

链接服务器有两个特点:

1:通过链接服务器不能删除链接源服务器的任何对像.

2:能过链接服务器可以对链接源服务器的表进行insert,updae,delete操作.

视图

1:什么是视图

2:视图和查询的区别

3:视图的优点

4:如何创建和管理视图

5:如何通过视图修改基本表的数据

6:如何通过视图实现数据的安全性

A:什么是视图:

视图(view):从一个或几个基本表中根据用户需要而做成一个虚表

1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据

2:视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户

B:视图与查询的区别:

视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:

它们的区别在于:1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是.

2:更新限制的要求不一样

要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.

3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行.

比如:创建一个含有order by子句的视图,看一下可以成功吗?

C:视图的优点:

为什么有了表还要引入视图呢?这是因为视图具有以下几个优点:

1:能分割数据,简化观点

可以通过select和where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作.

2:为数据提供一定的逻辑独立性

如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据

3:提供自动的安全保护功能

视图能像基本表一样授予或撤消访问许可权.

4:视图可以间接对表进行更新,因此视图的更新就是表的更新

D:视图的创建和管理

视图的创建

1:通过sql语句

格式:create view 视图名 as select 语句

试一试:分别创建关于一个表或多个表的视图[因为视图可以来自于多表]

2:通过企业管理器

说明:1:在完成视图的创立之后,就可以像使用基本表一样来使用视图

2:在创建视图时,并非所有的select子查询都可用

如:compute和compute by,order by[除非与top一起连用]

3:但在查询时,依然都可以用在创建时禁用的select子查询

4:在视图创建时,必须为没有标题列指定标题[思考:能否不用select语句来创建一个视图]

视图的删除:

1:通过sql语句:drop view 视图名

2:通过企业管理器

说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.[查看相关性]

修改视图的定义

1:通过企业管理器

2:通过sql语句:

格式:alter view 视图名 as 新的select语句

浏览视图信息 sp_helptext 视图名 [查看视图创建的语句]

E:如何通过视图修改基本表的数据.

1:在视图上使用insert语句

通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制

1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.

2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败

3:如果在视图中包含了使用统计函数的结果,或是包含计算列,则插入操作会失败

4:不能在使用了distinct语句的视图中插入值

5:不能在使用了group by语句的视图中插入值

2:使用update更新视图中的数据

1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列

例如:创建以下视图:create view del as

select 职工号,姓名,部门名称,负责人 from work1,部门

where work1.部门编号=部门.部门编号

如果再执行下面的语句时:

update del set 职工号="'001"',部门名称="'wenda"' where 职工号="'01"'[出现错误]

只能够改成:update del set 职工号="'001"' where 职工号="'01"'

update del set 部门名称="'wenda"' where 职工号="'01"'

2:不能在使用了distinct语句的视图中更新值

3:不能在使用了group by语句的视图中更新值

3:使用delete删除视图中数据.

通过视图删除数据最终体现为从基本表中删除数据

格式:delete 视图名 [where 条件]

说明:当视图由两个以上的基表构成时,不允许删除视图的数据

例如:建一个视图kk

create view kk as

select 职工号,姓名,性别,部门名称 from work1,部门 where work1.部门编号=部门.部门编号 [试着去删除]

使用with check option的视图

如果不了解视图定义内容,则常常会发生向视图中输入不符合视图定义的数据的情况.

比如:create view xm as

select * from work where 性别="'男"'

完全可以插入insert xm values("'001"',"'女"',23,"'2400"'....)

尽管从意义上来说是不合理的,但是上述语句是正确的.为了防止这种情况的发生,可以使用with check option子句来对插入的或更改的数据进行限制.

比如:create view xm as

select * from work where 性别="'男"' with check option

使用schemabinding的视图[使用绑定到构架]

我们知道视图是依赖于表,如果在一个表中创建一个视图,今后如果这个表被删除了,则这个视图将不可再用了.为了防止用户删除一个有视图在引用的表,可以在创建视图的时候加上schemabinding关键字.

比如:create view 基本工资 with SCHEMABINDING

as select 姓名,性别,基本工资 from dbo.work

说明:1:不能使用“*”来创建此类型的视图

2:创建此类型的视图时,一定要加上dbo.表名.

3:如果在某个表中定义了此类视图,则用户将不能对表的结构进行修改,否则会删除这些绑定

4:如果用户对表的结构进行列改名,则会删除绑定而且视图不可用.

5:如果用户对表的结构进行列的类型或者大小修改,则会删除绑定但视图可用,此时用户可以删除视图所引用的表.

使用with encryption对视图进行加密

为了保护创建视图定义的原代码,可以对视图进行加密.

比如:create view kk with encryption

as select * from work where 职称="'经理"'

用sp_helptext来查看一下.或用企业管理器查看一下.

说明:如果应用此项用户将无法设计视图

F:使用视图加强数据的安全

一般通过使用视图共有三种途径加强数据的安全性

A:对不同用户授予不同的使用权.

B:通过使用select子句限制用户对某些底层基表的列的访问

C:通过使用where子句限制用户对某些底层基表的行的访问

对不同用户授予不同的权限

java高级查询_SQL高级查询(转载)相关推荐

  1. sql 子查询 嵌套查询_SQL子查询– SQL中的嵌套查询

    sql 子查询 嵌套查询 In the real world, there are times when we need a particular set of data but we don't h ...

  2. clob和blob是不是可以进行模糊查询_SQL简单查询语、运算符学习和练习

    本次主要学习了SQL语言的书写和运算,多为实操,一定要多写多思考,综合运用起来. 基本查询语句(select *全部 as替换 distinct删除重复) 指定查询条件(where 从哪里查询) 注释 ...

  3. sql镶嵌查询_SQL 嵌套查询

    说到嵌套查询,首先得理解嵌套查询是什么意思,简单来说就是,一个查询语句可以嵌套在另外一个查询语句的where子句中.外层的查询称为父查询(主查询),内层的查询称为子查询(从查询). 嵌套查询的工作方式 ...

  4. sql镶嵌查询_SQL数据查询之——嵌套查询

    一.概念描述 在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块.将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询.例如: ...

  5. mysql三重连接查询_sql子查询,多重查询,join,左连接,右连接,内连接

    范围内重复数量查询 根据上表查询 每个手机号都各有多少个重复的设备id SELECT t.phone_num,COUNT(*) FROM (select phone_num, device_id,co ...

  6. mysql 层次化查询_SQL高级查询(层次化查询,递归)

    SQL 高级查询 层次化查询 层次化结构可以理解为树状数据结构,由节点构成.比如常见的组织结构由一个总经理,多个副总经理,多个部门部长组成.再比如在生产制造中一件产品会有多个子零件组成.举个简单的例子 ...

  7. 条件查询_SQL简单查询(条件查询 模糊查询)

    一.基本查询语句 基本语句: select 列名,列名,... from student; 加上AS: select 列名 as ABC,列名 as '其他名' from student; --中文的 ...

  8. mysql order by子查询_sql子查询 order by失效问题

    一.问题描述  三表联合查询  按主表的时间倒叙并分页 下面sql语句 ORDER BY失效 ,如果把 ORDER BY  放在最后 比如有20条数据 第一页会是10 -1 第二页是20-11  分页 ...

  9. mysql sql高级教程_SQL高级教程

    一.top子句 top子句用于规定要返回的记录的数目 并非所有数据库系统都支持top子句 # sqlserverSELECT TOP number|percent column_name(s) FRO ...

最新文章

  1. java的初始化顺序
  2. js记录用户访问页面和停留时间
  3. 47 MM配置-采购-条件-定价过程-定义方案确认
  4. 微课|中学生可以这样学Python(例5.8):凯撒加密
  5. Postman的使用说明
  6. 2018-3-7 色彩的一些知识
  7. UVALive6929 Sums【数学】
  8. 美赛整理之Matlab读取全球海洋温度数据并显示干货
  9. MATLAB随机数生成器
  10. ipqc的工作流程图_IPQC的工作流程及检验流程
  11. iOS 10越狱设备终于有越狱移除工具了!
  12. 以太坊的单位wei是什么?
  13. 由经纬度计算地球上任意两点的距离
  14. html实现在线聊天,利用HTML5实现电脑端微信聊天窗口界面
  15. Laravel 5.5 Artisan 命令
  16. alpha is transparency
  17. Oracle Form二次开发实战总结 调用Form
  18. 网络规模推荐系统的图卷积神经网络
  19. LinuxC进程编程
  20. php百度网盘解析源码,【教程】php实现百度网盘视频解析

热门文章

  1. 12月初总结--无名之辈
  2. Idea 方法模板注释
  3. WaveNet时间序列模型(基于GluonTs包)
  4. 修复计算机 数据丢失吗,电脑系统崩溃怎么修复及数据丢失找回教程
  5. 点击按钮,简单html表格导出excel
  6. 前所未有的安全感----华为云解决方案为网站安全保驾护航
  7. 河北专接本C语言程序第六天 排序问题
  8. JS模拟实现图片添加水印功能
  9. 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)
  10. 51信用卡 Android 自动埋点实践