第 3 章 数据库语言

98
3 3 第 第第第第第 第 第第第第第 第第第第第第第第第第第第1. 1. 第第第第第第第第 第第第第第第第第 第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第2. SQL 2. SQL 第第第第 第第第第 第第 第第 SQL SQL 4 4 第第第 第第第 . . 3. SQL 3. SQL 第第第第第第 第第第第第第 第第第第第第第第第第第第第第第第第第 第第第第第第第第第第第第第 第第第第第第第第第第第第第第第第第第 第第第第第第第第第第第第第 第第第第 第第第第 7 7 第第第第第第

description

第 3 章 数据库语言. 本章学习要求:. 1. 数据库的用户接口 了解什么是数据库的用户接口? 数据库语言与宿主语言的区别。. 2. SQL 语言概况 了解 SQL 的 4 大功能. 3. SQL 数据定义语言 了解基表和视图的概念以及各种数据类型。掌握基表模式的定义和修改基表模式的 7 条命令。. 4. SQL 查询语言 掌握最常用最基本的查询语句的定义和应用。. 5. SQL 中的视图 了解视图的概念以及视图与基表的区别;掌握视图的定义和操作。. 6 .嵌入式 SQL - PowerPoint PPT Presentation

Transcript of 第 3 章 数据库语言

Page 1: 第 3 章 数据库语言

第第 33 章 数据库语言 章 数据库语言

本章学习要求:本章学习要求: 1.1. 数据库的用户接口数据库的用户接口 了解什么是数据库的用户接口?了解什么是数据库的用户接口? 数据库语言与宿主语言的区别。数据库语言与宿主语言的区别。

2. SQL2. SQL 语言概况语言概况 了解了解 SQL SQL 的的 44 大功能大功能 ..

3. SQL3. SQL 数据定义语言数据定义语言 了解基表和视图的概念以及各种数据类型。掌了解基表和视图的概念以及各种数据类型。掌握基表模式的定义和修改基表模式的握基表模式的定义和修改基表模式的 77 条命令。 条命令。

Page 2: 第 3 章 数据库语言

4. SQL4. SQL 查询语言查询语言 掌握最常用最基本的查询语句的定义和应用。掌握最常用最基本的查询语句的定义和应用。

5. SQL5. SQL 中的视图中的视图 了解视图的概念以及视图与基表的区别;掌握视了解视图的概念以及视图与基表的区别;掌握视图的定义和操作。 图的定义和操作。 66 .嵌入式.嵌入式 SQLSQL 掌握嵌入式掌握嵌入式 SQLSQL 解决四个问题的手段。 解决四个问题的手段。

Page 3: 第 3 章 数据库语言

3.1 3.1 数据库的用户接口数据库的用户接口 DBMSDBMS 提供提供操作命令操作命令和和语言语言,使用户能够,使用户能够对数据库进行各式各样的操作,例如查询、对数据库进行各式各样的操作,例如查询、增、删、改数据,定义、修改数据模式等增、删、改数据,定义、修改数据模式等——— ——— 这就构成了用户和数据库的接口。 这就构成了用户和数据库的接口。 DBMSDBMS 所提供的语言一般局限于对数据库的所提供的语言一般局限于对数据库的操作,有别于计算完备的程序设计语言,称操作,有别于计算完备的程序设计语言,称为为数据库语言数据库语言(( database languagedatabase language )。)。

Page 4: 第 3 章 数据库语言

过程性语言过程性语言——以关系代数为基础设计——以关系代数为基础设计出的数据库语言。即用户不但要说明需要什出的数据库语言。即用户不但要说明需要什么数据,而且还要说明获得这些数据的过程么数据,而且还要说明获得这些数据的过程。。 非过程性语言非过程性语言——用户只要说明需要的——用户只要说明需要的数据,而如何获得这些数据则不必由用户说数据,而如何获得这些数据则不必由用户说明,而由系统来实现。明,而由系统来实现。

Page 5: 第 3 章 数据库语言

层次层次和网状网状数据库的语言一般都是过程性都是过程性的,而关系关系数据模型的抽象级别较高,比较简单,且有明确的数学定义。用户只须了解逻辑模式,不必关心物理存储的细节,这就为设计非过程非过程关系数据库语言提供了良好的基础。

SQLSQL 语言是非过程关系数据库语言。 语言是非过程关系数据库语言。 它将描述操作过程的麻烦由用户转嫁给了系它将描述操作过程的麻烦由用户转嫁给了系统统 !!

Page 6: 第 3 章 数据库语言

数据库语言本身不是计算完备的语言,不能用数据库语言本身不是计算完备的语言,不能用来独立编制应用程序。目前常用方法是将数据库语来独立编制应用程序。目前常用方法是将数据库语言嵌入到一种高级程序设计语言中(如言嵌入到一种高级程序设计语言中(如 CC )。这种)。这种高级程序设计语言称为数据库语言的高级程序设计语言称为数据库语言的宿主语言宿主语言。。

数据库语言与宿主语言的区别:数据库语言与宿主语言的区别: 数据库语言是非过程性语言,是数据库语言是非过程性语言,是面向集合面向集合的语言的语言,主要用于,主要用于访问数据库访问数据库;; 宿主语言是过程性语言,主要用于宿主语言是过程性语言,主要用于处理数据处理数据。。

Page 7: 第 3 章 数据库语言

3.2 SQL3.2 SQL (( Structured Query Language)Structured Query Language) 语言概况语言概况

SQLSQL 按其功能可分为按其功能可分为 44 大部分:大部分:1 1 数据定义语言(数据定义语言( DDLDDL )) 用于定义、撤消和修改数据模式用于定义、撤消和修改数据模式 ,, 如表、视图、如表、视图、索引; 索引; 2 2 查询语言(查询语言( QLQL )) 用于查询数据; 用于查询数据; 3 3 数据操作纵语言(数据操作纵语言( DMLDML )) 用于增、删、改数据; 用于增、删、改数据; 4 4 数据控制语言(数据控制语言( DCLDCL ))用于数据访问权限的控制。 用于数据访问权限的控制。

Page 8: 第 3 章 数据库语言

3.3 SQL3.3 SQL 数据定义语言 数据定义语言

关系称为表,是关系数据库的基本组成单位。在SQL 中,表分为两种:

基表 (base table)-- 数据显式地存储在数据库中。 视图 (view) 视图是个虚表。仅有逻辑定义,可根据其定义由其它表(视图)导出,但不作为一个表显式地存储在数据库中。视图可像基表一样,参与各种数据库操作。

Page 9: 第 3 章 数据库语言

( 2)临时视图 对于较复杂的查询,可将查询中相对独立部分作为查询的中间结果,定义为临时视图。 临时视图在功能上与普通视图一样,但仅用于附在临时视图定义后的查询语句中。该查询语句结束后,临时视图随之自行消失。

( 1)普通视图

Page 10: 第 3 章 数据库语言

一般 SQL 都支持的数据类型见表 3-1。

Page 11: 第 3 章 数据库语言

3.3.2 3.3.2 基表模式的定义基表模式的定义 定义基表模式语句的格式见图 3-1 所示。

图中椭圆形框中的内容是关键字;

方框中的内容是非终极符;

圆圈中的内容是终极符。

Page 12: 第 3 章 数据库语言

非终极符

终极符

此列不得设置为空

列值不得重复

当此列的值空缺时,填以缺省值

定义外键来自的表名,即主表名

引用完整性检查,主表中被引用的主键删除时用

关键字

Page 13: 第 3 章 数据库语言

SET NULL------该列应无 NOT NULL 说明

RESTRICT------凡被基表引用的主键,不得删除; 加下划线表示为 ON DELETE的缺省项 CASCADE------- 如主表中删除了某一主键,则基表 中引用此主键的行也被删除

ON DELETE ON DELETE 的三个选项:的三个选项:

Page 14: 第 3 章 数据库语言

例 3-1 定义 STUDENT(学生), COURSE(课程 ),SC (选课)三个基表。

( SNO CHAR(7) NOT NULL, SNAME VARCHAR(8) NOT NULL, SEX CHAR(2) NOT NULL, BDATE DATE NOT NULL, HEIGHT DEC(5,2) DEFAULT 000.00, PRIMARY KEY (SNO));

CREATE TABLE STUDENTSTUDENT /* 建立学生表 */

““;”;” 不是不是 SSQLQL 语句的一部分语句的一部分,而是命令结束,而是命令结束符符

Page 15: 第 3 章 数据库语言

CREATE TABLE COURSECOURSE/* 建立课程表 * /(CNO CHAR(6) NOT NULL, LHOUR SMALLINT NOT NULL, CREDIT DET(1,0) NOT NULL, SEMESTER CHAR(2) NOT NULL, PRIMARY KEY (CNO));

Page 16: 第 3 章 数据库语言

CREATE TABLE SCSC /* 建立选课基表 */(SNO CHAR(7) NOT NULL,CNO CHAR(6) NOT NULL,GRADE DEC (4,1) DEFAULT NULL ,PRIMARY KEY (SNO , CNO) ,FOREIGN KEY (SNO) REFERENCES STUDENT ON DELETE CASCADE,FOREIGN KEY (CNO) REFERENCES COURSE ON DELETE RESTRICT);

外键来自 STUDENT表

如主表中删除了某一主键,则加此选项的基表中引用此主键的行也随之删除

凡是被基表引用的主键,不得删除

Page 17: 第 3 章 数据库语言

3.3.3 3.3.3 基表模式的修改基表模式的修改 SQL 提供 7种修改基表模式的命令: 1. 增加列ALTER TABLE [<表的创建者名 >.]<表名 > ADD < 列名 ><类型 >;注: [ ] 内为任选项。如果用户本身就是被修改的表的创建者,则可略去表的创建者名,否则不可略去。

Page 18: 第 3 章 数据库语言

注: SQL未提供删除列的命令。(为什么?)

2.删除基表 DROP TABLE <表名 >;

若要删除列,只有另定义一个新表,并将原来表中要保留的列的内容复制到新表中,然后删除原表。最后还得用重命名命令把新表改为原表名。

Page 19: 第 3 章 数据库语言

3.补充定义主键 如果原表以前未定义主键,需要时可利用此命令补充定义主键。

ALTER TABLE <表名 > ADD PRIMARY KEY ( .< 列名表 >)

Page 20: 第 3 章 数据库语言

4 .撤消主键定义

一般情况下,一个基表如果已定义了主键,则系统会在主键上自动建立索引。当插入新行时 ,系统会进行主键唯一性检查,这样,当进行大量的插入操作时,势必影响系统效率。 下面命令暂时撤消主键。

ALTER TABLE <表名 > DROP PRIMARY KEY ;

Page 21: 第 3 章 数据库语言

5 .补充定义外键ALTER TABLE <表名 -1> ADD FOREIGN KEY [< 外键名 >]( < 列名表 >) REFERENCES <表名 -2> [ON DELETE { RESTRICT | CASCADE |SET NULL}];

花括号表示三项中任选一项。有横线表示缺省项。

Page 22: 第 3 章 数据库语言

6 .撤消外键定义

由于定义外键后,须作引用完整性检查,这会影响系统性能,因此, SQL 提供了撤消外键的命令,必要时可暂时撤消。

ALTER TABLE <表名 > DROP < 外键名 >;

Page 23: 第 3 章 数据库语言

7 .定义和撤消别名

CREATE SYNONYM < 标识符 > FOR <表的创建者 >.{<表名 >|<视图名 >};

DROP SYNONYM < 标识符 >;

Page 24: 第 3 章 数据库语言

3.3.4 3.3.4 索引的建立和撤消索引的建立和撤消

索引的建立和撤销语句的格式如图 3-2 所示 .

Page 25: 第 3 章 数据库语言

在图 3-2(a) 中, UNIQUE是可选项;如果加了UNIQUE,则每个索引属性值只能对应一个元组,即此索引属性是主键或候补键。图 3-2(a) 中的列名就是指索引属性。如果列名后加 ASC ,表示索引属性按升序排列;如果列名后加 DESC ,表示索引属性按降序排列。例 : CREATE INDEX H_INDEX ON STUDENT ( HEIGHT ); 即:对 STUDENT 文件建立以 HEIGHT为索引值的 索引文件。

Page 26: 第 3 章 数据库语言

CREATE UNIQUE INDEX SC_INDEX

ON SC (SNO DESC, CNO ASC); 即:对选课文件 SC 按学号属性降序、按课程号属性升序建立索引文件。

Page 27: 第 3 章 数据库语言

3.4 SQL3.4 SQL 查询语言查询语言

3.4.1 3.4.1 基本基本 SQLSQL 查询语句查询语句

SQL 查询语句的具体形式见图 3-3 。

Page 28: 第 3 章 数据库语言
Page 29: 第 3 章 数据库语言

SELECT——指出要查询的项目,通常指列名或表达式,是必需的。FROM——指明被查询的表或视图名,是必需的。

WHERE ——说明查询条件,是任选的。

GROUP BY——将表按列的值分组,是任选的。 ORDER BY——将查询结果排序,是任选的。

3.4.1 3.4.1 基本基本 SQLSQL 查询语查询语言言

Page 30: 第 3 章 数据库语言

3.4.2 3.4.2 查询条件比较复杂的查询条件比较复杂的 SQLSQL 查询语查询语句句

Page 31: 第 3 章 数据库语言

例 3-2 查询 STUDENT、 COURSE、 SC三表的全部内容。

语句: SELECTSELECT * FROMFROM STUDENT;

Page 32: 第 3 章 数据库语言

查询结果为: SNO SNAME SEX BDATE HEIGHT

9309203 欧阳美林 女 1975-6-3 1.62

9208123 王义平 男 1974-8-20 1.71

9104421 周远行 男 1973-7-16 1.83

9309119 李维 女 1976-8-10 1.68

9209120 王大力 男 1973-10-20 1.75

Page 33: 第 3 章 数据库语言

语句: SELECTSELECT * FROMFROM COURSE;查询结果为:

CNO LHOUR CREDIT SEMESTER

CS-110 60 3 秋CS-201 80 4 春CS-221 40 2 秋EE-122 106 5 秋EE-201 45 2 春

Page 34: 第 3 章 数据库语言

语句: SELECTSELECT * FROMFROM SC查询结果为:

SNO CNO GRADE

9309203 CS-110 82.59309203 CS-201 809309203 EE-201 759208123 EE-122 919208123 EE-201 839104421 EE-201 1009104421 CS-110 919309119 CS-110 729309119 CS-201 659209120 CS-221  

Page 35: 第 3 章 数据库语言

例 3-3 查询所有女学生的身高(以厘米表示)。语句:语句: SELECTSELECT SNAME, 100*HEIGHT SNAME, 100*HEIGHT

FROMFROM STUDENT STUDENT WHEREWHERE SEX=’ SEX=’ 女’; 女’;

SNAME 100*HEIGHT

欧阳美林 162

李维 168

查询结果为:

Page 36: 第 3 章 数据库语言

补充补充 11 ::检索学习课程号为检索学习课程号为 CS-221CS-221 的学生学号与姓的学生学号与姓名。名。这个查询要从两个关系中检索数据,因而有多种写法。这个查询要从两个关系中检索数据,因而有多种写法。

第一种写法(联接查询):第一种写法(联接查询): SELECT STUDENT.SNO,SNAMESELECT STUDENT.SNO,SNAME FROM STUDENT,SCFROM STUDENT,SC WHERE STUDENT.SNO=SC.SNOWHERE STUDENT.SNO=SC.SNO AND CNO=‘CS-221’AND CNO=‘CS-221’

Page 37: 第 3 章 数据库语言

该语句执行时,要对该语句执行时,要对 STUDENTSTUDENT和和 SCSC做笛卡尔做笛卡尔积操作。由于积操作。由于 SNOSNO在在 STUDENTSTUDENT和和 SCSC 中都出现,因中都出现,因此引用此引用 SNOSNO 时需注明关系名,例如时需注明关系名,例如 STUDENT.SNOSTUDENT.SNO。。

Page 38: 第 3 章 数据库语言

第二种写法(嵌套查询):第二种写法(嵌套查询): SELECT SNO , SNAMESELECT SNO , SNAME FROM STUDENT FROM STUDENT WHERE SNO WHERE SNO ININ ( ( SELECTSELECT SNO SNO FROMFROM SC SC WHEREWHERE CNO=‘CS-221’) CNO=‘CS-221’)

谓词谓词

Page 39: 第 3 章 数据库语言

嵌套的子查询中嵌套的子查询中 SELECTSELECT语句在外层查询处理语句在外层查询处理之前求解。之前求解。 即:先在表即:先在表 SCSC 中求出选修课程中求出选修课程 CS-221CS-221 的的 SNOSNO,再在,再在 STUDENTSTUDENT表中根据表中根据 SNOSNO 值求出值求出 SNAMESNAME 值。值。 注:注:当查询涉及多个关系时,用嵌套查询当查询涉及多个关系时,用嵌套查询逐次求解层次分明,具有结构程序设计特点,并逐次求解层次分明,具有结构程序设计特点,并且且嵌套查询的执行效率也比联接查询的笛卡儿效嵌套查询的执行效率也比联接查询的笛卡儿效率高率高。。

Page 40: 第 3 章 数据库语言

第三种写法;(使用存在量词的嵌套查询)第三种写法;(使用存在量词的嵌套查询)

SELECTSELECT SNO , SNAME SNO , SNAME FROMFROM STUDENT STUDENT WHEREWHERE EXISTSEXISTS ( ( SELECTSELECT * * FROMFROM SC SC WHEREWHERE SC.SNO=STUDENT.SNO SC.SNO=STUDENT.SNO ANDAND CNO=‘CS-221’) CNO=‘CS-221’)

存在量词存在量词

EXISTSEXISTS 是存在量词 是存在量词 ,表示内层查询结果非空。,表示内层查询结果非空。

Page 41: 第 3 章 数据库语言

例例 3-4 3-4 查询查询 19761976 年出生的学生名及其秋季所修年出生的学生名及其秋季所修课程的课程号及成绩。课程的课程号及成绩。

此题的查询条件:此题的查询条件: 19761976年出生, 秋季 年出生, 秋季

此题的查询内容:此题的查询内容:学生名,课程号,成绩学生名,课程号,成绩 语 句:语 句: SELECTSELECT SNAME, COURSE.CNO, GRADE SNAME, COURSE.CNO, GRADE FROMFROM STUDENT, COURSE, SC STUDENT, COURSE, SC WHEREWHERE STUDENT.SNO=SC.SNO STUDENT.SNO=SC.SNO ANDAND SC.CNO=COURSE.CNO SC.CNO=COURSE.CNO ANDAND YEAR(BDATE)=1976 YEAR(BDATE)=1976 ANDAND SEMESTER SEMESTER =’秋’;=’秋’;

Page 42: 第 3 章 数据库语言

SNO SNAME SEX BDATE HEIGHT

9309203 欧阳美林 女 1975-6-3 1.62

9208123 王义平 男 1974-8-20 1.71

9104421 周远行 男 1973-7-16 1.83

9309119 李维 女 1976-8-10 1.68

9209120 王大力 男 1973-10-20 1.75

Page 43: 第 3 章 数据库语言

CNOCNO LHOURLHOUR CREDITCREDIT SEMESTERSEMESTER

CS-110CS-110 6060 33 秋秋

CS-201CS-201 8080 44 春春

CS-221CS-221 4040 22 秋秋

EE-122EE-122 106106 55 秋秋

EE-201EE-201 4545 22 春春

SNOSNO CNOCNO GRADEGRADE

93092039309203 CS-110CS-110 82.582.593092039309203 CS-201CS-201 808093092039309203 EE-201EE-201 757592081239208123 EE-122EE-122 919192081239208123 EE-201EE-201 838391044219104421 EE-201EE-201 10010091044219104421 CS-110CS-110 919193091199309119 CS-110CS-110 727293091199309119 CS-201CS-201 656592091209209120 CS-221CS-221   

Page 44: 第 3 章 数据库语言

查询结果为:查询结果为:

SNAMESNAME CNOCNO GRADEGRADE

李维李维 CS-110CS-110 7272

Page 45: 第 3 章 数据库语言

例例 3-53-5 查询秋季学期有一门以上课程获查询秋季学期有一门以上课程获 9090 分分以上成绩的以上成绩的学生名学生名。。

语句:语句: SELECTSELECT SNAME SNAME

FROMFROM STUDENT STUDENT WHEREWHERE SNO SNO ININ (( SELECTSELECT SNO SNO FROMFROM SC SC WHEREWHERE GRADE GRADE >= >= 90.090.0 ANDAND CNO CNO ININ (( SELECTSELECT CNO CNO FROMFROM COURSE COURSE WHEREWHERE SEMESTERSEMESTER==‘‘ 秋’秋’ ))

););

谓词谓词

Page 46: 第 3 章 数据库语言

查询结果为:查询结果为:

SNAMESNAME

王义平王义平

周远行周远行

Page 47: 第 3 章 数据库语言

集合成员资格比较:集合成员资格比较:

(集合 1) ININ(集合 2)(集合 1) NOT INNOT IN(集合 2)

集合 1与集合 2可以是一个 SELECT 子查询,或是值的集合,但它们的结构相同。ININ操作表示操作表示:如果集合 1中每个元素都在集合 2内,那么其逻辑值为 true ,否则为 false;NOT IN NOT IN 操作表示操作表示:如果集合 1中某个元素不在集合 2内,那么其逻辑值为 true ,否则为 false;

Page 48: 第 3 章 数据库语言

例例 3-63-6 查询只有一人选修的查询只有一人选修的课程号课程号。。

语句:语句:SELECTSELECT CNO CNO FROMFROM SC SCX SC SCX WHEREWHERE CNO CNO NOT INNOT IN ((SELECTSELECT CNO CNO FROMFROM SC SC WHEREWHERE SNO <> SCX.SNO); SNO <> SCX.SNO);

别名别名

不同层次上对同一个表查询,为区别起见,不同层次上对同一个表查询,为区别起见,外层上的表取了别名外层上的表取了别名 SCXSCX。。

Page 49: 第 3 章 数据库语言

查询结果为: 查询结果为:

CNOCNO

CS-221CS-221

EE-122EE-122

Page 50: 第 3 章 数据库语言

例例 3-7 3-7 查询选修查询选修 CS-110CS-110 课程的课程的学生名学生名。。语句:语句:SELECTSELECT SNAME SNAME FROMFROM STUDENT ,SC STUDENT ,SC WHEREWHERE STUDENT.SNO = SC.SNO STUDENT.SNO = SC.SNO ANDAND CNO = ‘CS-110’CNO = ‘CS-110’; ; 查询结果为:查询结果为:

SNAMESNAME

欧阳美林欧阳美林

周远行周远行

李维李维

Page 51: 第 3 章 数据库语言

例例 3-8 3-8 查询学生的查询学生的平均身高平均身高。。

查询结果为:查询结果为:

AVG(HEIGHT)AVG(HEIGHT)

1.721.72

语句:语句: SELECTSELECT AVG(HEIGHT) AVG(HEIGHT) FROMFROM STUDENT; STUDENT;

聚合函数聚合函数

Page 52: 第 3 章 数据库语言

例例 3-9 3-9 查询缺成绩的查询缺成绩的学生名学生名及及课程号课程号。。

语句:语句: SELECTSELECT SNAME, CNO SNAME, CNO FROMFROM STUDENT, SC STUDENT, SC WHEREWHERE STUDENT.SNO=SC.SNO STUDENT.SNO=SC.SNO ANDAND GRADE GRADE IS NULLIS NULL;;

查询结果为:查询结果为: SNAMESNAME CNOCNO

王大力王大力 CS-221CS-221

Page 53: 第 3 章 数据库语言

补充:补充:查询至少选修课程号为查询至少选修课程号为 CS-110CS-110和和 CS-201CS-201 的的学生学号。学生学号。

语句:语句: SELECTSELECT X.SNO X.SNO

FROMFROM SC SC AS AS X,SC X,SC ASAS Y Y WHEREWHERE X.SNO=Y.SNO X.SNO=Y.SNO ANDAND X.CNO=‘CS-110’ X.CNO=‘CS-110’ ANDAND Y.CNO=‘CS-201’ Y.CNO=‘CS-201’;;

别名别名

同一个关系同一个关系 SCSC 在一层中出现两次,为了区别,引在一层中出现两次,为了区别,引入别名入别名 XX,, YY,也可看成定义了两个元组变量,也可看成定义了两个元组变量 XX,, YY。在语句中应用别名加以限定。保留字。在语句中应用别名加以限定。保留字 ASAS 可省。可省。

Page 54: 第 3 章 数据库语言

SNO CNO GRADE9309203 CS-110 82.59309203 CS-201 809104421 CS-110 91

9309119 CS-110 729309119 CS-201 659209120 CS-221

 

查询结果如下:查询结果如下:

Page 55: 第 3 章 数据库语言

3.4.3 GROUP BY3.4.3 GROUP BY 和 和 ORDER BY ORDER BY 子句的应用子句的应用

GROUP BYGROUP BY 子句按列值分组。列值相同的分为一子句按列值分组。列值相同的分为一组。当其后有多个列名时,则先按第一列名分组,组。当其后有多个列名时,则先按第一列名分组,再按第二列名在组中分组,直到再按第二列名在组中分组,直到 GROUPGROUP 子句指名的子句指名的列都具有相同值的基本组,列都具有相同值的基本组, HAVINGHAVING 后的条件是选后的条件是选择基本组的条件。择基本组的条件。 ORDER BYORDER BY 子句对查询结果按指定列值排序。子句对查询结果按指定列值排序。 ASASCC 表示升序,表示升序, DESCDESC 表示降序,缺省时为升序。当有表示降序,缺省时为升序。当有多个列名时,先按第一列名排序,再按第二列名排多个列名时,先按第一列名排序,再按第二列名排序,…。序,…。

Page 56: 第 3 章 数据库语言

例例 3-10 3-10 试列出计算机系所开课程的试列出计算机系所开课程的最高成绩最高成绩、最低成绩和平均成绩、最低成绩和平均成绩。如果某门课程的成绩不。如果某门课程的成绩不全(即 全(即 GRADE GRADE 中有中有 NULLNULL 出现),则该课程不出现),则该课程不予统计,结果按予统计,结果按 CNOCNO 升序排列。升序排列。

Page 57: 第 3 章 数据库语言

语句:语句:SELECTSELECT CNO, MAX (GRADE),MIN (GRADE),AVG(GRADE) CNO, MAX (GRADE),MIN (GRADE),AVG(GRADE) FROMFROM SC SC WHEREWHERE CNO CNO LikeLike ‘CS*’ /* ‘CS*’ /* 选择计算机系所开的课程选择计算机系所开的课程 GROUP BYGROUP BY CNO /* CNO /*按按 CNO CNO 分组分组 ** HAVINGHAVING CNO CNO NOT INNOT IN ( (SELECTSELECT CNO /* CNO /*删去成绩不全的组删去成绩不全的组 ** FROMFROM SC SC WHERE WHERE GRADE GRADE IS NULLIS NULL)) ORDER BYORDER BY CNO; /* CNO; /*按按 CNOCNO 升序排序升序排序 **

Page 58: 第 3 章 数据库语言

查询结果为:查询结果为:

CNOCNO MAX(GRADE)MAX(GRADE) MIN(GRADE)MIN(GRADE) AVG(GRADE)AVG(GRADE)

CS-110CS-110 9191 7272 81.881.8

CS-201CS-201 8080 6565 72.572.5

注:注:加了加了 GROUP BYGROUP BY 后,后, SELECT SELECT 子句中的子句中的各值(表达式)在基本组中应是唯一的!各值(表达式)在基本组中应是唯一的!

Page 59: 第 3 章 数据库语言

3.4.4 3.4.4 包含包含 UNIONUNION 的查询 的查询

SQL 还提供了一些集合运算,如 UNION(并)、 INTERSECTION(交)、 MINUS (差)。 注:参与集合运算的两个关系必须具

有相等的目,且对应的属性域相同。

Page 60: 第 3 章 数据库语言

例例 3-11 3-11 查询查询 19731973 年出生的年出生的学生学生和选修电和选修电机工程系所开课程(机工程系所开课程( EEEE 标志)的学生的标志)的学生的学号学号。。

UNIONUNION SELECTSELECT SNO SNO FROMFROM SC SC WHEREWHERE

CNO=‘EE*’;CNO=‘EE*’;

语句:语句: SELECTSELECT SNO SNO FROM FROM STUDENTSTUDENT WHERE WHERE YEAR(BDATE)=1973 YEAR(BDATE)=1973

注:注:做做 UNIONUNION 运算时,必须消除结果的重复项。运算时,必须消除结果的重复项。

Page 61: 第 3 章 数据库语言

思考题:查询秋季学期有思考题:查询秋季学期有 22 门以上课程获门以上课程获 9090分以上成绩的学生名。分以上成绩的学生名。

Page 62: 第 3 章 数据库语言

3.5 SQL3.5 SQL 数据操纵语言 数据操纵语言

SQLSQL 提供了增、删、改数据库中数据的语提供了增、删、改数据库中数据的语句,分别介绍如下。句,分别介绍如下。

3.5.1 INSERT 3.5.1 INSERT 语句 (增加一个元组语句 (增加一个元组)) 格式如图格式如图 3-53-5 所示,用来在一个表中 所示,用来在一个表中 插入一个元组。插入一个元组。

Page 63: 第 3 章 数据库语言
Page 64: 第 3 章 数据库语言

例例 3-12 3-12 在在 STUDENTSTUDENT 表中表中插入一个元组插入一个元组。。

语句:语句:INSERT INTOINSERT INTO STUDENT STUDENTVALUESVALUES ( ‘9309204 ’ ( ‘9309204 ’ ,‘金月明’,‘女’,‘金月明’,‘女’

,, 1976-03-04,1.60)1976-03-04,1.60) ;;注:注: VALUEVALUE 后面是要插入的元组值,其次序后面是要插入的元组值,其次序和域应与和域应与 STUDENTSTUDENT 的模式定义一致。的模式定义一致。

Page 65: 第 3 章 数据库语言

例例 3-13 3-13 在在 SCSC 表中插入一元组,成绩暂缺。表中插入一元组,成绩暂缺。

语句:语句: INSERT INTOINSERT INTO SC(SNO,CNO) SC(SNO,CNO) VALUESVALUES(‘9309204’(‘9309204’ ,‘,‘ CS-22CS-221’)1’) ; ; 插入的元组为:插入的元组为: (‘(‘ 9309204’9309204’ ,‘,‘ CS-221’CS-221’ ,, NNULLULL )。)。原表中定义原表中定义 GRADEGRADE 允许为允许为 NULLNULL 。 。

Page 66: 第 3 章 数据库语言

例例 3-14 3-14 生成一个女学生成绩临时表生成一个女学生成绩临时表 FGRADEFGRADE,表中包括,表中包括 SNAMESNAME ,, CNO,GRADECNO,GRADE 三个属性。三个属性。首先定义一个临时表首先定义一个临时表 FGRADEFGRADE ::

语句:语句: CREATE TABLECREATE TABLE FGRADE FGRADE (SNAME VARCHAR(8) NOT NULL,(SNAME VARCHAR(8) NOT NULL, CNO CHAR(6) NOT NULL,CNO CHAR(6) NOT NULL, GRADE DEC(4,1) DEFAULT NULL);GRADE DEC(4,1) DEFAULT NULL);

Page 67: 第 3 章 数据库语言

其次插入有关的数据:其次插入有关的数据: 语句:语句: INSERT INTOINSERT INTO FGRADE FGRADE SELECT SELECT SNAME, CNO, GRADESNAME, CNO, GRADE FROM FROM STUDENT,SCSTUDENT,SC WHEREWHERE STUDENT.SNO=SC.SNO STUDENT.SNO=SC.SNO

Page 68: 第 3 章 数据库语言

插入的内容为:插入的内容为:

SNAMESNAME CNOCNO GRADEGRADE

欧阳美林欧阳美林 CS-110CS-110 82.582.5

欧阳美林欧阳美林 CS-201CS-201 8080

欧阳美林欧阳美林 EE-201EE-201 7575

李维李维 CS-110CS-110 7272

李维李维 CS-201CS-201 6565

Page 69: 第 3 章 数据库语言

3.5.2 DELETE 3.5.2 DELETE 语句语句

格式如图格式如图 3-63-6 所示所示

注:注:如果没有如果没有 WHEREWHERE 子句,则删除指定表子句,则删除指定表中的所有元组,使该表为一空表。(中的所有元组,使该表为一空表。(删除整个删除整个表要用 表要用 DROP TABLEDROP TABLE 语句语句))

Page 70: 第 3 章 数据库语言

例例 3-15 3-15 从从 SCSC 表中删除表中删除 GRADEGRADE 为为 NULLNULL 的元组的元组。。语句:语句: DELETE FROMDELETE FROM SC SC WHEREWHERE GRADE GRADE IS NULLIS NULL ; ;

Page 71: 第 3 章 数据库语言

3.5.3 UPDATE3.5.3 UPDATE (更新)语句(更新)语句

格式如图格式如图 3-73-7 所示所示

Page 72: 第 3 章 数据库语言

例例 3-16 3-16 将将 CS-110CS-110 课程改成春季开出课程改成春季开出。。语句:语句: UPDATEUPDATE COURSE COURSE SETSET SEMESTER=‘ SEMESTER=‘ 春’春’ WHEREWHERE CNO=‘CS-110’ CNO=‘CS-110’ ; ;

Page 73: 第 3 章 数据库语言

例例 3-17 3-17 将将 STUDENTSTUDENT 表中的表中的 HEIGHTHEIGHT 的单位改的单位改 为厘米。为厘米。

语句:语句: UPDATE UPDATE STUDENTSTUDENT SETSET HEIGHT=100*HEIGHT; HEIGHT=100*HEIGHT;

Page 74: 第 3 章 数据库语言

视图:是由其它视图或基表导出的虚表。它不是一个存在数据库中的表,而是在数据目录中保留其逻辑定义。

当视图参与数据库操作时,可通过修改查 询条件,把对视图的查询转换为对基表的查 询。

3.6 SQL3.6 SQL 中的视图中的视图3.6.1 3.6.1 普通视图普通视图

Page 75: 第 3 章 数据库语言

视图的定义:视图的定义:

1 、用户经常要用到的一些数据;2、用户经常要查询的内容;

视图的撤消:视图的撤消: 视图不再需要时,可以从系统中撤消。视图不再需要时,可以从系统中撤消。

视图的视图的定义定义和和撤消撤消语句的格式如图语句的格式如图 3-8(a)3-8(a) 、、(b)(b) 所示。所示。

Page 76: 第 3 章 数据库语言

不能使用不能使用UNIONUNION、、ORDER BYORDER BY等等

Page 77: 第 3 章 数据库语言

例例 3-18 3-18 试定义视图试定义视图 ENROL-SPRING,ENROL-SPRING, 作为作为学生春季选课一览表,其中含有学生春季选课一览表,其中含有 SNO,SNASNO,SNAME,CNO,CREITME,CNO,CREIT 等属性。等属性。 语句:语句:CREATE VIEWCREATE VIEW ENROL-SPRING ENROL-SPRINGASAS SELECTSELECT SNO,SNAME,CNO,CREDIT SNO,SNAME,CNO,CREDIT FROM FROM STUDENT,COURSE,SCSTUDENT,COURSE,SC WHEREWHERE STUDENT.SNO=SC.SNO STUDENT.SNO=SC.SNO ANDAND COURSE.CNO=SC.CNO COURSE.CNO=SC.CNO ANDAND SEMESTER=‘ SEMESTER=‘ 春’;春’;

Page 78: 第 3 章 数据库语言

例 例 3-19 3-19 试定义一视图试定义一视图 GRADE-AVGGRADE-AVG ,表示学生的平,表示学生的平均成绩,其中包括均成绩,其中包括 SNAMESNAME 和和 AVG GRADEAVG GRADE (平均成绩)(平均成绩)两个属性。两个属性。

语句:语句:CREATE VIEWCREATE VIEW GRADE-AVG(SNAME,AVGGRADE) GRADE-AVG(SNAME,AVGGRADE)ASAS SELECTSELECT SNAME,AVG(GRADE) SNAME,AVG(GRADE) FROMFROM STUDENT, SC STUDENT, SC WHEREWHERE STUDENT.SNO=SC.SNO STUDENT.SNO=SC.SNO GROUP BYGROUP BY SNAME; SNAME;可见,视图实际上是一个 SELECT语句。

Page 79: 第 3 章 数据库语言

撤消上述两个视图 :DROP VIEWDROP VIEW ENROL-SPRING;DROP VIEWDROP VIEW GRADE-AVG;

Page 80: 第 3 章 数据库语言

注意:注意:视图对应的内容总是实时、最新的内容,并不是视图定义时对应内容。这是由于基表随着更新操作其内容在不断变化,所以视图对应的内容也在不断变化。

视图的内容是静态的,还是动态的?

Page 81: 第 3 章 数据库语言

视图的查询可像基表一样参与数据库操作,但视图的更新则最终落实到有关基表的更新。 通常情况下,由连接定义的视图是不可更新的。但如果连接定义的视图所涉及到的几个基表的主键都在视图中时,还是可以更新的。(见例 3-18)

Page 82: 第 3 章 数据库语言

此外,此外,视图更新还会存在一些语义视图更新还会存在一些语义上的问题上的问题。。

CREATE VIEWCREATE VIEW SPRING SPRINGASAS SELECTSELECT CNO,LHOUR,CREDIT CNO,LHOUR,CREDIT FROMFROM COURSE COURSE WHEREWHERE SEMESTER=‘ SEMESTER=‘ 春’; 春’;

例如:由基表例如:由基表 COURSECOURSE 定义一个春季定义一个春季所开课程的视图所开课程的视图 SPRINGSPRING 如下:如下:

Page 83: 第 3 章 数据库语言

该视图的元组虽与基表该视图的元组虽与基表 COURSECOURSE 的元组的元组存在一一对应关系,但若在视图中删除存在一一对应关系,但若在视图中删除一个元组,如:一个元组,如:DELETE FROMDELETE FROM SPRING SPRING WHEREWHERE

CNO=‘CS-20’CNO=‘CS-20’ ;;

Page 84: 第 3 章 数据库语言

这里存在一个语义问题:这里存在一个语义问题:

是是 CS-20CS-20 课程从春季开出改为秋季课程从春季开出改为秋季开出?还是开出?还是 CS-20CS-20 课程要撤消?课程要撤消? 若为前者若为前者,应修改基表的,应修改基表的 SEMESTERSEMESTER 列列,而不是删除‘,而不是删除‘ CNO=CS-20’CNO=CS-20’ 的元组;的元组;

若为后者若为后者,才必须删除‘,才必须删除‘ CNO=CS-20CNO=CS-20

’’的元组。的元组。

Page 85: 第 3 章 数据库语言

   由一个基表定义的视图,只有含有基表的主由一个基表定义的视图,只有含有基表的主键或候补键,并且视图中没有用表达式或函数定义键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新。的属性,才允许更新。

    由多表连接所定义的视图不允许更新。由多表连接所定义的视图不允许更新。 定义中用到定义中用到 GROUP BYGROUP BY 子句或聚集函数的视图子句或聚集函数的视图

不允许更新。不允许更新。

因此,视图更新是一个较复杂的问题。通常都因此,视图更新是一个较复杂的问题。通常都加以限制:加以限制:

Page 86: 第 3 章 数据库语言

视图的优点:视图的优点:

( 1)视图提供了逻辑数据独立性。视图提供了逻辑数据独立性。 在数据的整体结构或存储结构发生改变,并且这些改变与用户无关,那么原有的应用程序不必修改;当这些改变与用户有关时,也只要修改视图,至于应用程序仍可不改动或只需做少量改动。

Page 87: 第 3 章 数据库语言

( 2)简化了用户观点。简化了用户观点。 数据库的全部结构是复杂的、并有多种联系。一般用户只要用到数据库中一部分数据,而视图机制正好适应了用户的需要。视图是一个 SELECT语句定义的,用户只需关心视图的内容,而不必关心构成视图的若干关系的联接、投影操作。

Page 88: 第 3 章 数据库语言

( 3)数据的安全保护功能。数据的安全保护功能。 在数据库中,有些数据是保密的,不能让用户随便使用。此时,可针对不同的用户定义不同的视图,在视图中只出现用户需要的数据。系统提供视图让用户使用,而不是关系。这样,就达到数据的安全保护功能。

Page 89: 第 3 章 数据库语言

3.6.2 3.6.2 临时视图和递归查询临时视图和递归查询 在复杂查询中,将查询中相对独立部分在复杂查询中,将查询中相对独立部分作为查询的中间结果,定义临时视图。作为查询的中间结果,定义临时视图。

功能相同,但临时视图仅用于附在临时定义功能相同,但临时视图仅用于附在临时定义后的查询语句中;后的查询语句中; 查询语句结束,临时视图便不在存在,查询语句结束,临时视图便不在存在,不需不需用用 DROP VIEWDROP VIEW 去撤消去撤消。。 创建临时视图只需将创建临时视图只需将 CREATE VIEWCREATE VIEW 改为改为 WITHWITH。。

临时视图与普通视图的区别:临时视图与普通视图的区别:

Page 90: 第 3 章 数据库语言

递归查询的应用很多,例如查询某门课递归查询的应用很多,例如查询某门课程的先修课程等。程的先修课程等。 传统的传统的 SQLSQL 难以表示递归查询,目前难以表示递归查询,目前主要的主要的 DBMSDBMS 产品和产品和 SQL:1999SQL:1999 之后的标准之后的标准都增加了递归查询功能。都增加了递归查询功能。

Page 91: 第 3 章 数据库语言

例如:设例如:设 x,y,zx,y,z 是点,是点, ARC(x,y)ARC(x,y) 是具是具有属性有属性 x,yx,y 的基表,其中每个元组表示的基表,其中每个元组表示 xx到到 yy 的弧线。点之间可以通过弧线构成路的弧线。点之间可以通过弧线构成路径,路径可以是单个弧线,也可以是多个径,路径可以是单个弧线,也可以是多个弧线首尾相连而成。弧线首尾相连而成。

Page 92: 第 3 章 数据库语言

用用 SQLSQL 查询所有点间的路径,这是一个查询所有点间的路径,这是一个递归查询。递归查询。

设设 PATH(x,y)PATH(x,y) 是具有是具有 x,yx,y 属性的路径表属性的路径表,其中,每个元组表示,其中,每个元组表示 xx 到到 yy 的一条路经。的一条路经。

Page 93: 第 3 章 数据库语言

WITHWITH RECURSIVERECURSIVE PATH(x,y) AS PATH(x,y) AS

/*/* 通过递规定义临时视图通过递规定义临时视图 PATH(x,y)*/PATH(x,y)*/((SELECT * FROM ARC)((SELECT * FROM ARC)

UNIONUNION

(SELECT PATH.x,ARC.y FROM PATH,ARC(SELECT PATH.x,ARC.y FROM PATH,ARC

WHERE PATH.y=ARC.x))WHERE PATH.y=ARC.x))

PATHPATH 出现在出现在 PAPATHTH 定义中,属定义中,属于递归定义于递归定义

PATHPATH 初始值为空,递归初始值为空,递归到到 PATHPATH 无变化为止无变化为止

Page 94: 第 3 章 数据库语言

查询语句:查询语句:

SELECT * FROM PATHSELECT * FROM PATH

Page 95: 第 3 章 数据库语言

临时视图和普通视图一样,也可以在其临时视图和普通视图一样,也可以在其上进行较复杂的查询。可用上进行较复杂的查询。可用 WHEREWHERE 语句进行语句进行限制。限制。

限制条件应尽可能的加在临时视图中限制条件应尽可能的加在临时视图中,,因为生成临时视图的计算量要远大于查询语因为生成临时视图的计算量要远大于查询语句的计算量,而且临时视图变小了,查询语句的计算量,而且临时视图变小了,查询语句的计算量也将相应的减小。句的计算量也将相应的减小。

Page 96: 第 3 章 数据库语言

WITHWITH RECURSIVERECURSIVE PATH(x,y) AS PATH(x,y) AS

((SELECT * FROM ARC ((SELECT * FROM ARC WHERE x=‘A’)WHERE x=‘A’)

UNIONUNION

(SELECT PATH.x,ARC.y FROM PATH,ARC(SELECT PATH.x,ARC.y FROM PATH,ARC

WHERE PATH.y=ARC.x))WHERE PATH.y=ARC.x))

只取从只取从 AA 出发出发的弧线的弧线

查询从查询从 AA 点到其它点的路径。点到其它点的路径。

Page 97: 第 3 章 数据库语言

语句语句 11 :: SELECTSELECT SNAME SNAME

FROMFROM SC SC AS AS X, SC X, SC ASAS Y,STUDENT Y,STUDENT WHEREWHERE X.SNO=STUDENT.SNO X.SNO=STUDENT.SNO ANDAND X.SNO=Y.SNO X.SNO=Y.SNO ANDAND X.GRADE X.GRADE > 90> 90 ANDAND Y.GRADE>90 Y.GRADE>90 AND AND X.CNO IN (SELECT CNO FROM COUX.CNO IN (SELECT CNO FROM COU

SE WHERE SEMESTER = ‘SE WHERE SEMESTER = ‘ 秋’秋’ )) AND YAND Y.CNO IN (SELECT CNO FROM COU.CNO IN (SELECT CNO FROM COU

SE WHERE SEMESTER = ‘SE WHERE SEMESTER = ‘ 秋’秋’ ))

Page 98: 第 3 章 数据库语言

语句语句 22 :: SELECTSELECT SNAME SNAME

FROMFROM STUDENT STUDENT WHEREWHERE SNO IN SNO IN ((SELECTSELECT SNO SNO FROMFROM CS CS WHEREWHERE GRADE > 90 AND GRADE > 90 AND CNO IN (CNO IN (SELECTSELECT CNO CNO FROMFROM COUSE COUSE WHEREWHERE SEMESTER = ‘ SEMESTER = ‘ 秋’秋’ )) GROUP BYGROUP BY SNO SNO HAVINGHAVING COUNT(*)>=2) COUNT(*)>=2)