第7章 查询和视图课件.ppt

上传人:春哥&#****71; 文档编号:14874401 上传时间:2022-05-08 格式:PPT 页数:63 大小:196KB
返回 下载 相关 举报
第7章 查询和视图课件.ppt_第1页
第1页 / 共63页
第7章 查询和视图课件.ppt_第2页
第2页 / 共63页
点击查看更多>>
资源描述

《第7章 查询和视图课件.ppt》由会员分享,可在线阅读,更多相关《第7章 查询和视图课件.ppt(63页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第 7 章章查询和视图查询和视图本章学习目标:本章学习目标:q掌握T-SQL作为数据定义语言的语法与应用q掌握WHERE、ORDER BY、GROUP BY、HAVING子句的使用q掌握基本的多表查询q掌握内连接、外连接、交叉连接和联合查询的使用q掌握多行和单值子查询的使用q掌握嵌套子查询的使用q了解表的视图7.1 连接、选择和投影nSQL Server 2008是一种关系数据库管理系统,在关系数据库中,必须提供一种对二维表进行运算的机制。这种机制除了包括传统的集合运算中的并、交、差、广义笛卡尔积以外,还包括专门的关系运算中的选择、投影和连接。7.1.1 选择(Selection)n选择是单

2、目运算,它是按照一定的条件,从关系R中选择出满足条件的行为作为结果返回。选择运算的操作对象是一张二维表,其运算结果也是一章二维表。选择运算的记号为 F(R),其中是选择运算符,下标F是一个条件表达式,R是被操作的表。n选择运算符的含义:n在关系R中选择满足给定条件的诸元组n F(R) = t|tRF(t)= 真nF:选择条件,是一个逻辑表达式,基本形式为:n ( X1Y1 ) ( X2Y2 )n:比较运算符(,或)n例【7-1】设有一个学生-课程数据库,包括学生关系Student,查询信息系(IS系)全体学生。n Sdept = IS (Student)n或 5 =IS (Student)学

3、号Sno姓 名Sname性 别Ssex年 龄Sage系别Sdept95001李勇男20CS95002刘晨女19IS95003王敏女18MA95004张立男19IS7.1.2 投影(Projection)n投影也是单目运算,该运算从表中选出指定的属性值组成一个新表,记为:A(R)。其中A是属性名(即列名)表,R是表名。n投影运算符的含义n从R中选择出若干属性列组成新的关系n A(R) = tA | t R nA:R中的属性列n投影操作主要是从列的角度进行运算,但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)。n例【7-2】 查询学生的姓名和所在系n即求Student关系

4、上学生姓名和所在系两个属性上的投影n Sname,Sdept(Student)n或 2,5(Student)n结果如表7-2所示:SnameSdept李勇CS刘晨IS王敏MA张立IS7.1.3 连接(JOIN)n把两个表中的行按着给定的条件拼接而形成的新表。n连接也称为连接n连接运算的含义:从两个关系的笛卡尔积中选取属性间满足一定条件的元组nA和B:分别为R和S上度数相等且可比的属性组n:比较运算符 n连接运算从R和S的广义笛卡尔积RS中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系的元组。 n为“”的连接运算称为等值连接 7.2 数据查询语句数据查询语句(SELECT语

5、句语句)n查询功能是查询功能是T-SQL的核心,通过的核心,通过T-SQL的查询的查询可以从表或视图中迅速、方便地检索数据。可以从表或视图中迅速、方便地检索数据。nT-SQL的查询最基本的方式是的查询最基本的方式是SELECT语句,语句,其功能十分强大。它能够以任意顺序、从任意其功能十分强大。它能够以任意顺序、从任意数目的列中查询数据,并在查询过程中进行计数目的列中查询数据,并在查询过程中进行计算,甚至能包含来自其他表的数据。算,甚至能包含来自其他表的数据。n我们选取我们选取stuinfo数据库作为示例数据库,以数据库作为示例数据库,以下例句均省略打开数据库的下例句均省略打开数据库的USE s

6、tuinfo语句。语句。nstuinfo数据库有三张数据表:数据库有三张数据表:student、course和和sc。 nSELECT语句的完整语法格式为:语句的完整语法格式为:SELECT FROM |WHERE |GROUP BY HAVING ORDER BY ASC|DESCn其中的其中的SELECT和和FROM语句为必选子句,而语句为必选子句,而WHERE、ORDER BY和和GROUP BY子句为可选子句,要根据查询的需要去选用。子句为可选子句,要根据查询的需要去选用。nSELECT语法中各参数进行说明:语法中各参数进行说明:qSELECT子句:用来指定由查询返回的列,并且各列在子

7、句:用来指定由查询返回的列,并且各列在SELECT子子句中的顺序决定了它们在结果表中的顺序;句中的顺序决定了它们在结果表中的顺序;qFROM子句:用来指定数据来源的表;子句:用来指定数据来源的表;qWHERE子句:用来限定返回行的搜索条件;子句:用来限定返回行的搜索条件;qGROUP BY子句:用来指定查询结果的分组条件;子句:用来指定查询结果的分组条件;qORDER BY子句:用来指定结果的排序方式。子句:用来指定结果的排序方式。nSELECT语句可以写在一行中。但对于复杂的查询,语句可以写在一行中。但对于复杂的查询,SELECT语语句随着查询子句的增加不断增长,一行很难写下,此时可以采用句

8、随着查询子句的增加不断增长,一行很难写下,此时可以采用分行的写法,即每个子句分别在不同的行中。需要注意,子句与分行的写法,即每个子句分别在不同的行中。需要注意,子句与子句之间不能使用符号分隔。子句之间不能使用符号分隔。7.2.1 SELECT语句对列的查询语句对列的查询n对列的查询实质上是对关系的对列的查询实质上是对关系的“投影投影”操作。在操作。在很多情况下,用户只对表中的一部分列感兴趣,很多情况下,用户只对表中的一部分列感兴趣,可以使用可以使用SELECT子句来指明要查询的列,并子句来指明要查询的列,并可根据需要改变输出列显示的先后顺序。可根据需要改变输出列显示的先后顺序。nT-SQL中对

9、列的查询是通过对中对列的查询是通过对SELECT子句中子句中的列名选项进行设置完成的,具体格式为:的列名选项进行设置完成的,具体格式为:SELECT ALL|DISTINCT TOP n PERCENT *|表的名称表的名称.*|视图名称视图名称.* /*选择表或视图中的全部列选择表或视图中的全部列*/| 列的名称列的名称|列的表达式列的表达式 AS 列的别名列的别名 /*选择指定的列选择指定的列*/,n1. 查询一个表中的全部列查询一个表中的全部列n选择表的全部列时,可以使用星号选择表的全部列时,可以使用星号“*”来表示所有的来表示所有的列。列。【例【例7-9】检索】检索students表、

10、表、course表和表和sc表中的所有表中的所有纪录。纪录。nT-SQL语句为:语句为:USE StuInfoSELECT * FROM studentSELECT * FROM courseSELECT * FROM scn也可以将三个表的操作合并为一条语句,使结果在一也可以将三个表的操作合并为一条语句,使结果在一个表中显示:个表中显示:SELECT student.*, course.*, sc.* FROM student, course, sc 2. 查询一个表中部分列查询一个表中部分列n若查询数据时要选择一个表中的部分列信息,若查询数据时要选择一个表中的部分列信息,则在则在SELEC

11、T后给出需要的列即可,各列名之后给出需要的列即可,各列名之间逗号分隔。间逗号分隔。【例【例7-10】检索】检索student表中学生的部分信息,表中学生的部分信息,包括学号、学生姓名和所属院系。包括学号、学生姓名和所属院系。nT-SQL语句为:语句为:SELECT sno, sname, sdept FROM student3. 为列设置别名为列设置别名n通常情况下,当从一个表中取出列值时,该值与列的名称是联系通常情况下,当从一个表中取出列值时,该值与列的名称是联系在一起的。如上例中从在一起的。如上例中从student表中取出学号与学生姓名,取出的表中取出学号与学生姓名,取出的值就与值就与sn

12、o和和sname有联系。当希望查询结果中的列使用新的名有联系。当希望查询结果中的列使用新的名字来取代原来的列名称时,可以使用以下方法:字来取代原来的列名称时,可以使用以下方法:q列名之后使用列名之后使用AS关键字来更改查询结果中的列标题名。如关键字来更改查询结果中的列标题名。如sno AS 学号;学号;q直接在列名后使用列的别名,列的别名课带双引号、单引号或不直接在列名后使用列的别名,列的别名课带双引号、单引号或不带引号。带引号。【例【例7-11】检索】检索student表中学生的表中学生的Sno、Sname、Sage和和Sdept,结果中各列的标题分别指定为学号、学生姓名、年龄和所属院系。结

13、果中各列的标题分别指定为学号、学生姓名、年龄和所属院系。nT-SQL语句为:语句为:SELECT sno as 学生学号学生学号, sname 学生姓名学生姓名, sage 年龄年龄 ,sdept 所属院系所属院系 FROM student4. 计算列值计算列值n使用使用SELECT语句对列进行查询时,语句对列进行查询时,SELECT后可以跟列的表达式。也就是说,使用后可以跟列的表达式。也就是说,使用SELECT语句不仅可以查询原来表中已有的列,语句不仅可以查询原来表中已有的列,还可以通过计算得到新的列。还可以通过计算得到新的列。【例【例7-12】查询】查询sc表中的学生成绩,并且显示表中的学

14、生成绩,并且显示折算后的分数。(折算方法:原始分数折算后的分数。(折算方法:原始分数*1.2)n T-SQL语句为:语句为:SELECT sno,grade AS 原始分数原始分数, grade*1.2 AS 折算后分数折算后分数 FROM sc5. 消除结果中的重复项消除结果中的重复项n在一张完整的关系数据库表中不可能出现两个完全相同的纪录,在一张完整的关系数据库表中不可能出现两个完全相同的纪录,但由于我们在查询时经常只涉及表的部分字段,这样,就有可能但由于我们在查询时经常只涉及表的部分字段,这样,就有可能出现重复行,可以使用出现重复行,可以使用DISTINCT短语可以避免这种情况。短语可以

15、避免这种情况。n关键字关键字DISTINCT的含义是对结果中的重复行只选择一个,以保证的含义是对结果中的重复行只选择一个,以保证行的唯一性。行的唯一性。【例【例7-13】从】从student表中查询所有的院系信息,并去掉重复信息。表中查询所有的院系信息,并去掉重复信息。n T-SQL语句为:语句为:SELECT DISTINCT sdept FROM studentn可以看到,可以看到,student表一共只有表一共只有4个专业。个专业。n与与DISTINCT相反,当使用关键字相反,当使用关键字ALL时,将保留结果中的所有行。时,将保留结果中的所有行。在省略在省略DISTINCT和和ALL的情

16、况下,的情况下,SELECT语句默认为语句默认为ALL。6. 限制结果返回的行数限制结果返回的行数n若若SELECT语句返回的结果行数非常多,而用户只需语句返回的结果行数非常多,而用户只需要返回满足条件的前几条纪录,可以使用要返回满足条件的前几条纪录,可以使用TOP n PERCENT可选子句。其中可选子句。其中n是一个正整数,表示返是一个正整数,表示返回查询结果的前回查询结果的前n行。若使用行。若使用PERCENT关键字,则关键字,则表示返回结果的前表示返回结果的前n%行。行。【例【例7-14】查询】查询student表中前表中前10个学号。个学号。nT-SQL语句为:语句为:SELECT

17、TOP 10 * FROM student执行结果如图执行结果如图7-8所示,只返回了所示,只返回了10个学生的学号。个学生的学号。7.2.2 SELECT语句中的条件查询语句中的条件查询n条件查询是用的最多的一种查询方式,通过在条件查询是用的最多的一种查询方式,通过在WHERE子句中设置查询条件可以挑选符合需子句中设置查询条件可以挑选符合需要的数据、修改某一记录、删除某一记录。条要的数据、修改某一记录、删除某一记录。条件查询本质是对表中的数据进行筛选,即关系件查询本质是对表中的数据进行筛选,即关系运算中的运算中的“选择选择”操作。操作。n在在SELECT语句中,语句中,WHERE子句必须紧跟

18、在子句必须紧跟在FROM子句后,其基本格式为:子句后,其基本格式为:qWHERE 1. 使用比较运算符使用比较运算符n我们使用上一章介绍的比较运算符来比较表达式值的我们使用上一章介绍的比较运算符来比较表达式值的大小,包括:大小,包括:=(等于等于)、(大于大于)、=(大于大于等于等于)、=(小于等于小于等于)、!=(不等于不等于)、(不等不等于于)、!(不大于不大于)。运算结果为。运算结果为TRUE或者或者FALSE【例【例7-15】在】在student表中查询信息系(表中查询信息系(IM)的学生。)的学生。nT-SQL语句为:语句为:SELECT * FROM student WHERE s

19、dept=NIMn显示的全为信息系的同学。显示的全为信息系的同学。2. 使用逻辑运算符使用逻辑运算符n逻辑运算符包括逻辑运算符包括AND、OR和和NOT,用于连接,用于连接WHERE子句中的多个查询条件。当一条语句中同时含有多个逻子句中的多个查询条件。当一条语句中同时含有多个逻辑运算符时,取值的优先顺序为:辑运算符时,取值的优先顺序为:NOT、AND和和OR。【例【例7-16】在】在student表中查询年龄在小于表中查询年龄在小于18或者大于或者大于22,并且籍贯是河南的学生信息。并且籍贯是河南的学生信息。nT-SQL语句为:语句为:SELECT * FROM student WHERE (

20、sage22) and snativeplace=N河南河南n显示的满足条件的有三名同学。显示的满足条件的有三名同学。3. 使用使用LIKE模式匹配模式匹配n在查找记录时,若不是很适合使用算术运算符和逻辑运算符,则可能要在查找记录时,若不是很适合使用算术运算符和逻辑运算符,则可能要用到更高级的技术。用到更高级的技术。nLIKE是模式匹配运算符,用于指出一个字符串是否与指定的字符串相匹是模式匹配运算符,用于指出一个字符串是否与指定的字符串相匹配。使用配。使用LIKE进行匹配时,可以使用通配符,即可以使用模糊查询。进行匹配时,可以使用通配符,即可以使用模糊查询。nT-SQL中使用的通配符有中使用的

21、通配符有“%”、“_”、“ ”和和“”。通配符用在要查找的。通配符用在要查找的字符串的旁边。它们可以一起使用,使用其中的一种并不排斥使用其他字符串的旁边。它们可以一起使用,使用其中的一种并不排斥使用其他的通配符。的通配符。q“%”用于字符串的末尾或开始处,代表用于字符串的末尾或开始处,代表0个或任意多个字符。如要查找姓名中个或任意多个字符。如要查找姓名中有有“a”的教师,可以使用的教师,可以使用“%a%”,这样会查找出姓名中任何位置包含字母,这样会查找出姓名中任何位置包含字母“a”的记录;的记录;q“_”代表单个字符。使用代表单个字符。使用“_a”,将返回任何名字为两个字符且第二个字符是,将返

22、回任何名字为两个字符且第二个字符是“a”的姓名记录;的姓名记录;q“ ”允许在指定值的集合或范围中查找单个字符。如要搜索名字中包含介于允许在指定值的集合或范围中查找单个字符。如要搜索名字中包含介于a-f之间的单个字符的记录,可以使用之间的单个字符的记录,可以使用LIKE “%a-f%”;q“”与与“”相反,用于指定不属于范围内的字符。如相反,用于指定不属于范围内的字符。如abcdef表示不属于表示不属于abcdef集合中的字符。集合中的字符。n【例【例7-17】在】在students表中查询姓表中查询姓“赵赵”的学的学生信息。生信息。nT-SQL语句为:语句为:nSELECT * FROM s

23、tudent WHERE sname like N赵赵%4. 确定范围确定范围nT-SQL中与范围有关的关键字有两个:中与范围有关的关键字有两个:BETWEEN和和IN。n当要查询的条件是某个值的范围时,使用当要查询的条件是某个值的范围时,使用BETWEENAND来指出查来指出查询范围。其中,询范围。其中,AND的左端给出查询范围的下限,的左端给出查询范围的下限,AND的右端给出查询的右端给出查询范围的上限。范围的上限。【例【例7-18】在】在sc表中,查询成绩在表中,查询成绩在60到到80分的学生情况分的学生情况nT-SQL语句为:语句为:nSELECT * FROM sc WHERE gr

24、ade between 60 and 80n关键字关键字IN用来表示查询范围属于指定的集合。集合中列出所有可能的值,用来表示查询范围属于指定的集合。集合中列出所有可能的值,当表中的值与集合中的任意一个值匹配时,即满足条件。当表中的值与集合中的任意一个值匹配时,即满足条件。【例【例7-19】在】在student表中查询表中查询IM系和系和CAST系同学的情况。系同学的情况。nT-SQL语句为:语句为:nSELECT * FROM student WHERE sdept IN(NCSAT,NIM) n该语句等价于语句:该语句等价于语句:nSELECT * FROM student WHERE Sd

25、ept=NCSAT or Sdept=NIMn执行结果如图执行结果如图7-13所示所示5. 涉及空值涉及空值NULL的查询的查询n值为值为“空空”并非没有值,而是一个特殊的符号并非没有值,而是一个特殊的符号“NULL”。一个字段是否允许为空,需要在建。一个字段是否允许为空,需要在建立表的结构时设置。当要判断一个表达式的值立表的结构时设置。当要判断一个表达式的值是否为空值时,使用是否为空值时,使用IS NULL关键字关键字【例【例7-20】查询缺少单科成绩的学生的信息。】查询缺少单科成绩的学生的信息。nT-SQL语句为:语句为:SELECT * FROM sc WHERE grade IS NU

26、LL7.2.3 ORDER BY子句的使用子句的使用n利用利用ORDER BY子句可以对查询的结果按照指定字段进行排序。子句可以对查询的结果按照指定字段进行排序。nORDER BY子句格式为:子句格式为:ORDER BY 排序表达式排序表达式 ASC|DESCn其中其中ASC代表升序,代表升序,DESC表示降序,默认时为升序排列。对数表示降序,默认时为升序排列。对数据类型为据类型为TEXT、NTEXT和和IMAGE的字段不能使用的字段不能使用ORDER BY进进行排序。行排序。【例【例7-21】查询】查询student表中全体女学生的情况,要求结果按照年龄表中全体女学生的情况,要求结果按照年龄

27、降序排列。降序排列。nT-SQL语句为:语句为:SELECT * FROM student WHERE ssex=N女女 ORDER BY sage DESC7.2.4 GROUP BY子句的使用子句的使用n在在T-SQL中经常使用聚合函数和中经常使用聚合函数和GROUP BY子句来实现统计计算。子句来实现统计计算。n1. 聚合函数聚合函数n聚合函数用于处理单个列中所选的全部值,并生成一个结果值。聚合函数用于处理单个列中所选的全部值,并生成一个结果值。n常用的聚合函数有:常用的聚合函数有:【例【例7-22】 统计查询统计查询student表中学生的总人数。表中学生的总人数。nT-SQL语句为:

28、语句为:SELECT COUNT(*) FROM student 【例【例7-23】查询选修】查询选修01课程学生的最高分,最课程学生的最高分,最低分和平均分低分和平均分nT-SQL语句为:语句为:SELECT MAX(grade) as 01课程最高分课程最高分,MIN(grade) as 01课程最低分课程最低分, AVG(grade) as 01课程平均分课程平均分FROM sc WHERE cno=012. GROUP BY子句子句nGROUP BY子句用于对表或视图中的数据按字段分组,还可以利用子句用于对表或视图中的数据按字段分组,还可以利用HAVING短语按照一定的条件对分组后的数

29、据进行筛选。短语按照一定的条件对分组后的数据进行筛选。nGROUP BY子句格式为:子句格式为:GROUP BY ALL 分组表达式分组表达式 HAVING 查询条件查询条件n需要注意的是,当使用需要注意的是,当使用HAVING短语指定筛选条件时,短语指定筛选条件时,HAVING短语必须短语必须与与GROUP BY配合使用。配合使用。【例【例7-24】求】求student表中各个专业的学生人数。表中各个专业的学生人数。nT-SQL语句为:语句为:SELECT sdept,COUNT(*) as 学生人数学生人数 FROM studentGROUP BY sdept【例【例7-25】查询】查询s

30、c表中选修了两门课并且成绩均不及格的学生的学号表中选修了两门课并且成绩均不及格的学生的学号n分析:我们将分析:我们将SC表中的成绩不及格的学生按照学号分组,对各个分组进表中的成绩不及格的学生按照学号分组,对各个分组进行筛选,找出纪录数大于行筛选,找出纪录数大于2的学生学号,进行结果输出。的学生学号,进行结果输出。nT-SQL语句为:语句为:SELECT sno FROM sc WHERE grade27.2.4 表的连接表的连接(JOIN)n以上我们介绍的都是单表查询,在实际应用中,以上我们介绍的都是单表查询,在实际应用中,经常需要把两个或者多个表按照给定的条件进经常需要把两个或者多个表按照给

31、定的条件进行连接而形成新的表。行连接而形成新的表。n多表连接使用多表连接使用FROM子句指定多个表,连接条子句指定多个表,连接条件指定各列之间(每个表至少一列)进行连接件指定各列之间(每个表至少一列)进行连接的关系。连接条件中的列必须具有一致的数据的关系。连接条件中的列必须具有一致的数据类型。类型。n在在T-SQL中,连接查询有两大类实现形式,一中,连接查询有两大类实现形式,一类是使用等值连接形式,另一类是使用关键字类是使用等值连接形式,另一类是使用关键字JOIN连接形式。连接形式。1. 等值连接等值连接n等值连接的连接条件是在等值连接的连接条件是在WHERE子句中给出的,只子句中给出的,只有

32、满足连接条件的行才会出现在查询结果中。这种形有满足连接条件的行才会出现在查询结果中。这种形式也被称为连接谓词表示形式,是式也被称为连接谓词表示形式,是SQL语言早期的连语言早期的连接形式。接形式。n等值连接的连接条件格式:等值连接的连接条件格式:表名表名1.字段名字段名1=表名表名2.字段名字段名2【例【例7-26】从】从student表和表和sc表中,查询所有不及格的表中,查询所有不及格的学生的学号、学生姓名、所属院系、所选的课程号和学生的学号、学生姓名、所属院系、所选的课程号和成绩。成绩。nT-SQL语句为:语句为:SELECT student.sno,sname,sdept,cno,gr

33、ade FROM student,sc WHERE student.sno=sc.sno and grade60说明:说明:n本例中,本例中,WHERE子句既有查询条件(子句既有查询条件(Grade60),),又有连接条件(又有连接条件(student.Sno=sc.Sno););n连接条件中的两个字段称为连接字段,它们必须是具连接条件中的两个字段称为连接字段,它们必须是具有一致的数据类型。如本例中连接字段分别为有一致的数据类型。如本例中连接字段分别为student表的表的sno字段和字段和sc表中的表中的sno字段;字段;n在单表查询中,所有的字段都来自于同一张表,故在在单表查询中,所有的字

34、段都来自于同一张表,故在SELECT语句中不需要特别说明。但是在多表查询中,语句中不需要特别说明。但是在多表查询中,有的字段(如有的字段(如sno字段)在几个表中都出现了,引用字段)在几个表中都出现了,引用时就必须说明其来自那个表,否则就可能引起混乱,时就必须说明其来自那个表,否则就可能引起混乱,造成语法错误;造成语法错误;n连接条件中使用的比较符可以是连接条件中使用的比较符可以是、=、!=、!。当比较符为。当比较符为“=”时,就是等值时,就是等值连接。连接。2. JOIN关键字连接多个表关键字连接多个表nT-SQL扩展了连接的形式,引入了扩展了连接的形式,引入了JOINON关键字关键字连接形

35、式,从而使表的连接运算能力得到了增强。连接形式,从而使表的连接运算能力得到了增强。nJOINON关键字放在关键字放在FROM子句中,命令格式如下:子句中,命令格式如下:FROM INNER|LEFT|RIGHT|FULL OUTER JOIN ON n这种连接形式通过这种连接形式通过FROM给出连接类型,用给出连接类型,用JOIN表表示连接,用示连接,用ON短语给出连接条件。短语给出连接条件。nJOIN提供了多种类型的连接方法:内连接、外连接提供了多种类型的连接方法:内连接、外连接和交叉连接。它们之间的区别在于:从相互关联的不和交叉连接。它们之间的区别在于:从相互关联的不同表中选择用于连接的行

36、时所采用的方法不同。同表中选择用于连接的行时所采用的方法不同。 内连接内连接INNER查询查询n内连接是最常见的一种连接,也被称为普通连接或自内连接是最常见的一种连接,也被称为普通连接或自然连接,它是系统默认形式,在实际使用中可以省略然连接,它是系统默认形式,在实际使用中可以省略INNER关键字。关键字。n例例7-26也可以改写成如下形式实现:也可以改写成如下形式实现:SELECT student.sno,sname,sdept,cno,grade FROM student JOIN sc ON student.sno=sc.sno WHERE grade60n使用使用JOINON连接词替换了

37、上例中的连接词替换了上例中的WHERE子句子句的连接条件。内连接与等值连接效果相同相同,仅当的连接条件。内连接与等值连接效果相同相同,仅当两个表中都至少有一行符合连接条件时,内连接才返两个表中都至少有一行符合连接条件时,内连接才返回行。回行。外连接外连接OUTER查询查询n外连接是指连接关键字外连接是指连接关键字JOIN后面表中指定列连接在前一表中指定后面表中指定列连接在前一表中指定列的左边或者右边,如果两表中指定列没有匹配行,则返回空值。列的左边或者右边,如果两表中指定列没有匹配行,则返回空值。n外连接的结果不但包含满足连接条件的行,还包含相应表中的所外连接的结果不但包含满足连接条件的行,还

38、包含相应表中的所有行。外连接有三种形式,其中的有行。外连接有三种形式,其中的OUTER可以省略:可以省略:(1)左外连接()左外连接(LEFT OUTER JOIN或或LEFT JOIN):包含左边):包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部满足条件的行。右边表中全部满足条件的行。(2)右外连接()右外连接(RIGHT OUTER JOIN或或RIGHT JOIN):包含右):包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中

39、全部满足条件的行。及左边表中全部满足条件的行。(3)全外连接()全外连接(FULL OUTER JOIN或或FULL JOIN):包含左、):包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行,其实全外连接将返回两个表的所有行。行,其实全外连接将返回两个表的所有行。n在现实生活中,参照完整性约束可以减少对于全外连接的使用,在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。但当在数据库中没有利用清晰、一般情况下左外连接就足够了。但当在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外

40、连接就变得非常有用了,规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。你可以使用它来清理数据库中的数据。 【例【例7-27】分别用左外连接和右外连接查询】分别用左外连接和右外连接查询student表表和和sc表中的学生的表中的学生的Sno、Cno、Sname和和Grade。比。比较查询结果的区别并分析。较查询结果的区别并分析。n左外连接左外连接T-SQL语句为:语句为:SELECT student.sno,cno,sname,gradeFROM student LEFT JOIN sc ON sc.sno=student.snon右外连接右外连接T-

41、SQL语句为:语句为:SELECT student.sno,cno,sname,gradeFROM student RIGHT JOIN sc ON sc.sno=student.sno交叉连接交叉连接(CROSS JOIN)n交叉连接即两个表的笛卡尔积,返回结果是由第一个表的每行与交叉连接即两个表的笛卡尔积,返回结果是由第一个表的每行与第二个表的所有行组合后形成的表,因此,数据行数等于第一个第二个表的所有行组合后形成的表,因此,数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。交叉连接关键字据行数。交叉连

42、接关键字CROSS JOIN后不跟后不跟ON短语引出的连接短语引出的连接条件。条件。【例【例7-28】交叉连接】交叉连接student和和sc两表,查看新表的行数。两表,查看新表的行数。nT-SQL语句为:语句为:SELECT * FROM studentSELECT * FROM scSELECT student.*,sc.* FROM student CROSS JOIN scn执行结果如图执行结果如图7-20所示,可以看到,所示,可以看到,student表有表有239行,行,sc表有表有929行,因此,两表相乘有行,因此,两表相乘有222031行。行。7.2.5 子查询子查询n在在SEL

43、ECT查询语句中,子查询也称为嵌套查询,是查询语句中,子查询也称为嵌套查询,是一个嵌套在一个嵌套在 SELECT中的查询语句。处于内层的查中的查询语句。处于内层的查询称为子查询,处于外层的查询称为父查询。任何允询称为子查询,处于外层的查询称为父查询。任何允许使用表达式的地方都可以使用子查询。许使用表达式的地方都可以使用子查询。T-SQL语句语句支持子查询,正是支持子查询,正是SQL结构化的具体体现。结构化的具体体现。n子查询子查询SELECT语句必须放在括号中,子查询只返回语句必须放在括号中,子查询只返回一行数据,并且返回的数据常常也只有一列。可以用一行数据,并且返回的数据常常也只有一列。可以

44、用子查询来检查或者设置变量和列的值,或者用子查询子查询来检查或者设置变量和列的值,或者用子查询来测试数据行是否存在于来测试数据行是否存在于WHERE子句中。需要注意子句中。需要注意的是的是ORDER BY子句只能对最终查询结果排序,即子句只能对最终查询结果排序,即在子查询中的在子查询中的SELECT语句中不能使用语句中不能使用ORDER BY子子句。句。1. 使用使用IN关键字的子查询关键字的子查询n由于子查询的结果是纪录的集合,故常使用谓词由于子查询的结果是纪录的集合,故常使用谓词IN来实现。来实现。nIN谓词用于判断一个给定值是否在子查询结果集中。当父查询表谓词用于判断一个给定值是否在子查

45、询结果集中。当父查询表达式与子查询的结果集中的某个值相等时,返回达式与子查询的结果集中的某个值相等时,返回TURE,否则返回,否则返回FALSE。同时,可以在。同时,可以在IN关键字之前使用关键字之前使用NOT,表示表达式的值,表示表达式的值不在查询结果集中。不在查询结果集中。【例【例7-29】查询至少有一门课程不及格的学生的信息。】查询至少有一门课程不及格的学生的信息。nT-SQL语句为:语句为:SELECT * FROM student WHERE sno IN(SELECT sno FROM sc WHERE gradeALL(SELECT grade FROM sc WHERE sno

46、=(SELECT sno FROM student WHERE sname=N王小华王小华)goSELECT * FROM sc WHERE grade ANY(SELECT grade FROM sc WHERE sno=(SELECT sno FROM student WHERE sname=N王小华王小华)go4. 使用使用EXISTS 的子查询的子查询nEXISTS称为存在量词,称为存在量词,WHERE子句中使用子句中使用EXISTS表示当子查表示当子查询的结果非空时,条件为询的结果非空时,条件为TRUE,反之则为,反之则为FALSE。EXISTS前面前面也可以加也可以加NOT,表示检

47、测条件为,表示检测条件为“不存在不存在”。nEXISTS语句与语句与IN非常类似,它们都根据来自子查询的数据子集测非常类似,它们都根据来自子查询的数据子集测试列的值。不同之处在于,试列的值。不同之处在于,EXISTS使用联接将列的值与子查询中使用联接将列的值与子查询中的列联接起来,而的列联接起来,而IN不需要联接,它直接根据一组以逗号分隔的不需要联接,它直接根据一组以逗号分隔的值进行比较。值进行比较。【例【例7-32】查询没有选修】查询没有选修01课程的学生的信息课程的学生的信息nT-SQL语句为:语句为:SELECT * FROM student WHERE NOT EXISTS(SELEC

48、T * FROM sc WHERE sno=student.sno AND cno=01)7.2.6 SELECT语句的其他子句语句的其他子句n除了上面介绍的除了上面介绍的SELECT语句的主要子句外,语句的主要子句外,SELECT还有还有2个常用子句:个常用子句:qINTO子句子句qUNION子句子句使用它们可以实现更为完备的功能。使用它们可以实现更为完备的功能。1. INTO子句子句nSELECT语句使用语句使用INTO子句来表明查询结果的去向。子句来表明查询结果的去向。我们如果需要将查询得到的结果存入新的数据表中,我们如果需要将查询得到的结果存入新的数据表中,这时就需要使用语句:这时就需

49、要使用语句:INTO ,来创建新表,来创建新表,存储纪录。存储纪录。【例【例7-33】将】将student表中所有年龄为表中所有年龄为19岁的学生信息岁的学生信息存入新表存入新表age19中。中。nT-SQL语句为:语句为:SELECT * INTO age19 FROM student WHERE sage=19GOSELECT * FROM age192. UNION子句子句nT-SQL支持集合的并(支持集合的并(UNION)运算,执行联合查询。需要注意)运算,执行联合查询。需要注意的是,参与并运算操作的两个查询语句,其结果应具有相同的字的是,参与并运算操作的两个查询语句,其结果应具有相同

50、的字段个数,以及相同的对应字段的数据类型。段个数,以及相同的对应字段的数据类型。n默认情况下,默认情况下,UNION将从结果集中删除重复的行。如果使用将从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行而不删除重复的行。关键字,那么结果中将包含所有行而不删除重复的行。【例【例7-34】查询】查询CSAT专业的女学生和专业的女学生和IM专业的男学生信息专业的男学生信息nT-SQL语句为:语句为:SELECT * FROM student where sdept=NCSAT and ssex=N女女UNIONSELECT * FROM student where sdept=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com