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

下载本文档

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

文档简介

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

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

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

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

使用ORDERBY语句可以对查询的结果进行排序,ASC、DESC分别是升序和降序排列的关键字,系统默认的是升序排列。从Products表中查询productid、productname、categoryid、unitpriceproductid,并按categoryid的升序和unitprice降序排列。当前第179页\共有195页\编于星期五\0点使用ORDERBY子句对查询的结果进行排序USENorthwindSELECTproductid,productname,categoryid,unitpriceFROMProductsORDERBYcategoryid,unitpriceDESCGO当前第180页\共有195页\编于星期五\0点条件查询使用关系运算符:从Employees表中查询出来自美国的雇员姓和所在城市。USENorthwindSELECTlastname,cityFROMemployeesWHEREcountry=

温馨提示

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

评论

0/150

提交评论