多表查询
前面介绍的都是从一张表上查询数据,更多的情况是从多张表中查询数据。例如一个数据库包含学生基本信息表和学生成绩信息表,若要得知道学生的基本信息和成绩,那就必须进行多表查询
SQL Server提供了实现多表查询的方法――连接查询。所谓连接查询是将多个表通过某个或某些列为条件进行连接,从中检索出关联数据。连接有两种语法形式:
1.ANSI连接语法形式
SELECT column_list
FROM { table_name1 [ join_type ]
JOIN table_name2 ON connection_condition}[,…n]
WHERE search_condition
2.SQL Server连接语法形式
SELECT column_list
FROM table_name1[,…n]
WHERE { search_condition
AND | OR connection_condition}[,…n]
•connection_condition:连接条件;
•join_type:连接类型,包括,内连接、外连接、交叉连接等;
(1)内连接(Inner Join)
内连接是多个表通过连接条件中共享列的值进行的比较连接。当未指明连接类型时,默认为内连接。内连接值显示两个表中所有匹配数据的行。

(2)外连接(Outer Join)
外连接显示一个表中所有的行和另外一个表中的任何匹配的行。

•左外连接(LEFT OUER JOIN)
左外连接即在连接两表时,不管右表中是否有匹配数据,结果将保留左表中的所有行。
•右外连接(RIGHT OUTER JOIN)
右外连接与左外连接相反在连接两表时,不管左表中是否有匹配数据,结果将保留右表中的所有行。
(3)交叉连接(CROSS JOIN)
两个表之间的交叉连接,是用左表中的每一行与右表中的每一行进行连接。因此,结果集中的行数是左表的行数乘以右表的行数,该乘积也称为“笛卡儿乘积”。交叉连接使用关键字CROSS JOIN。
分组和汇总
1.聚合函数的使用
聚合函数可以返回一列、几列或全部列的汇总数据,用于计数或寻找某列的平均值。这类函数仅作用于数值型列,并且在列上使用聚合函数时,不考虑NULL值。

2.分组汇总子句的使用
当需要显示分组的汇总数据时,就应使用GROUP BY子句。该子句的功能是根据指定的列将表中数据分成多个组后进行汇总。其语法格式为:
SELECT column_name1[,…n]
FROM table_name
WHERE search_condition
GROUP BY [ ALL ]colum_name1[,…n]
[ HAVING search_condition ]
•使用GROUPBY子句为每一个组产生一个汇总结果,每个组只返回一行,不返回详细信息。
•SELECT子句中指定的列必须是GROUPBY子句中指定的列,或者是和聚合函数一起使用。
•如果包含WHERE子句,则只对满足WHERE条件的行进行分组汇总。
•如果GROUPBY子句使用关键字ALL,则WHERE子句将不起作用。
•HAVING子句可进一步排除不满足条件的组
•当同时存在GROUPBY子句、HAVING子句和WHERE子句时,其执行顺序为:先WHERE子句,后GROUP BY子句,再HAVING子句。即先用WHERE子句过滤不符合条件的数据记录,接着用GROUPBY子句对余下的数据记录按指定列分组、汇总,最后再用HAVING子句排除不符合条件的组。
3.明细汇总子句的使用
使用GROUPBY对查询出来的数据作分类汇总后,只能显示统计结果,看不到详细的数据。使用COMPUTE和COMPUTE BY子句既能浏览详细数据又可看到统计的结果。其语法形式:
COMPUTE affregate_function(column_name)[,…n]
[ BY column_name [,…n] ]
其中:affregate_function表示聚合函数。
•COMPUTE[BY]子句不能与SELECTINTO子句一起使用。
•COMPUTE子句中的列必须出现在SELECT子句的列表中。
•COMPUTEBY表示按指定的列进行明细汇总,使用BY关键字时必须同时使用ORDER BY子句,并且COMPUTE BY后出现的列必须具有与ORDER BY后出现的列相同的顺序,且不能跳过其中的列。例如:如果ORDER BY子句按照如下顺序指定排序列:ORDER BY CategoryID,Price,Stocks。则COMPUTE BY后的列表只能是下面任一种形式:
BY CategoryID,Price,Stocks
BY CategoryID,Price
BY CategoryID
嵌套查询
所谓嵌套查询指的是在一个SELECT查询内再嵌入一个SELECT查询。外层的SELECT语句叫外部查询,内层的SELECT语句叫子查询。
使用子查询时需注意:
•子查询可以嵌套多层。
•子查询需用圆括号()括起来。
•子查询中不能使用COMPUTE[ BY ]和INTO子句。
•子查询的SELECT语句中不能使用image、text或ntext数据类型
合并数据集
在SELECT语句中,使用UNION子句可以把两个或多个SELECT语句查询的结果组合成一个结果集。语法形式:
SELECT_statement1
UNION [ALL] SELECT_statement2

