SQL语句(实用篇)

来源:互联网 发布:软件编写入门 编辑:程序博客网 时间:2024/06/05 15:26

数据查询:SELECT
数据定义:CREATE,DROP,ALTER
数据操作:INSERT,UPDATE,DELETE
数据控制:GRANT(授权),REVOKE(取消授权)

模式:模式是由DBMS提供的数据模式描述语言(DDL)来描述、定义的,体现、反映了数据库系统的整体观,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
外模式:外模式反映了数据库的用户观,是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
内模式:内模式是数据库的存储观,它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式(例如,记录的存储方式是顺序存储、按照B树结构存储还是按hash方法存储;索引按照什么方式组织;数据是否压缩存储,是否加密;数据的存储记录结构有何规定)

基本表:本身独立存在的表,在SQL中一个关系就对应一个基本表,一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。

视图:一个或几个基本表导出的表,数据库中只存放视图的定义而不存放视图对应的数据,视图是一个虚表,用户可以在视图上再定义视图。

数据库的创建:CREATE DATABASE <数据库名>;

模式的定义与删除
定义模式:CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
例子:1、CREATE SCHEMA “S-T” AUTHORIZATION WANG;2、CREATE SCHEMA AUTHORIZATION WANG;
解释:没有指定<模式名>的语句,默认模式名与用户名相同。
扩展:可以在创建模式的同时在这个模式定义 中进一步创建基本表,视图,定义授权,CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [ <表定义字句> | <视图定义子句> | <授权定义字句> ]

删除模式:DROP SCHEMA <模式名> < CASCADE | RESTRICT>
解释:CASCADE 与 RESTRICT 二选一,选择CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部一起删除;RESTRICT(限制),表示如果该模式中以及定义了下属的数据库对象,则拒绝该删除语句的执行。
例子:DROP SCHEMA ZHANG CASCADE

备注:SCHEMA是一个名字空间,创建在某个DATABASE下的;一个DATABASE下可以包含多个SCHEMA。SCHEMA的好处有三点:
1. 多个用户使用同一个数据库而不会相互影响。
2. 对数据库中的对象进行逻辑分组,更便于管理。
3. 各个应用分别使用各自的模式,以避免命名冲突。

另外。关于SCHEMA、DATABASE的定义各个数据库产品解释和实现不尽相同,需要具体情况具体分析。

基本表的定义、删除与修改
定义基本表:CREATE TABLE <表名> ( <列名> <数据类型> [列级完整性约束条件],<列名> <数据类型> [列级完整性约束条件] ··· <列名> <数据类型> [列级完整性约束条件] );
例子:CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname SCHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT. Sdept CHAR(20) );

CHAR(n):长度为n的定长字符串
VARCHAR(n):最大长度为n的变长字符串
INT:长整数(也可以写作INTEGER)
SMALLINT:短整数
NUMERIC(p , d):定点数,由p位数据(不包含符号,小数点)组成,小数后面有d位数字
REAL:取决于机器精度的浮点数
Double Precision:取决于机器精度的双精度浮点数
FLOAT(n):浮点数,精度至少为n位数字
DATE:日期,包含年、月、日,格式为YYYY-MM-DD
TIME:时间,包含一日的时、分、秒,格式为HH-MM-SS

修改基本表:ALTER TABLE <表名> [ADD <新列名> <数据类型> [完整性约束] ] [DROP COLUMN <列名>] [ALTER COLUMN <列名> <数据类型>];
解释:ADD子句用于增加新列和新的完整性约束条件;DROP COLUMN子句用于删除指定的列,ALTER COLUMN子句用于修改原有的列定义。
例子:ALTER TABLE Student ADD S_entrance DATE; ALTER TABLE Student ALTER COLUMN Sage INT; ALTER TABLE Course ADD UNIQUE (Cname);

删除基本表:DROP TABLE <表名> [RESTRICT | CASCADE]
解释:选择RESTRICT则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器,不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除;若选择CASCADE则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图,都将被删除。
例子:DROP TABLE Student CASCADE;

索引的建立与删除
建立索引:CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>] [, <列名> [<次序>]] ··· )
解释:<表名>是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC(升序)或DESC(降序),缺省值为ASC,UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。CLUSTER表示要建立的索引时聚簇索引。所谓的聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。在一个表中最多只能建立一个聚簇索引。
例子:CREATE CLUSTER INDEX Stusname ON Student (Sname);

删除索引:DROP INDEX <索引名>;
例子:DROP INDEX Stusname;
备注:RDBMS中索引一般采用B+树,HASH索引来实现。B+树索引具有动态平衡的优点,HASH索引具有查找速度快的特点。索引是关系数据库的内部实现技术,属于内模式的范畴。

数据查询
一般格式:SELECT [ALL | DISTINCT] <目标列表达式> [, <目标列表达式>] ··· FROM <表名或视图名> [, <表名或视图名>] ··· [WHERE <条件表达式>] [GROUP BY <列名1> [HIVING <条件表达式>]] [ORDER BY <列名2> [ASC | DESC]];
解释:整个SELECT语句的含义是,根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性形成结果表。如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带有HIVING短语,则只有满足指定条件的组才予以输出。如果有ORDER BY子句,则结果表还要按<列名2>的值的升序或降序排序。

单表查询:仅一个表的查询
例子:SELECT Sno, Sname FORM Student; SELECT * FROM Student; SELECT Sname, 2004 - Sage FROM Student; SELECT Sname, ‘Year of Birth: ‘, 2004 - Sage, LOWER(Sdept) FROM Student; SELECT Sname NAME, ‘Year of Birth: ’ BIRTH, 2004-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT;
解释:<目标列表达式>的顺序可以不同,可以为*,甚至不仅仅可以是表中的属性列,还可以是表达式(算数表达式,字符串常量,函数等),用户通过指定别名来改变查询结果的列标题,这对于含算数表达式,常量,函数名的目标列表达式尤为有用。

选择表中的若干元组
消除取值重复的行:SELECT DISTINCT Sno FROM SC
解释:如果想去掉查询结果中的重复行,必须指定DISTINCT关键词,如果没有指定DISTINCT关键词,则缺省为ALL,即保留结果表中取值重复的行。

查询满足条件的元组
常用的查询条件
比较: =,>,<,>=,<=,!=,<>,!>,!<;NOT + 上述比较运算符
确定范围:BETWEED AND,NOT BETWEEN AND;(BETWEED是包含上下范围,都包含)
确定集合:IN,NOT IN
字符串匹配:LIKE,NOT LIKE
空值:IS NULL,IS NOT NULL
多重条件(逻辑运算):AND,OR,NOT

例子
比较大小:SELECT Sname FROM Student WHERE Sdept = ‘CS’;
确定范围:SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;(包含20和23)
确定集合:SELECT Sname, Ssex FROM Student WHERE Sdept IN (‘CS’,’MA’,’IS’);
字符匹配:SELECT * FROM Student WHERE Sname LIKE ‘刘%’; 谓词LIKE可以用来进行字符串的匹配,其一般语法格式:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’];<匹配串>可以是一个完整的字符串,也可以含有通配符%和_ ,其中%代表任意长度的字符串,_代表任意单个字符。
涉及空值查询:SELECT Sno,Cno FROM SC WHERE Grade IS NULL;(涉及到空的时候,不能使用等于号,而应该使用IS)
多重条件查询:SELECT Sname FROM Student WHERE Sdept = ‘CS’ AND Sage < 20; 逻辑运算符AND和OR可用来连接多个查询条件。AND的优先级高于OR,单用户可以用括号来改变优先级。

ORDER BY子句
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排序,缺省值为升序。
例子:SELECT Sno,Grade FROM SC WHERE Cno = ‘3’ ORDER BY Grade DESC; SELECT * FROM Student ORDER BY Sdept, Sage DESC;

聚集函数
COUNT ([DISTINCT | ALL] *):统计元组的个数
COUNT ([DISTINCT | ALL] <列名>):统计一列中值的个数
SUM ([DISTINCT | ALL] <列名>):计算一列值的总和(此列必须是数值型)
AVG ([DISTINCT | ALL] <列名>):计算一列值的平均值(此列必须是数值型)
MAX ([DISTINCT | ALL] <列名>):求一列值中的最大值
MIN ([DISTINCT | ALL] <列名>):求一列值中的最小值
如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。
例子:SELECT COUNT(*) FROM Student; SELECT COUNT(DISTINCT Sno) FROM SC; SELECT AVG(Grade) FROM SC WHERE Cno = ‘1’; SELECT SUM(Gcredit) FROM SC, Course WHERE Sno = ‘2014’ AND SC.Cno = Course.Cno;

GROUP BY子句
将查询结果按某一列或多列的值分组,值相等的为一组。对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。
例子:SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;
分组之后还要求按照一定的条件度这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >3
解释:这里先用GROUP BY子句按Sno进行分组,再用聚集函数COUNT对每一组计数。HAVING短语给出了选择组的条件,只有满足条件(即元组个数>3,表示此学生选修的课程超过3门)的组才会被选出来。
WHERE子句与HIVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组,HIVING短语作用于组,从中选择满足条件的组。

连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询。包括等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外链接查询和复合条件连接查询等。

等值与非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件成为连接条件或连接谓词,其一般格式为:[<表名1>.] <列名1> <比较运算符> [<表名2>.] <列名2>;此外连接谓词还可以使用如下格式:[<表名1>.] <列名1> BETWEEN [<表名2>.] <列名2> AND [<表名2>.] <列名3>;当连接运算符为=时,称为等值连接,使用其他运算符称为非等值连接。连接谓词中的列名称为连接字段,连接条件中的个链接字段类型必须是可以比较的,但是名字可以不同。
例子:SELECT Student. , SC. FROM Student, SC WHERE Student.Sno = SC.Sno;(等值连接中可以存在重复列)

自然连接
若将等值连接中把目标列中重复的属性列去掉则为自然连接
例子:SELECT Student.Sno, Sname, Ssex, Sdept, Cno, Grade FROM Student, SC WHERE Student.Sno = SC.Sno;

自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与自己进行连接,成为表的自身连接。
例子:SELECT FIRST.Cno, SECOND.Cpno FROM Course FIRST, Course SECOND WHERE FIRST.Cpno = SECOND.Cno;

外链接
例子:SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno = SC.Sno);

复合条件连接
例子:SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND SC.Cno = ‘2’ AND SC.Grade > 90;
SELECT Student.Sno, Sname, Cname, Grade FROM Student, SC, Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;

嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块,讲一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。特别指出子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。
例子:SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = ‘2’);

带有IN谓词的子查询
例子:SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname = “刘成”);
解释:本例中子查询的查询条件不依赖父查询,称为不相关子查询,一种求解的方法是有里向外处理,即先执行子查询,子查询的结果用于建立其父查询的查询条件

带有比较运算符的子查询
是指父查询与子查询之间用比较运算符进行连接。当用户确切知道内层查询返回的是单值时,可以用>,<,=,<=,>=,!=或<>等比较运算符。特别注意,在ORACLE中子查询一定要跟在比较符后面。
例子:SELECT Sno, Cno FROM SC x WHERE Grade >= (SELECT AVG(Grade) From SC y WHERE y.Sno = x.Sno);
解释:x是表SC的别名,又称为元组变量,可以用来表示SC的一个元组。内层查询是求一个学生所有选修课程平均成绩的,至于是哪个学生的平均成绩要看参数x.Sno的值,而该值是与父查询相关的,因此这类查询称为相关子查询。

带有ANY(SOME)或ALL谓语的子查询
子查询返回单值时可以使用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。而使用ANY或ALL谓词时则必须同时使用比较运算符。其语义:
大于子查询结果中的某个值 > ANY
大于子查询结果中的所有值 > ALL
小于子查询结果中的某个值 > ANY
小于子查询结果中的所有值 > ALL
大于等于子查询结果中的某个值 >= ANY
大于等于子查询结果中的所有值 >= ALL
小于等于子查询结果中的某个值 >= ANY
小于等于子查询结果中的所有值 >= ALL
等于子查询结果中的某个值 = ANY
等于子查询结果中的所有值 = ALL (通常没有实际意义)
不等于子查询结果中的某个值 !=(或<>) ANY
不等于子查询结果中任何一个值 !=(或<>) ALL
例子:SELECT Sname, Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept = ‘CS’) AND Sdept <> ‘CS’;

带有EXISTS谓词的子查询
EXISTS代表存在量词。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值”true“或逻辑假值”false“。
例子:SELECT Sname FROM Student WHERE (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = ‘1’);
解释:由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。

集合查询
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可以进行集合操作,集合操作主要包括并操作UNION,交操作INTERSECT和差操作EXCEPT。注意参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
例子:SELECT * FROM Student WHERE Sdept = ‘CS’ UNION SELECT * FROM Student WHERE Sage <= 19;
解释:使用UNION将多个查询结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则用UNION ALL操作符

数据更新
插入数据使用插入语句INSERT,通常有两种,一种是插入一个元组,另一种是插入子查询结果,后者一次插入多个元组。

插入元组:INSERT INTO <表名> (<属性列1> [, <属性列2> ···] ) VALUES (<常量1> [, <常量2>] ···);
解释:若INTO子句中没有出现的属性列,新元组在这些列上将取空值。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。
例子:INSERT INTO Student (Sno, Sname, Ssex, Sdept, Sage) VALUES (‘2016473’, ‘苏安’, ‘男’, ‘IS’, 18);
在INTO子句中指出了表名Student,指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样。VALUE子句对新元组的各属性赋值,字符串常数要用单引号括起来。
例子:INSERT INTO Student VALUES (‘2016473’,’苏安’,’男’,18,’CS’);
解释:该例子中没有指出属性名,这表示新元组要在表的所有属性列上都指定值,属性列的次序与CREATE TABLE中的次序相同。VALUES子句对新元组的各属性列赋值,一定要注意值与属性列要一一对应。

插入子查询结果:INSERT INTO <表名> (<属性列1> [, <属性列2> ···] ) 子查询;
例子:INSERT INTO Dept_age (Sdept, Avg _ age) SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept;

修改数据:UPDATE <表名> SET <列名> = <表达式> [, <列名> = <表达式>] ··· [WHERE <条件>] ;
例子:UPDATE Student SET Sage = 22 WHERE Sno = ‘2016473’;

修改多个元组的值:UPDATE Student SET Sage = Sage + 1;

带子查询的修改语句:UPDATE SC SET Grade = 0 WHERE ‘CS’ = (SELECT Sdept FROM Student WHERE Student.Sno = SC.Sno);

删除数据:DELETE FROM <表名> [WHERE <条件>];
解释:DELETE 语句的功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句,表示删除表中全部元组,但表的定义仍在字典中,也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义。

删除某一个元组的值:DELETE FROM Student WHERE Sno = ‘2016473’;

删除多个元组的值:DELETE FROM SC;

带子查询的删除语句:DELETE FROM SC WHERE ‘CS’ = (SELECT Sdept FROM Student WHERE Student.Sno = SC.Sno);

视图:是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。视图一经定义,就可以和基本表一样被查询,被删除。也可以在一个视图上再定义新的视图,但对视图的更新(增删改)操作则有一定的限制。

定义视图:CREATE VIEW <视图名> [(<列名> [, <列名>] ···)] AS <子查询> [WITH CHECK OPTION];
解释:子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语;WITH CHECK OPTION 表示对视图进行UPDATE, INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但是在下面三中情况下必须明确指定组成视图的所有列名:1、某个目标列不是单纯的属性名,而是聚集函数或列表达式;2、多表连接时选出了几个同名列作为视图的字段;3、需要在视图中为某个列启用新的更合适的名字;

例子:CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept = ‘IS’;
解释:本例中省略了视图IS_Student的列名,隐含了由子查询中SELECT子句中的三个列名组成。RDBMS执行CREATE VIEW语句的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句。只是在对视图查询时,才按视图的定义从基本表中将数据查出。

例子:CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage, FROM Student WHERE Sdept ‘IS’ WITH CHECK OPTION;
解释:由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept=’IS’的条件。若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图。

列子:CREATE VIEW IS_S1 (Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Grade FROM Student, SC WHERE Sdept = ‘IS’ AND Student.Sno = SC.Sno AND SC.Cno = ‘1’;
解释:由于视图IS_S1的属性列中包含了Student表与SC表的同名列Sno,所以必须在视图名后面明确说明视图的各个属性列名。

例子:CREATE VIEW IS_S2 AS SELECT Sno, Sname, Grade FROM IS _ S1 WHERE Grade >= 90;
解释:视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上。

例子:CREATE VIEW BT_S (Sno, Sname, Sbirth) AS SELECT Sno, Sname, 2004-Sage FROM Student;
解释:定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。但由于视图中数据并不实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列。这些派生属性由于在基本表中并不实际存在也称他们为虚拟列,带虚拟列的视图也成为带表达式的视图。

例子:CREATE VIEW S_G (Sno, Gavg) AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;
解释:还可以用带有聚集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图

删除视图:DROP VIEW <视图名> [CASCADE];
解释:视图删除后视图的定义将从数据字典中删除,如果该视图上还导出了其他视图,则使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除。基本表删除后,由该基本表导出的所有视图(定义)没有被删除,但均已无法使用了,删除这些视图(定义)需要显示地使用DROP VIEW语句。
例子:DROP VIEW IS_S1 CASCADE;

查询视图:RDBMS执行对视图的查询时,首先进行有效性检查。检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后在执行修正了的查询。这一转换过程称为视图消解。

更新视图:更新视图是指通过视图来插入、删除、修改数据。由于视图是不实际存储数据的虚表,因此对视图的更新,最终要转换成对基本表的更新,像查询视图那样,对视图的更新操作也是通过视图消解,转换为堆基本表的更新操作。为防止用户通过视图对数据进行增加、删除、修改时,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句。这样在视图上增删改数据时,RDBMS会检查视图定义中的条件,若不满足条件,则拒绝执行该操作。

特别DB2中规定:
1、若视图是由两个以上的基本表导出的,则此视图不允许更新
2、若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作
3、若视图的字段来自聚集函数,则此视图不允许更新
4、若视图定义中含有GROPU BY子句,则此视图不允许更新
5、若视图定义中含有DISTINCT短语,则此视图不允许更新
6、若视图定义中嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新
7、一个不允许更新的视图上定义的视图也不允许更新

视图的作用:
1、视图能够简化用户的操作
2、视图使用户能以多种角度看待同一数据
3、视图对重构数据库提供了一定程度的逻辑独立性
4、视图能够对机密数据提供安全保护
5、适当的利用视图可以更清晰的表达查询

授权:GRANT <权限> [, <权限>] ··· ON <对象类型> <对象名> [, <对象类型> <对象名>] ··· TO <用户> [, <用户>] ··· [WITH GRANT OPTION];
解释:如果授权时带有 WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限在授予其他用户。

撤销授权:REVOKE <权限> [,<权限>] ··· ON <对象类型> <对象名> [,<对象类型> <对象名>] ··· FROM <角色> [,<角色>]

数据库完整性
1、实体完整性:主码的值是否唯一,是否为NULL
2、参照完整性:增删改时,关注外码
3、用户定义完整性:列值非空,列值唯一,检查列值是否满足一个布尔表达式(CHECK 短语)

完整性约束命名子句:CONSTRAINT <完整性约束条件名> [PRIMARY KEY 短语 | FOREIGN KEY 短语 | CHECK 短语]

触发器:是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增删改操作均有服务器自动激活相应的触发器。
创建:CREATE TRIGGER <触发器名> {BEFORE | AFTER} <触发事件> ON <表名> FOR EACH {ROW | STATEMENT} [WHEN <触发条件>] <触发动作体>
解释:在同一模式下触发器名唯一,且触发器名和表名在同一模式下;触发事件可以是INSERT、DELETE、UPDATE,也可以是这几个事件的组合,INSERT OR DELETE等,UPDATE后面还可以有OF <触发列,··· >,即进一步指明修改那些列时触发器激活;FOR EACH ROW 行级触发器、FOR EACH STATEMENT 语句级触发器;触发器被激活时,只有当触发条件为真时触发动作才执行,否则触发动作不执行,如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行;触发动作体既可以是一个匿名的PL/SQL过程块,也可以是对己创建存储过程的调用,如果是行级触发器,在两种情况下,用户都可以在过程体中使用NEW与OLD引用UPDATE/INSERT事件之后的新值和UPDATE/DELETE事件之前的旧值。如果是语句级触发器,则不能在触发动作体中使用NEW或OLD进行引用。
备注:执行触发器顺序如下:BEFORE–>SQL–>AFTER,同一顺序下的触发器,采取“谁先创建谁先执行”的原则。
删除:DROP TRIGGER <触发器名> ON <表名>;

0 0
原创粉丝点击