关系数据语言SQL之一_第1页
关系数据语言SQL之一_第2页
关系数据语言SQL之一_第3页
关系数据语言SQL之一_第4页
关系数据语言SQL之一_第5页
已阅读5页,还剩162页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关系数据语言SQL之一SQL语言简介SQL 简史SQL在七十年代诞生于IBM 公司San Jose 试验室,最初它们被称为结构化查询语言Structured Query Language 并常常简称为sequel 开始时是为IBM 公司的DB2 系列RDBMS 关系型数据库管理系统而开发的事实上是SQL造就了RDBMS,它是一种非过程语言,与第三代过程语言如C 和COBOL 产生于同一时代SQL语言简介两个标准化组织:美国国家标准协会ANSI 和国际标准组织ISO ,正致力于SQL在工业领域的标准化应用工作然而所有的数据库系统所用的SQL 均与ANSI-92 存在一定的差异,此外大多数数据库系

2、统对SQL 进行了有针对性的扩展,使它们成为了过程型语言,在本书中我们将要讨论的过程型SQL 如Oracle的PL/SQLSQL 总览SQL 是操作和检索关系型数据库的事实上的标准语言,它允许程序员和数据库管理员做如下的工作l 更改数据库的结构l 更改系统的安全设置l 增加用户对数据库或表的许可权限l 在数据库中检索需要的信息l 对数据库的信息进行更新SQL 开发工具Microsoft Access 既可以手工输入SQL 语句也可以使用图形用户界面工具来生成SQL 语句Oracle在命令行下,用户可以在SQL PLUS 工具中输入不同的单的SQL语句Oracle 的发行版提供一整套的开发工具,

3、它包括C+和Visual Basic 函数库(Oracle Objects for OLE) ,通过它可以将应用程序与ORACLE 数据库链接在一起。它也为数据库用户或管理员提供图形开发工具SQL查询语句SQL的主要功能之一是实现数据库查询。如果你熟悉Internet搜索引擎,那么你已经熟悉查询了。你使用查询来取得满足特定条件的信息。可以使用特殊的运算符如AND、OR和NOT,来选择特定的记录。当需要限制查询结果时,可以使用AND。如果需要扩展查询的结果,可以使用逻辑操作符OR。如果想从搜索结果中排除特定的站点,可以使用NOT。 SQL查询语句用SELECT语句从表中提取查询数据。语法:SEL

4、ECT DISTINCTcolumn1,column2, FROM tablenameWHERE conditions GROUP BY conditionsORDER BY expressions ASC/DESC; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。SQL查询语句的其他问题在SQL 语句中大小写是不敏感的,但在数据库中的数据却是大小写敏感的在语句中使用空格和大写字母会增强语句的可读性当在SQL 语句中出现分号就意味着本条语句已经结束在SELECT中使用了*号,这将会显示出所有的列SQL查询语句WHERE子句中的条件可以是一个

5、包含等号或不等号的条件表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。ORDER BY 子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。SQL查询语句ANDAND 只有当两个表达式的值都为真的时候才会返回真SQL SELECT * FROM VACATION查询在公司中工作不超过5 年但是剩余的休假时间超过20 天的员工SQL查询语句ANDAND 只有当两个表达式的值都为真的时候才会返回真SQL SELECT

6、LASTNAME FROM VACATION WHERE YEARS20SQL查询语句OR也可以使用OR 来对几个条件进行合并,当其中的任一个条件为真时其结果就会为真值NOT它对条件取反,条件为假时结果为真,条件为真时结果为假下列子句将返回所有开头的名字不是B 的员工SQL SELECT * FROM VACATIONWHERE LASTNAME NOT LIKE B%;当NOT 应用于NULL 时可以使用操作符ISSQLSELECT * FROM PRICE WHERE WHOLESALE IS NOT NULL;SQL查询语句LIKE如果想从数据库中选出一部分数据,并且不需要非常精确的匹配

7、,可以使用LIKESQLSELECT * FROM PARTSSQL查询语句LIKE怎样找出其中有BACK 的记录呢SQLSELECT * FROM PARTS WHERE LOCATION LIKE %BACK%;在这条语句的LIKE 后边使用了% 在LIKE 表达式中%是一种通配符它表示可能在BACK中出现的其它信息SQL查询语句连接符|SQL SELECT * FROM FRIENDS;SQL查询语句连接符|SQL SELECT LASTNAME | , | FIRSTNAME NAME FROM FRIENDS;SQL查询语句集合运算SQL 是基于集合的理论UNION 将返回两个查询的

8、结果并去除其中的重复部分UNION ALL 与UNION 一样对表进行了合并但是它不去掉重复的记录INTERSECT 相交INTERSECT 返回两个表中共有的行MINUS 相减MINUS 返回的记录是存在于第一个表中但不存在于第二个表中的记录从属运算IN and BETWEENSQL查询语句集合运算举例SQL SELECT NAME FROM SOFTBALLUNIONSELECT NAME FROM FOOTBALL;SQL SELECT * FROM FOOTBALLINTERSECTSELECT * FROM SOFTBALL;SQL SELECT * FROM FOOTBALL MI

9、NUS SELECT * FROM SOFTBALL;SQL SELECT * FROM FRIENDS WHERE STATE IN(CA,CO,LA)SQLSELECT * FROM PRICE WHERE WHOLESALE BETWEEN 0.25 AND 0.75SQL函数函数将大大加强对SQL 的基本功能所获得的数据的操作能力五个汇总函数COUNT SUM AVG MAX MIN 是由ANSI 标准所制定的;大多数的SQL 解释器都对汇总函数进行了扩充;l 汇总函数l 日期与时间函数l 数学函数l 字符函数l 转换函数l 其它函数SQL函数COUNT该函数将返回满足WHERE 条件

10、子句中记录的个数例如你想知道都有多少球员的击球率小于0.35SQLSELECT * FROM TEAMSTATSSQL函数COUNT例如你想知道都有多少球员的击球率小于0.35SQL SELECT COUNT(*) FROM TEAMSTATS WHERE HITS/AB SELECT SUM(SINGLES) FROM TEAMSTATSAVGAVG 返回某一列的平均值MAXMAX返回一列中的最大数值MINMIN 返回一列中的最小数值其他SQL函数统计函数VARIANCE统计函数VARIANCE 返回某一列数值的方差STDDEV统计函数STDDEV 返回某一列数值的标准差日期/ 时间函数AD

11、D_MONTHSLAST_DAYMONTHS_BETWEENNEW_TIMESYSDATE其他SQL函数数学函数ABSCEIL 和FLOORCOS COSH SIN SINH TAN TANHEXPLN and LOGMODPOWERSIGNSQRT其他SQL函数字符函数CHRCONCATINITCAPLOWER 和UPPERLPAD 与RPADLTRIM 与RTRIMREPLACESUBSTRINSTRLENGTH其他SQL函数转换函数转换函数将数据从一种类型变换为另一种类型TO_CHARTO_NUMBER其它函数GREATEST 与LEASTUSER分组查询GROUP BY子句可以将查询结

12、果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的值。若在分组后还要按照一定的条件进行筛选,则需使用HAVING子句。分组查询例查询各位教师的教师号及其任课的门数分组查询查询选修两门以上课程的学生学号和选课门数分组查询子句使用顺序:WHEREGROUP BY HAVING。WHERE与HAVING子句的根本区别:作用对象不同(1)WHERE子句作用于基本表或视图;(2)HAVING子句作用于组,选择满足条件的组,必须用于GROUP BY子句之后,但GROUP BY子句可没有HAVING子句。排序查询ORDER BY子句用于对查询结果的排序ORDER BY子句必须出

13、现在其他子句之后排序方式:DESC为降序,ASC为升序,缺省时为升序排序查询查询选修C2、C3、C4或C5课程的学号、课程号和成绩,查询结果按学号升序排列,学号相同再按成绩降序排列。排序查询求选课在三门以上且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序列出。此语句为分组排序,执行过程如下:(FROM)取出整个SC(WHERE)筛选SCORE=60的元组(GROUP BY)将选出的元组按SNO分组(HAVING)筛选选课三门以上的分组(SELECT)剩下的组中提取学号和总成绩(ORDER BY)将选取结果排序排序查询求选课在三门以上且各门课程均及格的学生的学号及其总成绩,查询结果按

14、总成绩降序列出。SQL查询语句连接查询利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句指示如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和不等式连接。SQL查询语句查询刘伟老师所讲授的课程信息SQL查询语句查询所有选课学生的学号、姓名、选课名称及成绩查询每门课程的课程名及选课人数。Select cn,count(sno) from

15、c,scwhere o=o group by cn;SQL查询语句SQL查询语句查询每门课程的课程名、任课教师姓名及其职务、选课人数SQL查询语句查询所有比刘伟工资高的教师姓名、工资SQL查询语句子查询如果某一个SELECT命令(查询1)出现在另一个SQL命令(查询2)的一个子句中,则称查询1是查询2的子查询子查询是一种把查询的结果作为参数返回给另一个查询的一种查询子查询的嵌套子查询可被嵌套的深度依你的需要而定SQL查询语句找出学习了C2课程的所有学生的姓名、年龄。 SELECT NAME,AGE FROM S WHERE S-NO IN SELECT S-NO FROM SC WHERE C

16、-NO= C2; 或 SELECT NAME,AGE FROM S,SC WHERE C-NO= C2 AND S.S-NO=SC.S-NO;SQL查询语句找出不学习C2课程的学生的学号、姓名。SELECT NAME,AGE FROM S WHERE S-NO IN SELECT S-NO FROM SC WHERE C-NO C2;SQL查询语句找出不学习C2课程的学生的学号、姓名。 SELECT NAME,AGE FROM S WHERE C2 NOT IN SELECT C-NO FROM SC WHERE S-NO = S.S-NO;SQL查询语句找出不学习C2课程的学生的学号、姓名。

17、 SELECT NAME,AGE FROM S WHERE S-NO NOT IN SELECT S-NO FROM SC WHERE C-NO = C2;SQL查询语句找出不学习C2课程的学生的学号、姓名。 SELECT NAME,AGE FROM S WHERE NOT EXISTS SELECT * FROM SC WHERE S-NO = S.S-NO AND C-NO=C2;关系数据语言SQL之二数据描述语言DDL我们将学会以下内容建立一个数据库以及在其中建表表的建立修改与删除向数据库中添加数据修改数据库中的数据删除数据库建立关键字段CREATE DATABASE 语句在任何数据库项

18、目中,管理数据的第一步工作就是建立数据库根据具体要求和数据库管理系统的情况,这个工作可以很简单也可以很复杂许多现代的数据库系统都提供了图形工具,可以通过鼠标按键来完成数据库的建立工作CREATE DATABASE 语句典型的数据库创建语句如下CREATE DATABASE database_name许多SQL教材中都没有提到它,而是直接进行了CREATE TABLE 语句建立数据库时必须要考虑的第一件事情就是权限级别允许指定数据库的默认大小,它通常受硬盘容量的限制参考所使用的数据库管理系统的说明书来建立数据库,因为CREATE DATABASE 语句在不同的解释器之间的差别是很大的CREATE

19、 DATABASE 语句CREATE DATABASE testLOGFILE D:Oracleoradatatestredo01.log SIZE 2048K, D:Oracleoradatatestredo02.log SIZE 2048KMAXLOGFILES 32MAXLOGMEMBERS 2DATAFILE D:Oracleoradatatestsystem01.dbf SIZE 58M REUSE AUTOEXTEND ON NEXT 640KMAXDATAFILES 254MAXINSTANCES 1CREATE TABLE 语句建立表的过程比建立数据库的过程更不标准,它的基本语

20、法如下 CREATE TABLE table_name (field1 datatype NOT NULL field2 datatype NOT NULL field3 datatype NOT NULL .)CREATE TABLE 语句SQLCREATE TABLE BILLS (2 NAME CHAR(30)3 AMOUNT NUMBER4 ACCOUNT_ID NUMBER);Table created.该语句创建了一个名字叫BILL 的表,在BILL 表中有三个字段NAME ACCOUNT和ACCOUNT_ID, 其中NAME 字段为字符类型,可以存储长度30 的字符串,而AMOU

21、NT和AMOUNT_ID 则只参存储数字表名当使用ORACLE 来创建一个表的时候,对表的命名要遵从几个约束:首先表的名字不得超过255个字符长由于ORACLE 对大小写不敏感,所以在写名字时可以根据需要采用大写或小写的方式,但是表的第一个字符必须是字母A-Z ,其余的字符则还可以有下划线# $ 在一个数据库中表的名字不应该有重复表的名字不可以是ORACLE 的保留字如SELECTORACLE 所支持的数据类型空值属性在建立表的时候,大多数数据库管理系统允许用NOT NULL 来指明字段是否为非空属性NOT NULL 的意思就是在当前表的该字段中不能有任何记录存在空值,也就是说,在当前表中的该

22、字段的每一个记录中都应该确实存在数值SQLCREATE TABLE BILLS (2 NAME CHAR(30) NOT NULL,3 AMOUNT NUMBER,4 ACCOUNT_ID NUMBER NOT NULL);表的存储与尺寸的调整大多数RDBMS 都设定了表的默认大小和存储的定位如果没有指定表的大小和存储大小,它就会采用默认值,可能是非常不合适的特别对于大型的表来说更是如此默认大小根据解释器和不同而不同下边是一个ORACLE创建表时使用STORAGE 子句的例子表的存储与尺寸的调整SQL CREATE TABLE TABLENAME2 (COLUMN1 CHAR NOT NULL

23、,3 COLUMN2 NUMBER,4 COLUMN3 DATE)5 TABLESPACE TABLESPACE NAME6 STORAGE7 INITIAL SIZE,8 NEXT SIZE,9 MINEXTENTS value,10 MAXEXTENTS value,11 PCTINCREASE value);Table created.用一个已经存在的表来建表CREATE TABLE 是最为通用的建表的方法,然而在一些数据库管理系统中提供了一种可供选择的方法:使用已经存在的表中的格式和数据当你对表进行临时改动,需要将数据选出时这种方法是很有用的,或者当要创建的表与已有的表类似并且其内容也

24、类似时,它也非常有用CREATE TABLE NEW_TABLE(FIELD1, ) AS (SELECT FIELD1, FIELD2, FIELD3 FROM OLD_TABLE 用一个已经存在的表来建表SQL CREATE TABLE NEW_BILLS(NAME, AMOUNT, ACCOUNT_ID)AS (SELECT * FROM BILLS WHERE AMOUNT 50);Table created.上边的语句用BILL 表中AMOUNT 小于50 的记录创建了一个新表在一些数据库系统中你也可以使用下边的语法INSERT NEW_TABLESELECT from OLD_TA

25、BLE ALTER TABLE 语句ALTER TABLE 语句完成:加入一列到已经存在的表中修改已经存在的表中的某一列在已经存在的表结构中删除原有的属性列ALTER TABLE 语句的语法如下ALTER TABLE Table_Name ADDColumn_Name Data_Type;|MODIFYColumn_Name Data_Type;|DROPColumn_Name CASCADE|RESTRICT;ALTER TABLE 语句SQL ALTER TABLE BILLS MODIFY NAME CHAR(40);SQL ALTER TABLE NEW_BILLS ADD COMME

26、NTS CHAR(80);SQL ALTER TABLE Goods DROP Goods_Description CASCADE;DROP TABLE 语句DROP TABLE 可以从数据库中删除一个指定的表以及与之相关联的索引和视图DROP TABLE 语句的语法格式如下DROP TABLE Table_Name CASCADE|RESTRICT;SQLDROP TABLE NEW_BILLS;Table dropped.请注意系统没有给出提示,该命令不会问Are you sure? Y/N ,但是删除操作已经执行,表已经永远地删除DROP DATABASE 语句一些数据库管理系统也提供了

27、删除数据库DROP DATABASE 的语句,它的使用方法与DROP TABLE 相同,语法如下DROP DATABASE database_name单文件的数据库系统如ACCESS 是不支持这个命令的,数据库包含在一个单一的文件中如果想建立一个数据库,你必须用系统提供的菜单选项,如果想删掉它只需简单地从系统中删掉这个文件创建视图视图常常被称为虚表,它是用CREATE VIEW 语句来建立的当对一组数据建立视图以后,可以像处理另外一个表一样去处理视图,但是在视图中修改数据时要受到一些限制;当表中的数据改变以后,将会相应的改变视图,视图并不占用数据库或表的物理空间视图引入的目的灵活性效率性安全性

28、创建视图CREATE VIEW 和语法如下CREATE VIEW (column1, column2.) ASSELECT FROM SQL CREATE VIEW DEBTS ASSELECT * FROM BILLS;SQL CREATE VIEW CREDITCARD_DEBTS AS2 SELECT * FROM DEBTS3 WHERE ACCOUNT_ID = 4;删除视图语句其语法形式如下SQL DROP VIEW view_name可以删除一个视图而不影响任何一个真实的表,这也就是为什么将视图称为虚表的原因在视图中修改数据可以在数据库的一个或多个表中使用视图,也可以在SQL和数

29、据库应用程序中使用虚表在使用CREATE VIEW SELECT 创建视图以后,可以用INSERT UPDATE 和DELETE 语句来更新、插入、删除视图中的数据索引当查询没有使用索引的表时,查询通常是全表搜索后才会得到结果,全表搜索会让数据库服务程序遍历过表中的所有记录,然后返回给定条件的记录,这种方法就好比从图书馆的第一号书架的第一本书找起,直到找到了所需要的书一样索引可以让数据库服务程序快速地定位到表中的确定行索引在数据库中使用索引,可以让SQL 使用直接访问方式,SQL 采用树形结构来存储和返回索引数据,用以指示的数据存储在树的最末端,也就是叶子,它们被称为结点SQL 将从根结点开始

30、,直到找到所需要的数据索引基本的SQL 索引的语法形式如下CREATE UNIQUE INDEX Index_NameON Table_Name(Column_Name1 ASC|DESC, Column_Name2,);注:索引的语法对于不同的数据库系统差别很大索引的删除SQL DROP INDEX index_name;索引举例例如要对BILLS 表中的ACCOUNT_ID 字段创建索引SQL SELECT * FROM BILLS索引举例使用索引的技巧对于小表来说,使用索引对于性能不会有任何提高当索引列中有极多的不同的数据和空值时,索引会使性能有极大的提高当查询要返回的数据很少时,索引可

31、以优化查询,比较好的情况是少于全部数据的25%索引可以提高数据的返回速度,但是使得数据的更新操作变慢,如果要进行大量的更新操作在执行更新操作时先删除索引,当执行完更新操作后,只需要简单的恢复索引即可使用索引的技巧索引会占用数据库的空间大多数数据库系统不允许对视图创建索引不要对经常需要更新或修改的字段创建索引,更新索引的开销不要将索引与表存储在同一个驱动器上,分开存储会去掉访问的冲突,从而使结果返回得更快数据操作语言DML今天我们将讨论三个关于如何对数据库中的表中的数据进行操作的三条语句这三条语句是INSERT 语句UPDATE语句DELETE 语句INSERT 语句该语句每次向表中输入一条记录

32、该语句的语法形式如下INSERT INTO table_name (col1, col2.) VALUES (value1, value2.)该语句的作用是向表中加以一个新的记录,其数值为指定的数值INSERT 语句表中插入数据时必须遵循以下三条规则插入的数值与它所对应的字段必须具有相同的数据类型数据的长度必须小于字段的长度。例如不能向一个长40 个字符的字段中插入一个长80 个字符的字符串插入的数值列表必须与字段的列表相对应;INSERT 语句SQL SELECT * FROM COLLECTION;如果想向表中加入一个新记录SQL INSERT INTO COLLECTION (ITEM,

33、 WORTH, REMARKS) VALUES(SUPERMANS CAPE, 250.00, TUGGED ON IT);SQL SELECT * FROM COLLECTION;INSERT SELECT 语句INSERT VALUE 语句在向表中插入几个数据的时候非常有用如果想向表中插入25,000 行数据时怎么办?在这种情况下,INSERT SELECT 语句就非常有效。它允许程序员拷贝一个或一组表的信息到另外一个表中INSERT SELECT 语句INSERT SELECT 语句的语法格式如下INSERT INTO table_name (col1, col2.)SELECT col

34、1, col2. FROM tablename WHERE search_condition本质上来说,它是将一个SELECT 语句的输出结果输入到另一个表格中去在INSERT VALUE 中的规则也适用于INSERT SELECT 语句INSERT SELECT 语句本例将创建一个叫INVENTORY 的表SQL CREATE TABLE INVENTORY2 (ITEM CHAR(20),3 COST NUMBER,4 ROOM CHAR(20),5 REMARKS CHAR(40);OUTPUTTable created.INSERT SELECT 语句下边的语句将向表中插入COLLEC

35、TION 表中的数据INPUT/OUTPUTSQL INSERT INTO INVENTORY (ITEM, COST, REMARKS)2 SELECT ITEM, WORTH, REMARKS3 FROM COLLECTION;INSERT SELECT 语句INSERT SELECT 语句遵循如下规则SELECT 语句不能从被插入数据的表中选择行INSERT INTO 中的列数必须与SELECT 语句返回的列数相等INSERT INTO 中的数据类型要与SELECT 语句返回的数据类型相同INSERT SELECT 的另外一个用处是当需要对表进行重新定义时对表进行备份UPDATE 语句该

36、语句的作用是将已存在的记录的内容改变,语法格式如下UPDATE table_name SET columnname1 = value1 , columname2 = value2.WHERE search_conditionUPDATE 语句首先要检查WHERE 子句对于符合WHERE 子句条件的记录将会用给定的数据进行更新UPDATE 语句SQL UPDATE COLLECTION SET WORTH = 900 WHERE ITEM = STRING;验证确实已经进行了更新操作SQL SELECT * FROM COLLECTION WHERE ITEM = STRINGUPDATE 语句

37、如果在UPDATE 语句中省略了WHERE 子句那么给定表中的所有记录都会被更新SQL UPDATE COLLECTION SET WORTH = 555;DELETE 语句DELETE 语句的语法格式如下 DELETE FROM tablename WHERE conditionDELETE 命令不会出现确认提示通过DELETE 语句和WHERE 子句,DELETE 语句可以完成下边的工作删除单一的行删除多个行删除所有的行什么也不删除DELETE 语句在使用DELETE 语句时需要注意DELETE 不能删除个别的字段,它对于给定表只能整个记录地删除与INSERT 和UPDATE 一样,删除一

38、个表中的记录可能会导致与其它表的引用完整性问题DELETE 语句只会删除记录不会删除表与UPDATE 语句一样,如果省略了WHERE 子句那么表中的所有记录都会被删除DELETE 语句如何删除COLLECTION 表中的WORTH小于275 的所有记录SQL DELETE FROM COLLECTION WHERE WORTH SELECT * FROM COLLECTION关系数据语言SQL之三高级SQL事务管理SQL(见后续章节)安全管理SQL (见后续章节)游标存储过程触发器嵌入式SQL动态SQL游标游标类似于字处理程序中的指针,当按下方向键时,指针依次在各行文本中滚动数据库游标的操作也

39、类似数据库游标允许选择一组数据,通过翻阅这组数据记录,该组数据记录通常被称为数据集,检查每一个游标所在的特定的行,可以将游标和局部变量组合在一起,对每一个记录进行检查游标的另一个用法是保存查询结果以备以后使用使用游标的过程1. Create the cursor.2. Open the cursor for use within the procedure or application.3. Fetch a records data one row at a time until you have reached the end of the cursors records.4. Close

40、the cursor when you are finished with it.5. Deallocate the cursor to completely discard it.定义游标DECLARE cursor_name CURSORFOR SELECT command | statement_name | block_name下边的语句将创建一个基于ARTIST 表的结果集1 Declare Artists_Cursor cursor2 for select * from ARTISTS3 go现在已经定义了一个名字为ARTIST_Cursor 游标,它包括了所有的ARTIST 表的

41、内容,但是首先必须打开游标打开游标打开游标命令如下open cursor_name运行下列命令打开ARTIST_Cursor 游标1 open Artists_Cursor2 go现在可以使用游标来翻阅结果集了使用游标来进行翻阅在游标结果集中进行翻阅操作,提供FETCH 命令FETCH cursor_name INTO fetch_target_list一个游标有两个重要的成分:游标数据集和游标指针的位置。每次当FETCH 命令运行时,游标指针每次可以在数据集中移动一行。通过FETCH翻阅操作读出的数据可以填充到fetch_target_list 变量中。使用游标来进行翻阅正是因为每次FETC

42、H操作在数据集中只翻阅一条记录,因此,我们一般使用WHILE 循环结构来查询和处理数据集的所有记录,但是问题是如何知道已经到达了数据集的最后一个记录的呢?这就需要测试游标的状态,在TransactSQL 中,提供了sqlstatus 和 rowcount 这两个全局变量来检查当前游标的状态。其中变量sqlstatus 返回最后一次运行FETCH 语句的状态信息。TransactSQL 规定:除了FETCH 命令以外,其他的命令不得修改sqlstatus 变量。关闭游标关闭游标语句如下close cursor_name这时游标依然存在,但是它必须被再次打开方可使用关闭一个游标从本质上来说是关闭了

43、它的结果集,而并不是它的全部内容如果已经完全结束了对一个游标的使用,DEALLOCATE 命令将释放让游标所占用的内存,并且可以让游标的名字可以被再次使用该命令的语法格式deallocate cursor cursor_name游标使用实例例3.10 创建一个游标Goods_CURSOR,通过定义外部变量和循环结构,用于输出商品表Goods中的商品ID,商品名称和库存量。DECLARE V_Goods_IDCHAR(10);DECLARE V_Goods_NameCHAR(20);DECLARE V_Stock_QuantityINTEGER;CREATE Goods_CURSORCURSOR

44、FOR SELECT Goods_ID,Goods_Name,Stock_ Quantity FROM Goods;游标使用实例OPENGoods_CURSOR;FETCHGoods_CURSOR INTO V_Goods_ID, V_Goods_Name, V_Stock_QuantityWHILE (sqlstatus = 0)BEGINPRINT V_Goods_ID, V_Goods_Name, V_Stock_QuantityFETCH Goods_CURSOR INTO V_Goods_ID, V_Goods_Name, V_Stock_QuantityEND;存储过程存储过程(S

45、tored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。总的来说,存储过程具有以下一些优点: 存储过程允许标准组件式编程 存储过程能够实现较快的执行速度 存储过程能够减少网络流量 存储过程可被作为一种安全机制来充分利用存储过程例3.11 创建一个简单的存储过程,过程名称为P_Goods_Output,并且执行,用于输出商品表中的商品ID,商品名称和库存量。CREATE PROCEDURE P_Good

46、s_OutputASDECLARE V_Goods_ID CHAR(10);DECLARE V_Goods_Name CHAR(20);DECLARE V_Stock_Quantity INTEGER;CREATE Goods_CURSOR CURSORFOR SELECT Goods_ID,Goods_Name,Stock_ Quantity FROM Goods;存储过程OPEN Goods_CURSORFETCH Goods_CURSORINTO V_Goods_ID, V_Goods_Name, V_Stock_QuantityWHILE (sqlstatus = 0)BEGINPRI

47、NT V_Goods_ID, V_Goods_Name, V_Stock_QuantityFETCH Goods_CURSOR into V_Goods_ID, V_Goods_Name, V_Stock_QuantityEND;执行上述定义过程的语句如下:EXECUTE P_Goods_Output;在存储过程中使用参数 存储过程可以带有输入参数,利用输入参数将有关具体的参数值输入到存储过程中的SQL 语句中,此外数据可以通过输出参数从存储过程中返回。以TransactSQL为例,输入参数必须以提示符开始,而且这些参数必须是TransactSQL 的合法数据类型,输出参数也必须以提示符开始,

48、此外OUTPUT 关键字必须紧跟输出参数的名字,当运行存储过程时,必须给出OUTPUT 关键字。在存储过程中使用参数 例3.12 下面的存储过程给出了在存储过程中使用输入参数的用法,该过程将选择所有供应商联系人姓名为“BRUCE”的商品名称:CREATE PROCEDURE Goods_MATCH_Linkman_Name Linkman_Name CHAR(10)ASSELECT Goods.Goods_NameFROM Goods, SupplierWHERE Supplier.Linkman_Name = Linkman_Name AND Goods.Supplier_ID = Supp

49、lier.Supplier_ID EXECUTE Goods_MATCH_Linkman_Name BRUCE删除一个存储过程使用DROP 命令,命令语法格式如下:DROP PROCEDURE procedure_name设计和使用触发机制从本质上来说,触发器是一种特殊类型的存储过程,它的典型特征是通过定义触发条件或者触发操作,一旦条件满足或者特定操作执行,触发器自动执行预先定义好的SQL语句序列。可以在下列的三种操作之一发生时自动运行:更新、插入和删除。触发器这种自动运行的机制经常被用来保证数据的完整性,触发机制却提供了更为灵活的解决方法。设计和使用触发机制数据库触发器(database t

50、riggers)是响应插入、更新或删除等数据库事件而执行的过程。它定义了当一些数据库相关事件发生时应采取的动作。可用于管理复杂的完整性约束,或监控对表的修改,或通知其它程序,表已发生修改。它的类型有:语句级触发器,以及行级触发器,前者可以在语句执行前或执行后被触发。后者在每个触发语句影响的行触发一次。设计和使用触发机制设计和使用触发机制用触发器完成数据复制 举例当一条记录插入到一个数据库中的某个基表中时,用户还希望把这条记录插入到一个远程数据库中,需用create database link语句创建一条到远程数据库的连接,一旦创建了一条数据库连接后,就可以在基表上创建一个after inser

51、t触发器,以把每一条记录插入到远程数据库中 设计和使用触发机制(1)在脚本中创建数据库连接(database link)bj_ysd_remote基表作为数据库基表,bj_ysd_local代表本地数据库上的源基表。Creat database link remote(连接名)Connect to bj(帐户) indentified by bj(密码) Using :2;设计和使用触发机制(2)复制记录create or replace trigger trig_ysd(触发器名)after insert on bj_ysd_localfor each rowbegin insert int

52、o bj_ysd_remotedblink remotevalue(:new.x1,:new.x2,)/x1.x2代表字段名end;设计和使用触发机制(3)删除记录create or replace trigger trig_ysd_delafter delete on bj_ysd_localfor each rowbegin delete from bj_ysd_remotedblink remote where x1=:old.x1end;完整性约束 完整性约束是定义数据库模式时指定的约束条件,它限制某些数据,不允许它们在数据库中保存。DBMS强制执行完整性约束,只允许满足完整性约束的数

53、据存储在数据库中。本节介绍SQL所提供的域约束、表约束、断言和触发器四种完整性约束机制 完整性约束 指定和执行完整性约束的时机有:(1) 当DBA或者最终用户定义数据库模式时,他们需要指定数据库需要满足的完整性约束。(2) 任何情况下,违反完整性约束的数据库修改操作都不允许执行。当数据库执行应用程序时,DBMS检查数据的修改是否与已经制定的完整性约束冲突,若冲突,则不允许其执行。DBMS通常在每条SQL语句执行之后,检验该语句是否违反了完整性约束。有时,完整性约束检查也延迟到事务执行之后进行。完整性约束 域约束是完整性约束最基本的形式。声明一种属性属于某一个具体的域(如SQL中定义的整型、字符

54、型等)就相当于限定了它的取值范围。域约束的作用是:(1) 每当有新的数据项插入数据库时,系统将进行域约束的检查。(2) 域约束的另外一个作用就是可以对查询进行检测,以保证所做的比较是有意义的。例3.13 用CREATE DOMAIN子句来定义域Employee_ID和Order_ID:CREATE DOMAIN Employee_ID CHAR(10)CREATE DOMAIN Order_ID CHAR(10)域Employee_ID和域Order_ID虽然都是CHAR(10),但是试图将一个Employee_ID类型的值赋值给Order_ID类型的变量会产生一个语法错误。完整性约束 例3.

55、14 用CHECK子句可以保证产品单价域的值必须大于某一指定值:CREATE DOMAIN Unit_Price NUMERIC(10,2)CONSTRAINT Unit_Price_Test CHECK(VALUE = 0.00)域Unit_Price有一个约束以保证每种产品的单价要大于0.00。子句CONSTRAINT Unit_Price_Test是可选的,用来将约束命名为Unit_Price_Test。这个名字可以用于定位一个更新操作究竟违反了哪条约束。完整性约束 例3.15 CHECK子句也可以用于限制域不允许空值:CREATE DOMAIN Order_Quantity INTEG

56、ERCONSTRAINT Order_Quantity_Null_Test CHECK(VALUE NOT NULL)例3.16 IN子句可以限制域只包含指定的一组值:CREATE DOMAIN Classification _Name CHAR(20)CONSTRAINT Classification _Name _Test CHECK(Value IN(内存, 硬盘, CPU, 显示器)尽管复杂的CHECK条件对保证数据完整性非常有用,但是由于检测它们的开销很大,因此要慎用。完整性约束 我们使用表约束来规定单表上的复杂约束,表约束可以细分为惟一性约束、引用约束和表检验约束。(1) 惟一性约

57、束说明的语法描述为:=():=UNIQUE/PRIMARY KEY:=,惟一性约束满足的充分必要条件是,在表中不存在任何两行在清单所列列上拥有相同的非空值,若惟一性说明为PRIMARY KEY,则进一步要求清单中的列不能取空值。完整性约束 (2) 引用约束说明的语法描述为::=FOREIGN KEY()(引用约束说明):=REFERENCES (3) 表检验约束的语法形式为:=CHECK()完整性约束 此时,被引用的列应在被引用表定义中说明为具有惟一性约束的列。引用约束满足的条件视引用约束定义中的取值可分为以下三种情况: 如果无说明,则要求引用表中任一行t,其每个引用列或者取值为空,或者都等于

58、被引用表中某行对应被引用列的值。 如果说明为,则要求引用表中任一行t1,其所有引用列或者全为空值,或者全都不空并在被引用表中存在一行t2,使得t1与t2对应列上的值相等。 如果说明为,则要求引用表中任一行t1,都存在被引用表的一行t2,使得t1的每个非空引用列的值等于t2中对应列的值。完整性约束 断言就是一个谓词,它表达了我们希望数据库总能满足的一个条件。域约束和引用约束是断言的特殊形式。表约束是与单个表相关联的,只有相关联的表非空时,才能保持表约束。当约束包含一个或多个表时,断言就成为一种有效的手段。SQL中断言的形式为:CREATE ASSERTION CHECK完整性约束 例3.18 用

59、断言约束每一个商品(允许由不同的供应商供货)的库存量要不小于定购量:CREATE ASSERTION Stock_Quantity_Order_ Quantity_Constraint CHECK (NOT EXISTS (SELECTGoods_ID FROMGoods GROUP BYGoods_IDHAVING SUM(Stock_Quantity) SUM(Order_Quantity)嵌入型SQL一些数据库系统提供了一整套的工具,可以将SQL 与程序设计语言结合在一起,SQL 代码被嵌入到这些代码之中嵌入方式分类静态SQL 动态SQL静态SQL 的意思就是指在程序中直接写入SQL 代

60、码,这些代码在运行的时候不能被更新。大多数静态SQL 解释器需要将SQL 语句在运行之前进行预编译处理Pro*C 在ORACLE数据库管理和系统中, 有三种访问数据库的方法;(1)用SQL*Plus, SQL命令以交互的方式访问数据库;(2)用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,SQL*Menu等;(3)利用在第三代语言,嵌入的SQL语言或ORACLE库函数调用来访问。Pro*C Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理任务。在Pro*C程序中可以嵌入S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论