大三数据库实验报告

数据库实用技术实验报告(一)

数据库的创建和管理

1:使用CREATE DATABASE创建一个新的数据库,名称为“STUDENT2”,其他所有参数均取默认值

         2:创建一个名称为STUDENT3的数据库,该数据库的主文件逻辑名称为STUDENT3_data,物理文件名为STUDENT3.mdf,初始大小为3MB,最大尺寸为无限大,增长速度为15%;数据库的日志文件逻辑名称为STUDENT3_log,物理文件名为STUDENT3.ldf,初始大小为2MB,最大尺寸为50MB,增长速度为1MB;要求数据库文件和日志文件的物理文件都存放在E盘的DATA文件夹下。

 

Script

create database Student3

on

(name=Student3_data,

filename='E:\DataBase_MyHomework\Student3.mdf',

size=3,

maxsize=unlimited,

filegrowth=15

)

log on

(name=Student3_log,

filename='E:\DataBase_MyHomework\Student3.ldf',

size=2mb,

maxsize=50mb,

filegrowth=1mb)

 

Screenshot

 

 

3:创建一个指定多个数据文件和日志文件的数据库。该数据库名称为STUDENTS,有1个5MB和1个10MB的数据文件和2个5MB的事务日志文件。数据文件逻辑名称为STUDENTS1和STUDENTS2,物理文件名为STUDENTS1.mdf和STUDENTS2.ndf。主文件是STUDENTS1,由PRIMARY指定,两个数据文件的最大尺寸分别为无限大和100MB,增长速度分别为10%和1MB。事务日志文件的逻辑名为STUDENTSLOG1和STUDENTSLOG2,物理文件名为STUDENTSLOG1.ldf和STUDENTSLOG2.ldf,最大尺寸均为50MB,文件增长速度为1MB。要求数据库文件和日志文件的物理文件都存放在E盘的DATA文件夹下。

Script

create database test_Students

on primary

(name=Students1,

filename='E:\DataBase_MyHomework\Students1.mdf',

size=5,

maxsize=unlimited,

filegrowth=10%),

(name=Students2,

filename='E:\DataBase_MyHomework\Students2.mdf',

maxsize=100,

filegrowth=1)

 

log on

(name=Studentslog1,

filename='E:\DataBase_MyHomework\Studentslog1.ldf',

size=5mb,

maxsize=50mb,

filegrowth=1mb),

(name=Studentslog2,

filename='E:\DataBase_MyHomework\Studentslog2.ldf',

size=5mb,

maxsize=50mb,

filegrowth=1mb)

GO

Screenshot

 

4:删除已创建的数据库STUDENTS。

5:将已存在的数据库STUDENT3重命名为STUDENT_BACK。

Script

drop database test_Students

GO

exec sp_renamedb'Student3','Student_Back'

GO

Screenshot

数据表的创建和管理

1:在数据库STUDENT中创建一个学生基本信息表(名为t_student),表中各列的要求如下表所示。表中的s_number字段创建非空约束,定义s_number为主键,其中s_name字段具有唯一性。输入性别字段值时,只能接受“男”或者“女”,而不能接受其他数据,sex字段创建默认约束“男”

表   学生基本信息表(名为t_student)组成

字段名称

字段类型

大小

默认值

s_number

char

10

 

s_name

char

8

 

sex

char

2

birthday

datetime

 

 

polity

char

4

 

Script

create table T_Student

(S_number char(10) primary key,

S_name char(8) unique,

sex char(2) default ''

    constraint C1 check (sex in('','')),

Birthday datetime,

Polity char(4)

)

GO

Screenshot

2:创建t_score表,各个字段:s_number,c_number   ,score,并为t_score创建外键约束,该约束把表t_score中的学生学号(s_number)字段和表t_student中的学生学号(s_number)字段关联起来,实现t_score中的学生学号(s_number)字段的取值要参照表t_student中的学生学号(s_number)字段的数据值。

Script

create table T_Score

(Sno char(10),

Cno char(10),

Score char(10),

primary key(Sno,Cno),

foreign key(Sno) references [dbo].[T_Student](S_number)

)

GO

Screenshot

 

3: 在数据库STUDENT中创建一个t_course1表,各个字段:c_number   l,

c_name,hours,credit 。然后在表中增加一个c_pnumber字段,删除表中的credit字段,并且修改c_name字段的数据长度。

Script

create table T_Course1

(C_number char(10),

C_name char(20),

hours char(4),

credit smallint

)

GO

 

ALTER TABLE T_Course1 add  C_pnumber char(10)

GO

 

ALTER TABLE T_Course1 drop COLUMN credit

GO

 

ALTER table T_Course1 alter column C_name char(10)

GO

Screenshot

 

4:(1)显示STUDENT数据库中所有对象的信息。(2)显示t_student数据表的信息。

Script

 

Screenshot

 

5:删除STUDENT数据库中的表

Script

 

DECLARE tables_cursor CURSOR  --定义游标

   FOR 

   SELECT name FROM sysobjects WHERE type = 'lpf'    --选择用户表名

OPEN tables_cursor   --打开游标连接

 

DECLARE @tablename sysname      -- 定义变量

FETCH NEXT FROM tables_cursor INTO @tablename   --结果集中一行一行读取表名

WHILE (@@FETCH_STATUS <> -1)    --判断游标状态 

BEGIN 

 

   EXEC ('TRUNECATE TABLE ' + @tablename)   --清空表中的数据

   FETCH NEXT FROM tables_cursor INTO @tablename --下一行数据

END 

 

DEALLOCATE tables_cursor --关闭游标

Screenshot

 

数据库实用技术实验报告(二)

表中数据的操作和视图的创建和使用

假设T_STUDENT表中的数据如下表所示。

表  T_STUDENT表中的数据

S_NUMBER

S_NAME

SEX

BIRTHDAY

POLITY

B0451101

张小航

1984-12-20

党员

B0451102

王文广

1985-5-16

团员

B0451103

李艳红

1984-6-12

群众

B0451104

张丽霞

1984-7-22

群众

B0451105

王强

1984-11-26

党员

B0451106

张保田

1984-7-5

群众

B0451107

李博文

1984-8-9

团员

B0451108

刘芳芳

1985-4-14

党员

B0451109

李海

1984-2-16

团员

B0451110

常江宁

1984-3-21

群众

1:

(1)    查询表中的所有记录

2)查询前3条记录的S_NUMBERS_NAMEBIRTHDAY字段

(3)查询所有记录的SEX字段,并去掉重复值

(4)查询所有记录的S_NUMBER(别名为学号)、S_NAME(别名为姓名)和BIRTHDAY(别名为出生日期)字段。

(5)查询得到每个学生的年龄

(6)统计男同学的人数

Script

USE Student_Back

GO

SELECT * FROM T_Student

GO

SELECT TOP(3) S_NUMBER,S_NAME,BIRTHDAY FROM T_Student

GO

SELECT DISTINCT SEX FROM [dbo].[T_Student]

GO

SELECT S_NUMBER AS '学号',S_NAME AS '姓名',BIRTHDAY AS '出生日期' FROM [dbo].[T_Student]

GO

SELECT S_NUMBER AS '学号',S_NAME AS '姓名',DATEDIFF(YEAR,BIRTHDAY,GETDATE())AS '年龄' FROM [dbo].[T_Student]

GO

SELECT COUNT(S_NUMBER) AS '男同学人数'  FROM [dbo].[T_Student] WHERE SEX=''

GO

Screenshot

 

2:使用INTO子句创建一个新表(T_STUDENT1)。

Script

USE Student_Back

GO

SELECT S_NAME AS '名字',POLITY AS '政治面貌',GETDATE() AS '注册时间'

INTO [dbo].[T_Student1]

FROM [dbo].[T_Student]

GO

Screenshot

 

3:假设T_SCORE表中的数据如下表所示。

表  T_SCORE表中的数据

S_NUMBER

C_NUMBER

SCORE

B0451101

10010218

82

B0451102

10010218

75

B0451103

10010218

93

B0451104

10010218

81

B0451105

10010218

68

B0451106

10010218

77

B0451107

10010218

52

B0451108

10010218

85

B0451109

10010218

73

B0451110

10010218

87

B0451101

30020215

77

B0451102

30020215

84

B0451103

30020215

56

 

(1)查询表T_SCORE和表T_STUDENT中的数据,满足条件:

T_STUDENT.S_NUMBER=T_SCORE.S_NUMBER

Script

USE Student_Back

GO

SELECT * FROM [dbo].[T_Student],[dbo].[T_Score]

WHERE T_Score.S_NUMBER = T_Student.S_NUMBER

GO

Screenshot

 

(2)    上述查询也可以用以下方法实现:联合查询表T_SCORE和表T_STUDENT中的数据。

Script

USE Student_Back

GO

SELECT * FROM [dbo].[T_Student] INNER JOIN [dbo].[T_Score]

ON T_Score.S_NUMBER = T_Student.S_NUMBER

GO

Screenshot

 

4:从表T_SCORE中查询不及格学生的信息。

Script

USE Student_Back

GO

SELECT [dbo].[T_Student].S_NUMBER AS '学号',S_NAME AS '姓名',SCORE AS '成绩'

FROM [dbo].[T_Student] ,[dbo].[T_Score]

WHERE [dbo].[T_Student].S_NUMBER=[dbo].[T_Score].S_NUMBER AND SCORE<60

GO

Screenshot

 

5:从表T_STUDENT中查询是党员的男学生的信息。

Script

USE Student_Back

GO

SELECT * FROM [dbo].[T_Student]

WHERE SEX = '' AND POLITY = '党员'

GO

Screenshot

 

6:从表T_SCORE中查询成绩在80~90分的学生的信息。

Script

USE Student_Back

GO

SELECT *   FROM [dbo].[T_Student] INNER JOIN [dbo].[T_Score]

ON [dbo].[T_Student].S_NUMBER=[dbo].[T_Score].S_NUMBER

WHERE SCORE  BETWEEN 80 AND 90

GO

Screenshot

 

7:从表T_STUDENT中查询所有非党员的学生信息。

Script

USE Student_Back

GO

SELECT * FROM [dbo].[T_Student]

WHERE  POLITY != '党员'

GO

Screenshot

 

8:从表T_STUDENT中查询所有姓张的学生信息。

Script

USE Student_Back

GO

SELECT * FROM [dbo].[T_Student]

WHERE  S_NAME LIKE '%'

GO

Screenshot

 

9:对表T_STUDENT中的记录按性别进行分组,查询相应的人数。

Script

USE Student_Back

GO

SELECT [SEX],COUNT(SEX) AS QUENTITY  FROM [dbo].[T_Student]

GROUP BY SEX

GO

Screenshot

 

10:在表T_SCORE中求选修了两门及以上课程的学生学号。

Script

USE Student_Back

GO

SELECT S_NUMBER AS '学号',COUNT(S_NUMBER)AS '选课门数' FROM T_Score

GROUP BY S_NUMBER

HAVING COUNT(S_NUMBER)>1

GO

Screenshot

 

11:在表T_SCORE中查询选修了“10010218”课程的学生成绩,并按成绩的降序进行排序。

Script

USE Student_Back

GO

SELECT [dbo].[T_Student].[S_NUMBER],[S_NAME],C_NUMBER,SCORE  FROM [dbo].[T_Student] INNER JOIN [dbo].[T_Score]

ON [dbo].[T_Student].S_NUMBER=[dbo].[T_Score].S_NUMBER

WHERE C_NUMBER ='10010218'

ORDER BY SCORE DESC

GO

Screenshot

 

12:假设表T_STUDENT1中的数据如下表所示。对表T_STUDENT1和表T_STUDENT进行联合查询。

表 T_STUDENT1中的数据

S_NUMBER

S_NAME

SEX

BIRTHDAY

POLITY

0554101

刘洋

1984-10-14

党员

0554102

李志娟

1984-11-12

团员

0554103

赵雪梅

1984-6-25

团员

0554104

王华

1984-9-11

团员

0554105

张金辉

1985-5-16

群众

0554106

贾波

1984-10-3

党员

0554107

周萍

1984-7-12

群众

0554108

马帅

1984-5-22

团员

0554109

唐芸

1985-8-25

群众

0554110

王华

1984-1-20

团员

13:查询选修了两门及以上课程的学生的基本信息。

Script

USE Student_Back

GO

SELECT * FROM T_Student WHERE EXISTS

(SELECT S_NUMBER,COUNT(S_NUMBER)AS '选课门数' FROM T_Score

WHERE T_Student.S_NUMBER= T_Score.S_NUMBER

GROUP BY S_NUMBER

HAVING COUNT(S_NUMBER)>1)

GO

Screenshot

 

14:利用INSERT语句向表T_STUDENT中插入一行数据,只包含S_NUMBER、S_NAME和BIRTHDAY三列。

Script

INSERT INTO [Student_Back].[dbo].[T_Student]

([S_NUMBER],[S_NAME] ,[BIRTHDAY])

VALUES

('B0451110','毛小驴',1992-12-23)

GO

Screenshot

 

15:利用INSERT语句向表T_STUDENT中插入一行数据,所有的字段都要给出相应的值。

Script

INSERT INTO [Student_Back].[dbo].[T_Student]

VALUES ('B0451111','吕大布','',1990-12-23,'党员')

GO

Screenshot

 

16:利用INSERT语句向表T_STUDENT中插入一批数据,数据来源于另一个已有的数据表。

Script

USE Student_Back

GO

INSERT  INTO T_Student([S_NUMBER],[S_NAME],[SEX],[BIRTHDAY],[POLITY])

SELECT [S_NUMBER],[S_NAME],[SEX],[BIRTHDAY],[POLITY] FROM T_Student1

GO

Screenshot

 

17:一个带有WHERE条件的修改语句。

Script

USE Student_Back

GO

UPDATE T_Student SET SEX='' WHERE S_NAME='毛小驴'

GO

Screenshot

 

18:一个简单的修改语句。

Script

USE Student_Back

GO

UPDATE T_Student SET SEX='' WHERE S_NAME='毛小驴'

GO

Screenshot

 

19:一个简单的删除语句。

Script

USE Student_Back

GO

DELETE FROM T_Student1 WHERE S_NAME='毛小驴'

GO

Screenshot

 

20:一个没有WHERE条件的删除语句。

Script

USE Student_Back

GO

DELETE FROM T_Student1

GO

Screenshot

 

21:创建一个视图,要求显示T_STUDENT表中所有姓张的同学,并按性别进行升序排序。

Script

USE Student_Back

GO

CREATE VIEW NAME_Li AS (SELECT * FROM T_Student WHERE S_NAME LIKE '%' )

GO

SELECT * FROM NAME_Li ORDER BY SEX ASC

GO

Screenshot

 

22:使用Transact-SQL语句创建一个新视图,命名为VIEW_SCORE,要求基表的来源为:T_STUDENTT_SCORET_COURSE,选择的字段为:T_STUDENT表中的S_NUMBERS_NAME字段、T_COURSE表中的C_NAME字段及T_SCORE表中的SCORE字段,要求查询的数据为05541班学生的考试成绩。

Script

USE Student_Back

GO

CREATE VIEW VIEW_SCORE AS

SELECT T_Student.S_NUMBER,T_Student.S_NAME,T_Score.SCORE

FROM T_Student,T_Score

WHERE T_Student.S_NUMBER=T_Score.S_NUMBER

GO

SELECT * FROM VIEW_SCORE WHERE S_NUMBER LIKE '%05541%'

GO

Screenshot

 

23:使用Transact-SQL语句创建新视图VIEW_SCORE_NotPass。对数据表和对字段的选择同上,要求只显示各班不及格的学生的学号、姓名、课程名及成绩。并加密视图的定义。

Script

USE Student_Back

GO

CREATE VIEW VIEW_SCORE_NotPass

WITH ENCRYPTION

AS

(SELECT T_Student.S_NUMBER,T_Student.S_NAME,T_Score.SCORE

FROM T_Student,T_Score

WHERE T_Student.S_NUMBER=T_Score.S_NUMBER AND SCORE<60)

GO

SELECT [S_NUMBER],[S_NAME],[SCORE]

FROM [Student_Back].[dbo].[VIEW_SCORE_NotPass]

GO

Screenshot

 

24:使用Transact-SQL语句创建新视图VIEW_SCORE_SumAndAverage。要求计算各个班级各门课程的总分及平均分。

Script

USE Student_Back

GO

CREATE VIEW VIEW_SCORE_SumAndAverage

AS

(SELECT AVG(SCORE) AS 平均成绩

FROM T_Student,T_Score

WHERE T_Student.S_NUMBER=T_Score.S_NUMBER)

GO

SELECT 平均成绩

FROM VIEW_SCORE_SumAndAverage

GO

Screenshot

 

25:使用系统存储过程sp_help显示VIEW_SCORE视图的特征信息。

Script

sp_help VIEW_SCORE

Screenshot

 

26:使用sp_helptext显示VIEW_SCORE视图在系统表中的定义。

Script

sp_helptext VIEW_SCORE

Screenshot

 

27:查看加密视图的定义信息。

Script

sp_help VIEW_SCORE_NotPass

Screenshot

 

28:使用sp_depends显示VIEW_SCORE视图所依赖的对象。

Script

sp_depends VIEW_SCORE

Screenshot

 

29:修改视图VIEW_SCORE_NotPass,在该视图中增加一个新的条件,要求只显示高等数学不及格的学生信息。

Script

USE Student_Back

GO

ALTER VIEW VIEW_SCORE_NotPass

AS

(SELECT T_Student.S_NUMBER,T_Student.S_NAME,T_Score.SCORE,T_Student.SEX

FROM T_Student,T_Score

WHERE T_Student.S_NUMBER=T_Score.S_NUMBER AND SCORE<60)

GO

SELECT [S_NUMBER],[S_NAME],[SCORE],[SEX]

FROM [Student_Back].[dbo].[VIEW_SCORE_NotPass]

GO

Screenshot

 

30:使用系统存储过程sp_rename来完成把视图“VIEW_SCORE_NotPass”重命名为“VIEW_SCORE_NotPass_高等数学”。

Script

sp_rename VIEW_SCORE_NotPass,VIEW_SCORE_NotPass_高数

Screenshot

 

31:创建一个基于表T_STUDENT的新视图VIEW_STUDENT_05541,要求包含05541班的学生记录。

Script

USE Student_Back

GO

CREATE VIEW VIEW_Student_05541

AS

(SELECT *

FROM T_Student

WHERE S_NUMBER LIKE '5541%')

GO

SELECT *

FROM VIEW_Student_05541

GO

Screenshot

 

32:首先创建一个包含限制条件的视图VIEW_STUDENT_05541_男,限制条件为显示05541班的男同学信息,然后插入了一条不满足限制条件的记录,再用SELECT语句检索视图和表。

Script

USE Student_Back

GO

CREATE VIEW VIEW_Student_05541_

AS

(SELECT *

FROM T_Student

WHERE S_NUMBER LIKE '5541%' AND SEX='' )

WITH CHECK OPTION

GO

SELECT *

FROM VIEW_Student_05541_

GO

INSERT INTO VIEW_Student_05541_ VALUES('554119','BOS','','1984-10-14','党员')

Screenshot

 

33:在上例的基础上添加WITH CHECK OPTION选项。

Script

32

Screenshot

 

 

34:创建一个基于表T_STUDENT的视图VIEW_STUDENT_05541_Modify,条件是显示05541班的学生的学号、姓名和性别,然后通过该视图修改表T_STUDENT中的记录。

Script

USE Student_Back

GO

CREATE VIEW VIEW_Student_05541_Modify

AS

(SELECT T_Student.S_NUMBER, T_Student.S_NAME,T_Student.SEX

FROM T_Student

WHERE S_NUMBER LIKE '5541%' )

GO

Update VIEW_Student_05541_Modify SET S_NAME='Liu' WHERE S_NAME='刘洋'

GO

SELECT *

FROM VIEW_Student_05541_Modify

GO

Screenshot

 

35:利用视图VIEW_STUDENT_05541,先插入一条记录,然后删除此条记录。

Script

USE Student_Back

GO

CREATE VIEW VIEW_Student_05541_Modify

AS

(SELECT T_Student.S_NUMBER, T_Student.S_NAME,T_Student.SEX

FROM T_Student

WHERE S_NUMBER LIKE '5541%' )

GO

 

INSERT VIEW_Student_05541_Modify VALUES('554111','Bottec','') 

SELECT *

FROM VIEW_Student_05541_Modify

GO

 

DELETE FROM VIEW_Student_05541_Modify WHERE S_NUMBER='554111'

Screenshot

 

36:删除视图VIEW_STUDENT_05541_Modify和视图VIEW_STUDENT_05541_男。

Script

USE Student_Back

GO

DROP VIEW VIEW_Student_05541_Modify

GO

DROP VIEW VIEW_Student_05541_

GO

Screenshot

 

数据库实用技术实验报告(三)

Transact-SQL程序设计

1:创建了一个变量@CurrentDateTime,然后将GETDATE()函数的值放在变量中,最后输出@CurrentDateTime变量的值。

Script

DECLARE @Current DateTime

SET @Current = GETDATE()

SELECT @Current

Screenshot

 

2:查询T_STUDENT表,将返回的记录数赋给变量@RowsReturn。

Script

DECLARE @RowsReturn INT

SET @RowsReturn =( SELECT  COUNT(S_NUMBER) FROM T_Student)

SELECT @RowsReturn AS '记录总数'

Screenshot

 

3:在SELECT语句中使用由SET赋值的变量。

Script

DECLARE @name char(20)

SET @name =(SELECT S_NAME FROM T_Student WHERE S_NUMBER = '554101')

SELECT @name

GO

Screenshot

 

4:在T_SCORE表中,求05541班学生高等数学课程的最高分和最低分的学生信息,包括学号、姓名、课程名、成绩四个字段。

Script

USE Student_Back

GO

DECLARE @ScoreMax FLOAT,@ScoreMin FLOAT

SELECT @ScoreMax = MAX(SCORE) FROM T_Score

SELECT @ScoreMin = MIN(SCORE) FROM T_Score

SELECT T_Student.S_NUMBER AS '学号',S_NAME AS '姓名',T_Course.CourseName AS '课程名',Score '成绩'

FROM T_Student,T_Score,T_Course

WHERE T_Student.S_NUMBER = T_Score.S_NUMBER AND T_Course.C_NUMBER = T_Score.C_NUMBER

AND  Score=@ScoreMax

SELECT T_Student.S_NUMBER AS '学号',S_NAME AS '姓名',T_Course.CourseName AS '课程名',Score '成绩'

FROM T_Student,T_Score,T_Course

WHERE T_Student.S_NUMBER = T_Score.S_NUMBER AND T_Course.C_NUMBER = T_Score.C_NUMBER

AND  Score=@ScoreMin

Screenshot

5:计算表达式的值,并将结果赋给变量@ExpResult。

Script

DECLARE @ExpResult FLOAT,@x INT,@y INT

SET @x=4;

SET @y=5;

SET @ExpResult=@x * @y

PRINT '结果'

PRINT @ExpResult

Screenshot

6:查询05541班的学生信息,要求列出的字段为:班级、本班内的学号、姓名、性别、出生日期、政治面貌。

Script

USE Student_Back

GO

SELECT SUBSTRING([S_NUMBER],1,4) AS '班级'

      ,RIGHT([S_NUMBER],2) AS '班内学号'

      ,[S_NAME]

      ,[SEX]

      ,[BIRTHDAY]

      ,[POLITY]

  FROM [Student_Back].[dbo].[T_Student]

  WHERE S_NUMBER LIKE '5541%'

GO

Screenshot

7:使用比较运算符计算表达式的值。

Script

USE Student_Back

GO

SELECT [S_NUMBER]

      ,[S_NAME]

      ,[SEX]

      ,[BIRTHDAY]

      ,[POLITY]

  FROM [Student_Back].[dbo].[T_Student]

  WHERE BIRTHDAY >= '1985-01-01 00:00:00.000'

Screenshot

8:使用比较运算符计算表达式的值。

Script

USE Student_Back

GO

SELECT [S_NUMBER]

      ,[S_NAME]

      ,[SEX]

      ,[BIRTHDAY]

      ,[POLITY]

  FROM [Student_Back].[dbo].[T_Student]

  WHERE BIRTHDAY >=

  (SELECT BIRTHDAY FROM [Student_Back].[dbo].[T_Student] WHERE S_NAME = '王文广')

Screenshot

9:使用字符串连接运算符计算表达式的值。

Script

USE Student_Back

GO

SELECT '编号:'+[S_NUMBER]+'   姓名:'+[S_NAME] AS '新列'

      ,[SEX]

      ,[BIRTHDAY]

      ,[POLITY]

  FROM [Student_Back].[dbo].[T_Student]

  WHERE BIRTHDAY >=

  (SELECT BIRTHDAY FROM [Student_Back].[dbo].[T_Student] WHERE S_NAME = '王文广')

Screenshot

10:使用括号改变表达式的计算顺序。

Script

DECLARE @X INT,@Y INT

DECLARE @Z INT

SET @X=3

SET @Y=30

SET @Z=@X

PRINT ('Y='+CAST(@Y AS VARCHAR))

IF (@X*(@Y+@Z)>1)

    PRINT ('结果为:'+CAST((@X*(@Y+@Z)) AS VARCHAR))

Screenshot

11:从STUDENT数据库中返回T_STUDENT表的第4列的名称。

Script

sp_help T_Student

Screenshot

 

12:从STUDENT数据库中返回T_STUDENT表的S_NUMBER列的长度。

Script

sp_help T_Student

Screenshot

 

13:检查sysdatabases中的每一个数据库,使用数据库标识号来确定数据库名称。

Script

USE master

SELECT dbid, DB_NAME(dbid)  AS  DB_NAME

FROM sysdatabases

ORDER BY dbid

Screenshot

14:在T_STUDENT表中先插入三条新记录,其中的POLITY字段的值为NULL,要求对记录进行查询时,对应的NULL值在显示时显示“群众”。

Script

INSERT INTO T_Student values

  ('872391','吴中天','',GETDATE(),NULL)

  INSERT INTO T_Student values

  ('872392','屈大器','',GETDATE(),NULL)

  INSERT INTO T_Student values

  ('872391','叶则','',GETDATE(),NULL)

SELECT [S_NUMBER]

      ,[S_NAME]

      ,[SEX]

      ,[BIRTHDAY]

      ,'群众' AS POLITY

  FROM [Student_Back].[dbo].[T_Student]

  WHERE POLITY IS NULL

Screenshot

15:利用@@ERROR返回程序的错误代码。

Script

print @@ERROR

Screenshot

0

16:显示到当前日期和时间为止试图登录SQL Server的次数。

Script

 

Screenshot

 

17:返回在程序执行过程中上一条SQL语句影响的记录数。

Script

print @@ROWCOUNT

Screenshot

18:返回SQL Server安装的日期、版本和处理器类型。

Script

print @@VERSION

Screenshot

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)

    Mar 29 2009 10:11:52

    Copyright (c) 1988-2008 Microsoft Corporation

    Express Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)

 

 

19:使用RTRIM函数删除字符型字段中的尾部空格。

Script

DECLARE @S VARCHAR(20)

SET @S='BABSDDD   '

SELECT RTRIM(@S)

Screenshot

20:使用SUBSTRING函数、LEFT函数和RIGHT函数求T_STUDENT中的班级名称和学号。

Script

SELECT SUBSTRING(S_NUMBER,1,6) AS 班级,RIGHT(S_NUMBER,2)AS 学号,S_NAME

FROM T_STUDENT

Screenshot

21:在第一个字符串(Good Morning)中删除从第6个位置(字符M)开始的7个字符,然后在删除的起始位置插入第二个字符串(Afternoon),创建并返回一个新的字符串。

Script

DECLARE @S1 VARCHAR(20)

DECLARE @S2 VARCHAR(20)

SET @S1='Good Morning'

SET @S2='Afternoon'

PRINT STUFF(@S1,6,7,@S2)

PRINT '@S1:'+@S1

PRINT '@S2:'+@S2

Screenshot

Good Afternoon

@S1:Good Morning

@S2:Afternoon

22:查询T_STUDENT表的学生信息,要求显示的字段为:学号、姓名、性别和学生的年龄。

Script

SELECT TOP 1000 [S_NUMBER]

      ,[S_NAME]

      ,[SEX]

      ,CAST(BIRTHDAY AS DATE) AS 生日

      ,DATEDIFF(year,BIRTHDAY,GETDATE()) AS  'Age'

  FROM [Student_Back].[dbo].[T_Student]

Screenshot

23:在T_STUDENT表中查询每个学生的出生月份。

Script

SELECT [S_NUMBER]

      ,[S_NAME]

      ,[SEX]

      ,CAST(BIRTHDAY AS DATE) AS 生日

      ,MONTH(BIRTHDAY) AS '生日月份'

  FROM [Student_Back].[dbo].[T_Student]

Screenshot

24:从系统当前日期中返回系统当前的年份数、月份数和天数。

Script

PRINT 'YEAR:'+CAST(YEAR(GETDATE()) AS VARCHAR(20))

PRINT 'MONTH:'+CAST(MONTH(GETDATE()) AS VARCHAR(20))

PRINT 'DAY:'+CAST(DAY(GETDATE()) AS VARCHAR(20))

Screenshot

YEAR:2014

MONTH:11

DAY:7

25:在同一表达式中使用CEILING(),FLOOR(),ROUND()函数。

Script

SELECT CEILING($123.45), CEILING($-123.45), CEILING($0.0)

GO

SELECT FLOOR($123.45), FLOOR($-123.45), FLOOR($0.0)

GOSELECT ROUND(123.4545, 2);

GO

SELECT ROUND(123.45, -2);

GO

Screenshot

26:查询T_STUDENT表中出生年份为1985年的学生信息。

Script

SELECT TOP 1000 [S_NUMBER]

      ,[S_NAME]

      ,[SEX]

      ,[BIRTHDAY]

      ,[POLITY]

  FROM [Student_Back].[dbo].[T_Student]

  WHERE YEAR(BIRTHDAY)=1985

Screenshot

 

27:编写一个用户自定义函数fun_SumScores,要求根据输入的班级号和课程号,求此班此门课程的总分。

Script

USE Student_Back

GO

CREATE FUNCTION fun_SumScores(@Class_id varchar(10),@Course_id float)

RETURNS float

AS BEGIN

DECLARE @sum_score float

SELECT @sum_score=SUM(SCORE) FROM T_Score

WHERE S_NUMBER LIKE @Class_id+'%' AND C_NUMBER = @Course_id

RETURN @sum_score

END

GO

SELECT [dbo].[fun_SumScores]('B04511',10010218)

GO

Screenshot

28:使用自定义函数fun_SumScores,求T_SCORE表中的各个班级的各门课程的总分。

Script

PRINT [dbo].[fun_SumScores]('B04511',10010218)

PRINT [dbo].[fun_SumScores]('B04511',30020215)

Screenshot

773

217

29:根据T_SCORE表中的考试成绩,查询05541班学生高等数学的平均成绩,并根据平均成绩输出相应的提示信息。

Script

USE Student_Back

GO

DECLARE @c_id float

SELECT @c_id=C_NUMBER FROM T_Course

WHERE CourseName='高等数学'

SELECT AVG(SCORE) AS '平均成绩'

FROM T_Score

WHERE C_NUMBER=@c_id AND S_NUMBER LIKE '%04511%'

GO

Screenshot

30:查询05541班学生的考试情况,并使用CASE语句将课程号替换为课程名进行显示。

Script

DECLARE @c float

DECLARE @S VARCHAR(20)

SET @c=10010218

SELECT @S=

    CASE @c

    WHEN 10010218 THEN '高等数学'

    WHEN 10010215 THEN '大学英语'

    WHEN 10010219 THEN '大学物理'

    END

SELECT @S AS '结果'

Screenshot

31:查询05541班学生的考试情况,并根据考试分数输出考试等级,当分数大于等于90分,输出“优”,当分数在80至90之间,输出“良”,当分数在70至80之间,输出“中”,当分数在60至70之间,输出“及格”,当分数在60分以下,输出“不及格”。

Script

USE Student_Back

GO

-------------------------判断等级的函数---------------------

CREATE FUNCTION GradeRank(@g float)

RETURNS VARCHAR(8)

AS BEGIN

DECLARE @r VARCHAR(8)

SET @r=

    CASE

    WHEN @g>=90 THEN ''

    WHEN @g>=80 THEN ''

    WHEN @g>=70 THEN ''

    WHEN @g>=60 THEN '及格'

    ELSE '不及格'

    END

RETURN @r

END

GO

-------------使用游标逐行取出成绩做判断并输出等级-----------------------

DECLARE CUR SCROLL CURSOR

FOR

SELECT S_NUMBER,Score FROM T_Score

OPEN CUR

DECLARE @num VARCHAR(10)

DECLARE @tmp float

BEGIN

FETCH NEXT FROM CUR INTO @num,@tmp

WHILE @@FETCH_STATUS=0

BEGIN

    SELECT @num AS '学号',S_NAME AS '姓名',@tmp AS '成绩',[dbo].[GradeRank](@tmp) AS '等级'

    FROM T_Student,T_Score WHERE T_Student.S_NUMBER=T_Score.S_NUMBER AND T_Student.S_NUMBER=@num AND C_NUMBER=10010218

    FETCH NEXT FROM CUR INTO @num,@tmp

END

END

CLOSE CUR

DEALLOCATE CUR

GO

Screenshot

32:使用WHILE…CONTINUE…BREAK语句求5的阶乘。

Script

DECLARE @A float

DECLARE @i int

SET @i=1

SET @A=1

WHILE @i<5

BEGIN

    SET @A=@A*(@i+1)

    SET @i=@i+1

    IF  @A>20

    BEGIN

       PRINT @A;CONTINUE;

    END

END

Screenshot

24

120

33:在程序中使用WAITFOR语句,使WAITFOR后面的语句等待10秒钟后再继续执行。

Script

DECLARE @i int

SET @i=1

WHILE @i<30

BEGIN

    PRINT @i

    PRINT CAST(GETDATE() AS datetime2)

    WAITFOR DELAY '00:00:00.010'

    SET @i=@i+1

END

Screenshot

1

2014-11-07 20:56:02.5470000

2

2014-11-07 20:56:02.5570000

3

2014-11-07 20:56:02.5670000

4

2014-11-07 20:56:02.5770000

5

2014-11-07 20:56:02.5870000

6

2014-11-07 20:56:02.5970000

7

2014-11-07 20:56:02.6070000

8

2014-11-07 20:56:02.6170000

9

2014-11-07 20:56:02.6270000

10

2014-11-07 20:56:02.6370000

11

2014-11-07 20:56:02.6470000

12

2014-11-07 20:56:02.6570000

13

2014-11-07 20:56:02.6670000

14

2014-11-07 20:56:02.6770000

15

2014-11-07 20:56:02.6870000

16

2014-11-07 20:56:02.6970000

17

2014-11-07 20:56:02.7070000

18

2014-11-07 20:56:02.7170000

19

2014-11-07 20:56:02.7270000

20

2014-11-07 20:56:02.7370000

21

2014-11-07 20:56:02.7470000

22

2014-11-07 20:56:02.7570000

23

2014-11-07 20:56:02.7670000

24

2014-11-07 20:56:02.7770000

25

2014-11-07 20:56:02.7870000

26

2014-11-07 20:56:02.7970000

27

2014-11-07 20:56:02.8070000

28

2014-11-07 20:56:02.8170000

29

2014-11-07 20:56:02.8270000

34:编写一个自定义函数,功能是查询给定姓名的学生,如果没有找到则返回0,否则返回满足此条件的学生人数,主程序调用这个函数,查询姓名为“王华”的学生,并根据函数的返回值进行输出。

Script

USE Student_Back

GO

CREATE FUNCTION Query(@s varchar(10))

RETURNS int

AS BEGIN

DECLARE @i int

SELECT @i=COUNT(S_NUMBER) FROM T_Student WHERE S_NAME=@s

RETURN @i

END

GO

PRINT '姓名为王华的人数:'+  CONVERT(CHAR,[dbo].[Query]('王华'))

GO

Screenshot

数据库实用技术实验报告(四)

存储过程的创建和使用

1:创建一个名称为“StuInfo”的存储过程,要求完成以下功能:在T_STUDENT表中查询05541班学生的学号、姓名、性别、出生日期和政治面貌五个字段的内容。

Script

CREATE PROCEDURE StuInfo

AS

BEGIN

SELECT [S_NUMBER],[S_NAME],[SEX],[BIRTHDAY],[POLITY] FROM T_Student WHERE S_NUMBER LIKE '5541%'

END

GO

EXEC StuInfo

GO

Screenshot

 

2:创建一个存储过程StuScoreInfo,完成的功能是在表T_STUDENT、表T_COURSE和表t_SCORE中查询以下字段:班级、学号、姓名、性别、课程名称、考试分数。

Script

USE Student_Back

GO

CREATE PROCEDURE StuScoreInfo  

AS

BEGIN

    SELECT substring(T_Student.S_NUMBER,1,5) as 班级,T_Student.S_NUMBER,S_NAME,SEX,CourseName,SCORE

    FROM [T_Student],[T_Course],[T_Score]

    WHERE T_Student.S_NUMBER=T_Score.S_NUMBER and T_Course.C_NUMBER=T_Score.C_NUMBER

END

GO

exec StuScoreInfo

Screenshot

 

3:创建一个带有参数的存储过程Stu_Info,该存储过程根据传入的学生编号,在T_STUDENT中查询此学生的信息。

Script

USE Student_Back

GO

CREATE PROCEDURE StuInfo

@num  nvarchar(100)

AS

BEGIN

    SELECT * FROM [Student_Back].[dbo].[T_Student] where S_NUMBER=@num

END

GO

exec StuInfo'B0451101'

GO

Screenshot

 

4:创建一个带有参数的存储过程Stu_Age,该存储过程根据传入的学生编号,在T_STUDENT中计算此学生的年龄,并根据程序的执行结果返回不同的值,程序执行成功,返回整数0,如果执行出错,则返回错误号

Script

USE Student_Back

GO

CREATE PROCEDURE Stu_Age

@num  nvarchar(100)

AS

BEGIN

    SELECT S_NUMBER,datediff(year,BIRTHDAY,getdate()) as 年龄

    FROM [Student_Back].[dbo].[T_Student] where S_NUMBER=@num

    if (@@error!=0)

       return 0;

    else

       return @@error;

END

Screenshot

 

5:行前面创建的StuInfo存储过程,它是一个无参的存储过程。

Script

create PROCEDURE [dbo].[StuInfo3] 

AS

BEGIN

    SELECT * FROM [T_Student]

END

exec [dbo].[StuInfo3]

Screenshot

 

6:存储过程StuScoreInfo。

Script

exec StuScoreInfo

Screenshot

 

7:执行存储过程Stu_Info,该存储过程有一个输入参数“学号”,在执行时需要传入一个学号值。

Script

exec StuInfo'B0451101'

GO

Screenshot

 

8:执行存储过程Stu_Age,该存储过程有一个输入参数“学号”,另外,还有一个输出参数@Age。存储过程执行完后,有一个返回的状态值,这个值可以从变量@ErrorValue得到。

Script

USE Student_Back

GO

alter PROCEDURE Stu_Age 

@num  nvarchar(100),

@age int out

AS

BEGIN

    SELECT S_NUMBER,datediff(year,BIRTHDAY,getdate()) as 年龄

    FROM [Student_Back].[dbo].[T_Student] where S_NUMBER=@num

    SELECT @age=datediff(year,BIRTHDAY,getdate())

    FROM [Student_Back].[dbo].[T_Student] where S_NUMBER=@num

    if (@@error!=0)

       return 0;

    else

       return @@error;

END

GO

DECLARE @age int

exec Stu_Age'B0451101',@age out;

SELECT @age as GetAge;

GO

Screenshot

 

9:使用系统存储过程查看Stu_Age存储过程的参数及其数据类型。

Script

exec sp_helpStu_Age

Screenshot

 

10:使用系统存储过程查看StuScoreInfo存储过程的相关的数据库对象

Script

exec sp_dependsStuScoreInfo

Screenshot

 

11:修改前面创建的Stu_Info存储过程,使之完成以下功能:根据传入的学号,在表T_STUDENT、表T_COURSE和表t_SCORE中查询此学生的班级、学号、姓名、性别、考试课程名称和考试分数。

Script

ALTER PROCEDURE [StuInfo]  

@num  nvarchar(100)

AS

BEGIN

    SELECT substring(T_Student.S_NUMBER,1,5) as 班级,T_Student.S_NUMBER,S_NAME,SEX,CourseName,SCORE

    FROM [T_Student],[T_Course],[T_Score]

    WHERE T_Student.S_NUMBER=T_Score.S_NUMBER and T_Course.C_NUMBER=T_Score.C_NUMBER and T_Student.S_NUMBER=@num

END

GO

EXEC StuInfo'B0451101'

GO

Screenshot

 

12:使用系统存储过程将Stu_Info存储过程的名称修改为Stu_Info_SCORE

Script

exec sp_rename'StuInfo','Stu_Score_Info'

Screenshot

 

13:使用DROP命令删除StuInfo和StuScoreInfo两个存储过程。

Script

drop proc Stu_Score_Info

drop proc StuScoreInfo1

Screenshot

 

数据库实用技术实验报告(五)

触发器的创建和使用

1:创建一个INSERT触发器“TR_Stu_Insert”,当在T_STUDENT表中插入一条新记录时,触发该触发器,并给出“你插入了一条新记录!”的提示信息。

Script

USE Student_Back

GO

CREATE TRIGGER TR_Stu_Insert

   ON T_STUDENT

   AFTER insert

AS

BEGIN

print '您插入了一条新纪录!'

END

GO

insert into T_Student values ('B0451200','Hec',  '',GETDATE(),'党员')

Screenshot

 

2:创建了Stu_Insert触发器后,查看向T_STUDENT表中插入数据时,此触发器所完成的功能。

Script

insert into T_Student values ('B0451200','Hec',  '',GETDATE(),'党员')

Screenshot

 

3:创建一个AFTER触发器,要求实现以下功能:在T_SCORE表上创建一个插入、更新类型的触发器TR_ScoreCheck,当在SCORE字段中插入或修改考试分数后,触发该触发器,检查分数是否在0-100之间。

Script

USE Student_Back

GO

create TRIGGER TR_ScoreCheck

   ON T_SCORE

   for update,insert

AS

BEGIN

    declare @score int;

    if UPDATE(Score)

    begin

    select @score=(select Score from inserted)

    if (@score not between 0 and 100)

    print('输入分数应在-100之间,请重新输入!');

    rollback;

    end

END

GO

insert into T_SCORE values ('B0451101','10010218',103)

Screenshot

 

4:创建一个AFTER触发器,要求如下:在T_STUDENT表上创建一个删除类型的触发器TR_Stu_Delete,当在T_STUDENT表中删除某一条记录后,触发该触发器,在T_SCORE表中删除与此学号对应的记录。

Script

USE Student_Back

GO

create TRIGGER TR_Stu_Delete

   ON T_STUDENT

   for delete

AS

BEGIN

    declare @num nvarchar(100);

    select @num =(select s_number from deleted)

    delete from T_Score where S_NUMBER=@num;

END

GO

delete from  T_Student  where S_NUMBER='B0451101';

Screenshot

 

5:创建一个INSTEAD OF触发器,要求实现以下功能:在T_COURSE表上创建一个删除类型的触发器TR_NotAllowDelete,当在T_COURSE表中删除记录时,触发该触发器,显示不允许删除表中数据的提示信息。

Script

USE Student_Back

GO

create TRIGGER TR_NotAllowDelete

   ON T_COURSE

   for delete

AS

BEGIN

    print '不允许删除该表信息';

    rollback;

END

GO

delete from  T_COURSE  where C_NUMBER='10010218';

Screenshot

 

6:使用系统存储过程查看TR_Stu_Insert触发器的一般信息。

Script

exec sp_help  TR_Stu_Insert

Screenshot

 

7:使用系统存储过程查看T_STUDENT表涉及到的所有触发器。

Script

select * from dbo.sysobjects

where OBJECTPROPERTY(id,N'IStrigger') =1

Screenshot

 

8:使用系统命令删除TR_Stu_Insert触发器。

Script

drop trigger  TR_Stu_Insert

Screenshot

 

SQL Server的安全性管理

1:创建一个 SQL Server 登录帐户USER1,密码为Abc123#$。

2:删除SQL Server帐户USER1。

3:在STUDENT数据库中为SQL Server登录帐户USER1添加数据库用户,并取名为USER1,默认架构为STU。

4:从STUDENT数据库中删除数据库用户USER1。

5:为STUDENT数据库新创建一个数据库用户USER2,并为其赋予查询T_COURSE表的权限。

6:将对数据库STUDENT中T_SCORE表的SELECT权限授予数据库用户USER2。

7:拒绝USER2对T_COURSE表中的C_NUMBER列的SELECT权限。

8:收回USER2对T_SCORE表的SELECT权限。

9:将在STUDENT数据库中创建数据表的权限授予用户USER2。

 

 

Script

 

Screenshot

 

 

你可能感兴趣的:(DateBase)