关系数据库标准语言SQL课件_第1页
关系数据库标准语言SQL课件_第2页
关系数据库标准语言SQL课件_第3页
关系数据库标准语言SQL课件_第4页
关系数据库标准语言SQL课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

计算机应用基础武汉科技大学计算机学院计算机应用基础武汉科技大学计算机学院1第十章关系数据库标准语言SQL第十章关系数据库标准语言SQL2教学目标掌握SQL修改表结构的规则与方法

;掌握SQL修改数据的规则与方法

;掌握SQL数据查询功能的语句规则和特点。重点与难点:表定义中数据完整性规则的设定、多表连接查询的方法与使用规则、在分组查询中使用函数的规则和方法、使用嵌套子查询的方法和规则、综合应用SQL数据查询功能完成实际问题的能力。

教学目标掌握SQL修改表结构的规则与方法;重点与难点:表定310.1SQL概述

10.1SQL概述4SQL是StructuredQueryLanguage的缩写,即结构化查询语言,是关系数据库的标准语言。

主要特点:⑴SQL是一种功能齐全的一体化语言。⑵SQL是一种高度非过程化的语言。⑶SQL语言简洁,易学易用。⑷语言共享。SQL是StructuredQueryL5SQL语言可以分成以下几组:●数据定义语言DDL(DataDefinitionLanguage):包括定义、修改与删除基本表及建立与删除索引等。●数据操纵语言DML(DataManipulationLanguage):包括插入、修改与删除数据等。●数据查询语言DQL(DataQueryLanguage):包括单表查询、连接查询、嵌套查询等各种查询功能。●数据控制语言DCL(DataControlLanguage):包括数据的安全性控制、数据的完整性控制、数据库的恢复及并发控制等功能。SQL语言可以分成以下几组:6

Access支持数据定义、数据查询和数据操作功能。

SQL功能命令动词数据定义

CREAT、ALTER、DROP数据操作

INSERT、DELETE、UPDATE数据查询

SELECTSQL功能命令动词数据定义CREA710.2数据定义10.2数据定义8一.创建表格式:

CREATETABLE<表名>(<字段名1><类型名>[(长度)][PRIMARYKEY][NOTNULL][,<字段名2><类型名>[(长度)][NOTNULL]]…)功能:创建一个数据表的结构。说明:●<表名>:要创建的数据表的名字。●<字段名><类型名>:要创建的数据表的字段名和字段类型。●字段长度仅限于文本及二进制字段。●

PRIMARYKEY:表示将该字段定义为主键。●

NOTNULL:不允许字段值为空,而NULL允许字段值为空。一.创建表格式:CREATETABLE<表名>功9例10.1在职工管理数据库中建立一个数据表“职工”,表结构由职工号、姓名、性别、职称、部门、出生日期、婚否等字段组成。并设置“职工号”为主键。操作步骤如下:①创建“职工管理”数据库。②在“职工管理”数据库窗口中选择“查询”对象。③双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框,打开查询设计视图窗口。④选择“查询”菜单中“SQL特定查询”下的“数据定义”命令项,打开“数据定义查询”窗口。⑤在“数据定义查询”窗口中输入SQL语句,每个数据定义查询只能包含一条数据定义语句。例10.1在职工管理数据库中建立一个数据表“职工”,表结构10CREATEDATABASE

职工管理

CREATETABLE

职工(职工号TEXT(5)

PRIMARYKEY,姓名

TEXT(4),性别TEXT(1),职称TEXT(4),部门TEXT(8),出生日期DATE,婚否LOGICAL)⑥保存查询为“数据表定义查询(职工)”,查询建立完毕。⑦运行查询。在设计视图中,单击工具栏上的“运行”按钮,执行SQL语句,完成创建表的操作。⑧在数据库窗口中单击“表”对象,可以看到在“表”列表框中多了一个“职工”表,这就是用SQL的定义查询创建的表。CREATEDATABASE职工管理11例10.2在职工管理数据库中建立一个数据表“工资”,并通过“职工号”字段建立与“职工”表的关系。

CREATETABLE工资(职工号TEXT(5)PRIMARYKEY

REFERENCES职工,工资Single,津贴Single,所得税Single,公积金Single,水电费Single,应扣Single,实发Single)其中的“REFERENCES职工”表示与“职工”表建立关系。例10.2在职工管理数据库中建立一个数据表“工资”,并通过12格式:DROPTABLE

<表名>功能:删除指定的数据表文件。说明:一定要慎用DROPTABLE语句,一旦使用以后就无法恢复表或其中的数据,此表上建立的索引也将自动删除,并且无法恢复。二.删除表格式:DROPTABLE<表名>功能:删除指定的数据13例10.3

删除例10.2建立的工资表。操作步骤如下:①打开“数据定义查询”窗口。②输入删除表的SQL语句:

DROPTABLE工资③单击工具栏上的“运行”按钮,完成删除表的操作,“工资”表将从“职工管理”数据库窗口消失。例10.3删除例10.2建立的工资表。操作步骤如下:14三、修改表的结构格式一:

ALTERTABLE<表名>[ADD<新字段名1><类型名>[(长度)][,<新字段名2><类型名>[(长度)]…]][DROP<字段名1>[,<字段名2>…][ALTER<字段名1><类型名>[(长度)][,<字段名2><类型名>[(长度)]…]]

功能:修改指定的数据表的结构。说明:●<表名>:要修改的数据表的名字。●ADD子句用于增加新的字段。●

DROP子句用于删除指定的字段。●ALTER子句用于修改原有字段的定义,包括字段名、数据类型和字段的长度。●应注意ADD子句、DROP子句和ALTER子句不能同时使用。三、修改表的结构格式一:ALTERTABLE<表名15例10.4

为职工表增加一个电话号码字段。操作步骤如下:①在“职工管理”数据库窗口中选择“查询”对象。②双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框,打开查询设计视图窗口。③选择“查询”菜单中“SQL特定查询”下的“数据定义”命令项,打开“数据定义查询”窗口。④在“数据定义查询”窗口中,输入修改表结构的SQL语句:

ALTERTABLE职工ADD电话号码Text(8)⑤单击工具栏上的“运行”按钮,完成修改表结构的操作。例10.4为职工表增加一个电话号码字段。操作步骤如下:16例10.5

将职工表的姓名字段的宽度由原来的6改为8,SQL语句如下:

ALTERTABLE职工ALTER姓名Text(8)例10.6删除职工表“电话号码”字段,SQL语句如下:

ALTERTABLE职工DROP电话号码例10.5将职工表的姓名字段的宽度由原来的6改为8,SQL1710.3数据操作10.3数据操作18一.插入记录格式:

INSERTINTO

<表名>[(<字段名清单>)]VALUES

(<表达式清单>)功能:在指定的数据表的尾部添加一条新记录。说明:●<表名>:要插入数据的表的名字。●<字段名清单>为数据表要插入新值的字段。●

VALUES(表达式清单)为数据表要插入新值的各字段的数据值。●<字段名清单>和VALUES子句中(表达式清单)的个数和数据类型要完全一致。●若省略<字段名清单>,则数据表中的所有字段必须在VALUES子句中都有相应的值。一.插入记录格式:INSERTINTO<表名>功能19例10.7

在职工表尾部添加一条新记录。操作步骤如下:①在“职工管理”数据库窗口中,打开“数据定义查询”窗口。②输入SQL语句:INSERTINTO职工(职工号,姓名,性别,职称,部门,出生日期,婚否)VALUES("01001","陈周","男","教授","计算机",#1958-03-05#,yes)③单击工具栏上的“运行”按钮,完成插入数据的操作。例10.8在职工表尾部插入第二条记录,SQL语句如下:INSERTINTO职工VALUES("03021","刘杨","女","副教授","管理",#1962-06-18#,no)例10.7在职工表尾部添加一条新记录。操作步骤如下:20格式:UPDATE

<表名>

SET

<字段名1>=表达式1

[,<字段名2>=表达式2…][WHERE<条件>]

功能:根据WHERE子句指定的条件,对指定记录的字段值进行更新。说明:●<表名>:要更新数据的表的名字。●<字段名>=<表达式>是指用<表达式>的值替代<字段名>的值,一次可更新多个字段的值。●若省略WHERE子句,则更新全部记录。●一次只能在单一的表中更新记录。二.更新数据格式:UPDATE<表名>SET<字段名1>=21例10.9

计算工资表中的应扣和实发数。①在“职工管理”数据库窗口中,打开“数据定义查询”窗口。②输入SQL语句:

UPDATE工资SET应扣=所得税+公积金+水电费,实发=工资+补贴-应扣③单击工具栏上的“运行”按钮,完成更新数据的操作。例10.9计算工资表中的应扣和实发数。22格式:

DELETEFROM

<表名>[WHERE<条件>]

功能:根据WHERE子句指定的条件,删除表中指定的记录。说明:●<表名>:要删除数据的表的名字。●若省略WHERE子句,则删除表中全部记录。●DELETE语句删除的只是表中的数据,而不是表的结构。三.删除数据例10.10

将职工表中职工号为“03021”的记录删除。①在“职工管理”数据库窗口中,打开“数据定义查询”窗口。②输入SQL语句:DELETEFROM职工WHERE职工号="03021"③单击工具栏上的“运行”按钮,完成删除数据的操作。格式:DELETEFROM<表名>[WHER2310.4数据查询10.4数据查询24一.SELECT查询命令格式:SELECT[ALL|DISTINCT|TOPn[PERCENT]]<字段名>|<字段表达式>|<函数>[,…]FROM<数据源表或查询>[WHERE<筛选条件>][GROUPBY<分组字段表>[HAVING<过滤条件>][ORDERBY<排序关键字1>[ASC|DESC][,<排序关键字2>[ASC|DESC]…]]

一.SELECT查询命令格式:25功能:

从FROM子句列出的表或查询中,选择满足WHERE子句中给出的条件的记录,然后按GROUPBY子句(分组子句)中指定字段的值分组,再提取满足HAVING子句中过滤条件的那些组,按SELECT子句给出的字段名或字段表达式求值输出。ORDERBY子句(排序子句)是对输出的目标表进行重新排序,并可附加说明ASC(升序)或DESC(降序)排列。

功能:从FROM子句列出的表或查询中,选择满26说明:●

ALL:查询的结果中包含数据源中的所有记录。●

DISTINCT:查询的结果中不包含数据源中重复行的记录。●<字段名表>:指定查询结果输出的字段,如果要包含数据源中的所有字段,可以使用通配符“*”。●

AS<列名称>:如果在输出时不希望使用原来的字段名,可以用列名称重新设置。●

FROM<数据源表或查询>:指出查询的数据来源。●WHERE<筛选条件>:说明查询条件,即选择记录的条件。二.简单查询格式:SELECT[ALL|DISTINCT]<字段名1>[AS<列名称>][,<字段名2>[AS<列名称>]…]

FROM<数据源表或查询>[WHERE<筛选条件>]1.基本查询说明:二.简单查询格式:SELECT[ALL|DIS27例10.11

查询学生表的全部字段。操作步骤如下:①在“学生成绩管理”数据库窗口中选择“查询”对象。②双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框,打开查询设计视图窗口。③选择“视图”菜单的“SQL视图”命令项,打开“选择查询”窗口。④输入SQL语句:

SELECT*FROM学生⑤保存查询,查询建立完毕。⑥运行查询。例10.11查询学生表的全部字段。操作步骤如下:28例10.12查询学生表中所有学生的姓名和截至统计时的年龄,去掉重名。SQL语句如下:SELECTDISTINCT

姓名,YEAR(DATE())-YEAR(出生日期)AS年龄FROM学生例10.13查询学生表中所有已通过四级的男生记录。SQL语句如下:SELECT*FROM学生WHERE性别="男"AND四级通过=yes例10.12查询学生表中所有学生的姓名和截至统计时的年龄,292.带特殊运算符的条件查询SELECT语句可以使用的特殊运算符有:(1)BETWEEN…AND运算符格式:<字段名>[NOT]BETWEEN<初值>AND<终值>BETWEEN运算符用于检测字段的值是否介于指定的范围内。(2)IN运算符格式:<字段名>[NOT]IN(<表达式1>[,<表达式2>…])IN运算符用于检测字段的值是否属于表达式集合或子查询。(3)LIKE运算符格式:<字段名>LIKE<字符表达式>LIKE运算符用于检测字段的值是否与样式字符串匹配。2.带特殊运算符的条件查询SELECT语句可以使用30例10.14:查询学生表中入学成绩在550~570之间的学号、姓名、入学成绩。SQL语句如下:SELECT学号,姓名,入学成绩FROM学生WHERE入学成绩BETWEEN550AND570上述语句的功能相当于:SELECT学号,姓名,入学成绩FROM学生WHERE入学成绩>=550AND入学成绩<=570例10.14:查询学生表中入学成绩在550~570之间的学号31例10.15:查询学生表中学号为070102和070401的记录。SQL语句如下:SELECT*FROM学生WHERE学号IN("070102","070401")上述语句的功能相当于:SELECT*FROM学生WHERE学号="070102"OR学号="070401"例10.15:查询学生表中学号为070102和070401的32例10.16:查询学生表中姓“王”的学生的记录。SQL语句如下:SELECT*FROM学生WHERE姓名LIKE"王*"通配符“*”表示零个或多个字符“?”表示一个字符

例10.16:查询学生表中姓“王”的学生的记录。通配符“*”333.计算查询函数功能COUNT(<字段名>)对指定字段的值计算个数COUNT(*)计算记录个数SUM(<字段名>)计算指定的数值列的和AVG(<字段名>)计算指定的数值列的平均值MAX(<字段名>)计算指定的字符、日期或数值列中的最大值MIN(<字段名>)计算指定的字符、日期或数值列中的最小值说明:●(字段名)可以是字段名,也可以是SQL表达式。●上述聚合函数可以用在SELECT短语中对查询结果进行计算,也可以在HAVING子句中构造分组筛选条件。3.计算查询函数功能COUNT(34例10.17:在学生表中统计学生人数。SQL语句如下:SELECTCOUNT(*)AS

学生人数

FROM

学生例10.18:查询学生表中男生入学成绩字段的平均值、最大值和最小值。SQL语句如下:SELECT“男”AS性别,AVG(入学成绩)AS入学平均分MAX(入学成绩)AS入学最高分,MIN(入学成绩)AS入学最低分FROM学生WHERE性别="男"例10.17:在学生表中统计学生人数。SQL语句如下:354.分组与计算查询格式:GROUPBY<分组关键字1>[,<分组关键字2>…][HAVING<筛选条件>]说明:①分组关键字是分组的依据,可以是字段名,也可以是SQL函数表达式,还可以是字段序号(从1开始)。②HAVING是对分组进行筛选的条件。HAVING只能与GROUPBY一起出现,不能单独使用。4.分组与计算查询格式:GROUPBY<分组关键字1>36例10.19:分别统计男、女学生人数和入学成绩的最高分和平均分。SELECT性别,COUNT(性别)AS人数,MAX(入学成绩)AS入学最高分,AVG(入学成绩)AS入学平均分FROM学生GROUPBY性别例10.20:在成绩表中统计有6个以上学生选修的课程。SQL语句如下:SELECT课程号,COUNT(*)AS选课人数FROM成绩GROUPBY课程号HAVINGCOUNT(*)>=6例10.19:分别统计男、女学生人数和入学成绩的最高分和平均37例10.21:对1988年以后出生的学生分别按专业统计入学成绩,并输出入学平均成绩在560分以上的组。SELECT专业,AVG(入学成绩)AS入学平均分FROM学生WHERE出生日期>=#1988-01-01#GROUPBY专业HAVINGAVG(入学成绩)>=560说明:

HAVING与WHERE的区别在于:WHERE是对表中所有记录进行筛选,HAVING是对分组结果进行筛选。在分组查询中如果既选用了WHERE,又选用了HAVING,执行的顺序是先用WHERE限定记录,然后对筛选后的记录按GROUPBY指定的分组关键字分组,最后用HAVING子句限定分组。例10.21:对1988年以后出生的学生分别按专业统计入学成385.排序格式:ORDERBY<排序关键字1>[ASC|DESC][,<排序关键字2>[ASC|DESC]…][TOP<数值表达式>[PERCENT]]说明:①ASC表示对查询结果按指定字段升序排序。②DESC表示对查询结果按指定字段降序排序;ASC|DESC缺省时默认值是升序。③TOP必须与ORDERBY短语同时使用,表示从第一条记录开始,显示满足条件的前N个记录。选择PERCENT短语时,数值表达式表示百分比。

5.排序格式:ORDERBY<排序关键字1>[AS39例10.22:在学生表中查询入学成绩在前3名的学生信息。SQL语句如下:

SELECTTOP3*

FROM学生

ORDERBY入学成绩DESC例10.23:显示年龄最小的30%的学生的信息。SQL语句如下:

SELECTTOP20PERCENT*

FROM学生

ORDERBY出生日期DESC例10.22:在学生表中查询入学成绩在前3名的学生信息。S40SELECT命令支持多表之间的连接查询,并提供了专门的JOIN子句。格式:SELECT<字段名表>

FROM<表名1>[INNER

JOIN<表名2>ON

<连接接条件>][WHERE<筛选条件>]其中:INNERJOIN用来连接左右两个<表名>指定的表,ON用来指定连接条件。三.连接查询SELECT命令支持多表之间的连接查询,并提供41例10.24:在职工管理数据库中查询高级职称(教授或副教授)教师的姓名、基本工资、津贴和所得税。SQL语句如下:

SELECT姓名,工资,津贴,所得税FROM职工INNERJOIN工资ON职工.职工号=工资.职工号WHERE职称IN(“教授”,“副教授”)或者:SELECT姓名,工资,津贴,所得税

FROM职工,工资

WHERE职工.职工号=工资.职工号AND职称IN(“教授”,“副教授”)“职工号”是职工表和工资表的公共字段,“职工.职工号=工资.职工号”是连接条件。INNERJOIN子句还可以嵌套,即在一个INNERJOIN之中,可以嵌套多个INNERON子句。例10.24:在职工管理数据库中查询高级职称(教授或副教授)42例10.25:输出所有学生每门课程的综合成绩单,要求给出学号、姓名、课程名和综合成绩信息。SQL语句如下:

SELECT学生.学号,姓名,平时*0.1+期中*0.2+期末*0.7AS综合成绩FROM学生INNERJOIN(成绩INNERJOIN课程ON成绩.课程号=课程.课程号)ON学生.学号=成绩.学号或者:SELECT学生.学号,姓名,课程名,平时*0.1+期中*0.2+期末*0.7AS综合成绩

FROM学生,成绩,课程

WHERE学生.学号=成绩.学号AND成绩.课程号=课程.课程号说明:由于学号字段在两个表中都出现,为了防止二义性,在其列名前加上表名作为前缀,以示区别。如果列名是唯一的,则不必加前缀。例10.25:输出所有学生每门课程的综合成绩单,要求给出学号43例10.26:按各门课程期末平均成绩的降序输出每位学生的学号和期末平均成绩(保留小数1位)。SQL语句如下:

SELECT成绩.学号,ROUND(Avg(成绩.期末),1)AS期末平均成绩FROM学生INNERJOIN成绩ON学生.学号=成绩.学号GROUPBY成绩.学号ORDERBY2DESC例10.26:按各门课程期末平均成绩的降序输出每位学生的学号44在SQL语言中,当一个查询是另一个查询的条件时,即在一个SELECT语句的WHERE子句中出现另一个SELECT语句,这种查询称为嵌套查询。通常把内层的查询语句称为子查询,调用子查询的查询语句称为父查询。SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。子查询的SELECT语句中不能使用ORDERBY子句,ORDERBY子句只能对最终查询结果排序。四.嵌套查询在SQL语言中,当一个查询是另一个查询的条件时,即在一个SE451.带有比较运算符的子查询带有比较运算符的子查询是指父查询与子查询之间用比较运算符(>、<、=、>=、<=、<>)进行连接。例10.27:查询所有参加“计算机”课程考试的学生的学号。SELECT学号FROM成绩WHERE课程号=(SELECT课程号FROM课程WHERE课程名="计算机")1.带有比较运算符的子查询46例10.28:检索所有入学成绩高于于海涛的学生的学号、姓名、性别和入学成绩。

SELECT姓名,性别,入学成绩FROM学生WHERE入学成绩>(SELECT入学成绩FROM学生

WHERE姓名="于海涛")

例10.29:显示入学成绩高于男生平均入学成绩的女生的学号、姓名和平均成绩。

SELECT学号,姓名,入学成绩FROM学生WHERE性别=“女”AND入学成绩>=(SELECTAVG(入学成绩)FROM学生WHERE性别=“男”)例10.28:检索所有入学成绩高于于海涛的学生的学号、姓名、472.带有IN谓词的子查询格式:<字段名>[NOT]IN(<子查询>)IN是属于的意思,<字段名>指定的字段内容属于子查询中任何一个值,运算结果都为真。

例10.30:查询所有参加“计算机”课程考试的学生的学号、姓名和性别。

SELECT学号,姓名,性别FROM学生

WHERE学号IN(SELECT学号FROM成绩

WHERE课程号=(SELECT课程号FROM课程

WHERE课程名="计算机")2.带有IN谓词的子查询483.带有ANY或ALL谓词的子查询格式:<字段名><比较运算符>[ANY|ALL](<子查询>)注意:使用ANY或ALL谓词时必须同时使用比较运算符。例10.31:查询入学成绩高于女生最低入学成绩的男生的学号、姓名和入学成绩,SQL语句如下:

SELECT学号,姓名,性别,入学成绩FROM学生

WHERE性别=“男”AND入学成绩>ANY(SELECT入学成绩FROM学生

WHERE性别=“女”)用聚合函数来实现:SELECT学号,姓名,性别,入学成绩FROM学生WHERE性别=“男”AND入学成绩>=(SELECTMIN(入学成绩)FROM学生WHERE性别=“女”)用聚合函数实现子查询通常比直接用ANY或ALL查询效率要高。3.带有ANY或ALL谓词的子查询用聚合函数来实现:494.带有EXISTS谓词的子查询格式:[NOT]EXISTS(<子查询>)带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值(true)或逻辑假值(false),即是否存在相应的记录。例10.32:查询参加了A02课程考试的学生学号和姓名。SQL语句如下:SELECT学号,姓名FROM学生WHEREEXISTS(SELECT*FROM成绩WHERE成绩.学号=学生.学号AND成绩.课程号="A02");带EXISTS的子查询只返回真值或假值,其输出项通常都用*。4.带有EXISTS谓词的子查询50例10.33:查询参加了全部课程考试的学生学号和姓名。可将题目的意思转换成:查询这样的学生,没有一门课程他没有成绩。SELECT学号,姓名FROM学生WHERENOTEXISTS

(SELECT*FROM课程WHERENOTEXISTS

(SELECT*FROM成绩WHERE成绩.学号=学生.学号and成绩.课程号=课程.课程号))例10.33:查询参加了全部课程考试的学生学号和姓名。可将题51格式:<SELECT语句1>UNION[ALL]<SELECT语句2>说明:ALL缺省时,自动去掉重复记录,否则合并全部结果。例10.34:创建联合查询,将已经建立的查询“例10_14”的记录与学生表中入学成绩在550以下的记录合并。SELECT学号,姓名,入学成绩FROM例10_14UNIONSELECT学号,姓名,入学成绩FROM学生

WHERE入学成绩<550注意:要求合并的两个SELECT语句必须输出相同的字段个数,对应字段必须具有相同的数据类型和长度。五.联合查询格式:<SELECT语句1>UNION[ALL]<S52例10.35:合并学生表和成绩表中的学号。SELECT学号FROM学生UNION

SELECT学号FROM成绩在成绩表中,尽管学号比较多,但大部分与学生表重复,合并后,重复的内容就自动去掉了,所以结果输出的学号最多与学生表中的学号个数一致。例10.35:合并学生表和成绩表中的学号。53Access的传递查询是自己并不执行,而是传递给另一个数据库执行。创建传递查询,一般要完成两项工作,一是设置要连接的数据库,二是在SQL窗口中输入SQL语句。整个操作分成3个阶段:(1)打开查询属性对话框①在数据库窗口中选择“查询”对象②双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框③选择“查询”菜单中“SQL特定查询”下的“传递”命令项,打开传递查询设置窗口④单击工具栏上的“属性”按钮,打开“查询属性”对话框。六.传递查询Access的传递查询是自己并不执行,而是传递给另一个数据库54(2)设置要连接的数据库①在“查询属性”对话框中,单击“ODBC连接字符串”的生成器按钮②打开“选择数据源”对话框,单击“机器数据源”选项卡③如果要选择的数据源已经在列表框中,则直接在列表框中选择,如不存在,则单击“新建”按钮,在新打开的各个对话框中输入要连接的服务器信息。(3)建立传递查询在SQL传递查询窗口中输入SQL查询命令,单击工具栏上的“运行”按钮,得到查询结果。(2)设置要连接的数据库55本章小结

本章较全面的介绍了关系数据库标准语言SQL,包括数据定义、数据查询和数据操作功能,以及SQL在Access中的应用。SQL已经成为Access的基本内容,不掌握SQL要用好Access基本是不可能的。本章小结本章较全面的介绍了关系数据库标准语言SQL,56计算机应用基础武汉科技大学计算机学院计算机应用基础武汉科技大学计算机学院57第十章关系数据库标准语言SQL第十章关系数据库标准语言SQL58教学目标掌握SQL修改表结构的规则与方法

;掌握SQL修改数据的规则与方法

;掌握SQL数据查询功能的语句规则和特点。重点与难点:表定义中数据完整性规则的设定、多表连接查询的方法与使用规则、在分组查询中使用函数的规则和方法、使用嵌套子查询的方法和规则、综合应用SQL数据查询功能完成实际问题的能力。

教学目标掌握SQL修改表结构的规则与方法;重点与难点:表定5910.1SQL概述

10.1SQL概述60SQL是StructuredQueryLanguage的缩写,即结构化查询语言,是关系数据库的标准语言。

主要特点:⑴SQL是一种功能齐全的一体化语言。⑵SQL是一种高度非过程化的语言。⑶SQL语言简洁,易学易用。⑷语言共享。SQL是StructuredQueryL61SQL语言可以分成以下几组:●数据定义语言DDL(DataDefinitionLanguage):包括定义、修改与删除基本表及建立与删除索引等。●数据操纵语言DML(DataManipulationLanguage):包括插入、修改与删除数据等。●数据查询语言DQL(DataQueryLanguage):包括单表查询、连接查询、嵌套查询等各种查询功能。●数据控制语言DCL(DataControlLanguage):包括数据的安全性控制、数据的完整性控制、数据库的恢复及并发控制等功能。SQL语言可以分成以下几组:62

Access支持数据定义、数据查询和数据操作功能。

SQL功能命令动词数据定义

CREAT、ALTER、DROP数据操作

INSERT、DELETE、UPDATE数据查询

SELECTSQL功能命令动词数据定义CREA6310.2数据定义10.2数据定义64一.创建表格式:

CREATETABLE<表名>(<字段名1><类型名>[(长度)][PRIMARYKEY][NOTNULL][,<字段名2><类型名>[(长度)][NOTNULL]]…)功能:创建一个数据表的结构。说明:●<表名>:要创建的数据表的名字。●<字段名><类型名>:要创建的数据表的字段名和字段类型。●字段长度仅限于文本及二进制字段。●

PRIMARYKEY:表示将该字段定义为主键。●

NOTNULL:不允许字段值为空,而NULL允许字段值为空。一.创建表格式:CREATETABLE<表名>功65例10.1在职工管理数据库中建立一个数据表“职工”,表结构由职工号、姓名、性别、职称、部门、出生日期、婚否等字段组成。并设置“职工号”为主键。操作步骤如下:①创建“职工管理”数据库。②在“职工管理”数据库窗口中选择“查询”对象。③双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框,打开查询设计视图窗口。④选择“查询”菜单中“SQL特定查询”下的“数据定义”命令项,打开“数据定义查询”窗口。⑤在“数据定义查询”窗口中输入SQL语句,每个数据定义查询只能包含一条数据定义语句。例10.1在职工管理数据库中建立一个数据表“职工”,表结构66CREATEDATABASE

职工管理

CREATETABLE

职工(职工号TEXT(5)

PRIMARYKEY,姓名

TEXT(4),性别TEXT(1),职称TEXT(4),部门TEXT(8),出生日期DATE,婚否LOGICAL)⑥保存查询为“数据表定义查询(职工)”,查询建立完毕。⑦运行查询。在设计视图中,单击工具栏上的“运行”按钮,执行SQL语句,完成创建表的操作。⑧在数据库窗口中单击“表”对象,可以看到在“表”列表框中多了一个“职工”表,这就是用SQL的定义查询创建的表。CREATEDATABASE职工管理67例10.2在职工管理数据库中建立一个数据表“工资”,并通过“职工号”字段建立与“职工”表的关系。

CREATETABLE工资(职工号TEXT(5)PRIMARYKEY

REFERENCES职工,工资Single,津贴Single,所得税Single,公积金Single,水电费Single,应扣Single,实发Single)其中的“REFERENCES职工”表示与“职工”表建立关系。例10.2在职工管理数据库中建立一个数据表“工资”,并通过68格式:DROPTABLE

<表名>功能:删除指定的数据表文件。说明:一定要慎用DROPTABLE语句,一旦使用以后就无法恢复表或其中的数据,此表上建立的索引也将自动删除,并且无法恢复。二.删除表格式:DROPTABLE<表名>功能:删除指定的数据69例10.3

删除例10.2建立的工资表。操作步骤如下:①打开“数据定义查询”窗口。②输入删除表的SQL语句:

DROPTABLE工资③单击工具栏上的“运行”按钮,完成删除表的操作,“工资”表将从“职工管理”数据库窗口消失。例10.3删除例10.2建立的工资表。操作步骤如下:70三、修改表的结构格式一:

ALTERTABLE<表名>[ADD<新字段名1><类型名>[(长度)][,<新字段名2><类型名>[(长度)]…]][DROP<字段名1>[,<字段名2>…][ALTER<字段名1><类型名>[(长度)][,<字段名2><类型名>[(长度)]…]]

功能:修改指定的数据表的结构。说明:●<表名>:要修改的数据表的名字。●ADD子句用于增加新的字段。●

DROP子句用于删除指定的字段。●ALTER子句用于修改原有字段的定义,包括字段名、数据类型和字段的长度。●应注意ADD子句、DROP子句和ALTER子句不能同时使用。三、修改表的结构格式一:ALTERTABLE<表名71例10.4

为职工表增加一个电话号码字段。操作步骤如下:①在“职工管理”数据库窗口中选择“查询”对象。②双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框,打开查询设计视图窗口。③选择“查询”菜单中“SQL特定查询”下的“数据定义”命令项,打开“数据定义查询”窗口。④在“数据定义查询”窗口中,输入修改表结构的SQL语句:

ALTERTABLE职工ADD电话号码Text(8)⑤单击工具栏上的“运行”按钮,完成修改表结构的操作。例10.4为职工表增加一个电话号码字段。操作步骤如下:72例10.5

将职工表的姓名字段的宽度由原来的6改为8,SQL语句如下:

ALTERTABLE职工ALTER姓名Text(8)例10.6删除职工表“电话号码”字段,SQL语句如下:

ALTERTABLE职工DROP电话号码例10.5将职工表的姓名字段的宽度由原来的6改为8,SQL7310.3数据操作10.3数据操作74一.插入记录格式:

INSERTINTO

<表名>[(<字段名清单>)]VALUES

(<表达式清单>)功能:在指定的数据表的尾部添加一条新记录。说明:●<表名>:要插入数据的表的名字。●<字段名清单>为数据表要插入新值的字段。●

VALUES(表达式清单)为数据表要插入新值的各字段的数据值。●<字段名清单>和VALUES子句中(表达式清单)的个数和数据类型要完全一致。●若省略<字段名清单>,则数据表中的所有字段必须在VALUES子句中都有相应的值。一.插入记录格式:INSERTINTO<表名>功能75例10.7

在职工表尾部添加一条新记录。操作步骤如下:①在“职工管理”数据库窗口中,打开“数据定义查询”窗口。②输入SQL语句:INSERTINTO职工(职工号,姓名,性别,职称,部门,出生日期,婚否)VALUES("01001","陈周","男","教授","计算机",#1958-03-05#,yes)③单击工具栏上的“运行”按钮,完成插入数据的操作。例10.8在职工表尾部插入第二条记录,SQL语句如下:INSERTINTO职工VALUES("03021","刘杨","女","副教授","管理",#1962-06-18#,no)例10.7在职工表尾部添加一条新记录。操作步骤如下:76格式:UPDATE

<表名>

SET

<字段名1>=表达式1

[,<字段名2>=表达式2…][WHERE<条件>]

功能:根据WHERE子句指定的条件,对指定记录的字段值进行更新。说明:●<表名>:要更新数据的表的名字。●<字段名>=<表达式>是指用<表达式>的值替代<字段名>的值,一次可更新多个字段的值。●若省略WHERE子句,则更新全部记录。●一次只能在单一的表中更新记录。二.更新数据格式:UPDATE<表名>SET<字段名1>=77例10.9

计算工资表中的应扣和实发数。①在“职工管理”数据库窗口中,打开“数据定义查询”窗口。②输入SQL语句:

UPDATE工资SET应扣=所得税+公积金+水电费,实发=工资+补贴-应扣③单击工具栏上的“运行”按钮,完成更新数据的操作。例10.9计算工资表中的应扣和实发数。78格式:

DELETEFROM

<表名>[WHERE<条件>]

功能:根据WHERE子句指定的条件,删除表中指定的记录。说明:●<表名>:要删除数据的表的名字。●若省略WHERE子句,则删除表中全部记录。●DELETE语句删除的只是表中的数据,而不是表的结构。三.删除数据例10.10

将职工表中职工号为“03021”的记录删除。①在“职工管理”数据库窗口中,打开“数据定义查询”窗口。②输入SQL语句:DELETEFROM职工WHERE职工号="03021"③单击工具栏上的“运行”按钮,完成删除数据的操作。格式:DELETEFROM<表名>[WHER7910.4数据查询10.4数据查询80一.SELECT查询命令格式:SELECT[ALL|DISTINCT|TOPn[PERCENT]]<字段名>|<字段表达式>|<函数>[,…]FROM<数据源表或查询>[WHERE<筛选条件>][GROUPBY<分组字段表>[HAVING<过滤条件>][ORDERBY<排序关键字1>[ASC|DESC][,<排序关键字2>[ASC|DESC]…]]

一.SELECT查询命令格式:81功能:

从FROM子句列出的表或查询中,选择满足WHERE子句中给出的条件的记录,然后按GROUPBY子句(分组子句)中指定字段的值分组,再提取满足HAVING子句中过滤条件的那些组,按SELECT子句给出的字段名或字段表达式求值输出。ORDERBY子句(排序子句)是对输出的目标表进行重新排序,并可附加说明ASC(升序)或DESC(降序)排列。

功能:从FROM子句列出的表或查询中,选择满82说明:●

ALL:查询的结果中包含数据源中的所有记录。●

DISTINCT:查询的结果中不包含数据源中重复行的记录。●<字段名表>:指定查询结果输出的字段,如果要包含数据源中的所有字段,可以使用通配符“*”。●

AS<列名称>:如果在输出时不希望使用原来的字段名,可以用列名称重新设置。●

FROM<数据源表或查询>:指出查询的数据来源。●WHERE<筛选条件>:说明查询条件,即选择记录的条件。二.简单查询格式:SELECT[ALL|DISTINCT]<字段名1>[AS<列名称>][,<字段名2>[AS<列名称>]…]

FROM<数据源表或查询>[WHERE<筛选条件>]1.基本查询说明:二.简单查询格式:SELECT[ALL|DIS83例10.11

查询学生表的全部字段。操作步骤如下:①在“学生成绩管理”数据库窗口中选择“查询”对象。②双击“在设计视图中创建查询”,关闭弹出的“显示表”对话框,打开查询设计视图窗口。③选择“视图”菜单的“SQL视图”命令项,打开“选择查询”窗口。④输入SQL语句:

SELECT*FROM学生⑤保存查询,查询建立完毕。⑥运行查询。例10.11查询学生表的全部字段。操作步骤如下:84例10.12查询学生表中所有学生的姓名和截至统计时的年龄,去掉重名。SQL语句如下:SELECTDISTINCT

姓名,YEAR(DATE())-YEAR(出生日期)AS年龄FROM学生例10.13查询学生表中所有已通过四级的男生记录。SQL语句如下:SELECT*FROM学生WHERE性别="男"AND四级通过=yes例10.12查询学生表中所有学生的姓名和截至统计时的年龄,852.带特殊运算符的条件查询SELECT语句可以使用的特殊运算符有:(1)BETWEEN…AND运算符格式:<字段名>[NOT]BETWEEN<初值>AND<终值>BETWEEN运算符用于检测字段的值是否介于指定的范围内。(2)IN运算符格式:<字段名>[NOT]IN(<表达式1>[,<表达式2>…])IN运算符用于检测字段的值是否属于表达式集合或子查询。(3)LIKE运算符格式:<字段名>LIKE<字符表达式>LIKE运算符用于检测字段的值是否与样式字符串匹配。2.带特殊运算符的条件查询SELECT语句可以使用86例10.14:查询学生表中入学成绩在550~570之间的学号、姓名、入学成绩。SQL语句如下:SELECT学号,姓名,入学成绩FROM学生WHERE入学成绩BETWEEN550AND570上述语句的功能相当于:SELECT学号,姓名,入学成绩FROM学生WHERE入学成绩>=550AND入学成绩<=570例10.14:查询学生表中入学成绩在550~570之间的学号87例10.15:查询学生表中学号为070102和070401的记录。SQL语句如下:SELECT*FROM学生WHERE学号IN("070102","070401")上述语句的功能相当于:SELECT*FROM学生WHERE学号="070102"OR学号="070401"例10.15:查询学生表中学号为070102和070401的88例10.16:查询学生表中姓“王”的学生的记录。SQL语句如下:SELECT*FROM学生WHERE姓名LIKE"王*"通配符“*”表示零个或多个字符“?”表示一个字符

例10.16:查询学生表中姓“王”的学生的记录。通配符“*”893.计算查询函数功能COUNT(<字段名>)对指定字段的值计算个数COUNT(*)计算记录个数SUM(<字段名>)计算指定的数值列的和AVG(<字段名>)计算指定的数值列的平均值MAX(<字段名>)计算指定的字符、日期或数值列中的最大值MIN(<字段名>)计算指定的字符、日期或数值列中的最小值说明:●(字段名)可以是字段名,也可以是SQL表达式。●上述聚合函数可以用在SELECT短语中对查询结果进行计算,也可以在HAVING子句中构造分组筛选条件。3.计算查询函数功能COUNT(90例10.17:在学生表中统计学生人数。SQL语句如下:SELECTCOUNT(*)AS

学生人数

FROM

学生例10.18:查询学生表中男生入学成绩字段的平均值、最大值和最小值。SQL语句如下:SELECT“男”AS性别,AVG(入学成绩)AS入学平均分MAX(入学成绩)AS入学最高分,MIN(入学成绩)AS入学最低分FROM学生WHERE性别="男"例10.17:在学生表中统计学生人数。SQL语句如下:914.分组与计算查询格式:GROUPBY<分组关键字1>[,<分组关键字2>…][HAVING<筛选条件>]说明:①分组关键字是分组的依据,可以是字段名,也可以是SQL函数表达式,还可以是字段序号(从1开始)。②HAVING是对分组进行筛选的条件。HAVING只能与GROUPBY一起出现,不能单独使用。4.分组与计算查询格式:GROUPBY<分组关键字1>92例10.19:分别统计男、女学生人数和入学成绩的最高分和平均分。SELECT性别,COUNT(性别)AS人数,MAX(入学成绩)AS入学最高分,AVG(入学成绩)AS入学平均分FROM学生GROUPBY性别例10.20:在成绩表中统计有6个以上学生选修的课程。SQL语句如下:SELECT课程号,COUNT(*)AS选课人数FROM成绩GROUPBY课程号HAVINGCOUNT(*)>=6例10.19:分别统计男、女学生人数和入学成绩的最高分和平均93例10.21:对1988年以后出生的学生分别按专业统计入学成绩,并输出入学平均成绩在560分以上的组。SELECT专业,AVG(入学成绩)AS入学平均分FROM学生WHERE出生日期>=#1988-01-01#GROUPBY专业HAVINGAVG(入学成绩)>=560说明:

HAVING与WHERE的区别在于:WHERE是对表中所有记录进行筛选,HAVING是对分组结果进行筛选。在分组查询中如果既选用了WHERE,又选用了HAVING,执行的顺序是先用WHERE限定记录,然后对筛选后的记录按GROUPBY指定的分组关键字分组,最后用HAVING子句限定分组。例10.21:对1988年以后出生的学生分别按专业统计入学成945.排序格式:ORDERBY<排序关键字1>[ASC|DESC][,<排序关键字2>[ASC|DESC]…][TOP<数值表达式>[PERCENT]]说明:①ASC表示对查询结果按指定字段升序排序。②DESC表示对查询结果按指定字段降序排序;ASC|DESC缺省时默认值是升序。③TOP必须与ORDERBY短语同时使用,表示从第一条记录开始,显示满足条件的前N个记录。选择PERCENT短语时,数值表达式表示百分比。

5.排序格式:ORDERBY<排序关键字1>[AS95例10.22:在学生表中查询入学成绩在前3名的学生信息。SQL语句如下:

SELECTTOP3*

FROM学生

ORDERBY入学成绩DESC例10.23:显示年龄最小的30%的学生的信息。SQL语句如下:

SELECTTOP20PERCENT*

FROM学生

ORDERBY出生日期DESC例10.22:在学生表中查询入学成绩在前3名的学生信息。S96SELECT命令支持多表之间的连接查询,并提供了专门的JOIN子句。格式:SELECT<字段名表>

FROM<表名1>[INNER

JOIN<表名2>ON

<连接接条件>][WHERE<筛选条件>]其中:INNERJOIN用来连接左右两个<表名>指定的表,ON用来指定连接条件。三.连接查询SELECT命令支持多表之间的连接查询,并提供97例10.24:在职工管理数据库中查询高级职称(教授或副教授)教师的姓名、基本工资、津贴和所得税。SQL语句如下:

SELECT姓名,工资,津贴,所得税FROM职工INNERJOIN工资ON职工.职工号=工资.职工号WHERE职称IN(“教授”,“副教授”)或者:SELECT姓名,工资,津贴,所得税

FROM职工,工资

WHERE职工.职工号=工资.职工号AND职称IN(“教授”,“副教授”)“职工号”是职工表和工资表的公共字段,“职工.职工号=工资.职工号”是连接条件。INNERJOIN子句还可以嵌套,即在一个INNERJOIN之中,可以嵌套多个INNERON子句。例10.24:在职工管理数据库中查询高级职称(教授或副教授)98例10.25:输出所有学生每门课程的综合成绩单,要求给出学号、姓名、课程名和综合成绩信息。SQL语句如下:

SELECT学生.学号,姓名,平时*0.1+期中*0.2+期末*0.7AS综合成绩FROM学生INNERJOIN(成绩INNERJOIN课程ON成绩.课程号=课程.课程号)ON学生.学号=成绩.学号或者:SELECT学生.学号,姓名,课程名,平时*0.1+期中*0.2+期末*0.7AS综合成绩

FROM学生,成绩,课程

WHERE学生.学号=成绩.学号AND成绩.课程号=课程.课程号说明:由于学号字段在两个表中都出现,为了防止二义性,在其列名前加上表名作为前缀,以示区别。如果列名是唯一的,则不必加前缀。例10.25:输出所有学生每门课程的综合成绩单,要求给出学号99例10.26:按各门课程期末平均成绩的降序输出每位学生的学号和期末平均成绩(保留小数1位)。SQL语句如下:

SELECT成绩.学号,ROUND(Avg(成绩.期末),1)AS期末平均成绩FROM学生INNERJOIN成绩ON学生.学号=成绩.学号GROUPBY成绩.学号ORDERBY2DESC例10.26:按各门课程期末平均成绩的降序输出每位学生的学号100在SQL语言中,当一个查询是另一个查询的条件时,即在一个SELECT语句的WHERE子句中出现另一个SELECT语句,这种查询称为嵌套查询。通常把内层的查询语句称为子查询,调用子查询的查询语句称为父查询。SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。子查询的SELECT语句中不能使用ORDERBY子句,ORDERBY子句只能对最终查询结果排序。四.嵌套查询在SQL语言中,当一个查询是另一个查询的条件时,即在一个SE1011.带有比较运算符的子查询带有比较运算符的子查询是指父查询与子查询之间用比较运算符(>、<、=、>=、<=、<>)进行连接。例10.27:查询所有参加“计算机”课程考试的学生的学号。SELECT学号FROM成绩WHERE课程号=(SELECT课程号FROM课程WHERE课程名="计算机")1.带有比较运算符的子查询102例10.28:检索所有入学成绩高于于海涛的学生的学号、姓名、性别和入学成绩。

SELECT姓名,性别,入学成绩FROM学生WHERE入

温馨提示

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

评论

0/150

提交评论