数据库系统概论 第3章 SQL语句复习(SQL Server实现)

假如想象 提交于 2020-01-24 04:38:02

说明:
1、如果语句需要用到前面的create语句创建的对象,但执行时提示相关对象不存在,此时应该把后续的语句注释,只执行create语句,然后将create语句注释,再执行后续语句。
2、一些例子与已有例子相似,未被选入本帖。同时,SQL Server不能识别的语句(例如drop cascade / restrict)相关的例子也没有收录。
3、在SQL Server中执行下列语句,温习SQL的常见语法。
4、为了防止报错,可以分批执行语句,每次只执行两个空行之间的语句,而将其余的语句注释掉。

create database Demo
use Demo
create user WANG for login Alice
create user ZHANG for login Bob
go

--例3.1 为用户WANG定义一个学生-课程模式S-T
create schema "S-T" authorization WANG
go
--例3.3 为用户ZHANG创建一个模式TEST,并在其中建立一个表TAB1。
create schema TEST authorization zhang
go
create table TEST.TAB1 (col1 smallint, con2 int, col3 char(20), col4 numeric(10,3), col5 decimal(5, 2))
--例3.5 建立一个“学生”表Student
create table Student (Sno char(9) primary key, Sname char(20) unique, Ssex char(2), Sage smallint, Sdept char(20));
--例3.6 建立一个“课程”表Course。
create table Course (Cno char(4) primary key, Cname char(40) not null, Cpno char(4), Ccredit smallint)
--例3.7 建立学生选课表SC
create table SC (Sno char(9), Cno char(4), Grade smallint, primary key (Sno, Cno))

--例3.8 向Student表增加“入学时间”列,数据类型为日期型。
alter table student add S_entrance date
--例3.9 将年龄的数据类型改为整数。
alter table student alter column sage int
--例3.10 增加课程名称必须取值唯一的约束条件。
alter table course add unique(cname)
--删除TAB1
drop table test.tab1
--例3.13 为学生-课程数据库中的student, course和sc三个表分别建立学号升序、课程号升序、学号升序和课程号降序的唯一索引。
create unique index Stusno on student(sno)
create unique index Coucno on course(cno)
create unique index SCno on sc(sno asc, cno desc)
--例3.14 将SC表的SCno索引名改为SCSno
exec sp_rename 'dbo.sc.scno', 'dbo.sc.SCSno' 
--建立和删除索引
create index idx on sc(grade)
drop index sc.idx

--先通过GUI插入书本P79的数据到各个表格,然后再执行下列语句。Course表的第7行的课程名称改成C/C++。
--添加外键
alter table course add constraint FK_Course_Cno foreign key (cpno) references course(cno)
alter table sc add constraint FK_SC_Sno foreign key (sno) references student(sno)
alter table sc add constraint FK_SC_Cno foreign key (cno) references course(cno)

--例3.17 查询全体学生的姓名、学号、所在系
select sname, sno, sdept from student
--例3.18 查询全体学生的全体信息
select * from student
--例3.19 查询全体学生的姓名及其出生年份
select sname, 2020-sage from student
--例3.20 查询全体学生的姓名,并单独标出出生年份,右侧的列则为所在院系,要求小写字母表示系名。
select sname, 'Year of birth:', 2020 - sage, lower(sdept) from student
--对查询结果指定列别名
select sname Name, 'Year of birth:' Birth, 2020-sage BirthYear, lower(sdept) Department from student
--例3.21 查询选修了课程的学生的学号,要求:(1)删去结果中重复的行;(2)显式保留结果中取值重复的行。
select distinct sno from sc
select all sno from sc
--例3.22 查询计算机科学系全体学生的名单
select sname from student where sdept='CS'
--例3.23 查询所有年龄在20岁以下的学生的姓名并显示其年龄
select sname, sage from student where sage < 20
--例3.24 查询考试不及格的学生的学号,要求当一个学生多门课不及格时,学号也只列写一次。
select distinct sno from sc where grade < 60
--例3.25 查询年龄在20到23岁(包括上下界)的学生的姓名、系别和年龄。
select sname, sdept, sage from student where sage between 20 and 23
--例3.26 查询年龄不在20到23岁(包括上下界)的学生的姓名、系别和年龄。
select sname, sdept, sage from student where sage not between 20 and 23
--例3.27 谓词in可以查找属性值属于指定集合的元组。查询计算机科学系、数学系和信息系的学生的姓名与性别。
select sname, ssex from student where sdept in ('CS', 'MA', 'IS')
--例3.28 查询既不是计算机科学系,也不是数学系和信息系的学生的姓名与性别。
select sname, ssex from student where not sdept in ('CS', 'MA', 'IS')
--例3.29 谓词LIKE可以用于字符串匹配。查询学号为201215121的学生的全部个人信息。
select * from student where sno like '201215121'
--例3.30 通配符%和_分别代表任意长度的字符串和任意单个字符。查询所有姓刘的学生的姓名、学号和性别。
select sname, sno, ssex from student where sname like '刘%'
--例3.31 查询姓“欧阳”且全名为三个汉字的学生的姓名。注意字符集为ASCII时一个汉字需要两个_,字符集为GBK时只需要一个_。
select sname from student where sname like '欧阳__'
--例3.32 查询名字中第二个字为“阳”的学生的姓名和学号。
select sname, sno from student where sname like '__阳%'
--例3.34 利用escape修饰可以指定转义字符。查询DB_Design课程的课程号和学分。
select cno, ccredit from course where cname like 'DB\_Design' escape '\'
--例3.35 查询以“DB_”开头,且倒数第三个字符为i的课程的课程信息。
select * from course where cname like 'DB\_%i__' escape '\'
--例3.36 查询缺少成绩的学生的学号和相应的课程号。
select sno, cno from sc where grade is null
--例3.37 查询所有有成绩的学生学号和课程号。
select sno, cno from sc where grade is not null
--例3.38 AND和OR运算符可以构造更复杂的查询条件。查询计算机科学系年龄在20岁以下的学生姓名。
select sname from student where sdept = 'CS' and sage < 20
--例3.39 查询选修了3号课程的学生的学号及其成绩,结果按分数降序排列。
select sno, grade from sc where cno = '3' order by grade desc
--例3.40 查询全体学生的信息,结果按所在系的系号升序,学生年龄降序排列。
select * from student order by sdept, sage desc
--例3.41 用聚集函数count全表扫描,查询学生总人数
select count(*) from student
--例3.42 查询选修了课程的学生的人数。
select count(distinct sno) from sc
--例3.43 计算选修1号课程的学生的平均成绩。
select avg(grade) from sc where cno = '1'
--例3.44 查询选修1号课程的学生的最高分。
select max(grade) from sc where cno = '1'
--例3.45 查询学生201215012选修的课程的总学分
select sum(ccredit) from sc, course where sno = '201215012' and sc.cno = course.cno
--例3.46 求各个课程号及相应的选课人数,要求通过group by子句分组,使得聚集函数作用于每一组。
select cno, count(sno) from sc group by cno
--例3.47 查询选修了三门以上课程的学生的学号。要求用group by子句的having子句实现仅将满足条件的组选出来。
select sno from sc group by sno having count(*) > 3
--例3.48 查询平均成绩大于90份的学生的学号和平均成绩。要求用group by子句从组中选择满足条件的组。
select sno, avg(grade) from sc group by sno having avg(grade) >= 90
--例3.49 查询每个学生及其选修课程的情况。
select student.*, sc.* from student, sc where student.sno = sc.sno
--例3.50 用自然连接完成例3.49
select student.sno, sname, ssex, sage, sdept, cno, grade from student, sc where student.sno = sc.sno
--例3.51 查询选修2号课程且成绩在90份以上的学生的学号和姓名。
select student.sno, sname from student, sc where student.sno = sc.sno and sc.cno = '2' and sc.grade > 90
--例3.52 查询每一门课的间接先修课(先修课的先修课)
select first.cno, second.cpno from course first, course second where first.cpno = second.cno
--例3.53 用外连接改写例3.49,要求保留未选课的学生的信息。
select student.sno, sname, ssex, sage, sdept, cno, grade from student left outer join sc on student.sno = sc.cno
--例3.54 查询每个学生的学号、姓名、选修课程名及成绩。
select student.sno, sname, cname, grade from student, sc, course where student.sno = sc.sno and sc.sno = course.cno
--例3.55 用嵌套查询和自身连接完成查询:与“刘晨”在同一个系学习的学生。
select sno, sname, sdept from student where sdept in (select sdept from student where sname = '刘晨')
select s1.sno, s1.sname, s1.sdept from student s1, student s2 where s1.sdept = s2.sdept and s2.sname = '刘晨'
--例3.56 查询选修了名为“信息系统”的课程的学生的学号和姓名
select sno, sname from student where sno in (select sno from sc where cno in (select cno from course where cname = '信息系统'))
select student.sno, sname from student, sc, course where student.sno = sc.cno and sc.cno = course.cno and course.cname = '信息系统'
--例3.57 找出每个学生超过他自己选修课程的平均成绩的课程号。
select sno, cno from sc x where grade >= (select avg(grade) from sc y where y.sno = x.sno)
--例3.58 查询非计算机科学系中比计算机科学系任意一个学生的年龄小的学生的姓名和年龄。
select sname, sage from student where sage < any (select sage from student where sdept = 'CS') and sdept != 'CS'
select sname, sage from student where sage < (select max(sage) from student where sdept = 'CS') and sdept <> 'CS'
--例3.59 查询非计算机科学系中比计算机科学系所有的学生年龄都小的学生的姓名即年龄。
select sname, sage from student where sage < all (select sage from student where sdept = 'CS') and sdept <> 'CS'
select sname, sage from student where sage < (select min(sage) from student where sdept = 'CS') and sdept <> 'CS'
--例3.60 查询所有选修了1号课程的学生的姓名。
select sname from student where exists (select * from sc where sno = student.sno and cno = '1')
--例3.61 查询所有未选修1号课程的学生的姓名。
select sname from student where not exists (select * from sc where sno = student.sno and cno = '1')
--例3.62 查询选修了全部课程的学生的姓名(查询这样的学生:没有任何一门课他没有选修)。
select sname from student where not exists (select * from course where not exists (select * from sc where sno = student.sno and cno = course.cno))
--例3.63 查询至少选修了学生201215122选修的全部课程的学生号码(不存在这样的课程y,学生201215122选修了y但学生x没有选)。
select distinct sno from sc scx where not exists (select * from sc scy where scy.sno = '201215122' and not exists (select * from sc scz where scz.sno = scx.sno and scz.sno = scy.sno))
--例3.64 查询计算机科学系的学生及年龄不大于19岁的学生(去掉或不去掉重复元组)。
select * from student where sdept = 'CS' union select * from student where sage <= 19
select * from student where sdept = 'CS' union all select * from student where sage <= 19
--例3.66 查询计算机科学系中的学生与年龄不大于19岁的学生的交集。
select * from student where sdept = 'CS' intersect select * from student where sage <= 19
--例3.68 查询计算机科学系的学生与年龄不大于19岁的学生的差集。
select * from student where sdept = 'CS' except select * from student where sage <= 19

--例3.69 将一个新学生元组(201215128,陈冬,男,IS,18岁)插入到student表中。
insert into student (sno, sname, ssex, sdept, sage) values ('201215128', '陈冬', '男', 'IS', 18)
--例3.70 将学生张成民的信息插入到student表中。
insert into student values ('201215126', '张成民', '男', 18, 'CS', null)
--例3.72 求每一个系的学生的平均年龄,并存入数据库。
create table Dept_age (Sdept char(15), Avg_age smallint)
insert into dept_age (sdept, Avg_age) select sdept, avg(sage) from student group by sdept

--例3.73 将学生201215121的年龄改为22岁。
update student set sage = 22 where sno = '201215121'
--例3.74 将所有学生的年龄增加1岁。
update student set sage = sage + 1
--例3.75 将计算机科学系全体学生的成绩置零。
update sc set grade = 0 where sno in (select sno from student where sdept = 'CS')

--例3.81 从student表中找出漏填了任何一项数据的学生信息。
select * from student where sname is null or ssex is null or sage is null or sdept is null

--例3.85 建立信息系选修了1号课程的学生的视图,包括学号、姓名、成绩。
go
create view IS_S1 (Sno, Sname, Grade) as select student.sno, sname, grade from student, sc where sdept = 'IS' and student.sno = sc.sno and sc.cno = '1'
go
--例3.87 定义信息系选修了1号课程且成绩在90以上的学生的视图。
create view IS_S2 as select sno, sname, grade from IS_S1 where grade > 90
go
--例3.88 定义一个反映学生出生年份的视图。
create view BT_S (Sno, Sname, Sbirth) as select sno, sname, 2020 - sage from student
go
--例3.89 将学生的学号及平均成绩定义为视图。
create view S_G (Sno, Savg) as select sno, avg(grade) from sc group by sno
go

--例3.76 删除学号为201215128的学生记录。
delete from student where sno = '201215128'
--例3.77 删除所有学生的选课记录。
delete from sc


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!