实验五 连接查询、嵌套查询与联合查询 实验指导.doc
文本预览下载声明
实验五 连接查询、嵌套查询与联合查询 实验指导
一、连接查询
前面的查询都是在单个表中进行的查询。在数据库的实际编程应用中,往往需要查询许多数据,有可能这些数据出现在两个或两个以上的表中,而我们希望这些数据出现在一个结果集中,这就要用到连接查询。在SQL Server中,可以使用两种语法形式:一种是ANSI连接语法形式,连接写在FROM子句中,使用JOIN…ON关键字。另一种是早期SQL SERVER连接语法形式,连接写在WHERE子句中。在SQL SERER中可以设定兼容级别为80及以下(在对象资源管理器中展开相应的数据库,右击,选择“属性”,在弹出的“数据库属性”对话框中选择“选项”,有兼容级别设置)才能使用这种形式。在SQLServer2008中推荐使用ANSI形式的连接。两种连接的语法格式如下。
SQL Server连接的语法格式:
SELECT 查询列表
FROM 表1,表2
WHERE 表1.列1 比较运算符 表2.列2
其中比较运算符可以是:=、、、=、=、等。
说明:
连接的列(属性)名可不相同,但数据类型必须兼容。
当比较运算符是“=”时,称等值连接,否则为非等值连接。
ANSI连接的语法形式如下:
SELECT 表名.列名[,…n]
FROM {表名1 [连接类型] JOIN表名2 ON 连接条件} [,…n]
WHERE 查询条件
连接查询包括以下几种类型。
1. 内连接
从两个或两个以上的表的组合中,挑选出符合连接条件的数据。如果数据无法满足连接条件,则将其丢弃。通常称这种方法为内部连接INNER JOIN。在内部连接中,参与连接的表的地位是平等的。它有两种形式:等值连接和自然连接。等值连接会产生冗余列,因为它将连接条件中的共享列显示两次。而自然连接则清除了等值连接产生的冗余列,因此我们所说的内连接在没有特殊说明时都指的是自然连接。
例1 查询所有学生的选课信息(包含学号、姓名、课程编号)。
用SQL Server形式进行连接:
SELECT student.sno,sname,cno
FROM student,sc
WHERE student.sno=sc.sno
用ANSI形式进行连接:
SELECT student.sno,sname,cno
FROM student INNER JOIN sc ON student.sno=sc.sno
2. 外连接
在使用内连接查询时,只包含两表中都满足连接条件的行,而外连接会把某些不满足条件的行显示出来。在外部连接中,参与连接的表有主从之分。以主表的每行数据去匹配从表的数据列,符合连接条件的数据将直接返回到结果集中。对那些不符合连接条件的列将被填上NULL值后再返回到结果集中。对BIT类型的列,由于BIT数据类型不允许NULL值,因此将会被填上0值再返回到结果中。
外部连接分为左外连接LEFT OUTER JOIN、右外连接RIGHT OUTER JOIN和全连接三种。以主表所在的方向区分外部连接。
(1)左外连接。左外连接指主表在左边,即在连接两表时,保留左表中的不匹配行,右表的相应行用NULL或0值。
例2 查询每个学生及其选修课程的情况包括没有选修课程的学生。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)
(2)右外连接。右外连接指主表在右边,即在连接两表时,保留右表中的不匹配行,左表的相应行用NULL或0值。
(3)全连接。在连接两表时,保留两表中的不匹配行。全连接的语法只有ANSI形式一种,使用FULL OUTER JOIN关键字。全连接生成的结果记录集将会很多。一般不大使用,就不举例了。
3. 无限制连接
也称为交叉连接,它可能会产生一个庞大的结果集,因为其中包含了所连接的表中所有行的全部组合。如在某连接中,一个表的记录数是5,另一个表的记录数是6,那么结果集就有5*6(30)条记录。交叉连接在ANSI形式中使用CROSS JOIN 关键字。
4. 自身连接
连接除了可以在多个不同的表中进行外,也可以在同一个表中进行连接,即自身连接。自身连接可以看作一张表的两个副本之间进行的连接。在自连接中,必须为表指定两个别名,使之在逻辑上成为两张表。
例3 查询每一门课的间接先修课(即先修课的先修课)。
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST INNER JOIN Course SECOND ON FIRST.Cpno=SECOND.Cno
二、嵌套查询
子查询指在一个外层查询中包含另一个内层查询,即在一个SELECT语句中的WHERE子句
显示全部