数据库的基本概念

1.数据(Data)
数据是用来记录信息的可识别的符号,是信息的具体表现形式。

2.数据库(DataBase,DB)
长期存储在计算机内,有组织的可共享具有逻辑关系确定意义的数据的集合。

数据库基本特征:1.永久存储 2.有组织 3.可共享 4.冗余度小 5.易扩展

3.数据库管理系统(DataBase Management System,DBMS)
一种重要的程序设计系统,它由一个相互关联的数据集合和一组访问这些数据的程序组成。

主要功能:提供数据定义语言(DDL)、数据操纵语言(DML)等

4.数据库系统(DataBase System,DBS)
一个计算机应用系统,它是把计算机硬件、软件以及数据和相关人员组合起来为用户提供信息服务的系统。由数据库(DB),数据库管理系统(DBMS),应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。

特点:
(1)数据结构化(内部有结构,只适合于特定应用)
(2)数据共享性高、冗余度低且易扩充(可以保证多个应用程序同时访问、操作)
(3)具有较高的数据独立性(数据库的三级模式结构保证数据独立性)
(4)有统一的数据控制功能(DBMS统一控制和管理)

数据模型(Data Model)

一、含义
数据模型是数据库中数据的存储方式,是数据库系统的基础。

二、分类
1.概念模型

按用户的观点来对数据和信息建模,主要用于数据库设计

概念模型的表示方法很多,最常用的为实体-联系方法(Entity-Relationship approach),该方法用E-R图来描述概念模型。E-R方法也成为E-R模型。

2.逻辑模型和物理模型
物理结构即数据的存储结构,是数据元素在计算机存储器中的表示及其配置。
逻辑结构则是数据元素之间的逻辑关系。

三、数据模型的三要素
(1)数据结构
用于描述系统的静态特征,包括数据的类型、内容、性质及数据之间的联系等。是数据模型的基础,也是刻画一个数据模型性质最重要的方面。通常按其数据结构的类型来命名数据模型,例如层次结构、网状结构和关系结构的数据模型分别命名为层次模型、网状模型、关系模型。
(2)数据操作
指对数据库中各种对象的实例允许执行的操作的集合,包括操作及其有关的规则,主要分为查询和更新(插入、删除、修改)两大类操作。
(3)数据约束
完整性约束条件是给定的数据模型中数据及其联系所具有的制约和依存规则,在关系模型中体现为实体完整性和参照完整性。例如,性别只能为“男”、“女”。

逻辑模型的分类(非关系模型与关系模型)

一、关系模型(Relational Model)
(1)结构:
二维表结构来表示实体与实体之间的联系,每个二维表又可称为关系,在关系模型中,操作的对象和结果都是二维表。每一行在关系中称为元组,每一列在关系中称为属性。
(2)联系:
一对一、一对多、多对多

二、非关系模型:

网状模型,满足下面两个条件的基本层次联系的集合(一对多关系,结构上像有向图):
①允许一个以上的节点无双亲;
②一个节点可以有多于一个的双亲。

层次模型,满足下面两个条件的基本层次联系的集合为层次模型(就是树结构):
①有且只有一个节点没有双亲节点,这个结点称为根节点
②根以外的其它节点有且只有一个双亲节点

数据库体系结构

数据库系统的三级模式结构:模式(Schema)、外模式(External Schema)、内模式(Internal Schema)


(1)概念模式(逻辑模式,或简称模式)只有1个。是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
(2)外模式(子模式,或用户模式)有多个。它是数据库用户能够看见的逻辑结构和特征,是数据库用户的数据视图。
(3)内模式(存储模式)只有1个。是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。

二级映射与数据独立性

DBMS在三级模式之间提供了二级映射,通过二级映射保证数据库中的数据具有较高的物理独立性和逻辑独立性。
(1)概念模式/内模式的映射。概念模式和内模式都只有一个。所以概念模式/内模式映射是唯一的。它确定了数据的全局逻辑结构和存储结构之间的对应关系。当存储结构变化时,概念模式/内模式的映射也应有相应的变化。确保了数据的物理独立性。
(2)外模式/概念模式的映射。用于定义该外模式和概念模式之间的对应关系。确保了数据的逻辑独立性。

ER图

ER图详细描述可以点这里看。

关系模型

名称 说明
关系 一个关系对应通常说的一张表
属性 表中的一列即为一个属性
属性的取值范围
元组 表中的一行即为一个元组
也称码键。表中的某个属性组,它可以唯一确定一个元组
分量 元组中的一个属性值
关系模式 对关系的描述,一般表示为 关系名(属性1,属性2,…,属性n)

1.笛卡尔积(Cartesian Product):笛卡尔积是上面的一种集合运算

给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2,…,Dn的笛卡尔积为:
笛卡尔积中每个元素(d1,d2,…dn)称为一个n元组或简称元组
笛卡尔积可表示为一个二维表,表中每行对应一个元组,表中每一列的值来自一个域。

例如,给出3个域:
D1=奥特曼集合SUPERVISOR={泰罗,雷欧}
D2=星云集合SPECIALITY={M78,狮子座}
D3=父亲集合POSTGRADUATE={奥特之父,狮心王}
D1,D2,D3的笛卡尔积为

SUPERVISOR SPECIALITY POSTGRADUATE
泰罗 M78 奥特之父
雷欧 狮子座 狮心王

关系(Relation)

D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的关系,表示为R(D1,D2,…,Dn)
R:关系名
n:关系的目或度(Degree)

关系也是一个二维表,每行对应一个元组,每列对应一个域,每列称为属性
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码。若一个关系有多个候选码,则选定其中一个或多个为主码

候选码的多个属性称为主属性,不包含在任何候选码中的属性称为非主属性;最简单的情况下,候选码只包含一个属性,如果关系模式的所有属性都是这个关系的候选码,则称为全码

关系的完整性

关系模型的完整性规则是对关系的某种约束条件,关系模型中有三类完整性约束:

域完整性:域完整性是针对某一具体关系数据库的约束条件,指列的值域的完整性,既限制了某些属性中出现的值,又把属性限制在一个有限的集合里。

实体完整性:关系模型以主码作为唯一性标识,主码中的属性即主属性不能取空值,也不能存在两个相同的属性,也称为行完整性。

参照完整性:外码

关系代数

并、差、投影、笛卡尔积、选择为五个基本操作,交、连接、除等为附加操作,附加操作可以用五个基本操作表示。

关系操作

关系模型中常用的关系操作包括查询操作和插入、删除、修改操作这两大部分。

查询操作又分为:
传统的关系运算:除、并、差、交、笛卡尔积等;专门的关系运算:选择(取行)、投影(取列)、连接
其中:选择、投影、并、差、笛卡尔积是5种基本操作,其他操作是可以用基本操作来定义和导出的。


选择
选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算

如查询信息系(IS系)全体学生

投影
投影操作主要是从列的角度进行运算,但投影成功之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)

如查询学生的姓名和所在系

连接
从两个关系的笛卡尔积中选出属性符合一定条件的元组。

(1)等值连接:θ为’=’的连接运算,即选取属性相同的元组。

(2)自然连接:特殊的等值连接,还要将属性相同的列去除

(3)外连接
悬浮元组:两个关系R和S在做自然连接时,有一些元组并没有与S属性相同。造成了这些元组的丢弃,这些元组被称为悬浮元组。

在自然连接基础上。
外连接:把悬浮元组保留,其他属性填空值(Null)
左外连接:只保留左边的悬浮元组
右外连接:只保留右边的悬浮元组




SQL

基本概念

索引:可以加快查询速度,可以在基础表中建立一个或多个索引,提供多种存取方式作为存取路径进行选择。
唯一索引:使用unique关键字,每个索引值对应一条数据记录
非唯一索引:不使用unique关键字。
聚簇索引:索引项与数据记录的顺序一致,所以一个表只能包含一个聚集索引。
非聚簇索引:可以有多个。
.视图:视图是从一个或几个基本表(或视图)导出的表,数据库只存放视图的定义而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中数据发生变化,从视图查询出的数据也会随之改变。

视图的作用:
用户所做的只是对一个虚表的简单查询,而这个虚表现实中并不存在。利用视图来表达查询语句

示例数据库

源码

创建数据库,主数据文件初始大小5MB,最大为1GB,增长率10%

CREATE DATABASE mystest
ON
PRIMARY
(   NAME=mystest,FILENAME='D:\MyDataBase\mytest.mdf',size=5MB,MAXSIZE=1GB,FILEGROWTH=10%
)--创建一张history_student表(结构同student),将学生表中数据全部插入到history_student表中。
```cppselect* into history_studentfrom student --新插入一门课程,并默认所有学生都选修该门课程插入到成绩表中(成绩为NULL)
insert into course(cno,cname)
values('96060','软件测试设计')
insert into scoreselect sno,'96060',NULL
from student

更改

--添加新文件
alter database mystest
ADD FILE
{NAME=Exeldat1,FILENAME='f:\mydb\Exel_dat1.NDF'size=5MB,MAXSIZE=1GB,FILEGROWTH=2MB
}--添加新文件至文件组
alter database mystest
ADD FILE
{NAME=Exeldat1,FILENAME='f:\mydb\Exel_dat1.NDF'size=5MB,MAXSIZE=1GB,FILEGROWTH=2MB
}
TO FILEGROUP ExelFG1--删除数据库
DROP DATABASE mystest--将所有平均成绩低于60分的学生成绩记录删除。
DELETE from score
where sno in(select sno from score ywhere y.sno=snogroup by snohaving avg(grade)<60
)

用create table 新建5个表:student,teacher,course, score, department(不添加主外键约束,但需要添加主键的属性先添加NOT NULL约束)

create table student
(sno char(12)NOT NULL,--主键的属性添加NOT NULL约束sanme char(20),gender char(4),age int,depart char(20),specialty char(20)
)create table department
(no char(3)NOT NULL,name char(20),dean char(4)
)

用alter table 添加约束:主键约束、外键约束、score表grade列的check约束(0-100)等

alter table student
add constraint PK_student PRIMARY KEY(sno)--主键约束PK_student--ADD CONSTRAINT PK_course PRIMARY KEY(cno)
ADD CONSTRAINT FK_tno FOREIGN KEY(tno) REFERENCES teacher(tno)--外键约束FK_tno
add constraint ck_score_grade check(grade between 0 and 100)--检查约束

索引

--在student表上创建一个唯一索引
CREATE CLUSTER INDEX Stusno
ON stuent(sno)--在student表上创建一个聚集索引
CREATE UNIQUE INDEX Stusno
ON stuent(sno)--删除student表上的索引
DROP INDEX student.Stusno

数据更新

--插入记录到表,要求满足约束条件
insert into student
values('2015874144','王日涛','男','20','001','软件工程'),
('2015874120','肖雅玲','女','21','004','生物制药'),
('2015874138','黄嘉欣','女','19','005','计算机科学与技术'),
('2015874136','黄清文','男','22','002 ','工商管理学'),
('2015874124','陈佳丽','女','21','003','电气自动化')--在表score中插入数据,要求每个同学选修3门课以上,每门课至少3个同学选修。
INSERT INTO score
VALUES('20158
74144','91311','68'),('2015874144','96281','88'),('2015874120','96281','65'),('2015874120','81170','77'),('2015874120','81060','86'),('2015874124','91311','90'),('2015874124','81170','66'),('2015874124','81060','63'),('2015874136','91311','55'),('2015874136','81192','59'),('2015874136','81060','88'),('2015874136','81170','70')--更新记录到表,将student表中学号为'2018874143'的学生年龄改为22
UPDATE student
SET age = 22
WHERE sno = '2018874143'--将所有成绩为空的成绩全部修改为60分。
update score
SET grade='60'
where grade is NULL--更新score_new与student表中的相等的姓名字段
UPDATE score_new
SET score_new.sname = student.sname FROM score_new.student
WHERE score_new.sname = student.sname--删除course表中课程号为'08195371'的记录
DELETE FROM course
WHERE cno='08195371'

查询语句

select *
from score--查询选修了课程号为"01","02","03"的学号、课程号和成绩记录
where cno in('91311','81192','81060')--查询课程号"01","02","03"除外的,成绩大于60分的学号、课程号和成绩记录
where cno not in('91311','81192','81060')and grade>60--查询选修了课程号为"01","02","03",成绩在80-90分的学号、课程号和成绩记录
where cno in('91311','81192','81060')and grade between 80 and 90--查询选修了课程号为"81192"的最好成绩、最差成绩、平均成绩记录
select max(grade) as 最大值,min(grade) as 最小值,avg(grade) as 平均值
from score
where cno='81192'--查询选修了课程号为"81192"的最好成绩、最差成绩、平均成绩记录
select count(sno)人数
from student
where gender='男'and sno like '20158741_%'--查询' 20158741'班的男生人数(学号前8位作为班级号)
select count(sno) as 人数
from student
where gender='男'and sno like '20158741_%'--查询'20158741'班黄姓同学的人数
select count(sno) as 人数
from student
where sname like '黄%' and sno like '20158741_%'--查询'20158741'班黄姓同学的学号、姓名
select sno,sname
from student
where sname like '黄%' and sno like '20158741_%'--查询1980后出生的教授记录
select *
from teacher
where year(GETDATE()-age>1980)--查询编号为'0128'教师的授课门数
select count(cno) as 门数
from course
where tno = '0128'--查询还没有安排授课老师的课程信息
select *
from course
where tno is null--查询每一个同学的学号、最好成绩、最差成绩、平均成绩。
select sno ,sname,specialty
from student
where specialty like'__工_'--查询与"古美坤"同龄同班的学生姓名
select a.sname
from student a ,student b
where a.age=b.age and b.sname='古美坤'and a.specialty=b.specialty

分组

--求各个课程号及相应的选课人数
select sno,count(cno)
from score
group by cno--查询至少选修了3门课的同学的学号和选修课程门数
select sno,count(cno) as 门数
from score
group by cno
having count(cno)>=3
--having,筛选,作用于组--查询平均成绩大于80的课程编号和平均成绩
select cno,AVG(grade)
from score
group by cno
having (AVG(grade))>80--查询最低分大于70,最高分小于91的学生学号
select sno
from score
group by sno
having max(grade)<90 and min(grade)>70--查询成绩比该课程平均成绩低的学生的学号、成绩
select sno,grade
from score,(select cno,AVG(grade) av from score group by cno)a
where score.cno=a.cno and grade<av

连接

--自连接(自己与自己进行连接)
--查询学号为2015874103, 2015874109, 2015874129三位同学不及格课程门数,查询结果按照学号降序排列。
select count(cno) as 门数
from score x,score y,score z
where sno in('2015874103','2015874109','2015874129')and grade<60
group by sno
order by sno desc--降序
order by sno desc--升序--内连接(使用比较符进行表与表之间连接)
--查询每个同学的学号、姓名、选修的课程名称、成绩、上课老师姓名,按照学号升序排列结果
select A.sno,A.sname,B.cname,D.grade,C.tname
from student A,course B,teacher C,score D
where A.sno=D.sno and D.cno=B.cno and B.tno=C.tno
order by sno asc左外连接(不但返回满足连接条件的记录,而且会返回左表不满足条件的记录)
--查询所有学生的选课情况(包括没有选课的学生)
select *
from student.A left join score.B
on student.sno=score.sno--查询选修'81060'课程的成绩高于' 2015874129'号同学成绩的所有学生学号
select x.sno
from score x,score y
where x.cno='81060'and x.grade>y.gradeAND y.sno='2015874136'and y.cno='81060'--查询选修'81060'课程的成绩高于'2015874129'号同学成绩的所有学生学号、姓名
select j.sno,j.sname
from score x,score y,student j
where x.cno='81060'and x.grade>y.gradeAND y.sno='2015874136'and y.cno='81060'and x.sno=j.sno

嵌套查询

--查询《数据库课程设计》的间接先修课,要求输出课程编号,课程名称,间接先修课的课程编号和名称。
select A.sno,A.sname,B.pcno,B.sname
from course A,course B,course C
where A.sno=B.sno and A.sname='大型数据库设计' and B.pcno=C.pcno--查询学习课程号为'81060'的学生的学号与姓名
select student.sno,student.sname
from student,course,score
where student.sno=course.sno and score.cno=course.cno and course.cno='81060'--交集
--查询至少选修课程号为'81060'和'81170'课程的学生的学号
select student.sno
from student,score
where student.sno=score.sno and cno='81060'
INTERSECT
select student.sno
from student,score
where student.sno=score.sno and cno='81170'--并集
--查询选修课程号为'81060'或'81170'课程的学生
select sno
from score
where cno='81060'
UNION
select sno
from score
where cno='81170'--查询学习全部课程的学生的学号
select sno
from student
where sno in(select snofrom scoregroup by snohaving count(*) = (select count(*) from course))--带有比较符的子查询
--查询每个学生超过自己选修课程平均成绩的课程号
select cno
from score x
where grade >=( select AVG(grade)from score ywhere x.sno=y.sno)

视图
从一个或多个表(或视图)导出的表。视图是一个虚拟表,并不包含任何的物理数据。

--创建一个视图VIEW1:查询001系学生的信息,只投影学生学号,姓名,年龄,系。要求在进行更新操作时满足约束。
CREATE VIEW view1
ASselect sno,sname,age,departfrom studentwhere depart='001'
WITH CHECK OPTION--由VIEW1导出一个视图VIEW2:查询年龄在18到20岁的学生。
CREATE VIEW view2
ASselect *from view1where age between 18 and 20--将查询语句select sno,sname from view2 where ssex=’女’等价转换为对基本表的查询语句并运行结果。
select sno,sname
from student
where gender='女'and age between 18 and 20 and depart='001' --将VIEW1,VIEW2删除。
drop view view1, view2

T-SQL

变量

局部变量(local variable,以 @为变量名称开头)
是由用户定义的变量,这些变量可以用来保存数值、字符串等数据
全局变量(global variable,@@为名称头)
是由系统提供及赋值,用来保存一些系统的信息。

赋值

declare @a Datetime,@b int,@x int --声明两个变量
set @a='2018-11-11'
set @b=(select min(Credit) from Course)
select @x=(select count(*) from Course);  -- 少写一个select-- select或者print打印输出
select @a,@b
print @x

全局变量

select @@SERVERNAME --返回SQL服务器名称
select @@LANGUAGE   --返回当前使用语言名
select @@VERSION  --返回SQL服务器安装日期、版本和处理器类型
print APP_NAME()    --返回当前会话应用程序
print USER_NAME()   --返回用户数据库用户名
print GETDATE()     --返回当前时间
-- 补:返回年份print DATENAME(YYYY,GETDATE()) 或 select DATENAME(YYYY,GETDATE())

批处理

USE student
GO
CREATE VIEW student_1 ASSELECT sno,sname,ageFROM studentWHERE depart='001'
--利用CREATE创建视图,必须是批处理中唯一的语句,因此需要GO语句进行隔离
GO
SELECT *FROM student_1
GO

定义语句块

BENGINSql_statement1Sql_statement2...
END注意:
Sq1_statement:是任何有效的T-SQL语句。
BEGIN…END语句块允许嵌套 。

Begin–End\if else

--查找cno='2'的课程,有则删除,没有提示没找到
If Exists(SELECT * from course where cno='2')BeginDelete course where cno='2'Print '课程号为2的课程已删除!'End
Elseprint '课程号为2的课程不存在!'

CASE语句

SELECT sno AS学号,cno AS 课程号CASEWHEN grade<60 then '不及格'WHEN grade<60 then '一般'WHEN grade<60 then '良好'ELSE '优秀'END AS 成绩
FROM score·

GOTO语句

DECLARE @s INT,@i INT
SET @i=1
SET @s=1
my_loop:SET @s=@s*@iSET @i=@i+1
IF @i<=5GOTO my_loop
print '1*2*3*4*5'+CASE(@s AS CHAR(25))

函数



--用COL_NAME函数返回teacher表中第二列的字段名和长度
SELECT COL_NAME(OBJECT_ID('teacher'),2) AS '第二列的字段名'
COL_LENGTH('teacher',COL_NAME(OBJECT_ID('teacher'),2))--给定学生的学号,返回学生姓名
CREATE FUNCTION getSname(@sno CHAR(10))RETURNS varchar(20)ASBEGINDECLARE @sname varchar(20)SELECT @sname = sname FROM student WHERE sno = @snoRETURN @sname--内联表函数:返回teacher表中第二列的字段名和长度
--创建函数,根据给定学号和课程号查找选课信息
CREATE FUNCTION getScore(@sno CHAR(10),@cno CHAR)RETURNS TABLEASRETURNS(SELECT sname AS 姓名,cname AS 课程,grade AS 成绩FROM student,course,scoreWHERE student.sno = score.sno AND course.cno=score.cno AND student.sno = @sno AND course.cno=@cno)
SELECT 姓名,课程,成绩 FROM getScore('2015874101','08181192')--多语句表值函数
--创建函数,给定学生姓名,查找其所有的选课信息
CREATE FUNCTION getScore(@sname CHAR(10))RETURN @score_name TABLE (xh char(10),xm char(20),kcmc char(20),cj int)ASBEGINDECLARE @l_xh char(10)SELECT @l_xh=sno FROM student WHERE sname=@nameINSERT INTO @score_nameSELECT @l_xhm,@name,cname,gradeFROM course,scoreWHERE course.cno=score.cno AND score.sno=@L_xhRETURNEND
SELECT *FROM getScore_name('张三')
删除函数
DROP getScore_name;--创建一个不带参数的存储过程P0,从学生表、选课表中返回每位学生选修课程的平均分
CREATE PROCEDURE P0
ASSELECT student.sno,AVG(sno.grade)AS AvgGradeFROM student,scoreWHERE student.sno=score.snoGROUP BY student.sno
EXECUTE P0 --创建一个带参数的存储过程P1,若某教师辞职,则删除该教师的所有信息,而且找另外一个老师接手其工作
CREATE PROCEDURE P1@tno_1 CHAR(4),@tno_2 CHAR(4)
AS
BEGINUPDATE departmentSET dean = @tno_2WHERE tno=@tno_1DELETE FROM teacherWHERE tno=@tno_1
END
EXECUTE P1 '0128' '0129'--输入参数
CREATE PROCEDURE P2
@kcmc VARCHAR(20),@xymc VARCHAR(20)
AS
BEGINSELECT * FROM student WHERE depart=(SELECT no FROM department WHERE name=@xymc)ANDsno NOT IN(SELECT sno FROM score WHERE cno IN(SELECT cno FROM course WHERE cname=@kcmc))END--带有输入输出参数的存储过程P3,输入学生学号返回姓名
CREATE PROCEDURE P3@xh CHAR(10),@xm CHAR(10) OUTPUT
AS
BEGINSELECT @xm=snameFROM studentWHERE @xh=snoENDDECLARE @xsxm CHAR(20)
EXECUTE P3 '2015874103',@xsxm OUTPUT
SELECT @xsxm--创建带有多个输入参数输出参数,输入学生的学号和课程号,返回姓名和成绩
CREATE PROCEDURE P4
@xh CHAR(10),@kch CHAR(10),@xm CHAR(20) OUTPUT,@cj INT OUTPUT
AS
BEGINSELECT @xm=sname FROM student WHERE sno = @xhSELECT @cj=grade FROM score WHERE sno = @xh AND WHERE cno = @kchDECLEARE @xm CHAR(10),@cj INT
EXECUTE P4 '201574143','08181170',@xm OUTPUT,@cj OUTPUT
PRINT @xm
PRINT @cj--带返回值
CREATE proceduer P3_1
@xh CHAR(10)=NULL,@xm CHAR(20) OUTPUT
AS
BEGINIF @xh IS NULLRETURN -1SELECT @xm=snameFROM studentWHERE sno = @xhIF @xm IS NULLRETURN -2RETURN 0
ENDDECLARE @statuse_return int
DECLARE @xsxm CHAR(20)
EXECUTE @status_return = P3_1 '2015874103',@xsxm OUTPUT
IF @status_return = -1PRINT '没有输入学号!'ELSEIF @status_return = -2PRINT '找不到该学生!'ELSEPRINT @xsxm--删除存储过程
DROP PROCEDRUE P1,P2

触发器

触发器是基于一个表创建的,但是可以针对多个表进行操作。满足触发器定义的触发条件后触发。
根据触发事件可分为:
(1)DML触发器
发生数据操纵语言(DML)时有效,以影响触发器中定义的表
事件包括INSERT、UPDATE、DELETE语句
自动创建delete表(UPDATE、DELETE)和insert表(UPDATE、INSERT),并进行管理
(2)DDL触发器
CREATE、ALTER、DROP、GREANT、DENY、REVOKE、UPDATE STATISTCS
(3)登录触发器
登录触发器将为响应LOGON事件而激发存储过程。

按触发器被激活的时机可以分为以下两种类型:
(1)AFTER触发器
AFTER触发器又称后触发器,在触发动作之后再触发,只能定义在表上,不能定义在触发器上。
(2)INSTEAD OF触发器
又称替代触发器,只能定义一个INSTEAD OF触发器。

--创建DML触发器
--在student表上建立一个名为tr_InsertCourse的触发器,当在student表中插入一个学生信息时,假定该同学会选修所有课程,同时在score表中插入该同学的选修信息。
CREATE TRIGGER tr_InsertCourseON studentFOR INSERT
AS
BEGINDECLARE @xh VARCHAR(10)SELECT @xh=sno FROM insertedINSERT INTO score(sno,cno)SELECT @xh,cno FROM course
END--创建DDL触发器
CREATE TRIGGER tr_safetyON DATABASEFOR DROP_TABLE
AS
BEGINRAISERROR('触发器"tr_safety"禁止从当前数据库中删除表!',10,1)ROLLBACK--回滚
END

本文参考
课本《数据库原理》
博客链接:
https://blog.csdn.net/qq_37205708/article/details/94194465
https://blog.csdn.net/hza419763578/article/details/83960644

数据库原理-SQL Server版(期末复习)相关推荐

  1. SQL数据库语言基础之SqlServer数据库原理与设计课程期末复习-条件查询实例练习【学生表、选课表、家庭作业表】

    文章目录 1.简单查询 2.查询在1999年出生的学生学号.姓名.出生日期 3.三次作业成绩都在60分以上的学生学号.课程号 4.查询姓张学生学号.姓名和专业班级 5.查询03级的男生信息 6.查询没 ...

  2. NickLee.FortuneBase数据库sql server版工具篇

    在51aspx上面发布了NickLee.FortuneBase数据库sql server版后,很多朋友是第一次接触到,尤其是一些新手朋友,对于系统框架的使用,环境的配置,页面的生成等等存在着一些疑问, ...

  3. 《RFID原理及应用》期末复习总结

    <RFID原理及应用>期末复习总结 适用教材:<RFID原理与应用(第2版)>,许毅.陈建军编著,清华大学出版社 提示:与教材内容不完全匹配,有所取舍. 写在前面: 这份复习总 ...

  4. 应用程序的数据库从Sql Server迁移到Oracle

    应用程序的数据库从Sql Server迁移到Oracle 迁移案例一:数据库: Sql Server 2008到Oracle 9i 工具: Sybase PowerDesiner 12 试用版, PL ...

  5. 镜像数据库上SQL Server复制

    This article will review on how to configure SQL Server Replication along with mirroring on a databa ...

  6. 《RFID原理及应用》期末复习总结(6)

    <RFID原理及应用>期末复习总结(6)-(第六章 如何构建RFID应用系统) <RFID原理及应用>期末复习总结(6) 1.选择标准 2.选择频率 3.频率范围 4.运行环境 ...

  7. Mendix一练一动: Mendix Studio Pro连接外围数据库(SQL Server)实现增删改查

    一. 环境准备 1: 连接外围数据库是Mendix的内置功能,不同数据库的连接方式都大同小异,本文以SQL Server为例讲解: 2:本文假设读者是Mendix初级学者,因此对每一步骤作者都尽量表述 ...

  8. 将Excel文件数据库导入SQL Server

    将Excel文件数据库导入SQL Server的三种方案//方案一: 通过OleDB方式获取Excel文件的数据,然后通过DataSet中转到SQL Server openFileDialog = n ...

  9. mysql2005备份_创建完整数据库备份 - SQL Server | Microsoft Docs

    完整数据库备份Create a Full Database Backup 09/12/2019 本文内容 适用于:Applies to: SQL ServerSQL Server(所有支持的版本)SQ ...

最新文章

  1. 《R语言实战》第6章
  2. java——什么是浅表副本
  3. cap流程图_化工工艺流程图制图图例汇编.pdf
  4. java 递归改非递归_使用Java ThreadLocals的意外递归保护
  5. JavaFX技巧来节省内存! 属性和可观察物的阴影场
  6. project日历设置-大小周交替
  7. 文件错误关于hibernate中报Duplicate class/entity mapping org.model.User错的问题
  8. 12行Python暴力爬《黑豹》豆瓣短评
  9. 用户id oracle设置,Oracle中的架构,用户和功能ID
  10. osgearth_backfill重采样生成低精度金字塔数据
  11. 【离散数学】图论 第七章(8) 运输网络、流和割、Ford-Fulkerson定理
  12. 解决微信公众号注册提示“邮箱已被占用”(亲测)
  13. python参数类型为uint8_Python 改变数组类型为uint8的实现
  14. Linux基础命令之好用的组合
  15. 光盘重装linux系统教程视频,重装系统?一步一步安装系统详细教程【带视频】。...
  16. Banner 怎么实现轮播不同尺寸的图片
  17. 计算机专业兴趣小组 名字,计算机人兴趣小组口号
  18. 黄金时代 —— Pytorch学习记录(一)
  19. 内存替换算法——LRU
  20. Ext_基本表单_Ext.form.BasicForm

热门文章

  1. ArangoDB压测小记
  2. 一些软件的安装(cherrytree,mplayer,flash插件)
  3. 毕业设计EMS办公管理系统(B/S结构)+J2EE+SQLserver8.0
  4. confluence 配置
  5. Golang 本地缓存选型对比及原理总结
  6. 位操作符左移问题(<<)如果char类型左移后位数超出一字节如何打印?
  7. 关于google smtp邮件发送
  8. 两位数合并成一个四位数的C++代码
  9. 惊闻!同学被诈骗2万美金!骗子的良心不会痛吗?
  10. 青蛙过河程序及其解析