资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第三章,关系数据库标准语言,SQL,语言,3.1,SQL,概述,一、,SQL,的由来,SQL,是,Structured Query Language,(,结构化查询语言)的缩写。,1972,年,SQUARE,(,Specifying Queries As Relational Expression,),语言;,1974,年改为,SEQUEL,(,Structured English,QUEry,Language,),语言,后简称,SQL,.,1986年,美国国家标准局,ANSI,的数据库委员会,X3H2,批准并公布了,SQL,标准文本(,SQL-86,)。,1987,年,国际标准化组织,ISO,把,SQL-86,采纳为国际标准。,1989年,ISO,颁步了增强完整性特征的,SQL-89,标准。,1992年,ISO,公布了修改扩充后的,SQL-92,(,即,SQL2,),标准。,目前最新标准为,SQL-99,(,即,SQL3,)。,二、,SQL,数据库的体系结构,三、,SQL,的组成(分类),DATABASE,TABLE,CREATE,VIEW,INDEX,SQL DDL:,ALTER,DROP,SQL QUERY:SELECT FROM,INSERT,SQL SQL DML:UPDATE,DELETE,GRANT,SQL DCL:REVOKE,AUDIT,嵌入式,SQL:,四、,SQL,的特点,SQL,语言集数据查询、数据操纵、数据定义、数据控制的功能于一体,其主要特点包括:,综合统一,高度非过程化,面向集合的操作方式,一种语法结构,两种使用方式,语言简捷,易学易用,3.2,SQL,语言的基本概念,一、数据类型,1、字符型:,CHAR(n),2、,数字型:,INT,NUMBER(n,m),REAL,3、,日期型:,DATE,TIME,DATETIME,4、,其它类型:,LONG,二、函数,数字函数:,常见的有16个,ABS(X),SQRT(X),EXP(X),LOG(X),字符函数:,常见的有9个,LENGTH(X$),LOWER(X$),分组函数:,常见的有5个,COUNT(),MAX(X),MIN(X),AVG(X),日期函数:,转换函数:,其他函数:,PI,POWER(X,Y),三、运算符,句法操作符,:&,&,数值操作符,:+,逻辑操作符,:,=,IN,ANY,ALL,查询表达式操作符,:,UNION,EXCEPT,其它操作符,:,(+),四、查询表结构,DESCRIBE user.,表名;,3.3 查询语句,一、语句格式:,SELECT,ALL|DISTINCT,表名.*|列名|表达式,AS,新列名,INTO:,主变量1,:主变量2,FROM,表名表别名,WHERE,条件表达式|子查询,GROUP BY,列名1,HAVING,分组表达式,UNION|INTERSECT|EXCEPTSELECTFROM,ORDER BY,列名|列序号,ASC|DESC,;,SELECTFROM,常用语句执行过程,SELECT ,投影,FROM TABLE,内存,WHERE ,选取元组,GROUP ,分组,HAVING ,选择分组,UNION|,查徇结果的集合运算,SELECT ,ORDER BY ,排序输出,二、单表查询,选择表中的列,例1.,求学生所在系及姓名,SELECT SD,SN,FROM S;,例2.,求学生的全部信息,SELECT S#,SN,SA,SD,FROM S,;,(SELECT*),选择表中的行,1)消除重复行:,DISTINCT (,缺省为,ALL),例:,求选修了课程的学生号,SELECT DISTINCT S#,FROM S;,2),选满足一定条件的行:,用,WHERE,子句实现,例:,求计算机系年龄小于19的姓名及年龄,SELECT SN,SA,FROM S,WHERE SD=CS AND SA=18 AND SA5,AND MIN(GR)60;,4、排序,用,ORDER BY,子句对查询结果按照一个或多个列的值进行升/降排列输出,升序为,ASC;,降序为,DESC,空值将作为最大值排序,例1:,对选修,C5,课程的学生按成绩降序排列,同分数者按学号升序排列,SELECT S#,GR,FROM SC,WHERE C#=C5,ORDER BY GR DESC,S#ASC;,例2:,求每个学生的总分并按总分降序排列,学号升序,SELECT S#,SUM(ALL GR),FROM SC,GROUP BY S#,ORDER BY 2 DESC,S#ASC;,三、连接查询,若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中主要的查询,包括多表连接查询、单表连接查询、外连接查询和复合条件连接查询等。,*几个示范表,EMP(EMPNO,ENAME,JOB,MGR,SAL,COMM,DEPTNO),DEPT(DEPTNO,DNAME,CITY),SALGRADE(GRADE,LOSAL,HISAL),S(S#,SN,SA,SD)C(C#,CN,CT,PC#),SC(S#,C#,GR),1、多表连接:,连接条件一:,表名1.列名1 比较运算符 表名2.列名2,连接条件二:,表名1.列名1,BETWEEN,表名2.列名2,AND,表名3.列名3,连接条件中的列名称为连接字段,其各字段应是可比的。,执行过程:,在表1中找到第一个元组,然后从头开始扫描表2,查找到满足条件的元组即进行串接并存入结果表中;再继续扫描表2,依次类推,直到表2末尾。再从表1中取第二个元组,重复上述的操作,直到表1中的元组全部处理完毕。,例1:,求选课情况,要求输出学号、姓名、课程名与成绩,SELECT S.S#,SN,CN,GR,FROM S,C,SC,WHERE S.S#=SC.S#AND C.C#=SC.C#;,例2,:,求每个职工的工资级别,SELECT ENAME,SAL,GRADE,FROM EMP,SALGRADE,WHERE SAL BETWEEN LOSAL AND HISAL;,2、单表连接,用表别名把一个表定义为两个不同性质的表进行连接。,例1:,求每门课的间接先修课名(即先修课的先修课),SELECT FIRST.C#,FIRST.CN,SECOND.PC#,THIRD.CN,FROM C FIRST,C SECOND,C THIRD,WHERE FIRST.PC#=SECOND.C#,AND SECOND.PC#=THIRD.C#;,例2:,求比本部门职工工资低的部门负责人,SELECT W.ENAME,W.SAL,,M.ENAME,M.SAL,FROM EMP W,EMP M,WHERE W.MGR=,.,EMPNO,AND W.SALM.SAL;,3、外连接,在连接条件的某侧加上()或(+),表示该侧所对应的表中可形成一个各数据项均为空值的万能替代行,用来与另一侧对应的表中所有不满足条件的元组进行连接。外连接符()或(+)出现在左侧称为左外连接、出现在右侧称为右连接、两侧都出现的称为全外连接。,例1:,求各部门名及职工名、工种,要求输出无职工的部门(职工以空值出现),SELECT DNAME,ENAME,JOB,FROM DEPT,EMP,WHERE DEPT.DEPTNO=EMP.DEPTNO(*);,例2:,求各部门名及职工名、工种,要求输出未分配部门的职工(部门以空值出现),SELECT DNAME,ENAME,JOB,FROM DEPT,EMP,WHERE DEPT.DEPTNO(*)=EMP.DEPTNO;,例3:,求各部门名及职工名、工种,要求输出无职工的部门和未分配部门的职工,SELECT DNAME,ENAME,JOB,FROM DEPT,EMP,WHERE DEPT.DEPTNO(*)=EMP.DEPTNO(*);,4、复合条件连接,WHERE,子句中除了连接条件,还有其它限制条件。,例,:,求选修,C6,课程且成绩超过,90,分的学生名与成绩,SELECT SN,GR,FROM S,SC,WHERE S.S#=SC.S#,连接条件,AND SC.C#=C6,限制条件,C#=C6,AND SC.GR90;,限制条件,GR90,四、空值处理,列值为空值的测试条件为:,列名,IS NULL,例:,求未确定系名的学生姓名,SELECTSN,FROM S,WHERE SD IS NULL;,五、嵌套查询,在,SELECT FROM WHERE,语句结构的,WHERE,子句中可嵌入一个,SELECT,语句块,其上层,查询称为外层查询或父查询,其下层,查询称为内层查询或子查询,SQL,语言允许使用多重嵌套查询,在,子查询中不允许使用,ORDER BY,子句,嵌套查询的实现一般是从里到外,即先进行子查询,再把其结果用于父查询作为条件,1、返回单个值的子查询,例:,求与刘力同一个系的学生名,年龄,SELECT SN,SA,FROM S,WHERE SD=(SELECT SD,FROM S,WHERE SN=,刘力);,2、返回一组值的子查询,例1:,求选修,C6,课程且成绩超过90分的学生,SELECT *,FROM S,WHERE S#IN,(SELECT S#,FROM SC,WHERE C#=C6,AND,GR90);,例2:,求选修,C6,课程且成绩超过90分的学生,SELECT S.*,FROM S,SC,WHERE S.S#=SC.S#(,连接查询),AND GR90,AND C#=C6;,例3:,求比计算机系中某一学生年龄小的其他系的学生,方法一:,SELECT *,FROM S,WHERE SD!=CS,AND SAANY,(SELECT SA,FROM S,WHERE SD=CS);,方法二:,SELECT *,FROM S,WHERE SD!=CS,AND SA,(SELECT MAX(SA),FROM S,WHERE SD=CS);,3、多重子查询,例1:,求10#部门中工种与,SALES,部门(销售)中任一工种相同的职工,SELECT ENAME,JOB,SAL,FROM EMP,WHERE DEPTNO=10,AND JOB IN,(SELECT JOB,FROM EMP,WHERE DEPTNO=,(SELECT DEPTNO,FROM DEPT,WHERE DNAME=SALES);,例2:,求工资介于,CLARK,与,MILLER,两个之间的职工,SELECT *,FROM EMP,WHERE SAL=,(SELECT MIN(SAL),FROM EMP,WHERE ENAHE IN(CLARK,MILLER),AND SAL=,(SELECT MAX(SAL),FROM EMP,WHERE ENAME IN(CLARK,MILLER);,例3:,求工种与在纽约的职工的工种相同的职工,SELECT DEPTND,ENAME,JOB,SAL,FROM EMP,WHERE JOB IN,(SELECT JOB,FROM EMP,WHERE DEPTND IN,(SELECT DEPTND,FROM DEPT,WHERE LOC=NEW YORK);,六、带有,EXISTS,EXISTS,表示存在量词,带有,EXISTS,的子查询不返回任何记录的数据,只返回逻辑值,True,或,False,不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。,相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,(,Correlated,Subquery,),带,EXISTS,的子查询就是相关子查询,例1:,求所有选修了,C1,课程的学生名。,SELECT SN,FROM,S,WHERE EXISTS,(SELECT*,FROM SC,WHERE S.S#=SC.S#,AND C#=C1);,在例1中,使用了,EXISTS,后,若子查询结果非空,则父查询的,WHERE,子句处返回逻辑值,TRUE,,否则返回,FALSE。,由于只须返回,TRUE,或,FALSE,,所以由,EXISTS,引出的子查询中的目标列表通常用*。,相关子查询的求解过程,先在外层查询中取,S,表的第一个元组(记录),用该记录的相关的属性值(在内层,WHERE,子句中给定的)处理内层查询,若外层的,WHERE,子句返回,TRUE,值,则此元组送入结果的表中。然后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。,NOT EXISTS:,若子查询结果为空,返回,TRUE,值,否则返回,FALSE。,例2:,求选修了全部课程的学生名,SELECT SN,FROM S,WHERE NOT EXISTS,(SELECT*,FROM C,WHERE NOT EXISTS,(SELECT*,FROM SC,WHERE S.S#=SC.S#,AND C.C#=SC.C#);,3.4 更新语句,SQL,更新语句(,SQL DML),SQL,的,DML,有:,INSERT,插入,UPDATE,修改,DELETE,删除,一、插入操作,1、插入单个元组,格式:,INSERT INTO,表名(列名1,),VALUES (,列值1,);,例1:,插入一已知元组的全部列值,INSERT INTO S VALUES(990021,陈冬,18,CS,男);,例2:,插入一已知元组的部分列值,INSERT INTO SC(S#,C#)VALUES(9807121,C175);,例3:,插入一个不确定值的元组,INSERT INTO S,VALUES(S#,SNAME,SA,SD);,2、插入子查询的结果,格式:,INSERT INTO,表名(列名1,),(子查询),;,例:,设关系,S_G(S#,AVG_G),把平均成绩大于80的学生的学号及平均成绩存入,S_G,中。,INSERT INTO S-G(S#,AVG-G),(SELECT S#,AVG(ALL.G),FROM SC,WHERE S#IN,(SELECT S#,FROM S,WHERE SEX=,男),GROUP BY S#,HAVING AVG(ALL G)80);,二、删除操作,格式:,DELETE FROM,表名,WHERE,条件;,例,:,删除选修,C4,且成绩小于该课程的平均成绩的记录,DELETE FROM SC,WHERE C#=,C4,AND G,(SELECT AVG(ALL G),FROM SC,WHERE C#=,C4,);,三、修改操作,格式1:,UPDATE,表名 别名,SET,列名=表达式,,WHERE,条件;,格式2:,UPDATE,表名 别名,SET(,列名,)=(子查询),WHERE,条件;,例1:,名为,MARTIN,的职工的工种改为,MANAGER,,工资增加收入20%,佣金为空。,UPDATE EMP,SET JOB=MSNSHRT,,SAL=SAL*1.2,,COMM=NULL,WHERE ENDME=MARTIN;,例2:,工种为,SALESMEN,的职工的工资改为工种平均工资的110%,佣金为最低值。,UPDATE EMP,SET(SAL,COMM)=,(SELECT 1.1*AVG(ALL SAL),MIN(COMM)FROM EMP WHERE JOB=SALESMEN),WHERE JOB=SALESMEN;,例3:,计算机系全体学生成绩上浮15%,UPDATE SC,SET GR=GR*1.15,,WHERE S#N,(SELECT S#,FROM S,WHERE SD=CS);,3.5,SQL DDL,一、定义数据库,1、格式:,CREATE DATABSE,数据库名;,作用:,生成一个新的数据库。,2、格式:,ALTER DATABASE,数据库名;,作用:,用来改变已存在的数据库的特征。,3、格式:,DROP DATABASE,数据库名1,;,作用:,从服务器中删除指定的数据库以及与其相关的对象及存储空间。,二、定义模式,1、,格式:,CREATE SCHEMA,模式名,AUTHORIZATION,用户名;,作用:,建立一个模式,并指明拥有该模式的用户,省略为,CREATE SCHEMA,的用户,2、,格式:,DROP SCHEMA,模式名,RESTRICT;,作用:,从服务器上删除一个模式;,RESTRICT,选项确保该模式在删除时,模式内没有任何对象。,三、定义表,1、,格式:,CREATE TABLE,表名,(列名 类型(长度),NOT NULL,DEFAULT,常量|系统变量|,NULL,列约束,),PRIMARY KEY(,列名,),FOREIGN KEY(,列名,),REFERENCES,表名(列名,),CHECK,条件;,作用:,建立一个新表,表中无记录,2、,格式:,CREATE TABLE,表名(列名,NOT NULL,),PRIMARY KEY(,列名,),FOREIGN KEY(,列名,),REFERENCES,表名1(列名,),AS,子查询,作用:,建立一个带有子查询结果记录的新表,例:,建立学生,S、,课程,C、,选课,SC,等三个表,CREATE TABLE S,(S#CHAR(6)NOT NULL,SNAME CHAR(8)NOT NULL,SAGE SMALLINT,SD CHAR(10),SEX CHAR(2)DEFAULT ,男,CHELK,男,OR,女),PRIMARY KEY (S#);,CREATE TABLE C,(C#CHAR(6)NOT NULL,CNAME CHAR(30)NOT NULL,TNAME CHAR(8),PC#CHAR(6),PRIMARY KEY (C#);,CREATE TABLE SC,(S#CHAR(6)NOT NULL,C#CHAR(6)NOT NULL,GR SMALLINT DEFAULT NULL),PRIMARY KEY(S#,C#),FOREIGN KEY(S#)REFERENCES S(S#),FOREIGN KDY(C#)REFERENCES C(C#),CHECK(G IS NULL),OR(G BETWEEN O AND 100);,3、,格式:,ALTER TABLE,表名 ,ADD,新列名 类型(长度),NOT NULL ,列约束,MODIFY,旧列名 类型(长度),DROP,列约束,DROP,列名,CASCADE|RESTRICT;,作用:,增加新列,修改列,删除列及列的完整性约束,CASCADE,连同引用与约束一起自动删除,RESTRICT,无引用该列时,才可删除,例1:,在,S,表中增加一个入学时间,为日期型,ALETR TABLE S ADD SCOME DATE;,例2:,把,SA,列的类型改为半字长整数,ALETR TABLE S MODIFY SA SMALLINT;,例3:,删除对,SN,列的唯一约束,ALETR TABLE S DROP UNIQUE(SN);,表的修改包括:,改变表名、,增加列、改变列的数据类型、删除列的约束、,删除列、改变列名,对,删除列、改变列名,的操作,可采取如下步骤实现:,CREATE TABLE AS(,子查询)建一新表,删除旧表,改变表名,4、,格式:,DROP TABLE,表名,CASCADE|RESTRICT;,作用:,删除一个表,及与该表相关的索引、视图、码和外部码。,CASCADE,连同引用该表的视图、完整性约束一起自动撤消,RESTRICT,无引用时,才可撤消,四、索引,1、,格式:,CREATEUNIQUECLUSTERINDEX,索引名,ON,表名(列名,ASC|DESC,);,作用:,对指定的表的列建立索引,UNIQUE,表示索引值唯一,CLUSTER,表示索引是聚簇索引,索引一旦建立,交由系统使用和维护,例:,CREATE UNIQUE INDEX SIDX ON S(S#ASC);,CREATE CLUSTER INDEX SNCDX,ON S(SNAME ASC);,CREATE UNIQUE INDEX CIDX ON C(C#ASC);,CREATE UNIQUE INDEX SCIDX,ON SC(S#ASC,C#DESC);,2、,格式:,DROP INDEX,索引名;,作用:,删除索引,例:,DROP INDEX CIDX;,3.6,SQL DCL,SQL,的,DCL,含授权,回收(撤消)权限,审计等。,一、授权(标准,SQL,),SQL,标准中对用户的授权分为,DATABASE,和,TABLE,二类对象,。,1、,DATABASE:,格式:,GRANT CREATETAB ON DATABASE,数据库名,TO,用户名,|,PUBLIC,WITH GRANT OPTION;,作用:,授予用户建立表的权限,由,DBA,授权,只有,CREATETAB,一种权限,WITH GRANT OPTION,允许用户转授权(权限传播),PUBLIC,表示所有用户,2、,TABLE,级的基本表,格式:,GRANTSELECT|INSERT|UPDATE|,DELETE|ALTER|INDEX|ALL PRIVICEES,ON TABLE,表名,TO,用户名,|,PUBLIC,WITH GRANT OPTION;,作用:,授予用户对表的操作权限,WITH GRANT OPTION,允许用户转授权,由拥有该表的用户授权,PUBLIC,表示所有用户,3、视图(,VIEW),格式:,GRANTSELEG|INSERT|UPDATE|,DELETE|ALL PRIVIIEGES,ON TABLE,视图名,TO,用户名,|,PUBLIC,WITH GRANT OPTION,;,作用:,授予用户对视图的操作权限,由拥有该视图的用户授权,4、列,格式:,GRANTSELECT|INSERT|UPDATE|,DELETE|ALL PRIVILEGES,(,列名,),ON TABLE,表名,|,视图名,TO,用户名,|,PUBLIC,WITH GRANT OPTION,;,作用:,授予用户对列的操作权限,由拥有该表或视图的用户授权,例:,GRANT CREATETAB ON DATABASE,教学系统,TO USER1;,GRANT SELECT,INSERT ON TABLE SC TO USER1,USER2,USER5,WITH GARNT OPTION;,GRANT ALL PRIVILEGES ON TABLE SC TO USER3,USER4,USER7;,二、,ORACLE,授权机制,在,ORACLE,中对用户的授权分为,系统级、表级、视图级,1、,系统级:,格式:,GRANT CONNECT,RESOURCE,DBA,TO,用户名,|,PUBLIC,IDENTIFIED BY,口令,,;,作用:,授予用户对,ORACLE,系统的操作权限,CONNECT,:,允许用户登录数据库,在获得表级或视图级授权后可作相应操作,但不能建立表(,CREATE TABLE),RESOURCE,:,允许建表,DBA,:,超级用户,2、表级:格式与标准,SQL,类似,3、表级:格式与标准,SQL,类似,例:,GRANT CONNECT,RESOURCE TO XUNS;,GRANT TO USER6 IDENTIFIED BY QWE,;,三、撤消权限,由,DBA,或授于,DBA,权限的用户对其他用户进行权限回收。,1、,格式:,REVOKE CREATETAB,ON DATABASE,数据库名,FROM ,用户名,|,PUBLIC;,2、,格式:,REVOKE ,权限列表,ON TABLE,表名|视图名,FROM ,用户名,|,PUBLIC;,3、,格式:,REVORE,权限列表(列名,),ON TABLE,表名|视图名,FROM ,用户名,|,PUBLIC;,4、,格式:,REVOKE(DBA,RESOURCE,CONNECT),FROM ,用户名,|,PUBLIC;,四、审计(,AUDIT),以,ORACLE,为例,分为系统级审计和用户级审计两种,1、系统级审计:,由,DBA,进行,可监测登录要求、,GRANT、REVOKE,及其他数据库级的操作,2、用户级审计:,由用户设置,主要针对用户自己创建的表或视图进行审计,监测对表或视图的访问及其他操作。,3、设置审计:,格式:,AUDIT,操作列表,ON,表名|视图名|,SYSTEM,4、,取消审计:,格式:,NOAUDIT,操作列表,ON,表名|视图名|,SYSTEM,5、,审计结果存放:,内容在数据字典表,SYS.AUDIT_TRAIL,中;,可用,SELECT*FROM SYS.AUDIT_TRAIL;,查看。,3.6 视图,视图是从一个或几个表(或视图)导出的一个特殊的表。,视图是一个虚表,数据库中只存放视图的定义,视图对应的数据仍存放在原来的表中,随着表中数据的变化,视图的数据随之改变。,对视图的查询与基本表一样,对视图的更新将受到一定的限制,一、定义视图,1、建立视图,格式:,CREATE VIEW,视图名(列名,),AS,子查询,WITH CHECK OPTION|READ ONLY;,2、,有关说明,WITH READ ONLY,表示视图不可更新,视图列名全部省略或全部指定,全部省略时,以,SELECT,的标志为准,WITH CHECK OPTION,是针对可更新视图,规定更新的行要满足视图的定义(即子查询中的,WHERE,子句的条件表达式)。,下述三种情况是,必须指定全部列名,某个目标列是组函数或表达式,多表连接时,目标列中出现同名列,不用原基本表的列名作为视图名,虚拟列:定义视图时,为由基本数据经过各种计算派生出的数据所设置的派生属性列。,定义视图的子查询不允许含有,ORDER BY,子句和,DISTINCT。,3、,视图分类,行列子集视图:从单个基本表导出,保留基本表的码,但去掉其它的某些列和部分行的视图。,表达式视图:带虚拟列的视图。,分组视图:子查询目标表带有组函数或子查询带有,GROUP BY,子句的视图。,例1:,建立计算机系学生视图,CREATE VIEW CS_S,AS(SELECT S#,SN,SEX,SA,FROM S,WHERE SD=CS),WITH CHECK OPTION;,(,行列子集视图),例2:,建立计算机系选修计算机体系结构课程的学生视图,CREATE VIEWCS_SCA(S#,NAME,GR),AS SELECT S.S#,SN,GR,FROM S,SC,C,WHERE S.S#=SC.S#,AND C.C#=SC.C#,AND S.SD=CS,AND CN=,计算机体系结构;,例3:,建立学生出生年份的视图,CREATE VIEW BT_S(SNO,NAME,BIRTH),AS SELECT S#,SN,2000_SA,FROM S;,(,表达式视图),(虚拟列),例4:,建立学生平均成绩视图,CREATE VIEW S_AVG_G(SNO,AVG_G),AS SELECT S#,,AVG(ALL GR),FROM SC,GROUP BY S#,;,(,分组视图,),二、查询视图,在对视图查询时,,DBMS,将进行有效性检查(表及视图)。,若存在,则从数据字典中取出视图定义,并把定义中的子查询与用户查询结合起来转换为等价的对基本表的查询,然后再执行。,该转换过程称为,视图消解,(,View Resolution)。,例1:,求计算机系年龄小于20的学生,SELECT S#,SN,FROM CS_S,WHERE SA20;,视图消解,SELECT S#,SN,FROM S,WHERE SD=CS AND SA=90;,(,系统转换后),SELECT S#,,,AVG,(,ALL GR,),FROM SC,WHERE AVG,(,ALL GR,),=90,GROUP BY S#;,SELECT S#,AVG(ALL GR),FROM SC,GROUP BY S#,HAVING AVG(ALL GR)=90;,(,正确的转换结果),三、更新视图,1、,更新视图即通过视图插入(,INSERT)、,删除(,DELETE),和修改(,UPDATE),数据,实质上转换为对基本表的更新。,2、,为了防止用户对超出视图范围的基本表的数据进行操作,在定义视图时,应加上,WITH CHECK OPTION,子句,则在视图上更新数据时,,DBMS,将检查视图定义中的条件,不满足将拒绝执行。,例1:,SC_S,视图的刘茜的年龄改为20,转换前:,UPDATE CS_S,SET SA=20,WHERE SN=,刘茜;,转换后:,UPDATE,S,SET SA=20,WHERE SN=,刘茜,AND DS=C5;,例2:,在,CS_S,中插入990075,吴迪,女,19的学生记录,转换前:,INSERT INT CS_S,VALUES(990075,吴迪,女,19);,转换后:,INSERT INTO,S,VALUES(990075,吴迪,19,CS,女);,例3:,删除,CS_S,中年龄大于23的学生,转换前:,DELETE FROM CS_S,WHERE SA23;,转换后:,DELETE FROM,S,WHERE SA23,AND SD=C5,;,例4:,修改990075学生平均成绩为90,转换前:,UPDATE S_AVG_G,SET AVG_G=90,WHERE SNO=990075;,不可转换。,左边程序操作失败。,3、,一般情况下,行列子集视图是可更新的,所以各,RDBS,均只允许对行列子集视图进行更新。,4、,不可更新的视图(各系统不太一致),由多个表导出的视图,不可更新,视图的列来自表达式或常数,不可插、改、可删,视图列是来自组函数,不可更新,视图定义中含有,GROUP BY,子句,不可更新,视图定义中有,DISTINCT,短语,不可更新,视图定义中内层嵌套的表与查询目标同一个表,不可更新,在不允许更新的视图上定义的视图,不可更新,四、使用视图的优点,提供数据的逻辑独立性,提供数据的安全保护功能,简化用户的操作(对系统构成的视图,用户不必关心各表间的联系),同一数据多种用法,3.8 嵌入式,SQL,将,SQL,语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补,SQL,语言实现复杂应用方面的不足。,这种方式下使用的,SQL,语言称为嵌入式,SQL(Embedded SQL)。,嵌入,SQL,的高级语言称为主语言或宿主语言。,一、嵌入式,SQL,一般形式,在所有的嵌入式,SQL,语句之前均加上前缀,EXEC SQL,嵌入式,SQL,语句的结束标志可以是;、,END_EXEC,等,嵌入式语句分为说明性语句和可执行语句两种,说明性语句出现在允许出现主语言说明性语句的地方,可执行,SQL,语句出现在允许出现主语句可执行语句的地方,二、,SQL,语句与主语言通信,1、,SQL,通信区(,SQLCA),SQLCA:SQL Communication Area,作用:,向主语言传递,SQL,语句的执行状态信息等,DBMS,工作状态、运行信息,SQLCA,应用程序,后继语句,SQLCA,是一种数据结构,在应用程序中用,EXEC SQL INCLUDE SQLCA,加以定义,SQLCODE:SQLCA,中的一个存放返回代码的变量;每次,SQL,语句执行后均返回一个值,表示该,SQL,语句执行是否成功,以及不成功的原因。,通常用预定义的常量,SUCCESS,表示成功;否则在,SQLCODE,中将存放错误代码。,2、主变量:,主语言中定义的变量,在,SQL,语句中使用。主变量分为输入主变量和输出主变量两种。,输入主变量,由应用程序赋值,在,SQL,语句中引用,输出主变量,由,SQL,语句赋值,在应用程序中引用,指示变量,(整型变量):用于指示所指主变量的值或条件;是由主变量附带,检测主变量是否为空。,定义主变量:,主变量及指示变量应在,SQL,语句的,EXEC SQL BEGIN DECLARE SECTION,EXEC SQL END DECLARE SECTION,之间说明。,引用主变量:,在,SQL,语句中引用主变量和指示变量时,其变量名前应加:。,3、游标:,游标是系统为存放,SQL,语句的执行结果而开设的一个数据缓冲区,每个游标区有一个名字。用户可通过游标逐一获取该缓冲区的记录,并赋给主变量,交由主语言进一步处理。使用游标的步骤为:,说明游标:用,DECLARE,语句为一条,SELECT,语句定义游标。,DECLARE,语句的一般形式为:,EXEC SQL DECLARE,游标名,CURSOR FOR SELECT,语句;,打开游标:用,OPEN,语句将定义的游标打开。,OPEN,语句的一般形式为:,EXEC SQL OPEN,游标名;,拨动游标:取游标指针指示的当前记录并。推进游标指针。,用,FETCH,语句把游标指针向前推进一条记录,同时将缓冲区中的当前记录取出来送到主变量供主语言进一步处理。,FETCH,语句的一般 形式为:,EXEC SQL FETCH,游标名,INTO:,主变量:指示变量,;,关闭游标:用,CLOSE,语句关闭游标,释放结果集占用的缓冲区及其他资源。,CLOSE,语句的一般形式为:,EXEC SQL CLOSE,游标名;,游标被关闭后,就不再和原来的查询结果集相联系;但被关闭的游标可以再次被打开,与新的查询结果相联系。,第四章 数据库设计,4.1 数据库设计步骤,一、数据库设计的特点,数据库设计是一项涉及多学科的综合性技术,是一项庞大的工程项目。,特点一:数据库建设是硬件、软件和干件(技术与管理的界面称为干件)的结合。,特点二:数据库设计应该和应用系统设计相结合,在整个设计过程中要把结构(数据)设计和行为(处理、功能)设计密切结合起来。,二、数据库设计的基本步骤,数据库设计分为六个阶段:,需求分析,概念结构设计,逻辑结构设计,物理结构设计,数据库实施,数据库运行和维护,1、需求分析阶段,进行数据库设计首先必须准确了解与分析用户需求(包括数据与处理、功能)。需求分析是整个设计过程的基础,是最困难、最耗时间的一步。,2、概念结构设计阶段,概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体,DBMS,的概念模型。,3、逻辑结构设计阶段,逻辑结构设计是将概念结构转换为某个,DBMS,所支持的数据模型,并对其进行优化。,4、物理结构设计阶段,数据库物理设计是为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。,5、数据库实施阶段,在数据库实施阶段,设计人员运用,DBMS,提供的数据语言及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。,6、数据库运行和维护阶段,数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。,4.2 数据库,的实施阶段,一、数据库的实施阶段,数据库实施阶段的两项重要工作:,数据的,载入,和应用程序的,编码与调试,数据的载入,数据输入子系统,应用程序的调试,二、数据库的试运行,在输入一小部分数据到数据库后,可对数据库系统进行联合调试,即数据库的试运行。,运行数据库应用程序,执行对数据库的各种操作;测试应用程序的功能;,测试系统的性能指标,4.3 数据库,的运行和维护,在数据库的运行阶段,对数据库的经常性的维护工作主要由,DBA,来实践。,数据库运行阶段的主要维护工作有:,数据库的转储和恢复,数据库的安全性、完整性控制,数据库性能的监督、分析与改造,数据库的重组织与重构造
展开阅读全文