先建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)

(略)

建立起三个表(STUDENTCOURSESC

_ _  _  _ _  _  _ _  _  _ _  _  _ _  _  _ _  _  _ _  _  _ _  _

数据操作相关


第四章习题

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)新建备份设备:back1back2

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表仍在数据库中尚未删除

8RESTOREDATABASE lixiyu FROMback1

WITHFILE=1,NORECOVERY;

RESTOREDATABASE lixiyu FROMback1

WITHFILE=2,RECOVERY;

RESTORELOG lixiyu FROMback2

(9)看不到SC表了,因为恢复了差异备份


10usemaster;

go

EXECsp_addumpdevice'disk','lixiyu','D:\BACKUP\lixiyu.bak'

BACKUPDATABASE lixiyu TOlixiyu WITH INIT

11

BACKUPLOG lixiyu TODISK='D:\BACKUP\back2.bak'withNOINIT