学习完了SQL语言对数据库的增删改查,包括集合查询、基于派生表的查询、数据更新和视图

  • 1、集合查询
    • 1.1 并集
    • 1.2 交集
    • 1.3 差集
  • 2、基于派生表的查询
  • 3、带子查询的数据更新
    • 3.1 插入数据
    • 3.2 修改数据
    • 3.3 删除数据
  • 4、空值
  • 5、视图
    • 5.1 创建视图
    • 5.2 删除视图
    • 5.3 查询视图
    • 5.4 更新视图

1、集合查询

select 的查询结果是元组的集合,所以可进行多个查询结果间交集、并集和差集的计算,直接将两个查询语句连接即可

1.1 并集

  • union:并集
--并集,cs系的学生及(或)年龄不大于20岁的学生
select Sname,Sage,Sdept
from Student
where Sdept='cs'
union
select Sname,Sage,Sdept
from Student
where Sage<=20; --自动去除重复元组select Sname,Sage,Sdept
from Student
where Sdept='cs'
union all
select Sname,Sage,Sdept
from Student
where Sage<=20; --保留所有元组使用union all

1.2 交集

  • intersect:交集
select Sname,Sage,Sdept
from Student
where Sdept='cs'
intersect
select Sname,Sage,Sdept
from Student
where Sage<=20; --cs系且年龄不大于20的学生

1.3 差集

  • except:差集
select Sname,Sage,Sdept
from Student
where Sdept='cs'
except
select Sname,Sage,Sdept
from Student
where Sage>20; --查询cs系学生与年龄大于20岁的学生的差集
--先查询出cs系学生,再将其中年龄大于20的剔除

2、基于派生表的查询

派生表使用在 from 语句后,临时使用,查询结束后删除,不会像基本表那样占用内存

select Student.Sname,Course.Cname,SC.Grade,Avg_sc.avg_grade
from Student,SC,Course,(select Sno,avg(Grade)from SCgroup by Sno) as Avg_sc(avg_sno,avg_grade) --临时表
where SC.Sno=Avg_sc.avg_sno and SC.Grade>=Avg_sc.avg_gradeand Student.Sno=SC.Sno and SC.Cno=Course.Cno; --查询学生分数大于其平均分的学科


派生表必须指定别名,没有使用聚集函数时,列名可省略

3、带子查询的数据更新

简单的增删改操作以前总结过了,今天学习了使用子查询的增删改

3.1 插入数据

子查询可嵌套在 insert 中,一次插入一个查询结果

create table Dept_age
(Sdept varchar(20),Avg_age smallint); --建个新表insert into Dept_age(Sdept,Avg_age)
select Sdept,avg(Sage)
from Student
group by Sdept; --插入查询结果select * from Dept_age;

3.2 修改数据

子查询也可嵌套在 update 语句中

update SC
set Grade=null
where Sno in(select Snofrom Studentwhere Sdept='cs'); --cs系成绩置空select Student.Sname,Student.Sdept,SC.Cno,SC.Grade
from Student,SC
where Student.Sno=SC.Sno and Student.Sdept='cs';

3.3 删除数据

子查询也可嵌套在 delete 语句中

delete
from SC
where Sno in(select Snofrom Studentwhere Sdept is null); --删除无专业学生的选课记录

4、空值

空值是无意义或不存在的属性值,不是nulll字符串,所以在判断空值时需要使用 is (not) null 而不是 =null

5、视图

视图是从一个或几个基本表导出的表,是一个虚表。它只存放视图的定义,而不存放具体对应的数据

5.1 创建视图

若一个视图是从一个基本表中导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则为行列子集视图

/*create view <视图名> [<列名>,<列名>...]
as <子查询>
[with check option]*/create view cs_student
as
select Sno,Sname,Sage
from Student
where Sdept='cs'; --建立行列子集视图,保存cs系的学生信息


如果在结尾添加了with check option,则在修改该视图时数据库管理系统会自动加上建立视图时的where条件,即保证该视图中仅有cs系学生

create view cs_student
as
select Sno,Sname,Sage,Sdept
from Student
where Sdept='cs'
with check option; --建立视图

建立视图的语句必须单一执行

insert into cs_student
values('1998','王大狗',21,'cs'); --可成功执行insert into cs_student
values('199889','王小狗',21,'is'); --无法执行,不是cs系


视图还可建立在多个基本表之上,建立视图时可指定视图的列名

create view cs_sc(学号,姓名,课程号)
as
select Student.Sno,Sname,Cno
from Student,SC
where Sdept='cs' and Student.Sno=SC.Sno;
--建立cs系选修课学生的视图


视图也可建立在一个或多个定义好的视图之上

create view cs_wbc(Sname,Cname,Grade)
as
select Sname,Cname,Grade
from Student,SC,Course
where Student.Sname='王伯成' and Student.Sno=SC.Sno and SC.Cno=Course.Cno; --建立王伯成的选修课成绩视图
create view cs_wbc_m90(Sname,Cname,Grade)
as
select Sname,Cname,Grade
from cs_wbc
where Grade>=90; --依托cs_wbc视图再建立视图

还可以用带有聚集函数和group by子句的查询来定义视图,称为分组视图

create view avg_sdept(Sdept,avg_age)
as
select Sdept,avg(Sage)
from Student
group by Sdept; --建立反应专业平均年龄的视图

5.2 删除视图

和删除模式一样,分为cascade级联和restrict删除,T-SQL都不支持

drop view avg_sdept;
drop view cs_wbc; --删除后,其导出的视图仍存在且仍可使用
--都可成功执行

5.3 查询视图

查询视图和查询基本表相同,因为视图存储的是视图的定义语句,在查询视图时会执行视图消解:把视图定义语句和视图查询语句融合为对表的查询语句

select Sname,Sage
from cs_student
where Sage<=20;select Sname,Sage
from Student
where Sdept='cs' and Sage<=20; --与上述等价


当建立视图使用聚集函数时,查询视图在视图消解转换时会发生错误

/*select Sno,avg(Grade)
from SC
group by Sno; --定义S_G视图时的子查询 */select *
from S_G
where Gavg>=90; --查询选修课平均分大于90的学生--试图消解后:
select Sno,avg(Grade)
from SC
where avg(Grade)>=90
gropu by Sno;

很明显是错误的,聚集函数用作筛选条件时需要放在 having 语句后,可用临时派生表完成上述查询

select *
from(select Sno,avg(Grade)from SCgroup by Sno)as S_G(Sno,Gavg)
where Gavg>=90;

5.4 更新视图

对视图的更新最终将转换为对基本表的更新,对视图更新后,其依赖的基本表也将做出变化

update cs_student
set Sname='王大宝'
where Sno='20191102041';update Student
set Sname='王大宝'
where Sno='20191102041'; --与上述等价

--该视图使用了with check option
insert into cs_student
values('1998','王大狗',21,'cs'); --可成功执行insert into Student
values('1998','王大狗','男',21,'cs'); --与上述等价insert into cs_student
values('199889','王小狗',21,'is'); --无法执行,不是cs系

delete from cs_student
where Sno='1998';delete from Student
where Sno='1998'; --与上述等价


对视图进行更新时,更新的列需要唯一的对应其基本表的某一列,即若视图的某列是聚集函数或运算表达式得出的,则无法更新

update avg_sdept
set avg_age=21
where Sdept='cs'; --无法修改,基本表没有avg_age这一列,这是聚集函数分组得到的列

SQL语言似乎学完了,但是感觉好多需要重新看一遍。夜深了,睡觉吧

查询收尾、带子查询的数据更新、视图 4.12数据库课程实验相关推荐

  1. 【数据库系统原理作业】八、集合查询、派生词查询、数据更新、空值的处理、视图

    一.数据查询 1.集合查询 2.基于派生表的查询 3.selcet语句的一般形式 二.数据更新 1.插入数据 ①.插入元组 ②.插入子查询结果 2.修改数据 ①.修改某一个元素的值 ②.修改多个元组的 ...

  2. access设计视图打不开_15、ACCESS总计查询(分组查询)设计(ACCESS图解操作系列)...

    操作要求: 在利用ACCESS数据库"教学管理钟老师课堂.accdb"中数据表,完成如下查询. 1.创建一总计查询"学生合格门数-所获学分-总计查询".以学生. ...

  3. 数据库 之带子查询的操作--插入子查询结果、带子查询的修改语句、带子查询的删除语句

    插入子查询结果 语句格式 INSERT INTO <表名> [(<属性列1> [,<属性列2>- )]子查询; [子查询要求] SELECT子句目标列必须与INTO ...

  4. 数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

    1.    oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的 ...

  5. 查询所有表、索引、视图信息的SQL语句-Mysql/oracle/sql server的不同实现方式

    注:所有查询默认在管理员用户下进行 ----------------------------------Mysql中------------------------------------------ ...

  6. 怎么样查看视图+mysql_如何查询mysql数据表中的视图

    本篇文章主要给大家介绍怎么查询mysql数据表中的视图. 想必大家如果有看过之前的mysql视图相关的文章,都已经对视图的基本概念有一定的了解了.视图也就是是一个虚拟表,其内容由查询定义.同真实存在数 ...

  7. access设计视图打不开_19、ACCESS操作查询之“删除查询”(ACCESS图解操作系列)...

    操作要求: 在利用ACCESS数据库"教学管理钟老师课堂.accdb"中数据表,完成如下查询. 2.创建一"系-职称-教师删除查询". 以教师备份表为数据源,创 ...

  8. 数据库第四次试验:数据库的组合查询、统计查询及视图

    数据库第四次试验:数据库的组合查询.统计查询及视图 前言 一.实验目的 二.实验要求 三.实验原理.方法和手段 四.实验组织运行要求 五.实验条件 六.实验步骤 七.思考题 八.实验报告 九.其他说明 ...

  9. from server sql 拼接统计两个子查询_4复杂查询-SQL

    1 视图 什么是视图 视图中存放的是SQL语句,客户端使用视图时,会运行视图里的SQL语句创建出一张临时表. 如何创建视图 语法: create view 视图名称(视图列名1,视图列名2) AS s ...

最新文章

  1. 【Java】排序算法 之 【归并排序】 总结
  2. Variational Inference
  3. AI 图像傅里叶变换
  4. python分析双十一销量
  5. 会计证考试《财经法规与职业道德》第一章精选题
  6. 生活杂记 - 丢东西
  7. 当前最快的实例分割模型:YOLACT 和 YOLACT++
  8. 20169219《linux内核原理与分析》第七周作业
  9. 觅知网ppt模板_有哪些相见恨晚的PPT模板网站?
  10. 全卷积 FCN 数据标签制作
  11. 一步一步教你实现Emoji表情键盘
  12. mysql busy buffer_buffer busy waits 等待事件
  13. Matlab中text函数在图像中固定位置添加信息的用法
  14. android 怎么改变字体颜色,安卓系统字体颜色修改教程
  15. oracle控制台转圈进不去,老鸟帮你win10输完密码一直转圈圈进不去的具体方法
  16. Xilinx FPGA时钟及I/O接口规划(二)
  17. 配置办公室无线路由实现ip统一具体方式
  18. 新学期,我的目标与展望。(中秋快乐)
  19. Unity 3D-- 摄像机Clear Flags和Culling Mask属性用途详解
  20. 【BDTC 2017】专访中兴通讯杜学军:uSmartInsight,大数据与人工智能融合平台

热门文章

  1. 新手入门3D游戏建模一定要搞懂的流程!
  2. 计算机二级教程书pdf MS,全国计算机等级考试二级教程MS Office高级应用教学大纲4.pdf...
  3. 《Hands-On Machine Learning with Scikit-Learn TensorFlow》读书笔记(三):分类
  4. 和合共生,聚势谋远——云创大数据教育渠道大会隆重举行!
  5. MySQL Workbench 8.0新建SCHEMAS和Table
  6. BZOJ3161: 孤舟蓑笠翁
  7. 2022.07.25 学习笔记
  8. zoho邮箱收费和免费区别_您需要了解有关适用于ios和android的新zoho vault移动应用程序的所有信息...
  9. 2020安徽省大数据与人工智能网络赛题目
  10. 如何4步绘制出高水平的气泡图?