数据库原理-SQL Server版(期末复习)

数据库的基本概念

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的笛卡尔积为

SUPERVISORSPECIALITYPOSTGRADUATE
泰罗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表中。
```cpp
 select* into history_student
 from student 

--新插入一门课程,并默认所有学生都选修该门课程插入到成绩表中(成绩为NULL)
insert into course(cno,cname)
values('96060','软件测试设计')
insert into score

select 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 y
	where y.sno=sno
	group by sno
	having 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.grade
	  AND 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.grade
	  AND 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 sno
    from score
    group by sno
    having count(*) = (select count(*) from course))

--带有比较符的子查询
--查询每个学生超过自己选修课程平均成绩的课程号
select cno
from score x
where grade >=( 
	select AVG(grade)
	from score y
	where x.sno=y.sno)

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

--创建一个视图VIEW1:查询001系学生的信息,只投影学生学号,姓名,年龄,系。要求在进行更新操作时满足约束。
CREATE VIEW view1
AS
	select sno,sname,age,depart
	from student
	where depart='001'
WITH CHECK OPTION

--由VIEW1导出一个视图VIEW2:查询年龄在1820岁的学生。
CREATE VIEW view2
AS
	select *
	from view1
	where 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 AS
	SELECT sno,sname,age
	FROM student
	WHERE depart='001'
--利用CREATE创建视图,必须是批处理中唯一的语句,因此需要GO语句进行隔离
GO
SELECT *FROM student_1
GO

定义语句块

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

Begin–End\if else

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

CASE语句

SELECT sno AS学号,cno AS 课程号
	CASE
		WHEN 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*@i
	SET @i=@i+1
IF @i<=5
	GOTO 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)
	AS
	BEGIN
		DECLARE @sname varchar(20)
		SELECT @sname = sname FROM student WHERE sno = @sno
		RETURN @sname

--内联表函数:返回teacher表中第二列的字段名和长度
--创建函数,根据给定学号和课程号查找选课信息
CREATE FUNCTION getScore(@sno CHAR(10),@cno CHAR)
	RETURNS TABLE
	AS
	RETURNS(
		SELECT sname AS 姓名,cname AS 课程,grade AS 成绩
		FROM student,course,score
		WHERE 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)
 AS
 BEGIN
 	DECLARE @l_xh char(10)
 	SELECT @l_xh=sno FROM student WHERE sname=@name
 	INSERT INTO @score_name
 		SELECT @l_xhm,@name,cname,grade
 			FROM course,score
 			WHERE course.cno=score.cno AND score.sno=@L_xh
 		RETURN
 	END
SELECT *FROM getScore_name('张三')
删除函数
DROP getScore_name;

--创建一个不带参数的存储过程P0,从学生表、选课表中返回每位学生选修课程的平均分
CREATE PROCEDURE P0
AS
	SELECT student.sno,AVG(sno.grade)AS AvgGrade
		FROM student,score
		WHERE student.sno=score.sno
		GROUP BY student.sno
EXECUTE P0 
		
--创建一个带参数的存储过程P1,若某教师辞职,则删除该教师的所有信息,而且找另外一个老师接手其工作
CREATE PROCEDURE P1
	@tno_1 CHAR(4),@tno_2 CHAR(4)
AS
BEGIN
 UPDATE department
 	SET dean = @tno_2
 	 WHERE tno=@tno_1
 	DELETE FROM teacher
 	 WHERE tno=@tno_1
END
EXECUTE P1 '0128' '0129'

--输入参数
CREATE PROCEDURE P2
@kcmc VARCHAR(20,@xymc VARCHAR(20)
AS
BEGIN
	SELECT * FROM student WHERE depart=
	(SELECT no 
	FROM department 
	WHERE name=@xymc)
	AND
		sno 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
BEGIN
	SELECT	@xm=sname
		FROM student
		WHERE @xh=sno
	END

DECLARE @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
BEGIN
	SELECT @xm=sname FROM student WHERE sno = @xh
	SELECT @cj=grade FROM score WHERE sno = @xh AND WHERE cno = @kch
	
DECLEARE @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
BEGIN
	IF @xh IS NULL
	RETURN -1
	SELECT @xm=sname
		FROM student
		WHERE sno = @xh
	IF @xm IS NULL
	RETURN -2
	RETURN 0
END

DECLARE @statuse_return int
DECLARE @xsxm CHAR(20)
EXECUTE @status_return = P3_1 '2015874103',@xsxm OUTPUT
IF @status_return = -1
	PRINT '没有输入学号!'
	ELSE
	IF @status_return = -2
		PRINT '找不到该学生!'
	ELSE
		PRINT @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_InsertCourse
	ON student
	FOR INSERT
AS
BEGIN
	DECLARE @xh VARCHAR(10)
	SELECT @xh=sno FROM inserted
	INSERT INTO score(sno,cno)
	SELECT @xh,cno FROM course
END

--创建DDL触发器
CREATE TRIGGER tr_safety
	ON DATABASE
	FOR DROP_TABLE
AS
BEGIN
	RAISERROR('触发器"tr_safety"禁止从当前数据库中删除表!',10,1)
	ROLLBACK--回滚
END


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

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值