0
点赞
收藏
分享

微信扫一扫

SQL Server数据库应用与开发操作题小编自己整理的哦

女侠展昭 2022-03-30 阅读 128
sql

1.利用Transact-SQL 语句创建数据库

(1)CREATE DATABASE语句的基本格式

CREATE DATABASE database_name

--设置数据库名称

[ON [PRIMARY]

[<filespec>[,...n]

--设置数据文件

[,<filegroup>[,...n]]

--设置文件组

[LOG ON{<filespec>[,...n]}]

--设置日志文件

[COLLATE collation_name]

--设置排序规则名称

[WITH <external_access_option>]

--设置外部访问

][;]

【例3.1】创建数据库student,并指定数据库的数据文件所在位置、初始容量、最大

容量和文件增长量。

CREATE DATABASE student ON

NAME='student',

FILENAME = 'D:\sqlprogram|student.mdf',

SIZE=5MB,

MAXSIZE=10MB,

FILEGROWTH=5%)

GO

【例3.2】创建数据库teaching,并指定数据库的数据文件和日志文件的所在位置、初

始容量、最大容量和文件增长量。

CREATE DATABASE teaching

ON PRIMARY

(NAME = 'teaching',

FILENAME = 'D:\sqlprogram|teaching.mdf',

SIZE=6MB,

MAXSIZE=30MB,

FILEGROWTH=1MB)

LOG ON

( NAME = 'teaching_log',

FILENAME = 'D:\sqlprogram|teaching_log.Idf',

SIZE=2MB,

MAXSIZE=10 MB,

FILEGROWTH=10%)

COLLATE Chinese_PRC_CI_AS

GO

【例3.3】为student数据库增加一个日志文件。

ALTER DATABASE student

--删除规则

DROP RULE rule_grade

go

--创建默认值

CREATE DEFAULT df_type

AS'必修'

--绑定默认值

EXEC sp_bindefault 'df_type','course.type'

--解除绑定

EXEC sp_unbindefault 'course.type'

--shanchu

DROP DEFAULT df_type

【例4.14】为数据库teaching 中的班级表 class的列 classno 创建 PRIMARY KEY 约束,

并将其中的classname、department、monitor的“允许空”修改为NOT NULL.

【例4.15】为数据库teaching中的成绩表score的两个列daily和final 添加CHECK约束,

限定其值在0~100范围内。

【例4.16】为数据库 teaching 中的学生表 student的列Email 创建一个UNIQUE约束

【例4.17】为数据库 teaching 中表 score 的列 studentno 创建一个 FOREIGN KEY约束。

【例4.18】利用命令删除数据库teaching 中表score的一个约束CK_daily.

ALTER TABLE score

DROP CONSTRAINT CK_daily

【例4.19】为数据库 teaching创建一条规则score_rule,该规则规定凡是分数类的列值

必须在0~100之间。

CREATE RULE score_rule

AS

@score BETWEEN 0 and 100

GO

第五章。

【例5.1】声明一个@myvar 变量,然后将一个字符串值放在变量中,再输出@myvar 变

量的值。

ADD LOG FILE

(NAME=stud_log,

FILENAME='D:\sqlprogram|stud_log.LDF',

SIZE=2 MB,

MAXSIZE=6 MB,

FILEGROWTH=1MB

GO

【例3.4】修改 student数据库的排序规则。

ALTER DATABASE student

COLLATE Chinese_PRC_CI_AS_KS

【例3.5】给 student数据库添加文件组 studentfgrp,再添加数据文件 studentfile.ndf

到文件组 studentfgrp中。

ALTER DATABASE student

ADD FILEGROUP studentfgrp

GO

ALTER DATABASE student

ADD FILE

(NAME='studentfile',

FILENAME = 'D:\sqlprogram|studentfile.ndf' )

TO FILEGROUP studentfgrp

GO

【例3.6】将名为student数据库改名为STUDENTDB.

ALTER DATABASE student

MODIFY NAME=STUDENTDB

2.利用T-SQL语句创建数据表

CREATE TABLE dbo.teacher(

teacherno nchar(6) NOT NULL,

tname nchar(8) NULL,

major nchar(10) NULL,

prof nchar(10) NOT NULL,

department nchar(12) NULL,

CONSTRAINT PK_teacher PRIMARY KEY CLUSTERED(teacherno ASC)

【例4.6】在test01数据库中创建一个新表student1,然后修改其列属性。

CREATE TABLE student1 (column_grade

int)--创建新表

EXEC sp_help student1

--查看表的信息

ALTER TABLE student1

ADD column_class VARCHAR(20) NULL

--添加列

EXEC sp_help student1ALTER TABLE student1

DROP COLUMN column_grade

--删除列

EXEC sp_help student1

GO

【例4.8】向 teaching 数据库中的score表中添加数据。

INSERT INTO score (daily,courseno,final,studentno)

VALUES (79, 'c05109',91,'18137221508' )

INSERT INTO score

VALUES('17126113307','c05127',93,78)

【例4.9】更改 teaching 数据库中的score表中的学号为17126113307、课程号为c05127

的期末成绩修改为87.

UPDATE score

SET final=87

WHERE studentno='17124113307' AND courseno='c05127'

【例4.10】为数据库test01中表student1输入3行数据,然后将列st_class的值全部改

为jsj1812.

INSERT INTO student1 VALUES('jixie1709')

INSERT INTO student1 VALUES('huag1802')

INSERT INTO student1 VALUES('txun1812')

GO

UPDATE

student1

SET st_class='jsj1812'

GO

【例4.11】删除数据库 test01中表 student1的列st_class的值为jsj1012的行。

DELETE FROM student1

WHERE st_class='jsj1812'

--创建主键约束

ALTER TABLE score

ADD CONSTRAINT PK_score PRIMARY KEY(studentno,courseno)

--外键约束

ALTER TABLE score

ADD CONSTRAINT FK_score_course FOREIGN KEY (courseno) REFERENCES course(courseno)

delete from score

--唯一性约束

ALTER TABLE course

ADD CONSTRAINT UN_cname UNIQUE(cname)

--check约束

ALTER TABLE score

ADD CONSTRAINT CK_final CHECK(final>=0 AND final<=100)

--约束的删除

ALTER TABLE score

DROP CONSTRAINT CK_final

GO

--创建规则

CREATE RULE rule_grade

AS@grade>=0 AND@grade<=100

--规则的绑定

EXEC sp_bindrule 'rule_grade','score.daily'

--解除绑定

EXEC sp_unbindrule 'score.daily'

CONVERT (data_type[(length)],expression[,style])

【例5.11】在Transact-SQL中使用IF语句。

DECLARE@point AS int

Set@point=87

IF@point>=60

PRINT ' pass , very good!

ELSE

PRINT' no pass ,try again!'

1.游标的概念

关系数据库的大部分管理操作都与Transact-SQL中的查询语句SELECT有着密切的联系。

SELECT语句一般返回的是包含多条记录的、存放在客户机内存中的结果集。

使用 DECLARE CURSOR声明游标

使用 OPEN打开游标

使用 FETCH INTO提取数据

使用 CLOSE关闭游标

使用DEALLOCATE释放游标

游标的使用过程

DECLARE cursor_name CURSOR

FOR select_statement

OPEN cEmploy

使用 FETCH 获取记录信息

FETCH[[NEXT|PRIOR|FIRST|LAST|

ABSOLUTE{n|@nvar| RELATIVE{n|@nvar}]

FROM ] cursor_name [INTO@variable_name[,...n]]

FETCH函数的参数表

参数

NEXT

移至下一行

PRIOR

移至上一行

FIRSTA

移至第一行。

LAST

移至末行。

ABSOLUTE n

位移到第n行

RELATIVE n

从当前位置移n行

INTO @variable_namer

把当前行的各字段值赋给变量

CLOSE cEmploy

DEALLOCATE cEmploy

。利用 CREATE INDEX 命令创建索引

【例8.1】在 teaching 数据库中的 student 表的Email列上创建唯一索引 IDX_Email.

CREATE UNIQUE INDEX IDX_Email ON student(Email)

INSERT INTO student(studentno,sname,sex,birthdate,classno,Email)

VALUES('18125121105','梁欣','女','1999-6-3',

【例8.19】使用ALTER VIEW 语句修改 V_final 视图,使其包含所有学生姓名、课程名

和期末成绩,按姓名升序排序。

ALTER VIEW V_final

AS

SELECT TOP(100) PERCENT student.sname,cname,final

FROM student,course,score

WHERE student.studentno = score.studentno

AND course.courseno = score.courseno

ORDER BY student.sname

【例8.20】使用 ALTER VIEW 语句修改View_avg视图,将其改为加密方式,以确保视图

的安全性

SELECT TOP (100) PERCENT student.sname,AVG(score.final) AS average

FROM score INNER JOIN student

ON score.studentno = student.studentno

WHERE student.classno = '180501' AND score.final IS NOT NULL

GROUP BY student.sname

HAVING AVG(score.final)>60

ORDER BY average DESC

--使用系统存储过程 sp_helptext查看已加密视图的定义信息,执行如下程序:

EXEC sp_helptext View_avg

3.视图重命名

例如使用存储过程将数据库teaching中的视图V_成绩重命名为V_final.

EXEC sp_rename 'V_成绩','V_final1'

使用Transact-SQL删除视图

使用DROP VIEW 语句可从当前数据库中删除一个或多个视图。

例如使用Transact-SQL 语句删除teaching 数据库中V_max视图的命令如下:

DROP VIEW V_max

1.通过视图向基表中插入数据

【例8.21】通过视图V_course 向基表 course 中插入数据('c05129','数据库编程,'必

修,64,4).

分析:该程序通过单表生成的视图V_course 向基表 course 中插入一条记录,并

通过查询语句显示基表中的所有数据。

INSERT INTO V_course

VALUES('c05129','数据库编程',必修',64,16,5)

GO

SELECT*FROM cours

2.通过视图更新基表中的数据

【例8.26】通过视图V_final 将基表 student 和 score 中学号为18125121107,选修的

课程号为c05129的学生姓名修改为李静,期末成绩修改为60分。

例10.4】定义事务更新course表中课程号为c05109的课程名称为“数理统计”,然后回

滚该事务。

【例10.5】比较自动提交事务发生运行时错误和编译时错误的处理情况。

【例11.1】列出对服务器的有效权限。

【例11.2】列出对数据库 test01的有效权限

【例11.3】列出对表 teacher的有效权限。

【例11.4】列出一个用户的有效权限

【例11.5】利用系统过程 sp_addlogin 向 teaching 数据库创建3个新登录。

exec sp_addlogin  'rose', 'aabbcc', 'teaching'

GO

exec sp_addlogin  'hanry', 'aabbcc', 'teaching '

GO

exec sp_addlogin  'pool', 'aabbcc', 'teaching'

GO

'180802','bing@126.com ')

【例8.2】在 teaching 数据库中 student 表的 studentno 和classno 列上创建组合索

引IDX_sc.

IF EXISTS(SELECT name FROM sysindexes WHERE name='IDX_sc')

DROP INDEX student.sc

GO

CREATE INDEX IDX_sc ON student(studentno,classno)

3.索引碎片检测

【例8.3】使用sys.dm_db_index_physical_stats()函数获取 score表中所有索引的平均碎

片。

SELECT avg_fragmentation_in_percent

FROM sys.dm_db_index_physical_stats(DB_ID(),OBJECT_id('score'),null,null,null)

【例8.4】重新组织 teaching 数据库中 student 表上的 IDX_sc 索引。

ALTER INDEX IDX_sc ON dbo.student

REORGANIZE

【例8.5】重新生成 teaching 数据库中 student 表上的 IDX_Email 索引,设置填充索

引,将填充因子设置为80%,设置将中间排序结果存储在tempdb中。

ALTER INDEX IDX_sname ON dbo.student

REBUILD

WITH(PAD_INDEX=ON,FILLFACTOR=80,SORT_IN_TEMPDB=ON)

【例8.6】重新生成 teaching 数据库中 student 表上的ldx_student 索引,指定该索

引的填充因子为70%.

CREATE UNIQUE CLUSTERED INDEX Idx_student

ON dbo.student(studentno)

WITH(PAD_INDEX= ON,FILLFACTOR=70,DROP_EXISTING=ON)

【例8.9】删除 teaching 数据库中 student 表上的聚集索引 ldx_student 和非聚集索

引IDX_Email.

程序代码如下:

DROP INDEX student.Idx_student,student.IDX_Email

【例8.12】更新 student 表 u_Email 索引的统计信息。

UPDATE STATISTICS student u_Email

【例8.13】更新student表上所有索引的分布统计信息。

UPDATE STATISTICS student

【例8.14】在teaching 数据库中创建一个名为V_course的视图,包含所有类别为“必

修”的课程信息。

【例8.15】编程在 teaching 数据库中创建一个名为V_final的视图,包含学生学号、

姓名、课程号、课程名和期末成绩,按学号升序排序,学号相同的行按课程号升序排序。

【例8.16】在teaching 数据库中创建一个名为V_max的视图,查询每个班最高分的

课程名和分数,按班级号升序排序。

【例9.9】为course表创建一个触发器,用来防止用户删除任何必修课程的课程记录。

【例9.10】为 score表创建一个触发器,用来防止用户对score表中的数据进行任何修

改。

2.修改触发器

使用 ALTER TRIGGER 语句修改触发器

ALTER TRIGGER 语句的语法格式的各参数的含义和CREATE TRIGGER 语句中

参数的含义相同。

【例9.12】使用ALTER TRIGGER 语句修改触发器Tri_stu,用来禁止更新学号字段和姓名

字段的值。

【例9.13】创建触发器Time_out,当用户rose登录时,只能在7:30~18:30的时间段内

登录。

使用系统存储过程Sp_help或Sp_helptext可以查看触发器的命令:

Sp_helptext tri_stu_score

使用 DROP TRIGGER 语句删除触发器

例如可以使用如下语句来删除触发器Tri_stu.

DROP TRIGGER Tri_stu

禁用 course表中的触发器Tri_stu 的命令如下。

ALTER TABLE course

DISABLE TRIGGER Tri_stu

启用 course表中的触发器 delete_c_tr的命令如下。

ALTER TABLE course

ENABLE TRIGGER delete_c_tr

【例10.1】将teaching数据库的course表中课程号为c05103的课程名称为“高等数学”,

并提交该事务

【例10.2】分别使用显式事务和隐式事务向表course中插入两条记录。

【例10.3】定义一个事务,向 course表中添加一条记录,并设置保存点。然后再删除

该记录,并回滚到事务的保存点,提交事务。

DECLARE@myvar nchar(20)

set @myvar = ' This is a test '

SELECT@myvar

GO

运行结果如下:

This is a test

(1 行受影响)

【例5.2】显示到当前日期和时间为止试图登录SQL Server 2016的次数。

SELECT GETDATE()AS '当前的时期和时间',

@@CONNECTIONS AS'试图登录的次数'

运行结果如下:

当前的时期和时间

试图登录的次数

2018-02-22 21:13:26.490 46283

(1 行受影响)

【例5.3】为例5.1添加注释。

DECLARE@myvar nchar(20)

--定义变量@myvar

/*下面第一行给变量赋值

第2行输出变量值

*/

set @myvar = 'This is a test'

SELECT@myvar

GO

Transact-SQL中的日期时间函数

函数名

功能描述

GETDATE

获取当前系统的日期和时间。

DATEADD(unit,n.date)

在date的基础上添加n(天/小时/年)后的日期

DATEDIFF(unit,datel.date2)

以unit为单位计算日期1与日期2之间的差值

DATENAME(part,date)

返回指定日期的指定部分(如年/月/日)的字符串形式表示。

DATEPART(part.date)

返回指定日期的指定部分(如年/月/日)的整数形式。

DAY

获取指定日期的天的日期部分整数。

MONTH

获取指定日期的月份的日期部分整数

YEAR

获取指定日期的年份的日期部分整数。

GETUTCDATE

获取格林威治的标准时间 datetime值

【例5.8】从GETDATE函数返回的日期中提取年份、月份和天数值并输出

4.转换函数

SQL Server 2016 没有自动执行数据类型的转换,如果需要进行不同类型数据

之间的转换,可以使用转换函数CAST 或 CONVERT.

转换函数CONVERT和CAST的语法格式

CAST函数的语法格式。

CAST( expression AS data_type)

CONVERT函数的语法格式。其语法形式为:

UPDATE V_final SET sname='李静',final=60

WHERE studentno='18125121107' AND courseno='c05109'

3.通过视图删除基表中的数据

在视图上可以使用DELETE 语句实现对于基表中相关记录的删除。但如果在视

图中删除数据,该视图只能引用一个基表的列,且删除操作必须满足基表中定义的约束

条件。

【例8.27】通过视图V_sex删除基表student中学号为18125121107的学生记录。

DELETE FROM

V_sex

WHERE studentno='18125121107'

GO

SELECT*FROM student

【例8.28】通过视图 V_course 删除基表 course 中课程号为 c05109的课程记录。

分析:如果要删除一条记录,则相关表中的所有FOREIGN KEY约束必须仍然得到满足,

删除操作才能成功。由于为score表中的 courseno 列定义了FOREIGN KEY约束,其主键

表为course,且在score表中存在课程号为c05109的选课记录,因此删除操作无法实现。

DELETE FROM V_course

WHERE courseno='c05109'

【例9.1】创建一个存储过程,输出所有学生的姓名、课程名称和期末成绩信息。

【例9.2】创建一个存储过程,输出指定学生的姓名及课程名称、期末成绩信息。

【例9.3】创建一个存储过程,用输出参数返回指定学生的所有课程的期末成绩的平均

值。

【例9.4】创建一个存储过程,用输出参数返回指定学生的所有课程的期末成绩的平均

值,若不指定学生姓名,则返回所有学生的所有课程的期末成绩的平均值。并查看期末

考试低于70分的学生名单。

【例9.6】分别指向执行存储过程Pstu_sc0、Pstu_sc1和Pstu_sc2.

【例9.7】使用默认值执行的存储过程 Pstu_sc3.

【例9.8】为student表创建一个触发器,用来禁止更新学号字段的值。

举报

相关推荐

0 条评论