sql完整经典查询教程_第1页
sql完整经典查询教程_第2页
sql完整经典查询教程_第3页
sql完整经典查询教程_第4页
sql完整经典查询教程_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 Transact-SQL查询语言 5.1 SQL简介简介 5.2 SELECT查询语句查询语句 5.3 基于单表的查询基于单表的查询 5.4 基于多表的连接查询基于多表的连接查询 5.5 子查询子查询5.1 SQL简介简介SQL是在是在20世纪世纪70年代末由年代末由IBM公司开发出来的一套程序语言,公司开发出来的一套程序语言,并被用在并被用在DB2关系数据库系统中。但是,直到关系数据库系统中。但是,直到1981年,年,IBM推出推出商用的商用的SQLDS关系型数据库系统;关系型数据库系统;Oracle及其他大型关系型数及其他大型关系型数据库系统相继出现,据库系统相继出现,SQL才得以

2、广泛应用。例如,才得以广泛应用。例如,Sybase 与与Microsoft公司使用公司使用Transact-SQL,而而Oracle公司使用公司使用PL/SQL。SQL语言是应用于数据库的语言,本身是不能独立存在的。它是语言是应用于数据库的语言,本身是不能独立存在的。它是一种非过程性一种非过程性(non-procedural)语言,与一般的高级语言,例如:语言,与一般的高级语言,例如: C、Pascal是大不相同的。一般的高级语言在存取数据库时,需要是大不相同的。一般的高级语言在存取数据库时,需要依照每一行程序的顺序处理许多的动作。但是使用依照每一行程序的顺序处理许多的动作。但是使用SQL时,

3、只需告时,只需告诉数据库需要什么数据,怎么显示就可以了。具体的内部操作则由诉数据库需要什么数据,怎么显示就可以了。具体的内部操作则由数据库系统来完成。数据库系统来完成。5.2 SELECT查询语句 5.2.1 查询分析器查询分析器 5.2.2 查询语句格式查询语句格式 5.2.3关于演示数据库的说明关于演示数据库的说明5.2.1 查询分析器在在SQL查询分析器中,用户既可在全文窗口中输入查询分析器中,用户既可在全文窗口中输入Transact-SQL语句,也可以打开包含语句,也可以打开包含Transact-SQL语语句的文本文件,执行语句并在结果窗口中,查看结果。句的文本文件,执行语句并在结果窗

4、口中,查看结果。启动启动SQL查询分析器可采用两种方法:查询分析器可采用两种方法: 在在“开始开始”菜单中,通过菜单中,通过Microsoft SQL Server下下拉菜单的拉菜单的“查询分析器查询分析器”命令来打开查询分析器。命令来打开查询分析器。 在在SQL Server企业管理器中通过工具菜单启动。企业管理器中通过工具菜单启动。 启动SQL查询分析器并执行相应语句的操作步骤如下:(1)在【开始】菜单中,点击【程序】级联菜单,选择【Microsoft SQL Server】程序组中的【查询分析器】选项,即可启动SQL查询分析器。或在企业管理器中,点击【工具】,选择【SQL查询分析器】选项

5、,也可启动SQL查询分析器。(2)在启动SQL查询分析器时,系统首先打开【连接到SQL Server】对话框。使用该对话框可以指定连接到哪个SQL Server服务器。如图5-1所示。图5-1 连接到SQL Server对话框 (3)单击SQL Server文本框后面的按钮,可打开【选择服务器】对话框。可以在此对话框中选择要连接到的SQL Server服务器。如图5-2所示。 (4)在【连接到SQL Server】对话框中设置正确的验证模式,即可连接到SQL Server服务器,并打开SQL查询分析器。如图5-3所示。 (5) 进入【SQL 查询分析器】界面,在工具栏中,单击 master所在

6、的下拉框,即可选择待查询的数据库,例如选择【学生信息数据库】。(6)在SQL语句录入框中录入SQL语句,然后单击工具栏中按钮【 】,执行该【SELECT】查询语句,即可得到操作结果。图5-2 选择服务器对话框图5-3 选择服务器对话框5.2.2 查询语句格式在SQL语言中,使用SELECT语句进行数据库的查询时,应用灵活、功能强大。1、基本格式SELECT ALL | DISTICT , , FROM , ,. WHERE GROUP BY HAVING ORDER BY ASC | DESC 2、语句说明SELECT语句的基本格式是由SELECT子句、FROM子句和WHERE子句组成的查询块

7、。整个整个SELECT语句的含义是:根据语句的含义是:根据WHERE子句的筛子句的筛选条件表达式,从选条件表达式,从FROM子句指定的表中找出满足条件记子句指定的表中找出满足条件记录,再按录,再按SELECT语句中指定的字段次序,筛选出记录中语句中指定的字段次序,筛选出记录中的字段值构造一个显示结果表。的字段值构造一个显示结果表。如果有如果有GROUP子句,则将结果按子句,则将结果按的值进的值进行分组,该值相等的记录为一个组。行分组,该值相等的记录为一个组。如果如果GROUP子句带子句带HAVING短语,则只有满足指定条短语,则只有满足指定条件的组才会显示输出。件的组才会显示输出。提示提示:S

8、ELECT语句操作的是记录(数据)集合(一个表或多个表),语句操作的是记录(数据)集合(一个表或多个表),而不是单独的一条记录。语句返回的也是记录集合(满足而不是单独的一条记录。语句返回的也是记录集合(满足Where条件的),即结果表。条件的),即结果表。5.2.3关于演示数据库的说明为了说明【为了说明【SELECT】语句的各种用法,下面我们以【学】语句的各种用法,下面我们以【学生课程数据库】为操作对象进行说明。生课程数据库】为操作对象进行说明。 在【在【student】数据库中包含了】数据库中包含了4个表:个表: 学生信息表;反映了学生个人信息,具体的记录如图学生信息表;反映了学生个人信息,

9、具体的记录如图5-4所示。所示。 课程信息表:反映了学校的课程信息,具体的记录如图课程信息表:反映了学校的课程信息,具体的记录如图5-5所示。所示。 成绩信息表:反映了学生考试成绩信息,具体的记录如成绩信息表:反映了学生考试成绩信息,具体的记录如图图5-6所示。所示。 班级信息表:反映了学生所在班级的信息,具体的记录班级信息表:反映了学生所在班级的信息,具体的记录如图如图5-7所示。所示。图5-4 学生信息表图5-5 课程信息表图5-6 成绩信息表图5-7 班级信息表图5-8 学生信息表结构图5-9 课程信息表结构图5-10 成绩信息表结构 图5-11 班级信息表结构5.3 基于单表的查询 问

10、题:问题:我们需要对数据进行哪些维护操作?如我们需要对数据进行哪些维护操作?如何对数据进行查询、统计何对数据进行查询、统计? ? 结构化查询语言结构化查询语言(Structured Query Language)。这种语言的语法结构类似于。这种语言的语法结构类似于英语,易学易用,书写随意。英语,易学易用,书写随意。查询表中指定的字段SELECT子句后的各个字段的先后顺序可以与原表中的子句后的各个字段的先后顺序可以与原表中的顺序不一致,但在结果表中,字段是按照顺序不一致,但在结果表中,字段是按照SELECT子句后子句后的各个字段的顺序显示。的各个字段的顺序显示。【例【例5-1】显示】显示stud

11、ent_info表中学生的表中学生的姓名、性姓名、性别以及家庭住址。别以及家庭住址。SELECT student_name, student_sex, address FROM student_info 通配符“*”的使用在在SELECT语句中,可以使用通配符语句中,可以使用通配符“*”显示所有的字段显示所有的字段。SELECT * FROM student_info【例【例5-2】 列出列出student_info表表所有的字段。所有的字段。 使用单引号加入字符串在在SELECT语句中,可以在一个字段的前面加上一个语句中,可以在一个字段的前面加上一个单引号字符串,对后面的字段起说明作用。单引

12、号字符串,对后面的字段起说明作用。【例【例5-3】显示】显示student_info表中学生的姓名、家庭住址。表中学生的姓名、家庭住址。SELECT student_name,家庭住址家庭住址, address FROM student_info使用别名在显示结果时,可以指定以别名代替原来的字段名称,总在显示结果时,可以指定以别名代替原来的字段名称,总共有共有3种方法:种方法: 采用采用“字段名称字段名称 AS 别名别名”的格式。的格式。 采用采用“字段名称字段名称 别名别名” 的格式。的格式。 采用采用“别名别名=字段名称字段名称” 的格式。的格式。【例【例5-4】 显示显示student_

13、info表中学生的姓名、家庭住表中学生的姓名、家庭住址,并在标题栏种显示址,并在标题栏种显示“姓名姓名”和和“家庭住址家庭住址”字样,字样,而不是显示而不是显示student_name和和address。SELECT student_name AS 姓名,address AS 家庭住址 FROM student_info显示表达式的值 在在SELECT语句后面可以是字段表达式,字段语句后面可以是字段表达式,字段表达式不仅可以是算术表达式,还可以是字符表达式不仅可以是算术表达式,还可以是字符串常量、函数等。串常量、函数等。【例【例5-5】 显示显示student_info表中所有学生姓名表中所有

14、学生姓名和年龄。和年龄。 SELECT student_name, year(getdate()-year(born_date) as 年龄 FROM student_info使用DISTINCT短语消除重复的记录 DISTINCT短语能够从结果表中去掉重复的记短语能够从结果表中去掉重复的记录。录。【例【例5-6】查询所有学生所属班级的】查询所有学生所属班级的班号班号。SELECT DISTINCT class_no FROM student_info用WHERE子句查询特定的记录 SQL是一种集合处理语言,所以数据修改及数据检索是一种集合处理语言,所以数据修改及数据检索语句会对表中的所有记录

15、(行)起作用,除非使用语句会对表中的所有记录(行)起作用,除非使用WHERE子句来限定查询的范围。子句来限定查询的范围。 注意注意WHERE子句必须紧跟在子句必须紧跟在FROM子句之后。子句之后。SELECT FROM WHERE 这里条件表达式可以是关系表达式、逻辑表达式、这里条件表达式可以是关系表达式、逻辑表达式、特殊表达式。特殊表达式。1、关系表达式、关系表达式用关系运算符将两个表达式连接在一起的式子即为关用关系运算符将两个表达式连接在一起的式子即为关系表达式,关系表达式的返回值为逻辑值(系表达式,关系表达式的返回值为逻辑值(TRUE、 FALSE),关系表达式的格式为:),关系表达式的

16、格式为: WHERE子句中关系表达式常用的关系运算符如子句中关系表达式常用的关系运算符如表表5-1所示。所示。注意:注意: 在关系表达式字符型数据之间的比较是对字在关系表达式字符型数据之间的比较是对字符的符的ASCII码值进行比较。所有字符都有一个码值进行比较。所有字符都有一个ASCII码值与之对应。例如,字母码值与之对应。例如,字母“A”,字母,字母“B” 字母字母“C”,它们的,它们的ASCII码值分别是码值分别是65、66、67。 字符串的比较是从左向右依次进行。字符串的比较是从左向右依次进行。 在在SQL Server 2000中,日期字符串可以中,日期字符串可以按照按照“年年月月日日

17、”的格式书写。的格式书写。2、逻辑表达式、逻辑表达式用逻辑运算符将两个表达式连接在一起的式子即为用逻辑运算符将两个表达式连接在一起的式子即为逻辑表达式,逻辑表达式的返回值为逻辑值逻辑表达式,逻辑表达式的返回值为逻辑值(TRUE、 FALSE),逻辑表达式的格式为:),逻辑表达式的格式为: 3、特殊表达式、特殊表达式特殊表达式在比较运算中有一些特殊的用途,具体特殊表达式在比较运算中有一些特殊的用途,具体的格式在使用时给出。的格式在使用时给出。 有关关系运算符的使用 【例【例5-7】列出性别为女的学生姓名、家庭住址。】列出性别为女的学生姓名、家庭住址。SELECT * FROM student_i

18、nfo WHERE born_date 1980-12-31SELECT student_name, address FROM student_info WHERE student_sex=女女【例【例5-8】 列出列出1980年以后出生的学生的基本情况。年以后出生的学生的基本情况。有关逻辑运算符的使用【例【例5-9】列出所有家住】列出所有家住“武汉市武汉市”的男学生姓名的男学生姓名、电话号码和家庭住址。、电话号码和家庭住址。SELECT student_name,tele_number,student_sex,address FROM student_info WHERE substring

19、(address,1,3)=武汉市武汉市 AND student_sex=男男【例【例5-10】列出】列出200001班女同学的名单。班女同学的名单。SELECT * FROM student_info WHERE class_no=200001 AND student_sex=女女【例【例5-11】列出】列出200001班或电话号码以班或电话号码以87开开头头同学姓名、性别和电话号码。同学姓名、性别和电话号码。SELECT student_name,student_sex,tele_number FROM student_info WHERE class_no=200001 OR SUBST

20、RING(tele_number,1,2)=87【例【例5-12】列出所有年龄不是】列出所有年龄不是19岁的学生姓名、性岁的学生姓名、性别和出生日期。别和出生日期。SELECT student_name,student_sex, born_date FROM student_info WHERE ( year(getdate()-year(born_date) !=23有关特殊运算符的使用 【例【例5-13】列出年龄不在】列出年龄不在18-20岁之间的所有学生名岁之间的所有学生名单。单。本例主要学习有关本例主要学习有关“BETWEENAND”的使用格式,使的使用格式,使用用“BETWEENAN

21、D”的作用是定义表达式在两数之的作用是定义表达式在两数之间。格式为:间。格式为:表达式表达式 NOT BETWEEN 表达式表达式1 AND 表达式表达式2 SELECT * FROM student_info WHERE ( year(getdate()-year(born_date) BETWEEN 18 AND 20【例【例5-14】列出所有注释内容为空的学生姓名。】列出所有注释内容为空的学生姓名。当需要判断一个表达式的值是否为空值时,可使用关键当需要判断一个表达式的值是否为空值时,可使用关键字字“IS NULL”。本例主要学习有关。本例主要学习有关“IS NULL”短语的短语的书书写格

22、式。使用写格式。使用“IS NULL”短语的格式为:短语的格式为:表达式表达式 IS NOT NULL当使用当使用NOT 关键字,表示不为空。关键字,表示不为空。 SELECT student_name, tele_number FROM student_info WHERE comment IS NULL【例【例5-15】列出】列出200001班和班和200002班学生的学号、姓名和性别。班学生的学号、姓名和性别。使用使用IN关键字可以指定一个值表,值表中指定列出所有可关键字可以指定一个值表,值表中指定列出所有可能的值,当表达式与值表中的任意一个匹配时,即返回能的值,当表达式与值表中的任意一

23、个匹配时,即返回 TRUE,否则返回否则返回FALSE。使用。使用IN关键字指定值表的格式关键字指定值表的格式为:为: 表达式表达式 IN (表达式(表达式1,n)本例主要学习本例主要学习“IN 短语短语”的书写格式。的书写格式。SELECT student_id,student_name, student_sex FROM student_info WHERE class_no IN (200001,200002)“IN 短语短语”的作用类似于逻辑的作用类似于逻辑“或或”,有时用,有时用IN比比OR更方便。例如更方便。例如上述语句也可以写为:上述语句也可以写为:SELECT student_

24、id,student_name, student_sex FROM student_info WHERE class_no =200001 OR class_no =200002【例【例5-16】列出既不是】列出既不是200001班,也不是班,也不是200002班学生的学号、姓名和性别。班学生的学号、姓名和性别。本例主要学习有关本例主要学习有关“NOT IN 短语短语”的书写格的书写格式。式。 SELECT student_id,student_name, student_sex FROM student_info WHERE class_no NOT IN (200001,200002)【例

25、【例5-17】列出所有】列出所有“刘刘” 姓且为双名的学生。姓且为双名的学生。本例主要学习本例主要学习LIKE与通配符与通配符“_、%”的使用及模式的使用及模式匹配表达式书写格式。匹配表达式书写格式。LIKE关键字用于指出一个字关键字用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以符串是否与指定的字符串相匹配,其运算对象可以是是char、text、 datetime、 smalldatetime等类型等类型的数据,返回逻辑值的数据,返回逻辑值TRUE或或FALSE。LIKE关键字关键字表达式的格式为:表达式的格式为: 字符表达式字符表达式1 NOT LIKE 字符表达式字符表达式2

26、SELECT student_id,student_name FROM student_info WHERE student_name LIKE 刘刘_【例【例5-18】列出所有有体育特长的学生的姓名。】列出所有有体育特长的学生的姓名。SELECT student_id,student_name FROM student_info WHERE comment LIKE %体育特长体育特长%使用ORDER BY子句对查询结果排序在在SELECT语句中,使用语句中,使用“ORDER BY”子句可以对查子句可以对查询结果进行升序或降序的排列。询结果进行升序或降序的排列。1、“ORDER BY”子句的

27、基本格式子句的基本格式基本格式:基本格式:SELECT FROM WHERE ORDER BY ASC|DESC ,上述格式中,上述格式中,“子句表达式子句表达式1”可以是一个列名、列的别可以是一个列名、列的别名、表达式或非零的整数值,而非零的整数值则表示名、表达式或非零的整数值,而非零的整数值则表示字段、别名或表达式在选择列表中的位置。字段、别名或表达式在选择列表中的位置。ASC表示表示升序,为默认值;升序,为默认值;DESC表示降序,表示降序,排序时空值排序时空值(NULL)被认为是最小值。)被认为是最小值。“ORDER BY”子句应用实例【例【例5-21】将】将student_info表

28、中的学生按出生时表中的学生按出生时间先后顺序。间先后顺序。 “ORDER BY”子句的输出结果仅仅是影响表的子句的输出结果仅仅是影响表的逻辑顺序(排序顺序),并没影响表的真正物逻辑顺序(排序顺序),并没影响表的真正物理顺序(实际顺序)。理顺序(实际顺序)。SELECT student_id,student_name, born_dateFROM student_info ORDER BY born_date这种多能排序叫做能联排序。只要在这种多能排序叫做能联排序。只要在“ORDER BY”子句后面,子句后面,按照顺序列出字段的清单,字段之间用逗号分隔,即可实按照顺序列出字段的清单,字段之间用逗

29、号分隔,即可实现能联排序的功能。现能联排序的功能。【例【例5-23】列出】列出2000年元旦前入学的学生名单。要求查询年元旦前入学的学生名单。要求查询结果按入学时间降序显示。结果按入学时间降序显示。本例主要学习本例主要学习“ORDER BY”子句和子句和“WHERE”子句一起使用。子句一起使用。SELECT student_id,student_name, ru_date FROM student_info WHERE ru_date 19 AND student_sex=女女MAX和MIN函数的应用MAX和和MIN函数分别用于求表达式中所有值项的最大值函数分别用于求表达式中所有值项的最大值与

30、最小值,语句格式为:与最小值,语句格式为: MAX / MIN (ALL|DISTINCT 表达式)表达式)其中表达式是常量、列、函数或表达式,其数据类型可其中表达式是常量、列、函数或表达式,其数据类型可以是数字、字符和时间日期类型。以是数字、字符和时间日期类型。ALL表示对所有值进行运算,表示对所有值进行运算,DISTINCT表示去除重复表示去除重复值、默认为值、默认为ALL。忽略。忽略NULL值。值。【例【例5-26】查找年龄最大和最小的学生出生日期。】查找年龄最大和最小的学生出生日期。 SELECT MIN (born_date) 年龄最大年龄最大 , MAX (born_date) 年

31、龄最小年龄最小 FROM student_infoAVG函数的应用AVG函数的表达式格式与函数的表达式格式与MAX和和MIN的表达的表达式格式一样。求表达式中所有项的平均值。其式格式一样。求表达式中所有项的平均值。其格式为:格式为: AVG(ALL|DISTINCT 表达式)表达式)其中其中表达式表达式是常量、列、函数或表达式,其数是常量、列、函数或表达式,其数据类型只能是据类型只能是int、smallint 、 tinyint 、 bigint 、 decimal、numeric、float、real 、money、smallmoney 。ALL表示对所有值进表示对所有值进行运算,行运算,D

32、ISTINCT表示去除重复值、默认表示去除重复值、默认为为ALL。AVG忽略忽略NULL值值【例【例5-28】求出第一学期所开课程的平均课时和平均学】求出第一学期所开课程的平均课时和平均学分。分。 SELECT AVG (course_time) 平均课时平均课时, AVG (course_score) 平均学分平均学分 FROM course_info WHERE course_start =1SUM函数的应用SUM函数用于求表达式中所有项的总和。其格函数用于求表达式中所有项的总和。其格式为:式为: SUM(ALL|DISTINCT 表达式)表达式)其中表达式是常量、列、函数或表达式,其数据

33、其中表达式是常量、列、函数或表达式,其数据类型只能是类型只能是int、smallint 、 tinyint 、 bigint 、 decimal、numeric、float、real 、money、smallmoney 。ALL表示对所有值进行运算,表示对所有值进行运算, DISTINCT表示去除重复值、默认为表示去除重复值、默认为ALL。 SUM 忽略忽略NULL值值【例【例5-29】求出第一学期所开课程的总课时和】求出第一学期所开课程的总课时和总学分。总学分。 SELECT SUM (course_time) 总课程总课程, SUM (course_score) 总学分总学分 FROM c

34、ourse_info WHERE course_start =1利用利用SQL 的的GROUP BY子句,能够快速而子句,能够快速而简便地将查询结果表按照指定的字段进行分简便地将查询结果表按照指定的字段进行分组,值相等的记录分为一组。组,值相等的记录分为一组。GROUP BY子句一般和子句一般和SQL的的聚合函数聚合函数一一起使用。起使用。【基本格式】【基本格式】: SELECT FROM GROUP BY 使用GROUP BY对查询结果进行分组【例【例5-30】统计各班学生的总人数。】统计各班学生的总人数。 本例主要学习有关本例主要学习有关GROUP BY子句的表达式书写格式。子句的表达式书

35、写格式。 SELECT class_no,COUNT( student_id) 学生人数学生人数 FROM student_info GROUP BY class_no【例【例5-31】统计男、女学生各自的总人数和平均年龄。】统计男、女学生各自的总人数和平均年龄。 SELECT COUNT(student_id) 总人数总人数, AVG(year(getdate()-year(born_date) 平均年平均年龄龄 FROM student_info GROUP BY student_sex利用HAVING筛选结果表在实际使用中,往往还要对分组后的结果按某种在实际使用中,往往还要对分组后的结果

36、按某种条件再进行筛选,而只输出满足用户指定条件的条件再进行筛选,而只输出满足用户指定条件的记录。在记录。在SQL中,中,HAVING子句能完成此功能。子句能完成此功能。“WHERE”子句与子句与“HAVING”子句的区别在于子句的区别在于作用作用对象不同:对象不同:1、WHERE子句的作用对象是表,是从表中选择子句的作用对象是表,是从表中选择出满足筛选条件的记录。出满足筛选条件的记录。2、HAVING子句的作用对象是组,是从组中选子句的作用对象是组,是从组中选 择出满足筛选条件的记录。择出满足筛选条件的记录。【例【例5-32】将总人数大于】将总人数大于2的班级学生总人数显示出来。的班级学生总人

37、数显示出来。 本例主要学习有关本例主要学习有关GROUP BY子句的表达式书写格式。子句的表达式书写格式。 SELECT class_no 班级名班级名, COUNT(student_id) 总人数总人数 FROM student_info GROUP BY class_no HAVING COUNT(student_id)25.4 基于多表的联接查询 前面的查询只涉及一个表。在多数情况下,一个前面的查询只涉及一个表。在多数情况下,一个SQL查询语句一次往往牵扯到多个表。查询语句一次往往牵扯到多个表。 在关系型数据库中,将一个查询同时涉及两个或在关系型数据库中,将一个查询同时涉及两个或两个以上

38、的表,称为两个以上的表,称为连接查询连接查询。 基于多表的查询是通过所谓的连接查询来完成的。基于多表的查询是通过所谓的连接查询来完成的。 例如在例如在student学生数据库中需要查找选修了汇学生数据库中需要查找选修了汇编语言课程的学生的姓名和成绩,就需要将学生编语言课程的学生的姓名和成绩,就需要将学生信息表信息表student_info、课程信息表、课程信息表course_info和成绩信息表和成绩信息表result_info三个表进行连接,才能三个表进行连接,才能得到查询结果。得到查询结果。 在在T_SQL语言中,连接查询有两大类表示形语言中,连接查询有两大类表示形式,一是符合式,一是符合

39、SQL标准连接谓词表示形式,一标准连接谓词表示形式,一是是T_SQL扩展的使用关键字扩展的使用关键字JOIN的表示形式。的表示形式。连接条件可通过以下方法定义两个表在查询中的连接条件可通过以下方法定义两个表在查询中的关联方式:关联方式: 指定每个表中要用于连接的列。典型的连接指定每个表中要用于连接的列。典型的连接条件在一个表中指定外键,在另一个表中指定与条件在一个表中指定外键,在另一个表中指定与其关联的键。其关联的键。 指定比较各列的值时要使用的逻辑运算符,指定比较各列的值时要使用的逻辑运算符,如如“=、”等。等。5.4.1连接谓词 可以在可以在SELECT语句的语句的WHERE子句中使用比较

40、运算符给出子句中使用比较运算符给出连接条件对表进行连接,对这种表示形式称为连接谓词表连接条件对表进行连接,对这种表示形式称为连接谓词表示形式。其基本格式为:示形式。其基本格式为: 连接谓词中的两个列(即字段)称为连接字段,他们必须连接谓词中的两个列(即字段)称为连接字段,他们必须是可比的,连接谓词中的比较符可以是是可比的,连接谓词中的比较符可以是、=、!=、等。当比较符为等。当比较符为“=”时,就是等值连接;若在时,就是等值连接;若在等值连接中去除结果表中相同的字段名,则为自然连接;等值连接中去除结果表中相同的字段名,则为自然连接;若有多个连接条件,则为复合条件连接。若一个表与自身若有多个连接

41、条件,则为复合条件连接。若一个表与自身进行连接,称为自连接。进行连接,称为自连接。 【例【例5-33】采用等值连接的方法,列出每个学生及其班】采用等值连接的方法,列出每个学生及其班级的详细情况。级的详细情况。 本例主要学习有关等值连接的表达式书写格式。本例主要学习有关等值连接的表达式书写格式。 SELECT student_info.*,class_info.* FROM student_info, class_info WHERE student_info.class_no= class_info.class_no【例【例5-34】采用自然连接的方法,列出每个学生及其班级的详细情况。】采用自

42、然连接的方法,列出每个学生及其班级的详细情况。 在上例中,在上例中,“class_no”学号字段有两个。如果去掉其中一个学号字段有两个。如果去掉其中一个“class_no”字段,则成为了字段,则成为了自然连接自然连接。在自然连接的条件表达式中,。在自然连接的条件表达式中,往往是将各表的主键和外键进行往往是将各表的主键和外键进行等值连接等值连接。本例主要学习有关自然连。本例主要学习有关自然连接的表达式书写格式。接的表达式书写格式。 SELECT student_id, student_name,student_sex,born_date, student_info.class_no, tele_

43、number,ru_date,address, comment,class_name,director,profession FROM student_info, class_info WHERE student_info.class_no= class_info.class_no 注意:当单个查询引用多个表时,所有列引用都必须明确。在查询所引用的两个或多个表之间,任何重复的列名都必须用表名限定。如果某个列名在查询用到的两个或多个表中不重复,则对这一列的引用不必用表名限定。但是,如果所有的列都用表名限定,则能提高查询的可读性。如果使用表的别名,则会进一步提高可读性,特别是在表名自身必须由数据库

44、和所有者名称、限定时。【例【例5-35】采用自身连接的方法,查找不同课程成绩相同的学生的学号、】采用自身连接的方法,查找不同课程成绩相同的学生的学号、课程号和成绩。课程号和成绩。 若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。本连接时需为表指定两个别名,且对所有列的引用均要用别名限定。本例主要学习有关自身连接的表达式书写格式。例主要学习有关自身连接的表达式书写格式。 SELECT a.student_id,a.course_no,b.course_no,a.res

45、ult FROM result_info a,result_info b WHERE a.result=b.result AND a.student_id=b.student_id AND a.course_nob.course_no【例【例5-36】采用复合条件连接方法,查找选修了】采用复合条件连接方法,查找选修了“汇编语汇编语言言”课程且成绩在课程且成绩在70分以上的学生学号、姓名、课程名及分以上的学生学号、姓名、课程名及成绩。成绩。本例主要学习有关复合条件连接的表达式书写格式。在本例主要学习有关复合条件连接的表达式书写格式。在“WHERE”子句中,若有多个连接条件,则称为复合条件子句中,

46、若有多个连接条件,则称为复合条件连接。在多表操作中,复合条件连接的使用最为广泛。连接。在多表操作中,复合条件连接的使用最为广泛。SELECT student_info.student_id,student_name, course_info.course_name,result_info.resultFROM student_info,course_info,result_infoWHERE student_info.student_id= result_info.student_id AND result_info.course_no=course_info.course_no AND co

47、urse_info.course_name=汇编语言汇编语言 AND result_info.result705.4.2 以JOIN关键字指定的连接T-SQL 扩展了以扩展了以JOIN关键字连接的表示方式,使表的关键字连接的表示方式,使表的连接运算能力有了增强,可以将多个表连接起来,连接运算能力有了增强,可以将多个表连接起来,FOR关关键字后面的连接格式为:键字后面的连接格式为: ON | CROSS JOIN 其中其中first_table 、 second_table为需连接的表,为需连接的表,join_type表示连接类型,表示连接类型,ON用于指定连接条件用于指定连接条件Join_ty

48、pe的格式为:的格式为:INNER| LEFT | RIGHT | FULL OUTER JOIN 其中其中INNER表示内连接,表示内连接,OUTER表示外连接,表示外连接, join_hint是连接提示。是连接提示。 CROSS JOIN表示交叉连接。因此,以表示交叉连接。因此,以JOIN关键字指关键字指定的连接有三种类型:定的连接有三种类型:1、 内连接。内连接按照内连接。内连接按照ON所指定的连接条件合并两所指定的连接条件合并两个表,返回满足条件的行。个表,返回满足条件的行。【例【例5-37】查找】查找student数据库每个学生的基本情况以数据库每个学生的基本情况以及班级情况。及班级

49、情况。SELECT * FROM student_info INNER JOIN class_infoON student_info.class_no= class_info.class_no结果表将包含结果表将包含student_info表和表和class_info表的所有字表的所有字段(重复字段为班级编号段(重复字段为班级编号class_no),若要去除重复的),若要去除重复的班级编号,可将语句改为:班级编号,可将语句改为: SELECT student_info.*,class_name,director,profession FROM student_info INNER JOIN c

50、lass_info ON student_info.class_no= class_info.class_no内连接是系统默认的,可以省略内连接是系统默认的,可以省略INNER关键字,使用内关键字,使用内连接后仍可使用连接后仍可使用WHERE子句指定条件。子句指定条件。【例【例5-38】查找选修了课程编号为】查找选修了课程编号为“2”的课程的课程且且成绩在成绩在60分以上的学生姓名和成绩。分以上的学生姓名和成绩。SELECT student_name,result FROM student_info JOIN result_info ON student_info.student_id= re

51、sult_info.student_id WHERE result_info.course_no=2 AND result_info.result60【例【例5-39】查找选修了】查找选修了“汇编语言汇编语言”课程且成绩在课程且成绩在70分以上的学分以上的学生学生学号、姓名、课程名及成绩。号、姓名、课程名及成绩。 SELECT student_info.student_id,student_name, course_info.course_name,result_info.result FROM student_info JOIN result_info ON student_info.stu

52、dent_id= result_info.student_id JOIN course_info ON result_info.course_no=course_info.course_no WHERE course_info.course_name=汇编语言汇编语言 AND result_info.result70【例【例5-40】查找不同课程成绩相同的学生的学号、】查找不同课程成绩相同的学生的学号、课程号和成绩。课程号和成绩。 SELECT a.student_id,a.course_no,b.course_no,a.result FROM result_info a JOIN resul

53、t_info b ON a.result=b.result AND a.student_id=b.student_id AND a.course_nob.course_no外联接外联接 外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外联接包括三种: 左向外联接(LEFT OUTER JOIN)或(LEFT JOIN) 结果表中除了满足连接条件的行,还包括左表中的所有行。包括第一个命名表(“左”表,出现在JOIN子句的最左边)中的所有行。不包括右表中的不匹配行。 右向外联接 (RIGHT OUTER JOIN) 或(RIGHT JOIN) 结果表中除了满足连接条件的行,还包括右

54、表中的所有行。包括第二个命名表(“右”表,出现在JOIN子句的最右边)中的所有行。不包括左表中的不匹配行。 完整外部联接 (FULL OUTER JOIN)或(FULL JOIN)结果表中除了满足连接条件的行,还包括两表中的所有行。若要通过在联接结果中包括不匹配的行保留不匹配信息,可以使用完整外部联接。SQL Server 2000提供完整外部联接运算符FULL OUTER JOIN,不管另一 个表是否有匹配的值,此运算符都包括两个表中的所有行。【例【例5-41】采用左向外联接。查找】采用左向外联接。查找200001班所有学生的班所有学生的学号、姓名及他们选修课程号,同时也列出该班没选课学号、

55、姓名及他们选修课程号,同时也列出该班没选课的学生的学号、姓名。的学生的学号、姓名。 SELECT student_info.student_id, student_name,result_info.course_no FROM student_info LEFT OUTER JOIN result_info ON student_info.student_id= result_info.student_idWHERE class_no=200001【例【例5-42】采用右向外联接。查找所有学生的学号、姓】采用右向外联接。查找所有学生的学号、姓名及他们选修课程号,同时也列出没选课的学生的学名及他

56、们选修课程号,同时也列出没选课的学生的学号、姓名。号、姓名。将上面的示例中,将将上面的示例中,将FROM子句中子句中student_info表表 和和 result_info表交换一下位置,然后使用表交换一下位置,然后使用RIGHT OUTER JOIN:SELECT student_info.student_id, student_name, result_info.course_noFROM result_info RIGHT OUTER JOIN student_infoON student_info.student_id= result_info.student_id交叉联结交叉联结在

57、这类联接的结果表内,是由第一个表的每行与第二个表的每行拼接后形成的表。交叉联接不使用WHERE子句。在数学上,就是表的笛卡儿积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。【例5-43】 列出学生所有可能的选课情况。SELECT student_id,student_name,course_no,course_name FROM student_info CROSS JOIN course_info5.5子查询子查询是一个SELECT查询,它返回单个值且嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询中。 任何允许使用表达式的地方都可以使用子查询。子查

58、询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。 子查询能够将比较复杂的查询分解为几个简单的查询,而且子查询可以嵌套,嵌套查询的过程是:首先执行内部查询,它查询出来的数据并不被显示出来,而是传递给外层语句,并作为外层语句的查询条件来使用。【例【例5-44】使用子查询来查询学生】使用子查询来查询学生“张小强张小强”所在的班级。所在的班级。 SELECT class_name FROM class_info WHERE class_no = (SELECT class_no FROM student_info WHERE student_name=张小张小强强)使用下面的连

59、接方式也能完成此功能:SELECT class_name FROM class_info JOIN student_info ON (class_info.class_no = student_info.class_no) WHERE student_name=张小强张小强 连接连接和和子查询子查询可能都要涉及两个或多个表,要可能都要涉及两个或多个表,要注意连接与子查询的注意连接与子查询的区别区别:连接可以合并两个:连接可以合并两个或多个表中数据,而带子查询的或多个表中数据,而带子查询的SELECT语句语句的结果只能来自一个表,子查询的结果是用来的结果只能来自一个表,子查询的结果是用来作为选择

60、结果数据时进行参照的。作为选择结果数据时进行参照的。 有的查询既可以使用子查询来表达,也可有的查询既可以使用子查询来表达,也可以使用连接表达,例如上面的例子。通常使用以使用连接表达,例如上面的例子。通常使用子查询表示时可以将一个复杂的查询分解为一子查询表示时可以将一个复杂的查询分解为一系列的逻辑步骤,条理清晰,而使用连接表示系列的逻辑步骤,条理清晰,而使用连接表示有执行速度快的优点。具体使用哪一种要根据有执行速度快的优点。具体使用哪一种要根据具体情况而定。具体情况而定。可以在许多地方指定子查询。例如: 使用别名时。 使用IN或NOT IN时。 在UPDATE、DELETE和INSERT语句中。

温馨提示

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

评论

0/150

提交评论