第三章 关系数据库SQL语言
本章为重点章,应熟悉和掌握SQL的数据定义、数据查询、数据更新的句法及其应用,特别是数据查询的应用。结合上机 *** 作进行理解和掌握。
一、SQL概述。
1、SQL发展历程( 识记 )
SQL从1970年美国IBM研究中心的EFCodd发表论文到1974年Boyce和Chamberlin把SQUARE语言改为SEQUEL语言,到现在还在不断完善和发展之中,SQL(结构式查询语言)虽然名为查询,但实际上具有定义、查询、更新和控制等多种功能。
2、SQL数据库的体系结构( 领会 )
SQL数据库的体系结构也是三级结构 ,但术语与传统关系模型术语不同,在SQL中,关系模式称为“ 基本表 ”,存储模式称为“ 存储文件 ”,子模式称为“ 视图 ”,元组称“ 行 ”,属性称“ 列 ”。
SQL数据库体系的结构要点如下:
(1)一个SQL数据库是表的汇集。
(2)一个SQL表由行集构成,行是列的序列,每列对应一个数据项。
(3)表或者是基本表,或者是视图。基本表是实际存储在数据库中的表,视图由是由若干基本表或其他视图构成的表的定义。
(4)一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。存储文件与物理文件对应。
(5)用户可以用SQL语句对表进行 *** 作,包括视图和基本表。
(6)SQL的用户可以是应用程序,也可以是终端用户。
3、SQL的组成( 识记 )
SQL由四部分组成:
(1)数据定义:SQL DDL定义SQL模式,基本表、视图和索引。
(2)数据 *** 纵:SQL DML包括数据查询和数据更新(增、删、改)。
(3)数据控制:包括对基本表和视图的授权、完整性规则的描述,事务控制等。
(4)嵌入式SQL的使用规定。
二、SQL的数据定义( 简单应用 )
1、SQL模式的创建和撤消:
SQL 模式的创建 可简单理解为建立一个数据库,定义一个存储空间,其句法是:
CREAT SCHEMA 模式名> AUTHORIZATION 用户名>
撤消SQL模式的句法为:
DROP SCHEMA 模式名> [ CASCADE | RESTRICT ]
方括号中的选项参数CASCADE表示连锁方式,执行时将模式下所有基本表、视图、索引等元素全部撤消。RESTRICT表示约束式,执行时必须在SQL模式中没有任何下属元素时方可撤消模式。
2、SQL提供的基本数据类型
数值型:包括 integer、smallint、real、double precision 、float(n),numeric(p,d)
字符串型:char(n)、varchar(n),前者是定长,后者为变长串
位串型:bit(n),bit varying(n),同上。
时间型:date、time
3、基本表的创建、修改和撤消
基本表的创建:(可理解为建立表结构)
CREAT TABLE SQL 模式名。基本表名
(列名,类型,
……
完整性约束……)
完整性约束包括主键子句(PRIMARY KEY)、检查子句(CHECK)和外键子句(Foreign KEY)。
基本表结构的修改
ALTER TABLE 基本表名 ADD/ DROP (增加/删除) 列名 类型名(增加时写出)
删除时有子句 [CASCADE|RESTRICT],前者为连锁删除,后者为约束删除,即没有对本列的任何引用时才能删除。
基本表的撤消
DROP TABLE 基本表名 [CASCADE|RESTRICT]
4、视图的创建和撤消
创建: CREAT VIEW 视图名(列名表) AS SELECT 查询语句
撤消: DROP VIEW 视图名
5、索引的创建和撤消
创建: CREAT [UNIQUE] INDEX 索引名 ON 基本表名(列名表 [ASC|DESC])
撤消: DROP INDEX 索引名
总结:凡创建都用 CREAT ,删除都用 DROP ,改变用 alter ,再跟类型和名字,附加子句很容易了。
三、SQL的数据查询( 综合应用 )
这一段是本章的重点内容,应该熟练掌握。首先了解基本句法:
1、 SELECT -FROM- WHERE 句型
SELECT 列名表(逗号隔开) FROM 基本表或视图序列 WHERE 条件表达式
在这里,重点要掌握条件表达式中各种运算符的应用,如=,>,<,>等算术比较运算符、逻辑运算符 AND、OR、NOT 、集合成员资格运算符: IN,NOT IN ,以及嵌套的 SELECT 语句的用法要特别注意理解。 针对课本的例题和课后习题进行掌握。
在查询时, SELECT 语句可以有多种写法,如 联接查询、嵌套查询和使用存在量词的嵌套查询 等。都掌握,但是起码应能写出一种正确的查询语句。
2 SELECT 语句完整的句法:
SELECT 列名表(逗号隔开)
FROM 基本表或视图序列
[ WHERE 条件表达式] (此为和条件子句)
[GROUP BY 列名序列] (分组子句)
[HAVING 组条件表达式] (组条件子句)
[ORDER BY列名[ASC|DESC]……] (排序子句)
这段关于完整句法的内容能够理解也就问题不大了。
3、 SELECT 语句中的限定
这一段内容主要是对 SELECT 语句进一步使用进行的深入学习,领会下列各种限定的使用目的和方法。
要求输出表格中不出现重复元组,则在 SELECT 后加一DISTINCT
SELECT 子句中允许出现加减乘除及列名,常数的算术表达式
WHERE 子句中可以用BETWEEN……AND……来限定一个值的范围
同一个基本表在 SELECT 语句中多次引用时可用AS来增加别名
WHERE 子句中字符串匹配用LIKE和两个通配符,%和下划线_
查询结果的结构完全一致时可将两个查询进行并(UNION)交(INTERSECT)差(EXCPT) *** 作
查询空值 *** 作不是用='null',而是用 IS NULL来测试。
集合成员资格比较用 IN/NOT IN ,集合成员算术比较用元组θSOME/ALL
可以用子查询结果取名(表名(列名序列))来作为导出表使用
基本表的自然联接 *** 作是用 NATURAL INNER JOIN来实现的。
四、SQL的数据更新( 简单应用 )
简单应用就是掌握基本的句型并能套用在一些简单的查询要求上。
1、数据插入:
INSERT INTO 基本表名(列名表)
valueS (元组值)
或
INSERT INTO 基本表名(列名表)
SELECT 查询语句
其中元组值可以连续插入。用查询语句可以按要求插入所需数据。
2、数据删除:
DELETE FROM 基本表名 [ WHERE 条件表达式]
3、数据修改:
UPDATE 基本表名
SET 列名=值表达式,[列名=值表达式……]
[ WHERE 条件表达式]
4、对视图的更新:
我们知道,对视图的查询是和基本表相同的,但是更新 *** 作则受到下列三条规则的限制:(领会一下)
如果视图是从多个基本表使用联接 *** 作导出的,则不允许更新。
如果导出的视图使用了分组和聚合 *** 作,也不允许更新。
如果视图是从单个基本表使用选择和投影 *** 作导出的,并且包括了基本表的主键或某个候选键,则可以执行 *** 作。(这就相当于在基本表上 *** 作)。
这一节的关于增删改的 *** 作要和前面关于数据库模式、表的增删改 *** 作进行对比学习,以加深理解。不要忘记上机实践
你首先要理解什么是查询结果集
查询时实现数据库 *** 作的最主要方法,尽管从查询结果集看到的数据集合与打开的数据表看到的数据集合一样,但实质是完全不同的:
数据表是数据库中存放数据的实体对象,在数据表中看到的是数据的静态物理集合,是实际的数据源表。
查询只是针对数据源的 *** 作命令(程序),在查询结果中看到的是数据的动态逻辑集合,是执行命令对数据表 *** 作的结果,十一哥虚拟的数据表。
视图的概念
我们经常使用SELECT语句,尤其是比较复杂的查询语句,如果每次使用都要重复地输入代码是很麻烦的,如果将该语句保存为一个对象,每次使用时不需要输入代码,只给出对象的名字就能方便地使用,简化查询 *** 作。这个对象就是视图。
视图实际上就是给查询语句指定一个名字,将查询语句定义为一个独立的对象保存。
既然视图是由SELECT查询语句构成的,那么使用视图就可以直接得到SELECT语句的查询结果集,所以我们就可以这样为视图下一个定义:
视图:就是基于一个或多个数据表的动态数据集合,是一个逻辑上的虚拟数据表。
另一方面,视图又具有更强的功能:使用SELECT语句只能在结果集——动态逻辑虚拟表中查看数据,而使用视图不但可以查看数据,而且可以作为SQL语句的数据源,并且可以直接在视图中对数据表进行编辑修改删除——更新数据表中的数据。
通过视图来访问数据 其优点是非常明显的 如可以起到数据保密 保证数据的逻辑独立性 简化查询 *** 作等等
但是 话说回来 SQL Server数据库中的视图并不是万能的 他跟表这个基本对象还是有重大的区别 在使用视图的时候 需要遵守四大限制
限制条件一 视图数据的更改
当用户更新视图中的数据时 其实更改的是其对应的数据表的数据 无论是对视图中的数据进行更改 还是在视图中插入或者删除数据 都是类似的道理 但是 不是所有视图都可以进行更改 如下面的这些视图 在SQL Server数据库中就不能够直接对其内容进行更新 否则 系统会拒绝这种非法的 *** 作
如在一个视图中 若采用Group By子句 对视图中的内容进行了汇总 则用户就不能够对这张视图进行更新 这主要是因为采用Group By子句对查询结果进行汇总在后 视图中就会丢失这条纪录的物理存储位置 如此 系统就无法找到需要更新的纪录 若用户想要在视图中更改数据 则数据库管理员就不能够在视图中添加这个Group BY分组语句
如不能够使用Distinct关键字 这个关键字的用途就是去除重复的纪录 如没有添加这个关键字的时候 视图查询出来的纪录有 条 添加了这个关键字后 数据库就会剔除重复的纪录 只显示不重复的 条纪录 此时 若用户要改变其中一个数据 则数据库就不知道其到底需要更改哪条纪录 因为视图中看起来只有一条纪录 而在基础表中可能对有的纪录有几十条 为此 若在视图中采用了Distinct关键字的话 就无法对视图中的内容进行更改
如果在视图中有AVG MAX等函数 则也不能够对其进行更新 如在一张视图中 其采用了SUN函数来汇总员工的工资时 此时 就不能够对这张表进行更新 这是数据库为了保障数据一致性所添加的限制条件
可见 试图虽然方便 安全 但是 其仍然不能够代替表的地位 当需要对一些表中的数据进行更新时 我们往往更多的通过对表的 *** 作来完成 因为对视图内容进行直接更改的话 需要遵守一些限制条件 在实际工作中 更多的处理规则是通过前台程序直接更改后台基础表 至于这些表中数据的安全性 则要依靠前台应用程序来保护 确保更改的准确性 合法性
限制条件二 定义视图的查询语句中不能够使用某些关键字
我们都知道 视图其实就是一组查询语句组成 或者说 视图是封装查询语句的一个工具 在查询语句中 我们可以通过一些关键字来格式化显示的结果 如我们在平时工作中 经常会需要把某张表中的数据跟另外一张表进行合并 此时 数据库管理员就可以利用Select Into语句来完成 先把数据从某个表中查询出来 然后再添加到某个表中
当经常需要类似的 *** 作时 我们是否可以把它制作成一张视图 每次有需要的时候 只需要运行这个视图即可 而不用每次都进行重新书写SQL代码 不过可惜的是 结果是否定的 在SQL Server数据库的视图中 是不能够带有Into关键字 如果要实现类似的功能 只有通过函数或者过程来实现
另外 跟Oracle数据库不同的是 在微软的SQLServer数据库中创建视图的时候 还有一个额外的限制 就是不能够在创建视图的查询语句中 使用order by排序语句 这是一个很特殊的规定 一些Oracle的数据库管理员 在使用SQL Server数据库创建视图的时候 经常会犯类似的错误 他们就搞不明白 为什么Oracle数据库中可行 但是在微软的数据库中则行不通呢这恐怕只有微软数据库产品的设计者才能够回答的问题 总之我们要记住的就是 在SQLServer数据库中 建立视图时 查询语句中不能够包含Order By语句
限制条件三 要对某些列取别名 并保证列名的唯一
在表关联查询的时候 当不同表的列名相同时 只需要加上表的前缀即可 不需要对列另外进行命名 但是 在创建视图时就会出现问题 数据库会提示 duplicate column name 的错误提示 警告用户有重复的列名 有时候 用户利用Select语句连接多个来自不同表的列 若拥有相同的名字 则这个语句仍然可以执行 但是 若把它复制到创建视图的窗口 创建视图时 就会不成功
查询语句跟创建视图的查询语句还有很多类似的差异 如有时候 我们在查询语句中 可能会比较频繁的采用一些算术表达式;或者在查询语句中使用函数等等 在查询的时候 我们可以不给这个列 取名 数据库在查询的时候 会自动给其命名 但是 在创建视图时 数据库系统就会给你出难题 系统会提醒你为列取别名
从以上两个例子中 我们可以看出 虽然视图是对SQL语句的封装 但是 两者仍然有差异 创建视图的查询语句必须要遵守一定的限制 如要保证视图的各个列名的唯一;如果自阿视图中某一列是一个算术表达式 函数或者常数的时候 要给其取名字 等等
限制条件四 权限上的双重限制
为了保障基础表数据的安全性 在视图创建的时候 其权限控制比较严格
一方面 若用户需要创建视图 则必须要有数据库视图创建的权限 这是视图建立时必须遵循的一个基本条件 如有些数据库管理员虽然具有表的创建 修改权限;但是 这并不表示这个数据库管理员就有建立视图的权限 恰恰相反 在大型数据库设计中 往往会对数据库管理员进行分工 建立基础表的就只管建立基础表;负责创建视图的就只有创建视图的权限
其次 在具有创建视图权限的同时 用户还必须具有访问对应表的权限 如某个数据库管理员 已经有了创建视图的权限 此时 若其需要创建一张员工工资信息的视图 还不一定会成功 这还要这个数据库管理员有美誉跟工资信息相关的基础表的访问权限 如建立员工工资信息这张视图一共涉及到五张表 则这个数据库管理员就需要拥有者每张表的查询权限 若没有的话 则建立这张视图就会以失败告终
第三 就是视图权限的继承问题 如上面的例子中 这个数据库管理员不是基础表的所有者 但是经过所有者的授权 他就可以对这个基础表进行访问 就可以以此为基础建立视图 但是 这个数据库管理员有没有把对这个基础表的访问权限再授权给其他人呢如他能否授权给A用户访问员工考勤信息表呢答案是不一定 默认情况下 数据库管理员不能够再对其他用户进行授权 但是 若基础表的所有者 把这个权利给了数据库管理员之后 则他就可以对用户进行重新授权 让数据库管理员可以给A用户进行授权 让其可以进行相关的 *** 作
lishixinzhi/Article/program/SQLServer/201311/22451
第三章 关系数据库SQL语言
32 SQL数据库的体系结构及术语:
SQL数据库的体系结构也是三级,但术语与传统的关系模型不同。
关系模式称为“基本表”,存储模式称为“存储文件”,子模式称为“视图”,元组称为“行”,属性称为“列”。
33 SQL数据库的体系结构要点是什么:
(1) 一个SQL数据库是表(table)的汇集,它用一个或多个SQL模式定义。一个SQL模式是表和授权的表态定义。
(2) 一个SQL表由行集构成,一行是列的序列,每列对应一个数据项。
(3) 一个表或者是一个基本表,或者是一个视图。(视图只保存定义,不保存数据)
(4) 一个基本表可跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储器上一个物理文件对应。
(5) 用户可用SQL语句对视图和基本表进行查询等 *** 作。
(6) SQL用户可以是应用程序,也可以是终端用户。
34 SQL的组成分成几部分:
SQL主要分成四部分:
(1) 数据定义。(SQL DDL)用于定义SQL模式、基本表、视图和索引的创建和撤消 *** 作。
(2) 数据 *** 纵。(SQL DML)数据 *** 纵分成数据查询和数据更新两类。数据更新又分成插入、删除、和修改三种 *** 作。
(3) 数据控制。包括对基本表和视图的授权,完整性规则的描述,事务控制等内容。
(4) 嵌入式SQL的使用规定。涉及到SQL语句嵌入在宿主语言程序中使用的规则。
35 SQL模式的撤消有哪两种方式:
CASCADE(连锁式)方式:执行DROP语句时,把SQL模式及其下属的基本表、视图、索引等所有元素全部撤消。
RESTRICT(约束式)方式:执行DROP语句时,只有当SQL模式中没有任何下属元素时,才能撤消SQL模式,否则拒绝执行DROP语句。
36 SQL提供的基本数据类型有哪些?每种举两个例子:
(1) 数值型:INTEGER长整数、SMALLINT短整数
(2) 字符串型:CHAR(N)长度为N的定长字符串、VARCHAR(N)具有长度为N的变长字符串。
(3) 位串型:BIT(N)长度为N的二进制位串、BIT VARYING(N)长度为N的变长二进制位串
(4) 时间型:DATE日期、TIME时间
SQL2允许用户使用“CREATE DOMAIN”语句定义新的域。
37 完整性约束主要有哪三种子句:
完整性约束主要有三种子句:主键子句(PRIMARY KEY),检查子句(CHECK)和外键子句(FOREIGN KEY)
38 什么是视图,它与表的区别是什么:
在SQL中,外模式一级数据结构的基本单位是视图,视图是从若干基本表和(或)其他视图构造出来的表。我们创建一个视图时,只是把其视图的定义存放在数据字典中,而不存储视图对应的数据,因此,视图被称为“虚表”,这是它与表的主要区别。
39 对于视图元组的更新 *** 作(INSERT、DELETE、UPDATE)有哪三条规则:
(1) 如果一个视图是从多个基本表使用联接 *** 作导出的,那么不允许对这个视图执行更新 *** 作。
(2) 如果在导出视图的过程中,使用了分组和聚合 *** 作,也不允许对这个视图执行更新 *** 作。
(3) 如果视图是从单个基本表使用选择、投影 *** 作导出的,并且包含了基本表的主键或某个候选键,那么这样的视图称为“行列子集视图”,并且可以被执行更新 *** 作。
SQL2中,允许更新的视图在定义时,必须加上“WITH CHECK OPTION”短语。
40 SQL语言有哪两种使用方式:
一种是在终端交互方式下使用,称为交互式SQL;
另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL,而这些高级语言可以是C、PASCAL、COBOL等,称为宿主语言。
41 嵌入式SQL的实现有哪两种处理方式:
一种是扩充宿主语言的编译程序,使之能处理SQL语句;
另一种是采用预处理方式。目前多数系统采用后一种。
42 在宿主语言的程序中使用SQL语句有哪些规定:
(1) 在程序中要区分SQL语言与宿主语句。所有SQL语句前必须加上前缀标识“EXEC SQL”,并以“END_EXEC”作为语句的结束标志。(结束标志在不同的宿主语言中不同)
(2) 允许嵌入的SQL语句引用宿主语言的程序变量(共享变量),但有两条规定:
1) 引用时,这些变量前必须加冒号“:”作为前缀,以示与数据库中变量有区别。
2) 这些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。
43 用游标机制协调SQL的集合处理方式所用的SQL语句有哪些:
与游标有关的SQL语句有下列四个:
(1) 游标定义语句(DECLARE)
(2) 游标打开语句(OPEN)
(3) 游标推进语句(FETCH)
(4) 游标关闭语句(CLOSE)
44 SQL DML的嵌入使用技术:
(1) 若是INSERT、DELETE、UPDATE语句,则不必涉及游标,只要加上前缀标识和结束标志就能嵌入宿主语言程序中使用。
(2) 若是已知查询结果肯定是单元组的SELECT语句,则不必涉及游标,也可加上前缀标识和结束标志后嵌入宿主语言程序中使用,但此时应该在SELECT语句中增加一个INTO子句,指出找到的值应送到相应的共享变量中去。
(3) 若是已知查询结果为多个元组的SELECT语句,则必须涉及到游标,用游标机制把多个元组一次一个地传送给宿主程序处理。
以上就是关于自考《数据库原理》串讲—关系数据库SQL语言全部的内容,包括:自考《数据库原理》串讲—关系数据库SQL语言、数据库视图是什么,有什么用,怎么用、SQL Server视图管理中的四个限制条件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)