第三章 关系数据库 标准语言- sql

52
1 第第第 第第第第第 第第第第SQL 3.1 SQL 第第 3.2 第第第第 3.3 第第 3.4 第第第第 3.5 第第

Upload: audra-gonzales

Post on 02-Jan-2016

154 views

Category:

Documents


2 download

DESCRIPTION

第三章 关系数据库 标准语言- SQL. 3.1 SQL 概述 3.2 数据定义 3.3 查询 3.4 数据更新 3.5 视图. 3.1 SQL 概述. 关系数据库的标准语言 — 结构化查询语言 (Structured Query Language) , 简称 SQL 。它是一种非过程化的、功能极强的、通用的数据库语言,几乎所有的关系数据库管理系统都支持 SQL 。 1.SQL 数据库的体系结构要点 SQL 语言支持关系数据库三级模式结构 :. 用户. 外模式. SQL. 视图 2. 视图 1. 基本表 1. 基本表 2. 基本表 3. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第三章 关系数据库 标准语言- SQL

1

第三章 关系数据库标准语言- SQL

3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图

Page 2: 第三章 关系数据库 标准语言- SQL

2

3.1 SQL 概述

关系数据库的标准语言—结构化查询语言 (Structured Query Language) ,简称 SQL 。它是一种非过程化的、功能极强的、通用的数据库语言,几乎所有的关系数据库管理系统都支持 SQL 。

1.SQL 数据库的体系结构要点 SQL 语言支持关系数据库三级模式结构 :

Page 3: 第三章 关系数据库 标准语言- SQL

3

3.1 SQL 概述

基本表1

基本表2

基本表3

基本表4

视图 2视图 1

存储文件1

存储文件2

SQL

用户

外模式

模式

存储模式

Page 4: 第三章 关系数据库 标准语言- SQL

4

3.1 SQL 概述(1)一个 SQL数据库是表的汇集。它用一个或多个 SQL模式

定义。一个 SQL模式是表和授权的静态定义。(2)一个 SQL表由行的集合构成,一行是列的序列,每列对

应一个数据项。(3)一个表可以是一个基本表或是一个视图。基本表是实际

存储在数据库中的表,而视图是由基本表或其他视图构成的表的定义,称为虚表。

(4)一个基本表可以存储在一个或多个存储文件中,一个存储文件也可存放一个或多个基本表。

(5)用户可以用 SQL语句对基本表和视图进行查询等操作,视图和基本表在用户看来都是关系(即表格)。

(6)SQL用户可以是应用程序,也可以是终端用户。 SQL语句可嵌入主语言中使用,也可独立使用。

Page 5: 第三章 关系数据库 标准语言- SQL

5

3.1 SQL 概述

2.SQL 的组成 主要由四部分组成: 数据定义。这部分也称为“ SQL DDL”,用于

定义 SQL 模式、基本表、视图和索引。 数据操纵。这部分也称为“ SQL DML”,分为

数据查询和数据更新两类。 数据控制。这部分包括对基本表和视图的授权,

完整性规则的描述,事务控制等。 嵌入式 SQL 的使用规定。

Page 6: 第三章 关系数据库 标准语言- SQL

6

3.1 SQL 概述

3.SQL 的特点 SQL 的语言简洁,易学易用 SQL 是一种非过程化语言 SQL 采用面向集合的操作方式 SQL 具有十分灵活和极强的查询功能 SQL 以同一种语法结构提供两种使用方法

Page 7: 第三章 关系数据库 标准语言- SQL

7

第三章 关系数据库标准语言- SQL

3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图

Page 8: 第三章 关系数据库 标准语言- SQL

8

3.2 数据定义

1. 定义、删除、修改基本表 SQL数据定义功能包括: 定义基本表 ( 创建、删除、修改三个命令 ) 定义视图 ( 创建、删除,不提供修改,因为是个虚表 ) 定义索引 ( 创建、删除,不能修改,因为依附于基本表 )⑴定义基本表 CREATE TABLE < 表名 >(<列名 ><数据类型 >[列级完整性约束 ] [,< 列名 > <数据类型 >[列级完整性约束 ]…] [,< 表级完整性约束 >]);

Page 9: 第三章 关系数据库 标准语言- SQL

9

3.2 数据定义

⑵修改基本表 ALTER TABLE < 表名 > [ADD < 新列名 > < 数据类型 >[完整性约

束 ]] [DROP < 完整性约束名 >] [MODIFY < 列名 > < 数据类型 >];

⑶删除基本表 DROP TABLE < 表名 >;

Page 10: 第三章 关系数据库 标准语言- SQL

10

3.2 数据定义2. 建立与删除索引SQL 支持用户根据应用环境需要,在基本表上建立一个或多个索引,以提供各种存取路径,加快查找速度。

⑴建立索引 CREATE [UNIQUE] [CLUSTER] INDEX < 索引名 > ON < 表名 >(< 列名 >[< 次序 >][ , <列名 >[< 次序

>]]…);⑵删除索引 DROP INDEX < 索引名 >

Page 11: 第三章 关系数据库 标准语言- SQL

11

3.2 数据定义

【例 1】建立一个学生关系 Student,由学号 Sno 、姓名 Sname 、性别 Ssex 、年龄 Sage 、所在系 Sdept五个属性组成,其中学号不能为空且值是唯一的。

解: CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(2), Sage INT, Sdept CHAR(15));

Page 12: 第三章 关系数据库 标准语言- SQL

12

3.2 数据定义

【例 2】向 Student表增加“入学时间”列,其数据类型为日期型。

解: ALTER TABLE Student ADD DATE;【例 3】删除关于学号必须取唯一值的约束。 解: ALTER TABLE Student DROP UNIQUE(Sno);【例 4】为 Student表按学号升序建立唯一索引。 解: CREATE UNIQUE INDEX Stusno ON Student(Sno);【例 5】删除 Student表的 Stusno索引。 解: DROP INDEX Stusno;

Page 13: 第三章 关系数据库 标准语言- SQL

13

第三章 关系数据库标准语言- SQL

3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图

Page 14: 第三章 关系数据库 标准语言- SQL

14

3.3 查询

数据库查询是数据库的核心操作, SQL 语句提供了 SELECT 语句进行数据库的查询。该语句具有灵活的使用方式和丰富的功能,尤其是目标列表达式和条件表达式,可有多种选择形式。学会灵活应用 SELECT 语句组成不同形式的查询块,是掌握 SQL 的关键。SELECT 语句格式

一个完整的 SELECT 语句包括五个子句,其中前两个子句是必不可少的,其他子句可以省略。

Page 15: 第三章 关系数据库 标准语言- SQL

15

3.3 查询

格式如下: SELECT [DISTINCT] <目标列表达式 > 序列 FROM < 基本表名或视图名 > 序列 [WHERE < 行条件表达式 >] [GROUP BY < 列名 1> [HAVING < 组条件表达式

>]] [ORDER BY < 列名 2> [ASC∕DESC]];

Page 16: 第三章 关系数据库 标准语言- SQL

16

3.3 查询SELECT 语句执行过程:

根据 WHERE子句的行条件表达式,从 FROM子句指定的基本表或视图中找出满足条件的元组,再按 SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。

如果有 GROUP 子句,则将结果按 <列名 1> 的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录。通常会在每组中进行聚合操作。若 GROUP 子句带 HAVING 短语,则只有满足指定条件的组才给予输出。

SELECT [DISTINCT] < 目标列表达式 > 序列FROM < 基本表名或视图名 > 序列 [WHERE < 行条件表达式 >] [GROUP BY < 列名 1> [HAVING < 组条件表达式>]][ORDER BY< 列名 2>[ASC∕DESC]]

SELECT [DISTINCT] < 目标列表达式 > 序列FROM < 基本表名或视图名 > 序列 [WHERE < 行条件表达式 >] [GROUP BY < 列名 1> [HAVING < 组条件表达式>]][ORDER BY< 列名 2>[ASC∕DESC]]

Page 17: 第三章 关系数据库 标准语言- SQL

17

3.3 查询

如果有 ORDER 子句,则结果表还要按 <列名 2>的值的升序或降序排序。SQL 的查询语句,很容易看成是关系代数的表达式。 SELECT子句指定作投影运算,当 FROM子句指出多个关系时,则表示要做笛卡尔积运算, WHERE子句指定做选择运算,当查询要求做关系代数的自然连接时,则不仅要在 FROM子句中给出多个关系,还必须在 WHERE子句的条件中包含自然连接的条件。

Page 18: 第三章 关系数据库 标准语言- SQL

18

3.3 查询

下面通过实例来讨论 SELECT 的使用方法。假设已建立三个表:

学生表 S(S#,SN,SE,SA,SD) 课程表 C(C#,CN,PC#,CR) 选修表 SC(S#,C#,G)1. 简单查询 用 SELECT 语句实现投影运算与选择运算,一般只用到 SELECT 语句的一个查询块:

Page 19: 第三章 关系数据库 标准语言- SQL

19

3.3 查询

SELECT <目标列表达式 > FROM 表名 WHERE < 行条件表达式 >投影运算对应于 SELECT子句,其变化方式主要表现在 SELECT子句的 <目标列表达式 >上。而选择运算对应于 WHERE子句,可通过不同的 <行条件表达式 >,查询满足要求的元组。大多数情况下,投影与选择运算是混合出现的。

Page 20: 第三章 关系数据库 标准语言- SQL

3.3 查询【例 1】查询全体学生的姓名,学号,所在系。 解: SELECT SN , S#, SD FROM S ;【例 2】查询考试成绩不及格的学生的学号。 解: SELECT DISTINCT S# FROM SC WHERE G < 60; 【例 3】查询计算机系或信息系年龄在 20 岁以下的学生姓名。 解: SELECT SN FROM S WHERE (SD=‘计算机’ OR SD=‘信息’ ) AND SA <

20;

Page 21: 第三章 关系数据库 标准语言- SQL

21

3.3 查询2.排序查询 通过 SELECT语句中的 ORDER BY子句,可以控制查询结果的显示顺序。 ORDER BY子句对指定的一个或多个属性列,可按升序(ASC)或降序(DESC)重新排列。

【例4】查询选修了C810号课程的学生的学号及成绩 ,查询结果按分数的降序排列。

解: SELECT S# , G FROM SC WHERE C# =‘C810’ ORDER BY G DESC ;

Page 22: 第三章 关系数据库 标准语言- SQL

22

3.3 查询

3.使用聚合函数 聚合函数用于实现数据统计功能,SQL提供了许多聚合函数,主要包括:

COUNT([DISTINCT/ALL]*) 统计元组个数 COUNT([DISTINCT/ALL]<列名 >) 统计一列中值的个数 SUM([DISTINCT/ALL]<列名 >) 计算一列值的总和 AVG([DISTINCT/ALL]<列名 >) 计算一列值的平均值 MAX([DISTINCT/ALL]<列名 >) 求一列值中的最大值 MIN([DISTINCT/ALL]<列名 >) 求一列值中的最小值

Page 23: 第三章 关系数据库 标准语言- SQL

23

3.3 查询

【例 5】查询选修了课程的学生人数。 解: SELECT COUNT (DISTINCT S#) FROM SC【例 6】统计 C810号课程的学生平均成绩。 解: SELECT AVG( G) FROM SC WHERE C# =‘C810’;

Page 24: 第三章 关系数据库 标准语言- SQL

24

3.3 查询

4. 数据分组查询 使用聚合函数可以实现对关系中的所有查询的元组进行聚合运算,但在实际应用中,经常要将查询的结果分组,然后再对每个分组进行统计。这时就可以利用 SELECT 语句提供的 GROUP BY 子句和 HAVING 短语来实现分组统计。

Page 25: 第三章 关系数据库 标准语言- SQL

25

3.3 查询

【例 7】查询选修了 3门以上 4学分课程的学生的学号。 解: SELECT S# FROM SC WHERE CR =‘4’ GROUP BY S# HAVING COUNT ( *)> 3;WHERE子句与 HAVING 短语的根本区别在于作用的对象不同

WHERE 作用于基本表或视图 HAVING作用于组,从中选出满足条件的组

Page 26: 第三章 关系数据库 标准语言- SQL

26

3.3 查询

5. 表的连接查询 数据库的多个表之间一般都存在某种内在的联系,它们共同提供有用的完整的信息。因此在查询中,经常涉及到多个表的数据,这就需要进行连接查询,这是关系数据库中最主要的查询。其格式一般为:

SELECT 列名 1,列名 2,… FROM 表 1,表 2,… WHERE 连接条件

Page 27: 第三章 关系数据库 标准语言- SQL

27

3.3 查询

【例 8】查询每个学生以及选修课程的情况。 解:经分析可知,有关学生情况存储在 S表中,而选

课情况存储在 SC表中,所以此查询涉及两个表中的数据。表 S与表 SC之间的联系是通过两个表都具有的属性 S#实现的。因此,这是一个等值连接。

SELECT S.﹡, SC.﹡ FROM S , SC WHERE S.S# = SC.S# ;

Page 28: 第三章 关系数据库 标准语言- SQL

28

3.3 查询【例 9】查询选修了“ C902”号课程,且成绩高于学号为

“ BP00204018”的学生成绩的所有学生情况。 解:题目要求查询所有选修了某门课程且成绩高于另一

指定的也选修了此门课的学生成绩。要得到这个信息,首先要找到那位指定的学生成绩,然后以此为标准,再查找所有超过标准的学生。

SELECT a1.S# , a1.C# , a1.G FROM SC a1 , SC a2 WHERE a1.C# =‘C902’ AND a1.G > a2.G AND a2.S# =‘BP0020401

8’ AND a2.C# =‘C902’;

a1和 a2是为 SC定义了两个不同的别名 ,相当于对 SC表作自身连接

a1和 a2是为 SC定义了两个不同的别名 ,相当于对 SC表作自身连接

Page 29: 第三章 关系数据库 标准语言- SQL

29

3.3 查询6. 嵌套查询 当一个查询是另一个查询的条件时,需要用嵌套查询来实现。嵌套查询可以使用几个简单的查询块构造功能强大的复合命令,且结构清晰。

【例 10】查询与陈莉同年龄的所有学生。 解:完成这个查询可以首先确定陈莉的年龄,然后再查

找所有与她同龄的学生。 SELETE S# , SN , SA FROM S WHERE SA IN (SELETE SA FROM S WHERE SN =‘陈莉’ );

Page 30: 第三章 关系数据库 标准语言- SQL

30

3.3 查询

嵌套查询引出子查询的概念,子查询分为三种 :(1) 简单子查询:子查询只执行一次,其结果用于父查询,子查询的查询条件不依赖于父查询。子查询与父查询之间的连接 :

若返回单值 (不论单表或多表 ),用比较运算符 若返回多值 ,用 >ANY,<ALL,IN和 NOT IN等与查询条件一起构造返回一组值的子查询。

(2)相关子查询:子查询的查询条件依赖于外层父查询的某个属性值,子查询反复执行。

Page 31: 第三章 关系数据库 标准语言- SQL

31

3.3 查询

【例 11】查询选修了课号为“ C108”且成绩高于该课程平均分的学生成绩表,并由高到低排序。

解: 1)在 SC中求 C108的平均分 (这是子查询返回单值 ,且只执行一次 )

2)在 SC中求高于平均分的成绩表 (这是主查询 ) SELETE S# , C# , G FROM SC WHERE C# =‘C108’ AND G > (SELETE AVG(G) FROM SC WHERE C# =‘C108’) ORDER BY G DESC ;

这是简单子查询这是简单子查询

Page 32: 第三章 关系数据库 标准语言- SQL

32

3.3 查询

【例 12】查询其成绩比该课程平均成绩高的学生成绩表。 解:在 SC中被学生选修的课程不止一门,对每门课程

都要计算平均分,然后再找出成绩高于平均分的学生成绩表。程序的执行过程如下:

主查询: SELETE S# , C# , G FROM SC WHERE G > (待查学生所选课程的平均分 ) 子查询: SELETE AVG(G) FROM SC WHERE C# = ( 主查询待选行的课程号 C#)

扫描 SC:→ Record1 … …唤醒子查询,把 Record1的 C# 传给子查询 ,子查询根据主查询的 C#,计算C#的平均分并送回主查询。

Page 33: 第三章 关系数据库 标准语言- SQL

33

3.3 查询

最后得到: SELETE S# , C# , G FROM SC a WHERE G > (SELETE AVG(G) FROM SC b WHERE a.C# = b.C#)

理解这个相关子查询的关键是别名,出现在主查询和子查询的 FROM 语句中,这样同一个表相当于两个表。

这是相关子查询

这是相关子查询

Page 34: 第三章 关系数据库 标准语言- SQL

34

3.3 查询

(3)带 EXIST测试的子查询: EXIST代表存在量词 Ǝ ,用在 WHERE 中,后面跟子查询,构成一个条件。当子查询返回值至少有一个时,条件为真 (‘T’) ;否则条件为假 (‘F’) 。

【例 12】查询与‘刘晨’选修了同样课程的学生学号和姓名。

分析: 1)在 S中找出刘晨的 S#; 2)在 SC中找出刘晨所选的课程; 3)在 SC中找出与刘晨选修了同样课程的学生 S#; 4)在 S中找出相对应的 SN。

刘晨不止选修一门课

刘晨不止选修一门课

与刘晨选修同样课程的学生不止一个与刘晨选修同样课程的学生不止一个

Page 35: 第三章 关系数据库 标准语言- SQL

35

3.3 查询

由第 1)、 2)步得到: SELETE C# FROM SC WHERE EXIST (SELETE * FROM S WHERE SC.S# = S.S# AND SN =‘刘晨’ )

扫描 SC:→ Record1 用 S#与 S连接 ,看是否刘晨选修 ,若是则放入结果表 .

→Record2 用 S#与 S连接 , … … 全部扫描完 ,找出一组刘晨选修的课 .

扫描 SC:→ Record1 用 S#与 S连接 ,看是否刘晨选修 ,若是则放入结果表 .

→Record2 用 S#与 S连接 , … … 全部扫描完 ,找出一组刘晨选修的课 .

Page 36: 第三章 关系数据库 标准语言- SQL

36

3.3 查询

由第 3)、 4)步得到: SELETE S#, SN FROM S WHERE EXIST (SELETE * FROM SC WHERE S.S# = SC.S# AND C# IN

扫描 S:→ Record1 用 S#与 SC连接 , 看这个学生是否选修了课程 ,且选修的课程与刘晨相同 ,若是则放入结果表 .

→Record2 用 S#与 SC连接 , … …

扫描 S:→ Record1 用 S#与 SC连接 , 看这个学生是否选修了课程 ,且选修的课程与刘晨相同 ,若是则放入结果表 .

→Record2 用 S#与 SC连接 , … …

Page 37: 第三章 关系数据库 标准语言- SQL

37

3.3 查询解 : SELETE S# , SN FROM S a1 WHERE EXIST (SELETE * FROM SC b1 WHERE a1.S# = b1.S# AND C# IN (SELETE C# FROM SC b2 WHERE EXIST (SELETE * FROM S a2 WHERE b2.S#=a2.S# AND a2.SN=‘ 刘

晨’ )))

Page 38: 第三章 关系数据库 标准语言- SQL

38

第三章 关系数据库标准语言- SQL

3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图

Page 39: 第三章 关系数据库 标准语言- SQL

39

3.4 数据更新1.插入数据 SQL 用 INSERT 命令向表中输入数据,有两种方式 : 插入单个元组 INSERT INTO < 表名 > [< 列名表 >] VALUES (元组值 ) 插入子查询结果

INSERT INTO < 表名 > [< 列名表 >] 子查询

Page 40: 第三章 关系数据库 标准语言- SQL

40

3.4 数据更新

2. 删除数据 SQL 用 DELETE 命令删除表中的行,格式为: DELETE

FROM < 表名 > [WHERE <条件表达式 >]该命令只删除表的数据,不删除表的定义。而DROP命令则不但把表的内容删除,还把表的结构也一同删除。

Page 41: 第三章 关系数据库 标准语言- SQL

41

3.4 数据更新

3. 修改数据 UPDATE < 表名 > SET < 列名 >=< 表达式 >[,< 列名 >=< 表达式>]… [WHERE <条件表达式 >]该命令可修改某一元组值,也可修改多个元组值,也可把子查询嵌入 UPDATE 语句中,构造修改的条件。

Page 42: 第三章 关系数据库 标准语言- SQL

42

3.4 数据更新【例1】将一个记录 (BP00204008,陈莉 ,女 ,18,信息 )插入S中 . 解: INSERT INTO S VALUES (‘BP00204008’,‘陈莉’ ,‘女’ ,18,‘信

息’ );【例2】将学生 BP00204001的年龄改为21岁。 解: UPDATE S SET SA = 21 WHERE S# =‘BP00204001’;【例3】删除所有的学生选课记录。 解: DELETE FROM SC;

Page 43: 第三章 关系数据库 标准语言- SQL

43

第三章 关系数据库标准语言- SQL

3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图

Page 44: 第三章 关系数据库 标准语言- SQL

44

3.5 视图

视图是一个虚表,就像一个窗口,透过它可以看到 DB中自己感兴趣的数据及其变化。视图一经定义就像基本表一样被查询、删除,也可在一个视图上再定义新视图,但视图的更新操作则有一定的限制。

Page 45: 第三章 关系数据库 标准语言- SQL

45

3.5 视图

1. 定义视图 CREATE VIEW < 视图名 >[( 列名表 )] AS <子查询语句 > [WITH CHECK OPTION]2. 删除视图 DROP VIEW < 视图名 >3. 更新视图 可以用 INSERT , DELETE , UPDATE 三类操作。

Page 46: 第三章 关系数据库 标准语言- SQL

46

3.5 视图【例 1】建立信息系学生的视图,并要求进行修改和插

入操作时仍保证该视图只有信息系学生。解: CREATE VIEW 信息 _S AS SELECT S# , SN , SA FROM S WHERE SD =‘信息’ WITH CHECK OPTION ; 由于在定义信息 _S视图时加上了 WITH CHECK OPTION 子句,以后对视图进行插入,修改和删除等操作时, DBMS会自动加上 SD =‘信息’的条件。

Page 47: 第三章 关系数据库 标准语言- SQL

47

3.5 视图【例 2】建立信息系选择了 9801 号课程的学生视图。 解: CREATE VIEW 信息 _9801(S# , SN , G) AS SELECT S.S# , SN , G FROM S , SC WHERE SD =‘信息’ AND S.S# = SC.S# AND SC.C# =‘9801’;

由于视图信息 _9801的属性列中包括了 S关系与 SC关系的同名列 S#,所以必须在视图名后面明确说明视图的各个属性列名。

Page 48: 第三章 关系数据库 标准语言- SQL

48

3.5 视图

视图不仅可以建立在一个或多个基本表上,也可以建立在 一个或多个已定义好的视图上,或同时建立在基本表与视 图上。【例 3】建立信息系选修了 9801 号课程且成绩在 90分以上

的学生视图。 解: CREATE VIEW 信息 1_9801 AS SELECT S# , SN , G FROM 信息 _9801 WHERE G >= 90;

Page 49: 第三章 关系数据库 标准语言- SQL

49

3.5 视图

【例 4】将学生学号及平均成绩定义为一个视图。 解: CREATE VIEW S_G AS SELECT S# , AVG(G) FROM SC GROUP BY S#;【例 5】删除视图‘信息 _9801’。 解: DROP VIEW 信息 _9801;

Page 50: 第三章 关系数据库 标准语言- SQL

50

3.5 视图

4. 查询视图 视图定义后,用户就可以像对基本表进行查询一样对 视图进行查询了。【例 6】在信息系学生视图中找出年龄小于 20的学生。 解: SELETE S# , SA FROM 信息 _S WHERE SA < 20 DBMS执行此查询时,将其与信息 _S视图定义中的子查 询结合起来,转换成对基本表 S的查询。

Page 51: 第三章 关系数据库 标准语言- SQL

51

3.5 视图

修正后的查询语句为: SELETE S# , SA FROM S WHERE SD =‘信息’ AND SA < 20;

Page 52: 第三章 关系数据库 标准语言- SQL

52

第三章结束 第三章结束