先建student ,course,sc表:
CREATE TABLE Student (
Sno char(7) PRIMARY KEY, /* 在列级完整性约束处定义主码约束 */
Sname char(10) NOT NULL, /* 非空约束 */
Ssex char(2),
Sage tinyint,
Sdept char(20)
)
CREATE TABLE Course (
Cno char(10) NOT NULL,
Cname char(20) NOT NULL,
Credit tinyint,
Semester tinyint,
PRIMARY KEY(Cno) /* 在表级完整性约束处定义主码约束 */
)
CREATE TABLE SC (
Sno char(7) NOT NULL,
Cno char(10) NOT NULL,
Grade smallint,
PRIMARY KEY(Sno, Cno),
FOREIGN KEY(Sno) REFERENCES Student (Sno),
FOREIGN KEY(Cno) REFERENCES Course (Cno)
)
insert into student values('9512101','李勇','男',19,'计算机系')
(略)
--------------------------------------------------------------
insert into course values('c01','计算机文化学',3,1)
(略)
------------------------------------------------
insert into sc values('9512101','c01',90)
(略)
建立起三个表(STUDENT、COURSE、SC)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
数据操作相关
第四章习题
1.查询学生选课表的全部数据
select*from sc
3.查询成绩在70-80分之间的学生的学号、课程号和成绩
select sno,cno,grade from SC
where gradebetween 70 and80
5.查询课程号为c01的课程的最高分数
selectmax(grade)as最高分
from sc where cno='c01'
7.统计每个系的学生人数
select sdept,count(*)from student
groupby sdept
having sdeptin('计算机系','信息系','数学系')
9.统计每个学生的选课门数和考试总成绩,并按选课门数升序显示结果
select sno as学号,count(*)as选课门数,sum(grade)as'考试总成绩'
from sc
groupby sno
11.查询选修了c02号课程的学生的姓名和所在系
select snameas姓名,sdept as所在系
fromstudent join sc onstudent.sno =sc.sno
where cno='c02'
14.查询与VB在同一学期开设的课程的课程名和开课学期
SELECT C2.Cname AS课程名,C2.Semester AS开课学期
FROMCourse C1 join Course C2
ON C1.Semester=C2.Semester
WHERE C1.Cname='VB'AND C2.Cname!='VB'
15.查询与李勇年龄相同的学生的姓名、所在系、年龄
SELECT S2.Sname AS姓名,S2.Sdept AS所在系,S2.Sage AS年龄
FROMStudent S1 join Student S2
ON S1.Sage=S2.Sage
WHERE S1.Sname='李勇'AND S2.Sname!='李勇'
16.用子查询实现如下查询
(1)查询选修了c01号课程的学生姓名和所在系
SELECTSname as姓名,Sdept as所在系From Student JOINSC
onStudent.sno=SC.sno
WHERE cnoIN(
SELECT cno from SC where cno='C01')
(2)查询数学系成绩80分以上的学生的学号、姓名、课程号和成绩
SELECT SC.Sno as学号,Sname as姓名,Cno as课程号,Grade as成绩From Student JOINSC
onStudent.Sno=SC.Sno
WHERE Grade>80
(3)查询计算机系考试成绩最高的学生的姓名
SELECTSname as姓名,Sdept as所在系,Grade as最高成绩FromStudent
join SC
ONStudent.Sno=SC.Sno
WHEREGrade=(SELECTMAX(Grade)From SC where SC.Sno in
(SELECT Sno from Student WHERESdept='计算机系'))
(4)查询数据结构考试成绩最高的学生的姓名、所在系、性别、成绩
SELECTSname as姓名,Sdept as所在系,Ssex as性别,Cname as课程,Grade as最高成绩
FromStudent
join SC ON Student.Sno=SC.Sno
joinCourse ON Course.Cno=SC.Cno
WHEREGrade=(SELECTMAX(Grade)From SC where SC.Cno=
(SELECT Cno from Course WHERECname='数据结构'))
(由于报数据结构这门课的学生的成绩都为NULL,所以结果没显示)
与权限相关
第十一章习题:
1.用T-SQL语句去创建sql server身份验证模式登录名:log1,log2,log3
CREATELOGIN log1 WITHPASSWORD='123'MUST_CHANGE;
CREATELOGIN log2 WITHPASSWORD='123'MUST_CHANGE;
CREATELOGIN log3 WITH PASSWORD='123' MUST_CHANGE;
6.授予log1具有对Course表的查询权限,授予log2具有对Course表的插入权限
(先用SSMS设置了用户映射这个语句才起作用)
GRANTSELECTON Course TO log1;
GRANTINSERTON Course TO log2;
14.
为lixiyu数据库建立用户定义的角色:SelectRole
createROLESelectRole
并授予对Student,Course,SC表具有查询权
GRANTSELECTON Student TO SelectRole;
GRANTSELECTON Course TO SelectRole;
GRANTSELECTON SC TO SelectRole;
建立登录名:pub_user,并让该登录名成为student数据库的合法用户
USElixiyu
CREATELOGIN pub_user
WITHPASSWORD='123';
CREATEUSER pub_user;
此时登录pub_user建立新的数据查询
select*from course 不能成功:拒绝了对对象'Course' (数据库'master',架构'dbo')的SELECT 权限。
将pub_user用户添加到SelectRole角色中
EXECsp_addrolemember'SelectRole','pub_user'
此时再新建查询:select*fromcourse 可以成功
与数据库备份相关
第十二章习题
4.利用备份和恢复数据库的T-SQL语句按顺序完成下列操作
(1)新建备份设备:back1和back2
USEmaster;
GO
EXECsp_addumpdevice'disk','back1','D:\BACKUP\back1.bak';
EXECsp_addumpdevice'disk','back2','D:\BACKUP\back2.bak';
(2)对lixiyu数据库进行一次完整备份,以覆盖的方式备份到back1
BACKUPDATABASElixiyu TO back1 WITHINIT
(3)删除sc表
use lixiyu
DROPTABLE SC
(4)对lixiyu 数据库进行一次差异备份,以追加的方式备份到back1
BACKUPDATABASE lixiyu TOback1 WITH DIFFERENTIAL,NOINIT
(5)删除lixiyu数据库
DROPDATABASE lixiyu
(6)利用back1备份设备恢复lixiyu数据库完整备份
RESTOREDATABASE lixiyu FROMback1
(7)用SSMS工具可以看到lixiyu数据库,因为之前对数据在back1上有完整备份;
表节点也能看到SC表,因为对数据库的完整备份时SC表仍在数据库中尚未删除
(8)RESTOREDATABASE lixiyu FROMback1
WITHFILE=1,NORECOVERY;
RESTOREDATABASE lixiyu FROMback1
WITHFILE=2,RECOVERY;
RESTORELOG lixiyu FROMback2
(9)看不到SC表了,因为恢复了差异备份
(10)usemaster;
go
EXECsp_addumpdevice'disk','lixiyu','D:\BACKUP\lixiyu.bak'
BACKUPDATABASE lixiyu TOlixiyu WITH INIT
(11)
BACKUPLOG lixiyu TODISK='D:\BACKUP\back2.bak'withNOINIT