《数据库原理》实验 西北工业大学
《数据库原理》实验
- 实验一:关系代数运算
- 实验二:数据类型
- 实验三:SQL编程1
- 实验四:SQL编程2
- 实验五:SQL编程3
- 实验六:SQL编程4
- 实验七:SQL编程综合
参考教材:《数据库系统概论》(第五版) 高等教育出版社
专业:网络空间安全学院-信息安全
实验一:关系代数运算
- 实现传统的集合运算—— 并、交、差和广义笛卡尔积。
/*并*/
Select * From Student
Union
Select * From Student1/*交*/
Select * From Student
Intersect
Select * From Student1/*差*/
Select * From Student
Except
Select * From Student1/*广义笛卡尔积*/
Select * From S,C
- 实现专门的关系运算—— 选择、投影、连接。
/*选择*/
Select *
From Student
Where Sdept='信息安全'/*投影*/
Select Distinct Sno , Sname
From Student/*连接*/
Select *
From Student , Student1
Where Student.Sbirthplace > Student1.Sbirthplace/*自然连接*/
Select *
From Student , Student1
Where S.Sno=SC.Sno /*连接与广义笛卡尔积的关系:连接为两个关系在公共属性上满足某种条件时做广义笛卡尔积构成新的关系。*/
实验二:数据类型
SQL SERVER 各种常用数据类型
统一字符编码型(Unicode)数据类型
- Unicode:存放中文、韩文等字符,存放纯英文字符用非unicode码,混合存放时用Unicode避免乱码。
字符型数据:Char、Varchar、Nchar、Nvarchar
- Char(n):固定长度,非 Unicode 字符数据,长度为 n 个字节。n 的取值范围为 1 至 8,000,存储大小是 n个字节。
- Varchar(n): 可变长度,非 Unicode 字符数据。n 的取值范围为 1 至 8,000。存储大小是输入数据的实际长度加 2 个字节。所输入数据的长度可以为 0 个字符。
- Nchar(n):n 个字符的固定长度的 Unicode 字符数据。n 值必须在 1 到 4,000 之间(含)。存储大小为两倍n字节。
- Nvarchar(n):可变长度 Unicode 字符数据。n 值在 1 到 4,000 之间(含)。存储大小是所输入字符个数的两倍+ 2 个字节。所输入数据的长度可以为 0 个字符。
- TIP1:如果未在数据定义或变量声明语句中指定n,则默认长度为 1。
- TIP2:如果在使用 CAST 和 CONVERT 函数时未指定n,则默认长度为 30。
整型数据类型:Bigint、Int、Smallint、Tinyint
- Bigint:长度为 8 个字节,存储从 –2^63到 2^63-1 的数字。
- Int:长度为 4 个字节,存储从-2,147,483,648 到 2,147,483,647 的数字。
- Smallint :长度为 2 个字节,存储从 -32,768 到 32,767 的数字。
- Tinyint :长度为 1 个字节,存储从 0 到 255 的数字。
精确数据类型:Decimal、Numeric
- Decimal(p,s):固定精度和小数位数。使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1。
p(精度):最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。
s(小数位数):小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0。 - Numeric(p,s):功能上与 decimal 相同。
- 举例:12345.15 转换成 numeric(10,5):12345.15000
浮点数据类型:Float\Real
- Float:精度15位数,存储大小8字节。
- Real:精度7位数,存储大小4字节。
- float 和 real 数据类型被称为近似数据类型。
- 近似数值数据类型并不存储为许多数字指定的精确值,它们只储存这些值的最近似值。
- 在 Where子句搜索条件(特别是 = 和 <> 运算符)中,应避免使用 float 列或 real 列。float 列和 real 列最好只限于 > 比较或 < 比较。
货币数据类型:money、smallmoney
- Money:介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807之间的货币数据。money最多可以包含 19 位数字,其中小数点后可以有 4 位数字。使用 8 个字节存储数据,精度是19。
- Smallmoney :介于 214,748.3648 和 214,748.3647 之间的货币数据。小数点后有 4 位。
日期时间数据类型:datetime、smalldatetime
- Datetime:从 1753 年 1 月 1 日到 9999 年 12 月 31 日,精度为 3.33 毫秒。
- Smalldatetime:从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。
布尔数据类型 Bit:
- Bit:可以取值为 1、0 或 NULL 的整数数据类型。
- 字符串值 TRUE 和 FALSE 可以转换为以下 Bit 值:TRUE转换为 1,FALSE 转换为 0。
CAST 和 CONVERT 函数的使用
CAST (expression AS data_type)
- expression:任何有效的 SQLServer 表达式;
- AS:用于分隔两个参数,在 AS 之前的是要处理的数据,在 AS之后是要转换的数据类型;
- data_type:目标系统所提供的数据类型,包括 bigint 和 sql_variant,不能使用用户定义的数据类型。
- 举例:Select CAST(12345.15 AS numeric(10,5))
CONVERT (data_type(length), data_to_be_converted, style)
- data_type(length):规定目标数据类型(带有可选的长度);
- data_to_be_converted:含有需要转换的值;
- Style:规定日期/时间的输出格式。
- 举例:Select CONVERT (varchar(10),getdate(),110)
- 分别使用 cast 和 convert 将 Sbirthday 字段信息转化为 int 类型
SELECT Sbirthday , cast (Sbirthday as int)
FROM StudentSELECT Sbirthday , convert( int , Sbirthday)
FROM Student
- 使用 CONVERT,通过设置 style 值,以不同的格式显示当前日期/时间数据(当前时间可以使用GETDATE()函数,常用时间数据 108,日期数据110、111、112、120 和 121 ;
select convert (varchar(10),getdate(),108)
/*2021年1月7日19:47的查询结果为:19:47:09*/Select convert (varchar(10),getdate(),110)
/*2021年1月7日19:47的查询结果为:01-07-2021*/Select convert (varchar(10),getdate(),111)
/*2021年1月7日19:47的查询结果为:2021/01/07*/Select convert (varchar(10),getdate(),112)
/*2021年1月7日19:47的查询结果为:20210107*/Select convert (varchar(10),getdate(),120)
/*2021年1月7日19:47的查询结果为:2021-01-07*/Select convert (varchar(10),getdate(),121)
/*2021年1月7日19:47的查询结果为:2021-01-07*/
- 执行 SELECT CAST(80.45545545 AS money)、SELECT CAST(10.6496 AS int) as result1、SELECT CAST(-10.6496 AS numeric) as result2 并解释结果;
SELECT CAST(80.45545545 AS money)
/*查询结果为:80.4555,money小数点后可以有 4 位数字*/SELECT CAST(10.6496 AS int) as result1
/*查询结果为:10,int为整型*/SELECT CAST(-10.6496 AS numeric) as result2
/*查询结果为:-11,numeric(p,s)中s默认为0*/
- 将123转换为decimal(5,2)格式, 12345.15转换为numeric(10,5);
Select CAST(123 as decimal(5,2))
/*查询结果为:123.00*/Select CAST(12345.15 as numeric(10,5))
/*查询结果为:12345.15000*/
- 执行print 55、print $100、print 55+$100、 print GetDate()等涉及隐式转换的语句;
Print convert(decimal(5,2),123.4)
/*打印结果为:123.40*/Print 55
/*打印结果为:55*/Print 55+$100
/*打印结果为:155.00*/print GetDate ()
/*打印结果为:01 7 2021 8:14PM*/Print 55+'数据库原理'
/*在将 varchar 值 '数据库原理' 转换成数据类型 int 时失败。*/
实验三:SQL编程1
- 通过 SQL 语句创建数据库和表:
a、数据库名称:STUDY
b、数据库包含三个表:S(学生表)、C(课程表)、SC(选课表)
Drop Database STUDY /*删除数据库:STUDY*/
Create Database STUDY /*创建数据库:STUDY*/Use STUDY
Create Table S /*创建表:S*/
(ID Int identity(1,1) not null, Sno Char(5) Primary key, /*将 S.Sno 设置为主键*/Sname varchar(8) unique, /*为姓名(Sname)添加唯一约束(唯一键)*/Ssex bit default('true'), /*为性别(Ssex)添加默认值,其值为“男”*/Sbirthday smalldatetime not null, Sdept varchar(30), Sbirthplace varchar(50), Spay smallmoney
)CREATE TABLE C
(Cno char (2) PRIMARY key, Cname varchar (30), Cpno char (2), Ccredt tinyint
)CREATE TABLE SC
(Sno char (5), Cno char (2),Grade decimal(4,1) check(Grade>=0 and Grade<=100), /*添加 CHECK 约束, 其检查条件为:成绩应该在 0-100 之间。*/PRIMARY KEY (Sno, Cno),FOREIGN KEY(Sno) references S, FOREIGN KEY(Cno) references C
)
- 熟练建立数据库中表的三类约束:
a、主键约束:将 S.Sno 设置为主键,主键名为 pk_Sno 将 C.Cno 设置为主键,主键名为
pk_Cno 将 SC.(Sno,Cno) 设置为主键,主键名为 pk_SnoCno
b、外键约束
c、非空约束:为出生日期添加非空约束。
d、唯一约束:为姓名(Sname)添加唯一约束(唯一键),约束名为 uk_sname。
e、缺省约束:为性别(Ssex)添加默认值,其值为“男”。
f、CHECK 约束:为 SC 表的成绩(grade)添加 CHECK 约束,约束名为 ck_grade, 其检查条件为:成绩应该在 0-100 之间。
CREATE TABLE S1
(ID int identity(1,1) , Sno CHAR(5) , Sname varchar(8), Ssex bit, Sbirthday smalldatetime , sdept varchar(30), Sbirthplace varchar(50), Spay smallmoney
) CREATE TABLE C1
(Cno char(2) , Cname varchar(30), Cpno char(2), Ccredt tinyint
) CREATE TABLE SC1
(Sno char(5), Cno char(2), Grade decimal(4,1)
) /*约束:Constraint*//*主键约束:将 S.Sno 设置为主键,主键名为 pk_Sno;*/
Alter Table S1
Add Constraint pk_sno Primary Key(Sno) /*主键约束:将 C.Cno 设置为主键,主键名为 pk_Cno;*/
Alter Table C1
Add Constraint pk_cno Primary Key(Cno) /*主键约束:将 SC.(Sno,Cno) 设置为主键,主键名为 pk_SnoCno*/
Alter Table SC1
Add Constraint pk_Scno primary Key(Sno,Cno) /*外键约束*/
Alter table SC1
Add constraint SCF1 foreign key(Sno) references S1(Sno)
Add constraint SCF2 foreign key(Cno) references C1(Cno) /*非空约束:为出生日期添加非空约束。*/
Alter Table S1
Alter Column Sbirthday smalldatetime not NULL /*唯一约束:为姓名(Sname)添加唯一约束(唯一键),约束名为 uk_sname。*/
Alter Table S1
Add Constraint uk_Sname unique(Sname) /*缺省约束:为性别(Ssex)添加默认值,其值为“男”。*/
Alter table S1
Add constraint uk_ssex default('true') for Ssex /*Check约束:为SC表的成绩添加 Check 约束,约束名为 ck_grade, 检查条件:成绩应该在 0-100 之间。*/
Alter Table SC
Add Constraint ck_grade check(Grade>=0 and Grade<=100)
- 通过 SQL 语句:
a、简单实现传统的集合运算:并、差、交、广义笛卡尔积
b、简单实现专门的关系运算:选择、投影、连接、除
/*并*/
Select * From S1
UNION
Select * From S3 /*差*/
Select * From S1
EXCEPT
Select * From S3 /*交*/
Select * From S1
INTERSECT
Select * From S3 /*笛卡尔积*/
Select * From S,SC/*选择*/
Select Cno,Cname
From C
Where Ccredit=3 /*投影*/
Select Sno,sname
From S3 /*连接*/
select * from S1 Inner join S3
ON S1.Sname=S3.Sname /*内连接*/ select * from S1 left join S3
ON S1.Sname=S3.Sname /*左连接*/select * from S1 RIGHT join S3
ON S1.Sname=S3.Sname /*右连接*/select * from S1 full join S3
ON S1.Sname=S3.Sname /*全连接*/ /* SC/C 列(属性):SC ÷C得到的新的关系 (表),它的列是从SC中的列中去掉SC和C相交的列。 行(元组):SC中每一个x对应的象集应该包 含C的投影*/
Select Sno
From (SELECT COUNT(*)cnu,Sno From SC Group by Sno)AS T
Where cnu=(select COUNT(Cno) from C)
- 通过 SQL 语言,熟练修改表结构,如:
a、增减列
b、重新定义列属性
c、修改列名
d、对表进行删除
ALTER TABLE C1 ADD Teacher varchar(20) ALTER TABLE C1 DROP COLUMN Teacher ALTER TABLE C1 ALTER COLUMN Cname varchar(30) NOT NULL sp_rename 'C1.Cpno','pno','COLUMN' sp_rename '原表名','新表名'
实验四:SQL编程2
- 查询数学系全体学生的名单
Select *
From S
Where S.Sdept='数学'
- 查询考试不及格的学生学号,并降序排列
Select Distinct Sno
From SC
Where SC.Grade<60
Order by Sno Desc
- 查询学生考试成绩不及格的课程情况,输出学号,课号和成绩,按学号降序排列,同一学生多门不及格课程的,按分数降序排列
Select *
From SC
Where SC.Grade<60
Order by Sno Desc, Grade Desc
- 查询年龄岁以下的学生姓名及年龄,按年龄降序排列,同一年龄有多个学生的,按学号降序排列
Select Sname,2020-convert(char(4),Sbirthday,23) as Sage
From S
Where 2020-convert(char(4),Sbirthday,23)<=20
Order by Sage Desc, Sno Desc
- 查询年龄在20~23岁的学生的姓名、系别和年龄
Select Sname,Sdept,2020-convert(char(4),Sbirthday,23) as Sage
From S
Where 2020-convert(char(4),Sbirthday,23) between 20 and 23
- 查询年龄不在20~23岁的学生的姓名、系别和年龄,按年龄降序排列,年龄相同的按性别降序排列,性别相同的按学号降序排列
Select Sname,Sdept,2020-convert(char(4),Sbirthday,23) as Sage
From S
Where 2020-convert(char(4),Sbirthday,23) not between 18 and 23
Order by Sage desc,Sgender desc,Sno desc
- 查询数学系(MA)和计算机科学系(CS)学生的姓名和性别。 按性别升序排列,性别相同按学号降序排列。
Select Sname,Sgender
From S
Where Sdept='数学' or Sdept='计算机科学'
Order by Sgender, Sno desc
- 查询既不是数学系,也不是计算机科学系的学生的姓名和性别;
Select Sname,Sgender
From S
Where Sdept<>'数学' and Sdept<>'计算机科学'
- 查询所有姓“薛”,且全名为三个汉字的学生的姓名、学号和性别。
Select Sno,Sname,Sgender
From S
Where Sname like '薛__'
- 查询所有姓“欧”,第二个字不是“阳”,且全名为四个汉字的学生的姓名。
Select Sname
From S
Where Sname like '欧[^阳]__'
- 查询“数据库”课程的课程号和学分。
Select Cno,Ccredit
From C
Where Cname='数据库'
- 查询以“DB_”开头,且倒数第3 个字符为“%”的课程的详细情况(%、_、-、[])
Select *
From C
Where Cname like 'DB_%[%]__'
- 查询以字符串“Sys”结尾、以从“B”到“G”的任何单个字母开头的所有课程情况。
Select *
From C
Where Cname like '[B-G]%Sys'
- 查询所有以字符串:“C”,“M”,"T"开头,且倒数第三个字母为“_”的课程情况。 查询结果以课程名降序排列
Select *
From C
Where Cname like '[CMT]%[_]__'
Order by Cname Desc
- 查询以字母“M”开头,且第二个字母不是“a”, 且有先修课的所有课程情况,且先按课程名降序排列。
Select *
From C
Where Cname like 'M[^a]%' and Cpno is not null
Order by Cname Desc
- 查询自控系(AC)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
Select Sname,Sgender
From S
Where Sdept='数学'or Sdept='计算机科学' or Sdept='自控系'
- 查询选修“C03”号课程的学生的学号及其成绩,查询结果按分数降序排列。
Select Sno,Grade
From SC
Where Cno=3
Order by Grade Desc
- 查询全体学生情况,查询结果按所在系的系号升序排列, 同一系中的学生按年龄降序排列。
Select *,2020-convert(char(4),Sbirthday,23) as Sage
From S
Order by Sdept,Sage Desc
- 查询学生总人数 。
Select count(*) as S_amount
From S
- 查询选修了课程的学生总人数。
Select count(distinct Sno) as SC_amount
From SC
- 计算“C02”号课程的学生平均成绩。
Select avg(Grade) as avg_grade
From SC
Where Cno=2
- 查询选修“C02”号课程的学生最高分。
Select max(Grade) as max_grade
From SC
Where Cno=2
- 求各个课程号相应的选课人数。查询结果按选课人数降序排列。 如果选课人数有相同,按平均成绩降序排列 。
Select Cno,count(Sno) as amount,avg(Grade) as avg_grade
From SC
Group by Cno
Order by amount desc,avg(Grade) desc
- 求各个课程成绩在90 分以上的学生人数。查询结果按人数降序排列。 --如果人数相同的,按平均成绩降序排列
Select Cno,count(Sno) as amount,avg(Grade) as avg_grade
From SC
Where Grade>90
Group by Cno
Order by amount desc,avg_grade Desc
- 查询选修了2 门以上课程的学生学号。 结果按所选课程数降序排列。如果课程数相同,按平均成绩升序排列
Select Sno,count(Cno) as amount,avg(Grade) as avg_grade
From SC
Group by Sno
Having count(Cno)>2
Order by amount desc,avg_grade
- 查询有2 门以上课程在80 分以上的学生的学号及80 分以上的课程数。 结果按80 分以上的课程数降序排列。如果课程数相同,按所选全部课程数升序排列
Select table1.Sno, C_amount, C_sum
From (Select Sno, count(Cno) as C_amount From SC Where Grade>80 Group by Sno Having count(Cno)>=2) table1, (Select Sno, count(*) as C_sum From SC Group by Sno) table2
Where table1.Sno=table2.Sno
Order by C_amount Desc,C_sum
实验五:SQL编程3
连接查询
a.等值与非等值连接查询
1.查询所选课程中所选学分大于分的学生的基本 信息
1)一般查询
select distinct S.*
from S,(select SC.Sno from SC,C where SC.Cno=C.Cno and C.Ccredit>2 )as SCC
where S.Sno=SCC.Sno select distinct S.*
from S,SC,C
where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Ccredit>2
2)临时表查询
2.查询课程成绩含有未及格的课程信息
select C.*
from C,SC
where C.Cno=SC.Cno and SC.Grade<60
3.查询每个学生的学号、姓名,以及选修的课号、 课名及成绩
select S.Sno,S.Sname,C.Cno,C.Cname,SC.Grade
from S,SC,C
where S.Sno=SC.Sno and SC.Cno=C.Cno
b.自身连接
1.查询具有间接先行课程的课程
select first.*
from C first,C second
where first.Cpno=second.Cno and second.Cpno is not null
2.查询所有与学号‘S01’为同一系的学生的学号和姓名
select second.Sno,second.Sname
from S first,S second
where first.Sdept=second.Sdept and first.Sno='S01'
c.外连接(左外连接、右外连接、全外连接)
1.左外连接(查询选课学生的姓名、选课课号、 成绩)
select S.Sname,SC.Cno,SC.Grade
from S left join SC on S.Sno=SC.Sno
2.右外连接(查询已有成绩课程的课名、课号、成绩)
select C.Cname,SC.Cno,SC.Grade
from C right join SC on C.Cno=SC.Cno
3.全外连接(查询选课列表中所含学生的姓名、 学号、课号、成绩)
select S.Sname,S.Sno,SC.Cno,SC.Grade
from S full join SC on S.Sno=SC.Sno
d.查询"高等数学"成绩大于分的陕西籍女生的学 号、姓名、成绩
select S.Sno,S.Sname,SCC.Grade
from S,(select SC.Sno,SC.Grade from SC,C where SC.Cno=C.Cno and C.Cname=' 高等数学')as SCC
where S.Sno=SCC.Sno and Grade>90 and S.SbirthPlace='西安'and S.Ssex = 1
嵌套查询
a.带IN谓词的子查询
1.查询数学系学生高等数学成绩
select S.Sno,S.Sname,SC.Grade
from S,SC,C
where S.Sno=SC.Sno and SC.Cno=C.Cno and S.Sno in (select S.Sno from S where S.Sdept='数学' )and C.Cname in (select C.Cname from C where C.Cname=' 高等数学' )
2.查询选修了号课程学生姓名
select S.Sname
from S,C,SC
where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Cno in (select C.Cno from C where C.Cno=2)
3.查询与“张柬之”在同一个系学习的学生
select S.Sno,S.Sname
from S
where S.Sdept in (select S.Sdept from S where S.Sname=' 张柬之') and S.Sname!='张柬之'
4.查询出生日期和陕西籍学生出生日期相同的学生信息
select S.*
from S
where S.Sbirth in (select S.Sbirth from S where S.SbirthPlace='西安') and S.SbirthPlace!='西安'
5.查询选修了课程名为“信息系统”的学生学号和姓名
select S.Sno,S.Sname
from S,SC,C
where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Cname in (select C.Cname from C where C.Cname=' 信息系统') select S.Sno,S.Sname
from S inner join SC on S.Sno=SC.Sno inner join C on SC.Cno=C.Cno
where C.Cname in (select C.Cname from C where C.Cname=' 信息系统')
6.查找未被“太平公主”选修的其他课程的选修情况
select C.Cno,C.Cname,S.Sno,S.Sname,SC.Grade
from S,C,SC
where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Cno not in (select SC.Cno from SC,S where S.Sno=SC.Sno and S.Sname='太平公主')
order by C.Cname
b.带比较运算符的子查询
1.假设一个学生只能在一个系学习,并且必须属于一个系。查找与“上官婉儿”在同一个系学习的学生
select S.Sno,S.Sname
from S where S.Sdept = (select S.Sdeptfrom S where S.Sname=' 上官婉儿') and S.Sname<>'上官婉儿'
2.查找学号为‘S01’的学生所选课程中超过选修课程平均成绩的课程信息(重点先求出S01同学所选课的平均成绩)
select C.*
from SC join C on SC.Cno=C.Cno inner join (select SC.Cno,AVG(SC.Grade)as avggrade from SC group by SC.Cno having SC.Cno in(select SC.Cno from SC where SC.Sno='S01'))as avgSC on avgSC.Cno=SC.Cno where SC.Sno ='S01' and SC.Grade>avgSC.avggrade
c.带有ANY/ALL谓词的子查询
1.查找非陕西籍的学生中比陕西籍任意一个学生年龄小的学生学号和姓名
select S.Sno,S.Sname
from S
where DATEDIFF(yy,S.Sbirth,GETDATE()) < all(select DATEDIFF(yy,S.Sbirth,GETDATE()) from S where S.SbirthPlace='西安') and S.SbirthPlace<>'西安'
2.查询其他系中比“网络空间安全系”某一学生年龄小的学生学号、姓名和年龄
select S.Sno,S.Sname,DATEDIFF(yy,S.Sbirth,GET DATE())as Sage
from S
where DATEDIFF(yy,S.Sbirth,GETDATE()) <any(select DATEDIFF(yy,S.Sbirth,GETDATE()) from S where S.Sdept='网络空间安全') and S.Sdept<>'网络空间安全'
3.查询其他系比“网络空间安全系”所有学生年龄都小的学生学号、姓名及年龄
select S.Sno,S.Sname,DATEDIFF(yy,S.Sbirth,GET DATE())as Sage
from S
where DATEDIFF(yy,S.Sbirth,GETDATE()) <all(select DATEDIFF(yy,S.Sbirth,GETDATE()) from S where S.Sdept='网络空间安全')and S.Sdept<>'网络空间安全'
4.查找选课关系中所选课程平均成绩最高的学生的基本信息
select S.*
from S join (select SC.Sno,AVG(SC.Grade)as avggrade from SC group by SC.Sno)as avgS on S.Sno=avgS.Sno
where avgS.avggrade >=all (select AVG(SC.Grade)as avggrade from SC group by SC.Sno)
d.带有EXISTS谓词的子查询
1.查询选修了课程的学生姓名
select S.Sname
from S
where exists (select 1 from SC where S.Sno=SC.Sno )
2.查询选修了全部课程的学生姓名
select S.Sname
from S
where not exists (select 1 from C where not exists (select 1 from SC where S.Sno=SC.Sno and C.Cno=SC.Cno ) )
3.查询至少选修了学号为S01学生选修的全部课程的学生号码()
select S.Sno
from S
where not exists (select 1 from SC where SC.Sno='S01' and not exists (select 1 from C where S.Sno=SC.Sno and SC.Cno=C.Cno) )
4.查找所有存在不及格情况(<60)的学生的学号和姓名
select S.Sno,S.Sname
from S
where exists (select 1 from SC where S.Sno=SC.Sno and SC.Grade<60)
集合查询
a.并操作
1.查询学生关系表中,学号以结尾和以结尾的学生的基本信息
select S.*
from S
where S.Sno like '%0'
union select S.*
from S
where S.Sno like '%8'
2.查询选课关系表中,成绩是分或者成绩是分的记录
select SC.*
from SC
where SC.Grade = 100
union select SC.*
from SC
where SC.Grade = 0
b.交操作
1.查询系别分为网络空间安全系的姓张的所有男性同学的基本信息
select S.*
from S
where S.Sdept='网络空间安全'
intersect select S.*
from S
where S.Sname like ' 张%'
intersect select S.*
from S
where S.Ssex = 0
2.查询课程表中学分大于分并且课号是以结尾的课程
select C.*
from C
where C.Ccredit>2
intersect select C.*
from C
where C.Cno like '%0'
c.差操作
1.查询网络空间安全系所有除去西安出生地的学生的基本信息
select S.*
from S
where S.Sdept='网络空间安全'
except select S.*
from S
where S.SbirthPlace='西安'
2.查询选课关系表中成绩未合格(<60分)的学生学号
select SC.*
from SC
except select SC.*
from SC
where SC.Grade >= 60
实验六:SQL编程4
(1)建立计算机系学生的视图 CS_Stud1(Sno, Sname, Sage)。
CREATE VIEW [CS_Stud1] as
SELECT Sno,Sname,Sage
FROM S /*计算机系的学生视图*/
WHERE sdept='计算机科学'
(2)建立计算机系学生的视图,并要求透过该视图所进行的更新操作,只涉及计算机系学生 CS_Stud_2(Sno, Sname, Sage)。
CREATE VIEW [CS_Stud2] AS
SELECT Sno,Sname,Sage /*计算机系的学生视图,只涉及计算机系更改*/
FROM S
WHERE sdept='计算机科学'
WITH CHECK OPTION
(3)建立数学系选修了 C02 号课程的学生视图 MA_Stud1(Sno, Sname, Grade)。
CREATE VIEW [MA_Stud1] as
SELECT S.Sno,Sname ,Grade /*数学系选修课程的试图*/
FROM S,SC
WHERE S.Sno=SC.Sno and S.sdept='数学' and Cno=2
(4)建立数学系选修了 C02 号课程且成绩在 90 分以上的学生的视图 MA_Stud_90(Sno, Sname, Grade)。
CREATE VIEW [MA_Stud_90] as
SELECT S.Sno,Sname ,Grade /*数学系选修课程分以上的视图*/
FROM S,SC
WHERE S.Sno=SC.Sno and S.sdept='数学' and Cno=2 and Grade>90
(5)将学生的学号及其平均成绩定义为一个视图。S_Gavg1(Sno, SGavg)
CREATE VIEW [S_Gavg1] as
SELECT Sno,AVG(Grade) average /*平均成绩视图*/
FROM SC
GROUP BY Sno
(6)将平均成绩>=90 分的学生及其平均成绩定义为一个视图。S_Gavg2(Sno, SGavg)
CREATE VIEW [S_Gavg2] as
SELECT Sno,AVG(Grade)SGavg /*90 分以上的学生平均成绩视图*/
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90
(7)将平均成绩>=90 分,选修课程累计达到 30 学分,且选修课程数达到 10 门以上的学 生定义为一个视图。S_Gavg3(Sno, SumCredit, SumCourse, SGavg)
CREATE view [S_Gavg3] as
SELECT Sno,SUM(C.Ccredit)SumCredit,COUNT(SC.Cn o)SumCourse,AVG(Grade)SGavg
FROM C,SC /*90分以上且选够门课学分的学生成绩视图*/
WHERE C.Cno=SC.Cno
GROUP BY Sno
HAVING SUM(C.Ccredit)>=30 AND COUNT(SC.Cno)>10 AND AVG(Grade)>90
(8)选修学生所覆盖的系别达到 3 个以上,且将选修人数大于 5 人的课程,定义为一个视图。C_Survey1 (Cno, SumDept, SumStud)
CREATE VIEW C_Survey1(Cno,SumDept,SumStud)as
SELECT Cno,COUNT(DISTINCT sdept)SumDept,COUNT(SC.Sno)SumStud
FROM SC,S /*覆盖三个系,选 修超过人的课程*/
WHERE SC.Sno=S.Sno
GROUP BY Cno
HAVING COUNT(DISTINCT sdept)>=3 AND COUNT(SC.Sno)>=5
(9)将平均成绩介于 80~90 分,选修人数达到 15 人以上,且选修学生所覆盖的系别达 到 3 个以上的课程,定义为一个视图。C_Survey2 (Cno, SumStud, SumDept, CGavg)
CREATE VIEW C_Survey2(Cno,SumStud,SumDept,CGavg)as
SELECT Cno,COUNT(SC.Sno), COUNT(DISTINCT sdept),AVG(Grade)
FROM S,SC /*平均分-90覆盖超三个系,选修超过人的课程*/
WHERE S.Sno=SC.Sno
GROUP BY Cno
HAVING COUNT(SC.Sno)>15 and COUNT(DISTINCT sdept)>3 and AVG(Grade)<90 and AVG(Grade)>80
(10)将平均成绩介于 80~90 分,选修人数达到 20 人以上,不及格学生不超过 3 人,且 选修学生所覆盖的系别超过 3 个以上的课程,定义为一个视图。C_Survey3 (Cno, SumStud, SumDept, CGavg)
CREATE VIEW C_Survey3(Cno,SumStud,SumDept,CGavg)as
SELECT Cno,COUNT(SC.Sno), COUNT(DISTINCT sdept),AVG(Grade)
FROM S,SC /*平均分-90 覆盖 超三个系,选修超过人的课程,不及格人数低于人*/
WHERE S.Sno=SC.Sno GROUP BY Cno
HAVING COUNT(SC.Sno)>=20 and COUNT(DISTINCT sdept)>=3 and COUNT(case when Grade<60 then 1 else NULL end)<3 and AVG(Grade)<=90 and AVG(Grade)>=80
(11)将选修人数超过 30 以上,且课程选修学生覆盖的系别大于 3 人的课程,定义为一个视图。C_Survey4 (Cno, SumStud, SumDept)
CREATE VIEW C_Survey4(Cno,SumStud,SumDept)as
SELECT Cno,COUNT(SC.Sno),COUNT(s.sdept)
FROM S,SC /* 覆盖超三个系, 选修超过人的课程*/
WHERE S.Sno=SC.Sno
GROUP BY Cno
HAVING COUNT(SC.Sno)>30 AND COUNT(s.sdept)>3
(1)利用计算机系学生的视图 CS_Stud1,查询:
① 年龄小于 20 岁的学生
② 选修了 C02 号课程的学生学号和姓名
SELECT *
FROM CS_Stud1
WHERE Sage<20 SELECT CS_Stud1.Sno,Sname
FROM CS_Stud1,SC
WHERE SC.Sno=CS_Stud1.Sno AND SC.Cno='2'
(2)利用数学系学生的视图 MA_Stud1,查询:
① 成绩不及格的人数
② C02 号课程的:课程号,课程名,平均成绩,最高分,最高分的学生学号和姓名, 最低分,最高分的学生学号和姓名
SELECT COUNT(SNO)
FROM MA_Stud1
WHERE Grade<60 SELECT *
FROM (SELECT Cno,Cname FROM C WHERE Cno='2') AS C2, (SELECT AVG(Grade) GAVG,MAX(Grade) GMAX,SNOMAX=MAX(CASE Grade WHEN GMAX THEN Sno ELSE NULL END), SNAMEMAX=MAX(CASE Grade WHEN GMAX THEN Sname ELSE NULL END), MIN(GRADE) GMIN, SNOMIN=MAX(CASE Grade WHEN GMIN THEN Sno ELSE NULL END), SNAMEMIN=MAX(CASE Grade WHEN GMIN THEN Sname ELSE NULL END) FROM MA_Stud1,( SELECT MAX(Grade),MIN(GRADE) FROM MA_Stud1) AS TEMP(GMAX,GMIN)) AS G SELECT *
FROM (SELECT Cno,Cname FROM C WHERE Cno='2') AS C2, (SELECT AVG(GRADE) GAVG FROM MA_Stud1) M1, (SELECT * FROM MA_Stud1 WHERE Grade>=ALL(SELECT Grade FROM MA_Stud1)) M2(SNOMAX,SNAMEMAX,GMAX), (SELECT * FROM MA_Stud1 WHERE Grade<=ALL(SELECT Grade FROM MA_Stud1)) M3(SNOMIN,SNAMEMIN,GMIN)
(3)利用 S_Gavg1 视图,查询:
① 平均成绩在 90 分以上的学生学号和平均成绩
② 平均成绩在 90 分以上的学生的选课情况,包括:学号、姓名、课程名、成绩
CREATE VIEW [S_Gavg1] as SELECT Sno,AVG(Grade) average /*平 均成绩视图*/ FROM SC
GROUP BY Sno SELECT * FROM S_Gavg1 WHERE average>90 SELECT Sno,AVG(Grade) average FROM SC GROUP BY Sno HAVING AVG(Grade)>90 CREATE VIEW SCSC(SNO,SNAME,CNO,CNAME,GRADE) AS SELECT S.Sno,S.Sname,C.Cno,C.Cname,SC.Grade FROM S,C,SC WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno SELECT SCSC.SNO,SNAME,CNAME,GRADE FROM S_Gavg1,SCSC WHERE average>90 AND S_Gavg1.Sno = SCSC.SNO SELECT S.Sno,SNAME,CNAME,GRADE FROM S,C,SC WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno AND S.Sno IN (SELECT Sno FROM SC
GROUP BY Sno HAVING AVG(Grade)>90) SELECT S.Sno,SNAME,CNAME,GRADE FROM (SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>90) as S_Gavg(SNO,average),S,C,SC WHERE S_Gavg.Sno = S.SNO AND S.Sno = SC.Sno AND C.Cno = SC.Cno
(4)利用 S_Gavg3 视图,查询:
① 平均成绩在 95 分以上的学生学号和平均成绩
② 平均成绩在 95 分以上的学生选课情况,包括:学号、姓名、课程名、成绩
CREATE view [S_Gavg3] as SELECT Sno,SUM(C.Ccredit)SumCredit,COUNT(SC.Cn o)SumCourse,AVG(Grade)SGavg FROM C,SC /*90分以上且选够 门课学分的学生成绩视图*/ WHERE C.Cno=SC.Cno GROUP BY Sno HAVING SUM(C.Ccredit)>=30 AND COUNT(SC.Cno)>10 AND AVG(Grade)>90 SELECT Sno,SGavg FROM S_Gavg3 WHERE S_Gavg3.SGavg>95 SELECT Sno,SUM(C.Ccredit)SumCredit,COUNT(SC.Cn o)SumCourse,AVG(Grade)SGavg FROM C,SC WHERE C.Cno=SC.Cno GROUP BY Sno HAVING SUM(C.Ccredit)>=30 AND COUNT(SC.Cno)>10 AND AVG(Grade)>95 SELECT SCSC.SNO,SNAME,CNAME,GRADE FROM S_Gavg3,SCSC WHERE S_Gavg3.Sno=SCSC.SNO AND SGavg>91 SELECT S.Sno,SNAME,CNAME,GRADE FROM S,C,SC WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno AND S.SNO IN (SELECT Sno FROM C,SC WHERE C.Cno=SC.Cno GROUP BY Sno HAVING SUM(C.Ccredit)>=30 AND COUNT(SC.Cno)>10 AND AVG(Grade)>91 ) SELECT S.Sno,SNAME,CNAME,GRADE FROM (SELECT Sno,SUM(C.Ccredit),COUNT(SC.Cno),AVG(Gr ade) FROM C,SC WHERE C.Cno=SC.Cno
GROUP BY Sno HAVING SUM(C.Ccredit)>=30 AND COUNT(SC.Cno)>10 AND AVG(Grade)>91 ) as S_Gavg(SNO,SumCredit,SumCourse,SGavg),S ,C,SC WHERE S_Gavg.Sno = S.SNO AND S.Sno = SC.Sno AND C.Cno = SC.Cno
(5)利用 C_Survey1 视图,查询:
① 课程的选课情况,包括:课号、课程名、学号、姓名、成绩
CREATE VIEW C_Survey1(Cno,SumDept,SumStud)as SELECT Cno,COUNT(DISTINCT sdept)SumDept,COUNT(SC.Sno)SumStud FROM SC,S /*覆盖三个系,选 修超过人的课程*/ WHERE SC.Sno=S.Sno GROUP BY Cno HAVING COUNT(DISTINCT sdept)>=3 AND COUNT(SC.Sno)>=5 SELECT SCSC.CNO,CNAME,SCSC.SNO,SNAME,GRADE FROM C_Survey1,SCSC WHERE C_Survey1.Cno=SCSC.CNO ORDER BY SCSC.CNO SELECT C.Cno,Cname,S.Sno,SNAME,GRADE
FROM S,C,SC WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno AND C.Cno IN (SELECT Cno FROM SC,S WHERE SC.Sno=S.Sno GROUP BY Cno HAVING COUNT(DISTINCT sdept)>=3 AND COUNT(SC.Sno)>=5 ) ORDER BY C.Cno
(6)利用 C_Survey3 视图,查询:
① 课程的选修情况,包括:课号、课程名、学号、姓名、成绩
SELECT SCSC.CNO,CNAME,SCSC.SNO,SNAME,GRADE FROM C_Survey3,SCSC WHERE C_Survey3.Cno=SCSC.CNO CREATE VIEW C_Survey3(Cno,SumStud,SumDept,CGavg)as SELECT Cno,COUNT(SC.Sno), COUNT(DISTINCT sdept),AVG(Grade) FROM S,SC /*平均分-90 覆盖 超三个系,选修超过人的课程,不及格人数低于人*/ WHERE S.Sno=SC.Sno GROUP BY Cno HAVING COUNT(SC.Sno)>=20 and COUNT(DISTINCT sdept)>=3 and COUNT(case when Grade<60 then 1 else NULL end)<3 and AVG(Grade)<=90 and AVG(Grade)>=80
GO SELECT S.Sno,SNAME,CNAME,GRADE FROM S,C,SC WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno AND C.Cno IN (SELECT Cno FROM S,SC WHERE S.Sno=SC.Sno GROUP BY Cno HAVING COUNT(SC.Sno)>=20 and COUNT(DISTINCT sdept)>=3 and COUNT(case when Grade<60 then 1 else NULL end)<3 and AVG(Grade)<=90 and AVG(Grade)>=80 )
(7)利用视图消解法,将上述(3)~(6)中基于视图的查询,转化为基于基表的查询。
实验七:SQL编程综合
/*列出所有去台北旅行团的代号,导游和发团时间。*/
Select TID,Guide,StartTime
From Travel
Where Destination = '台北'
/*列出所有预定去冰岛的旅客的最高、最低、平均年龄*/
Select MAX(Age) as MAX_Age, MIN(Age) as MIN_Age, AVG(Age) as AVG_Age
From Customer,Travel,Ord
Where Customer.CID = Ord.CID and Travel.TID = Ord.TID and Destination = '冰岛'
/*列出所有去台北或冰岛的旅客的总计应付金额及总计实付金额;*/
Select SUM(ShouldPay) as shouldAmountPaid, SUM(AmountPaid) as sumAmountPaid
From Ord,Travel
Where Ord.TID = Travel.TID and(Destination = '台北' or Destination = '冰岛')
/*列出预定旅行团数目最多的游客的编号、姓名;*/
Select Customer.CID, Customer.Cname, COUNT(TID) as sum
From Customer,Ord
Where Ord.CID = Customer.CID
Group by Customer.CID
Having COUNT(*)=(Select top 1 count(*) as sum From Ord Group by Ord.CIDOrder by sum Desc)
/*将 10 月 1 日发团更新为 9 月 30 日;*/
Update Travel
Set StartTime = '2021-9-30'
Where StartTime = '2021-10-1'
/*找出预定多于一个旅行团的旅客,将其订单的应付金额乘以 0.9;*/
Update Ord
Set ShouldPay = ShouldPay * 0.9
Where Ord.CID In (Select CID From Ord Group by CID Having COUNT(*) > 1)
/*列出所有与旅客“许晴”同团且同性别的旅客情况(编号、姓名、性别、年龄)*/
Select Customer.CID,Cname,Sex,Age
From Customer,Ord
Where Customer.CID = Ord.CID and Customer.Cname != '许晴' and TID in (select TID from Customer,Ord where Customer.Cname = '许晴' and Customer.CID = Ord.CID)and Sex in (select Sex from Customer where Customer.Cname = '许晴')/*统计上述这些旅客中年龄超过 60 岁的旅客人数*/
select COUNT(Customer.CID)as order_than_60
from Customer,Ord
where Customer.CID = Ord.CIDand Customer.Cname != '许晴' and TID in (select TID from Customer,Ord where Customer.Cname = '许晴' and Customer.CID = Ord.CID)and Sex in (select Sex from Customerwhere Customer.Cname = '许晴')and Age >60/*对这些旅客中年龄超过 60 岁的旅客应付金额统一减免 100 元*/
update Ord
set ShouldPay = ShouldPay-100
where CID in (select Customer.CID from Customer,Ord where Customer.CID = Ord.CID and Customer.Cname != '许晴' and TID in (select TIDfrom Customer,Ordwhere Customer.Cname = '许晴' and Customer.CID = Ord.CID)and Sex in (select Sexfrom Customerwhere Customer.Cname = '许晴')and Age > 60)/*对其中年龄最大的旅客全部免费;*/
update Ord
set ShouldPay = 0
where CID in (select top 1 Customer.CIDfrom Customer,Ordwhere Customer.CID = Ord.CID and Customer.Cname != '许晴' and TID in(select TIDfrom Customer,Ordwhere Customer.Cname = '许晴' and Customer.CID = Ord.CID)and Sex in(select Sexfrom Customerwhere Customer.Cname = '许晴')and Age > 60)
/*找出每个旅行团中年龄高于该团中旅客平均年龄的游客编号和姓名*/
select Customer.CID,Customer.Cname
from Customer,Ord,(select TID ,avg(customer.age) as avgage from Ord,Customerwhere customer.CID = Ord.CID group by TID) as avgview
where Ord.CID = Customer.CID and Ord.TID = avgview.TID and Customer.Age >avgview.avgage
/* 列出所有给予了订单金额减免优惠的旅客的编号、姓名、性别、年龄、总计减免金额*/
select Customer.CID,Cname,Sex,Age,Travel.Price-Ord.ShouldPay as discount
from Customer,Travel,Ord
where Ord.CID = Customer.CID and Ord.TID = Travel.TIDand Travel.Price != Ord.ShouldPay
《数据库原理》实验 西北工业大学相关推荐
- 西北工业大学2009-2010学年第一学期期末考试(A卷)
试题来源:凤凰考研 公众号 西北工业大学2009-2010学年第一学期期末考试(A卷) 一.单项选择题(每题1分,共20×1=20分) 1.相对于OSI/RM七层参考模型的低四层,TCP/IP协议集对 ...
- 计算机辅助制造实验感想6,西北工业大学824计算机辅助制造课件第6章.ppt
文档介绍: 第六章数控加工程序的后置处理 锥筐眩沃幂雄灵纪啄顺备块匀违沂粥县挎异研茅烹瑶谩运凰乒涉亿杖恒苔西北工业大学824计算机辅助制造课件第6章西北工业大学824计算机辅助制造课件第6章 2 数控 ...
- 数据库原理实验二 数据库管理 实验报告
广州大学学生实验报告实验二:数据库管理 此篇分享仅供参考学习,图文禁复制,勿作他用!谢谢配合! 数据库原理实验之实验二:数据库管理 软件:Oracle SQL Developer 今天实验才刚开始,花 ...
- 2020年824计算机辅助制造,【2017年整理】西北工业大学824计算机辅助制造课件8.ppt...
[2017年整理]西北工业大学824计算机辅助制造课件8 第八章快速原型制造技术 一. 快速成形原理及特点 一. 快速成形原理及特点 一. 快速成形原理及特点 一. 快速成形原理及特点 一. 快速成形 ...
- 西北工业大学NOJ(C语言)(更新中)
西北工业大学noj100题(C语言) 1.计算A+B 2.圆及圆球等的相关计算 3.计算成绩 4.找最大数 5.找幸运数 6.奖金发放 7.出租车费 8.是该年的第几天? 9.成绩转换 10.求建筑高 ...
- 数据库原理实验三 数据库综合设计实验 实验报告
实验三 数据库系统设计综合实验 1.实验目的通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数据库系统. 2.实验要求熟悉实验室实验环境,掌握实验预备知识,了解实验中故障排除的 ...
- 【数据库原理实验(openGauss)】金融场景化实验
金融场景化实验 文章目录 金融场景化实验 一.金融数据模型 1.E-R图 2.关系模式 3.物理模型 Client(客户)表 bank_card(银行卡)表 finances_product(理财产品 ...
- 【数据库原理实验(openGauss)】实验报告
<数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...
- 《数据库原理实验指导书》
<数据库原理实验指导书> 河南科技大学软件学院 目录 实验规则 基本实验方法 实验环境 实验一 数据定义 实验二 数据更新 实验三 数据查询-简单查询和连接查询 实验四 数据查询-分组查询 ...
最新文章
- word打开时报Cannot find the Word document template:WordToRqm.dot
- python的编程模式-Python设计模式:为了整洁又时尚的代码
- WebView完全解读
- 工厂模式、构造函数入门
- Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库
- vue怎么vw布局好用_vue cli3项目的pc自适应布局_vw
- Tomcat集群实现源码级别剖析
- 【TensorFlow】TensorFlow函数精讲之tf.nn.max_pool()和tf.nn.avg_pool()
- 干支纪年法简便算法_@谢氏宗亲:可知道我国为何放弃黄帝纪年,而选择耶稣诞辰纪年法...
- nginx限速方法以及报错处理
- jQuery 异步上传插件 Uploadify 使用 (Java平台)
- 基于jsp(java)学生成绩管理系统的设计和实现
- 高德定位获取经纬度,街道城市名称
- Java数组的三种打印方式
- Windows基础知识整理
- No tracked branch configured for branch master or the branch doesn‘t exist. To make your branch trac
- 第十二章(项目采购管理)知识点
- 最全电商分类信息(10)
- 《C++程序设计上机实践及学习辅导》实验报告
- 推荐系统序列化建模总结