《数据库系统概论》学习总结
附件二(基本SQL语句知识点概要)
SQL功能极强,完成核心功能只用了9个动词
 SQL 功 能 动 词
 数 据 查 询 SELECT(选择)
 数 据 定 义 CREATE,DROP,ALTER(创建、删除、更改)
 数 据 操 纵 INSERT,UPDATE,DELETE(插入,更新,删除)
 数 据 控 制 GRANT,REVOKE(准予、撤销)
SQL的数据定义功能: 模式定义、表定义、视图和索引的定义
 SQL的数据定义语句
 操 作 对 象 操 作 方 式
 创 建 删 除 修 改
 模式 CREATE SCHEMA DROP SCHEMA 
 表 CREATE TABLE DROP TABLE ALTER TABLE
 视 图 CREATE VIEW DROP VIEW 
 索 引 CREATE INDEX DROP INDEX
定义模式实际上定义了一个命名空间:
 在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。
 在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
 例:CREATE SCHEMA TEST AUTHORIZATION ZHANG
 CREATE TABLE TAB1;
 如果没有指定<模式名>,那么<模式名>隐含为<用户名>
删除模式:
 DROP SCHEMA <模式名> <CASCADE|RESTRICT>
 CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除
 RESTRICT(限制):如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。当该模式中没有任何下属的对象时才能执行。
 例:DROP SCHEMA ZHANG CASCADE;删除模式ZHANG,同时该模式中定义的表TAB1也被删除。
一、定义基本表
 CREATE TABLE <表名>
 (<列名> <数据类型>[ <列级完整性约束条件> ]
 [,<列名> <数据类型>[ <列级完整性约束条件>] ] …
 [,<表级完整性约束条件> ] );
 如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
 [例] 建立“学生”表Student,学号是主码,姓名取值唯一。
CREATE TABLE Student          
      (Sno   CHAR(9) PRIMARY KEY,/* 列级完整性约束条件*/                  
        Sname  CHAR(20) UNIQUE,     /* Sname取唯一值*/
        Ssex    CHAR(2),
        Sage   SMALLINT,  /*SMALLINT短整型;半字长整数*/
        Sdept  CHAR(20)
       ); 
[例] 建立一个“课程”表Course
 CREATE TABLE Course
 ( Cno CHAR(4) PRIMARY KEY,
 Cname CHAR(40),
 Cpno CHAR(4) , 
 Ccredit SMALLINT,
 FOREIGN KEY (Cpno) REFERENCES Course(Cno)
 /Cpno是外码,被参照表是Course,被参照列是Cno/
 );
 [例] 建立一个“学生选课”表SC
 CREATE TABLE SC
 (Sno CHAR(9),
 Cno CHAR(4),
 Grade SMALLINT,
 PRIMARY KEY (Sno,Cno),
 /* 主码由两个属性构成,必须作为表级完整性进行定义*/
 FOREIGN KEY (Sno) REFERENCES Student(Sno),
 /* 表级完整性约束条件,Sno是外码,被参照表是Student /
 FOREIGN KEY (Cno) REFERENCES Course(Cno)
 / 表级完整性约束条件, Cno是外码,被参照表是Course*/
 );
SQL中域的概念用数据类型来实现
 定义表的属性时 需要指明其数据类型及长度
 数据类型 含义
 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
 
 
 
 
 DROP TABLE时,SQL99 与 3个RDBMS的处理策略比较:
 
 R表示RESTRICT , C表示CASCADE
 '×’表示不能删除基本表,'√’表示能删除基本表,‘保留’表示删除基本表后,还保留依赖对象
谁可以建立索引
 DBA 或 表的属主(即建立表的人)
 DBMS一般会自动建立以下列上的索引
 PRIMARY KEY
 UNIQUE
 谁 维护索引
 DBMS自动完成
 使用索引
 DBMS自动选择是否使用索引以及使用哪些索引
RDBMS中索引一般采用B+树、HASH索引来实现
 B+树索引具有动态平衡的优点
 HASH索引具有查找速度快的特点
 采用B+树,还是HASH索引 则由具体的RDBMS来决定
 索引是关系数据库的内部实现技术,属于内模式的范畴
 CREATE INDEX语句定义索引时,可以定义索引是唯一索引、非唯一索引或聚簇索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
 ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
 用<表名>指定要建索引的基本表名字
 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
 用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
 UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
 CLUSTER表示要建立的索引是聚簇索引
[例13] CREATE CLUSTER INDEX Stusname
 ON Student(Sname);
 在Student表的Sname(姓名)列上建立一个聚簇索引
 Student表中的记录将按照Sname值的升序存放
 在最经常查询的列上建立聚簇索引以提高查询效率
 一个基本表上最多只能建立一个聚簇索引
 经常更新的列不宜建立聚簇索引
唯一值索引
 对于已含重复值的属性列不能建UNIQUE索引
 对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束
数据查询:
 语句格式:
 SELECT [ALL|DISTINCT] <目标列表达式>
 [,<目标列表达式>] …
 FROM <表名或视图名>[, <表名或视图名> ] …
 [ WHERE <条件表达式> ]
 [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
 [ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT子句:指定要显示的属性列
 FROM子句:指定查询对象(基本表或视图)
 WHERE子句:指定查询条件
 GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
 HAVING短语:筛选出只有满足指定条件的组
 ORDER BY子句:对查询结果表按指定列值的升序或降序排序
SELECT子句的<目标列表达式>可以为:算术表达式,字符串常量,函数,列别名
消除取值重复的行:如果没有指定DISTINCT关键词,则缺省为ALL
 指定DISTINCT关键词,去掉表中重复的行
 SELECT DISTINCT Sno
 FROM SC;
 注意 DISTINCT短语的作用范围是所有目标列
 例:查询选修课程的各种成绩
 错误的写法
 SELECT DISTINCT Cno,DISTINCT Grade
 FROM SC;
 正确的写法
 SELECT DISTINCT Cno,Grade
 FROM SC;
常用的查询条件:
 查 询 条 件 谓 词
 比 较 =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
 确定范围 BETWEEN AND,NOT BETWEEN AND
 确定集合 IN,NOT IN
 字符匹配 LIKE,NOT LIKE
 空 值 IS NULL,IS NOT NULL
 多重条件(逻辑运算) AND,OR,NOT( AND的优先级高于OR)
谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
 <匹配串>:指定匹配模板
 匹配模板:固定字符串或含通配符的字符串
 当匹配模板为固定字符串时,
 可以用 = 运算符取代 LIKE 谓词
 用 != 或 < >运算符取代 NOT LIKE 谓词
 通配符:
 % (百分号) 代表任意长度(长度可以为0)的字符串
 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
 _ (下横线) 代表任意单个字符
 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义。
例: 匹配串为含通配符的字符串:
 [例15] 查询所有姓刘学生的姓名、学号和性别。
 SELECT Sname,Sno,Ssex
 FROM Student
 WHERE Sname LIKE ‘刘%’;
 [例16] 查询姓"欧阳"且全名为三个汉字的学生的姓名。
 SELECT Sname
 FROM Student
 WHERE Sname LIKE ‘欧阳__’;
 [例17] 查询名字中第2个字为"阳"字的学生的姓名和学号。
 SELECT Sname,Sno
 FROM Student
 WHERE Sname LIKE ‘__阳%’;
 [例18] 查询所有不姓刘的学生姓名。
 SELECT Sname,Sno,Ssex
 FROM Student
 WHERE Sname NOT LIKE ‘刘%’;
使用换码字符将通配符转义为普通字符:
 [例19] 查询DB_Design课程的课程号和学分。
 SELECT Cno,Ccredit
 FROM Course
 WHERE Cname LIKE ‘DB_Design’ ESCAPE '\‘;
谓词: IS NULL 或 IS NOT NULL:
 “IS” 不能用 “=” 代替
 [例21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
 SELECT Sno,Cno
 FROM SC
 WHERE Grade IS NULL
ORDER BY子句:
 ASC:排序列为空值的元组最后显示
 DESC:排序列为空值的元组最先显示
例:
 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
 SELECT *
 FROM Student
 ORDER BY Sdept,Sage DESC;
 (Sdept缺省默认为升值)
聚集函数:
 计数
 COUNT([DISTINCT|ALL] *)
 COUNT([DISTINCT|ALL] <列名>)
 计算总和
 SUM([DISTINCT|ALL] <列名>) 
 计算平均值
 AVG([DISTINCT|ALL] <列名>)
 最大最小值
 MAX([DISTINCT|ALL] <列名>)
 MIN([DISTINCT|ALL] <列名>)
例:
 [例28] 计算1号课程的学生平均成绩。
 SELECT AVG(Grade)
 FROM SC
 WHERE Cno= ‘ 1 ’;
 [例29] 查询选修1号课程的学生最高分数。
 SELECT MAX(Grade)
 FROM SC
 WHERE Cno= ‘ 1 ’;
GROUP BY子句分组:
 细化聚集函数的作用对象
 未对查询结果分组,聚集函数将作用于整个查询结果
 对查询结果分组后,聚集函数将分别作用于每个组
 作用对象是查询的中间结果表
 按指定的一列或多列值分组,值相等的为一组
[例31] 求各个课程号及相应的选课人数。
 SELECT Cno,COUNT(Sno)
 FROM SC
 GROUP BY Cno;
 查询结果:
 Cno COUNT(Sno)
 1 22
 2 34
 3 44
 4 33
 5 48
 [例32] 查询选修了3门以上课程的学生学号。
 SELECT Sno
 FROM SC
 GROUP BY Sno
 HAVING COUNT(*) >3;
***HAVING短语与WHERE子句的区别:
 作用对象不同
 WHERE子句作用于基表或视图,从中选择满足条件的元组
 HAVING短语作用于组,从中选择满足条件的组。
连接查询:同时涉及多个表的查询
 连接字段:连接谓词中的列名称
 连接条件中的各连接字段类型必须是可比的,但名字不必是相同的
嵌套循环法(NESTED-LOOP)
 排序合并法(SORT-MERGE)
 索引连接(INDEX-JOIN)
等值连接:连接运算符为=
 [例33] 查询每个学生及其选修课程的情况
 SELECT Student.,SC.
 FROM Student,SC
 WHERE Student.Sno = SC.Sno;
 (这个时候仍然带着Student.Sno 和SC.Sno)
自然连接:
 [例34] 对[例33]用自然连接完成。
 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
 FROM Student,SC
 WHERE Student.Sno = SC.Sno;
自身连接:一个表与其自己进行连接
 需要给表起别名以示区别
 由于所有属性名都是同名属性,因此必须使用别名前缀
 [例35]查询每一门课的间接先修课(即先修课的先修课)
 SELECT FIRST.Cno,SECOND.Cpno
 FROM Course FIRST,Course SECOND
 WHERE FIRST.Cpno = SECOND.Cno;
 
 
 外连接与普通连接的区别
 普通连接操作只输出满足连接条件的元组
 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
 [例 36] 改写[例33]
 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
 FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
 
 左外连接:
 列出左边关系(如本例Student)中所有的元组
 右外连接:
 列出右边关系中所有的元组
复合条件连接:WHERE子句中含多个连接条件
嵌套查询概述:
 一个SELECT-FROM-WHERE语句称为一个查询块
 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
 子查询的限制:
 不能使用ORDER BY子句
 层层嵌套方式反映了 SQL语言的结构化
 有些嵌套查询可以用连接运算替代
 例:
 SELECT Sname	 /*外层查询/父查询*/
 FROM Student
 WHERE Sno IN
       		(SELECT Sno     /*内层查询/子查询*/
              FROM SC
              WHERE Cno= ' 2 ');
相关子查询:子查询的查询条件依赖于父查询
 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
 然后再取外层表的下一个元组
 重复这一过程,直至外层表全部检查完为止
一、带有IN谓词的子查询
 二、 带有比较运算符的子查询
 三、 带有ANY(SOME)或ALL谓词的子查询
 四、 带有EXISTS谓词的子查询
 例:
 [例41]找出每个学生超过他选修课程平均成绩的课程号。
 SELECT Sno, Cno
 FROM SC x
 WHERE Grade >=(SELECT AVG(Grade)
 FROM SC y
 WHERE y.Sno=x.Sno);
 
 
EXISTS谓词:
 存在量词
 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
 若内层查询结果非空,则外层的WHERE子句返回真值
 若内层查询结果为空,则外层的WHERE子句返回假值
 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
[例44]查询所有选修了1号课程的学生姓名。
 思路分析:
 本查询涉及Student和SC关系
 在Student中依次取每个元组的Sno值,用此值去检查SC关系
 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ‘1’,则取此Student.Sname送入结果关系
 用嵌套查询:
 SELECT Sname
 FROM Student
 WHERE EXISTS
 (SELECT *
 FROM SC
 WHERE Sno=Student.Sno AND Cno= ’ 1 ');
 用连接运算:
 SELECT Sname
 FROM Student, SC
 WHERE Student.Sno=SC.Sno AND SC.Cno= ‘1’;
不同形式的查询间的替换:
 一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换
 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换
用EXISTS/NOT EXISTS实现全称量词(难点)
 SQL语言中没有全称量词 (For all)
 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
 (x)P ≡ ( x( P))
 [例46] 查询选修了全部课程的学生姓名。(经典例题 难点)
 SELECT Sname
 FROM Student
 WHERE NOT EXISTS
 (SELECT *
 FROM Course
 WHERE NOT EXISTS
 (SELECT *
 FROM SC
 WHERE Sno= Student.Sno
 AND Cno= Course.Cno
 )
 );
 用EXISTS/NOT EXISTS实现逻辑蕴函(难点)
 SQL语言中没有蕴函(Implication)逻辑运算
 可以利用谓词演算将逻辑蕴函谓词等价转换为:
 p q ≡ p∨q
集合查询:
集合操作的种类:
并操作UNION:
 UNION:将多个查询结果合并起来时,系统自动去掉重复元组。
 UNION ALL:将多个查询结果合并起来时,保留重复元组
 ‘OR’
交操作INTERSECT
 ‘AND’
差操作EXCEPT
 参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
数 据 更 新 :
插入数据:
 两种插入数据方式:
- 插入元组
- 插入子查询结果
 可以一次插入多个元组
插入元组:
 语句格式
 INSERT
 INTO <表名> [(<属性列1>[,<属性列2 >…)]
 VALUES (<常量1> [,<常量2>] … )
插入子查询结果:
 语句格式
 INSERT
 INTO <表名> [(<属性列1> [,<属性列2>… )]
 子查询;
 例:
 [例4] 对每一个系,求学生的平均年龄,并把结果存入数据库。
第一步:建表
 CREATE TABLE Dept_age
 (Sdept CHAR(15), /* 系名*/
 Avg_age SMALLINT); /学生平均年龄/
第二步:插入数据
 INSERT
 INTO Dept_age(Sdept,Avg_age)
 SELECT Sdept,AVG(Sage)
 FROM Student
 GROUP BY Sdept;
RDBMS在执行插入,修改语句时会检查所插元组是否破坏表上已定义的完整性规则:
 实体完整性
 参照完整性
 用户定义的完整性
 NOT NULL约束
 UNIQUE约束
 值域约束
修改数据:
 语句格式:
 UPDATE <表名>
 SET <列名>=<表达式>[,<列名>=<表达式>]…
 [WHERE <条件>];
 SET子句
 指定修改方式
 要修改的列
 修改后取值
 WHERE子句
 指定要修改的元组
 缺省表示要修改表中的所有元组
三种修改方式:
- 修改某一个元组的值
- 修改多个元组的值
- 带子查询的修改语句
[例5] 将学生200215121的年龄改为22岁
 UPDATE Student
 SET Sage=22
 WHERE Sno=’ 200215121 ';
[例6] 将所有学生的年龄增加1岁
 UPDATE Student
 SET Sage= Sage+1;
删除数据:
 语句格式
 DELETE
 FROM <表名>
 [WHERE <条件>];
 WHERE子句
 指定要删除的元组
 缺省表示要删除表中的全部元组,表的定义仍在字典中
三种删除方式:
- 删除某一个元组的值
- 删除多个元组的值
- 带子查询的删除语句
视 图:
 视图的特点
 虚表,是从一个或几个基本表(或视图)导出的表
 只存放视图的定义,不存放视图对应的数据
 基表中的数据发生变化,从视图中查询出的数据也随之改变
基于视图的操作:
 查询
 删除
 受限更新
 定义基于该视图的新视图
建立视图:
 语句格式:
 CREATE VIEW
 <视图名> [(<列名> [,<列名>]…)]
 AS <子查询>
 [WITH CHECK OPTION];
 组成视图的属性列名:全部省略或全部指定
 子查询不允许含有ORDER BY子句和DISTINCT短语
全部省略或全部指定
 省略:由子查询中SELECT目标列中的诸字段组成
 明确指定视图的所有列名:
 (1) 某个目标列是集函数或列表达式
 (2) 目标列为 *
 (3) 多表连接时选出了几个同名列作为视图的字段
 (4) 需要在视图中为某个列启用新的更合适的名字
例:
 基于多个基表的视图:
 [例3] 建立信息系选修了1号课程的学生视图。
 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’;
基于视图的视图:
 [例4] 建立信息系选修了1号课程且成绩在90分以上的学生的视图。
 CREATE VIEW IS_S2
 AS
 SELECT Sno,Sname,Grade
 FROM IS_S1
 WHERE Grade>=90;
分组视图:
 [例6] 将学生的学号及他的平均成绩定义为一个视图
 假设SC表中“成绩”列Grade为数字型
 CREAT VIEW S_G(Sno,Gavg)
 AS
 SELECT Sno,AVG(Grade)
 FROM SC
 GROUP BY Sno;
不指定属性列:
 [例7]将Student表中所有女生记录定义为一个视图
 CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
 AS
 SELECT *
 FROM Student
 WHERE Ssex=‘女’;
 缺点:
 修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,导致该视图不能正确工作。
删除视图:
 语句的格式:
 DROP VIEW <视图名>;
 该语句从数据字典中删除指定的视图定义
 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
查询视图:
 用户角度:查询视图与查询基本表相同
 RDBMS实现视图查询的方法:
 视图消解法(View Resolution)
 进行有效性检查
 转换成等价的对基本表的查询
 执行修正后的查询
视图消解法:
 例:在信息系学生的视图中找出年龄小于20岁的学生。
 SELECT Sno,Sage
 FROM IS_Student
 WHERE Sage<20;
视图消解转换后的查询语句为:
 SELECT Sno,Sage
 FROM Student
 WHERE Sdept= ‘IS’ AND Sage<20;
视图消解法的局限:
 有些情况下,视图消解法不能生成正确查询。
[例11]在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩
 SELECT *
 FROM S_G
 WHERE Gavg>=90;
S_G视图的子查询定义:
 CREATE VIEW S_G (Sno,Gavg)
 AS
 SELECT Sno,AVG(Grade)
 FROM SC
 GROUP BY Sno;
错误:
 SELECT Sno,AVG(Grade)
 FROM SC
 WHERE AVG(Grade)>=90
 GROUP BY Sno;
正确:
 SELECT Sno,AVG(Grade)
 FROM SC
 GROUP BY Sno
 HAVING AVG(Grade)>=90;
更新视图:
[例12] 将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”。
 UPDATE IS_Student
 SET Sname= ‘刘辰’
 WHERE Sno= ’ 200215122 ';
 转换后的语句:
 UPDATE Student
 SET Sname= ‘刘辰’
 WHERE Sno= ’ 200215122 ’ AND Sdept= ‘IS’;
[例13] 向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20岁
 INSERT
 INTO IS_Student
 VALUES(‘95029’,‘赵新’,20);
 转换为对基本表的更新:
 INSERT
 INTO Student(Sno,Sname,Sage,Sdept)
 VALUES(‘200215129 ',‘赵新’,20,‘IS’ );
[例14]删除信息系学生视图IS_Student中学号为200215129的记录
 DELETE
 FROM IS_Student
 WHERE Sno= ’ 200215129 ';
 转换为对基本表的更新:
 DELETE
 FROM Student
 WHERE Sno= ’ 200215129 ’ AND Sdept= ‘IS’;
更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新
例:视图S_G为不可更新视图。
 UPDATE S_G
 SET Gavg=90
 WHERE Sno= ‘200215121’;
 这个对视图的更新无法转换成对基本表SC的更新
允许对行列子集视图进行更新
 对其他类型视图的更新不同系统有不同限制:
 DB2对视图更新的限制:
 (1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
 (2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
 (3) 若视图的字段来自集函数,则此视图不允许更新。
 (4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。
 (5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
 (6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
 (7) 一个不允许更新的视图上定义的视图也不允许更新
视图的作用:
当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作:
 基于多张表连接形成的视图
 基于复杂嵌套查询的视图
 含导出属性的视图
视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
视图对重构数据库提供了一定程度的逻辑独立性:
 例:数据库逻辑结构发生改变
 学生关系Student(Sno,Sname,Ssex,Sage,Sdept)
 “垂直”地分成两个基本表:
 SX(Sno,Sname,Sage)
 SY(Sno,Ssex,Sdept)
 通过建立一个视图Student:CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
 AS
 SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
 FROM SX,SY
 WHERE SX.Sno=SY.Sno;
 使用户的外模式保持不变,从而对原Student表的查询程序不必修改
视图能够对机密数据提供安全保护:
 对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
 通过WITH CHECK OPTION对关键数据定义操作时间限制
 例:建立1号课程的选课视图,并要求透过该视图进行的更新操作只涉及1号课程,同时对该视图的任何操作只能在工作时间进行。
 CREATE VIEW IS_SC
 AS
 SELECT Sno,Cno,Grade
 FROM SC
 WHERE Cno= ‘1’
 AND TO_CHAR(SYSDATE,‘HH24’) BETWEEN 9 AND 17
 AND TO_CHAR(SYSDATE,‘D’) BETWEEN 2 AND 6
 WITH CHECK OPTION;
适当的利用视图可以更清晰的表达查询
简单操作:
 实验(建表):
一、打开cmd进入数据库:
 mysql -u root -p
展示数据库数据目录
 SHOW DATABASES;
如果不选择数据库目录则会出现如下错误:
 ERROR 1046 (3D000): No database selected
使用use mysql;命令选择该数据目录即可。
 mysql> use mysql;
 结果:
 Database changed
创建数据表(Student):
 CREATE TABLE Student
 (Sno CHAR(9) PRIMARY KEY,/* 列级完整性约束条件*/
 Sname CHAR(20) UNIQUE, /* Sname取唯一值*/
 Ssex CHAR(2),
 Sage SMALLINT,
 Sdept CHAR(20)
 );
二、Navicat命令行界面:
三、或者Navicat新建查询界面:
 
创建表:
 CREATE TABLE Student1
 (Sno INT(11),
 Cno CHAR(4),
 Grade SMALLINT,
 PRIMARY KEY(Sno,Cno),
 FOREIGN KEY(Sno)REFERENCES student(Sno)
 );
修改列数据类型:
 基本格式:ALTER TABLE 表名 ALTER COLUMN <列名> <数据类型>;
 或ALTER TABLE 表名 CHANGE <旧列名> <新列名> <列类型>;
 或ALTER TABLE 表名 MODIFY<列名> <数据类型>;
 注:change和modify在MySQL中可以修改表数据类型,alter column不行
删除表:
 略
建立索引:
 参考网址:https://dev.mysql.com/doc/refman/8.0/en/create-index.html
 CREATE INDEX语句:
 CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
 [index_type]
 ON tbl_name (key_part,…)
 [index_option]
 [algorithm_option | lock_option] …
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_option:
 KEY_BLOCK_SIZE [=] value
 | index_type
 | WITH PARSER parser_name
 | COMMENT ‘string’
 | {VISIBLE | INVISIBLE}
index_type:
 USING {BTREE | HASH}
algorithm_option:
 ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option:
 LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
查询表操作:

 京公网安备 11010502036488号
京公网安备 11010502036488号