本章内容提要
SQL语言可以分为数据定义,数据查询,数据更新,数据控制四大部分 。 本章系统而详尽地讲解了 SQL语言这四部分的内容 。
进一步了解关系数据库系统的基本概念 。
第三章 关系数据库标准语言 SQL
.本章重点:
SQL的数据定义、查询、更新、控制功能;
视图的概念及其优点。
本章难点:
SQL的数据查询功能 。
第三章 关系数据库标准语言 SQL
SQL
历史
– SQL,Structured Query Languang
– 1974年,由 Boyce和 Chamberlin提出
– 1975-1979年,在 System R上实现,由 IBM的 San Jose
研究室研制由于它功能丰富受到广泛欢迎,经不断修改、扩充和完善,SQL语言最终发展成为关系数据库的标准语言。
第三章 关系数据库标准语言 SQL
SQL
第三章 关系数据库标准语言 SQL
标准化
–有关组织
ANSI(American Natural Standard Institute) 美国国家标准局
ISO(International Organization for Standardization) 国际标准化组织
–有关标准
SQL-86 (1986年 10月 ANSI的数据库委员会 X3H2,87年 ISO通过)
“数据库语言 SQL‖
SQL-89
―具有完整性增强的数据库语言 SQL‖,增加了对完整性约束的支持
SQL-92 (SQL-2)
―数据库语言 SQL‖,是 SQL-89的超集,增加了许多新特性,如新的数据类型,
更丰富的数据操作,更强的完整性、安全性支持等。
SQL-99 (SQL-3)
正在讨论中的新的标准,将增加对面向对象模型的支持意义:
自 SQL成为国际标准语言后,各个数据库厂家纷纷推出各自的 SQL软件或与 SQL的接口软件,这就使得大多数数据库均用 SQL作为共同的数据存取语言和标准接口,使不同数据库系统之间的互操作有了共同的基础 。
这个意义十分重大。 SQL成为国际标准,对数据库以外的领域也产生了很大影响。 SQL
已成为数据库领域中的一个主流语言。
第三章 关系数据库标准语言 SQL
3.1.1 SQL特点
SQL语言的英语意义是结构查询语言( Structured Query
Language)。实际上它的功能丰富。
SQL功能,数据查询( Data QUERY);
数据操纵( Data MANIPULATION);
数据定义( Data DEFINITION);
数据控制( Data CONTROL)
SQL的主要特点是,
1,综合统一(一体化的特点 )
2,高度非过程化
3,面向集合的操作方式
4,以同一种语法结构提供两种使用方式
5,语言简洁,易学易用第三章 关系数据库标准语言 SQL
3.1 SQL概述第三章 关系数据库标准语言 SQL
3.1 SQL概述
SQL语言的动词
SQL 功能 动词数据查询 SELECT
数据定义 CREATE DROP ALTER
数据操纵 INSERT UPDATE DELETE
数据控制 GRANT REVOKE
3.1.2 SQL语言的基本概念
SQL语言支持关系数据库三级模式结构。
第三章 关系数据库标准语言 SQL
3.1 SQL概述
SQL
视图 1 视图 2
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2
外模式模式内模式
SQL的数据定义功能包括三部分,定义基本表,定义视图和定义索引 。 视图是基于基本表的虚表,索引是依附于基本表的 。 因此 SQL通常不提供修改视图和索引定义的操作 。
SQL 的数据定义语句第三章 关系数据库标准语言 SQL
3.2 数据定义操作对象操作方式创建 删除 修改表 CREATE TABLE DROP TABLE ALTER TABLE
视图 CREATE VIEW DROP VIEW
索引 CREATE INDEX DROP INDEX
3.2.1 定义、删除、与修改基本表一,定义基本表语句格式为,
CREATE TABLE <表名 >(<列名 > <数据类型 >[列级完整性约束 ]
[,<列名 > <数据类型 >[列级完整性约束 ]]?
[,表级完整性约束 ]);
功能,定义一个基本表,同时定义与该表有关的完整性约束条件。
说明,(1)<表名 >是所要定义的基本表的名字。
(2) 一个表可以由一个或几个属性(列)组成。
第三章 关系数据库标准语言 SQL
3.2 数据定义
DB2 SQL 支持以下数据类型 ;
INTEGER或 INT 全字长 (31 bits 精度 )的二进制整数
SMALLINT 半字长 (精度为 15bits)的二进制整数
DECIMAL(p[,q])或 DEC(p[,q]) 压缩十进制数,共 p位,小数点后有 q位,15>=p>=q>=0,q=0时可省略,
FLOAT 双字长的浮点数
CHARTER(N)或 CHAR(N) 长度为 n的定长字符串
VARCHAR(N) 变长字符串,最大长度为 n
GRAPHIC( N) 长度为 n的定长图形字符串
VAR GRAPHIC( N) 变长图形字符串,最大长度为 n
DATE 日期型,格式为 YYYY-MM-DD
TIME 时间型,格式为 HH.MM.SS
TIMESTAMP 日期加时间第三章 关系数据库标准语言 SQL
3.2 数据定义第三章 关系数据库标准语言 SQL
3.2 数据定义例 1:建立一个学生表 Student,它由学号 Sno,姓名 Sname,性别 Ssex,
年龄 Sage,所在系 Sdept五个属性组成。其中学号不能为空,
值是唯一的,且姓名取值也唯一。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname char(8) UNIQUE,
Ssex CHAR(1),
Sage SMALLINT,
Sdept CHAR(15));
系统执行上面的 CREATE TABLE语句后,就在数据库中建立一个新的空的“学生”表 Student,并将有关“学生”表的定义及有关约束条件存放在数据字典中。
第三章 关系数据库标准语言 SQL
3.2 数据定义例 2,CREATE TABLE s (
sno char(6) not null,
sname char(8) unique,
ssex char(2) default '男 ',
sage smallint,
sdept char(2),
sbirthday date,
primary key (sno) );
列级完整性约束条件表级完整性约束条件第三章 关系数据库标准语言 SQL
3.2 数据定义
3.2.1 定义、删除、与修改基本表二,修改基本表语句格式为,
ALTER TABLE <表名 >
[ADD<列名 > <类型 >[完整性约束 ]]
[DROP <完整性约束名 [(列名 )]>|<列名 >]
[MODIFY<列名 > <类型 >];
功能:修改指定的基本表。
ADD子句:用于增加新列和新的完整性约束条件;
DROP子句:用于删除指定的完整性约束条件;
MODIFY子句:用于修改原有的列定义(列名和数据类型)
说明:不论基本表中原来是否有数据,新增加的列一律为空值。
SQL没有提供删除属性列的语句 。
第三章 关系数据库标准语言 SQL
3.2 数据定义例 3,向 S表增加:,入学时间,列,数据类型为日期型。
ALTER TABEL S ADD SCOME DATE;
注意:新增加的属性列不能指定为 NOT NULL 。
将年龄的数据类型改为半字长整数。
ALTER TABEL S MODIFY SAGE SMALLINT;
注意:修改原有的属性列定义有可能破坏已有数据 。
删除姓名上的唯一值约束。
alter table s drop unique(sname);
第三章 关系数据库标准语言 SQL
3.2 数据定义
3.2.1 定义、删除、与修改基本表三,删除基本表语句 格式 为:
DROP TABLE <表名 > ;
功能:删除指定的基本表,同时表中的数据和在此表上建立的索引都将自动被删除掉。建立在此表上的视图虽仍然保留,但已无法引用。
注意:执行删除操作一定要格外小心!
第三章 关系数据库标准语言 SQL
3.2 数据定义
3.2.2 建立与删除索引在基本表上建立索引是为了加快查询速度 。
一、建立索引语句格式为:
CREATE [UNIQUE][CLUSTER] INDEX 索引名
on 基本表名(列名 [次序 ][,列名 [次序 ]]....) [其他参数 ];
说明,索引可以建在一列或几列上,圆括号内是索引列的顺序说明表。
( 1)次序,指定了索引值排序的次序。可取 ASC(升序 )或 DESC(降序 ),缺省值为升序。
( 2) UNIQUE 表示每一索引值只对应唯一的数据记录,
( 3) CLUSTER 表示要建立的索引是 聚簇索引,所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
例,CREATE CLUSTER INDEX Stusname on Student(Sname);
此类索引可以提高查询效率,聚簇索引可以在最常查询的列上建立,对于经常更新的列不宜建立。一个基本表上最多只能建立一 个聚簇索引。
第三章 关系数据库标准语言 SQL
3.2 数据定义例 4 为学生 -课程数据库中的 Student,Couse,SC三个表建立索引。其中 Student表按学号升序建唯一索引,
Couse 表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Couse(Cno);
CREATE UNIQUE INDEX Sno ON SC(Sno ASC,Cno DESC);
第三章 关系数据库标准语言 SQL
3.2 数据定义二、删除索引语句格式为,
DROP INDEX 索引名 ;
功能:
删除索引,同时把有关索引的描述也从数据字典中删去。
例 5,DROP INDEX XSNO;
第三章 关系数据库标准语言 SQL
3.3 数据更新
SQL的更新语句包括修改,删除和插入三类语句。
3.3.1,插入一,插入单个元组语句格式为,
INSERT
INTO 表名 [(字段名 [,字段名 ]....)]
VALUES(常量 [,常量 ].......);
功能:将新元组插入指定表中。
说明:
( 1)在 INTO中没有出现的属性列,将被置为空值;
( 2)在表定义时说明了 NOT NULL的属性列不能取空值;
( 3)如果 INTO子句没有指明任何列名,则新插入的记录必须在每个属性列上均有值。
第三章 关系数据库标准语言 SQL
3.3 数据更新例 6 将一个新学生记录( 95020,陈东,男,IS,18)插入到 S表
INSERT INTO S
VALUES ('95020','陈东 ','男 ','IS',18);

INSERT INTO S (sno,sname,ssex,sdept,sage)
VALUES ('95020','陈东 ','男 ','IS',18);
空值的插入例 7 插入一条学生选课记录 ('95020','1')到 SC表
INSERT INTO SC (sno,cno)
VALUES ('95020','1');

INSERT INTO SC (sno,cno,grade)
VALUES ('95020','1',null );
第三章 关系数据库标准语言 SQL
3.3 数据更新
3.3.1,插入二,插入子查询结果语句格式为,
INSERT
INTO 表名 [(字段名 [,字段名 ].......)]
子查询;
第三章 关系数据库标准语言 SQL
3.3 数据更新例 8 对于一个系,求学生的平均年龄,并把结果存入数据库中。
CREATE TABLE DEPTAGE
(SDEPT CHAR(15),
AVGAGE SMALLINT);
INSERT
INTO DEPTAGE (SDEPT,AVGAGE)
( SELECT SD,AVG(SA)
FROM S
GROUP BY SD) ;
第三章 关系数据库标准语言 SQL
3.3 数据更新
3.3.2.修改数据语句格式为,
UPDATE 表名
SET 字段 =表达式 [,字段 =表达式 ]....
[WHERE 谓词 ];
功能:修改指定表中满足谓词的元组;把这些元组按 SET子句中的表达式修改相应字段上的值。
第三章 关系数据库标准语言 SQL
3.3 数据更新一、单记录修改例 9.
把学生 S1的姓名改为 WANGPING
UPDATE S
SET SName= 'WANG PING'
WHERE SNO='S1';
第三章 关系数据库标准语言 SQL
3.3 数据更新例 10,多记录修改,
把所有学生的年龄增加 1岁
UPDATE S
SET Sage = Sage + 1;
第三章 关系数据库标准语言 SQL
3.3 数据更新二、多表的修改例 11,
把学生 S2的学号改为 S9
UPDATE S
SET SNO='S9'
WHERE SNO='S2';
UPDATE SC
SET SNO='S9'
WHERE SNO='S2';
注意:修改多表数据时要保证数据库内容的一致性。
第三章 关系数据库标准语言 SQL
3.3 数据更新三、带子查询的修改例 12.
将计算机系全体学生的成绩置零
UPDATE SC
SET GRADE=0
WHERE 'CS‘ =
( SELECT SDEPT
FROM S
WHERE S.SNO=SC.SNO);
第三章 关系数据库标准语言 SQL
3.3 数据更新
3.3.3,删除数据语句格式为,
DELETE
FROM 表名
[WHERE 谓词 ];
功能:删除指定表中的数据。
说明:没有 WHERE子句时表示删除此表中的全部记录,但此表的定义仍在数据字典中。
第三章 关系数据库标准语言 SQL
3.3 数据更新一,单记录删除把学生‘ S9’删除
DELETE
FROM S
WHERE SNO='S9';
会产生什么问题吗?
第三章 关系数据库标准语言 SQL
3.3 数据更新二,多记录删除删除所有学生选课记录
DELETE
FROM SC;
SC成为一个空表第三章 关系数据库标准语言 SQL
3.3 数据更新三,带子查询的删除将计算机系全体学生的选课记录
DELETE
FROM SC
WHERE 'CS'=
( SELECT SDEPT
FROM STUDENT
WHERE STUDENT.SNO=SC.SNO );
第三章 关系数据库标准语言 SQL
3.3 数据更新
3.3.4 更新操作与数据库的一致性增加、删除、修改操作只能对一个表操作,这会带来一些问题。
如在对表更新时的数据不一致。
解决的办法 ——数据库系统引入了事务
( Transaction)的概念。
第三章 关系数据库标准语言 SQL
3.4 数据查询一,SELECT 语法语句格式为,
SELECT [ALL|DISTINCT]目标列表达式 [,目标列表达式 ]…
FROM 基本表 (或视图 )[,基本表 (或视图 )]…
[WHERE 条件表达式 ]
[GROUP BY 列名 1[HAVING 内部函数表达式 ]]
[ORDER BY 列名 2][ASC|DESC]
[UNION SELECT… ];
功能:在指定的表中查询满足条件的数据,并按目标列表达式方式显示。
第三章 关系数据库标准语言 SQL
3.4 数据查询二,SELECT LIST (目标列表达式 )
说明:在目标列中可以出现的形式为:
( 1) 列名
( 2) [表名,]列名
( 3) [表名,]*
( 4)列名 [AS] 新列名
( 5)常量
( 6)列名计算式 (+,-,*,÷ )
( 7)选项 [ALL|DISTINCT]
特别注意,函数不能嵌套使用第三章 关系数据库标准语言 SQL
3.4 数据查询例 1,指定列名
SELECT sno,sname
FROM S;
例 2,列名前带表名
SELECT sc.sno,s.sname,cno,grade
FROM sc,s
WHERE SC.SNO=S.SNO;
例 3,选择所有列
SELECT *
FROM "sc" ;
第三章 关系数据库标准语言 SQL
3.4 数据查询例 4,重新命名列名
SELECT sno,sname,sbirthday as birth_day
FROM s;
SELECT sno,sname,sbirthday as '出生日期 '
FROM s;
例 5,使用常量
SELECT sno,sname,'age:',sage
FROM s;
第三章 关系数据库标准语言 SQL
3.4 数据查询例 6,使用列名计算式 (+,-,*,÷ )
SELECT sno,sname,'Birth_Year:',2001-sage
FROM s;
SELECT sno,cno,"grade" +100 "grade"
FROM sc ;
第三章 关系数据库标准语言 SQL
3.4 数据查询例 7 使用选项 [ALL|DISTINCT]
SELECT "sc"."sno"
FROM "sc" ;
SELECT distinct "sc"."sno"
FROM "sc" ;
第三章 关系数据库标准语言 SQL
3.4 数据查询三,WHERE CLAUSE
条件可以包括:
( 1) 比较 ( =,<,<=,>,>=,<>,!=,!<,!> )
( 2) 范围 ( between and,not between and )
( 3) 列表 ( in,not in )
( 4) 字符匹配 (like,not like )
( 5) 空值判断 (is null,is not null )
( 6) 连接 ( 多表,单表(表的自连接)
( 7) 嵌套查询 (子查询)
第三章 关系数据库标准语言 SQL
3.4 数据查询例1:比较 ( =,<,<=,>,>=,<>,!=,!<,!> )
求数学系学生的学号、姓名。
SELECT SNO,SName
FROM S
WHERE Sdept = 'MA';
求数学系年龄在19岁以下的学生的学号、
姓名。
SELECT SNO,SName
FROM S
WHERE Sdept = 'MA' and sage <=19 ;
第三章 关系数据库标准语言 SQL
3.4 数据查询求数学系或年龄在19岁以下的学生的信息。
SELECT *
FROM S
WHERE SDept='MA' or sage <=19 ;
等价形式为:
SELECT *
FROM S
WHERE SDept='MA'
union
SELECT *
FROM S
WHERE sage <=19 ;
第三章 关系数据库标准语言 SQL
3.4 数据查询例2:范围 ( between and,not between and )
求数学系年龄在19岁到22岁之间[19,
22]的学生的信息
SELECT *
FROM S
WHERE SDept='MA' and sage >=19 and sage <=22;
第三章 关系数据库标准语言 SQL
3.4 数据查询用范围的等价形式为:
SELECT *
FROM S
WHERE SDept='MA' and sage between 19 and 22;
求年龄不在19岁到22岁之间[19,22]的学生的信息
SELECT *
FROM S
WHERE sage not between 19 and 22;
第三章 关系数据库标准语言 SQL
3.4 数据查询例3:列表 ( in,not in )
求在下列各系的学生,MA (数学系),CS (计算机科学系)。
SELECT *
FROM S
WHERE SDept IN ('MA','CS');
谓词 IN 实际上是一系列谓词 'OR'的缩写。所以,上面等价的查询语句为:
SELECT *
FROM S
WHERE SDept = 'MA' or SDept ='CS';
第三章 关系数据库标准语言 SQL
3.4 数据查询也可以用谓词 NOT IN
例如,求不是数学系,计算机科学系的学生。
SELECT *
FROM S
WHERE SDept NOT IN ('MA','CS');
第三章 关系数据库标准语言 SQL
3.4 数据查询例4,字符匹配 (like,not like )
LIKE 谓词的一般形式是:
〈 列名 〉 [NOT]LIKE 〈 匹配串 〉 [ESCAPE 常量字符 ]
匹配串可以是一个完整的字符串,也可以含有通配符 %
和 _
其中,% 匹配任意长度的字符串;
_ 匹配单个字符
LIKE可以用 = 代替 ;
NOT LIKE可以用 〈 〉 或! = 代替
ESCAPE 常量字符 表示该常量字符后的一个字符不再具有通配符的含义,而作为一个普通字符匹配。
第三章 关系数据库标准语言 SQL
3.4 数据查询例如:列名 like 'ACV\_HHFJ\%'ESCAPE'\'
求姓名是以字母 D 打头的学生。
SELECT *
FROM S
WHERE SName LIKE 'D%';
第三章 关系数据库标准语言 SQL
3.4 数据查询例5,空值判断 (is null,is not null )
注意:在计算列中有空值时,要先处理或将空值列置 0
查询没有成绩的学生的学号和课程号
SELECT sno,cno
FROM SC
WHERE grade is null;
第三章 关系数据库标准语言 SQL
3.4 数据查询例6:连接( 多表,单表(表的自连接)
若一个查询同时涉及到两个以上的表,称为连接查询连接查询包括:
等值连接自然连接非等值连接自身连接外连接复合条件连接第三章 关系数据库标准语言 SQL
3.4 数据查询例,(广义笛卡尔积)
SELECT s.sno,sname,sc.sno,grade
FROM sc,s ;
例,(等值连接)
SELECT s.sno,sname,sc.*
FROM sc,s
WHERE s.sno = sc.sno;
SELECT s.sno,sname,c.cno,cname,grade
FROM sc,s,c
WHERE s.sno = sc.sno and
c.cno = sc.cno;
第三章 关系数据库标准语言 SQL
3.4 数据查询例,(自然连接)
SELECT s.*,sc.cno,sc.grade
FROM sc,s
WHERE s.sno = sc.sno;
例,( 自身连接 )
SELECT First.cno,Second.pcno
FROM c First,c Second
WHERE First.pcno = Second.cno;
第三章 关系数据库标准语言 SQL
3.4 数据查询例,( 外连接 )
SELECT s.*,sc.cno,sc.grade
FROM sc,s
WHERE s.sno = sc.sno(*);
例,( 复合条件连接 )
SELECT s.*,sc.cno,sc.grade
FROM sc,s
WHERE s.sno = sc.sno and
cno='2' and
grade > 85;
第三章 关系数据库标准语言 SQL
3.4 数据查询
( 7) 嵌套查询 (子查询)
一个 SELECT--FROM--WHERE语句称为一个查询块一个查询块出现在 WHERE 子句中或 HAVING 短语中的查询称为嵌套查询
SQL语句允许多层嵌套特别指出:
子查询的 SELECT 语句中不能使用 ORDER BY 子句
ORDER BY 子句只能对最终查询结果排序嵌套查询分为:
简单子查询相关子查询第三章 关系数据库标准语言 SQL
3.4 数据查询例:简单子查询(带有 IN谓词的子查询 )
查询选修了‘ 2’号课程的学生的学号和姓名
SELECT s.sno,sname
FROM s
WHERE sno in
( SELECT sno
FROM SC
WHERE cno ='2‘ );
等价于:
SELECT s.sno,sname
FROM s
WHERE sno in ('s1','s3','s4','s5') ;
第三章 关系数据库标准语言 SQL
3.4 数据查询例,查询选修了 '数据库系统 '课程的学生的学号和姓名
SELECT s.sno,sname
FROM s
WHERE sno in
( SELECT sno
FROM SC
WHERE cno in
( SELECT cno
FROM C
WHERE cname ='数据库系统 '));
第三章 关系数据库标准语言 SQL
3.4 数据查询例:(带有比较运算符的子查询)
查询“王明”所在系的学生的学号、姓名和系
SELECT s.sno,sname,sdept
FROM s
WHERE sdept =
( SELECT sdept
FROM S
WHERE sname = ‘王明’ );
第三章 关系数据库标准语言 SQL
3.4 数据查询例:(带有 ANY 或 ALL谓词的子查询)
查询其它系比,CS”系某一学生年龄小的学生姓名和年龄
SELECT sname,sage
FROM s
WHERE sdept <> 'cs' and sage < any
( SELECT sage
FROM S
WHERE sdept ='cs');
第三章 关系数据库标准语言 SQL
3.4 数据查询例:查询其它系比,CS”系任一学生年龄小的学生姓名和年龄
SELECT sname,sage
FROM s
WHERE sdept <> 'cs' and sage < all
( SELECT sage
FROM S
WHERE sdept ='cs‘ );
第三章 关系数据库标准语言 SQL
3.4 数据查询例:相关子查询 (使用存在量词 EXISTS 和 NOT EXISTS )
EXISTS 代表存在量词。 带有 EXISTS谓词的子查询不返回任何数据,只产生逻辑值,TRUE”或,FALSE”
查询选修了‘ 2’号课程的学生的学号和姓名
SELECT s.sno,sname
FROM s
WHERE exists
( SELECT *
FROM SC
WHERE sc.sno = s.sno and cno ='2');
第三章 关系数据库标准语言 SQL
3.4 数据查询查询未选修了‘ 2’号课程的学生的学号和姓名
SELECT s.sno,sname
FROM s
WHERE not exists
( SELECT *
FROM SC
WHERE sc.sno = s.sno and cno ='2');
第三章 关系数据库标准语言 SQL
3.4 数据查询四、聚合函数有 SUM,AVG,MAX,MIN,COUNT,COUNT( *)
例:
SELECT max(sage)
FROM s ;
SELECT count(*)
FROM s ;
SELECT count(sno)
FROM s
where sdept ='ma';
第三章 关系数据库标准语言 SQL
3.4 数据查询五、结果排序
ORDER BY 子句对查询结果按一个或多个属性的升序
( ASC)或降序( DESC)排列
SELECT *
FROM sc
ORDER BY SNO;
SELECT *
FROM sc
ORDER BY CNO DESC;
第三章 关系数据库标准语言 SQL
3.4 数据查询六、结果分组与 HAVING 子句例:
SELECT ssex
FROM s
group by ssex;
SELECT ssex,avg(sage)
FROM s
group by ssex;
SELECT sdept,avg(sage) aaa
FROM s
group by sdept having aaa >19;
第三章 关系数据库标准语言 SQL
3.4 数据查询例,统计每个学生选修课程的门数及平均成绩
SELECT sno,count (*) as course_num,
avg(grade) as avg_grade
FROM sc
group by sno;
第三章 关系数据库标准语言 SQL
3.4 数据查询例,统计每门课程的选修人数及平均成绩
SELECT cno,count (*) as student_num,avg(grade) as avg_grade
FROM sc
group by cno;
第三章 关系数据库标准语言 SQL
3.4 数据查询关于在 WHERE 子句中不能使用聚合函数
SELECT sno,max(sage)
FROM s
GROUP BY sno ;
SELECT sno,sage
FROM s
WHERE sage = max(sage);
第三章 关系数据库标准语言 SQL
3.4 数据查询七、集合查询例 查询计算机科学系的学生及年龄不大于 19岁的学生。
SELECT * FROM Student WHERE Sdept=?CS‘
UNION
SELECT * FROM Student WHERE Sage<=19;
本查询实际上是求计算机科学系的所有学生与年龄不大于 19岁的学生的并集。使用 UNION将多个查询结果合并起来时,系统会自动去掉重复元组。注意,参加
UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同。
第三章 关系数据库标准语言 SQL
3.4 数据查询例 查询选修了课程 1或者选修了课程 2的学生。
SELECT Sno FROM SC WHERE Cno=?1‘
UNION
SELECT Sno FROM SC WHERE Cno=?2‘;
标准 SQL中没有直接提供集合交操作和集合差操作,
但可以用其他方法来实现。
例 查询计算机科学系的学生与年龄不大于 19岁的学生的交集,这实际上就是查询计算机科学系中年龄不大于
19岁的学生。
SELECT * FROM Student
WHERE Sdept=?CS‘ AND Sage<=19;
第三章 关系数据库标准语言 SQL
3.4 数据查询例 查询选修课程 1的学生集合与选修课程 2的学生集合的交集。
SELECT Sno FROM SC
WHERE Cno=?1‘ AND Sno IN
(SELECT Sno FROM SC
WHERE Cno=?2‘);
例 查询计算机科学系的学生与年龄不大于 19岁的学生的差集。
SELECT * FROM Student
WHERE Sdept=?CS‘ AND Sage>19;
第三章 关系数据库标准语言 SQL
3.5 视图
3.5.1 定义视图语句格式为:
CREATE VIEW 视图名 [(字段名 [,字段名 ]....)]
AS 子查询
[WITH CHECK OPTION];
说明:
( 1) WITH CHECK OPTION 选项表示对视图进行 UPDATE,INSERT和 DELETE
操作时要保证更新、插入和删除的行必须满足视图定义的谓词条件(子查询的条件表达式)。
( 2)子查询不允许含有 ORDER BY 子句和 DISTINCT短语
( 3)组成视图的属性列名要么全部指定要么全部省略,没有其它选择,
第三章 关系数据库标准语言 SQL
3.5 视图例,建立,CS”系的学生视图表,
CREATE VIEW V_CS
AS ( SELECT SNO,SNAME,SAGE,SDEPT
FROM S
WHERE SDEPT='CS‘ );
等价为:
CREATE VIEW V_CS ( SNO,SNAME,SAGE,SDEPT )
AS ( SELECT SNO,SNAME,SAGE,SDEPT
FROM S
WHERE SDEPT='CS‘ );
第三章 关系数据库标准语言 SQL
3.5 视图视图 V_CS的字段名省略了,隐含为子查询中 SELECT子句目标列中的诸字段 (SNO,SNAME,SAGE,SDEPT).
但是,在下面三种情况下必须明确指定组成视图的所有列名:
( 1) 某个目标列不是单纯的属性列名,而是集函数或列表达式
( 2) 多表连接时出现了几个同名列作为视图的字段
( 3) 需要在视图中为某个列启用新的更合适的名字第三章 关系数据库标准语言 SQL
3.5 视图例:
定义一个反映学生出生年份的视图
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS( SELECT Sno,Sname,2002-Sage
FROM S;
建立学生及其平均成绩视图,
CREATE VIEW V_S_G_AVG(SNO,G_AVG)
AS ( SELECT SNO,AVG(Grade)
FROM SC
GROUP BY SNO ) ;
第三章 关系数据库标准语言 SQL
3.5 视图
CREATE VIEW F_STUDENT( SNO,NAME,AGE)
AS ( SELECT *
FROM S );
由于视图 F_STUDENT是由子查询,SELECT *”建立的。如果以后修改了基本表 S的结构,则 S表与 F_STUDENT视图的映象关系被破坏,因而该视图就不能正确工作了。
可以通过修改了表结构后删除由该基本表导出的视图,然后重建同名视图的方法解决。
第三章 关系数据库标准语言 SQL
3.5 视图视图不仅可以建立在单个基本表上,也可以建立在多个基本表上。
例 建立信息系选修了 1号课程的学生的视图
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
( SELECT S.Sno,Sname,Grade
FROM S,SC
WHERE s.Sno=SC.Sno AND
Sdept='IS' AND
SC.Cno='1' );
第三章 关系数据库标准语言 SQL
3.5 视图视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或同时建立在基本表与视图上。
例,建立信息系选修了 1号课程且成绩在 90分以上的学生的视图 。
CREATE VIEW IS_S2
AS
( SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90 );
第三章 关系数据库标准语言 SQL
3.5 视图
若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列但保留了码,
我们称这些视图为 行列子集视图 。
定义视图时可以根据应用的需要,设置一些派生属性列。这些派生属性由于在基本表中并不实际存在,所以有时也称他们为 虚拟列 。带虚拟列的视图我们称为带 表达式的视图 。
还可以用带有集函数和 GROUP BY子句的查询来定义视图。这种视图称为 分组视图 。
第三章 关系数据库标准语言 SQL
3.5 视图比较:视图 V_CS,BT_S及 V_S_G_AVG
CREATE VIEW V_CS( SNO,SNAME,SAGE,SDEPT )
AS ( SELECT SNO,SNAME,SAGE,SDEPT
FROM S
WHERE SDEPT='CS’ ) ;
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS( SELECT Sno,Sname,2002-Sage
FROM S );
定义 行列子集视图定义 带 表达式的视图第三章 关系数据库标准语言 SQL
3.5 视图比较:视图 V_CS,BT_S及 V_S_G_AVG
学号及他的平均成绩定义为一个视图
CREATE VIEW V_S_G_AVG(SNO,G_AVG)
AS ( SELECT SNO,AVG(Grade)
FROM SC
GROUP BY SNO ) ; 定义 分组 视图第三章 关系数据库标准语言 SQL
3.5 视图二、删除视图语句格式为,
DROP VIEW 视图名;
功能:删除视图后,视图的定义将从数据字典中删除。 但由该视图导出的其他视图定义仍在数据字典中,不过该视图已失效,要一一删除。
例,DROP VIEW IS_S1; 在此基础上定义的视图 IS—
—S2失效!
第三章 关系数据库标准语言 SQL
3.5 视图
3.5.2 视图的查询
视图定义后,用户就可以象对基本表进行查询一样对视图进行查询了。
由于视图的查询上是对基本表的查询,因此基本表的变化可以反映到视图上。视图就如同
‘窗口’一样,通过视图可以看到基本表的变化,。通常,视图的查询的转换是直接了当的,但有时也会产生问题。
第三章 关系数据库标准语言 SQL
3.5 视图例,
SELECT SNO,SAGE
FROM V_CS
WHERE SAGE<20;
系统执行此查询时首先进行 有效性检查,检查查询的表、视图是否存在。 若存在,则从数据字典中取出视图的定义,把定义中的子查询和用户查询结合起来,把它 转换成等价的对基本表的查询,形成一个修正的语句,这一过程称为 视图消解 。
第三章 关系数据库标准语言 SQL
3.5 视图本例的修正后的查询语句中为:
SELECT SNO,SAGE
FROM S
WHERE SDEPT='CS' AND SAGE<20;
注,CREATE VIEW V_CS
( SNO,SNAME,SAGE,SDEPT )
AS ( SELECT SNO,SNAME,SAGE,SDEPT
FROM S
WHERE SDEPT='CS? );
第三章 关系数据库标准语言 SQL
3.5 视图视图的查询的转换是直接了当的,但有时也会产生问题。
例,求平均成绩为 90分以上的学生学号和成绩。
SELECT *
FROM V_S_G_AVG
WHERE GAVG >= 90;
执行查询转换后得到一个不正确的查询语句,
SELECT SNO,AVG(GRADE)
FROM SC
WHERE AVG(GRADE)>=90;
GROUP BY SNO;
第三章 关系数据库标准语言 SQL
3.5 视图
WHERE子句中不能用库函数作为条件表达式。
正确的查询语句应转换为,
SELECT SNO,AVG(GRADE)
FROM SC
GROUP BY SNO
HAVING AVG(GRADE) >= 90;
但有些系统不能作这类查询转换,
第三章 关系数据库标准语言 SQL
3.5 视图
3.5.3 视图的更新
更新视图是指通过视图插入( INSERT)、删除
( DELETE)和修改( UPDATE)数据。
由于视图是不实际存储数据的虚表,因此对 视图的更新,最终要转换为对 基本表的更新 。
强调指出:
( 1)对视图的更新最终要转换成对基本表的更新。
( 2)视图的更新是受限的。
第三章 关系数据库标准语言 SQL
3.5 视图
一、通过视图修改数据
例,通过视图修改数据
UPDATE V_CS
SET SNAME='李勇 MMMM'
WHERE SNO='S1';
将转换成对基本表 S的更新,
UPDATE S
SET SNAME='李勇 MMMM'
WHERE SDEPT='CS' AND SNO='S1';
―CS‖系学生第三章 关系数据库标准语言 SQL
3.5 视图二、通过视图插入数据例,通过视图插入数据
INSERT
INTO V_CS
VALUES('S12','YAN XI',19,‘CS');
将转换成对基本表的插入,
INSERT
INTO S
VALUES('S12','YAN XI',19,‘CS');
CREATE VIEW V_CS
( SNO,SNAME,SAGE,SDEPT )
AS ( SELECT SNO,SNAME,SAGE,SDEPT
FROM S
WHERE SDEPT='CS? );
第三章 关系数据库标准语言 SQL
3.5 视图三、通过视图删除数据
DELETE
FROM V_CS
WHERE SNO ='S1';
将转换成对基本表的删除:
DELETE
FROM S
WHERE SNO ='S1‘ AND SDEPT = ‘CS’;
数据被删除第三章 关系数据库标准语言 SQL
3.5 视图一般地:
(1)行列子集视图是可更新的,即可执行
UPDATE,DELETE和 INSERT 三类操作。
(2)有些视图虽然不是行列子集视图,但是从理论上讲仍是可更新的,
(3)有些视图是不可更新的。
目前各个关系数据库系统一般都只允许对行列子集视图的更新,而各个系统对视图的更新还有进一步的规定。这些规定也不尽相同。
第三章 关系数据库标准语言 SQL
3.5 视图在 DB2中,只有从单个基本表导出的视图才允许对它进行更新操作并且有以下具体的限制,
1.若视图的字段是来自字段表达式或常数,则不允许对此视图执行
INSERT,UPDATE操作,但允许执行 DELETE操作,
2,若视图的字段是来自库函数,则此视图不允许更新,
3,基视图的定义中有 GROUP BY 子句,则此视图不允许更新
4,若视图的定义中有 DISTINCT任选项,则此视图不允许更新
5,若视图的定义中有嵌套查询,并且嵌套查询的 FROM子句中涉及的表也是导出该视图的基本表,
则此视图不允许更新。
6,若视图是由一个以上基本表导出的则此视图不允许更新。
7,一个不允许更新的视图上定义的视图不允许更新。
第三章 关系数据库标准语言 SQL
3.5 视图
3.5.4 视图的作用视图的概念有很多优点,
1.简化了用户的操作;
2 使用户能以不同的方式看待同一数据;
3.对重构数据库提供了一定程度的逻辑独立性;
4,对机密数据提供了自动的安全保护功能 ;
第三章 关系数据库标准语言 SQL
3.6 数据控制
由 DBMS提供统一的数据控制功能是数据库系统的特点之一。
数据控制亦称为数据保护,包括数据的安全性控制、完整性控制、并发控制和数据库的恢复。
这里主要介绍 SQL的安全性控制功能。
某个用户对某类数据具有何种操作权利是政策问题,不是技术问题。
第三章 关系数据库标准语言 SQL
3.6 数据控制
3.6.1授权
SQL语言用 GRANT语句向用户授予操作权限。语句格式为:
GRANT <权限 >[,<权限 >]..,
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]...
[WITH GRANT OPTION];
功能:将对指定操作对象的指定操作权限授予指定的用户。
不同类型的操作对象有不同的操作权限。
第三章 关系数据库标准语言 SQL
3.6 数据控制不同对象类型允许的操作权限表对象 对象类型 操作权限属性列 TABLE SELECT,INSERT,UPDATE,DELETE ALL
PRIVIEGES
视图 TABLE SELECT,INSERT,UPDATE,DELETE ALL
PRIVIEGES
基本表 TABLE SELECT,INSERT,UPDATE,ALTER,
INDEX,DELETE ALL PRIVIEGES
数据库 DATABASE CREATETAB
第三章 关系数据库标准语言 SQL
3.6 数据控制例:把 查询 S 表 权限授给用户 U1
GRANT SELECT ON TABLE S TO U1;
例:把对 S表和 C表 的 全部权限 授予用户 U2和 U3
GRANT ALL PRIVILIGES ON TABLE S,C TO U2,U3;
例:把对表 SC的 查询 权限授予所有用户
GRANT SELECT ON TABLE SC TO PUBLIC;
例:把查询 S表和修改学生学号的权限授给用户 U4
GRANT UPDATE(Sno),SELECT ON TABLE S TO U4;
第三章 关系数据库标准语言 SQL
3.6 数据控制例:把对表 SC的 INSERT权限授予 U5用户,并允许他再将此权限授予其他用户
GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;
例,DBA把在数据库 S_C中建立表的权限授予用户 U8。
GRANT CREATETAB ON DATABASE S_C TO U8;
第三章 关系数据库标准语言 SQL
3.6 数据控制
3.6.2 收回权限授予的权限可以由 DBA或其他授权者用 REVOKE语句收回。
语句格式为:
REVOKE <权限 >[,<权限 >]..,
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >]...;
例:把用户 U4修改学生学号的权限收回
REVOKE UPDATE(Sno) ON TABLE S FROM U4;
例:收回所有用户对表 SC的查询权限
REVOKE SELECT ON TABLE SC FROM PUBLIC;
例:把用户 U5对 SC表的 INSERT权限收回
REVOKE INSERT ON TABLE SC FROM U5;
第三章 关系数据库标准语言 SQL
3.6 数据控制小结:
SQL提供了非常灵活的授权机制。
DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户。
用户对自己建立的基本表和视图拥有全部的操作权限,
并且可以把其中某些权限授予其他用户。被授权的用户如果有“继续授权”的许可,还可以把获得的权限再授予其他用户。
所有授予出去的权力在必要时又都可以用 REVOKE语句收回。
第三章 关系数据库标准语言 SQL
3.7 嵌入式 SQL
嵌入式 SQL简介以上介绍的 SQL语言是作为独立语言在终端交互方式下使用的。这是面向集合的描述性语言,是非过程性的。大多数语句都是独立执行,与上下文无关的。而许多事务处理应用都是过程性的,需要根据不同的条件来执行不同的任务,单纯使用 SQL语言是很难实现这类应用的。
为了解决这一 SQL语言提供了另一种使用方式,即将 SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补 SQL语言实现复杂应用方面的不足。这种方式下使用的 SQL语言称为嵌入式 SQL,而嵌入 SQL的高级语言称为 主语言或宿主语言 。
两种不同的使用方式下,SQL语言的语法结构基本上是一致的。细节上会有许多差别,在程序设计的环境下,SQL语句要做某些必要的扩充。
第三章 关系数据库标准语言 SQL
3.7 嵌入式 SQL
把 SQL嵌入主语言使用时必须解决三个问题,
1,区分 SQL语句与主语言语句,。
2,一个 SQL语句原则上可产生或处理一组记录,而主语言一次只处理一个记录,为此必须协调两种方式,这是用游标 ( CURSOR) 来解决的 。
3,数据库工作单元和程序工作单元之间的通信 。
第三章 关系数据库标准语言 SQL
小结:
SQL语言有两种工作方式:交互式和嵌入式。
SQL语言可以分为数据定义,数据查询,数据更新,数据控制四大部分 。 本章系统而详尽地讲解了 SQL语言这四部分的内容 。
进一步讲解了关系数据库系统的基本概念,使这些概念更加具体,更加丰富 。
视图是关系数据库系统中的重要概念,这是因为合理使用视图具有许多优 。
SQL语言的数据查询功能是最丰富,也是最复杂的 。