浅谈 《SQL Server数据库》教学中的连接查询和嵌套查询
2015-06-26向冲陈诚
文/向冲 陈诚
1.引言
SQL语言是目前数据库领域中非常实用、流行的主流语言。SQL是Structure Query Language的英文缩写,意思是结构化查询语言。包括:数据查询 (SQL)、数据操纵 (DML)、数据定义 (DDL)和数据控制 (DCL)等功能于一体。数据查询是数据库的核心内容,也是我们最常用的操作。数据查询是通过SQL语句来实现的,利用SQL语句可以从数据库中查询出我们所需要的各种数据。[1]
数据查询分为单表查询和多表查询。单表查询是对一个表的查询,因为比较简单,这里不再说明。多表查询是对多个表,将分布在不同表中的数据根据需要进行查询。多表查询可以通过连接查询和嵌套查询来实现。[2]下面以学生管理数据库为例,介绍以上两种查询。其中学生表和成绩表的关系模式如下:学生 (学号,姓名,性别,出生日期,籍贯,班级代码);成绩 (学号,课程号,成绩)。
1.1 什么是连接查询
1.1.1 定义。根据各个表之间的逻辑关系从两个或多个表中查询数据。如:查询学生的学号、姓名、课程名称和成绩,涉及到的数据表有学生、课程和成绩。
1.2 连接查询的分类
1.2.1 内连接。内连接 (inner join)是一种最常用的连接类型。内连接是一种任意条件的查询,如果两个表的相关字段满足连接条件,就从这两个表中提取数据并组合成新的记录,也就是在内连接查询中,只有满足条件的元组才能出现在结果关系中。[3]
例如:要查询每个已经选课的学生的情况,查询语句为:
SELECT*FROM学生INNER JOIN成绩ON学生.学号=成绩.学号
连接查询根据比较方式分为:
1.2.1.1 等值连接:使用等号 (=)运算符比较被连接的列的列值,称为等值连接。
1.2.1.2 不等连接:使用除等于运算符以外的其它比较运算符比较被连接的列的列值,称为不等连接。包括>、>=、<=、<、!>、!<和<>等运算符。
1.2.1.3 自然连接:使用等于 (=)运算符比较被连接列的列值,但删除连接表中的重复列,称为自然连接。它属于等值连接的一种特殊情况。
1.2.2 外连接。外连接是指将不满足限制条件的表中的数据也显示在最终结果中。
根据限制表的不同,外连接分为三种情况:
1.2.2.1 左外连接 (LEFTOUTER JOIN)
左外连接是限制连接条件右边的表中的数据必须满足连接条件,而不关左边的表中的数据是否满足连接条件,均输出左边表中的内容。
例如:要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为:
SELECT学生.学号,姓名,班级代码,课程号,成绩
FROM学生LEFT OUTER JOIN成绩ON学生.学号=成绩.学号
左外连接查询中左边表中的所有元组的信息都得到了保留。
1.2.2.2 右外连接 (RIGHTOUTERJOIN)。右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出表中的内容。
例如:同上例内容,查询语句为
SELECT学生.学号,姓名,班级代码,课程号,成绩
FROM学生RIGHTOUTERJOIN成绩ON学生.学号=成绩.学号
右外连接查询中右边表中的所有元组的信息都得到了保留。
1.2.2.3 全外连接 (FULL OUTER JOIN)。全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。
例如:同左外连接例子内容,查询语句为:
SELECT学生.学号,姓名,班级代码,课程号,成绩
FROM学生FULL OUTER JOIN成绩ON学生.学号=成绩.学号
全外连接查询中所有表中的元组信息都得到了保留。
1.2.3 自连接。在同一个表内进行自身连接,这种查询称为自连接查询,自连接必须为表指定两个别名。
例如:要求检索出和刘鑫同班同学的信息,查询语句为:
SELECT学生.*FROM学生JOIN学生AS学1 ON学生.班级代码=学生1.班级代码
WHERE学生1.姓名=‘刘鑫’and学生1.学号<>学生.学号
1.2.4 交叉连接。交叉连接即笛卡儿乘积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。
例如:如果希望得到学生和成绩两个关系模式的乘积,查询语句为:
2.SELECT*FROM学生CROSS JOIN成绩
2.1 什么是嵌套查询
2.1.1 定义。嵌套查询是指在一个SELECT语句的WHERE子句中嵌套另一条SELECT语句的查询,又称为子查询。
2.2 嵌套查询的分类
2.2.1 无关子查询。无关子查询的执行不依赖于外部嵌套。查询的执行过程为:首先执行子查询,子查询得到的结果作为外部查询的条件使用,然后执行外部查询。通常使用比较运算符或[NOT]IN关键字。
2.2.1.1 返回一个值的子查询。子查询的返回值只有一个时,可以使用比较运算符如=、<、>、>=、<=、!=等将父查询和子查询连接起来。
例如:要求检索出和刘鑫同班同学的信息,查询语句为:
SELECT*FROM学生WHERE班级代码=(SELECT班级代码FROM学生 WHERE姓名=’刘鑫’)AND姓名<>’刘鑫’
2.2.1.2 返回一组值的子查询。子查询的返回值不止一个,而是一个集合时,可以在比较运算符和子查询之间插入ANY、SOME或ALL关键字。其中等值关系可以使用IN关键字。
例如:查询成绩高于选修了“计算机基础”课程平均成绩的学生的学号和姓名。
SELECT 学生.学号,学生.姓名FROM 成绩JOIN 学生ON 学生.学号=成绩.学号
JOIN课程 ON成绩.课程号=课程.课程号WHERE课程名= '计算机基础'AND
成绩 >ANY(SELECT avg(成绩)FROM成绩,课程WHERE 成绩.课程号=课程.课程号and课程名=‘计算机基础’)
2.2.2 相关子查询。相关子查询是指在子查询中,子查询的查询条件中引用了外层查询表中的值。执行时先执行外部查询语句,然后根据外部查询返回的结果执行内部查询语句。通常使用[NOT]EXISTS关键字。
例如:查询没有学习任何课程的学生的学号和姓名。
SELECT学号,姓名FROM学生WHERE NOT EXISTS(SELECT*FROM成绩WHERE成绩.学号=学生.学号)
3.连接查询和嵌套查询对比分析
从“要求检索出和刘鑫同班同学的信息”这个例子中我们可以看到,使用连接查询和嵌套查询实现该查询的结果完全相同。由此我们可以得出这样一个结论:连接查询和嵌套查询之间有时是可以相互替换的,但不是所有情况下都可以互换。下面将分别介绍连接查询和嵌套查询的优劣。
3.1 连接查询的优势和劣势。连接查询使用简单,但因为在各表连接的同时对所有的条件综合查询,所以不易发现错误,一旦出错,纠错也比较麻烦。另外,连接查询实际上是将所有表根据条件先合并成一个表。因此在数据量很大的情况下,对计算机系统的要求较高,需占用更多的系统资源。
3.2 嵌套查询的优势和劣势。嵌套查询是用户必须清楚每一个子查询的结果及各表之间的逻辑关系,对用户要求较高。但嵌套查询是逐步求解,需要的计算机系统开销较小。
3.3 怎样合理运用连接查询和嵌套查询。综上可以看出,连接查询和嵌套查询各自有其优势和劣势,在实际查询过程中到底采用哪种查询方式,因根据使用习惯及对两种查询方式的熟练程度确定,也可以混合使用。
4.总结
综上所述,查询的优化必须符合以下条件:满足查询需求的同时提高查询速度,并能减少计算机系统开销为原则。熟练掌握SQL查询功能及技巧是基础,另外了解每种查询的优劣才能更好的选择合适的查询方式。笔者首先介绍了连接查询和嵌套查询的定义和分类,然后通过两者的对比分析,比较了两者的优势和劣势,总结出实际使用过程中可根据自身的实际需求和使用习惯选择合适的查询方式。
[1]王良元,SQ连接、嵌套与混合查询 [J],电脑学习,2005
[2]张文雯,SQ嵌套查询 [J],信息技术,2011
[3]雷琳,SQL查询语句优化的研究[J],武汉船舶职业技术学院,2011