610 likes | 873 Views
数据库原理与应用. 第三章 关系数据语言 SQL. 第三章 关系数据库语言 SQL. SQL 概述 SQL 表定义 SQL 表查询 SQL 表更新 SQL 视图 SQL 索引 SQL 的完整性控制 SQL 的安全性控制 嵌入式 SQL. SQL 概述 -SQL 的用途. SQL(Structured Query Language) 一种关系数据库的标准语言 , 包括数据定义、数据操纵、事务控制等功能。 访问数据库有两种方式 : SQL( 交互式或嵌入式 ) 是其中之一 ; 另一种是通过 ODBC 、 JDBC 等 API (应用编程接口)进行访问。.
E N D
数据库原理与应用 第三章 关系数据语言SQL
第三章 关系数据库语言SQL • SQL概述 • SQL表定义 • SQL表查询 • SQL表更新 • SQL视图 • SQL索引 • SQL的完整性控制 • SQL的安全性控制 • 嵌入式SQL 3.2
SQL概述-SQL的用途 • SQL(Structured Query Language) 一种关系数据库的标准语言,包括数据定义、数据操纵、事务控制等功能。 • 访问数据库有两种方式: SQL(交互式或嵌入式)是其中之一; 另一种是通过ODBC、JDBC等API(应用编程接口)进行访问。 3.3
SQL概述-SQL标准 • 1986年,ANSI和ISO发布了第一个SQL标准,通常称为SQL-86(也称为SQL1)。ANSI于1989年发布了SQL-86的扩展版SQL-89;1992年发布了SQL-92(也称为SQL2)。目前SQL的最新版本是1999年发布的SQL-99(也称为SQL3)。 • SQL-92定义了入门级、中间级和完全级三个级别用于衡量数据库产品对它的支持程度.入门级对数据库产品的要求最低;中间级包含入门级的所有内容及一些扩展;完全级则要求数据库产品支持所有SQL-92特性。目前大部分主流数据库产品都基本支持SQL-92的入门级及中间级。 • SQL-99是SQL-92的超集,主要在SQL-92基础上增加了面向对象等新兴数据库技术的扩展。迄今为止,还没有一个数据库产品支持SQL-99的全部特性,因此目前使用最为广泛的SQL标准仍然是SQL-92。 3.4
SQL概述-SQL特点 • 陈述式而非过程式 • 面向集合而非面向记录 • 数据定义、控制和操纵一体化 • 数据定义语言(DDL):SQL DDL提供了关系定义、删除和修改等丰富的数据定义功能; • 数据操纵语言(DML):SQL DML提供了数据查询、插入、更新和删除等数据操纵功能; • 完整性控制:SQL提供了完善的对实体完整性和参照完整性的支持; • 安全性控制:SQL通过用户身份鉴别、权限管理和审计,提供了完善的安全性控制功能。 • 支持数据库三级模式 • 视图(View)对应于外模式 • 基本表(Table)对应于模式 • 索引(Index)及其它存储参数等则对应于内模式。 3.5
SQL表定义 • CREATE TABLE Book ( isbn CHAR(20), title VARCHAR(100) NOT NULL, price NUMERIC(6,2) NOT NULL, press VARCHAR(100), year INT NOT NULL, stock INT DEFAULT 0, PRIMARY KEY (isbn), CHECK (stock >= 0) ) • CREATE TABLE Author ( author# INT PRIMARY KEY, name VARCHAR(50) NOT NULL, city VARCHAR(50) ) 3.6
SQL表定义 • SQL-92中定义的标准数据类型: • CHAR(n): 长度恒定为n字节的定长字符串。 • VARCHAR(n): 长度最大为n字节的不定长字符串。 • BIT(n): 长度恒定为n个比特的定长比特流。 • INT / INTEGER: 整数类型。相当于C语言中的int类型。 • SMALLINT: 小整数。 • NUMERIC(p,q): 总长度为p,小数位数为q的十进制数值类型。如123.42对应的类型为NUMERIC(5,2)。 • REAL, DOUBLE: REAL为单精度浮点数,DOUBEL为双精度浮点数。 • DATE: 日期类型,由年、月、日组成,可以有多种表示方法,如“Oct 21, 2003”、“2003-10-21”都表示2003年10月21日。 • TIME: 时间类型,由时、分、秒组成,格式为“hh:mm:ss”,如“09:30:05”表示9时30分5秒。 • TIMESTAMP: 时间戳类型,相当于日期与时间类型的组合。如“2003-10-21 09:30:05”。 • INTERVAL: 时间间隔类型,表示两个时间(日期)之差。 3.7
SQL表定义 • SQL的列级约束: • NOT NULL: 表示该列的内容不能为NULL。 • UNIQUE: 表示该列的内容不能包含重复值(但允许有多个值为NULL)。 • PRIMARY KEY: 表示该列为表的主键。PRIMARY KEY同时也蕴含了NOT NULL和UNIQUE。在表只有一个主键列时,可以在定义列时指定PRIMARY KEY而省去表的<主键定义>,如Author表的定义就采用这种方式。 • DEFAULT <缺省值>: 声明该列的缺省值。如果在插入时没有指定该列的值,则DBMS自动将其值设为指定的缺省值。 3.8
SQL表定义 • 外部键定义: FOREIGN KEY ( <引用列列表> ) REFERENCES <被引用表> ( <被引用列列表> ) ON DELETE <删除时动作> ON UPDATE <更新时动作> <删除时动作>和<更新时动作>分别指定了当被引用元组被删除或更新时,引用它的元组该如何处理: • CASCADE: 级联处理。即当被引用元组被删除时也删除引用它的元组;当被引用元组被更新时同时也相应更新引用它的元组。 • NO ACTION: 不允许被引用的元组被删除或更新。这是缺省模式。 • SET NULL: 当被引用元组被删除或更新时将引用它的元组中的引用列的值设为NULL。 • SET DEFAULT: 当当被引用元组被删除或更新时将引用它的元组中的引用列的值设为其缺省值,若没有指定缺省值,则出错。 3.9
SQL表定义 • 表结构修改: • ALTER TABLE Book ADD pos CHAR(20) 给Book增加一列pos。 • ALTER TABLE Book ALTER title VARCHAR(200) 将title列的最大长度改为200。 • ALTER TABLE Book ALTER stock DROP DEFAULT 删除stock列上的缺省值声明。 • ALTER TABLE Book ADD CONSTRAINT c1 CHECK (year >= 1900) 增加一个约束条件要求所有书的出版年份都在1900年之后。通过: • ALTER TABLE Book DROP CONSTRAINT c1 删除约束c1。 3.10
SQL表定义 • 表删除: 例: DROP TABLE Written_by • 如果一个表被其它的表或视图所引用,则使用上述的DROP TABLE语句将会失败。如Book表被Written_by所引用,如果直接删除Book表将出错,这时可用CASCADE模式删除它。如下: DROP TABLE Book CASCADE • 用CASCADE模式删除一个表时,同时也将删除其它表对它的引用关系。如用上述语句删除Book表的同时也将删除Written_by表对Book表的外键引用。 3.11
SQL表查询 • SQL中用于实现数据检索功能的语句是SELECT语句,其基本结构包含SELECT子句、FROM子句和WHERE子句这三部分。其中: • FROM子句指定查询中需要访问的表. • WHERE子句对FROM子句输出中的每个元组判断是否满足指定的条件 • SELECT子句完成投影。 • 例1.查询“机械工业出版社”出版的书 SELECT * FROM Book WHERE press = '机械工业出版社' 3.12
SQL表查询-单表查询 • 单表查询-选择输出列 • 例2. 查询所有书的书名和价格 SELECT title, price FROM Book • 在输出列列表中可以使用DISTINCT关键字指定对输出列消除重复。 • 例3. 查询有哪些出版社出版了书 SELECT DISTINCT press FROM Book 3.13
SQL表查询-单表查询 • 可以在输出列列表中使用COUNT、MIN、MAX、AVG、SUM等五个SQL中定义的标准聚集函数。 • COUNT计算输出中有多少行,COUNT还可与DISTINCT合用,用于计算指定的表达式有多少个不用值。 • MIN、MAX、AVG分别用来计算指定表达式的最小值、最大值和均值。 • 例4.查询书的种数及出版社个数 SELECT COUNT(*) AS 种数, COUNT(DISTINCT press) AS 出版社个数 FROM Book • 例5. 查询所有书的最高价、最低价和平均价格 SELECT MAX(price) AS 最高价, MIN(price) AS 最低价, AVG(price) AS 均价 FROM Book • 例6. 计算总库存量 SELECT SUM(stock) AS 库存量 FROM Book 3.14
SQL表查询-单表查询 • Where子句中的查询条件: SQL允许用户在WHERE子句中指定非常复杂的查询条件,只有符合这些条件的元组才会被交给SELECT子句继续处理,出现在查询结果中。单个的查询条件一般由一个比较操作与两个操作数构成,如press = ‘机械工业出版社’。除相等(=)比较之外,SQL还支持小于(<)、小于或等于(<=)、不等于(<>)、大于或等于(>=)、大于(>)等五种其它的比较操作。 COUNT计算输出中有多少行,COUNT还可与DISTINCT合用,用于计算指定的表达式有多少个不用值。 • 例7. 查询所有库存小于3的书 SELECT * FROM Book WHERE stock < 3 3.15
SQL表查询-单表查询 • 涉及NULL的判断: 比较操作只适合用于非NULL值之间的比较。若参与比较的其中一个值是NULL,则比较的结果总是为假。如若a为NULL,则无论是“a = 1”还是“a <> 1”都不成立,同样也不能用“a = NULL”来判断a是否为NULL,用“a <> NULL”来判断a是否不为空。在SQL中,对一个值是否为NULL的判断是用“IS NULL”实现的。 • 例8. 查询所有未指定出版社的书 SELECT * FROM Book WHERE press IS NULL 3.16
SQL表查询-单表查询 • IN判断: SQL还提供了“IN”操作判断一个值是否在指定的列表中。 • 例9. 查询所有“机械工业出版社”或“高等教育出版社”出版的书 SELECT * FROM Book WHERE press IN (‘机械工业出版社’, ‘高等教育出版社’) 3.17
SQL表查询-单表查询 • 字符串判断:SQL通过LIKE表达式实现字符串匹配功能,形如“<属性值> LIKE <通配符表达式>”。<通配符表达式>表达式中可以包含通配符“_”和“%” • “_”可匹配单个任何字符. “a_”可匹配“ab“、“ac”等。 • “%”可匹配一个任何的字符串(包括空串). 如“a%”可匹配所有以a开头的字符串 • 处理中文时要注意,由于一个汉字占用两个字符,因此要匹配一个汉字需要用两个“_”字符,如“张__”可以匹配“张三”,但“张_”不行。 • 例10. 查询所有标题中包含“C++”的书 SELECT * FROM Book WHERE title LIKE '%C++%' 3.18
SQL表查询-单表查询 • 当单个查询条件不足于完成用户所需功能时,SQL提供了“AND”和“OR”这两个逻辑操作,允许用户将简单条件加以组合。“AND”表示逻辑与;“OR”表示逻辑或 . “AND”的优先级高于“OR”,“A AND B OR C”相当于“(A AND B) OR C”。 • 例11. 查询2002或2004年“机械工业出版社”出版的书 SELECT * FROM Book WHERE (year = 2002 OR year = 2004) AND press = '机械工业出版社'例 3.19
SQL表查询-单表查询 • ORDER BY: 对查询结果进行排序 ORDER BY <表达式1> <排序方式1>, <表达式2> <排序方式2>, … 表示对查询结果首先根据表达式1的值按排序方式1排序,然后根据表达式2的值按排序方式2排序,依次类推。排序方式和两种,分别是:ASC(增序排序)和DESC(降序排序)。其中ASC是默认方式 ,即若不指定排序方式,则进行增序排序。 • 例12. 对所有书信息先按出版社增序排序,再按年份降序排序 SELECT * FROM Book ORDER BY press, year DESC 3.20
SQL表查询-单表查询 • GROUP BY/HAVING: 分组查询 • GROUP BY <表达式1>, <表达式2>, … 其含义是首先按表达式1进行分组,然后对所得的每一组再按表达式2进行分组,依次类推。 • HAVING子句指定各组需要满足的条件,用于对分组结果进行筛选。注意:HAVING子句与WHERE子句的意义和使用场合不相同。HAVING子句中的条件是针对于整个组而言,因此通常使用聚集函数; 而WHERE子句中的条件是针对于单个元组而言的,因此不允许使用聚集函数。 • 例13. 查询出版了超过2种书的出版社及它出版的书的种数 SELECT press, COUNT(title) AS 种数 FROM Book GROUP BY press HAVING COUNT(title) > 2 3.21
SQL表查询-单表查询 • 例14. 查询各出版社各年分别出版了多少种书 SELECT press, year, COUNT(*) AS 种数 FROM Book GROUP BY press, year • 例15. 按出版的书的种数对出版社降序排序 SELECT press, COUNT(*) AS 种数 FROM Book GROUP BY press ORDER BY COUNT(*) DESC 3.22
SQL表查询-多表查询 • 实际应用中,查询的信息分布在多的表中, 需要进行多表查询。本节将以Book、Author和Written_by这三张表为例说明各种多表查询的用法。 • 如果只是简单地在FROM子句中列出查询涉及到的表,则FROM子句的输出将是这些表的笛卡尔积。 基本的多表查询子句: FROM表1, 表2,…表n • 例16. 查询《数据库系统实现》这本书的作者 SELECT Author.* FROM Book, Written_by, Author WHERE Book.isbn = Written_by.isbn AND Written_by.author# = Author.author# AND title = '数据库系统实现' 3.23
SQL表查询-多表查询 • 可以在FROM子句中指定多个表的连接条件 • 一种是用“ON <表达式>”,这时指定的<表达式>又称为连接条件,只有满足指定的连接条件的元组才会出现在FROM子句的结果中。这时需要用“JOIN”关键字或“INNER JOIN”。 • 例17. 例16中的查询也可以如下实现 SELECT Author.* FROM (Book INNER JOIN Written_by ON Book.isbn= Written_by.isbn) INNER JOIN Author ON Written_by.author# = Author.author# WHERE title = '数据库系统实现‘ • 形如“A = B”的等值比较连接又称为等值连接。实际上,连接条件中也可以包含其它的比较操作,甚至可以是包含AND和OR等逻辑操作的复合表达式。 3.24
SQL表查询-多表查询 • 另一种方式是用“USING <属性名>”,这时指定的<属性名>必须是参与连接的两个表都含有的共同属性。这种方式相当于进行指定属性上的等值连接,即“USING A”相当于指定“ON T1.A = T2.A”(T1和T2为参与连接的两个表)。 • 例18. 例16中查询的又一种实现方式 SELECT Author.* FROM (Book INNER JOIN Written_by USING isbn) INNER JOIN Author USING author# WHERE title = '数据库系统实现' 3.25
SQL表查询-多表查询 • 自然连接: SQL中可以用“NATURAL JOIN”关键字来指定对两个表进行自然连接。 • 例19. 用自然连接实现查询16 SELECT Author.* FROM Book NATURAL JOIN Written_by NATURAL JOIN Author WHERE title = '数据库系统实现' 3.26
SQL表查询-多表查询 • 外连接: FROM子句也支持两个表的外连接(LEFT OUTER JOIN、RIGHT OUTER JOIN 、 FULL OUTER JOIN) • 例21. 用右外连接实现查询冗余作者信息(即在Author表中有记录,但实际上并不是任何一本书的作者。 ) SELECT Author.name FROM Written_by NATURAL RIGHT OUTER JOIN Author GROUP BY Author.name HAVING COUNT(isbn) = 0 3.27
SQL表查询-嵌套查询 • 嵌套子查询: SQL 92中允许在WHEE和HAVING子句中嵌入子查询,以扩展SQL的查询能力. • 集合判断IN: 判断一个值是否在子查询结果中 • 例23. 用子查询实现查询冗余作者信息(方法1) SELECT name FROM Author WHERE author# NOT IN (SELECT author# FROM Written_by) 3.28
SQL表查询-嵌套查询 • 算数比较符+全称谓词(ALL)或存在谓词(SOME/ANY) • 例24. 查询出版书种数最多的出版社 SELECT press FROM Book GROUP BY press HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM Book GROUP BY press) 3.29
SQL表查询-嵌套查询 • 例25. 查询由住在“San Francisco”的作者写的书 SELECT DISTINCT title FROM Book NATURAL JOIN Written_by WHERE author# = ANY ( SELECT author# FROM Author WHERE CITY = 'San Francisco') 3.30
SQL表查询-嵌套查询 • EXISTS判断子查询结果是否为空 • 例26. 用子查询实现查询冗余作者信息(方法2) SELECT name FROM Author WHERE NOT EXISTS ( SELECT * FROM Written_by WHERE Written_by.author# = Author.author#) 3.31
SQL表查询-嵌套查询 • UNIQUE判断子查询的结果中是否不包含重复的元组. • 如:若一本书有多个作者,则其次序(serial)不应该相同。为验证这一点,可使用以下查询: • 例27. 验收同一本书的多个作者次序不重复 SELECT * FROM Book WHERE NOTUNIQUE ( SELECT serial FROM Written_by WHERE Written_by.isbn = Book.isbn) (如果上述查询结果为空则表明系统中的信息是正确的。) 3.32
SQL表查询-嵌套查询 • 标量子查询:只返回一个元组的子查询与普通的表达式一样,可以参与比较和运算。这样的子查询称为标量子查询。 • 例28. 查询出版年份最早的书 SELECT * FROM Book WHERE year <= ( SELECT MIN(year) FROM Book) 3.33
SQL表查询-嵌套查询 • 集合查询:并(UNION)、交(INTERSECT)、差(EXCEPT)这三种集合操作可以连接两个不用包含ORDER BY子句的子查询。 • 例29. 查询“机械工业出版社”出版或价格低于50元的书 SELECT * FROM Book WHERE press = '机械工业出版社' UNION SELECT * FROM Book WHERE price < 50 3.34
SQL表查询-嵌套查询 • 例30. 用集合操作实现查询冗余作者信息 SELECT author# FROM Author EXCEPT SELECT author# FROM Written_by 3.35
SQL表查询-嵌套查询 • 在缺省情况下,集合操作将消除输出结果中的重复元组。若要维持结果中的重复元组,则要使用“ALL”关键字,其语义如下: • UNION ALL:对每个值a,若在左侧查询结果中出现n1次,在右侧查询结果中出现n2次,则在最终结果中出现n1+n2次。 • INTERSECT ALL:对每个值a,若在左侧查询结果中出现n1次,在右侧查询结果中出现n2次,则在最终结果中出现min(n1,n2)次。 • EXCEPT ALL:对每个值a,若在左侧查询结果中出现n1次,在右侧查询结果中出现n2次,则在最终结果中出现n1-n2次(若n1 <= n2,则不会出现在最终结果中)。 3.36
SQL表更新 • SQL提供INSERT、DELETE和UPDATE语句实现的数据更新功能. • 单记录插入 INSERT INTO <表名> [(<属性列表>)] VALUES (<值列表>) 其每个属性的值由如下规则决定: • 若指定属性列表,则属性列表中的第一个属性的值为值列表中的第一个值,属性列表中的第二个属性的值为值列表中的第二个值,依次类推。因此属性列表和值列表的长度相同。若某属性不在属性列表中,则在该属性定义了缺省值时使用缺省值,未定义缺省值时为NULL; • 若没有指定属性列表,则表中第一个属性的值为值列表中的第一个值,表中第二个属性的值为值列表中的第二个值,依次类推。因此值列表的长度与表中属性数相同。若要指定一个属性的值为NULL,则在值列表中使用NULL关键字。 3.37
SQL表更新-记录插入 • 例1. 插入一条新书记录 INSERT INTO Book VALUES('7-04-011049-0','数据库系统概念',59.50, 高等教育出版社',2002,5); • 例2. 插入一条作者记录 INSERT INTO Author VALUES(7,'Henry F Korth',NULL) • 上述查询也可实现如下: INSERT INTO Author(author#, name) VALUES(7,'Henry F Korth') 由于属性列表中不包含city,新插入的元组city属性的值将自动赋为NULL。 3.38
SQL表更新-记录插入 • INSERT语句还可用来向表中插入一个查询的结果,称为批量插入。 • 例3. 查每个出版社出版的书种数并把结果插入到数据库中 • 首先新建一张表Press用于存储查询结果: CREATE TABLE Press ( name VARCHAR(100) PRIMARY KEY, books INT) • 然后用下述语句插入Press表数据: INSERT INTO Press SELECT press, count(*) FROM Book GROUP BY press 3.39
SQL表更新-记录删除 • DELETE语句从一个表中删除满足指定条件的记录。不带WHERE条件的DELETE语句将删除表中所有记录 。 • 例4. 清空Book表 DELETE FROM Book • 例5. 从Book表中删除《高效程序的奥秘》对应记录 DELETE FROM Book WHERE title = '高效程序的奥秘' • 例6. 删除冗余作者记录(删除书《高效程序的奥秘》后可能产生冗余作者记录) DELETE FROM Author WHERE author# NOT IN (SELECT author# FROM Written_by) 3.40
SQL表更新-记录修改 • UPDATE语句用于修改表中元组中某些属性的值。 • 例7. 发出一本书《高效程序的奥秘》后调整其库存量(减1) UPDATE Book SET stock = stock – 1 WHERE title = '高效程序的奥秘' • UPDATE语句中被更新属性的新值可以是子查询的结果. • 例8. 在Book表增删'机械工业出版社'的书后更新Press表 UPDATE Press SET books = (SELECT COUNT(*) FROM Book WHERE press ='机械工业出版社') 3.41
SQL表更新-记录修改 • UPDATE语句中的CASE表达式用于在不同条件下生成不同的结果。CASE WHEN <条件1> THEN <表达式1> WHEN <条件2> THEN <表达式2> … ELSE <缺省表达式> END • 例9. 在线书店决定实行打折促销,机械工业出版社出版的书打9折,其它的书打9.5折。 UPDATE Book SET price = CASE WHEN press = '机械工业出版社' THEN price * 0.9 ELSE price * 0.95 END 3.42
SQL视图 • SQL中的视图(VIEW)对应于数据库三级模式中的外模式。用户可像检索基本表一样检索视图中的数据,在特定情况下也可更新视图中的数据。 • 定义语法形式为: CREATE VIEW <视图名> [(<属性名列表>)] AS <查询> [WITH CHECK OPTION] • 即建立名为<视图名>的视图,其内容为<查询>的结果。 • <属性名列表>是可选的,若没有提供<属性名列表>,则视图中各属性的名称为<查询>的输出列名。 • WITH CHECK OPTION表示对视图进行更新时,更新后的结果必需满足视图定义中指定的条件。 3.43
SQL视图-建立 • 例1. 建立一张视图反映各年出版的书的种数 CREATE VIEW Year_books(year, books) AS SELECT year, COUNT(*) FROM Book GROUP BY year • 例2. 建立由机械工业出版社出版的书的视图 CREATE View JXGY_books AS SELECT isbn, title, price, press, year FROM Book WHERE press = '机械工业出版社' WITH CHECK OPTION 3.44
SQL视图-建立 • 例3. 建立由“Jennifer Widom”参与编写的书的视图 CREATE VIEW Widom_book AS SELECT Book.* FROM Book NATURAL JOIN Written_by NATURAL JOIN Author WHERE name = 'Jennifer Widom‘ • 例4. 删除视图Year_books DROP VIEW Year_books 3.45
SQL视图-操作 • 视图一但建立,即可像基本表一样被用户检索。检索视图与检索基本表没有区别. • 例5. 查询2002年出版的书的种数 SELECT books FROM Year_books WHERE year = 2002 • 例6. 查询哪一年出版的书种数最多 SELECT year FROM Year_books WHERE books = (SELECT MAX(books) FROM Year_books) 3.46
SQL视图-操作 • 视图一但建立,即可像基本表一样被用户检索。检索视图与检索基本表没有区别. • 有些视图是可更新视图。可更新视图一般是行列视图. 所谓行列视图是指从一个基本表中抽取出一些行的部分(或全部)属性的视图,因此在定义该视图时<查询>中的投影列表只是一些简单的属性引用,不包含聚集函数,<查询>中也不可包含GROUP B子句等。 • 按上述规则,前一小节中定义的视图JXGY_books是行列视图,因此可以被更新;Year_books由于在定义时使用了聚集函数,不是行列视图,故不可被更新。 • 在更新可更新视图时,DBMS实际上将对视图的更新操作转化为对基本表的更新。 3.47
SQL视图-操作 • 例7. 从视图JXGY_books中删除'高效程序的奥秘'对应记录 DELETE FROM JXGY_books WHERE title = '高效程序的奥秘' • 例8. 将'高效程序的奥秘'信息插入到视图JXGY_books中 INSERT INTO JXGY_books VALUES ('7-111-14111-3', '高效程序的奥秘',28.00, '机械工业出版社',2004) • 由于视图JXGY_books中不包含stock属性,因此新插入的记录中stock属性的值将为缺省值0。 3.48
SQL视图-操作 • 由于在定义视图JXGY_books时指定WITH CHECK OPTION,因此在更新该视图时系统将检察被更新数据是否满足定义视图时指定的条件:press = ‘机械工业出版社’。因此,以下的操作将会失败: • 例9. 尝试插入不符合视图定义的记录到视图JXGY_books中 INSERT INTO JXGY_books VALUES ('7-04-011049-0','数据库系统概念',59.50, '高等教育出版社',2002) 3.49
SQL视图-作用 • 使不同的用户和应用程序以不同的视角看待数据库中数据 • 如对于顾客或图书检索程序来说,需要知道各种书的详细信息,因此直接访问Book表比较方便;而对一个需要统计各年份出版书种数的报表程序,访问视图Year_books则比较方便。 • 为数据库的逻辑重组提供了很大的便利 • 通过视图呈现给用户的是数据库的外模式,视图本身则定义外模式与模式之间的对应关系。这就允许对数据库进行逻辑重组后,只要修改视图定义,即可不影响到视图的对外表现。 • 为机密数据的保护提供了很大的便利 • 在复杂的数据库应用中,通常需要定义多个用户,并赋与不同用户不同的访问权限,由此来达到保护机密数据的目的。而视图为权限管理提供了很大的方便。运用视图,就可以针对每个用户都定义不同的视图,并赋予各用户自己视图上的访问权限。 3.50