(2)基表的更改 可以通过更改表(ALTER TABLE)语句以扩充基表的列,从而构成一个新的基表框架,其形式为: ALTERT ABLE(基表名) ADD<列名>(数据类型) 如我们可以在S中添加一个新的域SEX,并可用如下形式 表示: ALTER TABLE S ADD SEX(SMALLINT) 所要注意的是在扩充列时不允许出现:NOT NULL。 (3)基表的删除 可以通过删除表(DROP TABLE)语句以删除一个基表,包括基表的模式连同该基表的数据、索引以及由该基表所导出的视图并释放相应存储空间。删除表的形式为: DROP TABLE(基表名) 如我们删除关系S,可用如下的形式: DROP TABLE S 2,索引的建立与删除 在SQL中可以对基表建立索引以提供多种快速存取路径 引的建立一般由DBA或建表人负责。 索引的建立,可以通过建立索引(CREATE TABLE)语句实现,该语句可以按指定基表、指定列以及按指定顺序(升序或降序) 建立索引。其形式如下; CREATE [UNIQUE] INDEX(索引名) ON (基表名) (<列名>[(顺序)][,<列名>[<顺序>].…])[其他参数] 语句中UNIQUE为任选项,在建立索引中若出现UNIQUE则表示不允许两个元组在给定索引中有相同的值。语句中顺序可按升序(ASC)或降序(DESC)给出,顺序可以缺省,缺省时为升序。语句中其他参数为任选项,它与物理存储有关,在此不予细述。 现举两例如下:
在SQL中可以用删除索引(DROP INDEX)语句以删除一个 已建立的索引,其形式如下: DROP INDEX<索引名> 如下面的例子表示将已建立的索引名为XSNO的索引删除: DROP INDEX XSNO SQL数据操纵功能 SQL的数据操纵功能具有数据查询、删除、插入及修改等功能,此外,作为自含式语言还具有如下功能: 〔1)赋值功能 在数据操纵过程中所产生的一些中间结果以及需作永久保留的结果,必须以新的关系形式存贮于数据库内,因此对这些新关系须予以命名并赋值,经赋值后的关系今后在数据库中即可提供用户使用。 (2)计算功能 SQL作为自含式语言需要有一些计算功能,它们是: 1简单的四则运算。它包括在查询过程中可以出现有加、减、乘、除等简单计算。 2统计功能。由于数据库在统计中有极大的应用,因此SQL有常用的统计功能,它们为求和,求平均值,求总数,求最大值,求最小值等。 3分类功能。 (3)输入/出功能 SQL提供标准的数据录入与输出功能。 (4)查询功能 贝L语言的数据操纵功能是一种基于关系代数的操纵形式。我们知道,对查询的基本要求在关系代数中可以用下式表示:
这三种参数可以用SQL中的基本语句:映像(mapping)语句的三个子句分别表示,映像语句由SELECT,FROM及WHERE等三个子句组成,其中SELECT子句给出查询的目标属性,FROM于勾结出查询所涉及的关系,而wHERE子句则给出查询的逻辑条件,它们可以用下面形式表示: SELECT <列名>[,<列名>] FROM<基表名>[,<基表名>] WHERE<逻辑条件> 这种映像语句在数据查询中表达力很强,不仅如此,为了表示简洁与方便,映像语句中的WHERE子句还具有更多的表示能力 ①映像语句在wHERE子句中具有嵌套能力; ②WHERE子句中的逻辑条件不仅具有命题公式形式,还具有一所谓词公式形式以及集合表达式形式。此外,SQL还具有数据删除、插入、修改的能力 SQL的数据操作语句 SQL的数据操作功能包括SELECT、INSERT、DELETE和UPDATE四个语句检索和更新(包括增、删、改)两部分功能。 1.SQL查询语句 sQL语言的核心语句是数据库查询语句.其简单格式是: SELECT目标列FROM基本表(或视图) [wHERE条件表达式] [GROUP BY 列名1 [HAVING 内部函数表达式]] [ORDER BY列名24 {ASC|DESC}]; 语句的功能是:根据wHERE子句中的条件表达式,从基本表(或视图)中找出满足条件的元组,按SELECT子句中的目标列,选出元组中的分量,形成结果表。如果有ORDER BY子句,则结果表要根据指定的 列名2 按升序或降序排序。GROUP BY于句将结果按 列名1分组。分组的附加条件用HAVING短语给出,只有满足内部函数表达式的组才会被输出。 SQL语言对数据库的操作十分灵活方便,原因在于SELECT语句中的成分丰富多 样,有许多可选形式,尤其是目标列和条件表达式,下面用例子来详细说明,例子涉及的是“学生—课程”数据库。 (1)简单查询: [例4.1I 求数学系学生的学号、姓名。 SEI‘ECT S#,SNAME FROM S WHERE SD=‘MA’ [例4.2] 求选修了课程的学生的学号。 SELECT DISTINCT S# FROM SC 这里SELECT后面的DISTINCT表示要在结果中去掉重复的S#。 [例4.3I 求全体学生的详细信息。 SELECT * FROM S; [例4.4] 查询经过计算的值。求学生学号和学生的出生年份。 SELECT S#,1989-AGE FROM S; SELECT语句后面可以是字段名,也可以是字段名和常数组成的算术表达式,还可以是字符串常数。 如:SELECT S#,‘BinhdaY’,1998-AGE FROM S; 结果为: S# S1 Birthday 1969(若AGE=29) S2 Birthday 1968(若AGE=30)
[例4.5] 要求对结果进行排序(即使用ORDER BY)的查询 求选修C1课程的学生学号和得分,结果按分数降序排列。 SELECT S#,GRADE FROM SC WHERE C#=’C1’ ODER BY GRADE DERC; (2)连接查询:若查询涉及两个以上的表,则称之为连接查询,连接查询功能是关系数据库最重要的查询功能之一。 [例4.6] 查找学生以及共选修课程的信息。 SELECT S.*,SC.* FROM S, SC wHERE S.S#=SC.S# WHERE 后面的条件S.S#=SC.S#称为连接条件或连接谓词.连接谓词中的字段称为连接字段。连接字段的类型必须是可比的,但个必相同.当然大多数情况下是相同类型的。连接谓词中的比较符可以是=,>,<.>=,<=,乒。当比较符为‘=’时.就是等值连接的情况。如本例.若又在目标列中去掉一个相同的字段名,则为自然连接。 [例] 带有其他条件的连接查询。 求选修c1课程且成绩为B以上的学生及成绩。 SELECT S。S#,SNAME.SD,AGE, GRADE FFROM S,SC WHERE S.S#=SC.S# AND SC.C#=’C1’ AND (SC.GRADE=’A’ OR SC.GRADE=’B’); 连接谓词可以和其他谓词组合起来,形成各种复合条件。
视图的查询:视图定义后,用户可以如对基本表那样对视图进行查询。 如:SELECT S#,SA FROM CS-S WHERE SA<20;系统执行此查询时、首先把它转换成等价的对基本表的查询,然后执行此查询,即当查询视图表时,系统首先从数据字典中取出该视图的定义,然后把定义中的查询语句和对该视图查询语句结合起来,形成一个修正的查询语句。对上例,修正后的查询语句为: SELECT S# ,SA FROM S WHERE SD=‘CS’ AND SA <20; 由于视图的查询实质上是对基本表的查询,因此基本表的变化可以反映到视图上,视图就如同‘窗口’一样,通过视图可以看到基本表的动态变化。 SQL插入语句 插入语句的一般格式为: INSERTINT() 表名[ (字段名[,字段名]...)] VALUES (常量[,常量]...); INSERT () 表名[(字段名[,字段名]...)] 子查询; 第一种格式把一个新记录插入指定的表中,第二种格式把子查询的结果插人表中,若表中有些字段在插人语句中没有出现,则这些字段上的值取空值NULL。当然在表定义中说明了NOT NULL的字段在插入时不能取NULL。若插入语句中没有指出字段名,则新记录必须在每个字段上均有值。 [例] 单记录插人。 把一个新学生记录插入表中.其有关信息为:S10,姓名zhang Ming,信息系IS ,18岁 INSERT INTO S VALUES(’S10’,’ZhangMing’,’IS’,18); [例] 插入一个选课记录(’S15’,’C10’,’A’); INSERT INTO SC(S#,C#,G) VALUE5(’S15J.‘C10“,“A’); 插人和删除与更新操作一样,都会引起破坏数据完整性的问题,如本例中S15在S表中不存在,C10在C表中也不存在,这就破坏了参照完整性。支持关系模型的系统应自动地检查数据的完整性,对破坏充整性的插入操作拒绝执行。所以,这个新行就不能插入。 [例] 多记录插入。 下面语句是求一个系中学生的平均年龄,并把结果存入数据库中。 CREATE TABLE DEPTAGE(SDEPT CHAR(15),AVGAGE SMALLINT); INSERT INTO DEPAGE(SDEPT,AVGAGE) SELECT SD,AVG(AGE) FROM S GROUP BY SD SQL的删除语句 删除语句的 般格式为: DELETE FROM 表名 [WHERE 谓词]; 删除语句从指定表中删除满足谓词的那些记录.没有WHERE Z子句时表示删去全部 记录,但表的定义仍在数据字典中。 [例] 单个记录.例如,要把学生S9删除,可以使用下面删除语句: DELETE FROM S WHERE S#=‘59‘; 执行删除操作也可能破坏数据的完整性.如本例。 [例] 多个记录删除。例如,要删除所有的学生选课记录,可以使用下面删除语句: DELETE FROM SC; 执行此操作后,SC成为一个空表. [例] 带有子查询的删除。删除计算机科学系全体学生的选课记录 DELETE FROM SC WHERE ’CS’= (SELECT SD FROM S WHERE S.S#=SC.S#); SQL的更新语句 (1)更新语句的一般格式为; UPDATE 表名 SET 字段-表达式[字段=表达式]... [WHERE 谓词] 更新语句修改指定表中满足谓词的元组,把这些元组按SET子句中的表达式修改相应字段上的值。 [例] 单记录修改,如把学生S1的姓名改为’WANG PING’,可以使用以下语句: UPDATE SET SNAME=’WANG PING’ WHERE S#=’S1’ [例] 多记录修改,如把所有学生的年龄加2,可以使用以下语句: UPDATE S SET SA=SA+2; [例] 具有子查询的更新,如把数学系全体学生的成绩置零,可以使用以下语句 UPDATE SC SET G=’0’ WHERE ’MA’=(SELECT SD FROM S WHERE S.S#=SC.S#); [例]多个表的更新 在UPDATE语句中,一次只能对一个表更新.这就会产生破坏参照完整性的问题 例如,把S2的学号改为S9。 UPDATE S SET S#=’S9’ WHERE S#=’S2’;
SQL的数据控制语句 SQL数据控制功能是指控制用户对数据的存取权力。某个用户对某类数据具有何种操作权是由DBA决定的,这是管理问题而不是技术问题。数据库管理系统的功能是保证这些决定的执行,为此它必须能:把授权的决定告知系统,这是由SQL语句GRANT和REVOKE来完成的;把授权的结果存人数据字典;当用户提出操作请求时,根据授权情况进行检查,以决定是执行操作请求还是拒绝之。 授权语句格式 GRANT 权限表 ON 表名 TO 用户名表 [WITH GRANT OPTION] 该语句把对指定表的某些权限授予指定的若干用户。当有WITH GRANT OPTOIN 短语时,被授权的用户还可将获得的权限再授予其他用户,GRANT语句可以指定的操作权限有:SELECT(检索)、INSERT(插入)、DELETE (删除)、UPDATE(更新)、EXPAND(扩充)、INDEX(建立索引)、ALL PRIVILEGES(所有上述权限).DBA(用户被指定为DBA)等。回收权限语句格式 REVOKE权限表ON 表名FROM 用户名表 把已授给指定用户的在指定表上的权限收回。把对表C的查询权力授予所有用户。 GRANT SELECT ON TABLE C TO PUBLIC; 把在数据库S-C中建立表的权力授予用户杜明。 GRANT CREATETAB ON DATEBASE S-C TO DUMING; 把对表S的查询权力授予用户U2,并给U2有再授权权力。 GRANT SELECT ON TABLE S TO U2 WITH GRANT OPTION ; 把用户王平更新学生学号的权力收回。 REVOKE UPDATE(S#)ON TABLE S FROM WANGPING; 把用户U2查询S表的权力收回。 REVOKE SELECT ON TABLE S FROM U2; SQL的数据嵌入式使用 SQL语言具有双重使用方式,既可在交互方式下使用.也可将SQL语句嵌入某种高级语言(例如:C,FORTRAN,COBOL,PL/1等)中使用。后一种使用SQL的方式称为嵌入使用方式。这两种方式在细节上会有许多差别.特别是SELECT 语句.在程序设计的环境下要作必要的扩充。把SQL嵌入主语言使用时,必须解决三个问题: 1. 区分SQL语句与主语言语句。这是对通道在所有的SQL语句前加前级EXECSQL来解决的(图A①)。SQL语言的结束标志随主语言不同而不同。 2.数据库工作单元和程序上作单元之间的通信。SQL语句可以使用主语言的程序变量(简称主变量),这些变量名前加冒号(:)作标志,以区别于字段名(图A⑤),程序中使用的任何表(基本表或视图)都要用EXEC SQL DECLARE语句加以说明(图A②),一则使程序更加易懂,二则使预编译程序能作某些语法检查。SQL语句执行后,系统要反馈给应用程序若干信息,这些信息送到SQL的通信区SQLCA。SQLCA用语句EXEC SQLINCLUDE加以定义(图A③)。在SQLCA中有一个状态指示字段SQLCODE。当SQLCODE为零时,表示SQL语句执行成功、否则返回一个错误代码(负值)或警告信息(正值),程序员应该在每个SQL语句之后测试SQLCODE的值,以便了解语句执行结果、并采取相应措施。
带有嵌人式SQL的一小段PL/1l程序 3.一个SQL语句原则上可产生或处理一组记录,而主语言—次只能处理一个记录. 为此必须协调两种处理力式。这是用游标(Cursor)来解决的。 与游标有关的SQL语句有四个: (1)游标定义语句。游标是与某一查询结果集相联系的符号名,游标用SQL的DECLARE语句定义,它是说明语句、其中的SELECT语句并不执行。 (2)游标打开语句(OPEN)。此时执行游标定义中的SELEC丁语句,游标处于活动状态,指向查询结果集中的第一行之前。 (3)游标推进语句(FETCH)。执行它使游标向前推进‘行,并把游标指向的行(称为当前行)中的值取出,放到语句中说明的对应的程序变量中。FETCH语句常常被用在主语言程序的循环中,并借助主语言的处理语句逐一处理查询结果集中的一行。 (4)游标关闭语句(CLOSE)。关闭游标,使它不再和原来的查询结果相联系。关闭了的游标可以再次打开,与新的查询结果相联系。 在游标处于活动状态时,可以修改和删除游标指向的行。 [例] 在表S和SC中检索某学生(姓名由主语言变量GIVENSNAME给出)的学习成绩信息(S#,SNAME,C#,GRADE)。其程序是: EXEC SQL DECLARE SCX CURSOR FOR SELECT S.S# ,SNAME,C#,GRADE FROM S,SC WHERE S.S#=SC.S# AND SNAME=:GIVENSNAME; (定义了名为SCX的一个游标) EXEC SQL OPEN SCX (打开游标SCX) EXEC SQL SCX INTO :S#,:SNAME ,:C#,:GRADE; (游标推进1,把值送到于语言的变量中去); …(主语言的处理语句) END; (利用主语言WHILE语句.构成循环结构) EXEC SQL CLOSE SCX (关闭游标);
外部安全性-保证网络访问的安全
外部安全性-保证网络访问的安全
MySQL的安全系统是很灵活的,它允许你以多种不同方式设置用户权限。一般地,你可使用标准的SQL语句GRANT和REVOKE语句做,他们为你修改控制客户访问的授权表,然而,你可能由一个不支持这些语句的老版本的MySQL(在3.22.11之前这些语句不起作用),或者你发觉用户权限看起来不是以你想要的方式工作。对于这种情况,了解MySQL授权表的结构和服务器如何利用它们决定访问权限是有帮助的,这样的了解允许你通过直接修改授权表增加、删除或修改用户权限,它也允许你在检查这些表时诊断权限问题。
_数据库系统原理关系数据库系统的数据语言有多种,但在经过l0余年的使用、竞争、淘汰与更新后,SQL语言以其独特风格,独树一帜,成为国际标准化组织所确认的关系数据库系统标准语言。目前,SQL语言已成为关系数据库系统所使用的唯一数据存取语言,一般而言用该语言历书写的程序可以在任何关系数据库系统上运行。
SQL语言又称结构化查询语吉(structure query language)是1974年由boyce和ChamberIin提出的并在IBM公司San Jose研究实验室所研制的关系数据库管理系统system R上实现了这种语言,接着,IBM公司又实现了商用系统SQL/DS与DB2,其中SQL/DS是在IBM公司中型机环境下实现的,在DOS/VSE或VM/CMs操作系统下运行,而DB2则主要用于大型机环境,在MVS或MVS/XA支持下运行。
SQL语言在1986年被美国国家标准化组织ANSI批准为关系数据库语言的国家标准,1987年又被国际标准化组织ISO批准为国际标准,此标准也于1993年被我国批准为中国国家标准。
目前,国际上所有关系数据库管理系统均采用SQL语言,它包括DB2以及ORACLE,SYBASE,INGRE5,INFORMIX等关系数据库管理系统。
SQL概貌
SQL称为结构化查询语言,但是它的实际功能且包括查询在内的多种功能,它包括数据定义、数据操纵(包括查询)和数据控制等三个方面。SQL所操作的对象称为基表(base table),它即是关系。所谓SQL的数据定义功能即是对基表的定义功能。SQL的数据操纵功能即是在基表上的查询、删除、插入、修改等功能,SQL的数据控制功能即是基于基表上的完整性、安全性、并发控制等功能。
SQL语言有两种使用方式,一种是联机交互使用方式,在此种方式下,SQL可独立使用(称为自含式语言);另一种是嵌入式使用方式.它可以某些高级程序设计语言(如COBOL,C等)为主语言,而SQL则被嵌入其中依附于主语言(称为嵌入式语言)。不管采用何种使用方式,SQL语言的基本语法结构不变,仅在嵌入式中增加若干语句用以建立主语言与SQL间的联系。
SQL命令的种类
SQL命令的基本类型功能包括:创建数据库对象、操纵对象、往数据库表中填充数据、在数据表中更新己存在的数据、删除数据、执行数据库查询、控制数据库访问权限和数据库总体管理。
丰要分为以下儿类:
·DDL,数据定义语言。
·DML 数据操纵语言。
·DQL 限数据查询语言。
·DCL ,数据控制话首。
·数据管理命令。
·事务性控制命令。
定义数据库结构(DDL)
数据定义语言(DDL)是SQL的一部分,它允许数据库用户来创建或重新构建数据库对象
下面我们简单介绍SQL的功能:
(1)SQL的数据定义功能 SQL的数据定义主要有如下几种功能:
1基表的定义与取消;
2视图的定义与取消;
3索引、集簇的建立与删除
(2)SQL的数据操纵功能
种功能:
1数据查询功能;
2数据删除功能;
3数据插入功能‘
4数据修改功能;
5数据的简单计算及统计功能;
6数据的赋值功能。
(3)SQL的数据控制功能 SQL的数据控制主要有如下几种功能:
1数据的完整性约束功能;
2数据的安全性及存取权限功能;
3数据的触发功能;
4数据的并发控制功能及故障恢复功能
(4)与主语言的接口 SQL语言提供游标语句(共4条)以建立SQL与主语言间因数据不匹配所引起的接口。
SQL 数据定义功能
SQL数据定义功能包括基表定义、视图定义与索引定义三部分在SQL中关系称基表,而属性称为列,在SQL中允许出现的数据类型是:
CHAR(n) 长度为n的定长字符串;
VABCHAR(n) 最大长度为”的定长字符串;
INTEGER 全字长二进制整数;
SMALLINT 半字长二进制整数;
FLOAT 双字长浮点数;
DECIMAL 十进制数
为用户检索方便,每张基表均可对一些列设置一些索引。
SQL支持空值概念。所谓空值即是未知的值或无法给出的值。系统为用户提供方便,可由用户决定有关域是否允许出现空值。在SQL中有模式与子模式的概念,其中子模式以视图的形式
出现。
1.基表的定义、删除与修改
(1)基表的定义 可以通过创建表(CREATE TABLE)语句
其中定义一个基表的框架,其形式为:
CREATE TABLE <基表名>(<列定义>) [(列定义)]...[其他参数]其中列定义有如下形式:(列名)(数据类型)[NOT NULL]其中任选项:[其他参数]是与物理存储有关的参数,它随具体系统而有所不同。任选项[NOT NULL]表示指定列不允许出现有空值,它可由用户任选。通过基表定义可以建立一个关系模式,用CREATE TABLE 定义如下:
(2)基表的更改 可以通过更改表(ALTER TABLE)语句以扩充基表的列,从而构成一个新的基表框架,其形式为:
ALTERT ABLE(基表名) ADD<列名>(数据类型)
如我们可以在S中添加一个新的域SEX,并可用如下形式
表示:
ALTER TABLE S ADD SEX(SMALLINT)
所要注意的是在扩充列时不允许出现:NOT NULL。
(3)基表的删除 可以通过删除表(DROP TABLE)语句以删除一个基表,包括基表的模式连同该基表的数据、索引以及由该基表所导出的视图并释放相应存储空间。删除表的形式为:
DROP TABLE(基表名)
如我们删除关系S,可用如下的形式:
DROP TABLE S
2,索引的建立与删除
在SQL中可以对基表建立索引以提供多种快速存取路径
引的建立一般由DBA或建表人负责。
索引的建立,可以通过建立索引(CREATE TABLE)语句实现,该语句可以按指定基表、指定列以及按指定顺序(升序或降序)
建立索引。其形式如下;
CREATE [UNIQUE] INDEX(索引名) ON (基表名)
(<列名>[(顺序)][,<列名>[<顺序>].…])[其他参数]
语句中UNIQUE为任选项,在建立索引中若出现UNIQUE则表示不允许两个元组在给定索引中有相同的值。语句中顺序可按升序(ASC)或降序(DESC)给出,顺序可以缺省,缺省时为升序。语句中其他参数为任选项,它与物理存储有关,在此不予细述。
现举两例如下:
在SQL中可以用删除索引(DROP INDEX)语句以删除一个
已建立的索引,其形式如下:
DROP INDEX<索引名>
如下面的例子表示将已建立的索引名为XSNO的索引删除:
DROP INDEX XSNO
SQL数据操纵功能
SQL的数据操纵功能具有数据查询、删除、插入及修改等功能,此外,作为自含式语言还具有如下功能:
〔1)赋值功能 在数据操纵过程中所产生的一些中间结果以及需作永久保留的结果,必须以新的关系形式存贮于数据库内,因此对这些新关系须予以命名并赋值,经赋值后的关系今后在数据库中即可提供用户使用。
(2)计算功能 SQL作为自含式语言需要有一些计算功能,它们是:
1简单的四则运算。它包括在查询过程中可以出现有加、减、乘、除等简单计算。
2统计功能。由于数据库在统计中有极大的应用,因此SQL有常用的统计功能,它们为求和,求平均值,求总数,求最大值,求最小值等。
3分类功能。
(3)输入/出功能 SQL提供标准的数据录入与输出功能。
(4)查询功能 贝L语言的数据操纵功能是一种基于关系代数的操纵形式。我们知道,对查询的基本要求在关系代数中可以用下式表示:
这三种参数可以用SQL中的基本语句:映像(mapping)语句的三个子句分别表示,映像语句由SELECT,FROM及WHERE等三个子句组成,其中SELECT子句给出查询的目标属性,FROM于勾结出查询所涉及的关系,而wHERE子句则给出查询的逻辑条件,它们可以用下面形式表示:
SELECT <列名>[,<列名>]
FROM<基表名>[,<基表名>]
WHERE<逻辑条件>
这种映像语句在数据查询中表达力很强,不仅如此,为了表示简洁与方便,映像语句中的WHERE子句还具有更多的表示能力
①映像语句在wHERE子句中具有嵌套能力;
②WHERE子句中的逻辑条件不仅具有命题公式形式,还具有一所谓词公式形式以及集合表达式形式。此外,SQL还具有数据删除、插入、修改的能力
SQL的数据操作语句
SQL的数据操作功能包括SELECT、INSERT、DELETE和UPDATE四个语句检索和更新(包括增、删、改)两部分功能。
1.SQL查询语句
sQL语言的核心语句是数据库查询语句.其简单格式是:
SELECT目标列FROM基本表(或视图)
[wHERE条件表达式]
[GROUP BY 列名1 [HAVING 内部函数表达式]]
[ORDER BY列名24 {ASC|DESC}];
语句的功能是:根据wHERE子句中的条件表达式,从基本表(或视图)中找出满足条件的元组,按SELECT子句中的目标列,选出元组中的分量,形成结果表。如果有ORDER BY子句,则结果表要根据指定的 列名2 按升序或降序排序。GROUP BY于句将结果按 列名1分组。分组的附加条件用HAVING短语给出,只有满足内部函数表达式的组才会被输出。
SQL语言对数据库的操作十分灵活方便,原因在于SELECT语句中的成分丰富多
样,有许多可选形式,尤其是目标列和条件表达式,下面用例子来详细说明,例子涉及的是“学生—课程”数据库。
(1)简单查询:
[例4.1I 求数学系学生的学号、姓名。
SEI‘ECT S#,SNAME FROM S WHERE SD=‘MA’
[例4.2] 求选修了课程的学生的学号。
SELECT DISTINCT S# FROM SC
这里SELECT后面的DISTINCT表示要在结果中去掉重复的S#。
[例4.3I 求全体学生的详细信息。
SELECT * FROM S;
[例4.4] 查询经过计算的值。求学生学号和学生的出生年份。
SELECT S#,1989-AGE FROM S;
SELECT语句后面可以是字段名,也可以是字段名和常数组成的算术表达式,还可以是字符串常数。
如:SELECT S#,‘BinhdaY’,1998-AGE FROM S;
结果为: S#
S1 Birthday 1969(若AGE=29)
S2 Birthday 1968(若AGE=30)
[例4.5] 要求对结果进行排序(即使用ORDER BY)的查询
求选修C1课程的学生学号和得分,结果按分数降序排列。
SELECT S#,GRADE FROM SC WHERE C#=’C1’
ODER BY GRADE DERC;
(2)连接查询:若查询涉及两个以上的表,则称之为连接查询,连接查询功能是关系数据库最重要的查询功能之一。
[例4.6] 查找学生以及共选修课程的信息。
SELECT S.*,SC.* FROM S, SC wHERE S.S#=SC.S#
WHERE 后面的条件S.S#=SC.S#称为连接条件或连接谓词.连接谓词中的字段称为连接字段。连接字段的类型必须是可比的,但个必相同.当然大多数情况下是相同类型的。连接谓词中的比较符可以是=,>,<.>=,<=,乒。当比较符为‘=’时.就是等值连接的情况。如本例.若又在目标列中去掉一个相同的字段名,则为自然连接。
[例] 带有其他条件的连接查询。
求选修c1课程且成绩为B以上的学生及成绩。
SELECT S。S#,SNAME.SD,AGE, GRADE FFROM S,SC
WHERE S.S#=SC.S# AND SC.C#=’C1’
AND (SC.GRADE=’A’ OR SC.GRADE=’B’);
连接谓词可以和其他谓词组合起来,形成各种复合条件。
连接谓词可以是两个表的连接,也可以是两个以上表的连接(常称多表连接),也可以是一个表自身的连接。
(3 )嵌套查询; 嵌套查询亦称为子查询。嵌套查询是只一个SELECT –FROM –WHERE 查询块可以嵌入另一个查询块之中。在SQL中允许多层嵌套。
[例] 求选修了课程‘J’的学生的学号和姓名。
SELECT S# ,SNAME FROM S WHERE S# IN (SELECT S# FROM SC WHERE C# IN)(SELECT C# FROM C WHERE CNAME=‘J‘));
子查询在上一级查询处理之前求解,即嵌套查询是由里向外处理的,这样,外层查询可以利用内层查询的结果,在[例14。8]中若最内层查询结果为C4,原查询可等价于:
SELECT S#,SNAME FROM SC WHERE C# ‘C4’);
若这个内层查询结果为S2,S3,S6,则原查询便为
SELECT S# ,SNAME FROM S WHERE S# IN (‘S2’‘S3’‘S6’);
从本例看到,在查询涉及多个关系时,用嵌套查询逐次求解,层次分明,容易理解也容易书写。具有结构化程序设计的优点。在嵌套查询中.最常用的是谓词IN。若用户能确切知道内层查询返回的是单值,则可以用比较算符。
视图的查询:视图定义后,用户可以如对基本表那样对视图进行查询。 如:SELECT S#,SA FROM CS-S WHERE SA<20;系统执行此查询时、首先把它转换成等价的对基本表的查询,然后执行此查询,即当查询视图表时,系统首先从数据字典中取出该视图的定义,然后把定义中的查询语句和对该视图查询语句结合起来,形成一个修正的查询语句。对上例,修正后的查询语句为:
SELECT S# ,SA FROM S WHERE SD=‘CS’ AND SA <20;
由于视图的查询实质上是对基本表的查询,因此基本表的变化可以反映到视图上,视图就如同‘窗口’一样,通过视图可以看到基本表的动态变化。
SQL插入语句
插入语句的一般格式为:
INSERTINT() 表名[ (字段名[,字段名]...)]
VALUES (常量[,常量]...);
INSERT () 表名[(字段名[,字段名]...)]
子查询;
第一种格式把一个新记录插入指定的表中,第二种格式把子查询的结果插人表中,若表中有些字段在插人语句中没有出现,则这些字段上的值取空值NULL。当然在表定义中说明了NOT NULL的字段在插入时不能取NULL。若插入语句中没有指出字段名,则新记录必须在每个字段上均有值。
[例] 单记录插人。
把一个新学生记录插入表中.其有关信息为:S10,姓名zhang Ming,信息系IS ,18岁
INSERT INTO S VALUES(’S10’,’ZhangMing’,’IS’,18);
[例] 插入一个选课记录(’S15’,’C10’,’A’);
INSERT INTO SC(S#,C#,G) VALUE5(’S15J.‘C10“,“A’);
插人和删除与更新操作一样,都会引起破坏数据完整性的问题,如本例中S15在S表中不存在,C10在C表中也不存在,这就破坏了参照完整性。支持关系模型的系统应自动地检查数据的完整性,对破坏充整性的插入操作拒绝执行。所以,这个新行就不能插入。
[例] 多记录插入。
下面语句是求一个系中学生的平均年龄,并把结果存入数据库中。
CREATE TABLE DEPTAGE(SDEPT CHAR(15),AVGAGE SMALLINT);
INSERT INTO DEPAGE(SDEPT,AVGAGE)
SELECT SD,AVG(AGE) FROM S GROUP BY SD
SQL的删除语句
删除语句的 般格式为:
DELETE FROM 表名 [WHERE 谓词];
删除语句从指定表中删除满足谓词的那些记录.没有WHERE Z子句时表示删去全部
记录,但表的定义仍在数据字典中。
[例] 单个记录.例如,要把学生S9删除,可以使用下面删除语句:
DELETE FROM S WHERE S#=‘59‘;
执行删除操作也可能破坏数据的完整性.如本例。
[例] 多个记录删除。例如,要删除所有的学生选课记录,可以使用下面删除语句:
DELETE FROM SC;
执行此操作后,SC成为一个空表.
[例] 带有子查询的删除。删除计算机科学系全体学生的选课记录
DELETE FROM SC WHERE ’CS’=
(SELECT SD FROM S WHERE S.S#=SC.S#);
SQL的更新语句
(1)更新语句的一般格式为;
UPDATE 表名 SET 字段-表达式[字段=表达式]...
[WHERE 谓词]
更新语句修改指定表中满足谓词的元组,把这些元组按SET子句中的表达式修改相应字段上的值。
[例] 单记录修改,如把学生S1的姓名改为’WANG PING’,可以使用以下语句:
UPDATE SET SNAME=’WANG PING’ WHERE S#=’S1’
[例] 多记录修改,如把所有学生的年龄加2,可以使用以下语句:
UPDATE S SET SA=SA+2;
[例] 具有子查询的更新,如把数学系全体学生的成绩置零,可以使用以下语句
UPDATE SC SET G=’0’ WHERE ’MA’=(SELECT SD FROM S WHERE S.S#=SC.S#);
[例]多个表的更新
在UPDATE语句中,一次只能对一个表更新.这就会产生破坏参照完整性的问题
例如,把S2的学号改为S9。
UPDATE S SET S#=’S9’ WHERE S#=’S2’;
UPDATE SC SET S#=’S9’ WHERE S#=’S2’
在执行了第一个更新语句之后,数据库已处于不一致的状态,因为在SC表中某些记录(即S#=’S2’的那些SC记录)的S#值在S表中不存在,这就违反了关系模型的参照完整性,只有执行了第二个更新语句之后,数据库才重新处于一致状态.因此,必须保证这两个更新语句要么都执行要么都不执行,这就涉及到事务的问题了.
视图的执行: 对视图修改最终要转换成对基本表的修改(修改指INSERT,UPDATE和DELETE三类操作),如
UPDATE CS-S SET SN=’WANG PING’ WHERE S#=’S1’;
将转换成对基本表S的更新;
UPDATE S SET SN=’WANG PING’ WHERE S#=’CS’ AND S#=’S1’;
INSERT INTO CS-S VALUE(‘S12’,YAN XI’,19);
而将转换成对基本表的插入:
INSERT INTO S VALUE (‘S12’,YAN XI’,’CS’,19);
在关系数据库中,而非所有的视图都是可修改的,也就是说,有些视图的修改不能唯一的有意义的转换成对基本表的修改,例如:
UPDATE S-G SET GAVG=90 WHERE S3=’S1’;
由于S-G中的一个元组是由SC中若干行经过分组求平均得到的,因此对视图S-G的更新就无法转换成对SC的更新,所以视图S-G是不可更新的.
SQL的数据控制语句
SQL数据控制功能是指控制用户对数据的存取权力。某个用户对某类数据具有何种操作权是由DBA决定的,这是管理问题而不是技术问题。数据库管理系统的功能是保证这些决定的执行,为此它必须能:把授权的决定告知系统,这是由SQL语句GRANT和REVOKE来完成的;把授权的结果存人数据字典;当用户提出操作请求时,根据授权情况进行检查,以决定是执行操作请求还是拒绝之。
授权语句格式
GRANT 权限表 ON 表名 TO 用户名表 [WITH GRANT OPTION]
该语句把对指定表的某些权限授予指定的若干用户。当有WITH GRANT OPTOIN 短语时,被授权的用户还可将获得的权限再授予其他用户,GRANT语句可以指定的操作权限有:SELECT(检索)、INSERT(插入)、DELETE
(删除)、UPDATE(更新)、EXPAND(扩充)、INDEX(建立索引)、ALL PRIVILEGES(所有上述权限).DBA(用户被指定为DBA)等。回收权限语句格式
REVOKE权限表ON 表名FROM 用户名表
把已授给指定用户的在指定表上的权限收回。把对表C的查询权力授予所有用户。
GRANT SELECT ON TABLE C TO PUBLIC;
把在数据库S-C中建立表的权力授予用户杜明。
GRANT CREATETAB ON DATEBASE S-C TO DUMING;
把对表S的查询权力授予用户U2,并给U2有再授权权力。
GRANT SELECT ON TABLE S TO U2 WITH GRANT OPTION ;
把用户王平更新学生学号的权力收回。
REVOKE UPDATE(S#)ON TABLE S FROM WANGPING;
把用户U2查询S表的权力收回。
REVOKE SELECT ON TABLE S FROM U2;
SQL的数据嵌入式使用
SQL语言具有双重使用方式,既可在交互方式下使用.也可将SQL语句嵌入某种高级语言(例如:C,FORTRAN,COBOL,PL/1等)中使用。后一种使用SQL的方式称为嵌入使用方式。这两种方式在细节上会有许多差别.特别是SELECT 语句.在程序设计的环境下要作必要的扩充。把SQL嵌入主语言使用时,必须解决三个问题:
1. 区分SQL语句与主语言语句。这是对通道在所有的SQL语句前加前级EXECSQL来解决的(图A①)。SQL语言的结束标志随主语言不同而不同。
2.数据库工作单元和程序上作单元之间的通信。SQL语句可以使用主语言的程序变量(简称主变量),这些变量名前加冒号(:)作标志,以区别于字段名(图A⑤),程序中使用的任何表(基本表或视图)都要用EXEC SQL DECLARE语句加以说明(图A②),一则使程序更加易懂,二则使预编译程序能作某些语法检查。SQL语句执行后,系统要反馈给应用程序若干信息,这些信息送到SQL的通信区SQLCA。SQLCA用语句EXEC SQLINCLUDE加以定义(图A③)。在SQLCA中有一个状态指示字段SQLCODE。当SQLCODE为零时,表示SQL语句执行成功、否则返回一个错误代码(负值)或警告信息(正值),程序员应该在每个SQL语句之后测试SQLCODE的值,以便了解语句执行结果、并采取相应措施。
带有嵌人式SQL的一小段PL/1l程序 3.一个SQL语句原则上可产生或处理一组记录,而主语言—次只能处理一个记录. 为此必须协调两种处理力式。这是用游标(Cursor)来解决的。 与游标有关的SQL语句有四个:
(1)游标定义语句。游标是与某一查询结果集相联系的符号名,游标用SQL的DECLARE语句定义,它是说明语句、其中的SELECT语句并不执行。
(2)游标打开语句(OPEN)。此时执行游标定义中的SELEC丁语句,游标处于活动状态,指向查询结果集中的第一行之前。
(3)游标推进语句(FETCH)。执行它使游标向前推进‘行,并把游标指向的行(称为当前行)中的值取出,放到语句中说明的对应的程序变量中。FETCH语句常常被用在主语言程序的循环中,并借助主语言的处理语句逐一处理查询结果集中的一行。
(4)游标关闭语句(CLOSE)。关闭游标,使它不再和原来的查询结果相联系。关闭了的游标可以再次打开,与新的查询结果相联系。
在游标处于活动状态时,可以修改和删除游标指向的行。
[例] 在表S和SC中检索某学生(姓名由主语言变量GIVENSNAME给出)的学习成绩信息(S#,SNAME,C#,GRADE)。其程序是:
EXEC SQL DECLARE SCX CURSOR FOR
SELECT S.S# ,SNAME,C#,GRADE FROM S,SC
WHERE S.S#=SC.S# AND SNAME=:GIVENSNAME;
(定义了名为SCX的一个游标)
EXEC SQL OPEN SCX
(打开游标SCX)
EXEC SQL SCX INTO :S#,:SNAME ,:C#,:GRADE;
(游标推进1,把值送到于语言的变量中去);
…(主语言的处理语句)
END;
(利用主语言WHILE语句.构成循环结构)
EXEC SQL CLOSE SCX
(关闭游标);