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表创建一个触发器,用来禁止更新学号字段的值。