内容正文:
SOLServer 2002
picatos
Deveoper
SaL server 2005-
Busness
Infomation Profesioal
Worke
第11章 T-SQL高级查询
__________________
SQLServer2005
第1章二TS0L高级查询
·11.1多表查询
·11.2连接
·11.3使用统计函数
·11.4使用GROUP BY子句进行分类汇总
·11.5使用COMPUTE和COMPUTE BY子句
·11.6使用嵌套的子查询
SQLServer 2005
11.1
多表查询
1多表查询和笛卡儿乘积
前面讨论的查询,大多还局限在一张表内。但在更多的情况下,需要对多张
表中的数据同时进行查询。多表查询就是在FROM子句中出现多张表的情形
下面的$QL语句实现同时对两张表进行的查询:
USE JWGL
GO
SELECT name,grade
FROM student,result
这个查询的目的是查询每个学生的成绩,查询结果如下:
。
陈红85
陈红75
陈红65
陈红45
SQLServer 2005
11.1多表查询
●●●●●
李凡
60
李凡
75
李凡
99
(所影响的行数为234行)
这个查询一共返回了234个结果,显然,这是不正确的。问题
出在对表连接条件的限制上。在上面的例子中,没有对表连
接条件作任何限制,所以SQL Server在student表中每取出
一条数据,就从result:表中取出一条数据与前者组合成一条
记录。在student中有9条记录,在result表中有26条记录,
所以,一共返回了234条记录。
SQLServer 2005
11.1
多表查询
这种情况在数据库理论中被称为笛卡儿乘积。
笛卡儿乘积返回的结果在大多数情况下是冗余、无
用的,所以应该采取措施避免笛卡儿乘积的出现。
。
没有WHERE子句的连接将产生连接所涉及的表的
笛卡尔积。
第一个表的行数乘以第二个表的行数等于笛卡尔积
结果集的大小。
通过包含一条WHERE子句来给出查询连接条件,就可
以有效避免出现笛卡儿乘积。
SQLServer 2005
11.1
多表查询
【例11.1】还是利用上述同一个例子,查询每个学生的成绩,
为了实现查询目标,应该使用WERE子句来给出查询连接条
件,实现查询。
SELECT name,course id,grade
FROM student,result
WHERE student.student id-result.student id
这时,返回了26条记录,查询结果是正确的。
般说来,为了有效避免笛卡儿乘积的出现,对所定义的查询
连接条件的数目是有规定的:如果有N个表出现在FROM的后
面,那么,所定义的连接条件不得少于N-1个。
SQLServer2005
11.1多表查询
2使用表的别名
·在S9L语言中,允许对表使用别名,所以,可以用更简便明了的方法来书写上
面的查询语句。
·如11.1的例子可以改写为:
SELECT name,course_id,grade
FROM student s,result r
WHERE s.student_id=。student_id
·也可以按照ANSI92标准使用AS关键字来使用别名,如上面的查询可以更改
为:
SELECT name,course_id,grade
FROM student as s,result as r
WHERE s.student_id=。student_id
·使用表的别名时,首先应在SELECT查询语句的FROM子句中指定表的别名。
SQLServer 2005
11.1
多表查询
3
使用联合运算UNION子句
如果有多个不同的查询结果数据集,但又希望将它们连接在一起,组成一组
数据。
·这组数据是这多个结果集的逻辑联合。在这种情况下,可以使用UNION子句
它将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中
的所有查询的全部行。
●
使用UNION组合两个查询的结果集的两个基本规则是:所有查询中的列
数和列的顺序必须相同,并且数据类型必须兼容。
所谓兼容就是各列的数据类型不必精确地进行匹配,服务器会自动地实现
不同长度字符串的转换,也可以在不同类型的数值之间实现相互转换。但
是,服务器不会把数值转换为字符串,也不会把日期类型转换为数值类型。
SQLServer 2005
11.1
多表查询
3
使用联合运算UNION子句
【例ll.2】使用UNION语句联合对学生表(Student)和教师表(Teacher)
的查询,列出学生和教师的姓名和出生日期。
SELECT name,birthday
FROM student