3.1 SQL概述:
- SQL:结构化查询语言,是关系数据库的标准语言,SQL是一个通用的、功能极强的关系数据库语言
- 结构化查询:理解:就是只要告诉数据库我要干什么,怎么干就可以了
-
3.1.2 SQL的特点:
- 综合统一:
- 集数据定义语言 DDL,数据操纵语言 DML,数据控制语言 DCL功能于一体, 可以独立完成数据库生命周期中的全部活动,如下:
- 定义关系模式,插入数据,建立数据库,
- 对数据库中的数据进行查询和更新
-
数据库重构和维护
-
数据库安全性、完整性控制等
- 嵌入式SQL和动态SQL定义
- 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行
- 数据操作符统一(如:查询就用select,删除就用:delete)
- 高度非过程化:
- 非关系数据模型的数据操纵语言“面向过程”,必须制定存取路径
- SQL只要提出“做什么”,无须了解存取路径
- 存取路径的选择以及SQL的操作过程由系统自动完成
- 面向集合的操作方式:
- 非关系数据模型采用面向记录的操作方式,操作对象是一条记录
- SQL采用集合操作方式:
- 操作对象、查找结果可以是元组的集合
- 一次插入、删除、更新操作的对象可以是元组的集合
- 以同一种语法结构提供多种使用方式:
- SQL是独立的语言
- 能够独立地用于联机交互的使用方式
- SQL又是嵌入式语言
- SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用
- 简单容学:
- SQL功能极强,完成核心功能只用了9个动词
-
SQL功能 动词 数据查询 SELECT 数据定义 CREATE、DROP、ALTER 数据操纵 INSERT、UPDATE、DELETE 数据控制 GRANT、REVOKE
- 综合统一:
-
3.1.3SQL基本概念:
-
- SQL支持关系数据库三级模式结构:
- 基本表:
- 本身独立存在的表
- SQL中一个关系就对应一个基本表
- 一个(或多个)基本表对应一个存储文件
- 一个表可以带若干索引(索引:目的:快速查找数据,理解:相当于书中的目录,如给学号做一个目录,就可以快速查找)
- 存储文件
- 逻辑结构组成了关系数据库的内模式
- 物理结构是任意的,对用户透明
- 视图
- 从一个或几个基本表导出的表
- 数据库中只存放视图的定义而不存放视图对应的数据
- 视图是一个虚表
- 用户可以在视图上再定义视图
- 基本表:
- SQL支持关系数据库三级模式结构:
3.2 学生-课程数据库:
- 本章节内容以书上学习为主,书上包括示例图表等
3.3 数据的定义:
- SQL的数据定义功能:模式定义、表定义、视图和索引的定义
-
3.3.1 模式的定义于删除:
- 定义模式:
- 模式在SQL理解:相当于一个仓库有不同的房间存放不同的工具,不同的房间就是不同的模式,不同的房间也只能放不同的工具,可以给房间授权只允许谁去访问,数据库就相当于仓库
- 语句格式如下:
- CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
- AUTHORIZATION :该关键字的意思是把谁设置成该模式的管理员
- CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
- 例子:为用户WANG定义一个学生-课程模式S-T
- CREATE SCHEMA "S-T" AUTHORIZATON WANG;
- 细节:
- 若没有指定模式名,那么就以用户名来表示
- CREATE SCHEMA <用户名表示> AUTHORIZATON WANG;
- 在创建模式时同时还可以建立表
- 语法:CREATE SCHEMA <模式名> AUTHORIZATON <用户名>[<表定义子句>|<视图定义子句>];
- 执行创建模式语句必须拥有DBA权限,或者DBA授权在CREATESCHEMA的权限
- 如:张三管理太多模式了,他就可以在创建模式的时候把权限给到历史,注意的是数据库要有李四这个人
- 若没有指定模式名,那么就以用户名来表示
- 删除模式:
- 语法:DROP SCHEMA <模式名> <CASCADE | RESTRICT>;
- <CASCADE | RESTRICT> 中的两选项必须二选一:
- CASCADE(级联)
-
删除模式的同时把该模式中所有的数据库对象全部删除
-
-
RESTRICT(限制)
-
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行
-
- CASCADE(级联)
-
例子:DROP SCHEMA ZHANG CASCADE;
-
删除模式ZHANG,同时该模式中定义的表也被删除
-
- 定义模式:
-
3.3.2 基本表的定义、删除与修改:
- 定义基本表:
-
语句格式:
-
- 定义基本表:
CREATE TABLE <表名>
( <列名> <数据类型> [<列级完整性约束条件>],
<列名> <数据类型> [<列级完整性约束条件>],
[<表级完整性约束条件>]);
-
-
- 细节:
- 如果完整性约束条件涉及到该表的多个属性列 - [<表级完整性约束条件>],否则定义在列 - [<列级完整性约束条件>]
- 逗号代表一条语句的结束
- [ ] 大括号里的内部代表可有可无
- 例子:
- 细节:
-
数据类型:
-
-
字符串类型:
枚举类型:
枚举类型英文为ENUM,对1~255个成员的枚举需要1个字节存储;对于255 ~ 65535个成员,需要2个字节存储。最多允许65535个成员。创建方式:enum(“M”,“F”);日期类型:
-
-
-
模式与表:
-
每一个基本表都属于某一个模式,一个模式包含多个基本表
- 理解:模式代表仓库房间,基本表代表工具,工具可以是锤子、铁锹等等,所以基本表都属于某一个模式,一个模式包含多个基本表
-
创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式
- 理解:创建表,没有指定模式,根据搜索路径来确定:买了工具,都我没有说放到能够房间,那就谁买的谁去管理
-
显示当前搜索路径:
- SHOW search path;
-
搜索路径的当前某默认值:
- $user(用户名,登录时的用户名), PUBLIC;
-
DBA用户可以设置搜索路径:
-
SET search_path To "S-T",PUBLIC;
- “S-T”就是修改的搜索路径,PUBLIC是没有S-T就创建一个PUBLIC的模式
-
理解:买工具回来放到S-T房间,如果没有S-T房间就放到PUBLIC房间中去
-
SET search_path To "S-T",PUBLIC;
-
若搜索路径的模式名都不存在,系统将给出错误
-
若搜索路径中的存在模式,ROMBS还使用模式列表中第一个存在的模式作为数据库对象的模式名
-
理解:我设置了多个模式名,使用的时候用第一个,如果不存在在找第二个
-
-
每一个基本表都属于某一个模式,一个模式包含多个基本表
- 创建基本表:
- 在模式的状态下创建表 - 就是创表的时候指定模式:
- 1.创建表给出模式名:
- CREATE TABLE "ST-T".Studnet(...); // Student所属的模式是S-T
- CREATE TABLE "ST-T".Course(...); // Course所属的模式是S-T - 后需还可以往模式中添加表,一个模式可以有若干个基本表(前面有说)
- CREATE TABLE "ST-T".SC(...); // SC所属的模式是S-T
- 2.在创建模式语句中同时创建表:
-
3.设置所属模式,在创建表中不必给出模式名(就是设置它的搜索路径)
-
修改基本表:
-
语法:
- CASCADE - 级联删除,使用该操作自动删除引用了该列的其它对象
- RESTRICT -限制删除,使用该操作如果该列被其它对象引用,就会拒绝删除该列
- ALTER COLUMN - 用于修改原有的列定义,包括修改列名和数据类型
-
-
例子:
-
-
删除基本表:
-
语法:DROP TABLE <表名>[RESTRICT| CASCADE];
- 基本表定义被删除,数据被删除,表上建立的索引、视图、触发器等一般也将被删除
-
RESTRICT:删除表是有限制的,欲删除的基本表不能被其他表的约束所引用
如果存在依赖该表的对象,则此表不能被删除 -
CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除 -
例子:
-
不同数据库处理的策略:
-
-
-
3.3.3 索引的创建和删除:
-
建立索引的目的:加速查询速度
-
谁可以建立索引:DBA或表的属主(建表人)
-
DMBS一般会自动建立以下列上的索引(相当于有下面关键字的自动加到目录):
-
PRIMARY KEY;
-
UNIQUE;
-
-
谁维护索引:DMBS自动完成
-
使用索引:DMBS自动执行是否使用索引及使用哪些索引
-
R(R表示关系数据库)DBMS中索引一般采用B+树、HASH索引来实现
-
B+树索引具有动态平衡的优点
HASH索引具有查找速度快的特点
采用B+树,还是HASH索引 则由具体的RDBMS来决定 -
索引是关系数据库的内部实现技术,属于内模式的范畴
-
CREATE INDEX 语句定义索引时,可以定义索引是唯一索引、非唯一索引(如:年龄,年龄可能就是会重复)或聚簇索引
-
建立索引:
-
语句:CREATE [UNIQUE(唯一索引)] [CLUSTER(聚簇索引)] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…); - 不写大括号里面的索引,就是非唯一索引
-
- 建立唯一索引例子:
-
-
建立聚簇索引例子:
- 什么是聚簇索引:数据搜索到计算机中
-
-
- 删除索引:
- 语句:DROP INDEX<索引名>;
- 删除索引时,系统会从数据字典中删去有关该索引的描述
- 例:删除Student表的Stusname索引
- DROP INDEX Stusname;
- 数据字典: - 和新华字典一样记录了所有数据
- 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
- 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
- 在进行查询优化和查询处理时,数据字典中的信息是其重要依据
- 删除索引:
3.4 数据查询:
- 语句:
-
/* SELECT - 查询 all - 显示所有 distinct - 显示不同的(去重) from - 去哪个表查 where - 条件 group by - 分组 order by - 排序 */ SELECT [ALL | DISTINCT ]<目标列表达式>[,<目标列表达式>]... FROM<表名或视图名>[,<表名或视图名>...] | (<SELECT语句>)[AS]<别名> [WHERE<条件表达式>] [GROUP BY<列名1>[HAVING<条件表达式>]] [ORDER BY<列名2>[ASC | DESC]]
-
- 细节:
- 语句中的字母不分大小写
- 语句中的符号都为业务状态下的
- [ ]中的内容,不是语句必须内容,需要该功能在添加
-
3.4.1 单表查询:
- 什么是单表查询?只对一个表的内容进行查询
- 查询表中的若干列:
- 查询指定列:
-
/* 查询全体学生的学号和姓名 */ SELECT son,sname FROM Student;
-
查询表中全部列:
-
/* 查询全体学生的详细记录 */ SELECT * FROM Student;
-
选择经过计算的值:
-
作用:选出表中指定的属性列,经过计算后输出
-
格式:SELECT字语句的<目标列表达式>可以为:算数表达式、字符串常量、函数、列别名
-
例: 注意表格的名字
- 例:函数的使用,不存在列,输出到表格
-
例:别名的使用
-
-
-
选择表中的若干元组:
-
消除取值重复的行(去重):
-
两个关键字:DISTINCT(显示去重后的)和ALL(显示所有),不写关键字默认是ALL
-
例:
-
-
-
查询满足条件的元组:
-
通过关键字where子句实现
-
操作符 说 明 = 等于 <> 不等于 != 不等于 < 小于 <= 小于等于 !< 不小于 > 大于 >= 大于等于 !> 不大于 BETWEEN , NOT BETWEEN 在指定的两个值之间 ,不在指定访问的值 IS NULL, IS NOT NILL 为NULL的值, 不为NULL的值
AND,OR,NOT 并且 ,或者,反;不是
-
例子:比较大小
-
例子:确定范围
-
-
例子:确定集合
- 例子:字符匹配
-
-
例子:匹配串为含通配符的字符串
-
%表示任意长度的字符串
-
_ ,下斜线表示任意单个字符
-
-
-
例子:使用换码字符串将通配符转义为普通字符
-
ESCAPE '<换码字符>' - 如:查询的字符串中有& _ 这些特殊字符时,可以通过转码让它转为字符
-
-
-
例子:涉及空值的查询
-
IS NULL或IS NOT NULL, "IS" 不能用“=”代替
-
-
-
例子:多重条件查询
-
AND和OR来联结多个查询条件,AND的优先级高于OR,可以用括号来改变优先级
-
有时候可以用:[NOT] IN 或 [NOT] BETWEEN ... AND ...
-
-
-
例子:ORDER BY子句(排序)
-
ORDER BY 子句可以按一个或多个属性列排序
-
升序:ASC; 降序:DESC; - 默认是升序
-
空值默认是最大值
-
ASC:排序列为空值的元组最后显示
-
DESC:排序列为空值的元组最先显示
-
-
-
聚集函数
- COUNT ( * ) 统计元组(行)个数
- COUNT ( [ DISTINCT | ALL ] <列名> ) 统计一列中的值的个数
- SUM( [ DISTINCT | ALL ] <列名> ) 计算一列值的总和(该列必须是数组型)
- AVG( [ DISTINCT | ALL ] <列名> ) 计算一列值的平均值(该列必须是数组型)
- MAX( [ DISTINCT | ALL ] <列名> ) 求一列中的最大值
- MIN( [ DISTINCT | ALL ] <列名> ) 求一列中的最效值
- 细节:WHERE子句中不能使用聚集函数作为条件表达式,只能在SELECT和GROUPBY的HAVING子句中
-
GRIOUP BY子句(分组)
-
GRIOUP BY子句作用:按指定的一列或多列值分组,值相等的为一组,来细化聚集函数的作用对象
-
细节:
-
未对查询结果分组,聚集函数将作用于整个查询结果
-
对查询结果分组,聚集函数将分别作用于每个组
-
语
-
-
-
HAVING语句
-
GROUP BY子句分组后,可以使用HAVING语句指定筛选条件
-
细节:
-
HAVING是和GROUP BY语句连在一起的,作用在分组对象中
-
-
-
-
HAVING短句与WHERE子句的区别
-
HAVING是和GROUP BY语句连在一起的,作用在分组对象中
-
WHERE是作用在整个查询对象中
-
作用对象不同:WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的元组
-
WHERE子句中是不能用聚集函数作为条件表达式的
-
-
-
-
3.4.2 连接查询:
- 等值连接与非等值连接查询:
- 连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词
-
等值连接:当连接运算符为=时,称为等值连接
-
非等值连接:所以非=符号时,称为非等值连接
-
细节:
-
连接谓词中的列名称为连接字段,并且各连接字段必须是可比的,但名字不必相同
- 运算符有:= > < >= <= != <>等
-
-
例:
-
- 等值连接与非等值连接查询:
-
- 例的执行过程:首先在Student表中拿出第一个Sno学号和Sc表中的所有Sno学号做比较,只要是和Student的Sno相同的就和成一个新的元组,
以此类推,拼接得到的表不是真实存在的,随着查询的结束而结束
-
-
自然连接:
- 若在等中连接中把目标列中重复的属性列去掉则称自然连接(就是有重复的属性或列,就去重)
- 自身连接:
- 一个表与其自己进行连接
- 细节:
- 都是同一个表连接,怎么让这两个表区分? 起别名
- 由于属性名都是同名属性,因此必须使用别名来区分
-
外连接:
- 就是把不要的悬浮元组也加到表里面
- 普通连接和外连接的区别:
- 普通连接操作只输出满足连接条件的元组
- 外连接操 接主体,将主体表中的不符合条件的元组一并输出
- 外连接分为:
- 左连接为:列出左边关系中的所有元组
- LEFT OUT JOIN SC ON
- 右连接为:列出右边关系中的所有元组
- RIGHT OUT JOIN SC ON
- 左连接为:列出左边关系中的所有元组
- 例:
-
多表连接:
-
连接操作是流量以上的表进行连接
-
-
例: - 下面用到了三个表
-
-
-
3.4.3 嵌套查询:
-
一个SELECT-FROM-WHERE语句陈为一个查询块
-
嵌套查询定义:是指将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询
-
理解:就是将新的查询语句嵌套在已有的查询语句中的WHERE或HAVLNG中,其它地方不能嵌套
-
-
细节;
-
子查询中不能使用ORDER BY子句
-
层层嵌套方式反映来哦SQL语言的结构化
-
有些嵌套查询可以用连接运算代替
-
外层查询叫:父查询,内层查询叫:子查询
-
父查询里面嵌套子查询,子程序里面还可以嵌套子查询
-
不相关子查询:子查询的查询条件不依赖父查询(看案例)
-
相关子查询:子查询的查询条件依赖于父查询,整个语句称为嵌套查询(看案例)
-
-
例:
-
-
带有IN谓词的子程查询:
-
例子2:
-
带有比较运算符的子查询:
-
当确切知道内层返回的是单个值时,可以用 >、<、=、>=、<=、!=或<>等运算符
-
例1:
-
例2:
-
例子执行流程:1.x表的第一个Son和y表的每一个Son进行比较,和x的Son一样的就进行表拼接,依此类推
-
2.得到拼接的表,然后通过函数AVG去求X的Son和y的Son拼接表的平均成绩,和X表的成绩进行比较,大于就显示学号
-
-
-
-
带有ANY(SOME不同的系统可能使用这个)或ALL谓词的子查询:
-
ANY - - 任意一个值
-
ALL - - 所以值
-
ANY和ALL需要配合比较运算符使用
-
-
例子: - 执行过程 :先执行子查询,找出计算机科学的的所有人年龄得到一个集合(xx,xx),然后执行父查询不是计算机系的年龄,然后和子程查询的集合比较
-
-
细节: - =ANY等价于IN谓词,<ANY等价于<MAX,<>ALL等价于NOT IN谓词,<ALL等价于<MIN,等等
-
带有EXISTS谓词的子查询:
-
EXISTS谓词:代表存在量词∃,带有EXUISTS谓词的子查询,不返回任何数据,只产生逻辑真值"true",或逻辑假值"false"
-
存在量词:存在,有些,有一个,至少有一个,存在一个,对某一个,对有些,对某些,有的等
-
-
例:查询所有选修了1号课程的学生姓名
-
思路:需要Student和SC表,通过Student中Son去确定SC中选了课的学生的Sno,并且通过条件AND判断,课程号为1的
-
-
细节1:所有存在量词EXISTS后,如若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值
-
细节2:由EXISTS引出的子查询,select后通过用*,因为EXISTS返回的只有真和假,用列名没有意义
-
-
NOT EXISTS谓词的子查询:
-
若内查询结果非空,外层WHERE子句返回假值
-
若内查询结果为空,外层WHERE子句返回真值
-
例子:思路:内层查询,查询出所有选择了1号课程的学生,通过NOT EXISTS返回没选择的学生就是真
-
-
-
不同形式的查询间的替换:
-
一些带EXISTS或NOT EXISTS谓词的子程序不能本其他形式的子程序等价替换
-
所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子程序等价替换
-
理解:如IN和ALL的目的就是表达查询结果集里面所有的值,那EXISTS表示真假,就可以完美代替
-
-
例:思路:内查询S2表想S1表进行自身连接查询,当S2中的系和S1中的系对应上,并且S2表中的名字是刘晨,返回真(不理解画图)
-
-
-
用EXISTS/NOT EXISTS实现全称量词:
-
全称量词:一切、每一个、任意
-
SQL语言中是没有全称量词语的,但可以通过存在量词转为全称量词
-
例:
-
-
用EXISTS/NOT EXISTS实现逻辑蕴涵:
-
逻辑蕴涵:我来过北京代表我来过中国,我来过中国不代表去过北京
- SQL语言中没有蕴涵逻辑运算,可以利用谓词演算将逻辑蕴涵谓词等价转换
-
-
-
-
-
3.4.4 集合查询:
- 什么是集合查询?SELECT语句的查询结果是元组的集合,所以多个的SELECT语句的结果可以进行集合查询
- 集合查询种类:
- 并操作(操作关键字:UNLON):第一个查询出来的集合是1234,第二个是456,并起来就是123456,是去重的
- UBLON - 是去重的, 如果是:UNLON ALL 是保留重复结果
- 交操作(操作关键字:INTERSECT):第一个查询出来的集合是489,第二个是456,交就是4
- 差操作(操作关键字:EXCEPT):第一个查询出来的集合是1234,第二个是23,差就是在第一个集合里,不在第二个集合里,那么就是14
- 细节:参加集合操作的各查询结果的列数(一列的的数)必须相同,对应的数据类型也必须相同
- 并操作(操作关键字:UNLON):第一个查询出来的集合是1234,第二个是456,并起来就是123456,是去重的
- 并操作例子:
-
交操作例子:
-
-
差操作例子:
-
-
3.4.5 基于派生表的查询:
-
在from语句中,成为主存在的子查询叫派生表
- 细节:派生表(子查询)必须取一个别名,如果没有使用聚集函数,使用默认的,如果使用了需要指定属性列
-
-
3.4.6 SELECT语句的一般格式:
3.5数据更新:
- 什么是数据更新?就是如何插入数据、修改数据、删除数据
-
3.5.1 插入数据:
- 什么是插入数据?在一个表中插入一个新的,元组、一个查询结果、多个元组
- 插入明确的数据:
- 格式:INSERT INTO <表名> [ (<属性1>)[,<属性2>] ......] VALUES ( <常量1> [常量2] ....);
- 功能:将新元组插入指定表中
- 理解:[ (<属性1>)[,<属性2>] ......] - 写属性列名可写可不写,不写默认按顺序插入,写了值要和属性列对应
- 理解:( <常量1> [常量2] ....) - 插入的属性值
- 细节:
- INTO子句:属性列的顺序可与表中的顺序不一致,没有指定属性列的默认插入全部
- VALUES子句:提供的值必须与INTO子句匹配,值与属性列的个数和值的类型要一致
- 插入数据时,主码是不能为空的
- 插入子查询结果数据:
- 格式:INSERT INTO <表名> [ (<属性1>)[,<属性2>] ......] 子查询;
- 功能:将子查询结果插入指定表中
-
3.5.2 修改数据:
-
语句:UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式> ]...[ WHERE < 条件 > ];
-
功能:修改指定表中满足WHERE子句条件的元组
-
-
细节:
-
SET子句:指定修改方式,修改的列,修改后取值
-
WHERE子句:指定修改的元组,缺省表示修改所有元组
-
在执行修改语句时会检查修改操作是否破坏表上已定的完整性规则(如Student,Sc表的学号)
-
-
将一个元组或多个元组修改:
-
-
带子查询的修改语句:
-
-
3.5.3 删除数据:
-
语句:DELETE FROM <表名> [ WHERE <条件> ];
-
功能:删除指定表中满足WHERE子句条件的元组
-
-
细节:
-
WHERE子句:指定删除的元组,缺省WHERE子句表示删除表中全部元组,但定义仍在
- 要保持表的完整性约束,在Student表中删除了A学生,Sc中A学生也应该是删除的
-
-
删除一个或多个元组的值:
-
-
带子查询的删除语句:
-
3.6 空值的处理:
- 什么是空值?所谓空值就是 "不指导" 或 “不存在” 或 "无意义" 的值,空值是一个很特殊的值,含有不确定性
- SQL语句中取空值一般情况如下:
- 该属性有值,但当前不知道它的具体值
- 该属性不应该有值
- 由于某种原因不便于填写
- 空值的约束条件:
-
- 属性定义中有 NOT NULL(不能为空)约束条件的不能为空值
- 叫了UNIQUE(唯一)限制的属性不能取空值
- 码属性(主码,后选码)不能取空值
-
- 空值的产生:
- 空值的判断:
- IN NULL - 判断是否是空值 IN NOTNULL - 判断不是空值的
-
空值的算数运算、比较运算和逻辑运算:
-
算术运算:空值与一个值(包括另一个空值)的算术的结果为空值
-
理解:空值和其他值的算术运算(加减乘除)结果都为空
-
-
比较运算:空值与另一个值(包括另一个空值)的比较运算结果为UNKNOWN(未知数);
- 理解:空值和其他值的比较运算( > < = ...)结果都为UNKNOWN
- 逻辑运算:
- T 表示 true
- F 表示 false
- U 表示 UNKNOWN
-
-
例子:
3.7 视图:
- 什么是视图?视图是从一个或多个基本表(或视图)导出的表,它与基本表不同,它是一个虚表
- 细节:
- 数据库中只存放视图的定义,而不存放视图定义的数据,这些数据仍存放在原本的基本表中
- 基本表中的数据发生变化,视图中的查询出的数据也会发生变化
- 视图的操作:查询、删除、受限更新、定义该视图的新视图
-
3.7.1 定义视图:
- 语法:CREATE VIEW <视图名> [ (<列名> [,<列名> ]....... ) ] AS <子查询> [ WITH CHECK OPTION ];
- WITH CHECK OPTION - 关键字表示:对视图进行更新、插入、删除操作时,需要满足视图定义的谓词条件
- 如:一个只有信息系的学生视图,通过WITH CHECK OPTION关键字来保持对视图操作时,视图只有信息系的学生
- 细节:
- 组成视图的属性列名:可以全部全部省略或全部指定
- 子查询不允许含有ORDER BY 子句和DISTINCT(去重)短语
- RDBMS(关系数据库)执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句
- 在对视图查询时,按视图的定义从基本表中将数据查出
- 小结:视图是虚表,只是存放视图的定义,真的向视图查询数据时,是向基本表进行数据查询
- 语法:CREATE VIEW <视图名> [ (<列名> [,<列名> ]....... ) ] AS <子查询> [ WITH CHECK OPTION ];
-
创建视图:
- 例子(基于一个表):
- 下面例子中第二个,加入了WITH CHECK OPTION关键字,所有的DMBS对该视图的更新操作:
- 修改操作:自动加上Sdpet='IS'的条件
- 删除操作:自动加上Sdpet='IS'的条件
- 插入操作:自动检查Sdpet属性值是否为'IS',如果不是,则拒绝该插入操作,如果没有提供Sdpet属性值自动定义Sdept为'IS'
-
例子(基于多个表):
-
-
例子(基于视图的视图):
-
例子(带表达式的视图):
-
-
例子(分组视图):
-
例子(不指定属性列):
-
细节:本例中如修改基本表Student的结构后,Student与视图F_Student视图的映像关系被破坏,导致该视图不能正确工作
- 如:我在基本表中sex和age的位置进行了调整,你们中视图中age的整型存放导sex的字符型中肯定就是错误的了
-
-
删除视图:
-
语句:DROP VIEW <视图名> [ CASCADE(级联) ];
-
细节:
-
该语句从数据字典中删除指定的视图定义
-
如果该视图还导出了其它视图(如:由视图创建出一个新的视图),使用CASCADE级联删除语句,把该语句和由他导出的所有视图一起删除
-
删除基本表时,由该基本表导出的所有视图定义都必须显式的使用DEOR VIEW语句删除(因为删除了基本表,但视图还是在的)
-
-
例子:
-
-
-
视图的查询:
- 视图定义后,用户可以像基本表意义对视图进行查询
- RDBMS实现视图查询的方法--视图消解法:
- 1.进行有效检查 - 如:查询S1在Student,但Student语句删除了,那就是错误的
- 2.转换成等价的对基本表的查询
- 3.整型修正后的查询
- 例子:
-
视图消解法的局限:
-
3.7.3 更新视图:
-
更新视图是指通过视图来插入、删除和修改数据,由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新
-
细节:为防止在更新视图时出错,定义视图时要加上WITH CHECK OPTION子句
-
例子1(修改数据):
-
例子2(插入数据):
-
例子3(删除数据):
-
-
更新视图的限制:一些视图是不可以更新的,因为对这些视图的更新不能唯一的有意义的转换成对应基本表的更新
-
-
-
3.7.4 视图的作用:
-
视图能够简化用户的操作
- 如:我只看信息系的学生信息,就可以创建一个视图,不然每次要去基本表查看
-
视图使用用户能以多种角度看待同一数据
- 如:理解:不同的应用可能用到同一个数据
-
视图对重构数据库提供了一定程度的逻辑独立性
-
如:就是基本表和视图是映射关系,基本表变视图就会变
-
-
视图能够对机密数据提供安全保护
- 如:基本表中的的身份证信息是不想给别人看的,就可以把其它可以看的放到视图,然后授权给别人看
-
适当的利用视图可以更清晰的表达查询
-
如:可以省略一些查询条件判断
-
-
标签:语句,第三章,删除,子句,视图,查询,索引,SQL From: https://www.cnblogs.com/Mr-shne/p/16757096.html