SQL结构化查询语言_第1页
SQL结构化查询语言_第2页
SQL结构化查询语言_第3页
SQL结构化查询语言_第4页
SQL结构化查询语言_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

第4章SQL结构化查询语言4.1SQL简介SQL是在20世纪70年代末由IBM公司开发出来的一套程序语言,并被用在DB2关系数据库系统中。但是,直到1981年,IBM推出商用的SQL/DS关系型数据库系统;Oracle及其他大型关系型数据库系统相继出现,SQL才得以广泛应用。例如,Sybase与Microsoft公司使用T(transact)-SQL,而Oracle公司使用PL/SQL。4.1SQL简介SQL的发展1974年提出,在SYSTEMR上实现。1986年10月,ANSI定为关系数据库语言的美国标准,并公布了标准SQL。1992年通过的修改标准SQL---92(简称SQL2)。1999年---SQL99标准。2003年---SQL2003标准。4.1SQL简介SQL(StructuredQueryLanguage)称为结构化查询语言,它集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL于一体。SQL已成为关系型数据库的标准查询语言。4.1SQL简介SQL语言是应用于数据库的语言,本身是不能独立存在的。它是一种非过程性(non-procedural)语言,与一般的高级语言(如C、JAVA)不同。一般的高级语言在存取数据库时,需要依照每一行程序的顺序处理许多的动作。但是使用SQL时,只需告诉数据库需要什么数据,怎么显示就可以了。具体的内部操作则由数据库系统来完成。4.1SQL简介SQL的分类DDL(数据定义语言):用于定义数据库对象(数据库、表、视图、索引)。如create,drop,alter;DML(数据操纵语言):用于对表或视图进行添加、删除和修改等操作,如insert,update,delete。DQL(数据查询语言):用于从数据库中检索数据。如select。DCL(数据控制语言):用于控制用户对数据库的存取能力。如grant,deny,revoke。4.1SQL简介SQL语言的主要特点是:SQL语言是一种一体化的语言,提供了完整的数据定义和操纵功能。SQL语言具有完备的查询功能。SQL语言非常简洁,易学易用。SQL语言是一种高度非过程化的语言。SQL语言的执行方式多样。SQL语言不仅能对数据表进行各种操作,也可对视图进行操作。4.2Select语句查询是SQL的核心。用于表达查询的SELECT语句是功能最强也是最复杂的SQL语句。它可以实现各种查询,还能进行统计、结果排序等。4.2.1SELECT语句格式SELECT[谓词][表别名.]SELECT表达式[AS列别名][,[[表别名.]SELECT表达式[AS列别名]…][INTO新表名][IN库名]FROM表名[AS表别名][[INNER|LEFT|RIGHT|JOIN{{<表名>][AS表别名][ON联接条件]]…][IN库名][WHERE逻辑表达式][GROUPBY分组字段列表][HAVING过滤条件][UNION[ALL]SELECT语句][ORDERBY排序字段[ASC|DESC][,排序字段[ASC|DESC]...]]4.2.1SELECT语句格式SELECT语句的完整格式中包括6个子句。SELECT和FROM子句是必须的,其它子句任选。SELECT子句列出所有要求SELECT语句检索的数据项。这些项可以取自数据库中的字段,也可以是SQL在执行查询时计算出的列。FROM子句列出包含所要查询数据的表。WHERE子句告诉SQL只查询某些行中的数据,这些行用逻辑表达式描述。GROUPBY子句将结果按<分组字段列表>的值进行分组,该值相等的记录为一个组。4.2.1SELECT语句格式HAVING子句告诉SQL只产生由GROUPBY得到的某些组的结果。ORDERBY子句将查询结果按一列或多列中的数据排序。4.2.1简单查询1、SELECT子句用于指定在查询结果中包含的字段、常量和表达式。①[表别名]:在FROM子句中给表取别名,主要用于当不同的表中存在同名字段时区别数据来源表。②SELECT表达式:是用户要查询的内容。如果多个字段用逗号分割。内容可以是字段名,也可以是函数(系统及自定义函数),还可以是*,表示输出表中的所有字段。

4.2.1简单查询③[谓词]:指定查询选择的记录,可取ALL、DISTINCT、DISTINCTROW、TOPn[PERCENT]谓词说明

例子SELECTALL学号FROMALL显示查询结果中全部数据学生选课忽略在选定字段中包含重复数SELECTDISTINCT学号DISTINCT据的记录。FROM学生选课忽略整个重复记录的数据,而SELECTDISTINCTROW学DISTINCTROW不仅仅是重复的字段。号FROM学生选课TOPn [PERCENT]返回在一定范围内的一定数量 的记录。SELECTTOP5学号FROM

学生选课4.2.1简单查询1、SELECT子句例如:select学号,姓名,性别from学生select*from课程select学生.学号,学生.姓名,专业.专业名称FROM学生,专业where学生.专业编号=专业.专业编号select学号,姓名,性别,year(出生日期)as出生年份from学生4.2.1简单查询2、FROM子句用于指定在查询的表名,并给出表别名。①[表名][AS表别名]:为表指定一个临时别名。若指定了别名,则整个SELECT语句中必须使用这个别名代替表名。②INNERJOIN:规定内连接。只有在被连接的表中有匹配的记录才会出现在查询结果中。4.2.1简单查询③LEFTJOIN:规定左外连接。JOIN左侧表中的所有记录及JOIN右侧表中匹配的记录才会出现在查询结果中。④RIGHTJOIN:规定右外连接。JOIN右侧表中的所有记录及JOIN左侧表中匹配的记录才会出现在查询结果中。⑤[ON连接条件]:指定连接条件。⑥[IN库名]:指定表所在的库。省略表示当前库。!SQL查询的结果总是一个数据表。4.2.1简单查询例如:SELECT学生.姓名,学生.性别,专业.专业名称FROM专业INNERJOIN学生ON专业.专业编号=学生.专业编号;SELECT学生.姓名,学生.性别,学生.专业编号FROM学生INNERJOIN学生选课ON学生.[学号]=学生选课.[学号];SELECT学生.姓名,学生.性别,学生.专业编号FROM学生LEFTJOIN学生选课ON学生.[学号]=学生选课.[学号]WHERE(((学生选课.学号)IsNull));4.2.1简单查询3.单表查询最简单的查询是从单表中请求得到数据列的值(1)选择需要的列SELECT*FROM学生SELECT姓名,出生日期,性别FROM学生SELECTALL*FROM学生选课4.2.1简单查询(2)列计算SELECT学号,平时成绩*0.3+考试成绩*0.7as学期成绩FROM学生选课4.2.1简单查询(3)重复行在“学生选课”表中列出所有选课的学生学号。

SELECTDISTINCT学号FROM学生选课!“学生选课”表中存储着选课学生的学号,有些学生同时选了几门课,如果直接用SELECT选取就会出现重复记录。因此,加DISTINCT可去掉重复行。4.2.1简单查询4.WHERE子句指定查询条件。只将满足逻辑表达式的数据作为查询结果。如果不加WHERE子句,则所有数据都作为查询结果。4.2.1简单查询(1)逻辑表达式逻辑表达式一般包括连接条件和过滤条件。(1)连接条件用于当从多个表中进行数据查询时,指定表和表之间的连接字段,也可以在FROM的ON子句中指定连接条件。格式为:别名1.字段表达式1=别名2.字段表达式24.2.1简单查询(2)过滤条件用于对数据进行筛选时指定筛选条件。格式为:别名.字段表达式=值4.2.1简单查询

查询条件关系条件复合条件确定范围

所用符号或关键字=,>,>=,<,<=,=,<>NOT,AND,ORBETWEEN…AND(或NOTBETWEEN… AND)包含子项IN(或NOTIN)字符匹配字符串表达式[NOT]LIKE<模式>4.2.1简单查询(2)有条件查询(1)列出2009级学生的学号、姓名等信息。SELECT学号,姓名,入学成绩FROM学生whereleft(学号,4)="2009“(2)查询2009年9月1日入学且入学成绩不低于600分的学生信息。SELECT*FROM学生where入学时间=#2009-9-1#AND入学成绩>=60020004.2.1简单查询如果要求某列的数据在某个区间内,可以

使用该运算符(3)列出工资在1000—2000之间的教师信息。

SELECT*FROM教师where工资BETWEEN 1000AND2000

SELECT*FROM教师where工资NOT BETWEEN1000AND等价于:

SELECT*FROM教师

注意:WHERE工资>=1000AND工

资<=2000

BETWEEN包括边界值,而NOTBETWEEN

不包括边界值4.2.1简单查询当要求表的列值是某几个值中的一个时用

IN运算符(4)列出选修了课程号为“01”和“53”的学生的学号和成绩。

SELECT学号,成绩FROM学生选课WHERE

课程编号IN("01","53")

SELECT学号,成绩FROM学生选课WHERE

课程编号NOTIN("01","53")

等价于:

SELECT学号,成绩FROM学生选 课WHERE课程编号="01"OR课 程编号="53"ISNULL的功能是4.2.1简单查询(5)查找考试成绩为空的学生的学号和课程号。

SELECT学号,课程编号FROM学生选课WHERE

考试成绩ISNULL!注意WHERE不要写成“WHERE成绩=NULL”测试属性值是否为空值。SELECT学号,课程编号FROM学生选课WHERE考试成绩ISNOTNULLSELECT学号,课程编号FROM学生选课WHERENOT考试成绩ISNULL4.2.1简单查询(6)在“教师”表中列出非计算机系的教师信息。SELECT*FROM教师WHERE所属系<>"计算机“或SELECT*FROM教师WHERE所属系!=“计算机“(在SQLSERVER中)或SELECT*FROM教师WHERENOT(所属系="计算机")*%?#[]

4.2.1简单查询(7)LIKE中可使用的通配符通配符

含义匹配零个或多个字符例子任意类型和长度的字符串匹配任何一个字符‘李%’姓李的_(下划线)任何单个字符‘_文%’第2个字为文匹配一个数字描述可匹配的字符范围4.2.1简单查询从学生表中查找姓名中第2个字是“天”的学生:SELECT*FROM学生WHERE姓名LIKE‘?天*'从“学生”表中查找姓“刘”的学生:SELECT*FROM学生WHERE(姓名LIKE'刘*')SELECT*FROM学生WHERE(姓名LIKE'刘%')4.2.1简单查询5.ORDER子句指定查询结果排列顺序,一般放在SQL语句的最后。其中:排序字段:设置排序的字段或表达式。ASC:按表达式升序排列。(默认)DESC:按表达式降序排列。4.2.1简单查询根据“学生”表查询所有入学成绩大于500分的女生的姓名、性别、专业和入学成绩,并按入学成绩升序排列记录。SELECT学号,性别,专业,入学成绩FROM学生WHERE性别="女"AND入学成绩>500ORDERBY入学成绩ASCASC是用来指明显示结果的顺序,在此处可以不加。4.2.1简单查询列出学生表前3个学生的全部信息SELECTTOP3*FROM学生ORDERBY学号注意:TOP是指逻辑头,若存在排序,则是排序后的TOP4.2.1简单查询6.GROUP子句对查询结果进行分组统计,统计选项必须是数值型的数据。其中:分组字段列表:列表中的字段名称的顺序决定了分组的先后顺序。可以和GROUPBY一起使用的统计函数有:sum、avg、max、min、first、last等。4.2.1简单查询根据学生选课表查询输出已选了课的学生的信息SELECT学号,avg(考试成绩)FROM学生选课GROUPBY学号ORDERBY学号4.2.1简单查询7.HAVING子句根据HAVING指出的条件,GROUPBY选取满足该条件的组输出。给出所有超过5个学生所选修课程的学生数。

SELECT课程编号,COUNT(学号)FROM学生选 课GROUPBY课程编号HAVINGCOUNT(*)>54.2.2多表查询(连接)在查询中,如果同时涉及两个或者两个以上的表,就称其为多表查询。使用多表查询时要注意:

在FROM子句中列出参与查询的表; 如果参与查询的表存在同名的字段,并且这些字段要参与查 询,必须在字段前加表名; 必须在FROM子句中用JOIN语句或在WHERE子句中将多个 表用某些字段或表达式连接起来。多表查询的实现有两种基本途径,即连接查询和嵌套查询(子查询)。4.2.2多表查询(连接)多表查询中如果需要实行连接运算,就可以采用连接查询方式。连接查询中连接条件在WHERE子句中实现。用来连接两个表的条件称为连接条件或连接谓词。按照连接谓词的不同,可以将其分为如下几种类型:

等值与非等值连接。连接查询时,如果连接谓词为比较

运算符,则称之为等值或非等值连接。

自身连接。有时在查询中需要对相同的表进行连接,即

同一个表与其自身进行连接,称其为自身连接。在自身 连接中,为了区别两个相同的表,需对一个表使用两种 表名。

外部连接。字段不在一张表中,其中“学生学生选课是这两张表的连接条件。学生.学号=姓名,成绩FROM4.2.2多表查询(连接)1.等值与非等值连接查询[<表名1>.]<列名><比较运算符>[<表名2>.]<列名>

列出选修了“01”号课程的学生姓名及成绩。

SELECT姓名,考试成绩FROM学生,学生选课

WHERE学生.学号=学生选课.学号AND课程编号="01"

“姓名”和“考试成绩”两个

引入“别名”,也可如下实现:

SELECT学生选课.学号”学生S,学生选课SC WHERES.学号=SC.学号AND课程编号="01"4.2.2多表查询(连接)查询学习课程号为“11”课程的所有学生学号与姓名。

SELECT学号,姓名FROM学生,学生选课WHERE

学生.学号=学生选课.学号AND课程编号=“11”4.2.2多表查询(连接)2.自身连接查询

SQL不仅可以对多个数据表实行连接操作,也可

以将同一数据表与其自身进行连接,这种连接称 为自身连接。 列出同时选修了“01”号课程和“02”号课程的学生学 号。

SELECTX.学号FROM学生选课X,学生选课Y WHEREX.学号=Y.学号ANDX.课程编号= "01"ANDY.课程编号="02"4.2.2多表查询(连接)查询至少选修“2009303010001”所选修的一门课程的学生学号。

SELECTX.学号FROM学生选课X,学生选课Y WHEREX.课程编号=Y.课程编号ANDY.学号= “2009303010001”4.2.2多表查询(连接)列出所有选修“01”号课程的学生中,成绩大于学号为“2009303010001”的学生“01”号课程考试成绩的学号和成绩。

SELECTX.学号,X.考试成绩FROM学生选课X,学生

选课YWHEREX.课程编号="01"ANDX.课程编

号=Y.课程编号ANDY.学号

="2009303010001"ANDX.考试成绩>Y.考试

成绩4.2.2多表查询(连接)3.外部连接查询

外部连接查询也是一种将多表进行连接的查询,其格 式为:

FROM表名1INNER|LEFT|RIGHT|FULL

JOIN表名2ON连接条件 其中:

INNERJOIN等价于JOIN,为普通连接,亦称内部

连接。

LEFTJOIN为左连接,RIGHTJOIN为右连接,FULL JOIN为全连接,这几种连接不太常用。

ON连接条件:用来指定连接条件。由于此子句已经给

出连接条件,所以不再在WHERE子句中给出。4.2.2多表查询(连接)列出“陈诚”同学所选修的课程编号和成绩。

SELECT课程编号,平时成绩,考试成绩FROM学生

INNERJOIN学生选课ON学生.学号=学生选课.

学号WHERE学生.姓名="陈诚"

它等价于:

SELECT课程编号,平时成绩,考试成绩FROM学生

S,学生选课SCWHERES.姓名="陈诚"ANDS.

学号=SC.学号4.2.2多表查询(连接)根据“学生”、“课程”和“学生选课”表,查询选修成绩不低于85分的学生的学号、姓名、所选课程的课程名、成绩,并按考试成绩降序排列记录。

SELECTb.学号,姓名,课程名称,考试成绩FROM(

课程aINNERJOIN学生选课bONa.课程编号=b.

课程编号)INNERJOIN学生cONb.学号=c.学号

WHERE考试成绩>=85ORDERBY考试成绩

DESC4.2.2多表查询(连接)JOIN可以进行多个表的连接。在连接时,JOIN的顺序和ON的顺序(相应的连接条件)正好相反:

SELECTb.学号,姓名,课程名称,考试成绩FROM课程

aINNERJOIN(学生选课bINNERJOIN学生c ONb.学号=c.学号)ONa.课程编号=b.课程编号

WHERE考试成绩>=85ORDERBY考试成绩desc

注意书写顺序,先为后连接的 表指定连接条件4.2.2多表查询(连接)查询所有学生选课的课程号和相应成绩。

SELECT学生.学号,姓名,课程编号,考试成绩

FROM学生LEFTJOIN学生选课ON学生.学号

=学生选课.学号

SELECT学生选课.学号,课程.课程编号,考试成绩

FROM学生选课RIGHTJOIN课程ON学生选 课.课程编号=课程.课程编号4.2.3嵌套查询在一个SELECT-SQL语句中又出现了另一个SELECT语句的情形,称之为SELECT嵌套。对于嵌套的查询,通常利用一个SELECT查询(内层查询)的结果来筑构另一个SELECT查询(外层查询)的筛选条件。子查询出现在另一个SELECT语句的WHERE或HAVING子句中的查询。在嵌套查询中,内层的SELECT语句称为子查询,而把包含有子查询的SELECT语句称为双亲语句。用简单的SELECT语句实现不了查询时用嵌套查询。4.2.3嵌套查询1.返回单值的子查询

返回单值的子查询:子查询的结果只返回一个值,如:查

询学号为“2009303010001”的同学的性别,只有一个 值。 列出选修了编译原理的所有学生的学号。

SELECT学号FROM学生选课WHERE课程编号=

(SELECT课程编号FROM课程WHERE课程名称="

编译原理")

!由于编译原理的“课程编号”只有一个(返回结果不只一 个时,不能用“=”号)4.2.3嵌套查询在“学生”表中查询与陈静同乡的学生情况。

SELECT*FROM学生WHERE籍贯=(SELECT

籍贯FROM学生WHERE姓名=“陈静”)列出学生选课中01号考试课程成绩高于该课程平均成绩的学生信息。

SELECT学号,考试成绩FROM学生选课WHERE课程 编号="01"AND考试成绩>(SELECTINT(AVG(考

试成绩))FROM学生选课WHERE课程编号="01")

子查询中,计算出01号课程的平均成 绩,作为主查询的比较条件4.2.3嵌套查询根据学生表查询入学成绩小于600但最接近600的学生情况,包括姓名、入学日期和入学成绩。

SELECT姓名,出生日期,入学成绩FROM学生

WHERE入学成绩=(SELECTMAX(入学成绩) FROM学生WHERE入学成绩<600)

子查询从学生表中取出入学成绩低于

600分的学生之最高成绩4.2.3嵌套查询找出每个学生超过他选修课程平均成绩的课程号。

SELECT学号,课程编号,考试成绩FROM学生选 课ASAWHERE考试成绩>=(SELECTAVG(考

试成绩)FROM学生选课ASBWHEREA.学号

=B.学号)

相关子查询4.2.3嵌套查询在一个SELECT-SQL语句中又出现了另一个SELECT语句的情形,称之为SELECT嵌套。对于嵌套的查询,通常利用一个SELECT查询(内层查询)的结果来筑构另一个SELECT查询(外层查询)的筛选条件。在嵌套查询中,内层的SELECT语句称为子查询,而把包含有子查询的SELECT语句称为双亲语句。子查询出现在另一个SELECT语句的WHERE或HAVING子句中的查询。用简单的SELECT语句实现不了查询时用嵌套查询。4.2.3嵌套查询1.返回单值的子查询

返回单值的子查询:子查询的结果只返回一个值。4.2.3嵌套查询2、返回一组值的子查询

如果某个子查询的返回值不止一个,则必须指明在

WHERE子句中应怎样使用这些返回值。通常使用

谓词ANY、ALL和IN。(1)ANY谓词的用法

使用ANY谓词表示查询结果中的任意一个值。4.2.3嵌套查询求选修01号课程的学生中成绩比选修了02号课程的最低成绩要高的学生的学号和成绩。

SELECT学号,考试成绩FROM学生选课WHERE课 程编号="01"AND考试成绩>ANY(SELECT MIN(考试成绩)FROM学生选课WHERE课程编号

="02")4.2.3嵌套查询(2)ALL谓词的用法。

使用ALL谓词表示查询结果中的所有值或每一个值。 在“学生”表中查询出生年份最早的学生情况。

SELECT*FROM学生

WHEREYEAR(出生日期)<=ALL (SELECTYEAR(出生日期)FROM学生)

出生年份最早的学生一定比其他年份出生的学 生都要小,所以,该查询首先找出所有学生的 出生年份,然后在全部记录中找出生年份小于 等于前面所有年份的记录。4.2.3嵌套查询或:

SELECT*FROM学生WHEREYEAR(出生日

期)=(SELECTMIN(YEAR(出生日期))FROM

学生)或:

SELECT*FROM学生WHEREYEAR(出生日期)

IN(SELECTMIN(YEAR(出生日期))FROM学 生)4.2.3嵌套查询查询比计算机专业的学生年龄都小的学生姓名和年龄。

SELECT姓名,2011-year(出生日期)FROM学生

WHERE2011-year(出生日期)<ALL(SELECT 2011-year(出生日期)FROM学生WHERE专业 编号="04")AND专业编号<>"04“

或:

SELECT姓名,2011-year(出生日期)FROM学生

WHERE2011-year(出生日期)<(SELECT MIN(2011-year(出生日期))FROM学生

WHERE专业编号="04")AND专业编号<>"04"4.2.3嵌套查询使用ANY或ALL谓词时,必须同时使用比较运算符。=<><<=>>=ANY ALLIN --

--NOTIN<MAX<MIN<=MAX<=MIN>MIN>MAX>=MIN>=MAX4.2.3嵌套查询(3)IN谓词的用法。

使用IN谓词表示包含于查询结果中。

列出“学生”表中“计算机”专业未选课的学生。

SELECT*FROM学生WHERE专业编号="04"

AND学号NOTIN(SELECT学号FROM学生 选课)4.2.3嵌套查询列出学生表中“计算机”专业选课的学生。

SELECT*FROM学生WHERE专业编号="04"

AND学号IN(SELECT学号FROM学生选课)4.2.3嵌套查询列出“电子信息”专业学生的选课情况。

SELECT*FROM学生选课WHERE学号IN

(SELECT学号FROM学生WHERE专业编号

="05")

使用IN运算符时,子查询字段表中 只能指定一个表达式4.2.3嵌套查询查询与陈诚在同一个专业学习的学生。

SELECT学生.学号,姓名FROM学生WHERE专业 编号IN(SELECT专业编号FROM学生WHERE

姓名='陈诚')4.2.3嵌套查询根据课程和学生选课表,查询选修了“大学英语”的学生的学号、课程名、成绩。

SELECTb.学号,课程名称,考试成绩FROM课程a,

学生选课b WHEREa.课程编号=b.课程编号AND课程名称IN

(SELECT课程名称FROM课程

WHERE课程名称="大学英语")4.2.3嵌套查询查询选修了课程名为“编译原理”的所有学生的姓名。

SELECT姓名FROM学生WHERE学生.学号IN

(SELECT学生选课.学号FROM学生选课WHERE

课程编号IN (SELECT课程编号FROM课程

WHERE课程名称="编译原理"))4.2.3嵌套查询查询同时选修了01号和02号课程的学生学号。

SELECT学号from学生选课WHERE课程编号

="01"AND学号IN(SELECT学号from学生选课

WHERE课程编号="02")

交4.2.3嵌套查询查询选修了01号课程而没有选修02号课程的学生学号。

SELECT学号from学生选课WHERE课程编号

="01"AND学号NOTIN(SELECT学号from学 生选课WHERE课程编号="02")

差EXISTS相4.2.3嵌套查询(4)EXISTS存在量词的用法。

查询“选修了课程号为01的所有学生的姓名”。

SELECT姓名FROM学生WHEREEXISTS

(SELECT*FROM学生选课WHERE学生.学 号=学生选课.学号AND课程编号="01")

关子查询

SELECT姓名FROM学生,学生选课

WHERE学生.学号=学生选课.学号AND课连接查询

程编号="01"

SELECT姓名FROM学生WHERE学号IN

(SELECT学号FROM学生选课WHERE课程编号="01")IN嵌套查询4.2.3嵌套查询查询与陈诚在同一个专业学习的学生。前面用IN来实现了,现在采用EXISTS谓词:

SELECT学号,姓名,专业编号FROM学生S1 WHEREEXISTS(SELECT*FROM学生S2 WHERES1.专业编号=S2.专业编号ANDS2.姓名

="陈诚")4.2.3嵌套查询查询同时选修了01号和02号课程的学生学号。前面用IN来实现了,现在采用EXISTS谓词:

SELECT学号from学生选课AWHERE课程编号

="01"ANDEXISTS(SELECT*from学生选课B WHEREB.课程编号="02"ANDA.学号=B.学号)4.2.3嵌套查询查询选修了01号课程而没有选修02号课程的学生学号。前面用IN来实现了,现在采用EXISTS谓词:

SELECT学号from学生选课AWHERE课程编号

="01"ANDNOTEXISTS(SELECT*from学生选 课BWHERE课程编号="02"ANDA.学号=B.学号

)4.2.3嵌套查询所有带IN谓词、ANY和ALL谓词的子查询都能用EXISTS谓词的子查询等价替换。但是一些带有EXISTS(NOTEXISTS)的子查询不能够用其他形式的子查询等价替换。4.2.3嵌套查询查询至少选修了2009303010001号学生所选全部课程的学号。分析后得出含义为:不存在这样的课程,2009303010001号学生选了,学生x没有选!某个学生所选课B 2009303010001号 学生所选课程A应该满足:NotExists(A-B)为真4.2.3嵌套查询

A-B表示:SELECT课程编号FROM学生选课WHERE学号

=‘2009303010001’AND课程编号notINSELECT课程编号FROM学生选课WHERE学号=‘x’SELECT课程号FROM学生选课asAWHERE学号=‘2009303010001’

ANDnotExists (SELECT课程编号

FROM学生选课asB WHERE学号=‘x’

ANDA.课程编号=B.课程编

号)学号=‘x’4.2.3嵌套查询NotExists(A-B)的表示:

SELECT学号FROM学生选课asC WHERENotExists

(SELECT*FROM学生选课asAWHERE学 号="2009303010001"ANDnotExists

(SELECT* FROM学生选课asB WHEREC.学号=B.学号

ANDA.课程编号=B.课程编号))4.2.3嵌套查询查询选修了全部课程的学生。某个学生所选课B

全部课程A应该满足:A-B为空即:NotExists(A-B)为真4.2.3嵌套查询

SELECTdistinct学号FROM学生选课asC WHERE NOTEXISTS(SELECT*FROM学生选课asA WHERENOTEXISTS(SELECT*FROM学生选课asB WHEREC.学号=B.学号ANDA.课程编号

=B.课程编号))

查询这样的学生,没有—

门课程是他不选修的4.2.3嵌套查询3.使用HAVING条件构造SELECT语句。

根据学生和学生选课表,列出这样的学生的姓名,对于 课程号01,他们的平均考试成绩高于总的平均考试成 绩。

SELECT姓名,AVG(考试成绩)FROM学生,学生

选课WHERE学生.学号=学生选课.学号AND课程 编号="01"

GROUPBY姓名

HAVINGAVG(考试成绩)>(SELECTAVG(考试

成绩)FROM学生选课)4.2.4汇总查询可以通过库函数对满足条件的记录进行最大值、最小值、平均值、总和、计数等运算。常用库函数有:MIN():求(字符、日期、数值等)最小值。MAX():求(字符、日期、数值等)最大值。COUNT():计算所选数据的行数。SUM():计算数值列的总和。AVG():计算数值列的平均值。这些库函数一般是从一组值中计算出一个汇总信息。4.2.4汇总查询用GROUPBY子句来定义或划分字段的值成为多个组,它能控制和影响查询的结果。可以用上述的库函数来对分组后的数据进行各种运算。4.2.4汇总查询列出各门课的平均成绩、最高成绩、最低成绩、选课人数。SELECT课程编号,AVG(考试成绩)AS平均分,MAX(考试成绩)AS最高分,MIN(考试成绩)AS最低分,COUNT(学号)AS人数FROM学生选课GROUPBY课程编号4.2.4汇总查询查询计算机专业的学生人数。SELECTCOUNT(*)FROM学生WHERE专业编号="04"COUNT的特殊形式是COUNT(*),统计满足WHERE子句中逻辑表达式的记录的行数。先在“学生选课”表中按学号进行分组,然后,对每个分组检测其元组个数是否大于等于2,如果满足条件,则显示其学号,否则不显示。4.2.4汇总查询列出至少选修了两门课程的学生的学号。SELECT学号FROM学生选课GROUPBY学号HAVINGCOUNT(*)>=2HAVING子句和WHERE子句的区别:WHERE子句是用来指定表中各行所应满足的条件,而HAVING子句是用来指定每一分组所应满足的条件,只有满足HAVING条件的那些组才能在结果中被显示。4.2.5联合查询使用UNION可以把两个SELECT查询结果合并起来,形成一个新的查询结果。要求参与UNION合并的两个查询结果必须具有相同的输出项。除非UNION后带有ALL,否则合并结果将不会有重复的记录。4.2.5联合查询列出单科考试成绩最高和最低的学生的选课情况。SELECT*FROM学生选课WHERE考试成绩=(SELECTMAX(考试成绩)FROM学生选课)UNIONSELECT*FROM学生选课WHERE考试成绩=(SELECTMIN(考试成绩)FROM学生选课)4.2.5联合查询将学生和教师信息表合并,列出姓名,性别,出生日期,和身份。SELECT姓名,性别,出生日期,"学生"AS身份FROM学生UNIONSELECT教师姓名,性别,出生日期,"教师"AS身份FROM教师4.3Access中使用SQL查询实质上,Access2007中所有的数据库操作都是由SQL语言构成的。当用设计视图建立一个查询后,切换到SQL视图,可以看到SQL编辑器中有相应的SQL语句,这是Access自动生成的SQL语句。4.3.1SQL视图4.3.1SQL视图直接使用SQL语句。4.3.2传递查询

Access的传递查询可直接将命令发送到ODBC数据库服务器,在另一个数据库中执行查询。使用传递查询时,可以不与服务器的表链接,就可以使用相应的表。使用传递查询的主要目的是为了减少网络负荷。在Access中使用传递查询分两个步骤,首先设置要连接的数据库,然后在SQL编辑器中输入SQL语句。4.3.2传递查询1、创建传递查询。

访问SQLServer中名为Student的数据库中Stu_Info表的Stu_ID、Stu_Name、Stu_Sex、Stu_Age、Stu_Dep等字段的值。(1)在数据库窗口中单击“创建”“查询设计”。(2)单击“关闭”按钮,关闭”显示表”对话框。(3)执行“传递”命令,打开“查询”窗口。(4)打开属性表。4.3.2传递查询(5)设置“ODBC链接字符串”属性来指定要连接的数据库信息。打开“选择数据源”对话框,单击“机器数据源”选项卡:4.3.2传递查询(6)如果已经建立了要选择的数据源,可以在列表中直接选择。如果不存在,单击“新建”按钮。(7)单击“新建”按钮,打开“创建新数据源”第一个对话框,在该对话框中选择数据源类型。•“用户数据源”单选按钮:只有用户自己能够使用。•“系统数据源”单选按钮:登录到该台计算机上的任何用户都可以使用。4.3.2传递查询(8)选择“系统数据源”,然后单击“下一步”按钮,打开“创建新数据源”的第2个对话框。在该对话框中选择安装数据源的驱动程序,这里选择“SQLServer”列表项。4.3.2传递查询(9)单击“下一步”按钮,打开“创建新数据源”的第3个对话框。在该对话框中显示了前两

温馨提示

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

评论

0/150

提交评论