第8章结构化查询语言SQL

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第8章结构化查询语言SQL
8.1 SQL概述
结构化查询语言SQL(Structured Query Language)是一种介于关系代数与关系演算之间的语言,其功能包括查询、操纵、定义和控制四个方面,是一个通用的功能极强的关系数据库标准语言。

目前,SQL语言已被确定为关系数据库系统的国际标准,被绝大多数商品化关系数据库系统采用。

在SQL语言中,指定要做什么而不是怎么做,不需要告诉SQL如何访问数据库,只要告诉SQL需要数据库做什么。

可以在设计或运行时对数据控件使用SQL 语句。

8.1.1 SQL的发展历程
SQL语言是1974年提出的,由于它功能丰富、使用方式灵活、语言简洁易学等突出优点,在计算机工业界和计算机用户中倍受欢迎。

1986年10月,美国国家标准局(ANSI)的数据库委员会批准了SQL作为关系数据库语言的美国标准。

1987年6月国际标准化组织(ISO)将其采纳为国际标准。

这个标准也称为“SQL86”。

随着SQL标准化工作的不断进行,相继出现了“SQL89”、“SQL2”(1992)和“SQL3”(1993)。

SQL成为国际标准后,对数据库以外的领域也产生很大影响,不少软件产品将SQL语言的数据查询功能与图形功能、软件工程工具、软件开发工具、人工智能程序结合起来。

我们在这里介绍基于SQL89和SQL2的语言使用概貌。

8.1.2 SQL数据库的体系结构
SQL数据库的体系结构基本上也是三级模式结构如图8.1所示。

SQL术语与传统的关系模型术语不同。

在SQL中,外模式对应于视图,模式对应于基本表,元组称为“行”,属性称为“列”。

内模式对应于存储文件。

SQL数据库的体系结构具有如下特征:
1.一个SQL模式(Schema)是表和约束的集合。

2.一个表(Table)是行(Row)的集合。

每行是列(Column)的序列,每列对应一个数据项。

3.—个表可以是一个基本表,也可以是一个视图,基本表是实际存储在数据库中的表。

视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图的数据,这些数据仍存放在导出视图的基本表中。

因此视图是一个虚表。

4.一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表,
一个表可以带若干索引,索引也存放在存储文件中。

每个存储文件与外部存储器上一个物理文件对应。

存储文件的逻辑结构组成了关系数据库的内模式。

View
Base Table
Stored File
图8.1 SQL数据库的体系结构
5.用户可以用SQL语句对视图和基本表进行查询等操作。

在用户看来,视图和基本表是一样的,都是关系(即表格)。

6.SQL用户可以是应用程序,也可以是终端用户。

SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN、COBOL、PASCAL、PL/I、C和Ada等语言;SQL语言也能作为独立的用户接口,供交互环境下的终端用户使用。

8.1.3 SQL的组成
SQL主要分成四个部分:
1.数据定义:这一部分也称为“SQL DDL”,用于定义SQL模式、基本表、视图和索引。

2.数据操纵:这一部分也称为“SQL DML”。

数据操纵分成数据查询和数据更新两类。

其中数据更新又分成插入、删除和修改三种操作。

3.数据控制:这一部分也称为“SQL DCL”。

数据控制包括对基本表和视图的授权,完整性规则的描述,事务控制语句等。

4.嵌入式SQL使用:这一部分内容涉及到SQL语句嵌入在宿主语言程序中的使用规则。

8.2 SQL的数据定义(DDL)
SQL的数据定义部分包括对SQL模式(Schema)、基本表(关系,Table)、视图(View)、索
引(Index)的创建和撤消操作。

172
8.2.1 SQL模式的创建和撤消
1.SQL模式的创建
在SQL2中,一个SQL模式(即数据库模式)被定义为基本表的集合。

一个SQL模式由模式名和模式拥有者的用户名或帐号来确定,并包含模式中每一个元素(基本表、视图、索引等)的定义。

创建了一个SQL模式,就是定义了一个存储空间,其语法如下:CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
例如,下面语句定义了教学数据库的SQL模式:
CREATE SCHEMA ST_COURSE AUTHORIZATION 李斌
该模式名为ST_COURSE,拥有者为李斌。

由于“SQL模式”这个名称学术味太重,因此大多数DBMS中不愿采用这个名词,而是采用“数据库”(DATABASE)这个名词。

也就是大多数系统中创建SQL模式不是用“CREATE SCHE MA…”字样,而是用“CREATE DA TABASE…”字样。

2.SQL模式的撤消
当一个SQL模式及其所属的基本表、视图等元素都不需要时。

可以用DROP语句撤消这个SQL模式。

DROP语句的语法如下:
DROP SCHEMA <模式名> [CASCADE|RESTRICT]
撤消方式有两种:CASCADE(连锁式)方式,执行DROP语句时,把SQL模式及其下属的基本表、视图、索引等所有元素全部撤消;RESTRICT(约束式)方式,执行DRPO语句时,只有当SQL模式中没有任何下属元素时,才能撤消SQL模式,否则拒绝执行DROP语句。

例如,要撤消SQL模式ST_COURSE及其下属所有的元素,可用下列语句实现:
DROP SCHEMA ST_COURSE CASCADE
8.2.2 SQL提供的基本数据类型
1.数值型
INTEGER 长整数(也可写成INT)
SMALLINT 短整数
REAL 取决于机器精度的浮点数
DOUBLE PRECISION 取决于机器精度的双精度浮点数
FLOAT(n)浮点数,精度至少为n位数字
NUMERIC(p,d)定点数,由p位数字(不包括符号、小数点)组成,小数点后面
有d位数字(也可写成DECIMAL(P,d)或DEC(P,d)) 2.字符串型
CHAR(n)长度为n的定长字符串
V ARCHAR(n) 具有最大长度为n的变长字符串
3.位串型
BIT(n) 长度为n的二进制位串
173
BIT VARYING(n) 最大长度为n的变长二进制位串
4.时间型
DA TE 日期,包含年、月、日,形式为YYYY-MM-DD
TIME 时间,包含一日的时、分、秒,形式为HH:MM:SS
8.2.3 基本表的创建、修改和撤消
如果在系统中创建了一个SQL模式,那么就可以在该模式中创建基本表。

对基本表结构的操作有创建、修改和撤消三种操作。

1.基本表的创建
句法:CREATE TABLE SQL模式名.基本表名(列名类型,… 完整性约束…)
创建基本表,就是定义基本表的结构,需指出它放在哪个模式中,后面为简单起见,模式名省略不写。

每个属性的类型可以是基本类型,也可以是用户事先定义的类型。

完整性规则主要有三种子句:
主键子句(PRIMARY KEY)、检查子句(CHECK)和外键子句(FOREIGN KEY)。

例8.l
供应商关系S,可用下列语句创建:
CREATE TABLE S (SNO CHAR(4) NOT NULL,
SNAME CHAR(20) NOT NULL,
STA TUS CHAR(10),
ADDR CHAR(20),
PRIMARY KEY (SNO));
这里定义的关系S有四个属性,分别是供应商号(SNO)、供应商名(SNAME)、状态(STA TUS)和地址(ADDR),属性的类型都是字符型,长度分别是4、20、10和20个字符。

主键是供应商编号SNO。

在SQL中允许属性值为空值,当规定某一属性值不能为空值时,就要在定义该属性时写上保留字“NOT NUIL”。

本例中,规定供应商号和供应商名不能取空值。

由于已规定供应商号为主码,所以对属性SNO的定义中的“NOT NULL”可以省略不写。

对于基本表P,J,SPJ可以用下列语句创建:
CREATE TABLE P (PNO CHAR(4)NOT NULL,
PNAME CHAR(20) NOT NULL,
COLOR CHAR(8),
WEIGHT SMALLINT,
PRIMARY KEY(PNO));
174
CREATE TABLE J (JNO CHAR(4) NOT NULL,
JNAME CHAR(20),
CITY CHAR(20),
BALANCE NUMERIC(7,2),
PRIMARY KEY(JNO));
CREATE TABLE SPJ (SNO CHAR(4) NOT NULL,
PNO CHAR(4) NOT NULL,
JNO CHAR(4) NOT NULL,
PRICE NUMERIC(7,2),
QTY SMALLINT,
PRIMARY KEY (SN0,PNO,JNO),
FOREIGN KEY (SNO) REFERENCES S(SNO),
FOREIGN KEY (PNO) REFERENCES P(PNO),
FOREIGN KEY (JNO) REFERENCES J(JNO),
CHECK(QTY BETWEEN 0 AND 10000));
上述各属性的含义是:零件号(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)、单价(PRICE)、工程项目号(JNO)、工程项目名称(JNAME)、城市(CITY)、余额(BALANCE)、供应数量(QTY)。

基本表SPJ的定义中说明了有五个属性,主键是(SNO,PNO,JNO)。

还定义了三个外键,并指出外键SNO和基本表S中SNO属性相对应,外键PNO和基本表P中PNO属性相对应,外键JNO和基本表J中JNO属性相对应,此处对应的属性名恰好同名,实际上也可以不同名,只要指出其对应性即可。

外键体现了关系数据库的参照完整性。

定义中还使用了一个检查子句,指出供应数量QTY在0—10000之间。

2.基本表结构的修改
基本表建立后,可根据需要对基本表结构进行修改,即增加新的属性或删除原有的属性。

(1)增加新的属性
句法:ALTER TABLE 基本表名ADD 新属性名新属性类型
例8.2 在基本表S中增加一个电话号码(TELE)属性,可用下列语句:
ALTER TABLE S ADD TELE CHAR(12);
应注意,新增加的属性不能定义为“NOT NULL”。

基本表在增加一个属性后,原有元组在新增加的属性列上的值都被定义为空值(NULL)。

(2)删除原有的属性
句法:ALTER TABLE 基本表名DROP 属性名[CASCADE|RESTRICT]
此处CASCADE方式表示:在基本表中删除某属性时,所有引用到该属性的视图和约束也要一起自动地被删除。

而RESTRICT方式表示在没有视图或约束引用该属性时,才能在基本表中删除该属性,否则拒绝删除操作。

例8.3 在基本表S中删除状态(STA TUS)属性,并且将引用该属性的所有视图和约束也一起删除,可用下列语句:
175
ALTER TABLE S DROP STA TUS CASCADE;
3.基本表的撤消
可用“DROP TABLE”语句撤消基本表,其所有数据也丢失了。

DROP语句的句法如下:DROP TABLE基本表名(CASCADE|RESTRICT)
此处的CASCADE和RESTRICT的语义同前面句法中的语义一样。

例8.4 需要撤消基本表S。

但只有在没有视图或约束引用基本表S中的列时才能撤消,否则拒绝撤消。

可用下列语句实现:
DROP TABLE S RESTRICT;
8.2.4 视图的创建和撤消
在SQL中,外模式一级数据结构的基本单位是视图(VIEW),视图是从若干基本表和(或)其他视图构造出来的表。

这种构造方式采用后面8.3节介绍的SELECT语句实现。

在我们创建一个视图时,系统把视图的定义存放在数据字典中,而并不存储视图对应的数据,在用户使用视图时才去找对应的数据。

因此,视图被称为“虚表”。

1.视图的创建
句法:CREATE VIEW 视图名(列名表) AS SELECT 查询语句
例8.5 对工程项目零件供应数据库中基本表S,P,J,SPJ,用户经常要用到有关项目使用零件情况信息:工程号(JNO)、工程项目名称(JNAME)、供应商号(SNO)、供应商名(SNAME)、零件号(PNO)、零件名(PNAME)、供应数量(QTY)等列的数据,那么可用下列语句建立视图:CREAT VIEW JSP_NAME(JNO,JNAME,SNO,SNAME,PNO,PNAME,QTY) AS SELECT (J.JNO,JNAME,S.SNO,SNAME,P.PNO,PNAME,QTY)
FROM S,P,J
WHERE S.SNO=SPJ.SNO AND P.PNO=SPJ.PNO AND J.JNO=SPJ.JNO;
此处,视图中列名顺序与SELECT子句中的列名顺序一致,视图名JSP_NAME后的列名可省。

2.视图的撤消
句法:DROP VIEW 视图名
例8.6 撤消JSP_NAME视图,可用下列语句实现:
DROP VIEW JSP_NAME;
8.2.5 索引的创建和撤消
在SQL86和SQL89标准中,基本表没有关键码概念,用索引机制弥补,而且至今仍有许多关系DBMS使用索引创建和撤消语句,因此在此加以介绍。

索引属于物理存储的路径概念,而不是逻辑的概念。

在定义基本表时,还要定义索引,就把数据库的物理结构和逻辑结构混合在一起了,因此,在SQL2中,直接使用主键概念,在创建基本表时用主键子句定义主键。

176
1.索引的创建
句法:CREATE [UNIQUE] INDEX 索引名ON 基本表名(<列名>,[<次序>],[,<列名> [<次序>]]…)
其中,基本表名指定要建索引的基本表的名字。

索引可以建在该表的一列或多列上,各列名之间用逗号分隔。

每个<列名>后面还可以用<次序>指定索引值的排列次序,包括ASC(升序)和DESC(降序)两种,默认值为ASC。

UNIQUE表示此索引的每—个索引值只对应唯一的数据记录。

例8.7 如果工程项目表已经创建,参见例8.1,此时可对基本表J建立一个索引:
CREATE INDEX JNO_INDEX ON J(JNO);
此语句表示对基本表J的列JNO建立索引,索引键的名为JNO_INDEX。

如果要求列JNO 的值在基本表J中不重复,那么在INDEX前加上保留字UNIQUE:
CREATE UNIQUE INDEX JNO_INDEX ON J(JNO);
SQL中的索引是非显式索引,也就是在索引创建以后,用户在索引撤消前不会再用到该索引键的名,但是索引在用户查询时会自动起作用。

一个索引键也可以对应多个列。

索引排列时可以升序,也可以降序,升序排列用ASC 表示,降序排列用DESC表示,默认时表示升序排列。

例如,可以对基本表SPJ中的(SNO,PNO,JNO)建立索引:
CREATE UNIQUE INDEX SPJ_INDEX ON SPJ(SNO ASC,PNO ASC,JNO DESC);
2.索引的撤消
句法:DROP INDEX <索引名>
例8.8 撤消索引JNO_INDEX和SPJ_INDEX,用如下语句:
DROP INDEX JNO_INDEX,SPJ_INDEX;
8.3 SQL的数据操纵(DML)
数据操纵分成数据查询和数据更新两类。

8.3.1 SQL的数据查询
SQL中最经常使用的是从数据库中获取数据。

从数据库中获取数据称为查询数据库,查询数据库通过使用SELECT语句。

1.SELECT语句格式
常见的SELECT语句包含6部分,其语法形式为:
SELECT 字段表FROM 表名WHERE 查询条件GROUP BY 分组字段HA VING 分组条件ORDER BY字段[ASC|DESC]
其中:字段表部分包含了查询结果要显示的字段清单,字段之间用逗号分开。

要选择表中所
177
有字段,可用星号“ ”代替。

如果所选定的字段要更名,可在该字段后用AS[新名]实现。

FROM子句用于指定—个或多个表。

如果所选的字段来自不同的表,则字段名前应加表名前缀。

WHERE子句用于限制记录的选择。

构造查询条件可使用大多数的Visual Basic内部函数和运算符,以及SQL特有的运算符构成表达式。

GROUP BY和HA VING子句用于分组和分组过滤处理。

它能把在指定字段列表中有相同值的记录合并成一条记录。

如果在SELECT语句中含有SQL合计函数,例如SUM或COUNT,那么就为每条记录创建摘要值。

在GROUP BY字段中的NULL值会被分组,并不省略。

但是,在任何SQL合计函数中都计算NULL值。

可用WHERE子句来排除不想分组的行,将记录分组后,也可用HA VING子句来筛选它们。

一旦GROUP BY完成了记录分组,HA VING就显示由GROUP BY子句分组的、且满足HA VING子句条件的所有记录。

HA VING子句与已确定要选中哪些记录的WHERE子句类似。

ORDER BY子句决定了查找出来的记录的排列顺序。

在ORDER BY子句中,可以指定一个或多个字段作为排序键,ASC选项代表升序,DESC代表降序。

在SELECT语句中,SELECT和FROM子句是必须的。

可在SELECT子句内使用合计函数对记录进行操作,它返回一组记录的单—值。

例如,A VG函数可以返回记录集的特定字段中所有值的平均数。

2.单表查询
SQL语句的所有查询都是利用SELECT语句完成的。

下面通过例子说明它的使用方法。

例8.9 假设项目零件供应数据库中有四个基本表(关系):
如果上述关系的当前值如下:
供应商关系:S
SNO SNAME STA TUS ADDR
S1 原料公司10 西安友谊路23号
S2 红星钢管厂30 上海浦东100号
S3 零件制造公司20 西安东郊55号
S4 配件公司50 江西胜利路58号
S5 原料厂40 北京三环路89号
S6 东方配件厂60 天津叶西路100号
零件关系:P
PNO PNAME COLOR WEIGHT
P1 钢筋黑25
178
P2 钢管白26
P3 螺母红11
P4 螺丝黄12
P5 齿轮红18
工程项目关系:J
JNO JNAME CITY BALANCE
J1 东方明珠上海0.00
J2 炼油厂长春-11.20
J3 地铁三号北京678.00
J4 明珠线上海345.00
J5 炼钢工地天津123.00
J6 南浦大桥上海234.50
J7 红星水泥厂江西345.60
供应情况关系:SPJ
SNO PNO JNO PRICE QTY
S1 P1 J1 22.60 80
S1 P1 J4 22.60 60
S1 P3 J1 22.80 100
S1 P3 J4 22.80 60
S3 P3 J5 22.10 100
S3 P4 J1 11.90 30
S3 P4 J4 11.90 60
S4 P2 J4 33.80 60
S5 P5 J1 22.80 20
S5 P5 J4 22.80 60
S6 P3 J1 13.00 20
S1 P3 J6 22.80 6
S3 P4 J6 11.90 6
S4 P2 J6 33.80 8
S5 P5 J6 22.80 8
试用SQL语句表达下列查询语句。

①检索供应工程J1零件的供应商编号SNO。

SELECT DISTINCT SNO FROM SPJ WHERE JNO=’J1’;
SELECT子句后面的DISTINCT表示要在结果中去掉重复的供应商编号SNO。

②检索供应工程J1零件P1的供应商编号SNO。

SELEC T SNO FROM SPJ WHERE JNO=’J1’ AND PNO=’P1’;
179
③查询全体工程项目的详细信息
SELECT * FROM J;
如果要查询FROM子句后面指定的基本表的全体属性时,可以用“*”表示。

所以上面的语句等价于:
SELECT JNO,JNAME,CITY,BALANCE FROM J;
④查询没有正余额的工程编号、名称及城市,结果按工程编号升序排列。

SELECT JNO,JNAME,CITY FROM J WHERE BALANCE IS NULL OR BALANCE<=0 ORDER BY JNO;
在这个例子中用到了谓词“IS NULL”,当BALANCE值为空时,BALANCE IS NULL的值为真(TRUE),否则为假(FALSE)。

与“IS NULL”相对的谓词是“IS NOT NULL”,当BALANCE值为非空值时,BALANCE IS NOT NULL的值为真(TRUE),否则为假(FALSE)。

⑤求使用零件数量在100与1000之间的工程项目编号,零件号和数量。

SELECT JNO,PNO,QTY FROM SPJ WHERE QTY BETWEEN 100 AND 1000;
⑥查询上海的供应商名称,假设供应商关系的ADDR列的值都以城市名开头。

SELECT SNAME FROM S WHERE ADDR LIKE ’上海%’
在这个例子的条件表达式中,用到了字符串匹配操作符LIKE。

LIKE谓词的一般形式是:列名LIKE 字符串常数
这里,列名的类型必须是字符串或可变字符串。

在字符串常数中字符的含义如下:
%(百分号):表示可以与任意长度(可以为零)的字符串匹配。

_(下划线):表示可以与任意单个字符匹配。

所有其他的字符只代表自己。

3.多表查询
实现来自多个关系的查询时,如果要引用不同关系中的同名属性,则在属性名前加关系名,即用“关系名.属性名”的形式表示,以便区分。

在多个关系上的查询可以用联接查询表示也可以用嵌套查询来表示。

例8.10 试用SQL语句表达下列每个查询语句。

①求使用了P3零件的工程项目名称。

SELECT DISTINCT JNAME FROM J,SPJ WHERE SPJ.JNO=J.JNO AND PNO=’P3’;
这个SELECT语句执行时,要对关系SPJ和J做联接操作。

执行联接操作的表示方法是FROM子句后面写上执行联接操作的表名SPJ和J,再在WHERE子句中写上联接的条件SPJ. JNO=J.JNO。

②求供应工程J1零件为红色的供应商号SNO。

SELECT DISTINCT SNO FROM SPJ,P WHERE SPJ.PNO=P.PNO AND JNO=’J1’ AND COLOR=’红’;
③求至少使用了零件编号为P3和P5的工程编号JNO。

SELECT DISTINCT X.JNO FROM SPJ AS X,SPJ AS Y WHERE X.JNO=Y.JNO AND X.PNO=’P3’ AND Y.PNO=’P5’;
同一个关系SPJ在一层中出现两次,为区别,引入两个元组变量(即别名)X和Y。

在语180
句中应用元组变量对列名进行限定。

保留字AS 在语句中可省略。

4.合计函数
SQL 提供了下列合计函数
表8.1合计函数
例8.11对关系J,P,SPJ进行查询。

①求供应P3零件的供应商个数。

SELECT COUNT(DISTINCT(SNO)) AS COUNT_P3 FROM SPJ WHERE PNO=’P3’;
这个查询结果只有一行和一列,就是供应“P3”零件的供应商个数。

谓词DISTINCT用在列名前表示消除该列中重复的值。

COUNT_P3为输出的列名。

②求项目余额的最大值,最小值,总值和平均值,输出的列名分别为:MAX_NUMBER,MIN_NUMBER,SUM_NUMBER,A VG_NUMBER。

SELECT MAX(BALANCE) AS MAX_NUMBER,MIN(BLANCE) AS MIN_NUMBER,SUM(BALANCE) AS SUM_NUMBER,A VG(BALANCE) AS A VG_NUMBER FROM J;
在实际使用时,AS字样可省略。

5.数据分组
以上例子完成的是对关系中所有查询的元组进行合计运算,但在实际应用中,经常需要将查询结果进行分组,然后再对每个分组进行统计,SQL语言提供了GROUP BY 子句和HA VING子句来实现分组统计。

例8.12对关系J,P,SPJ进行查询。

①统计每个供应商供应不同零件的种数和供应总数量。

SELECT SNO,COUNT(DISTINCT PNO) AS COUNT_QTY,SUM(QTY) AS SUM_ QTY FROM SPJ;
②统计上海地区的项目使用零件的种数(超过3种)和零件总数量。

要求查询结果按零件的种数升序排列,种数相同时按总数量降序排列。

SELECT SPJ.JNO,COUNT(DISTINCT(SPJ.PNO)) AS COUNT_PNO,SUM(QTY) AS SUM_QTY FROM J,SPJ WHERE J.CITY=’上海’ AND J.JNO=SPJ.JNO GROUP BY SPJ.JNO HA VING COUNT(DISTINCT(PNO))>3 ORDER BY 2,3 DESC;
在这个例子中,首先,根据WHERE子句的条件,对关系J和SPJ执行联接操作找出满足条件为“上海”的工程的元组;再按工程号JNO的值对上海的工程进行分组,将JNO列的
181
值相同的元组分为一组;对每一个分组进行合计操作;并按HA VING子句的条件对产生的元组进行选择,消除只使用三种以下零件的元组;最后,再对结果进行排序。

8.3.2 SQL的数据更新
SQL的数据更新包括数据插入、数据修改和数据删除等操作。

1.数据插入
SQL的数据插入语句INSERT有两种形式。

(1)插入单个元组
句法:INSERT INTO 基本表名(列名表) V ALUES (元组值)
V ALUES后的元组值中列的顺序必须同基本表的列名表一一对应。

如基本表后不跟列名表,表示在V ALUES后的元组值中提供插入元组的每个分量的值,分量的顺序和关系模式中列名的顺序一致。

如基本表后有列名表,则表示在V ALUES后的元组值中只提供插入元组对应于列名中的分量的值,元组的输入顺序和列名表的顺序一致。

基本表后如有列名表,必须包括关系的所有非空的属性,也自然应包括关键码属性。

例8.13 往基本表J中插入一个元组(’J8’,’地铁二号线’,’上海’)
INSERT INTO J(JNO,JNAME,CITY) V ALUES(’J8’,’地铁二号线’,’上海’);
例8.14 假设供应商关系S的STA TUS,ADDR属性允许空,插入一个新的供应商编号’S10’,供应商名‘光明零件厂’。

INSERT INTO S(SNO,SNAME)V ALUES(’S10’,’光明零件厂’);
(2)插入多个元组
句法:INSERT INTO 基本表名(列名表)V ALUES(元组值),(元组值),…
例8.15 往SPJ中连续插入三个元组
INSERT INTO SPJ V A LUES((’S3’,’P2’,’J8’,23.3,1500),(’S2’,’Pl’,’J8’,33.4,50),(’S3’,’P5’,’J8’,34.5,80));
2.数据删除
句法:DELETE FROM <表名> WHERE <条件表达式>
例8.16 删除工程号为J4的所有零件供应记录。

DELETE FROM SPJ WHERE JNO=’J4’;
注意,DELETE语句只能从一个关系中删除元组,而不能一次从多个关系中删除元组。

要删除多个元组,就要写多个DELETE语句。

3.数据修改
当需要修改指定关系中元组的某些值时,用如下语句:
UPDATE 基本表名SET 列名=值表达式[,列名=值表达式…] [WHERE 条件表达式] 该语句的意义是:修改指定表中满足条件表达式的元组中的指定属性值,其中SET子句用于指定修改方法,即用(表达式)的值取代相应的属性列值。

如果省略WHERE子句,表示要修改表中的所有元组。

例8.17 将供应商S4提供的零件P2的价格提高6%
UPDATE SPJ SET PRICE=PRICE*1.06 WHERE SNO=’S4’ AND PNO=’P2’;
182
8.4 SQL的数据控制(DCL)
现在的数据库系统大都提供了非常完善的安全机制,一般采用基于角色的(就是根据用户的特性,把用户分为不同的类别。

如管理员、数据库备份管理员、数据库用户管理员、普通用户等。

不同数据库系统的用户角色不完全相同)多级授权安全机制,所有对数据库的操作都需要更高一级的授权,任何级别的用户在使用数据库系统时,除了必须拥有的授权外,还必须提供正确的用户名和用户口令。

在数据库系统中,数据库系统管理员DBA负责完成整个系统的管理工作,获得DBA授权的用户可以创建数据库、表等而成为这些数据库对象的拥有者。

拥有者对自己所拥有的对象有完全控制权,同时拥有者也可以授权其他用户使用其所拥有的对象,当然,也可以收回授权。

SQL的数据控制功能是指控制用户对数据的存取权力,语句有两条:授权语句(GRANT)和收权语句(REVOKE)。

顾名思义,授权语句是使某个用户具有某些权限,收权语句是收回已授给用户的权限。

用户对数据的存取操作包括:增(INSERT)、删(DELETE)、改(UPDA TE)、查(SELECT)。

只有被授以了某项操作的权限的用户才能进行某项操作。

例8.18 假设把对表LTemp的所有操作权限授权给用户LUSER
GRANT ALL ON LTemp TO LUSER
例8.19假设只把查看(即SELECT)的权限授权给用户LUSER
GRANT SELECT ON Ltemp TO LUSER
例8.20 赋予用户LUSER的对表LTemp的更新权(包括INSERT、UPDATE、DELETE)收回
REVOKE INSERT,UPDATE,DELETE ON Ltemp FROM LUSER
习题与思考题
8.1对于教学数据库的三个基本表:学生S、成绩SC、课程C
S(SNO,SNAME,AGE,SEX,SDEPT)
SC(SNO,CNO,GRADE)
C(CNO,CNAME,CDEPT,TNAME)
试用SQL查询语句完成下列查询:
(1)检索LIU老师所授课程的课程号和课程名。

(2)检索年龄大于25岁的男学生的学号和姓名。

(3)检索选修课程包含LIU老师所授课程的学生学号。

8.2 试用SQL查询语句完成下列对教学数据库的三个基本表S、SC、C的查询:
(1)统计所有学生选修的课程门数。

(2)求选修C4课程的学生的平均年龄。

183
(3)求LIU老师所授课程的每门课程的学生平均成绩。

(4)检索姓名以W ANG打头的所有学生的姓名和年龄。

(5)在SC中检索成绩为空值的学生学号和课程号。

8.3 试用SQL更新语句完成下列对教学数据库的三个基本表S、SC、C的更新操作:
(1)往基本表S中插入一个学生元组(’S9’,’WU’,18)。

(2)在基本表SC中删除尚无成绩的元组。

(3)W ANG同学的选课和成绩全部删去。

(4)把MATHS课不及格的成绩全改为空值。

(5)把低于总平均成绩的女同学成绩提高5%。

8.4 假设某“仓库管理”关系模型有下列五个关系模式:
零件PART(PNO,PNAME,COLOR,WEIGHT)
项目PROJECT(JNO,JNAME,DA TE)
供应商SUPPLIER(SNO,SNAME,SADDR)
供应P_P(JNO,PNO,TOTAL)
采购P_S(PNO,SNO,QUANTITY)
试用SQL DDL语句定义上述五个基本表,并说明主键和外键。

184。

相关文档
最新文档