AHU_SQL_Consise_Tutorial

SQL(Consise Tutorial)

SQL_Consise_Tutorial

写在前面:

由于书上的SQL讲解太过于分散,因此我写了一个文档来总结这些知识点,以例子代替讲解,方便大家查漏补缺,由于开始时写这个文档是为了实验考试,但后来为了准备期末考试又添加了一些实验课上没有讲到的东西,如果有什么缺失的知识点,可以发邮件给我:howiewang.cs@gmail.com ,我会尽量补上缺失的内容。

创建表

创建STUDENT表

1
2
3
4
5
6
7
8
9
CREATE TABLE STUDENT
(SId INT IDENTITY(1,1),
SNo CHAR (5) PRIMARY KEY,
CLno CHAR(6),
SName VARCHAR(8) NOT NULL
SSex CHAR(2) CHECK(SSex IN('男','女')), //用CHECK短语指定列值该满足的条件
SBir DATETIME
SAge INT
)

创建表时,用CHECK短语指定列值该满足的条件

1
2
3
4
5
6
7
CREATE TABLE STUDENT
(
Sno CHAR(9) PRIMARY KEY,
SName CHAR(8) NOT NULL,
Ssex CHAR(2),
CHECK(SSex='女' OR NOT LIKE 'Ms.%') //对元组进行CHECK检查
)

修改表的属性

修改表Course的列属性,将CName的长度改为40,且不允许为空

1
2
3
USE SM_X01814031
ALTER TABLE COURSE
ALTER COLUMN CNAME VARCHAR(49) NOT NULL

增加表的属性

向表Student中增加E-mail列,且要求输入的电子邮件地址必须包括”@”字符

1
2
3
4
USE SM_X01814031
ALTER TABLE STUDENT
ADD Email VARCHAR(40) NOT NULL
CONSTRAINT CHECK_EA CHECK(Email like '%@%')

删除表的属性

删除表Student中的SAge列

1
2
3
USE SM_X01814031
ALTER TABLE STUDENT
DROP COLUMN Sage

修改数据的类型

修改STUDENT表中的Sage为INT类型

1
2
ALTER TABLE STUDENT
ALTER COLUMN SAge INT

增加/删除属性的完整性约束

给属性CName添加唯一值的约束性条件

1
2
ALTER TABLE COURSE
ADD UNIQUE(CName)
1
2
3
4
5
6
增加约束
ALTER TABLE STUDENT
ADD CONSTRAINT C1 CHECK(Sno BETWEEN 1000000 AND 9999999)
删除约束
ALTER TABLE STUDENT
DROP CONSTRAINT C1

添加主键约束

1
2
3
USE SM_X01814031
ALTER TABLE STUDENT
ADD CONSTRAINT Pk_name PRIMARY KEY(SName)

删除主键约束

1
2
3
USE SM_X01814031
ALTER TABLE Student
DROP Pk_name

WITH NOCHECK字句对表的属性添加约束

如果已存在的数据与要创建的约束冲突,则需要加上 with nocheck

1
2
3
4
USE SM_X01814031
ALTER TABLE STUDENT
WITH NOCHECK
ADD CONSTRAINT ck_age CHECK(SAge>=18 AND SAge<=25)

使约束无效/重新有效

使约束无效

NOCHECK CONSTRAINT字句

1
2
USE SM_X01814031
ALTER TABLE Student NOCHECK CONSTRAINT ck_ea

使约束重新有效

CHECK CONSTRAINT字句

1
2
USE SM_X01814031
ALTER TABLE Student CHECK CONSTRAINT ck_ea

普通插入数据

1
2
INSERT INTO STUDENT
VALUES('06002','06001','要强','男','1999-1-1','4992131@qq.com',null)

选择性的插入数据

把表Student中学号为”06001”的记录插入到表ss中

1
2
3
INSERT INTO SS
SELECT * FROM STUDENT
WHERE SNo='06001'

把表Student中所有男生且SNo不为06001的记录插入到表ss中

1
2
3
INSERT INTO SS
SELECT * FROM STUDENT
WHERE SSex ='男' AND SNO<>'06001'

更新修改表中数据

①学号为”06002”的学生的年龄改为20岁。

1
2
3
UPDATE STUDENT 
SET SAge=20
WHERE SNo='06002';

②所有男生的年龄增加1岁。

1
2
3
UPDATE STUDENT
SET SAge=SAge+1
WHERE SSex='男'

③所有选修了数字逻辑课程的学生的成绩加5分。

1
2
3
UPDATE STUDENT
SET GRADE=GRADE+5
WHERE CNo=(SELECT CNo FROM COURSE WHERE CName='数字逻辑')

删除表中数据

删除学生学号为”06001”的记录

1
2
DELETE FROM STUDENT 
WHERE SNO='06001'

删除所有学生选课记录

1
DELETE FROM SC

查看查询数据

查看所有教职工的信息

1
xSELECT * FROM TEACHER

查看所有教职工号和姓名

1
SELECT TName,TNo FROM TEACHER

查看所有职工的职工号、姓名,并且将输出结果中的列名显示为“教职工号”、“姓名”。

1
SELECT TName 姓名,TNo 教职工号 FROM TEACHER

查询所有职工的姓名和年薪,并且将输出结果中的列名显示为“姓名”、“年薪”

1
SELECT TName 姓名,Sal*12 年薪 FROM Teacher

查询所有职工的姓名和年薪,并且将输出结果中的列名显示为“姓名”、“年薪”、“币种单位”,其中币种单位的值为“元”。

1
SELECT TName 姓名,sal*12 年薪,'元' 币种单位

DISTINCT关键字:

输出的数据中不包含相同的

1
SELECT DISTINCT ............

查询所有0004部门职员的信息

1
2
SELECT * FROM Teacher
WHERE DNo='0004'

查询1984年和1985年出生的男生的信息。

1
2
3
SELECT SName,SBir 
FROM Student
WHERE SSex='男' AND SBir BETWEEN '1984-01-01' AND '1985-12-31'

查询0004部门、0005部门和0006部门的职工的信息。

1
2
SELECT * FROM Teacher
WHERE DNo IN('0004','0005','0006')

查询学号为03004的同学正在学习的课程。

1
2
3
SELECT CNo 
FROM SC
WHERE SNo='0304'

查询姓“要”的同学的信息。

1
2
3
SELECT * 
FROM Student_X01814031
WHERE SName LIKE '要%'

ORDER BY关键字

查询所有职工的工号,年龄,并按照年龄从小到大的顺序进行排列

1
2
3
SELECT TNo,TAge
FROM TEACHER
ORDER BY AGE

查询学生某门课(如00005)的成绩,并按成绩由高到低的顺序输出

1
2
3
4
SELECT Score
FROM SC
WHERE CName='00005'
ORDER BY Score DESC

查询职工的年薪,并按年薪的升序排列

1
2
3
SELECT TName,sal*12
FROM TEACHER
OREDER BY 2

查询所有职工信息,被部门号的降序排列,再部门相同的情况下,按照年龄的升序排列

1
2
3
SELECT *
FROM TEACHER
ORDER BY DNo DESC,Age

查询中聚合函数应用

统计职工的工资总额

1
2
SELECT SUM(sal)
FROM TEACHER

统计职工的工资总额,并显示每个职工的工资情况。

1
2
3
4
5
6
显示每个职工的工资情况。
SELECT TNo,sal
FROM TEACHER
ORDER BY TNo
统计职工的工资总额
COMPUTE SUM(sal)

统计职工的工资总额,并显示每个职工的工资情况及各部门的工资总额。

1
2
3
4
SELECT TNo,sal
FROM TEACHER
ORDER BY DNo,TNo
COMPUTE SUM(sal) BY DNo

求职工的最高工资,最低工资和平均工资

1
2
SELECT MAX(sal),MIN(sal),AVG(sal)
FROM TEACHER

求男学生的学生总数

1
2
3
SELECT COUNT(*)
FROM STUDENT
WHERE Ssex='男'

查询有多少学生的数学课成绩小于99

1
2
3
SELECT COUNT(SNo)
FROM SC,COURSE
WHERE COURSE.SNo=STUDENT.SNo AND COURSE.CName='数学' AND COURSE.Score<09

查询中分组统计GROUP BY

求每个班学生的人数

CLno:班级

1
2
3
SELECT CLno,COUNT(*)'COUNT(*)'
FROM STUDENT
GROUP BY CLno

查询每个学生已获得的学分

CCredits:学分

1
2
3
4
SELECT SNo,SUM(CCredits)
FROM SC,COURSE
WHERE SCORE>60 AND SC.CNo=COURSE.CNo
GROUP BY SNO

HAVING字句

使用HAVING字句查询学分大于8的学生,并输出学生的学号和学分

1
2
3
4
5
SELECT SNo,SUM(CCredit)
FROM SC,COURSE
WHERE SC.SCORE>60 AND SC.CNo=COURSE.CNo
GROUP BY SNO
HAVING SUM(CCredits)>8 //大于8的留下

基本连接操作

查询选修了语文课程的学生

原来的方法:

1
2
3
SELECT SNO 
FROM SC,COURSE
WHERE SC.CNo=COURSE.CNO AND COURSE.CName='语文'

也可以用连接操作:

1
2
3
SELECT A.SNo
FROM SC AS A,COURSE AS B
WHRER A.CNo=B.CNo AND CName='语文'

查询电路基础成绩不及格的学生名单(输出学生的学号、姓名及成绩)

1
2
3
SELECT STUDENT.SNo,STUDENT.SName,SC.Score
FROM SC,STUDENT
WHERE STUDENT.CNo=SC.Cno AND SC.SCore<60 AND SC.SName='基础电路'

内连接操作

查询每个学生及其选修课程的情况,并且输出其学号、姓名、所选课程号及分数

1
2
3
SELECT A.SNo,A.SName,B.CNo,B.Score
FROM STUDENT A INNER JOIN SC B
ON A.SNo=B.SNo

查询每个学生及其选修课程的情况,输出其学号、姓名、所选课程号及分数,并且按“学号”的降序排列

1
2
3
4
SELECT A.SNo,A.SName,B.CNo,B.Score
FROM STUDENT A INNER JOIN SC B
ON A.SNo=B.SNo
ORDER BY A.SNo DESC

查询在数字逻辑课之后,还有哪些课被选修(按课程编号排序)

1
2
3
SELECT B.CNo
FROM COURSE A INNER JOIN SC B
ON B.CNo>A.CNo AND A.CName='数字逻辑'

外连接操作

显示目前还没学生报道的班级

1
2
3
4
SELECT CLname 
FROM STUDENT A RIGHT OUTER JOIN CLASS B
ON A.CLno=B.CLno
WHERE SNo IS NULL

查询每个学生及选修课程的情况,并比较如下两条命令的执行结果

1
2
3
SELECT A.*,B.* 
FROM STUDENT A LEFT OUTER JOIN SC B
ON A.SNo=B.SNo
1
2
3
SELECT Student.*,SC.* 
FROM Student,SC
WHERE Student.SNo=SC.SNo

联合查询

1
2
SELECT SNo FROM SC,COURSE
WHERE CName='英语'

联合查询UNION

两种不同的用法是UNION和UNION ALL,区别在于UNION从结果集中删除重复的行。如果使用UNION ALL 将包含所有行并且将不删除重复的行。

UNION和UNION ALL的区别:

union 检查重复

union all 不做检查

比如select ‘a’ union select ‘a’ 输出就是一行 a

比如select ‘a’ union all select ‘a’ 输出就是两行 a

查询当前至少上着数学和英语其中一门课的学生

1
2
3
4
5
6
7
8
9
10
11
(
SELECT SNo
FROM SC,COURSE
WHERE CName='英语' AND SC.CNo=COURSE.CNo
)
UNION
(
SELECT SNo
FROM SC,COURSE
WHERE CName='数学' AND SC.CNo=COURSE.CNo
)

集合操作(交,叉,并)

1
2
3
4
5
6
7

1.并操作UNION
(SELECT * FROM TABLE A) UNION (SELECT * FROM TABLE B)
2.交操作INTERSECT
(SELECT * FROM TABLE A) INTERSECT(SELECT * FROM TABLE B)
3.差操作EXCEPTMINUS
(SELECT * FROM TABLE A) EXCEPT (SELECT * FROM TABLE B)

交叉连接

交叉连接就是两个表的乘积。

查询每个学生选修课程的情况,并输出其学号,姓名,所选课程号及分数。

1
2
3
SELECT Student.SNo,SName,SC.CNo,Score  
FROM Student CROSS JOIN SC
WHERE Student.SNo=SC.SNo

自连接

在表Teacher中查询职工的上级领导信息

1
2
3
SELECT B.TNo,B.TName
FROM TEACHER A INNER JOIN TEACHER B
ON A.Manager=B.TNo

查询混双选手名单。每行输出一对选手,男在前,女在后

1
2
3
4
SELECT A.Name,B.Name
FROM ATHLETE A AND ATHLETE B
ON A.GROUP=B.GROUP
WHERE A.Sex='男'

IN关键字

查询语文班的学生名单

1
2
3
SELECT Name
FROM STUDENT,CLASS
WHERE STUDENT.CLno=CLASS.CLno AND CLASS.CLName='语文'

或者

1
2
3
4
5
SELECT SName   
FROM Student
WHERE CLno IN (SELECT CLno
FROM Class_X01814031
WHERE CLname='语文')

数学高于90分的男生

1
2
3
4
5
6
7
SELECT SName
FROM Student
WHERE Sex='男' AND SNo IN(SELECT SNo
FROM SC
WHERE Score>90 AND SC.CNo INSELECT CNo
FROM Class
WHERE Class.CLname='数学'))

EXIST关键字

英语解释就是存在,不过他的意思也差不多,相当于存在量词’З’。他不返回数据的,当后带带的查询为空值是,返回“FALSE”,非空则返回“TRUE”。就因为 EXISTS 返回的是真值或假值,所以他所带的子查询一般直接用’select *’ 因为给出列名也没多少意义。

查询所有选修了1号课程的学生的名字

1
2
3
4
5
SELECT SName
FROM STUDENT
WHERE EXIST (SELECT *
FROM SC
WHERE SNo=STUDENT.SNo AND CNo='1')

NOT EXIEST关键字

和EXIST同理,长和谓词推到结合使用。

谓词推导+利用EXIST查询

查询至少选修了学生200215122选修的全部课程的学生号码。

我们首先转换一下语句:不存在任何课程该学生没选修

即:

1
2
3
4
5
6
7
8
9
SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
FROM Course
WHERE NOT EXISTS(SELECT *
FROM SC
WHERE Sno= Student.Sno AND Cno= Course.Cno
)
)

查询至少选修了学生200215122选修的全部课程的学生号码。

NYjMUU.png

NYjGvR.png

NYjtDx.png

1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS(SELECT *
FROM SC SCY
WHERE SCY.Sno = ' 200215122 '
AND
NOT EXISTS(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno)
);

查询中的比较运算符

查询其他班中比1班所有学生年龄都小的学生,并按照年龄降序输出

1
2
3
4
5
6
SELECT SName,SAge
FROM STUDENT
WHERE SAge<ALL(SELECT SAge
FROM STUDENT
WHERE CLno='1' ) AND CLno<>'1'
ORDER BY SAge DESC

子查询修改数据

对每一个班学生求平均年龄,并存输入数据库

1
2
3
4
CREATE TABLE ClassAge(CLno CHAR(6),avgage INT)  
INSERT INTO ClassAge(CLno,avgage) SELECT CLno,AVG(SAge)
FROM Student_X01814031
GROUP BY CLno

将1班所有学生成绩置为95

1
2
3
UPDATE SC_X01814031 SET Score=95 WHERE '1'=  (SELECT CLno   
FROM Student_X01814031
WHERE Student_X01814031.SNo=SC_X01814031.SNo)

创建视图

创建1班学生的视图

1
2
3
4
5
CREATE VIEW C1_STUDENT
AS
SELECT *
FROM STUDENT
WHERE CLno='1'

with check option :

约束条件是对视图里面所有的name 首字符必须是以 ‘张’字打头。不管是修改前还是修改后都必须遵从此规则。否则出错

创建姓”要”的学生的视图

1
2
3
4
5
CREATE VIEW W1_Student  
AS
SELECT SNo,SName
FROM Student_X01814031
WHERE SName LIKE '要%'WITH CHECK OPTION

创建1班选修了语文课程的学生的视图

1
2
3
4
5
6
7
8
CREATE VIEW C1(SCno,SName,Score)
AS
SELECT STUDENT.SNo, SName, Class
FROM STUDENT,SC,CLASS
WHERE STUDENT.CLname='1'
AND STUDENT.SNo=SC.SNo
AND SC.SName='语文'
AND STUDENT.CLno=CLASS.CLno

创建一个反应学生出生年份的视图:

1
2
3
4
CREATE VIEW STUDENT_Birthyear(SNo,SName,SBirth)
AS
SELECT SNo,SName,2020-SAge
FROM STUDENT

将学生的学号和平均成绩创建一个视图

1
2
3
4
5
CREATE VIEW SNO_AVG_VIEW(SNo,GRADE_avg)
AS
SELECT SNo,AVG(Score)
FROM SC
GROUP BY SNo

更新视图定义

将S_G1表中的年龄限定改为20

1
2
3
4
5
ALTER VIEW S_G1(SNo,S age)
AS
SELECT SNo,Sage
FROM STUDENT
WHERE SAge>20

删除视图

1
DROP VIEW S_G1

向视图插入新数据

向1班学生的视图插入一条记录

1
2
INSERT INTO C1_STUDENT(SNo,CLno,SName,Email)
VALUES('7','5','张三''12345@qq.com')

更新视图数据

将1班学生的视图中的学号为1的学生年龄改为23

1
2
3
UPDATE C1_STUDENT
SET SAge=23
WHERE SNo='1'

删除视图数据

将1班学生的视图中学号为1的学生删除

1
2
DELETE FROM C1_STUDENT
WHERE SNo='1'

创建索引

索引的目的:加快查询速度

索引有唯一索引(例如身份证号等),非唯一索引(例如年龄等),聚簇索引(数据库的物理结构上的概念,他使得索引顺序和物理顺序相同,提高效率)。

在STUDENT表中SNo属性创建唯一索引

1
2
USE SM_X01814031
CREATE UNIQUE INDEX StuSNo ON STUDENT(SNo)

在表Course上创建一个唯一性聚簇索引,索引排列顺序为降序

1
2
USE SM_X01814031
CREATE UNIQUE CLUSTERED INDEX IX_CNo ON COURSE(CNo DESC)

在表Course上创建一个非唯一性非聚簇索引

—drop_existing:表示如果这个索引还在表上就 drop 掉然后在 create 一个新的。 默认为 OFF。
—drop_existing=on:指定要删除并重新生成现有索引,其必须具有相同名称作为参数 index_name。
—drop_existing=off:指定不删除和重新生成现有的索引。 如果指定的索引名称已经存在,SQL Server 将显示一个错误。

1
2
3
USE SM_X01814031
CREATE NONCLUSTERED INDEX INX_CName ON COURSE(CName)
WITH DROP_EXISTING

查看索引

查看Course上的所有索引

1
2
USE SM_X01814031
EXEC SP_HELPINDEX COURSE

删除索引

删除表Course上的IX_CNo索引

1
2
USE SM_X01814031
DROP INDEX COURSE.IX_CNo

授权:授予

把查询student表的权限授给用户U1

1
2
3
GRANT SELECT
ON TABLE STUDENT
TO U1

把对Student表和Course表的全部从操作权限赋予用户U2,U3

ALL PRIVILEGES:所有权限

1
2
3
GRANT ALL PRIVILEGES
ON TABLE STUDENT,COURSE
TO U2,U3

把对标SC的查询全授予所有用户

PUBLIC : 所有用户

1
2
3
GRANT SELECT
ON TABLE SC
TO PUBLIC

把查询STUDENT表和修改学生学号的权限授予用户U4

1
2
3
GRANT UPDATE(SNo),SELECT
ON TABLE STUDENT
TO U5

把对表SC的INSERT权限授予用户U5,并允许将权限授予用户

1
2
3
4
GRANT INSERT
ON TABLE SC
TO US
WITH GRANT OPTION

授权:收回

REVOKE 权限,…

ON 对象类型 对象名,…..

FROM 用户1,用户2, ……[CASCADE/RESTRICT]

把用户U4修改学生学号的权限收回。

1
2
3
REVOKE UPDATE
ON TABLE STUDENT
FROM U4

把用户U5对SC表的INSERT权限收回

1
2
3
REVOKE INSERT
ON TABLE STUDENT
FROM U5 CASCADE

CASCADE:级联,比如U5把权力给了U6,U6又给了U7,则CASCADE会将U5,U6,U7权限一起收回,这样保证了自主存取控制的权利。如果收回权限语句中不写,也是默认CASCADE的。

授权:创建数据库模式的权限

上面两种讲述到了对用户授权和收回对数据的操作权限,对创建数据库模式一类的数据库对象的授权则应该由数据库管理员在创建用户时实现。

格式:

CREATE USER 用户名 [WITH DBA/RESOURCE/CONNECT]

DBA:可以CREATE USER /SCHEMA /TABLE /登录数据库执行数据查询

RESOURCE: 可以CREATE TABLE/登录数据库执行数据查询

CONNECT: 可以登录数据库执行查询操作

1.角色的创建:

创建一个角色R1

1
CREATE ROLE R1

2.授予用户角色权限:

使角色R1拥有student表的SELECT UPDATE INSERT权限

1
2
3
GRANT SELECT,UPDATE,INSERT
ON TABLE STUDENT
TO R1

将这个角色授予王平,张明,赵玲

1
2
GRANT R1
TO 王平,张明,赵玲

3.收回用户的角色权限

1
2
REVOKE R1
FROM 王平,张明,赵玲

4.增加角色权限

1
2
3
GRANT DELETE
ON TABLE STUDENT
TO R1

5.减少角色权限

1
2
3
REVOKE SELECT
ON TABLE STUDENT
FROM R1

审计

由于任何系统的安全保护措施都不是完美无缺的,当数据库的安全等级达到C2以上,就会拥有审计功能。

审计功能把用户对数据库的所有操作自动记录下来放入审计日志。审计员可以利用审计日志监控找出非法操作的人。

对修改SC表结构或修改SC表数据的操作进行审计

1
2
AUDIT ALTER,UPDATE
ON SC

取消对SC表的一切审计

1
2
NOAUDIT ALTER,UPDATE
ON SC

断言

断言是指通过声明性质的断言来指定更具一般性的约束。涉及断言中提到的操作时会对操作检查,如果使得断言不为真值会被拒绝执行。

创建断言的语句格式 :

CREATE ASSERTION <断言名>

例如:

限制数据库课程最多60名学生选修

1
2
3
4
5
6
CREATE ASSERTION  ASSE_SC_DB_NUM
CHECK(60>=(
SELECT COUNT(*)
FROM COURSE,SC
WHERE SC.CNO=COURSE.CNO AND COURSE.CNAME='数据库'
)

删除断言

1
DROP ASSERTION ASSE_SC_DB_NUM

触发器

触发器是指用户定义在关系表上的一类由事件驱动的特殊过程。

注:触发器在SQL99之后才被写入SQL标准。

CREATE TRIGGER <触发器名>

{BEFORE/AFTER}<触发时间> ON <表名>

REFERENCING NEW|OLD ROW AS <变量>

FOR EACH {ROW|STATEMENT}

[WHEN <触发条件> ] <触发动作体>

例:

当对表SC的Grade属性进行修改时,若分数增加10%,则将此次操作记录到另一个表SC_U( Sno,Cno,Oldgrade,NewGrade)中,其中OLDgrade是修改前的分数,Newgrade是修改后的分数。

1
2
3
4
5
6
7
8
9
CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON SC
REFERENCING
OLDROW AS Oldtuple,
NEWROW AS Newtuple
FOR EACH ROW
WHEN(Newtuple.Grade>=1.1*Oldtuple.Grade)
INSERT INTO SC_U(Sno,Cno,Oldgrade,Newgrade)
VALUES(Oldtuple.Sno,Oldtuple.Cno,Oldtuple.Grade,Newtuple.Grade)

将每次对表STUDENT的插入操作所增加的学生个数记录到表Student-InsertLog中

1
2
3
4
5
6
7
CREATE TRIGGER Student_Count
AFTER INSERT ON STUDENT
REFERENCING
NEWTABLE AS Delta
FOR EACH ROW
INSERT INTO Student_InsertLog(Numbers)
SELECT COUNT(*) FROM DELTA

定义一个BEFORE行级触发器,为教师表TEACHER定义完整性规则“教授的工资不低于4000元,如果低于4000元,自动改为4000元”

1
2
3
4
5
6
7
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT ON TEACHER
REFERENCING
NEWROW AS Newtuple
FOR EACH ROW
WHEN(Newtuple.Sal<4000 AND Newtuple.Job='教授')
Newtuple.Sal=4000

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!