目录

  • 第1单元    数据库系统导论
    • ● 任务1.1  数据库基本概念
    • ● 任务1.2  设计E—R 图
    • ● 任务1.3   将E-R图转换成关系模型
    • ● 任务1.4   练习与作业
    • ● 教与学参考资源
  • 第2单元   认识SQL SERVER数据库
    • ● 任务2.1 数据库应用场景
    • ● 任务2.3  SQL  Server 数据库安装
    • ● 任务2.4 SQL Server 的管理
    • ● 任务2.5  使用SSMS连接数据库
    • ● 教与学参考资源
  • 第3单元  创建和管理数据库
    • ● 任务3.1 创建数据库
    • ● 任务3.1(2)  命令创建数据库
    • ● 任务3.2 管理数据库
    • ● 任务3.2(2) 查看、收缩数据库
    • ● 教与学参考资源
  • 第4单元 创建和管理数据库表
    • ● 任务4.1 SQL Server常用数据类型
    • ● 任务4.2  创建数据表
    • ● 任务4.3  命令创建表
    • ● 任务4.4 实施完整性约束
    • ● 教与学参考资源
  • 第 5 单元   查询数据表
    • ● 任务5.1 单表数据查询
    • ● 任务5.2 多表数据查询
    • ● 任务5.3 嵌套查询
    • ● 任务5.4 合并查询结果
    • ● 教与学参考资源
  • 第6单元  管理表中数据
    • ● 任务6.1   添加数据
    • ● 任务6.2  修改数据
    • ● 任务6.3  删除数据
    • ● 习题与训练
    • ● 教与学参考资源
  • 第7单元  使用索引和视图
    • ● 任务7.1  使用索引
    • ● 使用T-SQL创建索引
    • ● 任务7.2  使用视图
    • ● 使用T-SQL语句创建视图
    • ● 教与学参考资源
  • 第8单元 Transact-SQL语言编程
    • ● 任务8.1   声明和使用变量
    • ● 任务8.2   流控语句
    • ● 任务8.3   常用系统函数
    • ● 任务8.4   创建自定义函数
    • ● 教与学参考资源
  • 第9单元  事务和锁
    • ● 任务   9.1     事务
    • ● 事务的基本操作
    • ● 任务9.2    锁
    • ● 死锁及避免方法(例)
    • ● 教与学参考资源
  • 第10单元  创建和管理存储过程
    • ● 任务10.1 存储过程及优点
    • ● 任务10.2 创建和执行存储过程
    • ● 任务10.3   存储过程参数和返回值
    • ● 任务10.4 修改、删除、 重新编译存储过程
    • ● 教与学参考资源
  • 第11单元 创建和管理触发器
    • ● 任务1 触发器的作用和分类
    • ● 任务2 触 发器的创建与执行
    • ● 任务3 创建级联触发器
    • ● 任务4 修改、删除触发器
  • 第12单元 创建和使用游标
    • ● 任务1  游标的作用及使用步骤
    • ● 任务2  创建基本游标
    • ● 任务3  使用变量保存游标数据
    • ● 任务4  使用循环环提取游标数据
  • 第13单元 SQL Server用户管理
    • ● 任务1数据库安全管理概述
    • ● 任务2SQL Server 安全机制
    • ● 任务3 账号、角色及权限管理
    • ● 任务4数据库完整性管理
    • ● 任务5 数据库的备份与还原
    • ● 任务6   数据的导入与导出
  • 第14单元  综合应用案例
    • ● 概述
    • ● 需求分析
    • ● 概述设计-逻辑设计- 物理设计
    • ● 编写数据库设计说明书
  • 学生做项目成果展示
    • ● 项目一  设计《我班同学数据库》
    • ● 项目二  设计《(Teaching)教学数据库》
    • ● 项目三  数据库应用系统设计开发项目
    • ● 项目四 《华夏-宿舍管理系统》设计开发
    • ● 项目五   综合实训大作业
    • ● 综合实训团队项目大作业
    • ● 学生完成项目摘录展示
  • 总复习与综合训练
    • ● 总复习
    • ● 综合训练一
    • ● 综合训练二
    • ● 综合训练三
    • ● 综合训练四
    • ● 综合训练五
    • ● 简答综合训练
  • 在线专题测验
    • ● 自检自测一
    • ● 自检自测二
  • 拓展   数据库管理工具平台  Navicat
    • ● 关于Navica
    • ● Navicat 的系统需求
    • ● Navicat 的用户界面
    • ● Navicat 创建数据库对象
    • ● 在Navicat创建的SQL 程序脚本
    • ● 在Navicat创建的SQL  server 脚本(2)
    • ● 综合实训(1)
    • ● 综合实训(2)
  • 技术拓展   (MYSQL)数据库技术与应用
    • ● MYSQL技术
  • 教与学图片剪影
    • ● 教学团队
    • ● 学生学习实训
    • ● 活动与交流
任务5.3 嵌套查询


任务5.3 嵌套查询

把内部查询语句的结果作为比较值放在外部查询语句的WHERE或HAVING子句中,这种查询方式叫嵌套查询。内部的查询语句称为子查询。

例:对教务数据库,查询[教师表]中,职称与“刘军芳”相同的教师信息。

USE  教务数据库

GO 

SELECT  *  FROM 教师表   WHERE 职称=(SELECT 职称 FROM 教师表 WHERE 姓名='刘军芳') AND 姓名<>'刘军芳 '


思考:执行   SELECT  *  FROM 教师表   WHERE 职称=(SELECT 职称 FROM 教师表 WHERE 姓名='刘军芳') ,输出的结果会是怎样的?


在子查询中常用的逻辑运算符如表5-5所示。

表5-5逻辑运算符             

 运算符    含义  
 ALL    如果一组的比较都为TRUE,则返回TRUE  
 ANY    如果一组的比较中任何一个为TRUE,则返回TRUE。  
 SOME    如果在一组比较中,有些为TRUE,则返回TRUE。  


嵌套查询是指在一个外层查询中包含有另一个内层查询,其中外层查询称为父查询、主查询。内层查询称为子查询、从查询。

  子查询比较测试的运算符是:=、<><.><=、>=。子查询比较测试把一个表达式的值和一个有子查询生成的值进行比较,只是只查询只能返回一个值,否则错误。


现有: [学生图书借阅管理]数据库,内有三个表:借阅信息、图书信息、学生信息

例1:  查询王大力同学借书的图书编号

USE  [学生图书借阅管理]

GO

Select 图书编号 from 借阅信息

Where 借书证号=(select 借书证号 from 学生信息

                Where 姓名=’王大力’)

 或解:

Select A.借书证号, B.姓名,图书编号 from借阅信息 A ,学生信息  B

Where B.姓名='王大力'  AND  B.借书证号=A.借书证号

 

例2.  查询图书定价大于平均定价的图书信息

Select * from 图书信息

Where 定价>(select avg(定价) from 图书信息)


例3. 查询计算机类图书的名称、图书类别、定价和平均定价

Select 图书名称,图书类别,定价,(selectavg(定价) from 图书信息

Where 图书类别=’计算机’)

   from 图书信息

      Where  图书类别=’计算机



例4.   查询借过图书的学生借书证号和姓名

Select 借书证号,姓名

From 学生信息

Where 借书证号 in(select 借书证号 from 借阅信息)


例5. 查询被王大力同学借过的图书名称

Select 图书名称 from 图书信息

Where 图书编号 in(select 图书编号 from借阅信息

                  Where 借书证号=(select 借书证号

from 学生信息

                  where 姓名=’王大力’)


例6.查询计算机类图书定价比电子类图书最高定价还高的图书信息

Select * from 图书信息

Where 图书类别=’计算机’ and 定价>all(select定价 from 图书信息

                                   Where 图书类别=’电子’)


例7.查询计算机类图书定价比电子类图书最低定价高的图书信息

Select * from 图书信息

Where 图书类别=’计算机’ and 定价>any(select定价 from 图书信息

                                   Where 图书类别=’电子’)


例8.利用exists查询所有被借过的图书信息

Select * from 图书信息

Whereexists(select * from 借阅信息

            Where 借阅信息.图书编号=图书信息.图书编号)


例9.查询图书信息表中大于同类图书平均定价的图书名称和定价

Select 图书名称,定价 from 图书信息 as a

Where 定价>(select avg(定价) from 图书信息 as b

            Where b.图书类别=a.图书类别)


现有:系统示例数据库 PUBS

【实例】查询Titles中价格大于平均价格的书籍信息。

use pubs

go

select from titles where price>(selectavg(price)from titles)

         利用in关键字实现嵌套查询

  一些嵌套内层的子查询会产生一个值,也有一些子查询会返回一列值。即子查询不能返回带几行和几列数据的表。原因在于子查询的结果必须适合外层查询语句。当子查询产生一系列值时,适合用带in的嵌套查询。

  把查询表达式单个数据由子查询产生一系列的数值相比较,如果数值匹配一系列值中的一个,则返回该记录。

【实例】查询authors表和Titleauthor表中来自Ca州的作家的所有作品和作家编号。

use pubs

go

select title_id,au_id from titleauthor where au_id

in(select au_id from authors where state='ca')

【实例】查询authors表和Titleauthor表中不是来自Ca州的作家的所有作品和作家编号。

select title_id,au_id from titleauthor where au_id not

in(select au_id from authors where state='ca')

         利用Exists嵌套查询

  Exists关键字只是注重查询是否有返回的行。如果子查询返回一个或多个行,则主查询执行查询,否则主查询不执行查询。Exists注重的不是使用子查询的查询结果而是注重子查询是否有结果。

【实例】查询titleauthor表中的信息,条件是有作者来自于“MI”州。

select title_id,au_id from titleauthor where 

exists(select au_id from authors where state='mi')

【实例】

select title_id,au_id from titleauthor where 

notexists(select au_id from authors where state='mi')

         在列的清单中使用嵌套查询

   子查询不仅仅可以放在where语句中也可以放在列中或放在From后面。

【实例】查询来自ca这个州作家的名字,书的代号以及书的销量。

selecta.au_lname,t.title_id,(select sum(qty) from sales where title_id=t.title_id) as'salesqty'

fromtitles t inner join titleauthor ta on t.title_id=ta.title_id inner join authorsa

ona.au_id=ta.au_id where a.state='ca'

  先求出每本书的销量,然后在求出作家的名字和书籍的代号。

  

         From后使用嵌套查询

  子查询可以作为一个查询的结果集存放在From的后面,作为一个表来处理,因此必须给结果集起一个别名。

【实例】查询Northwind库订单中产品数量大于10的产品名称、订单编号、数量。

select  * from (select o.orderid,P.productName,o.quantity from [order details] o joinproducts p on o.productid=p.productid)

as twhere quantity>20

         嵌套查询练习

【实例】查询northwind库中orders 表中的610条数据。

select  *  from orders where orderid in (select top 10 orderid from orders order byorderid) and

orderid  not in(select top 5 orderid from orders order by orderid)

select  *  from (select top 5 * from (select top 10 * from orders order by orderid) as torder by orderid desc) as t

orderby orderid

【实例】根据下表查询所有购买商品为两种或两种以上的购物人记录。

表  商品购物表                                   

 

购物人

 
 

商品名称

 
 

数量

 
 

A

 
 

 
 

2

 
 

B

 
 

 
 

4

 
 

C

 
 

 
 

1

 
 

A

 
 

 
 

2

 
 

B

 
 

 
 

5

 

select * from shop where shoper in(select shoper fromshop group by shoper having count(shoper)>1)

【实例】 根据下表用一条查询语句查询出每门课都大于80的学生姓名。

                                               

 

Name

 
 

kecheng

 
 

fenshu

 
 

张三

 
 

语文

 
 

81

 
 

张三

 
 

数学

 
 

75

 
 

李四

 
 

语文

 
 

76

 
 

李四

 
 

数学

 
 

90

 
 

王五

 
 

语文

 
 

81

 
 

王五

 
 

数学

 
 

100

 
 

王五

 
 

英语

 
 

90

 

select distinct namefrom score where name not in(select name from score where fenshu <80)