查询收尾、带子查询的数据更新、视图 4.12数据库课程实验
学习完了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.集合查询 2.基于派生表的查询 3.selcet语句的一般形式 二.数据更新 1.插入数据 ①.插入元组 ②.插入子查询结果 2.修改数据 ①.修改某一个元素的值 ②.修改多个元组的 ...
- access设计视图打不开_15、ACCESS总计查询(分组查询)设计(ACCESS图解操作系列)...
操作要求: 在利用ACCESS数据库"教学管理钟老师课堂.accdb"中数据表,完成如下查询. 1.创建一总计查询"学生合格门数-所获学分-总计查询".以学生. ...
- 数据库 之带子查询的操作--插入子查询结果、带子查询的修改语句、带子查询的删除语句
插入子查询结果 语句格式 INSERT INTO <表名> [(<属性列1> [,<属性列2>- )]子查询; [子查询要求] SELECT子句目标列必须与INTO ...
- 数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引
1. oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的 ...
- 查询所有表、索引、视图信息的SQL语句-Mysql/oracle/sql server的不同实现方式
注:所有查询默认在管理员用户下进行 ----------------------------------Mysql中------------------------------------------ ...
- 怎么样查看视图+mysql_如何查询mysql数据表中的视图
本篇文章主要给大家介绍怎么查询mysql数据表中的视图. 想必大家如果有看过之前的mysql视图相关的文章,都已经对视图的基本概念有一定的了解了.视图也就是是一个虚拟表,其内容由查询定义.同真实存在数 ...
- access设计视图打不开_19、ACCESS操作查询之“删除查询”(ACCESS图解操作系列)...
操作要求: 在利用ACCESS数据库"教学管理钟老师课堂.accdb"中数据表,完成如下查询. 2.创建一"系-职称-教师删除查询". 以教师备份表为数据源,创 ...
- 数据库第四次试验:数据库的组合查询、统计查询及视图
数据库第四次试验:数据库的组合查询.统计查询及视图 前言 一.实验目的 二.实验要求 三.实验原理.方法和手段 四.实验组织运行要求 五.实验条件 六.实验步骤 七.思考题 八.实验报告 九.其他说明 ...
- from server sql 拼接统计两个子查询_4复杂查询-SQL
1 视图 什么是视图 视图中存放的是SQL语句,客户端使用视图时,会运行视图里的SQL语句创建出一张临时表. 如何创建视图 语法: create view 视图名称(视图列名1,视图列名2) AS s ...
最新文章
- 【Java】排序算法 之 【归并排序】 总结
- Variational Inference
- AI 图像傅里叶变换
- python分析双十一销量
- 会计证考试《财经法规与职业道德》第一章精选题
- 生活杂记 - 丢东西
- 当前最快的实例分割模型:YOLACT 和 YOLACT++
- 20169219《linux内核原理与分析》第七周作业
- 觅知网ppt模板_有哪些相见恨晚的PPT模板网站?
- 全卷积 FCN 数据标签制作
- 一步一步教你实现Emoji表情键盘
- mysql busy buffer_buffer busy waits 等待事件
- Matlab中text函数在图像中固定位置添加信息的用法
- android 怎么改变字体颜色,安卓系统字体颜色修改教程
- oracle控制台转圈进不去,老鸟帮你win10输完密码一直转圈圈进不去的具体方法
- Xilinx FPGA时钟及I/O接口规划(二)
- 配置办公室无线路由实现ip统一具体方式
- 新学期,我的目标与展望。(中秋快乐)
- Unity 3D-- 摄像机Clear Flags和Culling Mask属性用途详解
- 【BDTC 2017】专访中兴通讯杜学军:uSmartInsight,大数据与人工智能融合平台
热门文章
- 新手入门3D游戏建模一定要搞懂的流程!
- 计算机二级教程书pdf MS,全国计算机等级考试二级教程MS Office高级应用教学大纲4.pdf...
- 《Hands-On Machine Learning with Scikit-Learn TensorFlow》读书笔记(三):分类
- 和合共生,聚势谋远——云创大数据教育渠道大会隆重举行!
- MySQL Workbench 8.0新建SCHEMAS和Table
- BZOJ3161: 孤舟蓑笠翁
- 2022.07.25 学习笔记
- zoho邮箱收费和免费区别_您需要了解有关适用于ios和android的新zoho vault移动应用程序的所有信息...
- 2020安徽省大数据与人工智能网络赛题目
- 如何4步绘制出高水平的气泡图?