资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第5章 数据查询,本章学习目标,l,掌握SELECT语句结构,l,熟练使用SELECT语句查询数据,5.1 SELECT语句结构,SELECT,在任何一种,SQL,语言中,都是使用频率最高的语句,它具有强大的查询功能,有的用户甚至只需要熟练掌握,SELECT,语句的一部分,就可以轻松地利用数据库来完成自己的工作。可以说,SELECT,是,SQL,语言的灵魂。,SELECT,语句的作用是让数据库服务器根据客户端的要求搜寻出用户所需要的信息资料,并按用户规定的格式进行整理后返回给客户端。用户使用,SELECT,语句除可以查看普通数据库中的表格和视图的信息外,还可以查看,SQL Server,的系统信息。,SELECT语句的语法格式如下:,SELECT select_list, INTO new_table_name ,FROM table_source, WHERE search_condition , GROUP BY group_by_expression , HAVING search_condition , ORDER BY order_expression ASC | DESC ,其中:,l,select_list,指明要查询的选择列表。列表可以包括若干个列名或表达式,列名或表达式之间用逗号隔开,用来指示应该返回哪些数据。表达式可以是列名、函数或常数的列表。,l,INTO new_table_name,指定用查询的结果创建成一个新表。,new_table_name,为新表名称。,l,FROM table_source,指定所查询的表或视图的名称。,l,WHERE search_condition,指明查询所要满足的条件。,l,GROUP BY group_by_expression,根据指定列中的值对结果集进行分组。,l,HAVING search_condition,对用,FROM,、,WHERE,或,GROUP BY,子句创建的中间结果集进行行的筛选。它通常与,GROUP BY,子句一起使用。,l, ORDER BY order_expression ASC | DESC ,对查询结果集中的行重新排序。,ASC,和,DESC,关键字分别用于指定按升序或降序排序。如果省略,ASC,或,DESC,,则系统默认为升序。,5.2 使用SELECT语句查询数据,5.2.1 使用SELECT子句,SELECT子句的语法为:,SELECT ALL | DISTINCT , TOP n PERCENT WITH TIES ,其中:,l,ALL关键字 为默认设置,用于指定查询结果集的所有行,包括重复行。,l,DISTINCT 用于删除结果集中重复的行。,l,TOP n PERCENT 指定只返回查询结果集中的前n行。如果加了PERCENT,则表示只返回查询结果集中的前n%行。,WITH TIES 用于指定从基本结果集中返回附加的行。,l,select_list,指明要查询的选择列表。列表可以包括若干个列名或表达式,列名或表达式之间用逗号隔开,用来指示应该返回哪些数据。如果使用星号,*,则表示返回,FROM,子句中指定的表或视图中的所的列。表达式可以是列名、函数或常数的列表。,【例,5-1,】查询学生基本信息表中的所有信息。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,学生基本信息表,GO,运行结果如图,5-1,所示,它将学生基本信息表的所有信息均显示出来。,图,5-1,查询学生基本信息表中的所有信息,【例5-2】在学生基本信息表中查询学生的学号、姓名、性别和族别信息。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,学号,姓名,性别,族别,FROM,学生基本信息表,GO,运行结果如图,5-2,所示。,图,5-2,在学生基本信息表中查询学生的学号、姓名、性别和族别信息,【例,5-3,】从学生基本信息表中查询学生由几个民族构成。,从例,2,结果可知,学生的族别有多行重复,要快速查询学生的民族构成,实际上就是对相同值的族别只需要显示一行,可使用,DISTINCT,关键字实现。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT DISTINCT,族别,FROM,学生基本信息表,GO,运行结果如图,5-3,所示。,图,5-3,从学生基本信息表中查询学生由几个民族构成,【例,5-4,】显示课程信息表中前,5,行的信息。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT TOP 5 * FROM,学生基本信息表,GO,运行结果如图,5-4,所示,只显示查询结果的前,5,行数据。,图,5-4,只显示查询结果的前,5,行数据,【例,5-5,】从学生基本信息表中只显示,5%,的信息。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT TOP 5 PERCENT * FROM,学生基本信息表,GO,运行结果如图,5-5,所示。学生基本信息表共有,106,行数据,,6,行约占,106,行的,5%,,所以使用,TOP 5 PERCENT,检索前,5%,的数据行,其结果是只显示,6,行信息。,图,5-5,显示基本信息表,5%,的数据行,其结果是只显示,6,行信息,5.2.2 使用INTO子句,使用INTO子句可以创建一个新表,并将查询结果直接插入到新表中。但是用户必须在要创建新表的数据库中拥有CREATE TABLE权限,而且INTO子句不能与COMPUTE子句一起使用。,【例,5-6,】从学生基本信息表中查询所有团员的信息资料,并形成新表为团员基本信息表。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * INTO,团员基本信息表,FROM,学生基本信息表,WHERE,政治面貌,=,团员,GO,SELECT * FROM,团员基本信息表,GO,运行结果如图,5-6,所示。,图5-6 使用INTO子句,5.2.3 使用FROM子句,FROM子句用于指定SELECT语句查询的源表、视图、派生表和联接表,中间用逗号隔开。,在,FROM,子句中最多可以使用,16,个表或视图。,【例,5-7,】从成绩表中查询学生成绩。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,成绩表,GO,运行结果如图,5-7,所示。,图5-7 使用FROM子句,【例,5-8,】从相关表中查询每一位学生的学号、姓名、课程名称、成绩。,从各表数据可知,“学号”存在于“学生基本信息表”和“成绩表”,“姓名”存在于“学生基本信息表”,“课程名称”存在于“课程信息表”,“成绩”存在于“成绩表”,要实现本例查询,则需要对“学生基本信息表”、“课程信息表”、“成绩表”进行多表检索,也可以来自不同的数据库。在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,学生基本信息表,.,学号,姓名,课程名称,成绩,FROM,学生基本信息表,课程信息表,成绩表,WHERE,学生基本信息表,.,学号,=,成绩表,.,学号,AND,课程信息表,.,课程编号,=,成绩表,.,课程编号,GO,运行结果如图,5-8,所示。,图,5-8,从相关表中查询每一位学生的学号、姓名、课程名称、成绩,5.2.4 使用WHERE子句,WHERE,子句用于指明查询所要满足的条件。,通常情况下,必须定义一个或多个条件限制检索选择的数据行。,WHERE,子句后跟逻辑表达式,结果集将返回表达式为真的数据行。,在,WHERE,子句中,可以包含比较运算符、逻辑运算符。比较运算符有:,=,(等于)、,(大于)、,=,(对于等于)、,(小于)、,(不大于)、!1985-01-01 AND 性别=女;“成绩60分以上”可表示为:成绩=60或者WHERE NOT (成绩1985-01-01 AND,性别,=,女,GO,运行结果如图,5-11,所示。,图,5-11,检索1985年1月1日以后出生的女生基本信息,5.2.5 使用GROUP BY子句,本子句写在,WHERE,子句之后,用于对查询的结果集进行分组。当使用,GROUP BY,子句进行分组时,,SELECT,子句的选项列表中可以包含聚合函数,但子句后的各列或包含在聚合函数中或包含在,GROUP BY,子句中,否则,,SQL Server,将返回如下错误信息:,“表名,.,列名在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在,GROUP BY,子句中。”,【例,5-12,】查询每位同学的课程门数、总成绩、平均成绩。,查询每位学生的课程成绩情况,实际上就是按照“学号”列分类统计,可使用,GROUP BY,学号子句,统计课程门数、总成绩、平均成绩分别可以使用聚合函数,COUNT,(课程编号)、,SUM,(成绩)、,AVG,(成绩)。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,学号,COUNT(,课程编号,) AS ,课程门数,SUM(,成绩,) AS ,总成绩,AVG(,成绩,) AS ,平均成绩, FROM,成绩表,GROUP BY,学号,GO,运行结果如图,5-12,所示。,图,5-12,查询每位同学的课程门数、总成绩、平均成绩,5.2.6 HAVING子句,HAVING用于限定组或聚合函数的查询条件,通常用在GROUP BY子句之后。通常,其作用与WHERE子句基本一样。但WHERE子句是对原始记录进行过滤,HAVING子句对查询结果进行过滤,而且SELECT子句和HAVING子句中可以使用聚合函数,WHERE子句中不能使用聚合函数。,【例,5-13,】从学生基本信息表中统计各民族学生人数。,此例实际上是将要对学生按民族进行分类统计,可使用聚合函数,COUNT(,族别,),实现功能。在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,族别,COUNT(,族别,) AS ,学生人数, FROM,学生基本信息表,GROUP BY,族别,GO,运行结果如图,5-13,所示。,图,5-13,从学生基本信息表中统计各民族学生人数,【例,5-14,】从学生基本信息表中统计汉族学生的人数。,此例就是在上例统计出各民族学生人数的基础上进一步限定查询汉族学生人数,可在,GROUP BY,子句之后跟,HAVING,族别,=,汉族,子句实现此功能。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,族别,COUNT(,族别,) AS ,学生人数, FROM,学生基本信息表,GROUP BY,族别,HAVING,族别,=,汉族,GO,运行结果如图,5-14,所示。,图,5-14,从学生基本信息表中统计汉族学生的人数,此例也可使用,WHERE,子句完成功能。,USE XSCJ,GO,SELECT,族别,COUNT(,族别,) AS ,学生人数, FROM,学生基本信息表,WHERE,族别,=,汉族,GROUP BY,族别,GO,运行结果如图,5-15,所示。,图,5-15,使用,WHERE,子句完成功能,【例,5-15,】显示平均成绩大于等于,80,分以上的学生情况。,此例的限定条件是,AVG(,成绩,)=80,,只能使用,HAVING,子句,如果使用,WHERE,子句限定条件,则系统会显示如图,5-16,所示的错误信息。,错误使用,WHERE,子句的,SELECT,语句如下:,USE XSCJ,GO,SELECT,学号,AVG(,成绩,) AS ,平均成绩, FROM,成绩表,WHERE AVG(,成绩,)=80,GROUP BY,学号,GO,运行结果如图,5-16,所示。,图,5-16,显示平均成绩大于等于,80,分以上的学生情况,使用,HAVING,子句的正确语句如下:,USE XSCJ,GO,SELECT,学号,AVG(,成绩,) AS ,平均成绩, FROM,成绩表,GROUP BY,学号,HAVING AVG(,成绩,)=80,GO,运行结果如图,5-17,所示。,图,5-17,使用,HAVING,子句查询平均成绩大于等于,80,分以上的学生情况,5.2.7 ORDER BY子句,ORDER BY,子句对查询结果集中的行进行重新排序。,ASC,和,DESC,关键字分别用于指定按升序或降序排序。如果省略,ASC,或,DESC,,则系统默认为升序。可以在,ORDER BY,子句中指定多个排序列,即嵌套排序,检索结果首先按第,1,列进行排序,对第,1,列值相同的那些数据行,再按照第,2,列排序依此类推。要求,ORDER BY,子句要写在,WHERE,子句的后面,而且在,ORDER BY,子句中不能使用,ntext,、,text,和,image,列。,【例,5-16,】将学生平均成绩按升序排序。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT 学号,AVG(成绩) AS 平均成绩 FROM 成绩表,GROUP BY 学号,ORDER BY AVG(成绩),GO,运行结果如图,5-18,所示,省略关键字,ASC,,系统默认为升序排序。,图,5-18,将学生平均成绩按升序排序,【例,5-17,】查询成绩表中的全部信息,要求查询结果首先按学号升序排序,学号相同时,按成绩降序排序。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,成绩表,ORDER BY,学号,成绩,DESC,GO,运行结果如图,5-19,所示。,图,5-19,查询成绩表中的全部信息,5.2.8 使用COMPUTE子句,COMPUTE子句用在WHERE子句之后,用来计算总计并进行分组小计,可使用聚合函数,总计值或小计值将作为附加新行出现在检索结果中。使用COMPUTE子句时必须使用ORDER BY对COMPUTE BY中BY指定的列进行排序,否则将出现错误信息。,【例,5-18,】按学号显示学生成绩,并计算每人的平均成绩和总成绩。,此例要求按人对课程及成绩进行分组显示,并计算每人的平均成绩、总成绩。则显示成绩应按学号分类,分组计算平均成绩、总成绩的语句为,COMPUTE AVG(,成绩,),SUM(,成绩,) BY,学号,使用,COMPUTE BY,子句首先要用,ORDER BY,子句对要分组的学号列排序,即,ORDER BY,学号。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT *,FROM,成绩表,ORDER BY,学号,COMPUTE AVG(,成绩,),SUM(,成绩,) BY,学号,GO,运行结果如图,5-20,所示。,图,5-20,按学号显示学生成绩,并计算每人的平均成绩和总成绩,5.3 使用其它子句或关键字查询数据,5.3.1 联合查询,联合查询是指将两个或两个以上的SELECT语句通过UNION运算符连接起来的查询。联合查询可以将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中所有查询的全部行。使用UNION组合多个查询的结果时,必须注意:所有查询中的列数和列的顺序必须相同且数据类型必须兼容。,【例5-19】从系部表中检索系部名称,从班级表中检索班级名称。,从系部,表中检索系部名称的,SELECT,语句为:,SELECT,系部名称,FROM,系部表,,从班级表中检索班级名称,的,SELECT,语句为:,SELECT,班级名称,FROM,班级表,合并这两个查询结果,需要使用,UNION,运算符,。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,系部名称,FROM,系部表,UNION,SELECT,班级名称,FROM,班级表,GO,运行结果如图,5-21,所示,,UNION,结果集的列标题取自第一个,SELECT,语句。,图,5-21 UNION,结果集的列标题取自第一个,SELECT,语句,5.3.2 检索某一范围内的信息,检索在某一范围内的信息,需要使用,WHERE,子句限定查询条件,这个条件通常是一个逻辑表达式。在表达式中除了可以使用比较运算符,=,(等于)、,(大于)、,(不等于)等外,还可使用范围运算符,BETWEEN,、,NOT BETWEEN,、,IN,、,LIKE,、,IS NULL,等,逻辑运算符,NOT,(非)、,OR,(或)、,AND,(与)等来限定查询条件。,1,使用,BETWEEN,关键字,BETWEEN关键字总是与AND一起使用,用来检索在一个指定范围内的信息,NOT BETWEEN检索不在某一范围内的信息。,【例5-20】查询1985年出生的学生基本信息。,1985年出生的学生即出生日期在1985年1月1日至12月31日之间的学生。在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,学生基本信息表,WHERE,出生日期,BETWEEN 1985-01-01 AND 1985-12-31,GO,运行结果如图,5-22,所示。,图5-22 查询1985年出生的学生基本信息,【例,5-21,】查询不及格学生成绩信息。,查询不及格学生成绩信息,也就是查询,0,59,之间的学生成绩,可用,BETWEEN,关键字表示为:,WHERE,成绩,BETWEEN 0 AND 59,。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,成绩表,WHERE,成绩,BETWEEN 0 AND 59,GO,运行结果如图,5-23,所示。,图,5-23,查询不及格学生成绩信息,2,使用IN关键字,IN关键字允许用户选择与列表中的值相匹配的行,指定项必须用括号括起来,并用逗号隔开,表示“或”的关系。NOT IN表示含义正好相反。,【例,5-22,】查询课程编号为,002,、,003,、,007,、,014,的课程编号、课程名称、任课教师和上课时间。,课程编号为,002,、,003,、,007,、,014,可以写成:,WHERE,课程编号,IN(002,003,007,014),,也可写成,WHERE,课程编号,=002 OR,课程编号,=003 OR,课程编号,=007 OR,课程编号,=014,。显然,使用,IN,关键字进行检索比使用,3,个,OR,运算符进行检索更为简单,而且易于理解和阅读。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,课程编号,课程名称,任课教师,上课时间,FROM,课程信息表,WHERE,课程编号,IN(002,003,007,014),GO,运行结果如图,5-24,所示,图,5-24,查询课程编号为,002,、,003,、,007,、,014,的,课程编号、课程名称、任课教师和上课时间,在查询分析器中运行以下命令,也可得到相同的查询结果,但这种写法显然比较繁琐。,USE XSCJ,GO,SELECT,课程编号,课程名称,任课教师,上课时间,FROM,课程信息表,WHERE,课程编号,=002 OR,课程编号,=003 OR,课程编号,=007 OR,课程编号,=014,GO,3,使用,LIKE关键字,LIKE,关键字用于查询与指定的某些字符串表达式模糊匹配的数据行。,LIKE,后的表达式被定义为字符串,必须用单引号(,)括起来,字符串中可以使用,4,种通配符。它们是:,l,%:可匹配任意类型和长度的字符串。,l,_(下划线):可匹配任何单个字符。,l, :指定范围或集合中的任何单个字符。,l,:不属于指定范围或集合的任何单个字符。,例如:,LIKE ,刘,%,匹配以“刘”开始的字符串;,LIKE %,技术,%,匹配的是前后字符为任意,中间含有“技术”两个字的字符串;,LIKE _,秀,%,匹配的是第,2,个字为“秀”的任意字符串。,a-i匹配的是a、b、c、d、e、f、g、h、I单个字符;LIKE mw-z %匹配所有以字母m开始并且第2个字母不为w、x、y、z的所有字符串。,【例,5-23,】检索所有姓刘的学生基本信息。,匹配所有姓刘的学生可以表示为:姓名,LIKE ,刘,%,。在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,学生基本信息表,WHERE,姓名,LIKE ,刘,%,GO,运行结果如图,5-25,所示。,图,5-25,检索所有姓刘的学生基本信息,【例,5-24,】检索包含“技术”两字的课程信息。,匹配“技术”两字的课程名称可以表示为:课程名称,LIKE %,技术,%,。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,课程信息表,WHERE,课程名称,LIKE %,技术,%,GO,运行结果如图,5-26,所示。,图,5-26,检索包含“技术”两字的课程信息,【例,5-25,】检索少数民族学生的基本信息。,少数民族学生或以表示为:,WHERE,族别,NOT LIKE ,汉族,。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,学生基本信息表,WHERE,族别,NOT LIKE ,汉族,GO,运行结果如图,5-27,所示。,图,5-27,检索少数民族学生的基本信息,【例,5-26,】查询第,2,个字为“丽”的学生信息。,在学生基本信息表中,匹配第,2,个字为“丽”的学生姓名应表示为:姓名,LIKE _,丽,%,。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,学生基本信息表,WHERE,姓名,LIKE _,丽,%,GO,运行结果如图,5-28,所示。,图,5-28,查询第,2,个字为“丽”的学生信息,4,、使用,IS NULL,关键字,IS NULL,关键字可以检索数据列中没有赋值的行。,【例,5-27,】查询课程信息表中教师未定的课程信息。,课程信息表中教师未定的表达式可以表示为:,WHERE,任课教师,IS NULL,。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,课程信息表,WHERE,任课教师,IS NULL,GO,运行结果如图,5-29,所示,因为没有任课教师为空(,NULL,)的课程,所以查询结果为,0,行。,图,5-29,查询课程信息表中教师未定的课程信息,5.3.3 指定结果集的列的别名,有时需要为查询结果集中的某些列增加可读性或者为没有名称的导出列指定名称,可使用,AS,子句。,【例,5-28,】统计成绩表中各门课程的学生人数、总成绩、平均成绩。,统计成绩表中各门课程信息,需要将学生成绩按课程编号分组,GROUP BY,课程编号,统计学生人数、总成绩、平均成绩分别需要使用聚合函数,COUNT,(学号)、,SUM,(成绩)、,AVG,(成绩)。因为新生成的学生人数、总成绩、平均成绩三列没有列名,所以可使用,AS,子句实现。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT,课程编号,COUNT(,学号,) AS ,学生人数,SUM(,成绩,) AS ,总成绩,AVG(,成绩,) AS ,平均成绩,FROM,成绩表,GROUP BY,课程编号,GO,运行结果如图,5-30,所示。,图,5-30,统计成绩表中各门课程的学生人数、总成绩、平均成绩,5.3.4 子查询,子查询是在查询中包含另一个查询的查询。它本身是一个SELECT查询,可以代替表达式出现在WHERE子句中。它返回单个值且嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询。子查询的 SELECT 查询总是使用圆括号括起来,且不能包括 COMPUTE子句,如果同时指定 TOP 子句,则可能只包括 ORDER BY 子句。,【例,5-37,】检索单科成绩高于全班平均分的学生成绩信息。,此例中,全班平均成绩为,SELECT AVG(,成绩,) AS ,平均成绩, FROM,成绩表,单科成绩高于全班平均分可以表述为,WHERE,成绩,(SELECT AVG(,成绩,) FROM,成绩表,),。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT AVG(,成绩,) AS ,平均成绩, FROM,成绩表,GO,SELECT * FROM,成绩表,WHERE,成绩,(SELECT AVG(,成绩,) FROM,成绩表,),GO,运行结果如图,5-39,所示。,图,5-39,检索单科成绩高于全班平均分的学生成绩信息,5.4 连接查询,用户在前面所作的查询大多是对单个表进行的查询,而在数据库的应用中,经常需要从多个相关的表中查询数据,这就需要使用连接查询。用户通过连接可以使用一个表中的数据来查询其他表的数据,从而大大增加了灵活性。由于连接涉及多个表及其之间的引用,所以列的引用均必须明确,对于重复的列名必须用表名限定。,对多个表或视图进行查询,需要在,FROM,子句或,WHERE,子句中定义连接条件。,在,FROM,子句中定义连接的语法形式为:,FROM,表,1 ,连接类型, JOIN,表,2 ON,表,1.,列,=,表,2.,列,在,WHERE,子句中定义连接的语法形式为:,FROM,表,1,表,2,WHERE,表,1.,列,连接操作,表,2.,列,但由于在,FROM,子句中指定连接条件有助于区分连接条件与,WHERE,子句中指定的搜索条件,所以建议使用,FROM,子句的方法。,连接的类型有内连接、外连接、交叉连接,3,种。,5.4.1 内联接,内连接(,INNER JOIN,)是组合两个表的常用方法,它将两个表中的列进行比较,将两个表中满足连接条件的行组合起来,作为结果。内连接有等值连接、自然连接和不等值连接,3,种。,1相等连接,相等连接是将要连接的列值使用等值运算符(,=,)作相等比较后所作的连接,返回所有列(包括重复列)。因为连接的列要显示两次,所以会产生冗余。,【例,5-29,】检索系部信息和班级信息。,此例要检索系部表和班级表的所有信息,即显示两个表的所有信息。可在,SELECT,子句中使用,*,、系部表,.*,或班级表,.*,,连接条件是两个表的系部编号的值要相等,即系部表,.,系部编号,=,班级表,.,系部编号。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,系部表,班级表,WHERE,系部表,.,系部编号,=,班级表,.,系部编号,GO,运行结果如图,5-31,所示,检索结果中有完全相同的两列系部编号,数据产生了冗余。,5-31,检索系部信息和班级信息,使用,ANSI,连接语法的,SELECT,语句如下:,USE XSCJ,GO,SELECT * FROM,系部表,INNER JOIN,班级表,ON,系部表,.,系部编号,=,班级表,.,系部编号,GO,运行结果与图,5-31,所示相同。,2,自然连接,自然连接是将要连接的列作相等比较的连接,但连接的列只显示一次,因而消除了等值连接产生的冗余。,【例,5-30,】检索系部信息和班级信息,要求连接的列只显示一次。,本例与上例的区别是对连接的列只显示一列,用,SELECT,子句可以写成:,SELECT,系部表,.*,班级编号,班级名称。,在查询分析器中运行如下命令,:,USE XSCJ,GO,SELECT,系部表,.*,班级编号,班级名称,FROM,系部表,班级表,WHERE,系部表,.,系部编号,=,班级表,.,系部编号,GO,运行结果如图,5-32,所示。,5-32,检索系部信息和班级信息,要求连接的列只显示一次,使用,ANSI,连接语法的,SELECT,语句如下:,USE XSCJ,GO,SELECT,系部表,.*,班级编号,班级名称,FROM,系部表,INNER JOIN,班级表,ON,系部表,.,系部编号,=,班级表,.,系部编号,GO,运行结果与图,5-32,所示相同。,3,、不等值连接,不等值连接就是在连接时不使用等值运算符,而采用比较运算符进行连接。,【例,5-31,】检索没有录入成绩的课课程情况。,在查询分析器中运行如下命令,:,USE XSCJ,GO,SELECT DISTINCT,课程信息表,.* FROM,课程信息表,成绩表,WHERE,课程信息表,.,课程编号,成绩表,.,课程编号,GO,运行结果如图,5-33,所示。,5-33,检索没有录入成绩的学生基本信息,5.4.2 外连接,外连接(,OUTER JOIN,)只限制一个表,而对另外一个表不加限制(即所有的行都出现在结果集中)。,外连接分为左外连接(,LEFT OUTER JOIN,)、右外连接(,RIGHT OUTER JOIN,)和全外连接(,FULL OUTER JOIN,)。括号中为使用,FROM,子句定义外连接的关键字,使用中可以省略,OUTER,。,1,、左外连接(,LEFT OUTER JOIN,),左外连接对连接条件中左边的表不加限制。左外连接需要在,FROM,子句中采用下列语法格式:,FROM,左表名,LEFT OUTER JOIN,右表名,ON,连接条件,【例,5-32,】使用左外连接检索学生成绩信息(学号,姓名,课程名称)。,在查询分析器中运行如下命令,:,USE XSCJ,GO,SELECT,学号,课程信息表,.,课程编号,课程信息表,.,课程名称,成绩,FROM,课程信息表,LEFT JOIN,成绩表,ON,课程信息表,.,课程编号,=,成绩表,.,课程编号,GO,运行结果如图,5-34,所示(所影响的行数为,343,行)。,图,5-34,使用左外连接检索学生成绩信息,2,右外连接(,RIGHT OUTER JOIN,),右外连接对右边的表不加限制。右外连接需要在,FROM,子句采用下列语法格式:,FROM,左表名,RIGHT OUTER JOIN,右表名,ON,连接条件,【例,5-33,】使用右外连接检索学生成绩信息(学号,姓名,课程名称)。,在查询分析器中运行如下命令,:,USE XSCJ,GO,SELECT,学号,课程信息表,.,课程编号,课程信息表,.,课程名称,成绩,FROM,课程信息表,RIGHT JOIN,成绩表,ON,课程信息表,.,课程编号,=,成绩表,.,课程编号,GO,运行结果如图,5-35,所示(所影响的行数为,322,行)。,图,5-35,使用右外连接检索学生成绩信息,3,、全外连接(,FULL OUTER JOIN,),全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中。使用全外连接需要在,FROM,子句采用下列语法格式:,FROM 左表名 FULL OUTER JOIN 右表名 ON 连接条件,【例,5-34,】使用全外连接检索学生成绩信息(学号,姓名,课程名称)。,在查询分析器中运行如下命令,:,USE XSCJ,GO,SELECT,学号,课程信息表,.,课程编号,课程信息表,.,课程名称,成绩,FROM,课程信息表,FULL JOIN,成绩表,ON,课程信息表,.,课程编号,=,成绩表,.,课程编号,GO,运行结果如图,5-36,所示(所影响的行数为,343,行)。,图,5-36,使用全外连接检索学生成绩信息,5.4.3 交叉联接(CROSS JOIN),交叉连接也叫非限制连接,它将两个表不加任何约束地组合起来。在数学上,就是两个表的笛卡尔积。交叉连接后得到的结果集的行数是两个被连接表的行数的乘积。,【例,5-35,】计算系部表和班级表的交叉连接。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT * FROM,班级表,CROSS JOIN,系部表,GO,运行结果如图,5-37,所示,检索结果为,48,行,由班级表的,8,行和系部表的,6,行组合而成(,6,8=48,),由连接结果可以看出,这种交叉连接的结果没有实际意义。,图,5-37,计算系部表和班级表的交叉连接,此例也可用,FROM,子句写成如下语句,运行结果相同。,USE XSCJ,GO,SELECT * FROM,班级表,系部表,GO,在实际应用中使用交叉连接产生的结果集一般没有什么意义,但在数据库的数学模式上有重要的作用。,5.4.4 自联接(SELF JOIN),自连接就是一个表与它自身的不同行进行连接。因为表名要在,FROM,子句中出现两次,所以需要对表指定两个别名,使之在逻辑上成为两张表。在,SELECT,子句中引用的列名也要使用表的别名进行限定。,【例,5-36,】查找同名同姓的学生信息。,该例是对学生基本信息表进行行自连接,这里将学生基本信息表分别定义别名为,A1,、,A2,,将,FROM,子句写成,FROM,学生基本信息表,A1,学生基本信息表,A2,,连接条件为,WHERE A1.,姓名,=A2.,姓名,AND A1.,学号,A2.,学号。,在查询分析器中运行如下命令:,USE XSCJ,GO,SELECT A1.* FROM,学生基本信息表,A1,学生基本信息表,A2,WHERE A1.,姓名,=A2.,姓名,AND A1.,学号,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语句中,下列哪种子句用于对数据按照某个字段分组( )。,A、SELECT子句 B、INTO子句 C、FROM 子句 D、WHERE子句,5、在SELECT语句中,下列哪种子句用于对分组统计进一步设置条件( )。,A、HAVING子句 B、GROUP BY 子句 C、ORDER BY 子句 D、WHERE子句,6、在SELECT语句中,下列哪种子句用于对搜索的结果进行排序( )。,A、HAVING子句 B、GROUP BY 子句 C、ORDER BY 子句 D、WHERE子句,7、在SELECT语句中,如果想要返回的结果集中不包含相同的行,应该使用关键字( )。,A、TOP B、AS C、 DISTINCT D、JOIN,二填空题,1、SELECT语句的子句有_、_、_、_、_、_等。,2,、连接查询的类型有_、_、_等3种。,3,、内连接有_、_、_等。,4、外连接有_、_、_等。,三简答题,1,说明,SELECT,语句的基本语法结构。,2、使用SELECT语句时,在选择列表中更改列标题有哪三种格式?,四上机练习,1打开XSCJ数据库;,2查看学生基本信息表中的全部信息;,3显示学生基本信息表中每位学生的学号、姓名、出生日期;,4从学生基本信息表中查看政治面貌,要求取消政治面貌代码相同的行;,5显示成绩表的前10行;,6从成绩表和课程信息表中查看所有学生的SQL Server 2000数据库应用课程成绩;,7从成绩表和课程信息表中查看SQL Server 2000数据库应用课程的最高分、最低分、平均成绩;,8将成绩表中课程ID=003的课程成绩按降序排序;,9从成绩表中查看课程ID为002、003、006的学生成绩;,10从学生基本信息表中查看新疆的学生基本信息;,11查看伊犁的学生信息;,12查看所有姓马的学生信息;,13查看90分以上学生的成绩、课程名称、学生姓名;,14对所有学生按学号分组并计算每人本学期平均成绩;,15显示所有学生的学号、姓名、课程名称、成绩;,项目实训,1,查询,pubs,数据库的,authors,表中的作者的姓(,au_lname,)、名(,au_fname,)和电话号码(,phone,)。,2,使用,TOP,关键字,从,Northwind,数据库的,customers,表中搜索返回前,20%,的数据。,3,查询,Northwind,数据库的,Orders,表中的数据,并将其中的货物重量,feight,增加,50%,。,4,使用,WHERE,子句从,Northwind,数据库的,Products,表中检索出所有单位价格(,UnitPrice,)超过,50,美元的货物名称(,Product Name,)、货物代号(,ProductID,)以及每单位重量(,QuantityPerUnit,)。,5,在,Northwind,数据库的,Employees,表中搜索出职务(,Title,)为销售代表(,Sales Representative,),称呼(,TitleOfCourtesy,)为小姐(,MS,)的所有职员的名(,FirstName,)、姓(,LastName,)和生日(,BirhthDate,)。,6,查询在,Northwind,数据库的,Employees,表中以字母,A,作,Firstname,第一个字母的雇员的,Firstname,和,Lastname,。,7,查询,Northwind,数据库,Employees,表中所有雇员的,Firstname,和,Lastname,,并按生日,BirthDate,从小到大进行排列。,8,在,Northwind,数据库的,Products,表中查询出每个供应商(,Suppliers,)所提供的每一种平均价格(,Unitprice,)超过,15,美元的产品,并按供应商的,ID,分类。,
展开阅读全文