第3章计算机数据库SQL语言_第1页
第3章计算机数据库SQL语言_第2页
第3章计算机数据库SQL语言_第3页
第3章计算机数据库SQL语言_第4页
第3章计算机数据库SQL语言_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

章关系数据库标准语言SQL语言W

主要内容

■3.1SQL概述

■3.2查询语句

■3.3更新语句

■3.4SQLDDL

■3.5SQLDCL

■3.6视图

■3.7嵌入式SQL(*)

i

3.1SQL木既述

一、SQL的发展及现状

二、SQL数据库的体系结构

三、SQL的功能

四、SQL的形式

五、SQL的特点

2

3.1SQL概述.

一、SQL的发展及现状

-1974年,由Boyce和Chamber]in提出

-1975^1979,IBMSanJoseResearchLab的关系数据库管理系统原型

SystemR实施了这种语言

-SQL-86是第一个SQL标准

-SQL-89、SQL-92(SQL2)>SQL-99(SQL3)、SQL-2003

-大部分DBMS产品都支持SQL,成为操作数据库的标准语言

19702007

3.1SQL概述

、SQL数据库的体系结构

内模式

SQL语言支持的关系数据库的三级模式结构4

3.1SQL概述

、SQL数据库的体系结构

基本概念:

内模式

1、用户可以用SQL语言对视图(View)和基本表(Base

Table)进行查询等操作,在用户观点里,视图和表一样,

都是关系。

2、视图是从一个或多个基本表中导出的表,本身不存

储在数据库中,只有其定义,可以将其理解为一个虚表。

3、基本表是本身独立存在的表,每个基本表对应一个

存储文件,一个表可以带若干索引,存储文件及索引组

成了关系数据库的内模式。

5

3.1SQL概述河&

三、SQL的功能

■数据定义(DDL)

定义、删除、修改关系模式(基本表)

定义、删除视图(View)

定义、删除索引(Index)

-数据操纵(DML)

数据查询

数据增、册h改

■数据控制(DCL)

用户访问权限的授予、收回

6

3.1SQL概述

四、SQL的组成(分类)

DATABASE

TABLE

CREATEVIEW

INDEX

DDL:

ALTER

DROP

SQLQUERY:SELECT...FROM...

INSERT...

SQLDML:1UPDATE...

DELETE...

GRANT

SQLDCL:<REVOKE

AUDIT

l嵌入式SQL:

7

3.1SQL木既述

五、SQL的形式

■交互式SQL

■一般DBMS都提供联机交互工具

95010198

95020190

用户可直接键入SQL命令对95020278

95020168

数据库进行操作95010248

41

由DBMS来进行解释、国Results/

Querybatchcompleted.lExectime:0:00:00~~ferows1103.Cd20

■嵌入式SQL

■能将SQL语句嵌入到高级语言(宿主语言)

使应用程序充分利用SQL访问数据库的能力、宿主语言的过程

处理能力

一般需要预编译,将嵌入的SQL语句转化为宿主语言编译器能处

理的语句

8

3.1SQL木既述

六、SQL的特点

1.高度非过程化的语言:用户只需提出“干什么”,至于

“怎么干”由DBMS解决;用户只需要早查询语句中提出需

要什么,DBMS即可按路径存取,并把结果返回给用户。

2.面向集合的语言:每一个SQL的操作对象是一个或多个关系,操作的结

果也是一个关系。

3.一种语法结构,两种使用方式:即可独立使用,又可嵌入到宿主语言中使

用,具有自主型和宿主型两种特点。

4.具有查询、操作、定义和控制四种语言一体化的特点。它只向用户提供

一种语言,但该语言具有上述多种功能,且每种操作只需一种操作符。

3.1SQL概述

5.语言简洁、易学易用:核心功能只有9个动词,语法简单,

接近英语。

SQL功能动词

数据库查询SELECT

数据定义CREATE,DROP,ALTER

数据操纵INSERT,UPDATE,DELETE

数据控制GRANT,REVOKE

10

3.1SQL木既述

(-)数据类型

1、字符型:CHAR(n),VARCHAR

2、数字型:INT,SMALLINT,REAL...

3、日期型:DATE,TIME

(二)函数

1.数字函数:

ABS(X),SQRT(X),RAND(X),LOG(X),...

2.字符函数:

LENGTH(X$),LOWER(X$),UPPER(X$),

SUBSTRING(e孙start,length)...

3.分组函数:COUNT(*),MAX(X),MIN(X),AVG(X),SUM(X)

ii

3.1SQL概述

(三)运算符

1.句法操作符:&

2.数值操作符:…

3.逻辑操作符:=,>,<,W,三,W,IN,ANY,ALL,...

4.查询表达式操作符:UNION,...

5.其它操作符:…

3.2查询语句

数据查询是数据库应用的核心功能

基本结构

SelectAnA2,…,An

FromR15R25…,Rm

WhereP

Zjr■・・,可9。&XR2

13

3.2查询语句

■查询语句格式(P72)

SELECT[ALL|DISTINCT][表名.]{*|列名|表达式[AS新列名]}

[INTO:主变量1[,:主变量2]…]

FROM表名[表别名],...

[WHERE条件表达式|子查询]

[GROUPBY列名1,...

[HAVING分组表达式]]

[{UNION|INTERSECT|EXCEPT}SELECT...FROM..J

[ORDERBY列名|列序号[ASC|DESC],…];

14

3.2查询语句

SELECT…FROM常用语句执行过程

SELECT...投影

FROM...TABLE―内存

WHERE...选取元组

GROUP...分组

HAVING...选择分组

[{UNION|...查徇结果的集

合运算

SELECT...①〜⑤

ORDERBY⑦排序输出

15

3.2查询语句

查询主要分类

一、单表查询

二、连接查询

多表连接查询、单表连接查询、

外连接查询、复合条件连接查询.

三、嵌套查询

返回单个值的子查询

返回一组值的子查询

多重子查询

16

3.2查询语句

一、单表查询

1.选择表中的列

2.选择表中的行

3.分组与组函数

4.排序

・■,,人/5P(R&X...X/?m))

SelectA19A29…,An

FromRpR?,…,Rm

17

3.2查询语句

一、单表查询

1.选择表中的列(投影)

例1.求学生所在系及姓名

SELECTSdept,SnameFROMStudent

例2.求学生的全部信息

SELECTSno,Sname,Sage,SdeptFROMstudent

18

3.2查询语句河&

例3.查全体学生的姓名、出生年份和所有系,要求用

小写字母表示所有系名

SELECTSname,,YearofBirth:,,

2010-sage,LOWER(Sdept)

FROMStudent;

SELECTSnameNAME,JYearofBirth:?BIRTH,

2010-sageBIRTHDAY,

LOWER(Sdept)DEPARTMENT

FROMStudent;

19

3.2查询语句

尔雾风比祜IQ)XSELECTSnameNAME.YearofBirth:'BIRTH.

gXKF(sa)▼201。-sageBIRTHDAY,

LOWERtSdept)DEPARTMENT

JXKFFROMStudent:

+Uhotel

+jianan<L

1+Umaster

UmodelNAMEBIRTHEiIRTHD&YDEPARTMENT

田Utnsdb]李伟YearofBirth:1989管理学院

王UNorthwind2刘明旭YearofBirth:1987管理学院

田Upubs3杨婷YearofBirth:1990管理学院

,+Jstudent4王海亮YearofBirth:1988管理学院

[+■Utempdb5YearofBirth:1986文法学院

国Utest6欧阳克YearofBirth:1985文法学院

一J公用对象7李连杰YearofBirth:1990体育学院

$

_j配置函数(刘娟YearofBirth:1989管理学院

,游标函数

1+g朱红YearofBirth:1991管理学院

1+_J日期和时间函

出张兰YearofBirth:1990管理学院

[+'-J数学函数

20

3.2查询语句

2.选择表中的行(选择运算)

1)消除重复行:DISTINCT(缺省为ALL)

例:求选修了课程的学生号

SELECTDISTINCTSnoFROMSC

2)选满足一定条件的行:

Where子句----运算符

•比较:V、<=>>、>=、=、<>>not+〜

•确定范围:

BetweenAandB、NotBetweenAandB

•确定集合:IN、NOTIN

•字符匹配:LIKE,NOTLIKE

•空值:ISNULL>ISNOTNULL

•多重条件:AND、OR、NOT

21

3.2查询语句

求计算机学院年龄小于19的姓名及年龄

SELECTSname,Sage

FROMStudent

WHERESdept二,计算机,ANDSage<19;

•例:求年龄在18〜22(含18,22)之间的学生名及年龄(或

不在18〜22之间)

•SELECTSname,Sage

•FROMStudent

•WHERESageBETWEEN18AND22;

•(WHERESage>=18ANDSage<=22);

•(WHERESageNOTBETWEEN18AND22);

•(WHERESage<18ORSage>22);

22

3.2查询语句

3)查询条件来自集合:

•用INorNOTIN

•例:求人力系、会计系、电商系的系名、学生名(或不是这些

系的学生)

•SELECTClass,SnameFROMStudentWHERE

ClassIN。人力」会计;电商)

•(WHEREClass/人力'ORClass—会计'ORClass/电商')

•SELECTClass,SnameFROMStudentWHEREClassNOT

IN(‘人力’J会计「电商');

•(WHEREClass!/人力'CRCa";住计'ORClass!/电商')

23

3.2查询语句

4)字符匹配:

Where子句----Like

[NOT|LIKE,匹配串'[ESCAPE,换码字符']

:表示任意长度伫0的任意字符

:表示单个的任意字符

匹配串中‘换码字符'(转义符)之后的字(%,_),被定义为普通

字符(不作通配符用)

•例1:列出课程名称中带有的课号及课名。

-Selecteno,cname

-FromCourse

-WherecnameLIKEa%\_%9escape'\'

24

3.2查询语句

•例2:求课程名中有'数据库'的课程记录

-SELECT*

-FROMCourse

-WHERECnoLIKE,%数据库%,;

•例3:求倒数第三、四个汉字为'系统’的课程名

SELECTCname

FROMCourse

*

WHERECnameLIKE,%系统9

•例4:求以'DATA_BASE,开头且倒数第五个字符为'S,的课

程名

-SELECTCname

-FROMCourse

-WHERECnameLIKE

'DATA'BASE%S'ESCAPE'、';25

3.2查询语句

5)涉及空值的查询

例:查缺少成绩的学生的学号和相应的课程号

SELECTSno,Cno

FROMSC

WHEREGradeISNULL;

26

3.2查询语句

3、分组与组函数

GroupBy子句

将查询结果集按某一列或多列的值分组,值相等的为一组,一

个分组以一个元组的形式出现

-只有出现在GroupBy子句中的属性,才可出现在Select子

句中

例:统计各系学生的人数。

Selectsdept,count(*)asstucount

FromStudent

GroupBysdept

27

32查询语句。

­组函数的使用:

•COUNT([DISTINCT|ALL]*囱」名)

•SUM([DISTINCT|ALL]列名)

•AVG([DISTINCT|ALL]列名)

•MAX([DISTINCT|ALL]列名)

•MIN([DISTINCT|ALL]列名)

•组函数可用于SELECT子句中的目标列表中,或在HAVING子

句的分组表达式中用作条件。

•对分出的每一组用HAVING进行筛选,筛选条件要用到组函数。

•注意:除了count(*),使用Count(列名)函数或者其他统计函数将

忽略空值。

•Distinct在count函数可以用于去除重复值,而在其他函数中则

没有意义28

3.2查询语句消

例1:查询各个课程号与相应的选课人数

SELECTCno,COUNT(Sno)FROMSCGROUPBYCno;

例2:查男女生人数

SELECTsex,COUNT(Sno)COUNTSNOFROMstudentGROUP

BYsex;

例3:求选修了课程的学生人数

SELECTCOUNT(DISTINCTSno)FROMSC;

例4:求选修各门课的人数及平均成绩

SELECTCno,COUNT(Sno),AVG(ALLGR)FROMSCGROUPBY

Cno;

例5:求选修课程在2门以上且都及格的学生号及总平均分

SELECTSno,AVG(ALLGrade)FROMSCGROUPBYSno29

HAVINGCOUNT(Cno)>2ANDMIN(Grade)>=60;29

3.2查询语句

Having与Where的区别

Where决定哪些元组被选择参加运算,作用

于关系中的元组

Having决定哪些分组符合要求,作用于分组

30

3.2查询语句.

4、排序

用ORDERBY子句对查询结果按照一个或多个列的值进行升

/降排列输出,升序为ASC;降序为DESC,空值将作为最大

值排序

;号升序排列

;SELECTSno,GradeFromSCWHERECno=C5'ORDER

;BYGradeDESC,SnoASC;

i

:例2:求每个学生的总分并按总分降序排列,学号升序

!SELECTSno,SUM(ALLGrade)astgFROMSC

!GROUPBYSnoORDERBYtgDESC,SnoASC

i

I31

I______________________________________________________________________

3.2查询语句

•COMPUTE函数的使用(用于汇总满足条件

元组在指定列的信息)

•Selectsc.sno,eno,gradefromsc,studentwhere

eno-cOOTandsc.sno=student.snoandsdept='

管理学院,computeavg(grade)

m

ono名zrade

2003001cOOl85

2003002cOO180

2003003cOO175

2003004cOO160

2003008cOOl56

sooaoodoOO1BT

200301OcOO176

7Q

3.2查询语句

•查询管理学院学生各门课程的平均分

•Selectsc.sno9cno5gradefromsc,studentwhere

sc.sno=student.snoandsdept='管理学院'

orderbyenocomputeavg(grade)byeno

Selectsu.sno.exxo..grade£=SC-su.sno-vxdeirft:.sno

ooiripi_rtea7Mgradecno|

E

snoenoghade

[2003001cOOl85

g2003002cOOl30

74

srtoenograde

I2003008cOO287

P2003004cOO290

|79

snoenograde

k2003001cOO391

\91

srrocrxo£rade

2003008cOO485

3.2查询语句

Compute与Groupby的区别

Groupby生成单个结果集,选择列表只能

包含分组列和聚合函数(分组函数)

Compute生成多个结果集,一个结果集中

包含每个组的明细行信息,另一个结果集中

包含组的聚合信息。选择列表可包含除分组

列或聚合函数外的其他表达式。同时,聚合

函数在compute子句中指定,而不是在选择

列中。

35

3.2查询语句

二、连接查询

多表连接查询、单表连接查询(自连接)、外连接查询、

复合条件连接查询.

示例数据表:

学生信息表Student;课程信息表Course;选课情况

表SC,教师信息表teacher

36

3.2查询语句

1、多表连接

1)连接条件一

[表名L]列名1比较运算符[表名2.]列名2

2)连接条件二

[表名L]列名1BETWEEN[表名2.]列名2

AND[表名2.]列名3

■连接条件中的列名称为连接字段,其各

字段应是可比的。

37

河&

3.2查询语句

执行过程:

在表1中找到第一个元组,然后从头开始扫描表2,查找到

满足条件的元组即进行串接并存入结果表中;再继续扫描表2,

依次类推,直到表2末尾。再从表1中取第二个元组,重复上述

的操作,直到表1中的元组全部处理完毕。

student

SC学号课程号学萧矗

学号学生姓名所属系名学生年龄snoCno

snoSnameSdeptSagestucentlClA

AstucentlC2A

student1Bcs20stucentlC3A

student2Ccs21stucentlC5B

student3DMaA19stucent2ClB

student4E19stucent2C2C

studentsMA20・・・♦••

38

3.2查询语句

求选课情况,要求输出学号、姓名、课程名与成绩

SELECTstudent,sno,Sname,Cname,Grade

FROMStudentS,CourseC,SC

WHERES.Sno=SC.SnoANDC.Cno=SC.Cno;

39

河&

3.2查询语句

2、单表连接(自连接)

用表别名把一个表定义为两个不同的表进行连接。

求每门课的间接先修课名(即先修课的先修课)

SELECTFIRST.Cno,THIRD.Cname

FROMCorseFIRST,CourseSECOND,CourseTHIRD

WHEREFIRST.CPno二SECOND.CnoAND

SECOND.CPno=THIRD.Cno

40

3.2查询语句

3、外连接

在连接条件的某侧加上(*)或(+),表示该侧所对应的表中可形成一个

各数据项均为空值的万能替代行,用来与另一侧对应的表中所有不满足条

件的元组进行连接。外连接符(*)或(+)出现在左侧称为右外连接、出现

在右侧称为左连接、两侧都出现的称为全外连接。

求各部门名及职工名,要求输出

无职工的部门(职工以空值出现)

SELECTDNAME,TNAMEFROMdepartmentD,teacherT

WHERED.DNO=T.DNO(*);

41

求各部门名及职工名,要求输出

未分配部门的职工(部门以空值出现)

SELECTDNAME,TNAMEFROM

departmentD,teacherT

WHERED.DNO(*)=T.DNO;

42

求各部门名及职工名,要求输出

无职工的部门和未分配部门的职工

SELECTDNAME,TNAMEFROM

departmentD,teacherT

WHERED.DNO(*)=T.DNO(*);

注意,在sqlserver中,Leftjoin左外连接

Rightjoin右外连接,Fulljoin全外连接

43

3.2查询语句3.2

SELECTDNAME,TNAMEFROMdepartmentDleftjointeacherT

onD.DNO=T.DNO

SELECTDNAME,TNAMEFROMdepartmentDrightjointeacher

T

onD.DNO=T.DNO

SELECTDNAME,TNAMEFROMdepartmentDfulljointeacherT

onD.DNO=T.DNO

44

3.2查询语句W

4、复合条件连接

WHERE子句中除了连接条件,还有其它限制条件。

例1:求选修'C6,课程且成绩超过90分的学生名与成绩

SELECTSname,Grade

FROMstudent,SC

WHEREstudent.sno=SC.snoANDSC.Cno='C6‘

/IANDSC.Grade>90;-Z

45

3.2查询语句

三、嵌套查询

在SELECT...FROM...WHERE语句结构的

WHERE子句中可嵌入一个SELECT语句块

其上层查询称为外层查询或父查询

其下层查询称为内层查询或子查询

SQL语言允许使用多重嵌套查询

在子查询中不允许使用ORDERBY子句

嵌套查询的实现一般是从里到外,即先进行

子查询,再把其结果用于父查询作为条件

46

:八嵌套查询

1、返回单个值的子查询:

例1:求与‘刘力'同一个学院的学生名,年

一:

SELECTSname,SageFROMstudentWHERESdept

(SELECTsdeptFROMstudentWHERESname=,刘力');

方法二:

SELECTFIRST.Sname,FIRST.SageFROMStudent

FIRST,StudentSECOND

WHEREFIRST.Sdept=SECOND.SdeptANDSECOND.Sname二

‘刘力’;

三、嵌套查询

2、返回一组值的子查询:

例1:求选修'C6,课程且成绩超过90分的学生

方法一:SELECT*FROMstudentWHEREsnoIN

(SELECTsnoFROMSCWHERECno='C6'ANDGrade>90

方法二(连接查询):

SELECTstudent.*

FROMstudent,SC

WHEREStudent.Sno=SC.Sno

ANDGrade>90

ANDCno='C6';

求比计算机系中某一学生年龄小的其他系的学

方法一:

SELECT*FROMstudentWHEREsdept!='CS'AND

sage(SELECTSageFROMStudentWHERE

Sdept='CS');

方法二:

SELECT*

FROMStudent

WHERESdept!='CS'

ANDSage

(SELECTMAX(Sage)

FROMStudent

WHERESdept'CS');

49

3.2查询语句

3、多重子查询:

求D01部门中工资与国贸系中任一职工相同

的职工和工资

Teacher(tno,tname5salary5dno)

Department(dno,dname)

50

SELECTTname,Salary

FROMTeacher

WHEREDno=TOF

ANDsalaryIN

(SELECTsalary

FROMteacher

WHEREDno=

(SELECTDNO

FROMdepartment

WHEREDnamei国贸,));

求工资介于‘张三'与'里司'

SELECT*

FROMteacher

WHERESalary>=

(SELECTMIN(Salary)

FROMteacher

WHERETnameIN('张三,J里司,))

ANDSalary<=

(SELECTMAX(Salary)

FROMteacher

WHERETnameIN('张三'」里司/

3.2查询语句

四、带有EXISTS的相关子查询

不相关子查询:子查询的查询条件不依赖于

父查询的称为不相关子查询。

相关子查询:子查询的查询条件依赖于外层父

查询的某个属性值的称为相关子查询

(CorrelatedSubquery),带EXISTS的子查询就

是相关子查询

EXISTS表示存在量词

带有EXISTS的子查询不返回任何记录的数据,

只返回逻辑值'True9或'False9

53

求所有选修了'CP课程的学生名。

不相关子查询:

SELECTSnameFROMstudentWHEREsnoINSELECT

snoFROMSCWHERECno=6CU);

相关子查询:

SELECTSnameFROMstudent

WHEREEXISTS

(SELECT*

FROMSC

WHERE

student.sno=SC.sno

ANDCno=©');

54

河&

相关子查询执行过程:

先在外层查询中取student表的第一个元组(记录),用该

记录的

相关的属性值(在内层WHERE子句中给定的)处理内层查询,若

外层的WHERE子句返回'TRUE,值,则此元组送入结果的表中。然

后再取下一个元组;重复上述过程直到外层表的记录全部遍历

一次为止。

SC

student学号课程号学习成绩

学号学生姓名所属系名学生年龄

snoSnameAMESdeptSagestucentlCl

studentlCS20stucentlC2

student2CS21stucentlC3

studentsMA19stucentlC5

student4CI19stucent2Cl

studentsMA20stucent2C2

55

说明:

不关心子查询的具体内容,因此用SELECT*,

Exists+子查询用来判断该子查询是否返回元组

当子查询的结果集非空时,Exists为"True

当子查询的结果集为空时,Exists为"False

NOTEXISTS:若子查询结果为空,返回'TRUE,值,

否则返回'FALSE,

56

列出没有选Cl课程的学生的学号、姓名

SELECTsno,Sname

FROMstudent

WHERENOTEXISTS

(SELECT*

FROMSC

WHEREstudent.sno=SC.sno

ANDCno=6CP);

57

查询选修了所有课程的学生的姓名

SELECTSname这样的课是不存在作

FROMstudent

O

WHERENOTEXISTS

(SELECT*这门课他没选

FROMCourseo°

WHERENOTEXISTS

(SELECT*

FROMSC

WHEREstudent.sno=SC.sno

ANDCourse.Cno=SC.Cno))•

查询至少选修了S1所选的全部课程的学生名曲

SELECTSname

FROMstudent

WHERENOTEXISTS

(SELECT*

FROMSCSCX

WHERESCX.sno=6sU

ANDNOTEXISTS

(SELECT*

FROMSCSCY

WHEREstudent.sno=SCY.sno

ANDSCX.Cno=SCY.Cno));

59

在FROM语句中使用子查询,对查询结果定义表

名及列名

例:求平均成绩超过80分的学号及平均成绩

1.SELECTSno,AVG_GFROM(SELECT

Sno,AVG(Grade)FROMSC

GROUPBYSno)AS

RA(Sno,AVG_G)WHEREAVG_G>80;

2.SELECTsno,AVG(Grade)

FROM

GROUPBYsno

HAVINGAVG(Grade)>80

五、SQL的集合操作

-属性个数必须一致

-对应的类型必须一致

-属性名无关

-最终结果集采用第一个结果的属性名

-缺省为自动去除重复元组

-除非显式说明ALL

■OrderBy放在整个语句的最后

SQL的集合操作——并

例L查询计算机系的学生年龄不大于19岁的学生,

并按年龄倒排序。

SELECT*

FROMstudent

WHERESdept='CS"

SELECT*

FROMstudent

WHEREAGE<=19

ORDERBYAGEDESC

62

SQL的集合操作——交

例2:查询计算机系的学生年龄不大于19岁的学生,

并按年龄倒排序。

(SELECT*

FROMstudent

WHERESdept='CS')

INTERSECT

(SELECT*

FROMstudent

WHEREAGE<=19)

ORDERBYAGEDESC

63

SQL的集合操作——差

例3:查询选修课程1但没有选修课程2的学生。

SELECTSname,Sdept

FROMstudent

WHEREsnoIN

((SELECTsno

FROMSC

WHERECno=P)

EXCEPT

(SELECTsno

FROMSC

WHERECno=?2'))

•注意:SQL92中支持并交差运算,但不同的数

据库产品对此支持是不同的,在使用前需要

查询使用说明.

•Sqlserver2000中支持并的操作.

65

3.3更新语句

一、插入操作INSERT

二、删除操作DELETE

三、修改操作UPDATE

66

、插入操作

1、插入单个元组:

格式:INSERTINTO表名[(列名1,…)]

VALUES(列值1,…);

■插入一已知元组的全部列值

■插入一已知元组的部分列值

67

■插入一已知元组的全部列值

新增一个学生信息

INSERTINTOstudent

VALUES('2003001「陈冬18「男电商

'管理学院',,徐州');

■插入一已知元组的部分列值

新增一条选课记录

INSERTINTOSC(Sno,Cno)

VALUES('2003001','C003');

68

•、插入操作

2、插入子查询的结果:

格式:INSERTINTO表名[(列名1,…)

(子查询);

设关系S_G(Sno,AVG_G),把平均成绩大于

80的男生的学号及平均成绩存入S_G中。

需要先建立SG表

69

INSERTINTOS_G(sno,AVG_G)

(SELECTsno,AVG(GRADE)

FROMSC

WHERESnoIN

(SELECTSno

FROMStudent

WHERESEX'男,)

GROUPBYSno

HAVINGAVG(GRADE)>80);

Selectsno,snameintostudent!fromstudent

创建表并插入数据70

、删除操作

格式:DELETEFROM表名

[WHERE条件];

■只能对整个元组操作,不能只删除某些属性上

的值

■只能对一个关系起作用,若要从多个关系中删

除元组,则必须对每个关系分别执行删除命令

■从关系夕中删除满足条件的元组,只是删除数据,

而不是定义

71

二、删除操作

1、删除单个元组:

删除学号为‘2003009"的学生。

DELETEFROMSC

WHEREsno=2003009';

DELETEFROMstudent

WHEREsno='2003009

72

:、删除操作

2、删除多个元组:

例2:删除选课但无成绩的学生的选课信息

DELETEFROMSC

WHEREGRADEIsNULL;

DELETEFROMSC清空SC表

73

河&

二、删除操作3.5

3、带子查询的删除语句:

删除选修'C004,且成绩小于该课程的平均成绩的1

DELETEFROMSC

WHERECno=6C0045ANDGrade<

(SELECTAVG(GRADE)

FROMSC

WHERECno=6C004O;

74

、修改操作

格式LUPDATE表名[别名]

SET列名=表达式,•••

[WHERE条件];

格式2:UPDATE表名[别名]

SET(列名,…)=(子查询)

[WHERE条件];

75

三、修改操作

1、修改单个元组的值:

把名为MARTIN的职工的工种改为MANAGER,

工资增加收入20%,

UPDATEEMPLOYEE

SETJ0B=6MANAGER\Salary=Salary*1.2

WHERENAME='MARTIN';

76

三、修改操作

2、修改多个元组的值:

例2:将所有学生的年龄增加1岁

UPDATEstudent

SETSage=Sage+l;

77

河&

三、修改操作

3、带子查询的修改语句:

工种为SALESMEN的职工的工资改为工种平均

工资的no%。

UPDATEEMPLOYEE

SETSalary=(SELECT1.UAVG(Salary)

FROMEMPLOYEEWHERE

JOBiSALESMEN')

WHEREJOB'SALESMEN';

78

三、修改操作

3、带子查询的修改语句:

管理学院全体学生成绩上浮10%

UPDATESC

SETGRADE=GRADE*1.10,

WHEREsnoIN

(SELECTsno

FROMstudent

WHERESdepti管理学院,);

79

三、修改操作

4、修改操作与数据库的一致性

UPDATE语句一次只能操作一个表。

例:学号为020011的学生休学一年,复学后需要将其学号改为

030011?

Student表和SC表都有020011的信息,两表都修改,一般这种修

改只能通过两条UPDATE语句进行。(假设student与sc之间

没有参照完整性约束)

第一条UPDATE语句:UPDATEStudentSETsno='030011'

WHEREsno二020011'

第二条UPDATE语句:UPDATESCSETsno=,030011'

WHEREsno二020011

80

问题:执行第一条UPDATE语句之后,数据库中的数据是否一致?

情况如下:

此时student中已没有0200H的学生

SC表中仍记录着020011学生的选课信息,数据的完整性和一致性

受到破坏,只有执行第2条UPDATE语句之后,数据才重新处

于一致状态。

假设执行完一条语句之后,机器突然出现故障,无法再继续执

行第二条UPDATE语句,则数据库中的数据将永远处于不一

致状态。因此必须保证这两条UPDATE语句要么都做,要么

都不做。

解决方法:事务(Transaction),我们将在后面章节介绍。

本题可以通过在student与sc之间设置参照完整性约束,强制级

联删除和更新.

3.4数据定义

一、定义基本表CREATETABLE

二、删除基本表DROPTABLE

三、修改基本表ALTERTABLE

四、定义索引CREATEINDEX

五、删除索引DROPINDEX

82

、定义基本表

格式:CREATETABLE表名

(列名类型(长度)[NOTNULL]

[DEFAULT{常量|系统变量|NULL}]

[列约束],……)

[PRIMARYKEY(列名,…)]

[FOREIGNKEY(列名,…)

REFERENCES表名(列名,…)]

[CHECK条件];

83

例:建立学生student、课程Course、

个表

student

表:

CREATETABLEstudent

(snoCHAR(6)primarykeyNOTNULL,

SnameCHAR(8)NOTNULL,

sageSMALLINT,

SdeptCHAR(10),

SEXCHAR(2)DEFAULT'男,

CHECK((SEX='男')OR(SEX二'女')))

也可以PRIMARYKEY

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论