版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 数据查询本章学习习目标l掌握SELECT语句句结构l熟练使用用SELECT语句查查询数据据5.1SELECT语句句结构SELECT在任何一一种SQL语言中,都是使使用频率率最高的的语句,它具有有强大的的查询功功能,有有的用户户甚至只只需要熟熟练掌握握SELECT语句的一一部分,就可以以轻松地地利用数数据库来来完成自自己的工工作。可可以说SELECT是SQL语言的灵灵魂。SELECT语句的作作用是让让数据库库服务器器根据客客户端的的要求搜搜寻出用用户所需需要的信信息资料料,并按按用户规规定的格格式进行行整理后后返回给给客户端端。用户户使用SELECT语句除可可以查看看普通数数据库中中的表
2、格格和视图图的信息息外,还还可以查查看SQLServer的系统信信息。SELECT语语句的语语法格式式如下:SELECTselect_list INTOnew_table_nameFROM table_source WHERE search_condition GROUP BY group_by_expression HAVINGsearch_condition ORDER BY order_expressionASC|DESC 其中:lselect_list指明要查查询的选选择列表表。列表表可以包包括若干干个列名名或表达达式,列列名或表表达式之之间用逗逗号隔开开,用来来指示应应该返回回哪些数
3、数据。表表达式可可以是列列名、函函数或常常数的列列表。lINTO new_table_name指定用查查询的结结果创建建成一个个新表。new_table_name为新表名名称。lFROM table_source指定所查查询的表表或视图图的名称称。lWHEREsearch_condition指明查询询所要满满足的条条件。lGROUPBYgroup_by_expression根据指定定列中的的值对结结果集进进行分组组。lHAVINGsearch_condition对用FROM、WHERE或GROUPBY子句创建建的中间间结果集集进行行行的筛选选。它通通常与GROUPBY子句一起起使用。l ORD
4、ER BY order_expressionASC|DESC 对查询结结果集中中的行重重新排序序。ASC和DESC关键字分分别用于于指定按按升序或或降序排排序。如如果省略略ASC或DESC,则系统统默认为为升序。5.2使使用用SELECT语句查查询数据据5.2.1使使用SELECT子子句SELECT子子句的语语法为:SELECTALL|DISTINCT TOPn PERCENT WITHTIES 其中:lALL关关键字为为默默认设置置,用于于指定查查询结果果集的所所有行,包括重重复行。lDISTINCT用用于删删除结果果集中重重复的行行。lTOPn PERCENT指指定只只返回查查询结果果集中
5、的的前n行行。如果果加了PERCENT,则表表示只返返回查询询结果集集中的前前n%行行。WITH TIES用用于于指定从从基本结结果集中中返回附附加的行行。lselect_list指明要查查询的选选择列表表。列表表可以包包括若干干个列名名或表达达式,列列名或表表达式之之间用逗逗号隔开开,用来来指示应应该返回回哪些数数据。如如果使用用星号*则表示返返回FROM子句中指指定的表表或视图图中的所所的列。表达式式可以是是列名、函数或或常数的的列表。【例5-1】查询学学生基本本信息表表中的所所有信息息。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM学生基本本信息表表GO运行
6、结果果如图5-1所示,它它将学生生基本信信息表的的所有信信息均显显示出来来。图5-1查询学生生基本信信息表中中的所有有信息【例5-2】在在学生基基本信息息表中查查询学生生的学号号、姓名名、性别别和族别别信息。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学号,姓名,性别,族别FROM学生基本本信息表表GO运行结果果如图5-2所示。图5-2在学生基基本信息息表中查查询学生生的学号号、姓名名、性别别和族别别信息【例5-3】从学生生基本信信息表中中查询学学生由几几个民族族构成。从例2结果可知知,学生生的族别别有多行行重复,要快速速查询学学生的民民族构成成,实际际上就是是对相同同值
7、的族族别只需需要显示示一行,可使用用DISTINCT关键字实实现。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECTDISTINCT族别FROM学生基本本信息表表GO运行结果果如图5-3所示。图5-3从学生基基本信息息表中查查询学生生由几个个民族构构成【例5-4】显示课课程信息息表中前前5行的信息息。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECTTOP 5*FROM学生基本本信息表表GO运行结果果如图5-4所示,只只显示查查询结果果的前5行数据。图5-4只显示查查询结果果的前5行数据【例5-5】从学生生基本信信息表中中只显示示5%的信息。在查询分分析器中中运
8、行如如下命令令:USEXSCJGOSELECTTOP 5PERCENT* FROM学生基本本信息表表GO运行结果果如图5-5所示。学学生基本本信息表表共有106行数据,6行约占106行的5%,所以使使用TOP5PERCENT检索前5%的数据行行,其结结果是只只显示6行信息。图5-5显示基本本信息表表5%的数据行行,其结结果是只只显示6行信息5.2.2使使用INTO子句使用INTO子子句可以以创建一一个新表表,并将将查询结结果直接接插入到到新表中中。但是是用户必必须在要要创建新新表的数数据库中中拥有CREATETABLE权权限,而而且INTO子子句不能能与COMPUTE子子句一起起使用。【例5-
9、6】从学生生基本信信息表中中查询所所有团员员的信息息资料,并形成成新表为为团员基基本信息息表。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*INTO团员基本本信息表表FROM学生基本本信息表表WHERE政治面貌貌=团员GOSELECT*FROM团员基本本信息表表GO运行结果果如图5-6所示。图5-6使使用INTO子子句5.2.3使使用FROM子句FROM子句用用于指定定SELECT语句查查询的源源表、视视图、派派生表和和联接表表,中间间用逗号号隔开。在FROM子句中最最多可以以使用16个表或视视图。【例5-7】从成绩绩表中查查询学生生成绩。在查询分分析器中中运行如如下命令
10、令:USEXSCJGOSELECT*FROM成绩表GO运行结果果如图5-7所示。图5-7使使用FROM子子句【例5-8】从相关关表中查查询每一一位学生生的学号号、姓名名、课程程名称、成绩。从各表数数据可知知,“学学号”存存在于“学生基基本信息息表”和和“成绩绩表”,“姓名名”存在在于“学学生基本本信息表表”,“课程名名称”存存在于“课程信信息表”,“成成绩”存存在于“成绩表表”,要要实现本本例查询询,则需需要对“学生基基本信息息表”、“课程程信息表表”、“成绩表表”进行行多表检检索,也也可以来来自不同同的数据据库。在在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学生基本本信
11、息表表.学号,姓名,课程名称称,成绩FROM学生基本本信息表表,课程信息息表,成绩表WHERE学生基本本信息表表.学号=成绩表.学号AND课程信息息表.课程编号号=成绩表.课程编号号GO运行结果果如图5-8所示。图5-8从相关表表中查询询每一位位学生的的学号、姓名、课程名名称、成成绩5.2.4使使用WHERE子句句WHERE子句用于于指明查查询所要要满足的的条件。通常情况况下,必必须定义义一个或或多个条条件限制制检索选选择的数数据行。WHERE子句后跟跟逻辑表表达式,结果集集将返回回表达式式为真的的数据行行。在WHERE子句中,可以包包含比较较运算符符、逻辑辑运算符符。比较较运算符符有:=(等
12、于)、(大于)、=(对于等等于)、(小于)、=(小于等等于)、(不等于于)、!(不不大于)、!1985-01-01AND性性别=女;“成成绩60分以上上”可表表示为:成绩=60或者WHERENOT(成绩绩60)等。【例5-9】在在课程信信息表中中查找“Delphi程序设设计”课课程的任任课老师师。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT任课教师师FROM课程信息息表WHERE课程名称称=Delphi程序设计计GO运行结果果如图5-9所示。图5-9在在课程信信息表中中查找“Delphi程序设设计”课课程的任任课老师师【例5-10】查询少少数民族族学生的的基本情情况。在查
13、询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM学生基本本信息表表WHERE族别汉族GO运行结果果如图5-10所示。图5-10查查询少少数民族族学生的的基本情情况【例5-11】检索1985年1月月1日以以后出生生的女生生基本信信息。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM学生基本本信息表表WHERE出生日期期1985-01-01 AND性别=女GO运行结果果如图5-11所示。图5-11检索1985年年1月1日以后后出生的的女生基基本信息息5.2.5使使用GROUPBY子句句本子句写写在WHERE子句之后后,用于于对查询询的结果果集进行
14、行分组。当使用用GROUPBY子句进行行分组时时,SELECT子句的选选项列表表中可以以包含聚聚合函数数,但子子句后的的各列或或包含在在聚合函函数中或或包含在在GROUPBY子句中,否则,SQLServer将返回如如下错误误信息:“表名.列名在选选择列表表中无效效,因为为该列既既不包含含在聚合合函数中中,也不不包含在在GROUPBY子句中。”【例5-12】查询每每位同学学的课程程门数、总成绩绩、平均均成绩。查询每位位学生的的课程成成绩情况况,实际际上就是是按照“学号”列分类类统计,可使用用GROUPBY学号子句句,统计计课程门门数、总总成绩、平均成成绩分别别可以使使用聚合合函数COUNT(课程
15、编编号)、SUM(成绩)、AVG(成绩)。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学号,COUNT(课程编号号) AS 课程门数数,SUM(成绩) AS 总成绩,AVG(成绩) AS 平均成绩绩 FROM成绩表GROUPBY学号GO运行结果果如图5-12所示。图5-12查询每位位同学的的课程门门数、总总成绩、平均成成绩5.2.6HAVING子句HAVING用用于限定定组或聚聚合函数数的查询询条件,通常用用在GROUP BY子句之之后。通通常,其其作用与与WHERE子子句基本本一样。但WHERE子句是是对原始始记录进进行过滤滤,HAVING子句句对查询询结果进进行过滤滤
16、,而且且SELECT子句和和HAVING子句中中可以使使用聚合合函数,WHERE子子句中不不能使用用聚合函函数。【例5-13】从学生生基本信信息表中中统计各各民族学学生人数数。此例实际际上是将将要对学学生按民民族进行行分类统统计,可可使用聚聚合函数数COUNT(族别)实现功能能。在查查询分析析器中运运行如下下命令:USEXSCJGOSELECT族别,COUNT(族别) AS 学生人数数 FROM学生基本本信息表表GROUPBY族别GO运行结果果如图5-13所示。图5-13从学生基基本信息息表中统统计各民民族学生生人数【例5-14】从学生生基本信信息表中中统计汉汉族学生生的人数数。此例就是是在上
17、例例统计出出各民族族学生人人数的基基础上进进一步限限定查询询汉族学学生人数数,可在在GROUPBY子句之后后跟HAVING族别=汉族子句实现现此功能能。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT族别,COUNT(族别) AS 学生人数数 FROM学生基本本信息表表GROUPBY族别HAVING族别=汉族GO运行结果果如图5-14所示。图5-14从学生基基本信息息表中统统计汉族族学生的的人数此例也可可使用WHERE子句完成成功能。USEXSCJGOSELECT族别,COUNT(族别) AS 学生人数数 FROM学生基本本信息表表WHERE族别=汉族GROUPBY族别GO运
18、行结果果如图5-15所示。图5-15使用WHERE子句完成成功能【例5-15】显示平平均成绩绩大于等等于80分以上的的学生情情况。此例的限限定条件件是AVG(成绩)=80,只能使使用HAVING子句,如如果使用用WHERE子句限定定条件,则系统统会显示示如图5-16所示的错错误信息息。错误使用用WHERE子句的SELECT语句如下下:USEXSCJGOSELECT学号,AVG(成绩) AS 平均成绩绩 FROM成绩表WHEREAVG(成绩)=80GROUPBY学号GO运行结果果如图5-16所示。图5-16显示平均均成绩大大于等于于80分以上的的学生情情况使用HAVING子句的正正确语句句如下:
19、USEXSCJGOSELECT学号,AVG(成绩) AS 平均成绩绩 FROM成绩表GROUPBY学号HAVINGAVG(成绩)=80GO运行结果果如图5-17所示。图5-17使用HAVING子句查询询平均成成绩大于于等于80分以上的的学生情情况5.2.7ORDERBY子子句ORDERBY子句对查查询结果果集中的的行进行行重新排排序。ASC和DESC关键字分分别用于于指定按按升序或或降序排排序。如如果省略略ASC或DESC,则系统统默认为为升序。可以在在ORDERBY子句中指指定多个个排序列列,即嵌嵌套排序序,检索索结果首首先按第第1列进行排排序,对对第1列值相同同的那些些数据行行,再按按照第
20、2列排序依此此类推。要求ORDERBY子句要写写在WHERE子句的后后面,而而且在ORDERBY子句中不不能使用用ntext、text和image列。【例5-16】将学生生平均成成绩按升升序排序序。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学学号,AVG(成绩绩)AS平均成成绩FROM成成绩表GROUPBY学学号ORDERBYAVG(成绩)GO运行结果果如图5-18所示,省省略关键键字ASC,系统默默认为升升序排序序。图5-18将学生平平均成绩绩按升序序排序【例5-17】查询成成绩表中中的全部部信息,要求查查询结果果首先按按学号升升序排序序,学号号相同时时,按成成绩降序
21、序排序。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM成绩表ORDERBY学号,成绩DESCGO运行结果果如图5-19所示。图5-19查询成绩绩表中的的全部信信息5.2.8使使用COMPUTE子句COMPUTE子句用用在WHERE子句之之后,用用来计算算总计并并进行分分组小计计,可使使用聚合合函数,总计值值或小计计值将作作为附加加新行出出现在检检索结果果中。使使用COMPUTE子子句时必必须使用用ORDERBY对对COMPUTEBY中BY指定定的列进进行排序序,否则则将出现现错误信信息。【例5-18】按学号号显示学学生成绩绩,并计计算每人人的平均均成绩和和总成绩绩
22、。此例要求求按人对对课程及及成绩进进行分组组显示,并计算算每人的的平均成成绩、总总成绩。则显示示成绩应应按学号号分类,分组计计算平均均成绩、总成绩绩的语句句为COMPUTE AVG(成绩),SUM(成绩) BY学号,使使用COMPUTE BY子句首先先要用ORDERBY子句对要要分组的的学号列列排序,即ORDERBY学号。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM成绩表ORDERBY学号COMPUTE AVG(成绩),SUM(成绩) BY学号GO运行结果果如图5-20所示。图5-20按学号显显示学生生成绩,并计算算每人的的平均成成绩和总总成绩5.3使使用用其它
23、子子句或关关键字查查询数据据5.3.1联联合查查询联合查询询是指将将两个或或两个以以上的SELECT语语句通过过UNION运运算符连连接起来来的查询询。联合合查询可可以将两两个或更更多查询询的结果果组合为为单个结结果集,该结果果集包含含联合查查询中所所有查询询的全部部行。使使用UNION组合多多个查询询的结果果时,必必须注意意:所有有查询中中的列数数和列的的顺序必必须相同同且数据据类型必必须兼容容。【例5-19】从系部部表中检检索系部部名称,从班级级表中检检索班级级名称。从系部表中检索索系部名名称的SELECT语句为:SELECT系部名称称FROM系部表,从班级级表中检检索班级级名称的SELE
24、CT语句为:SELECT班级名称称FROM班级表,合并这这两个查查询结果果,需要要使用UNION运算符。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT系部名称称FROM系部表UNIONSELECT班级名称称FROM班级表GO 运行结果果如图5-21所示,UNION结果集的的列标题题取自第第一个SELECT语句。图5-21UNION结果集的的列标题题取自第第一个SELECT语句5.3.2检检索某某一范围围内的信信息检索在某某一范围围内的信信息,需需要使用用WHERE子句限定定查询条条件,这这个条件件通常是是一个逻逻辑表达达式。在在表达式式中除了了可以使使用比较较运算符符=(等
25、于)、(大于)、(不等于于)等外外,还可可使用范范围运算算符BETWEEN、NOTBETWEEN、IN、LIKE、ISNULL等,逻辑辑运算符符NOT(非)、OR(或)、AND(与)等等来限定定查询条条件。1使用BETWEEN关键字BETWEEN关键字字总是与与AND一起使使用,用用来检索索在一个个指定范范围内的的信息,NOT BETWEEN检检索不在在某一范范围内的的信息。【例5-20】查询1985年出生生的学生生基本信信息。1985年出生生的学生生即出生生日期在在1985年1月1日日至12月31日之间间的学生生。在查查询分析析器中运运行如下下命令:USEXSCJGOSELECT*FROM学
26、生基本本信息表表WHERE出生日期期BETWEEN 1985-01-01AND1985-12-31GO 运行结果果如图5-22所示。图5-22查查询1985年出生生的学生生基本信信息【例5-21】查询不不及格学学生成绩绩信息。查询不及及格学生生成绩信信息,也也就是查查询059之间的学学生成绩绩,可用用BETWEEN关键字表表示为:WHERE成绩BETWEEN 0AND 59。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM成绩表WHERE成绩BETWEEN 0AND 59GO运行结果果如图5-23所示。图5-23查询不及及格学生生成绩信信息2使用IN关键字字IN关键
27、键字允许许用户选选择与列列表中的的值相匹匹配的行行,指定定项必须须用括号号括起来来,并用用逗号隔隔开,表表示“或或”的关关系。NOTIN表表示含义义正好相相反。【例5-22】查询课课程编号号为002、003、007、014的课程编编号、课课程名称称、任课课教师和和上课时时间。课程编号号为002、003、007、014可以写成成:WHERE课程编号号IN(002,003,007,014),也可写写成WHERE课程编号号=002OR课程编号号=003OR课程编号号=007OR课程编号号=014。显然,使用IN关键字进进行检索索比使用用3个OR运算符进进行检索索更为简简单,而而且易于于理解和和阅读。
28、在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT课程编号号,课程名称称,任课教师师,上课时间间FROM课程信息息表WHERE课程编号号IN(002,003,007,014)GO运行结果果如图5-24所示图5-24查询课程程编号为为002、003、007、014的课程编号号、课程程名称、任课教教师和上上课时间间在查询分分析器中中运行以以下命令令,也可可得到相相同的查查询结果果,但这这种写法法显然比比较繁琐琐。USEXSCJGOSELECT课程编号号,课程名称称,任课教师师,上课时间间FROM课程信息息表WHERE课程编号号=002OR课程编号号=003OR课程编号号=007OR
29、课程编号号=014GO3使用LIKE关键字字LIKE关键字用用于查询询与指定定的某些些字符串串表达式式模糊匹匹配的数数据行。LIKE后的表达达式被定定义为字字符串,必须用用单引号号()括起来来,字符符串中可可以使用用4种通配符符。它们们是:l%:可匹匹配任意意类型和和长度的的字符串串。l_(下划划线):可匹配配任何单单个字符符。l :指定范范围或集集合中的的任何单单个字符符。l:不属于于指定范范围或集集合的任任何单个个字符。例如:LIKE 刘%匹配以“刘”开开始的字字符串;LIKE %技术%匹配的是是前后字字符为任任意,中中间含有有“技术术”两个个字的字字符串;LIKE _秀%匹配的是是第2个
30、字为“秀”的的任意字字符串。a-i匹配配的是a、b、c、d、e、f、g、h、I单个个字符;LIKEmw-z%匹配配所有以以字母m开始并并且第2个字母母不为w、x、y、z的所有有字符串串。【例5-23】检索所所有姓刘刘的学生生基本信信息。匹配所有有姓刘的的学生可可以表示示为:姓姓名LIKE 刘%。在查询询分析器器中运行行如下命命令:USEXSCJGOSELECT*FROM学生基本本信息表表WHERE姓名LIKE 刘%GO运行结果果如图5-25所示。图5-25检索所有有姓刘的的学生基基本信息息【例5-24】检索包包含“技技术”两两字的课课程信息息。匹配“技技术”两两字的课课程名称称可以表表示为:课
31、程名名称LIKE %技术%。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM课程信息息表WHERE课程名称称LIKE %技术%GO运行结果果如图5-26所示。图5-26检索包含含“技术术”两字字的课程程信息【例5-25】检索少少数民族族学生的的基本信信息。少数民族族学生或或以表示示为:WHERE族别NOTLIKE汉族。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM学生基本本信息表表WHERE族别NOTLIKE汉族GO运行结果果如图5-27所示。图5-27检索少数数民族学学生的基基本信息息【例5-26】查询第第2个字为“丽”的的学生信信息
32、。在学生基基本信息息表中,匹配第第2个字为“丽”的的学生姓姓名应表表示为:姓名LIKE _丽%。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM学生基本本信息表表WHERE姓名LIKE _丽%GO运行结果果如图5-28所示。图5-28查询第2个字为“丽”的的学生信信息4、使用ISNULL关键字ISNULL关键字可可以检索索数据列列中没有有赋值的的行。【例5-27】查询课课程信息息表中教教师未定定的课程程信息。课程信息息表中教教师未定定的表达达式可以以表示为为:WHERE任课教师师ISNULL。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FRO
33、M课程信息息表WHERE任课教师师ISNULLGO运行结果果如图5-29所示,因因为没有有任课教教师为空空(NULL)的课程程,所以以查询结结果为0行。图5-29查询课程程信息表表中教师师未定的的课程信信息5.3.3指指定结结果集的的列的别别名有时需要要为查询询结果集集中的某某些列增增加可读读性或者者为没有有名称的的导出列列指定名名称,可可使用AS子句。【例5-28】统计成成绩表中中各门课课程的学学生人数数、总成成绩、平平均成绩绩。统计成绩绩表中各各门课程程信息,需要将将学生成成绩按课课程编号号分组GROUPBY课程编号号,统计计学生人人数、总总成绩、平均成成绩分别别需要使使用聚合合函数COU
34、NT(学号)、SUM(成绩)、AVG(成绩)。因为为新生成成的学生生人数、总成绩绩、平均均成绩三三列没有有列名,所以可可使用AS子句实现现。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT课程编号号,COUNT(学号) AS 学生人数数,SUM(成绩) AS 总成绩,AVG(成绩) AS 平均成绩绩FROM成绩表GROUPBY课程编号号GO运行结果果如图5-30所示。图5-30统计成绩绩表中各各门课程程的学生生人数、总成绩绩、平均均成绩5.3.4子子查询子查询是是在查询询中包含含另一个个查询的的查询。它本身身是一个个SELECT查询,可以代代替表达达式出现现在WHERE子句中
35、中。它返返回单个个值且嵌嵌套在SELECT、INSERT、UPDATE、DELETE 语句句或其它它子查询询中。任任何允许许使用表表达式的的地方都都可以使使用子查查询。子子查询的的 SELECT查查询总是是使用圆圆括号括括起来,且不能能包括COMPUTE子句句,如果果同时指指定TOP子子句,则可能能只包括括 ORDER BY 子句句。【例5-37】检索单单科成绩绩高于全全班平均均分的学学生成绩绩信息。此例中,全班平平均成绩绩为SELECTAVG(成绩) AS 平均成绩绩 FROM成绩表,单科成成绩高于于全班平平均分可可以表述述为WHERE成绩(SELECTAVG(成绩) FROM成绩表)。在查
36、询分分析器中中运行如如下命令令:USEXSCJGOSELECTAVG(成绩) AS 平均成绩绩 FROM成绩表GOSELECT*FROM成绩表WHERE成绩(SELECTAVG(成绩) FROM成绩表)GO运行结果果如图5-39所示。图5-39检索单科科成绩高高于全班班平均分分的学生生成绩信信息5.4连连接接查询用户在前前面所作作的查询询大多是是对单个个表进行行的查询询,而在在数据库库的应用用中,经经常需要要从多个个相关的的表中查查询数据据,这就就需要使使用连接接查询。用户通通过连接接可以使使用一个个表中的的数据来来查询其其他表的的数据,从而大大大增加加了灵活活性。由由于连接接涉及多多个表及及
37、其之间间的引用用,所以以列的引引用均必必须明确确,对于于重复的的列名必必须用表表名限定定。对多个表表或视图图进行查查询,需需要在FROM子句或WHERE子句中定定义连接接条件。在FROM子句中定定义连接接的语法法形式为为:FROM表1 连接类型型 JOIN表2 ON表1.列=表2.列在WHERE子句中定定义连接接的语法法形式为为:FROM表1,表2WHERE表1.列连接操作作表2.列但由于在在FROM子句中指指定连接接条件有有助于区区分连接接条件与与WHERE子句中指指定的搜搜索条件件,所以以建议使使用FROM子句的方方法。连接的类类型有内内连接、外连接接、交叉叉连接3种。5.4.1内内联接接
38、内连接(INNERJOIN)是组合合两个表表的常用用方法,它将两两个表中中的列进进行比较较,将两两个表中中满足连连接条件件的行组组合起来来,作为为结果。内连接接有等值值连接、自然连连接和不不等值连连接3种。1相等等连接相等连接接是将要要连接的的列值使使用等值值运算符符(=)作相等等比较后后所作的的连接,返回所所有列(包括重重复列)。因为为连接的的列要显显示两次次,所以以会产生生冗余。【例5-29】检索系系部信息息和班级级信息。此例要检检索系部部表和班班级表的的所有信信息,即即显示两两个表的的所有信信息。可可在SELECT子句中使使用*、系部表表.*或班级表表.*,连接条条件是两两个表的的系部编
39、编号的值值要相等等,即系系部表.系部编号号=班级表.系部编号号。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM系部表,班级表WHERE系部表.系部编号号=班级表.系部编号号GO运行结果果如图5-31所示,检检索结果果中有完完全相同同的两列列系部编编号,数数据产生生了冗余余。5-31检索系部部信息和和班级信信息使用ANSI连接语法法的SELECT语句如下下:USEXSCJGOSELECT*FROM系部表INNERJOIN班级表ON系部表.系部编号号=班级表.系部编号号GO运行结果果与图5-31所示相同同。2自然连连接自然连接接是将要要连接的的列作相相等比较较的连接接
40、,但连连接的列列只显示示一次,因而消消除了等等值连接接产生的的冗余。【例5-30】检索系系部信息息和班级级信息,要求连连接的列列只显示示一次。本例与上上例的区区别是对对连接的的列只显显示一列列,用SELECT子句可以以写成:SELECT系部表.*,班级编号号,班级名称称。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT系部表.*,班级编号号,班级名称称FROM系部表,班级表WHERE系部表.系部编号号=班级表.系部编号号GO运行结果果如图5-32所示。5-32检索系部部信息和和班级信信息,要要求连接接的列只只显示一一次使用ANSI连接语法法的SELECT语句如下下:USEXS
41、CJGOSELECT系部表.*,班级编号号,班级名称称FROM系部表INNERJOIN班级表ON系部表.系部编号号=班级表.系部编号号GO运行结果果与图5-32所示相同同。3、不等值值连接不等值连连接就是是在连接接时不使使用等值值运算符符,而采采用比较较运算符符进行连连接。【例5-31】检索没没有录入入成绩的的课课程程情况。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECTDISTINCT课程信息息表.*FROM课程信息息表,成绩表WHERE课程信息息表.课程编号号成绩表.课程编号号GO运行结果果如图5-33所示。5-33检索没有有录入成成绩的学学生基本本信息5.4.2外外连接
42、接外连接(OUTERJOIN)只限制制一个表表,而对对另外一一个表不不加限制制(即所所有的行行都出现现在结果果集中)。外连接分分为左外外连接(LEFT OUTER JOIN)、右外外连接(RIGHTOUTERJOIN)和全外外连接(FULL OUTER JOIN)。括号号中为使使用FROM子句定义义外连接接的关键键字,使使用中可可以省略略OUTER。1、左外连连接(LEFT OUTER JOIN)左外连接接对连接接条件中中左边的的表不加加限制。左外连连接需要要在FROM子句中采采用下列列语法格格式:FROM左表名LEFT OUTERJOIN右表名ON连接条件件【例5-32】使用左左外连接接检索
43、学学生成绩绩信息(学号,姓名,课程名名称)。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学号,课程信息息表.课程编号号,课程信息息表.课程名称称,成绩FROM课程信息息表LEFT JOIN成绩表ON课程信息息表.课程编号号=成绩表.课程编号号GO运行结果果如图5-34所示(所所影响的的行数为为343行)。图5-34使用左外外连接检检索学生生成绩信信息2右外连连接(RIGHTOUTERJOIN)右外连接接对右边边的表不不加限制制。右外外连接需需要在FROM子句采用用下列语语法格式式:FROM左表名RIGHTOUTER JOIN右表名ON连接条件件【例5-33】使用右右外连接
44、接检索学学生成绩绩信息(学号,姓名,课程名名称)。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学号,课程信息息表.课程编号号,课程信息息表.课程名称称,成绩FROM课程信息息表RIGHTJOIN成绩表ON课程信息息表.课程编号号=成绩表.课程编号号GO运行结果果如图5-35所示(所所影响的的行数为为322行)。图5-35使用右外外连接检检索学生生成绩信信息3、全外连连接(FULL OUTER JOIN)全外连接接对两个个表都不不加限制制,所有有两个表表中的行行都会包包括在结结果集中中。使用用全外连连接需要要在FROM子句采用用下列语语法格式式:FROM 左表表名FULL
45、OUTERJOIN右右表名ON连连接条条件【例5-34】使用全全外连接接检索学学生成绩绩信息(学号,姓名,课程名名称)。 在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT学号,课程信息息表.课程编号号,课程信息息表.课程名称称,成绩FROM课程信息息表FULLJOIN成绩表ON课程信息息表.课程编号号=成绩表.课程编号号GO运行结果果如图5-36所示(所所影响的的行数为为343行)。图5-36使用全外外连接检检索学生生成绩信信息5.4.3交交叉联联接(CROSSJOIN)交叉连接接也叫非非限制连连接,它它将两个个表不加加任何约约束地组组合起来来。在数数学上,就是两两个表的的笛
46、卡尔尔积。交交叉连接接后得到到的结果果集的行行数是两两个被连连接表的的行数的的乘积。【例5-35】计算系系部表和和班级表表的交叉叉连接。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECT*FROM班级表CROSSJOIN系部表GO运行结果果如图5-37所示,检检索结果果为48行,由班班级表的的8行和系部部表的6行组合而而成(68=48),由连连接结果果可以看看出,这这种交叉叉连接的的结果没没有实际际意义。图5-37计算系部部表和班班级表的的交叉连连接此例也可可用FROM子句写成成如下语语句,运运行结果果相同。USEXSCJGOSELECT*FROM班级表,系部表GO在实际应应用
47、中使使用交叉叉连接产产生的结结果集一一般没有有什么意意义,但但在数据据库的数数学模式式上有重重要的作作用。5.4.4自自联接接(SELFJOIN)自连接就就是一个个表与它它自身的的不同行行进行连连接。因因为表名名要在FROM子句中出出现两次次,所以以需要对对表指定定两个别别名,使使之在逻逻辑上成成为两张张表。在在SELECT子句中引引用的列列名也要要使用表表的别名名进行限限定。【例5-36】查找同同名同姓姓的学生生信息。该例是对对学生基基本信息息表进行行行自连连接,这这里将学学生基本本信息表表分别定定义别名名为A1、A2,将FROM子句写成成FROM学生基本本信息表表A1,学生基本本信息表表A
48、2,连接条条件为WHEREA1.姓名=A2.姓名ANDA1.学号A2.学号。在查询分分析器中中运行如如下命令令:USEXSCJGOSELECTA1.*FROM学生基本本信息表表A1,学生基本本信息表表A2WHEREA1.姓名=A2.姓名ANDA1.学号A2.学号GO运行结果果如图5-38所示图5-38使用自连连接查找找同名同同姓的学学生信息息本章小结结本章主要要介绍了了SELECT语句在在数据查查询中的的应用技技术,SELECT语语句在SQL语语言中功功能最为为强大,应用最最为广泛泛。要求求同学们们掌握SELECT语语句结构构,能够够熟练使使用SELECT语句句查询数数据。练习与上上机一选择择题1、在SELECT语语句中,下列哪哪种子句句用于选选择列表表()。A、SELECT子句句B、INTO子句C、FROM 子句句D、WHERE子句句2、在SELECT语语句中,下列哪哪种子句句用于将将查询结结果存储储在一个个新表中中()。A、SELECT子句句B、INTO子句C、FROM 子句句D、WHERE子句句3、在SELECT语语句中,下列哪哪种子句句用于指指出所查查询的数数据表名名()。A、SELECT子句句B、INTO子句C、FROM 子句句D、WHERE子句句4、在SELECT语语句中,下列哪
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年湖北轻工职业技术学院单招职业技能考试备考试题含详细答案解析
- 2026年郑州电子商务职业学院单招职业技能考试备考题库含详细答案解析
- 2026北京生命科学研究所NIBS流式中心招聘技术员笔试备考题库及答案解析
- 永新县薪火人力资源有限公司2026年面向社会公开招聘9名劳务外包巡防员的笔试备考题库及答案解析
- 2026河南南阳职业学院招聘笔试备考题库及答案解析
- 2026年江西省科学院高层次人才招聘20人笔试备考试题及答案解析
- 2026年上海对外经贸大学高职单招职业适应性测试模拟试题及答案详细解析
- 2026福建泉州经济技术开发区第二实验幼儿园合同教师招聘1人笔试备考题库及答案解析
- 2026年春季湖南长沙市长沙县实验梨江中学招聘教师笔试备考题库及答案解析
- 2026山东济宁市东方圣地人力资源开发有限公司招聘劳务派遣制护理员3人笔试备考试题及答案解析
- 2025年高考(广西卷)生物试题(学生版+解析版)
- 地形课件-八年级地理上学期人教版
- uom无人机考试试题及答案
- 2025年四川单招试题及答案
- 婚前教育手册
- 2024家用电视机定制合同2篇
- GB/T 20832-2007金属材料试样轴线相对于产品织构的标识
评论
0/150
提交评论