数据库演示文稿_第1页
数据库演示文稿_第2页
数据库演示文稿_第3页
数据库演示文稿_第4页
数据库演示文稿_第5页
已阅读5页,还剩190页未读 继续免费阅读

下载本文档

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

文档简介

数据库演示文稿目前一页\总数一百九十五页\编于十四点优选数据库目前二页\总数一百九十五页\编于十四点学习目标数据库系统作为数据存储的仓库,同时还需要担当起数据管理、维护的角色。目前三页\总数一百九十五页\编于十四点学习目标包括数据的入库和出库,前面学习了数据入库时需要作的相应工作,在本章中,将学习如何在数据库中查找数据并将该部分数据“出库”,使这些数据以一定的格式和排列方法展现给用户,并且掌握如何增加检索数据易读性的方法,比如排序在此基础上,还将学习更加复杂的技巧——分组与汇总。目前四页\总数一百九十五页\编于十四点学习目标掌握这些的单表查询技巧,将为应用程序提供最强的数据层的支持,减少逻辑层的负担。结合以前学习的主键和外键等基础知识,通过本章学习,将逐步掌握按照功能需求熟练检索出符合要求的数据并将其按照指定格式展现给用户或者应用程序。目前五页\总数一百九十五页\编于十四点本章要点简单查询语句查询语句的统计功能数据的联接子查询目前六页\总数一百九十五页\编于十四点简单查询语句在创建查询时,需要输入相应的查询语句。基本的SELECT语句选择数据列使用TOP和DISTINCT使用列别名目前七页\总数一百九十五页\编于十四点简单查询语句使用计算列使用WHERE子句使用ORDERBY子句目前八页\总数一百九十五页\编于十四点基本的SELECT语句先看一个最简单的查询实例。【例4-1】查询Readers表中所有记录的信息(光盘:\源文件\第4章\例4-1)。目前九页\总数一百九十五页\编于十四点基本的SELECT语句USELibraryGOSELECT*FROMReadersGO在查询分析器中输入并运行上述代码。目前十页\总数一百九十五页\编于十四点最简单的查询语句目前十一页\总数一百九十五页\编于十四点基本的SELECT语句例4-1中的SELECT语句的作用就是查询Readers表中的全部信息,其中*表示查询表中的所有字段,此时,显示结果集中的列的顺序和创建表时的顺序一致。当然,要显示指定的列,也可以将所有的列名在SELECT关键字后列出。目前十二页\总数一百九十五页\编于十四点选择数据列如果要查询表中的部分列,可以将要显示的列名在SELECT关键字后依次列出,列名与列名之间用英文逗号隔开,列的顺序可以根据需要指定。【例4-2】查询Readers表中所有读者的编号、姓名和登记日期(光盘:\源文件\第4章\例4-2)。目前十三页\总数一百九十五页\编于十四点选择数据列USELibraryGOSELECT读者编号,姓名,登记日期FROMReadersGO在查询分析器中输入并运行上述代码。目前十四页\总数一百九十五页\编于十四点在表中选择数据列查询目前十五页\总数一百九十五页\编于十四点使用TOP和DISTINCT使用TOP子句使用DISTINCT子句目前十六页\总数一百九十五页\编于十四点使用TOP子句在查询表中数据时,用户可以根据需要限制返回的行数。方法是在SELECT语句的字段列表前面使用TOPn子句,则查询结果中只显示表中前n条记录;如果在字段列表前使用TOPnPERCENT子句,则查询结果中只显示前n%条记录。目前十七页\总数一百九十五页\编于十四点使用TOP子句【例4-3】查询Readers表中的前5条记录(光盘:\源文件\第4章\例4-3)。USELibraryGOSELECTTOP5*FROMReadersGO目前十八页\总数一百九十五页\编于十四点使用TOP子句在查询分析器中输入并运行上述代码,执行结果如下。目前十九页\总数一百九十五页\编于十四点使用DISTINCT子句对表只选择部分列查询时,可能会出现重复行。如果要消除结果集中的重复行,可以在字段列表前面加上DISTINCT关键字。【例4-4】查询Books表中所有的出版社(光盘:\源文件\第4章\例4-4)。目前二十页\总数一百九十五页\编于十四点使用DISTINCT子句USELibraryGOSELECT出版社FROMBooksGO上述代码的执行结果如下图,可以看出结果集中有重复行。目前二十一页\总数一百九十五页\编于十四点

没有消除重复行的查询目前二十二页\总数一百九十五页\编于十四点使用DISTINCT子句下面的代码就消除了重复行,执行结果如下图所示。USELibraryGOSELECTDISTINCT出版社FROMBooksGO目前二十三页\总数一百九十五页\编于十四点消除重复行的查询目前二十四页\总数一百九十五页\编于十四点使用列别名默认结果集中显示的列标题就是在创建表时使用的列名。但是,有时也可以给列标题指定别名,以增加结果集的可读性。为结果集的列标题指定别名,可以使用以下两种格式。目前二十五页\总数一百九十五页\编于十四点使用列别名SELECT列别名=原列名FROM数据源SELECT原列名AS列别名FROM数据源目前二十六页\总数一百九十五页\编于十四点使用列别名【例4-5】查询BookCateGory表中所有记录的类编号和类名称。其中“类编号”列标题指定别名为“图书种类编号”,“类名称”列标题指定别名为“图书种类名称”(光盘:\源文件\第4章\例4-5)。目前二十七页\总数一百九十五页\编于十四点使用列别名USELibraryGOSELECT类编号AS图书种类编号,类名称AS图书种类名称FROMBookCateGOryGO在查询分析器中输入并运行上述代码。目前二十八页\总数一百九十五页\编于十四点使用列别名目前二十九页\总数一百九十五页\编于十四点使用计算列使用SELECT语句对列进行查询时,在结果中可以输出对列值计算后的值,即结果集中的列不是表中现成的列,而是由表中的一个或多个列计算出来的。【例4-6】查询Books表中每本书的书名和打过8折以后的价格(光盘:\源文件\第4章\例4-6)。目前三十页\总数一百九十五页\编于十四点使用计算列USELibraryGOSELECT图书名,价格*0.8AS折后价格FROMBooksGO目前三十一页\总数一百九十五页\编于十四点使用计算列因为结果集中由计算得到的列是没有列名的,所以本例中为其指定列名为“折后价格”,以增加结果集的可读性。在查询分析器中输入并运行上述代码。目前三十二页\总数一百九十五页\编于十四点使用计算列目前三十三页\总数一百九十五页\编于十四点使用WHERE子句如果只希望得到表中满足特定条件的一些记录,用户可以在查询语句中使用WHERE子句。在WHERE子句中,组成条件表达式的运算符有6种。目前三十四页\总数一百九十五页\编于十四点WHERE子句中的运算符运算符分类运算符意义比较运算符>、>=、=、<、<=、<>、!=、!>、!<比较大小范围运算符BETWEEN…AND判断列值是否在指定范围内NOTBETWEEN…AND列表运算符IN判断列值是否为列表中的指定值NOTIN目前三十五页\总数一百九十五页\编于十四点WHERE子句中的运算符运算符分类运算符意义模式匹配符LIKE判断列值是否与指定的字符通配格式相符NOTLIKE空值运算符ISNULL判断列值是否为空NOTISNULL逻辑运算符AND用于多条件的逻辑连接ORNOT目前三十六页\总数一百九十五页\编于十四点使用WHERE子句下面举例说明WHERE子句中运算符的使用方法。比较运算符范围运算符目前三十七页\总数一百九十五页\编于十四点使用WHERE子句列表运算符模式匹配运算符空值运算符逻辑运算符目前三十八页\总数一百九十五页\编于十四点比较运算符比较运算符用来比较两个表达式的大小,它包括:>、>=、=、<、<=、<>、!=、!>和!<,其中“<>”或“!=”表示不等于,“!>”表示不大于,“!<”表示不小于。目前三十九页\总数一百九十五页\编于十四点比较运算符【例4-7】查询Books表中价格大于等于20元的图书的编号、图书名、作者以及价格(光盘:\源文件\第4章\例4-7)。目前四十页\总数一百九十五页\编于十四点USELibraryGOSELECT图书编号,图书名,作者,价格FROMBooksWHERE价格>=20GO目前四十一页\总数一百九十五页\编于十四点比较运算符在查询分析器中输入并运行上述代码,执行结果如下图。目前四十二页\总数一百九十五页\编于十四点范围运算符范围运算符用来判断列值否在指定的范围内。范围运算符包括BETWEEN…AND和NOTBETWEEN…AND。该运算符的语法格式如下:列表达式[NOT]BETWEEN起始值AND终止值目前四十三页\总数一百九十五页\编于十四点范围运算符如果列表达式的值在起始值和终止值之间,则运算结果为TRUE,否则为FALSE。使用NOT时,运算结果刚好相反。目前四十四页\总数一百九十五页\编于十四点范围运算符【例4-8】查询Books表中在2005年期间上架的图书的编号、图书名、作者及上架时间(光盘:\源文件\第4章\例4-8)。目前四十五页\总数一百九十五页\编于十四点指定查询范围目前四十六页\总数一百九十五页\编于十四点列表运算符列表运算符用来判断给定的列值是否在所给定的子列表中。列表运算符包括IN和NOTIN。该运算符的语法格式如下:列表达式[NOT]IN(列值1,…列值n)目前四十七页\总数一百九十五页\编于十四点列表运算符如果列表达式的值等于子列表中的某个值,则运算结果为TRUE,否则运算结果为FALSE。使用NOT时,运算结果刚好相反。【例4-9】查询Books表中飞天、新宇两个出版社的图书的编号、图书名及出版社(光盘:\源文件\第4章\例4-9)。目前四十八页\总数一百九十五页\编于十四点使用IN确定查询值目前四十九页\总数一百九十五页\编于十四点模式匹配运算符在实际应用中,经常需要根据一些不确定的信息来进行模糊查询。模式匹配运算符LIKE和NOTLIKE可以实现这类查询,其中LIKE表示字符串表达式的值与匹配串相符,NOTLIKE则相反。其一般语法格式如下:字符串表达式[NOT]LIKE'<匹配串>'目前五十页\总数一百九十五页\编于十四点模式匹配运算符其中匹配串可以是一个完整的字符串,也可以是含有通配符的字符串。目前五十一页\总数一百九十五页\编于十四点通配符说明通配符说明%代表0个或多个字符_(下划线)代表单个字符[]指定范围(如[a-f]、[0-9])或集合(如[abcdef])中的任何单个字符[^]指定不属于范围(如[^a-f]、[^0-9])或集合(如[^abcdef])中的任何单个字符目前五十二页\总数一百九十五页\编于十四点模式匹配运算符【例4-10】查询Readers表中姓“张”的读者的信息(光盘:\源文件\第4章\例4-10)。通配符字符串'张%'的含义是第一个汉字是“张”的字符串。目前五十三页\总数一百九十五页\编于十四点模糊查询目前五十四页\总数一百九十五页\编于十四点空值运算符数据库中的数据一般都应该是有意义的,但有些列的值可能暂时不知道或不确定,这时可以不输入该列的值,那么称该列的值为空值,通常用NULL表示。空值与0或空格是不一样的。空值运算符ISNULL和NOTISNULL用来判断指定的列值是否为空。目前五十五页\总数一百九十五页\编于十四点空值运算符其语法格式如下:列表达式[NOT]ISNULL【例4-11】查询Readers表中住址为空的读者的编号、姓名、性别和住址(光盘:\源文件\第4章\例4-11)。在查询分析器中输入并运行上述代码。目前五十六页\总数一百九十五页\编于十四点查询空值目前五十七页\总数一百九十五页\编于十四点逻辑运算符用户可以使用逻辑运算符AND、OR和NOT连接多个查询条件,实现多重条件查询。逻辑运算符语法格式如下:[NOT]逻辑表达式AND|OR[NOT]逻辑表达式目前五十八页\总数一百九十五页\编于十四点逻辑运算符【例4-12】要求用逻辑运算符实现例4-8中的查询(光盘:\源文件\第4章\例4-12)。目前五十九页\总数一百九十五页\编于十四点逻辑运算符USELibraryGOSELECT图书编号,图书名,作者,上架时间FROMBooksWHERE上架时间>='2005-01-01'AND上架时间<='2005-12-31'GO目前六十页\总数一百九十五页\编于十四点逻辑运算符上述代码的执行结果和例4-8相同。目前六十一页\总数一百九十五页\编于十四点逻辑运算符【例4-13】要求用逻辑运算符实现例4-9中的查询(光盘:\源文件\第4章\例4-13)。USELibraryGOSELECT图书编号,图书名,出版社目前六十二页\总数一百九十五页\编于十四点逻辑运算符FROMBooksWHERE出版社='飞天'OR出版社='新宇'GO上述代码的执行结果和例4-9相同。目前六十三页\总数一百九十五页\编于十四点使用IN确定查询值目前六十四页\总数一百九十五页\编于十四点使用ORDERBY子句通常查询结果集中的记录的顺序是它们在表中的顺序,但有时用户希望查询结果集中的记录按某种顺序显示。可以通过ORDEYBY子句改变查询结果集中记录的显示顺序。ORDERBY子句的语法格式为:ORDERBY{列名[ASC|DESC]}[,…n]目前六十五页\总数一百九十五页\编于十四点使用ORDERBY子句其中ASC表示按升序排列,DESC按降序排列,默认为ASC。当按多列排序时,先按写在前面的列排序,当前面的列值相同时,再按后面的列排序。目前六十六页\总数一百九十五页\编于十四点使用ORDERBY子句【例4-14】查询Books表中“新宇”出版社图书的编号、图书名、出版社、类编号及上架时间。查询结果先按类编号降序排列,类编号相同的书再按上架时间升序排列(光盘:\源文件\第4章\例4-14)。目前六十七页\总数一百九十五页\编于十四点将查询结果排序目前六十八页\总数一百九十五页\编于十四点查询语句的统计功能用户经常需要对查询结果集进行统计,例如求和、平均值、最大值、最小值和个数等,这些统计可以通过以下3种方法实现。使用聚合函数。使用GROUPBY子句。使用COMPUTE子句。目前六十九页\总数一百九十五页\编于十四点查询语句的统计功能使用聚合函数使用GROUPBY子句使用COMPUTE子句目前七十页\总数一百九十五页\编于十四点使用聚合函数聚合函数用来对查询结果集中的记录进行统计计算,并在结果集中将统计结果生成一条新记录。SQLServer2000提供了许多聚合函数。目前七十一页\总数一百九十五页\编于十四点常用集合函数表函数名语法格式功能说明AVGAVG([ALL|DISTINCT]列名)计算一个数值列的平均值SUMSUM([ALL|DISTINCT]列名)计算一个数值列的总和MAXMAX([ALL|DISTINCT]列名)返回指定列中的最大值MINMIN([ALL|DISTINCT]列名)返回指定列中的最小值COUNTCOUNT([ALL|DISTINCT]列名|*)统计查询结果集中记录的个数目前七十二页\总数一百九十五页\编于十四点使用聚合函数表4-3语法格式中的DISTINCT表示去掉指定列中的重复值,ALL表示不取消重复值,默认是ALL。【例4-15】计算Books表中所有图书的平均价格、总价、最高价、最低价及记录的个数(光盘:\源文件\第4章\例4-15)。目前七十三页\总数一百九十五页\编于十四点聚合函数的使用目前七十四页\总数一百九十五页\编于十四点使用GROUPBY子句GROUPBY子句用于对结果集进行分组并对每一组数据进行汇总计算。其语法格式为:GROUPBY列名[HAVING条件表达式]目前七十五页\总数一百九十五页\编于十四点使用GROUPBY子句GROUPBY按“列名”指定的列进行分组,将该列列值相同的记录组成一组,对每一组进行汇总计算。每一组生成一条记录。若有“HAVING条件表达式”选项,则表示对生成的组进行筛选。目前七十六页\总数一百九十五页\编于十四点使用GROUPBY子句【例4-16】统计Books表中各个出版社的图书数量(光盘:\源文件\第4章\例4-16)。在查询分析器中输入并运行上述代码。目前七十七页\总数一百九十五页\编于十四点分组统计目前七十八页\总数一百九十五页\编于十四点使用GROUPBY子句【例4-17】对例4-16中的代码改为以下代码,则只显示图书数量大于10的汇总行(光盘:\源文件\第4章\例4-17)。在查询分析器中输入并运行上述代码。目前七十九页\总数一百九十五页\编于十四点对分组统计进行筛选目前八十页\总数一百九十五页\编于十四点使用COMPUTE子句COMPUTE子句对查询结果集进行汇总统计,并显示参加汇总记录的详细信息。其语法格式为:COMPUTE聚合函数[BY列名]目前八十一页\总数一百九十五页\编于十四点使用COMPUTE子句COMPUTEBY子句与GROUPBY子句的功能类似,都可以对查询结果集进行分组统计,不同的是,COMPUTEBY子句不仅显示汇总数据,还分组显示参加汇总的记录的详细信息,而GROUPBY子句仅显示汇总数据。目前八十二页\总数一百九十五页\编于十四点使用COMPUTE子句【例4-18】统计Books表中各出版社的图书数量,并显示参加汇总的记录的详细信息(光盘:\源文件\第4章\例4-18)。在查询分析器中输入并运行上述代码,其执行结果如下图。由于记录个数较多,所以该图只显示出部分出版社的统计信息。目前八十三页\总数一百九十五页\编于十四点使用COMPUTE子句目前八十四页\总数一百九十五页\编于十四点使用COMPUTE子句从上图可以看出,COMPUTE子句产生附加的汇总行,其列标题是系统自定的,如对于COUNT函数为cnt,对于AVG函数为avg,对于SUM函数为sum。目前八十五页\总数一百九十五页\编于十四点数据的连接前面讲的查询都是针对一个表进行的,而在实际应用中,一个查询往往需要从多个表中检索数据,这就需要使用联接查询。联接分为交叉联接、内联接、外联接和自联接4种。下面分别进行介绍。目前八十六页\总数一百九十五页\编于十四点数据的连接交叉联接内联接外联接自联接合并结果集目前八十七页\总数一百九十五页\编于十四点

交叉联接交叉联接又称非限制联接(广义笛卡尔积),它将两个表不加任何约束地组合在一起,也就是将第一个表的所有记录分别与第二个表的每条记录拼接组成新记录,联接后结果集的行数就是两个表的行的乘积,结果集的列数就是两个表的列数之和。目前八十八页\总数一百九十五页\编于十四点

交叉联接交叉联接有以下两种语法格式。SELECT列名列表FROM表名1CROSSJOIN表名2SELECT列名列表FROM表名l,表名2目前八十九页\总数一百九十五页\编于十四点交叉联接【例4-19】假设数据库Library中又创建了tl和t2两个表,如图4-18所示。tl表中有“读者编号”和“姓名”两字段,t2表中有“读者编号”和“已借册数”两字段,两表各包含3条记录。用交叉连接方法联接两表,观察联接后的结果。(光盘:\源文件\第4章\例4-19)目前九十页\总数一百九十五页\编于十四点t1表和t2表目前九十一页\总数一百九十五页\编于十四点交叉联接USELibraryGOSELECT*FROMt1CROSSJOINt2GO在查询分析器中输入并运行上述代码,其执行结果如下图。目前九十二页\总数一百九十五页\编于十四点交叉联接目前九十三页\总数一百九十五页\编于十四点交叉联接在实际应用中,使用交叉联接产生的结果集一般没有什么意义,但在数据库的数学模式上有重要的作用。目前九十四页\总数一百九十五页\编于十四点内联接内联接是将两个表中满足联接条件的记录组合在一起。联接条件的一般格式为:ON[<表名1>.]<列名><比较运算符>[<表名2>.]<列名>参数说明如下所示。比较运算符可以是>、>=、=、<、<=、<>、!=、!>及!<。目前九十五页\总数一百九十五页\编于十四点内联接当比较运算符为“=”时,称为等值联接。若在等值联接的结果集中去除相同的列,则为自然联接。使用除“=”外运算符的联接为非等值联接。在实际应用中,联接条件通常采用“on主键=外键”的形式。目前九十六页\总数一百九十五页\编于十四点内联接内联接有以下两种语法格式。第一种格式:SELECT列名列表FROM表名l[INNER]JOIN表名2ON表名1.列名=表名2.列名第二种格式:SELECT列名列表FROM表名l,表名2WHERE表名1.列名=表名2.列名目前九十七页\总数一百九十五页\编于十四点内联接参数说明如下所示。内联接是系统默认的联接,INNER选项可以省略。目前九十八页\总数一百九十五页\编于十四点内联接若SELECT子句中有同名列,则必须用“表名.列名”来表示。为了方便使用,可以给表名定义别名。别名是在FROM子句中指定的,格式为“表名AS别名”或“表名别名”。若为表指定了别名,则只能用“别名.列名”来表示同名列,不能用“表名.列名”表示。目前九十九页\总数一百九十五页\编于十四点内联接【例4-20】用内联接方法联接tl和t2两表,不去除重复列(读者编号)。观察联接后的结果集与交叉联接有何区别(光盘:\源文件\第4章\例4-20)。目前一百页\总数一百九十五页\编于十四点内联接USELibraryGOSELECT*FROMt1JOINt2ONt1.读者编号=t2.读者编号GO目前一百零一页\总数一百九十五页\编于十四点内联接在查询分析器中输入并运行上述代码,其执行结果如下图。可以看到只有满足联接条件的记录才被拼接到结果集中,结果集是两个表中记录的交集。目前一百零二页\总数一百九十五页\编于十四点有重复列的内联接目前一百零三页\总数一百九十五页\编于十四点内联接【例4-21】用内联接方法联接tl和t2两表,去除重复列(读者编号)(光盘:\源文件\第4章\例4-21)。目前一百零四页\总数一百九十五页\编于十四点内联接USELibraryGOSELECTa.读者编号,姓名,已借册数FROMt1aJOINt2bONa.读者编号=b.读者编号GO目前一百零五页\总数一百九十五页\编于十四点内联接在查询分析器中输入并运行上述代码,其执行结果如下图。可以看出结果集中不含重复列(读者编号),去掉重复列的等值内联接则为自然联接。自然联接是联接的主要形式,在实际中应用最为广泛。目前一百零六页\总数一百九十五页\编于十四点不含重复列的内联接目前一百零七页\总数一百九十五页\编于十四点内联接也可以用第二种格式的代码实现上述功能:USELibraryGOSELECTa.读者编号,姓名,已借册数FROMt1a,t2bWHEREa.读者编号=b.读者编号GO目前一百零八页\总数一百九十五页\编于十四点外联接外联接又分为左外联接、右外联接、全外联接3种。外联接的结果集中不但包含满足联接条件的记录,还包含相应表中的不满足联接条件的记录。左外联接右外联接全外联接目前一百零九页\总数一百九十五页\编于十四点左外联接左外联接的语法格式为:SELECT列名列表FROM表名lLEFT[OUTER]JOIN表名2ON表名1.列名=表名2.列名目前一百一十页\总数一百九十五页\编于十四点左外联接左外联接的结果集中包括了左表的所有记录,而不仅仅是满足联接条件的记录。如果左表的某记录在右表中没有匹配行,则该记录在结果集行中属于右表的相应列值均为NULL。目前一百一十一页\总数一百九十五页\编于十四点左外联接【例4-22】用左外联接方法联接tl和t2两表。观察联接后所产生的结果(光盘:\源文件\第4章\例4-22)。在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百一十二页\总数一百九十五页\编于十四点左外联接目前一百一十三页\总数一百九十五页\编于十四点右外联接右外联接的语法格式为:SELECT列名列表FROM表名lRIGHT[OUTER]JOIN表名2ON表名1.列名=表名2.列名目前一百一十四页\总数一百九十五页\编于十四点右外联接右外联接的结果集中包括了右表的所有记录,而不仅仅是满足联接条件的记录。如果右表的某记录在左表中没有匹配行,则该记录在结果集行中属于左表的相应列值均为NULL。目前一百一十五页\总数一百九十五页\编于十四点右外联接【例4-23】用右外联接方法联接tl和t2两表。观察联接后所产生的结果(光盘:\源文件\第4章\例4-23)。在查询分析器中输入并运行上述代码,其执行结果如下图。目前一百一十六页\总数一百九十五页\编于十四点右外联接目前一百一十七页\总数一百九十五页\编于十四点全外联接全外联接的语法格式为:SELECT列名列表FROM表名lFULL[OUTER]JOIN表名2ON表名1.列名=表名2.列名目前一百一十八页\总数一百九十五页\编于十四点全外联接全外联接的结果集中包括了左表和右表的所有记录。当某记录在另一个表中没有匹配记录时,则另一个表的相应列值为NULL。【例4-24】用全外联接方法联接tl和t2两表。观察联接后所产生的结果(光盘:\源文件\第4章\例4-24)。目前一百一十九页\总数一百九十五页\编于十四点全外联接在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百二十页\总数一百九十五页\编于十四点自联接自联接就是将一个表与它自身进行联接,可看作一个表中的两个副本之间的内联接。若要在一个表中查找具有相同列值的行,则可以使用自联接。使用自联接时,必须为表指定两个不同的别名,使之在逻辑上成为两个表。目前一百二十一页\总数一百九十五页\编于十四点自联接【例4-25】用自联接的方法查询Books表中“图书名”相同作者不同的图书信息。要求只显示图书编号、图书名、作者和出版社(光盘:\源文件\第4章\例4-25)。在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百二十二页\总数一百九十五页\编于十四点自联接目前一百二十三页\总数一百九十五页\编于十四点合并结果集使用UNION语句可以将多个查询结果集合并为一个结果集。UNION子句的语法格式如下:SELECT语句{UNIONSELECT语句}[,…n]目前一百二十四页\总数一百九十五页\编于十四点合并结果集合并结果集的基本规则如下。UNION合并的各结果集的列数必须相同,对应的数据类型也必须兼容。默认情况下系统将自动去掉合并后的结果集中重复的行。最后结果集中的列名来自第一个SELECT语句。目前一百二十五页\总数一百九十五页\编于十四点合并结果集【例4-26】将Readers表中2004年登记的读者记录保存到表Readers_2004中,2005年登记的读者记录保存到表Readers_2005中,然后将两个表的查询结果合并为一个结果集(光盘:\源文件\第4章\例4-26)。目前一百二十六页\总数一百九十五页\编于十四点合并结果集可以在查询分析器中输入上述代码,并查看执行结果。UNION操作常用于归档数据,例如归档月报表为年报表,归档各部门数据等。注意UNION还可以与ORDERBY、GROUPBY子句一起使用,用来对合并所得的结果集进行分组或排序。目前一百二十七页\总数一百九十五页\编于十四点子查询下面介绍相关子查询和嵌套子查询的两种方式。相关子查询嵌套子查询目前一百二十八页\总数一百九十五页\编于十四点相关子查询在相关子查询中,子查询的执行依赖于外部查询,多数情况下是在子查询的WHERE子句中引用了外部查询的表。相关子查询的执行过程与前面所讲的查询完全不同,前面介绍的子查询在整个查询过程中只执行一次,而相关子查询中的子查询需要重复地执行。目前一百二十九页\总数一百九十五页\编于十四点相关子查询相关子查询的执行过程是:子查询为外部查询的每一行执行一次,外部查询将子查询引用的外部字段的值传给子查询,进行子查询操作;外部查询根据子查询得到的结果或结果集返回满足条件的结果行;外部表的每一行都将做相同的处理。目前一百三十页\总数一百九十五页\编于十四点相关子查询【例4-27】查询Books表中大于该类图书价格平均值的图书信息。(光盘:\源文件\第4章\例4-27)目前一百三十一页\总数一百九十五页\编于十四点相关子查询与前面介绍过的子查询不同,该语句中的子查询无法独立于外部查询而得到解决。该子查询需要一个“类编号”值,而该值是个变量,随SQLServer检查Books表中的不同行而改变。下面详细说明该查询的执行过程:目前一百三十二页\总数一百九十五页\编于十四点相关子查询先将Books表的第一条记录的“类编号”的值“13”代入到子查询中,则子查询变为如下形式:SELECTAVG(价格)FROMBooksASbWHERE类编号=13目前一百三十三页\总数一百九十五页\编于十四点相关子查询子查询的结果为该类图书的平均价格,如本例为20.9750,所以外部查询变为:SELECT图书名,作者,出版社,类编号,价格FROMBooksAsaWHERE价格>20.9750目前一百三十四页\总数一百九十五页\编于十四点相关子查询如果WHERE条件为TRUE,则第一条记录包括在结果集中,否则不在结果集中。对Books表中的所有行运行相同的过程,最后形成一个结果集。目前一百三十五页\总数一百九十五页\编于十四点相关子查询目前一百三十六页\总数一百九十五页\编于十四点相关子查询在子查询中,还可以通过运算符EXISTS来判断子查询的结果是否为空表。如果子查询的结果集不为空,EXISTS返回TRUE;否则返回FALSE。使用NOTEXIST时其返回值与EXISTS刚好相反。目前一百三十七页\总数一百九十五页\编于十四点相关子查询【例4-28】利用EXISTS查询所有支付过罚金的读者的信息。(光盘:\源文件\第4章\例4-28)在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百三十八页\总数一百九十五页\编于十四点使用EXISTS运算符的相关子查询目前一百三十九页\总数一百九十五页\编于十四点相关子查询本例中由EXISTS引出的子查询属于相关子查询,该查询与下面用IN表示的非相关的子查询返回的结果一样:USELibraryGOSELECT*目前一百四十页\总数一百九十五页\编于十四点相关子查询FROMReadersWHERE读者编号IN(SELECT读者编号FROMBorrowHistoryWHERE支付罚金>0)GO目前一百四十一页\总数一百九十五页\编于十四点相关子查询另外,使用联接也可以实现【例4-28】中的查询,而且联接还可以同时显示来自多个表中的字段,代码如下:USELibraryGOSELECTa.读者编号,a.姓名,b.图书编号,b.支付罚金目前一百四十二页\总数一百九十五页\编于十四点相关子查询FROMReadersASaJOINBorrowHistoryASbONa.读者编号=b.读者编号WHEREb.支付罚金>0GO在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百四十三页\总数一百九十五页\编于十四点使用联接实现例4-28的查询目前一百四十四页\总数一百九十五页\编于十四点相关子查询联接和子查询可能都要涉及两个或多个表,它们之间的区别如下。联接可以合并两个或多个表中的数据,而带子查询的SELECT语句的结果只能来自一个表,子查询的结果只是用来作为选择结果数据时进行参照的。目前一百四十五页\总数一百九十五页\编于十四点相关子查询有的查询既可以使用子查询来表达,也可以使用联接表达。通常使用子查询表示时可以将一个复杂的查询分解为一系列的逻辑步骤,条理清晰,而使用联接表示有执行速度快的优点。因此,在实际应用中,读者应根据具体情况来决定使用哪种方法。目前一百四十六页\总数一百九十五页\编于十四点嵌套子查询嵌套子查询的执行不依赖于外部查询。这类子查询的执行过程是:首先执行子查询,子查询得到的结果不被显示出来,而是传递给外部查询,作为外部查询的条件来使用,然后执行外部查询,并显示整个查询结果。目前一百四十七页\总数一百九十五页\编于十四点嵌套子查询嵌套子查询一般可分为两种:返回单个值的子查询和返回一个值列表的子查询,下面分别举例说明。返回单个值返回一个值列表目前一百四十八页\总数一百九十五页\编于十四点返回单个值该单值常被外部查询用来进行比较操作。【例4-29】在Books表中,查询所有价格高于平均价格的图书名、作者、出版社和价格。(光盘:\源文件\第4章\例4-29)目前一百四十九页\总数一百九十五页\编于十四点返回单个值本例的执行过程是先执行子查询:SELECTAVG(价格)FROMBooks其结果为23.2050(并不显示),目前一百五十页\总数一百九十五页\编于十四点返回单个值再执行外部查询:SELECT图书名,作者,出版社,价格FROMBooksWHERE价格>23.2050这样得到本例的结果如下图所示。目前一百五十一页\总数一百九十五页\编于十四点返回单值的子查询目前一百五十二页\总数一百九十五页\编于十四点返回一个值列表如果子查询返回一个值列表,则该列表常和IN、NOTIN、ANY和ALL逻辑运算符一起构成外部查询的查询条件。1)IN和NOTIN运算符目前一百五十三页\总数一百九十五页\编于十四点返回一个值列表IN和NOTIN运算符用来将一个表达式的值与子查询返回的一列值进行比较。使用IN运算符时,如果该表达式的值与此列中的任何一个相等,则IN测试返回TRUE;如果该表达式的值与此列中的任何一个值都不相等,则返回FALSE。使用NOTIN时结果相反。目前一百五十四页\总数一百九十五页\编于十四点返回一个值列表【例4-30】查询所有借阅图书的读者信息(光盘:\源文件\第4章\例4-30)。在这个例子中,首先得到“SELECT读者编号FROMBorrow”子查询的结果集,它为一列值,即所有借阅读书的读者编号,然后将其和IN运算符组成外部查询的条件执行外部查询,并得到最终结果。目前一百五十五页\总数一百九十五页\编于十四点使用IN运算符的子查询目前一百五十六页\总数一百九十五页\编于十四点返回一个值列表2)ANY和ALL运算符ANY运算符要求的语法格式如下:表达式比较运算符ANY(子查询)目前一百五十七页\总数一百九十五页\编于十四点返回一个值列表ANY运算符通过比较运算符将一个表达式的值与子查询返回的一列值中的每一个进行比较。只要有一次比较的结果为TRUE,则ANY测试返回TRUE;若每一次比较的结果均为FALSE,则ANY测试返回FALSE。目前一百五十八页\总数一百九十五页\编于十四点返回一个值列表如表达式“>ANY(1,2,3)”与“>1”等价。由于比任何一个数大表达式就成立,所以只要比最小数大即可。再如,表达式“〈ANY(1,2,3)”与“〈3”等价。由于比任何一个数小表达式就成立,所以只要比最大数小即可。目前一百五十九页\总数一百九十五页\编于十四点返回一个值列表【例4-31】在Books表中,查询“新宇”出版社的图书中价格比“飞天”出版社最低定价还高的图书信息(光盘:\源文件\第4章\例4-31)。在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百六十页\总数一百九十五页\编于十四点使用ANY运算符的子查询目前一百六十一页\总数一百九十五页\编于十四点返回一个值列表ALL运算符要求的语法格式如下:表达式比较运算符ALL(子查询)目前一百六十二页\总数一百九十五页\编于十四点返回一个值列表ALL运算符通过比较运算符将一个表达式的值与子查询返回的一列值中的每一个进行比较。若每一次比较的结果均为TRUE,则ALL测试返回TRUE;只要有一次比较的结果为FALSE,则ALL测试返回FALSE。目前一百六十三页\总数一百九十五页\编于十四点返回一个值列表如表达式“>ALL(1,2,3)”与“>3”等价。由于比所有数都大表达式才成立,所以只要比最大数大即可。再如,表达式“〈ALL(1,2,3)”与“〈1”等价。由于比所有数都小表达式才成立,所以只要比最小数小即可。目前一百六十四页\总数一百九十五页\编于十四点返回一个值列表【例4-32】在Books表中,查询所有比“飞天”出版社的图书上架时间都早的图书信息。(光盘:\源文件\第4章\例4-32)在查询分析器中输入并运行上述代码,其执行结果如下图所示。目前一百六十五页\总数一百九十五页\编于十四点使用ALL运算符的子查询目前一百六十六页\总数一百九十五页\编于十四点上机练习本节上机练习将进行图书管理系统的查询,通过这个例子,掌握SELECT语句的基本语法、聚合函数的作用和使用方法,掌握GROUPBY和ORDEYBY子句的使用方法,掌握联接查询和子查询的表示方法(光盘:\源文件\第4章\上机练习)。目前一百六十七页\总数一百九十五页\编于十四点上机练习SELECT语句的基本使用数据统计联接查询的使用子查询的使用单表查询多表查询目前一百六十八页\总数一百九十五页\编于十四点SELECT语句的基本使用首先使用SELECT语句查询数据库中的相关信息。目前一百六十九页\总数一百九十五页\编于十四点数据统计数据统计的具体操作如下。目前一百七十页\总数一百九十五页\编于十四点联接查询的使用从Borrow、Books、Readers3个表中,查询所有借书读者的姓名、借书名称、借阅日期、应还日期。为了更好地验证结果,读者可先在Readers表中插入一条和表中现有姓名相同的记录,然后再作练习。目前一百七十一页\总数一百九十五页\编于十四点子查询的使用下面将练习子查询的使用,具体操作如下。该例是一个相关子查询。读者可以使用NOTIN把它改写为非相关的子查询。同样,读者也可以查询从来没有被借出过的图书的信息。目前一百七十二页\总数一百九十五页\编于十四点单表查询下面练习单表查询的方法。简单查询使用TOP关键字使用DISTINCT关键字使用ORDERBY子句对查询的结果进行排序目前一百七十三页\总数一百九十五页\编于十四点单表查询条件查询使用BETWEENAND谓词使用IN谓词使用LIKE谓词目前一百七十四页\总数一百九十五页\编于十四点简单查询从Northwind数据库的Employees表中分别检索出雇员的所有信息,以及仅查询雇员号、姓和名。SELECT*FROMEmployeesSELECTemployeeID,Lastname,FirstnameFROMEmployees目前一百七十五页\总数一百九十五页\编于十四点简单查询如要查询时改变列标题的显示,则从Employees表中分别检索出雇员号、姓、名并分别加上‘雇员号’、‘姓’、‘名’等标题信息。目前一百七十六页\总数一百九十五页\编于十四点使用TOP关键字分别从Employees中检索出前2条及前面50%的雇员的信息。SELECTtop2*FROMEmployeesSELECTtop50percent*FROMEmployees目前一百七十七页\总数一百九十五页\编于十四点使用DISTINCT关键字从Suppliers表中检索出country并且要求显示不重复。USENorthwindSELECTDISTINCTcountryFROMSuppliersORDERBYcountryGO目前一百七十八页\总数一百九十五页\编于十四点使用ORDERBY子句对查询的结果进行排序

使用ORDERBY语句可以对查询的结果进行排序,ASC、DESC分别是升序和降序排列的关键字,系统默认的是升序排列。从Products表中查询productid、productname、categoryid、unitpriceproductid,并按categoryid的升序和unitprice降序排列。目前一百七十九页\总数一百九十五页\编于十四点使用ORDERBY子句对查询的结果进行排序USENorthwindSELECTproductid,productname,categoryid,unitpriceFROMProductsORDERBYcategoryid,unitpriceDESCGO目前一百八十页\总数一百九十五页\编于十四点条件查询使用关系运算符:从Employees表中查询出来自美国的雇员姓和所在城市。USENorthwindSELECTlastname,cityFROMemployeesWHEREcountry='USA'GO目前一百

温馨提示

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

评论

0/150

提交评论