【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图

教材:王珊 萨师煊 编著 数据库系统概论(第5版) 高等教育出版社
注:文档高清截图在后

不同数据库产品对SQL语句的语法要求是不同的,不能全部按照课本上的内容来学习。后续的SQL语句语法相关的内容不会被详实地写入接下来的归纳梳理中,最多只是简单提及。大家应该根据自己使用的数据库产品自行搜索其它资料来学习SQL语句的更多使用。

3.3 数据定义(续)

3、当表的数据量很大或需要大量查询操作时,花费的时间就比较多。建立索引是加快查询速度的有效手段。数据库索引类似于图书馆的图书分类或字典中的索引,能快速定位到查询内容的位置。用户可以手动建立索引。在特定的情况下,比如声明主键时,数据库系统会自动建立索引,无需用户再进行创建。建立索引的数据允许重复。

4、常见的数据库索引类型有:顺序文件索引、B+树索引、R树(R树)索引、散列(Hash,哈希)索引、位图索引等。顺序文件索引是建立在被索引属性上的索引,由属性值和相应元组的指针组成。该索引常常结合其它方法来加快索引速率,比如排序后二分查找。二分查找的时间复杂度为O(nlogn)。B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,由B树(B-树,B-tree,平衡多路查找树)演化而来,树的深度一般比B树要少,索引的时间复杂度表现稳定。R树则是B树的思想在高维空间的扩展,其变体之一——R树改进了R树在维度较高的空间中效率变低的问题。散列索引则建立若干个名为桶的数据结构,将哈希相同的数据全部映射到相同的桶中。当哈希函数表现优秀时,时间复杂度仅为O(1)。但哈希碰撞较多时,时间复杂度可能退化为O(n)。位图索引用位向量记录被索引属性中可能的值,每个位向量对应一个可能的值。该方法适用于静态数据,不适于频繁修改的系统。
CREATE INDEX、ALTER INDEX、DROP INDEX语句分别用于建立、修改、删除索引。
建立和维护索引需要花费额外的时间和空间。当索引带来的查询时间的收益不高时,不应专门建立索引。

5、数据字典是DBMS内部的一组系统表,记录了数据库的全部定义信息,包括关系模式定义、视图定义、索引定义、完整约束性定义、各用户对数据库的操作权限、统计信息等。关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。数据字典的信息是查询优化和处理重要依据。

3.4 数据查询

1、数据查询是数据库的核心操作。SQL的SELECT语句是进行数据查询的基本语句。执行SELECT语句后,命令行或GUI会给出相应的查询结果。查询结果中列的先后顺序可以与表中的顺序不一致。SELECT语句可以通过表达式、谓词(包括运算符)或结合WHERE子句、聚集函数(求最值、求平均、统计等)来进行限定条件的查询。WHERE子句不能包含聚集函数。=运算和LIKE谓词可以在指定字符匹配条件时互换,前提是LIKE后的匹配串无通配符(任意多个字符和任意单个字符分别用%和_代替;当字符集为ASCII时,指定任意一个汉字需要两个_,为GBK时只需要一个_;当需要输出这两个字符本身时,使用转义字符\输出,例如_)。类似地,!=或<>(不等)可以在一定条件下取代NOT LIKE谓词。SELECT *代表选择全部的列。
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图

2、ORDER BY子句指定查询结果的排列顺序,可以是升序(ASC)或降序(DESC),默认为升序。GROUP BY中可以含有HAVING子句,用于仅允许满足条件的组的输出。

3、DISTINCT接在SELECT之后,可以将重复的行从输出结果中删去。

4、有序输出时,空值是先于所有非空值输出还是在最后输出视系统的不同而不同。

5、当查询涉及多个表时,称为连接查询。常见的几种连接的定义请回顾第二章的2.4节。一个表与其自身也可以进行连接。

6、SQL中,一个SELECT-FROM-WHERE语句称为一个查询块。一个查询块可以嵌入另一个查询块的WHERE子句或HAVING子句中,形成嵌套查询。嵌套查询使用户可以用多个简单查询直接构造复杂查询,增强了SQL的查询能力。层层嵌套构造程序,正式SQL中“结构化”的含义所在。实现同一个查询请求有多种方法,但不同的方法的效率有差别,有时甚至很大。数据库编程人员应当掌握数据库性能调优技术。一部分嵌套查询可以用连接查询替代。嵌套查询层次清晰、易于构造,但其查询速度不如连接运算。所以在实际运用中,应该尽可能多用连接运算。

7、子查询有时候会返回多个值。同时采用ANY(有的系统使用SOME)、ALL谓词与比较运算符可以筛选符合指定条件的值。
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图

8、EXISTS代表存在量词,带有EXISTS的子查询只返回逻辑值true或false。仅查询结果为空时,该子查询返回false。EXISTS具有意义相对的NOT EXISTS。

9、SQL不含全称量词。按照自然语言编写SQL语句时,需要将带有全称量词的谓词转换为等价的带有存在量词的谓词:
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图

10、SQL不包含蕴涵(implication)逻辑运算。利用命题逻辑的常见等值式,将蕴涵等价转换:
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图

11、子查询不但可以包含在WHERE子句中,还可以直接置于SELECT…FROM语句的FROM之后。这时,内层的子查询会生成临时的派生表(derived table)作为主查询的查询对象。语句执行完毕后,派生表就被自动删除。

12、多个查询结果可以进行集合操作,包括并(UNION)、交(INTERSECT)和差(EXCEPT)。

13、SQL的常见语句中,不少语句可以对输出结果指定列别名。相关的语法请大家自行学习。

3.5 数据更新

1、INSERT语句可以插入元组,用VALUES指定新元组的赋值,字符串用单引号括起来。赋值与指定的列一一对应,未赋值的列会置空或取默认值。INSERT可以插入元组,也可以插入子查询的结果。

2、UPDATE语句可以修改一个或多个元组的值,子查询也可以嵌套在UPDATE语句中。

3、DELETE语句可以删除表中的数据(而不删除表的定义),子查询也可以嵌套在DELETE语句中。

3.6 空值的处理

1、空值是“不知道”或“不存在”或“无意义”的值。空值是一个很特殊的值,含有不确定性。对可以产生空值的关系运算,需要特殊处理。

2、IS NULL和IS NOT NULL来判断一个属性值是否为空。在属性定义或域定义中可以通过NOT NULL约束条件来令属性不可取空值。加入了UNIQUE限制的属性也不可以为空值,指定为码的属性同样不能为空值。

3、空值与另一个值(包括空值)的算术运算结果都为空,与另一个值(包括空值)的比较运算返回UNKNOWN。有了这个返回值后,传统的二值逻辑就扩展成三值逻辑。注意UNKNOWN和TRUE是不同的,查询语句中只有使WHERE和HAVING子句的选择条件判定为TRUE时,该结果才被选为输出结果。
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图

3.7 视图

1、视图是从若干基本表和/或视图中导出的表,是一个虚表,其数据不会存入数据库,数据库只保存视图的定义。基本表变化后,视图的数据也就变了。视图的增删改比直接查询有所限制。

2、CREATE VIEW命令可以从子查询中抽取一部分数据来创建视图。WITH CHECK OPTION修饰令视图的增删改操作保证满足视图定义中的谓词条件(子查询中的条件表达式),修饰后对视图增删改时,子查询中的条件由DBMS自动满足。
视图的列名在大多数时候可以全部省略,此时视图包含的列是子查询中SELECT语句选出的全部列。视图的属性列只能全部省略或一一列出,没有第三种选择。以下三种情况中,必须明确声明视图的全部列名:
(1)某个列不是单纯的属性名,而是聚集函数或列表达式。
(2)子查询为多表连接时,选择了同名列。
(3)需要在视图中给一些列启用别名。
CREATE VIEW语句执行后,只把视图的定义存入数据字典,并不立刻执行SELECT语句。只有查询视图时,才会按视图的定义从基本表查出数据。

3、若一个视图是从单个基本表导出的,且只是去掉基本表的某些行和列,但保留了主码,就称这类视图为行列子集视图。

4、定义基本表时,为了减少冗余数据,表中只存放基本数据,而由基本数据计算出的数据一般不专门存储。视图中的数据是不会存入数据库的,定义视图时设置的一些派生属性列也不在基本表中实际存在,这些列称为虚拟列。

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

6、DROP VIEW命令用于删除视图。

7、SELECT语句也可以查询视图。查询视图时,DBMS先进行有效性检查,即检查待查的表、视图是否存在。如存在,则从数据字典取出视图的定义,先执行子查询,再从子查询结果构建视图。这个过程称为视图消解(view resolution)。

8、多数关系数据库系统对行列子集视图的查询均能正确转换(视图的查询其实是转换为等价的基本表查询进行的)。但非行列子集视图不是直接删去某些行或列而构成的。对这种视图查询的时候,关系数据库系统不一定能正确转换。当不能正确转换时,这类查询语句应该改成直接对基本表进行。

9、更新视图(增删改)时,基本表中也会执行相应的操作。但并不是所有视图都是可更新的,因为在对基本表做相应的更新操作时受到限制或无法对应唯一的有意义的基本表更新。比如基本表中的某一列被作为视图的列,但这个基本表的列的值是由其它列经过某种计算得来的结果。通过视图更新该列时,操作会被拒绝,因为决定这个列的基本表中的属性值并未更新,基本表中的该列自然也无法变动,视图的更新也就随之失败。
一般地,行列子集视图是可更新的。此外某些非行列子集视图理论上是可更新的,但这类视图的确切特征还是待研究的课题。有些视图理论上就是不允许更新的。各DBMS一般只允许更新行列子集视图,而各数据库产品对视图的更新都有进一步的不尽相同的限制。不可更新的视图与不允许更新的视图是不同的概念。前者指理论上不允许更新的视图,后者是指实际操作中因为一些原因不支持更新但理论上并未禁止其更新的视图。

10、视图的作用:
(1)简化用户的操作。用户在操作数据时,通过视图仅展现需要了解的数据而隐去不必要显示的数据和过程,将注意力集中在关心的数据上,令查看与修改简单而清晰。
(2)视图使用户能多角度看待同一数据。不同种类的用户共享一个数据库时,通过不同的视图来展现同样的数据,这种灵活性是非常重要的。
(3)视图对重构数据库提供了一定程度的逻辑独立性。即:当数据库的结构变动(常见的一种:一个基本表被拆分成多个基本表)时,新建立的视图通常仍然可以实现用户原来就需要的关系,使得用户的外模式不变,用户的应用程序仍然能够通过视图就直接查找数据。
(4)视图能够对机密数据提供安全保护。对不同的用户展现不同的视图,不显示需要保密的数据,就实现了对机密数据的安全保护功能。
(5)适当利用视图可以更清晰地表达查询。
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图
【梳理】数据库系统概论 第3章 关系数据库标准语言SQL 3.3 数据定义(续)3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图