2003-9-28 17:29
zdygk
第四章 SQL语句<br />提纲<br /> 熟练掌握SQL 的SELECT、INSERT、UPDATE、DELETE语句的应用<br /><br />4.1 基本的SELECT语句<br /> SELECT 语句从数据库一个或多个数据表中获取数据,并将查询结果提供给用户。从多个数据表中获取数据称为连接查询(JOIN)。 <br />SELECT [DISTINCT]column-list <br />FROM Table-reference <br />[WHERE search-condition] <br />[ORDER BY order-list] <br />[HAVING having-condition] <br />[UNION select-expr] 。<br />除特殊说明,所有字句用法和ANSI标准SQL相同。"[ ]"中子句是可以选择的。<br />4.1.1 SELECT 的单表查询<br />一个基本的SELECT 语句指定此查询要检索的数据项(Column-list),各选项间用","隔开。按照从左到右的顺序,每个数据选项产生一个列的查询结果。 <br />例如:1-1. 要从雇员表中查出所有雇员的电话.<br />SELECT 雇员姓名,雇员电话 FROM 雇员表 <br />其结果如下:<br /> <br /><br />这里,"雇员姓名,雇员电话"是表"雇员表"的字段名。<br /><br />例 1-2. 要从部门表中查出所有信息。<br />SELECT * FROM 部门表 <br />其结果显示如下:<br /> <br />"SELECT *"表示选择一个表中所有列的内容,且从左到右的顺序和表本身相同。<br />SELECT子句中的数据项除了可以为查询表的字段外,还可以为常数或SQL表达式。SQL表达式可以是对所存储的数据进行计算后的计算列。ANSI/ISO SQL标准规定表达式中可用四种算术运算:加(X+Y)、减(X-Y)、乘(X*Y)、除(X/Y),还可以用括号组成更复杂的表达式,如:(X*1.05)+(Y/3)<br />SQL表达式还可以是关于字符串的运算函数或数字的运算函数。如SUM,COUNT,AVG,MAX,MIN等。<br /><br />SUM():计算某列的总和。 <br />COUNT():计算某列中值的个数。 <br />COUNT(*):计算查询结果的行数。 <br />AVG():计算某列的平均值。 <br />MAX():求某列中最大的值。 <br />MIN():求某列中最小的值。 <br />例1-3. 列出各雇员编号对应的雇员。 <br />SELECT 雇员编号, "是", 雇员姓名 FROM 雇员表 <br />其结果显示如下:<br /> <br /><br />例1-4. 显示所有雇员的薪金减掉1000元的结果。<br />SELECT 雇员编号,雇员姓名, (雇员薪金-1000) as 雇员薪金 FROM 雇员表 <br />其结果显示如下:<br /> <br />"as 雇员薪金"表示(雇员薪金-1000)列的显示标题为"雇员薪金"。若没有"as 雇员薪金",列标题将默认为"雇员薪金-1000"。 这里"(雇员薪金-1000)"是SQL计算表达式。<br /><br />例1-5. 显示所有雇员薪金之和。<br />SELECT SUM (雇员薪金) as 总薪金 FROM 雇员表<br />其结果显示如下: <br /> <br /><br />例 1-6. 列出所有部门代号为A1的雇员。<br />SELECT * FROM 雇员表 WHERE 部门代号='A1' <br />其结果显示如下:<br /> <br /><br />例1-7. 求出所有雇员的平均工资。<br />SELECT AVG(雇员薪金)as 平均薪水 FROM 雇员表<br />其结果显示如下:<br /> <br /><br />例1-8. 显示各部门最高薪水。<br />SELECT B.部门编号,B.部门名称,MAX(G.雇员薪金) as 最高薪水 FROM "雇员表" G,"bmb" B WHERE B.部门编号=G.部门代号 GROUP BY B.部门编号,B.部门名称 <br />其结果显示如下:<br /> <br /><br /><br />例1-9.显示各部门最低薪水。<br />SELECT B.部门编号,B.部门名称,MIN(G.雇员薪金) as 最低薪水 FROM "雇员表" G,"bmb" B WHERE B.部门编号=G.部门代号 GROUP BY B.部门编号,B.部门名称 <br />其结果显示如下:<br /> <br /><br />4.2 SELECT 的COUNT()查询<br />"[DISTINCT]"表示不重复行。如果一个查询的选择表中包含表的主关键值,则查询结果中每行都是唯一的(因为主关键值在每行中的值是不同的)。如果查询结果中不含主关键值,则可能出现重复行。例如,假如您要作下列查询:<br /><br />例1-10.在雇员表中列出所有部门代号。<br />SELECT 部门代号 FROM 雇员表 <br />其结果显示如下:<br /><br /> <br />查询结果有7行,且后三行均与前面某行重复,显然不是您所想要得结果。因为您要的是不同的部门代号。如何消除这种重复行呢?<br />办法就是:在SELECT 语句中的选择表前插入关键字DISTINCT。下面是对上述查询的改进。其结果与您的想象一致: <br />例1-11.在雇员表中列出所有部门代号。<br />SELECT DISTINCT(部门代号) FROM 雇员表 <br /> 其结果显示如下:<br /><br />从概念上讲,SQL执行这种查询的过程是,先生成所有查询结果(7行),再删出完全相同的行,然后形成最终结果。DISTINCT关键字对任何类型的选择表都可使用。如果省略DISTINCT关键字,SQL将不剔除重复行。<br /><br /><br />4.3 SELECT的多表查询 <br /> 多表关联查询:通过多表查询条件连接一个或多个表,检索出相应数据。<br />例如4-12:从雇员表及部门表中找出李家军所在部门及其经理。 <br />SELECT G.雇员编号, G.雇员姓名, B.部门名称, B.部门经理 <br />FROM "雇员表" G, "部门表" B <br />WHERE (G.雇员姓名="李家军")AND (B.部门编号=G.部门代号)<br />其结果查询如下:<br /><br />4.4 子查询<br />SQL子查询是指出现在另一个SQL语句的WHERE 或HAVING子句中的查询。 <br />例如4-13:列出某公司实际销售超过销售点各销售员定额总和的销售点。 <br />这个请求要求从公司的销售点表中列出销售超标的销售点,其中实际销售额的值要满足某些条件。<br />表示这种查询的SELECT语句为: <br />SELECT 销售点名称 <br />FROM 销售点表 <br />WHERE 实际销售额>??? <br /> 值"???"应该添入,且要等同于"各销售员定额总和"。怎样规定查询中的这一值呢?我们知道,某销售点(如销售点代码为10的点)的定额总和可以用下述查询获得: <br />SELECT SUM(销售定额) <br />FROM 销售员表 <br />WHERE 销售点代码=10 <br />但是,怎样才能把这一查询结果放置在前一个查询中以代替问题的标记呢?从第一个查询开始并用第二个查询置换"???",这种方法应该是有道理的,其形式如下: <br />SELECT D.销售点名称 <br />FROM "销售点表"D <br />WHERE D.实际销售额>(SELECT SUM(Y .销售定额) FROM "销售员表"Y WHERE D.销售点代码=Y. 销售点代码)<br /> 事实上,这是一个正确的SQL查询形式。<br />对各销售点,子查询计算销售点工作的销售员的定额总和。<br />主查询把销售点的目标与计算机的和作比较并确定是否把这各销售点加到主查询结果中。同时,主查询和子查询表达原先的请求,并从数据库中取回所请求的数据。<br /> 4.5 插入语句INSERT<br /> 一般格式为<br /> INSERT INTO 关系句[(属性名[,属性名]…)]<br /> WALUES(常数[,常数]…)<br /> INSERT语句的功能是把元组插入关系中。该元组中指定属性具有给定的值,即第i个属性对应于第i个常数。若省略属性句,则表示属性值对应于该关系的原定义的属性名。<br /> 例4-29:将计算机系的新生李林插入关系BORROWERS中,该生的借书证号为160006。<br /> INSERT INTO BORROWERS(NAME,CARDNO,DEPT)<br /> VALUES(‘李林’,‘160006’,‘计算机系’)<br /> 此语句建立一个新的借书人记录,它具有指定的借书证号、姓名和单位。INSERT语句中的属性顺序并不要求一定与关系中的属性顺序一致,但语句中属性名与属性值在个数、顺序及数据类型上必须一致。如果用户插入元组中属性值的个数与顺序完全与原关系一样,则INSERT语句中的属性名可以省略。下面的例子说明此用法。<br /> 例4-30:将新书(书号为227550,分类号为TP322,书名为《软件工程》,作者为胡为,价格为6.50元,书架号10)加入到图书关系中。<br /> INSERT INTO BOOKS<br /> VALUES (‘227550’+,‘TP322’,‘软件工程’,<br />‘胡为’,6.5,10)<br /> 这种方法固然省事、方便,但潜在一种危害,即关系结构的定义如有修改,比如增加一个属性,就可能要出问题。因此此法适合交互式,而不适合嵌入式。<br /> 以上两例都是单个元组的插入,若是插入一批元组,则可进行批量插入。设W是存放一批新书元组的变量名,也作关系名。今将W加入到关系BOOK中,可用下列语句实现:<br /> INSERT INTO BOOK<br /> SELECT *<br /> FROM W<br /> 4.6 删除语句DELETE<br /> DELETE的语句格式为<br /> DELETE FROM 关系名<br /> [WHERE 检索条件]<br /> 其功能是把满足检索条件的所有元组删去。<br /> (1)单记录删除<br /> 删除借书人张平,<br /> DELETE FROM BORROWERS<br /> WHERE NAME=‘张平’<br /> 如果借书登记关系LOANS中有张平借的书(通过关系BORROWERS确定张平的借书证号,再通过关系LOANS查找该号对应的元组存在否,即可判定张平是借书),则删除操作将破坏数据库的一致性。这属于语义完整性问题。在已实现的商品化SQL产品中,几乎都未提供语义完整性的相应功能。<br /> (2)多元组删除<br /> 删除1992年9月1日以前所有的借阅登记。<br /> DELETE<br /> FROM LOANS<br /> WHERE DATE<92.9.1<br /> (3)带子查询的删除操作<br /> 删除赵兵借阅的图书登记项。<br /> DELETE<br /> FROM LOANS<br /> WHERE CARD-NO IN<br /> (SELECT CARD-NO<br /> FROM BORROWERS<br />WHERE NAME=‘赵兵’)<br />(1) 删除表中的所有记录<br />DELETE FROM LOANS; <br /> 4.7 修改语句UPDATE<br /> UPDATE的语句格式为<br /> UPDATE 关系名<br /> SET 属性名=表达式[,属性名=表达式]…<br /> [WHERE 检索条件]<br /> UPDATE语句的功能是把关系中满足检索条件的所有元组按照SET子句中的赋值语句进行修改。<br /> (1)单元组的修改<br /> 王三元从数学系调到计算机系,将数据库进行相应的修改。<br /> UPDATE BORROWERS<br /> SET DEPT=‘计算机系’<br /> WHERE NAME=‘王三元’<br /> (2)多元组的修改<br /> 把5号书架上的分类号以“TP”打头的图书搬到3号书架上,请将数据库作相应修改。<br />UPDATE LOANS..<br /> SET LO-NO=3<br /> WHERE LO-NO=5 AND LIKE SORT-NO ‘TP%’<br /> 4.8 SQL数据的安全与授权的语句<br /> 数据库的安全性是指保护数据库中的数据以防止不合法泄露、破坏和更改。SQL的安全保护可以从一个指定的数据值到一个表。一个用户对不同的表有不同的存取权力,不同的用户对同一个表有不同的存取权力。用户对数据的存取权力是由DBA授予的。授权本身只是一个策略问题而非技术问题。DBMS的任务是保证这些权力的实施。DBMS实现这一功能是通过授权子句GRANT接受DBA或用户的授权决定,并存入数据字典,当用户提出操作请求时,DBMS查阅数据字典,决定是否允许执行请求的操作。<br /> 授权语句的格式:<br /> GRANT 权力[,权力]…[ON对象类型 对象名]<br /> TO 用户[,用户]…<br /> [WITH GRANT OPTION]<br /> 对不同类型的操作对象有不同的操作权力。<br /> (1)对基表和视图等的操作有查询、插入、修改和删除的权力。<br /> (2)对基表还有修改和建立索引的权力。<br /> (3)对数据库有建表的操作权力,拥有此权的用户不仅可以创建基表,还拥有对此表的一切操作权力。<br /> (4)对表空间的操作权是存储基本表。<br /> (5)系统权力是建立新数据库的权力。<br /> GRANT语句中的任选项WITH GRANT OPTION的作用是使获得某种权力的用户可以把权力再授予别的用户。<br /> SQL还提供了撤消权力的语句REVOKE。<br /> REVOKE的格式为<br /> REVOKE 权力[,权力]…[ON 对象类型 对象名]<br /> FROM 用户[,用户]…<br /> 以下举例说明GRANT和REVOKE的用法。<br /> 例4-1:把删除和查询BORROWERS表的权力授给王林。<br /> GRANT DELETE,SELECT ON TABLE BORROWERS TO WANGLING<br /> 例4-32:把对BORROWERS,LOANS和BOOKS三表的查询、修改、插入、删除等全部权力授给张斌和杨勇。<br /> GRANT ALL PRIVILIGES ON TABLE BORROWERS,LOANS,BOOK TO ZhangBin, YangYon<br /> 例4-33:把对BOOK表的查询权力授予所有用户。<br /> GRANT SELECT ON TABLE BOOK TO PUBLIC<br />例4-34:把在数据库BOOKMANAGE中的建表权授予用户李明。<br /> GRANT CREATETAB ON DATABASE BOOKMANAGE TO LIMING<br /> 例:4-35:把对BOOK表的查询权力授予用户U1,并给U1有再授权的权力。<br /> GRANT SELECT ON TABLE BOOK TO U1 WITH GRANT OPTION<br /> 例4.37:把用户张平删除BORROWERS的权力收回。<br /> REVOKE DELETE ON TABLE BORROWERS FROM ZhangPing<br /> 例4.38:把用户U1查询BOOK表的权力收回。<br /> REVOK SELECT ON TABLE BOOK FROM U1<br /> <br />由此可见,SQL的授权机制十分灵活。用户对自己建立的基表和视图拥有全部的操作权力。他还可以用GRANT语句把指定的操作权力授予其他用户,包括授权的权力,因而授权有传递效应同时又可用REVOKE语句收回权力。<br /><br /><br />第五章 远程数据库<br />提纲<br /> 熟练掌握远程数据库的配置,编目