数据库---关系数据库标准语言SQL

SQL(Structured Query Language)

  • 结构化查询语言,关系数据库的标准语言,具有关系代数和关系演算双重特点的语言。

  • SQL语言可分为以下4大部分。
    数据定义语言(Data Definition Language,DDL)。用于定义、删除和修改数据模式, 如定义基本表、视图、索引等操作。

    查询语言(Query Language,QL)用于查询数据。

    数据操纵语言(Data Manipulation Language,DML)。用于增加、删除、修改数据。

    数据控制语言(Data Control Language,DCL)用于数据访问权限的控制。

  • 目前,没有一个数据库系统能够支持SQL标准的所有概念和特性。

  • 特点:
    综合统一:集数据定义语言(DDL) 数据操纵语言(DML) 数据控制语言(DCL)功能于一体。 可以独立完成数据库生命周期中的全部活动,用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行。数据操作符统一。

    高度非过程化:非关系数据模型的数据操纵语言“面向过程”,必须制定存取路径,SQL只要提出“做什么”,存取路径的选择以及SQL的操作过程由系统自动完成。

    面向集合的操作方式:非关系数据模型采用面向记录的操作方式,操作对象是一条记录,SQL采用集合操作方式,操作对象、查找结果可以是元组的集合,一次插入、删除、更新操作的对象也可以是元组的集合。

    以同一种语法结构提供多种使用方式:SQL是独立的语言,能够独立地用于联机交互的使用方式,SQL是嵌入式语言SQL能够嵌入到高级语言程序中,供程序员设计程序时使用。

    语言简洁,易学易用
    在这里插入图片描述

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

  • 存储文件:逻辑结构组成了关系数据库的内模式,物理结构是任意的,对用户透明。

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

学生-课程数据库

在这里插入图片描述
在这里插入图片描述

数据定义

在这里插入图片描述

  • SQL标准不提供修改模式和修改视图定义的操作,若用户想修改这些对象,只能先将它们删除,然后在重建。
  • SQL标准不提供索引相关的语句,为了提高查询效率,关系数据库管理系统通常提供了索引机制和相关的语句。
  • 一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。

模式

  • 定义模式:
    要创建模式,调用该命令的用户必须拥有DBA的权限,或者获得了DBA授予的CREATE SCHEMA的权限。

    语法:CREATE SCHEMA [< 模式名>] AUTHORIZATION < 用户名>[< 表定义子句>|< 视图定义子句>|< 授权定义子句>]。

    如果没有指定<模式名>,那么<模式名>隐含为<用户名>。

    定义模式实际上定义了一个命名空间:在这个空间中可以定义该模式包含的数据库对象,例如基本表、视图、索引等。

  • 删除模式
    语法:DROP SCHEMA <模式名> <CASCADE|RESTRICT>
    CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除。

    RESTRICT(限制):如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。

基本表

  • 定义基本表
    CREATE TABLE <表名>(<列名> <数据类型>[ <列级完整性约束条件> ]
    [<列名> <数据类型>[ <列级完整性约束条件> ]]

    [,<表级完整性约束条件> ] );

    约束条件被存入系统的数据字典中,当用户操作表中的数据时由关系DBMS自动检查该操作是否违背完整性约束条件。

    如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。

  • 数据类型在这里插入图片描述
    在这里插入图片描述
    定义表的属性时,需要指明其数据类型及长度。数据类型的选择要考虑数据的取值范围和数据要做的运算。

  • 模式与表
    每一个基本表都属于某一个模式,一个模式包含多个基本表。

    定义基本表所属模式
    在表名中明显地给出模式名 Create table “模式名”.表名(…); /模式名为 S-T/
    在创建模式语句中同时创建表
    设置所属的模式

    创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式。搜索路径包含一组模式列表,RDBMS(关系数据库)会使用模式列表中第一个存在的模式作为数据库对象的模式名,若搜索路径中的模式名都不存在,系统将给出错误。

    显示当前的搜索路径: SHOW search_path;

    搜索路径的当前默认值是:$user, PUBLIC。其含义是首先搜索与用户名相同的模式名,若该模式名不存在,则使用PUBLIC模式。
    DBA用户可以设置搜索路径,然后定义基本表 SET search_path TO “S-T”,PUBLIC;

  • 修改基本表
    ALTER TABLE <表名>
    [ ADD [COLUMN]<新列名> <数据类型> [ 完整性约束 ] ]
    [ ADD<表级完整性约束>]
    [ DROP [COLUMN]<列名> [ CASCADE|RESTRICT ] ]
    [ DROP CONSTRAINT<完整性约束名> [ RESTRICT |CASCADE] ]
    [ ALTER COLUMN<列名> <数据类型> ];

    不论基本表中原来是否已有数据,新增加的列一律为空值.

  • 删除基本表
    DROP TABLE <表名>[RESTRICT| CASCADE];

    RESTRICT:欲删除的基本表不能被其他表的约束所引用 如果存在依赖该表的对象,则此表不能被删除。

    CASCADE:在删除基本表的同时,相关的依赖对象一起删除。

    CASCADE|RESTRICT默认是RESTRICT。

索引

  • 建立索引是加快查询速度的有效手段,索引能够快速定位到需要查询的内容。用户可以根据应用环境的需要在基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。属于内模式的范畴。

    占用一定的存储空间。

    当基本表更新时,索引要进行相应的维护。

    建立索引由DBA数据库管理员或表的属主即建立表的人负责完成。

    关系数据库在执行查询时会自动选择合适的索引作为存取路径,用户不必也不能显示的选择索引。

  • 顺序索引:针对按指定属性值升序或降序存储的关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。

    B+索引:将索引组织成B+树的形式,B+树的叶节点为属性值和相应的元组指针。具有动态平衡的优点。

    散列索引:建立若干个桶,将索引属性按照其散列函数值映射到相应桶中,桶中存放索引属性值和相应的元组指针。查找速度快。

    位图索引:引用向量记录索引属性中可能出现的值,每个位向量对应一个可能的值。

  • 建立索引

    CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
    ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);

    次序ASC(升序,默认) DESC(降序)
    索引可以建立在一列或多列上。
    UNIQUE:此索引的每一个索引值只对应唯一的数据记录。
    CLUSTER:聚簇索引。

  • 修改索引名
    ALTER INDEX<旧索引名>RENAME TO<新索引名>

  • 删除索引
    建立索引是为了减少查询的时间,但若数据增删改频繁,系统会花费很多时间来维护索引,降低了查询的效率。

    DROP INDEX <索引名>;

    删除索引时,系统会从数据字典中删去有关该索引的描述。

    不能用DROP INDEX命令删除由PRIMARY KEY约束或UNIQUE约束创建的索引。这些索引必须通过删除PRIMARY KEY约束或UNIQUE约束,由系统自动删除。

    在删除聚集索引时,表中的所有非聚集索引都将被重建。

数据字典

  • 是关系数据库管理系统内部的一组系统表,记录了数据库中所有的定义信息(关系模式定义,视图定义,索引定义,完整性约束定义,各类用户对数据库的操作权限,统计信息)。

    关系数据库管理系统在执行SQL数据定义语句时,实际上就是在更新数据字典表中的相应信息。

    在进行查询优化和查询处理时,数据字典中的信息是极其重要的依据。

数据查询

  • SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
    FROM <表名或视图名>[,<表名或视图名>|(SELECT语句)[AS]<别名>]…
    [ WHERE <条件表达式> ]
    [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
    [ ORDER BY <列名2> [ ASC|DESC ] ];

    根据WHERE字句的条件表达式从FROM字句指定的基本表、视图或派生表中找出满足条件的元组,在按照SELECT子句中的目标列表达式选出元组中的属性值形成结果表。

    目标列表达式可以为:算术表达式、字符串常量、函数、列别名。目标列表达式中各列的先后顺序可以与表中的顺序不一致。

    DISTINCT:消除取值重复的行,缺省值为ALL。

    GROUP BY字句:将结果按某列或多列的值进行分组,该属性列值相等的元组为一个组,通常会在某组中用聚集函数。

    HAVING子句:只有满足条件的组才予以输出。

    ORDER BY子句:可以按一个或多个属性列排序。升序:ASC(默认),;降序:DESC。

单表查询

仅涉及一个表的查询。

  • 选择表中的若干列
    若干列:SELECT <目标表达式>FROM <表名>;

    所有列:SELECT *FROM <表名>;若要改变列的顺序则可以一一列举列名。

    查询经过计算的值:目标表达式是表达式。

    可以通过指定别名来修改查询结果的列标题:SELECT <列名><别名>FROM Student;

  • 选择表中的若元组

    过程:对要查询的表进行全表扫描,取出一个元组,若满足WHERE子句,则取出该元组的某列输出,否则跳过该元组,取下一个元组。重复该过程,直到处理完表中的所有元组。

    消除重复的行:DISTINCT

    查询满足条件的元组:通过WHERE子句实现。

    比较大小:=,>,<,>=,<=,!=,<>,!>,!<,NOT加上述比较运算符。

    确定范围:BETWEEN AND(闭区间),NOT BETWEEN AND

    确定集合:IN<表值>…,NOT IN<表值>…

    字符匹配:LIKE,NOT LIKE。[NOT]LIKE’<匹配串>’[ESCAPE’<换码字符>’],匹配串可以是一个完整的字符串,也可以含有通配符(%:任意长度的字符串,_:单个字符)。若含有通配符,就需要使用ESCAPE’<换码字符>'来进行转义(类似于转义字符,ESCAPE ‘\’ 表示“ \” 为换码字符,跟在\后面的字符不再具有通配符的含义 )。

    空值:IS NULL,IS NOT NULL

    多重条件(逻辑运算):AND,OR(AND的优先级高于OR),NOT。用户可是使用括号来改变优先级。

  • ORDER BY子句:对查询结果的一个或多个属性列排序。升序:ASC(默认),降序:DESC。对于空值,排序时显示的次序由系统来决定。

  • 聚集函数:SELECT 函数名 FROM 表名…
    COUNT([DISTINCT|ALL] *):统计元组的个数
    COUNT([DISTINCT|ALL] <列名>):统计一列中值的个数
    SUM([DISTINCT|ALL] <列名>):计算一列值的总和
    AVG([DISTINCT|ALL] <列名>):计算一列值的平均值
    MAX([DISTINCT|ALL] <列名>):求一列值中的最大值
    MIN([DISTINCT|ALL] <列名>):求一列值中的最小值

    除统计元组个数外,都跳过空值,处理非空值。

    WHERE子句中不能使用聚集函数作为条件表达式。聚集函数只能用于SELECT子句和ORDERBY中的HAVING子句。

  • GROUP BY字句:将结果按某列或多列的值进行分组,值相等的元组为一个组,分组后,聚集函数将作用于每一个组,作用对象是查询的中间结果表。细化聚集函数的作用对象。

    HAVING子句:只有满足条件的组才予以输出。

    HAVING短语与WHERE子句的作用对象不同:WHERE子句作用于基表或视图,从中选择满足条件的元组,HAVING短语作用于组,从中选择满足条件的组。

连接查询

同时涉及两个以上的表。

  • 嵌套循环法连接算法:首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表1中的全部元组都处理完毕。

  • 排序合并法(常用于等值连接):首先按连接属性对表1和表2排序,对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组,当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续。找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组,直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续。重复上述操作,直到表1或表2中的全部元组都处理完毕为止。

  • 等值与非等值连接查询
    连接条件或连接谓词:WHERE子句中用来连接两个表的条件。

    [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
    [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>

    连接运算符为等号时,称为等值连接,使用其他运算符称为非等值连接。

    连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必是相同的。

    若属性名在参加连接的各表中是唯一的,可以省略表名前缀。

    自然连接:自然连接是一种特殊的等值连接,两个关系中进行比较的分量必须是相同的属性组,在结果中把重复的属性列去掉。

    一条SQL语句可以同时完成选择和连接查询,这是WHERE子句是由连接谓词和选择谓词组成的复合条件。

  • 自身连接:一个表与其自己进行连接。需要给表起别名以示区别。由于所有属性名都是同名属性,因此必须使用别名前缀

  • 外连接
    在自然连接中,只有在两个表中匹配的才能在结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即另外一个表中的所有行都出现在结果集中)。

    左外连接:列出左边关系中所有的元组,在右边关系的属性上填空值。
    SELECT 列名
    FROM 表名1 LEFT OUTER JOIN 表名2 ON 1. 列名=2. 列名

    右外连接:列出右边关系中所有的元组,在左边关系的属性上填空值。
    SELECT 列名 FROM 表名1 RIGHT OUTER JOIN 表名2 ON 1. 列名=2. 列名

    全外连接
    SELECT 列名 FROM 表名1 FULL OUTER JOIN 表名2 ON 1. 列名=2. 列名

  • 多表连接:两个以上的表进行连接。

    RDBMS在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。

嵌套查询

  • 一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。

    上层的查询块称为外层查询或父查询,下层的查询块称为内层查询或子查询。子查询总是写在圆括号中,可以用在使用表达式的任何地方。

    子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。

    SQL语言允许多层嵌套查询。

    有些嵌套查询可以用连接运算代替。

  • 相关子查询:是指在子查询中,子查询的查询条件中引用了外层查询表中的字段值。查询的结果集取决于外部查询当前的数据行。

    子查询为外部查询的每一行执行一次,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表。然后再取外层表的下一个元组,重复这一过程,直至外层表全部检查完为止。

  • 不相关子查询:子查询的查询条件不依赖于父查询。

    先执行子查询,子查询的结构用于建立其父查询的条件。

  • 带有IN谓词的子查询:通常子查询的结果是一个集合。
    父查询与子查询之间用IN或NOT IN进行连接,判断某个属性列值是否在子查询的结果中。IN表示属于,即外部查询中用于判断的表达式的值与子查询返回的值列表中的一个值相等;NOT IN表示不属于。

  • 带有比较运算符的子查询
    父查询与子查询之间用比较运算符进行连接。

    用户必须确切地知道子查询返回的是一个单值,否则数据库服务器将报错。返回的单个值被外部查询的比较操作使用,该值可以是子查询中使用集合函数得到的值。

  • 带有ANY(SOME)或ALL谓词的子查询
    子查询返回单值时可以使用比较运算符,返回多值时要用ANY(SOME)或ALL谓词修饰符。

    使用ANY(SOME)或ALL谓词必须同时使用比较运算符。

    ANY:任意一个值
    ALL:所有值
    在这里插入图片描述
    在这里插入图片描述
    使用ANY关键字的比较测试:通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较,只要有一次比较的结果为TRUE,则ANY测试返回TRUE。

    使用ALL关键字的比较测试:通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较,只要有一次比较的结果为FALSE, 则ALL 测试返回FALSE。

    ANY和ALL都用于一个值与一组值的比较。

  • 带有EXISTS谓词的子查询
    带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

    若内层的查询结果非空,则外层的WHERE子句返回真值,否则返回假值。

    由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。

    相关子查询:取外层查询中的第一个元组,根据他与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,取外层查询中的元组放入结果表,然后取外层表中的下一个元组,重复这一过程,直到外层表全部检查完为止。

    NOT EXISTS谓词:若内层查询结果非空,则外层的WHERE子句返回假值,若内层查询结果为空,则外层的WHERE子句返回真值。

    一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。

  • SQL语言中没有全称量词任意,可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
    (x)P ≡  ( x( P))

  • SQL语言中没有蕴函(Implication)逻辑运算,可以利用谓词演算将逻辑蕴函谓词等价转换为:
    在这里插入图片描述

集合查询

  • SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可以进行集合操作。

    参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同 。

  • 并操作UNION:将多个查询结果合并起来时,系统自动去掉重复元组。UNION ALL:将多个查询结果合并起来时,保留重复元组。

    将两个表(结果集)顺序连接。

    UNION中的每一个查询所涉及到的列必须具有相同的列数、相同位置的列的数据类型要相同。若长度不同,以最长的字段作为输出字段的长度。

    最后结果集中的列名来自第一个SELECT语句。

    最后一个SELECT查询可以带ORDER BY子句,对整个UNION操作结果集起作用。且只能用第一个SELECT查询中的字段作排序列。

  • 交操作INTERSECT

  • 差操作EXCEPT

基于派生表的程序

  • 子查询可以出现在FROM子句中,这是子查询生成的临时派生表成为主查询的查询对象。

    若子查询中没有聚集函数,派生表可以不指定属性列,子查询后面的列名为其默认属性。

    FROM子句生成派生表时AS可以省略。

    派生表的定义语句执行完成后立即被删除。

  • 子查询:(SELSET 列名 FROM 表名 WHERE…)AS别名

数据更新

插入数据

  • 插入元组
    INSERT
    INTO <表名> [(<属性列1>[,<属性列2 >…)]
    VALUES (<常量1> [,<常量2>]…);

    常量值和属性列一一对应。

    INTO子句没有出现的属性列,新的元组在这些列上取空值。

    提供的值必须与INTO子句中属性列的域匹配。定义了非空的属性列不能取空值。

    若INTO子句没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。

    属性值中的字符串要用单引号引起来。

    属性列的顺序可与表定义中的顺序不一致

  • 插入子查询结果(可以一次插入多个元组)
    INSERT
    INTO <表名> [(<属性列1> [,<属性列2>… )]
    子查询;

    SELECT子句目标列必须与INTO子句匹配。

  • RDBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则。

修改数据

  • 语句格式
    UPDATE <表名>
    SET <列名>=<表达式>[,<列名>=<表达式>]…
    [WHERE <条件>];

  • 修改指定表中满足WHERE子句条件的元组,SET子句给出表达式的值用于取代相应的属性列值。

    若省略WHERE子句,则修改表中的所有元组。

  • 修改方式
    修改某一个元组的值
    修改多个元组的值
    带子查询的修改语句:子查询用于构造修改的条件。

  • RDBMS在执行修改语句时会检查所插元组是否破坏表上已定义的完整性规则

删除数据

  • 语句格式
    DELETE
    FROM <表名>
    [WHERE <条件>];

  • 删除指定表中满足WHERE子句条件的元组。缺省WHERE子句表示要删除表中的全部元组,表的定义仍在字典中。即DELETE子句删除的是表中的数据,而不是关于表的定义。

  • 三种删除方式
    删除某一个元组的值
    删除多个元组的值
    带子查询的删除语句

空值的处理

  • 允许空值的情况
    应该有值但目前不知道他的具体指。
    不应该有值。
    不便于填写。

  • 空值的产生:插入元组,外连接。

  • 空值的判断:IS NULL或IS NOT NULL。

  • 空值的约束条件
    属性定义中有NOT NULL约束的,UNIQUE约束,码属性不能取空值。

  • 逻辑运算
    在这里插入图片描述
    空值与另一个值的算数运算结果为空值。

    空值与另一个值的比较运算结果为UNKNOWN。

视图

  • 视图是由一个或多个数据表或视图导出的虚拟表或查询表,是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。

  • 视图是虚表:视图只储存了它的定义,而没有储存视图对应的数据,这些数据仍存放在原来的数据表中,数据与基表中数据同步,即对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

    视图在操作上又是表。因为视图一旦定义好,就可以像基本表一样进行数据操作,包括查询、修改、删除和更新数据。但是对其的更新操作有一定的限制。

定义视图

  • 建立视图
    CREATE VIEW <视图名>[(<列名1>[,<列名2>]…)]
    [WITH ENCRYPTION]
    AS <子查询>
    [WITH CHECK OPTION]
    其中WITH ENCRYPTION子句对视图进行加密。

    子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语取决于具体的系统实现。

    WITH CHECK OPTION表示对视图进行 UPDATE、INSERT和DELETE操作时,要保证所操作的行满足视图定义中的谓词条件,即只有满足视图定义条件的操作才能执行。

    属性列或者全部指定,或者全部省略。若省略属性列名,则由SELECT子句目标列中的字段组成。

    必须指定列名的情况:目标列不是单纯的属性名,而是具体的聚集函数或列表达式。多表连接时选出了几个同名列作为视图的字段。需要在视图中为某个列启用更合适的名字。

    RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。

    视图可以建立在或者单个基本表上,或者多个基本表上,或者一个或多个已经定义好的视图上,或者建立在基本表与视图上。

    行列子集视图:从单个基本表导出,并且只是去掉了基本表的某些行和列,但保留了主码。

    派生的属性列:由基本表数据经过计算派生出的数据一般不存储。定义视图时可以根据应用的需要设置一些派生的属性列,又称为虚拟列。带虚拟列的视图又称为带表达式的视图。

    用带有聚集函数和GROUP BY子句的查询来定义的视图称为分组视图。

    在使用SELSCT*时,注意视图属性和表属性的对应。

  • 删除视图
    DROP VIEW <视图名1>[,<视图名2>]…[CASCADE];

    该语句从数据字典中删除指定的视图定义,如果该视图上还导出了其他视图,使CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除。

    删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除。

查询视图

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

更新视图

  • 通过视图来插入、删除和修改数据。对视图的更新最终要转换为对基本表的更新。

    并不是所有的视图都是可更新的(聚集函数)。有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。一般的,行列子集视图是可更新的,对其他类型视图的更新不同系统有不同限制。

视图的作用

  • 视图能够简化用户的操作
  • 视图使用户能以多种角度看待同一数据
  • 视图对重构数据库提供了一定程度的逻辑独立性
  • 视图能够对机密数据提供安全保护
  • 适当的利用视图可以更清晰的表达查询
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值