高级查询概念。
在掌握查询的基础知识后,您就可以探知查询解决方案中使用的下列高级查询概念:
在选择列表中使用聚合函数。
使用 group by 对多行分组。
使用 union 组合结果。
子查询基础知识。
使用 case 处理条件数据。
并行查询。汇总数据
在选择列表中使用聚合函数。
聚合函数(例如 sum、**g、count、count(*)max 和 min)在查询结果集中生成汇总值。聚合函数(除 count(*)以外)处理单个列中全部所选的值以生成一个结果值。聚合函数可以应用于表中的所有行、where 子句指定的表的子集或表中一组或多组行。
应用聚合函数后,每组行都将生成一个值。
下面的示例计算 titles 表中所有书籍的本年度截止到目前的销售总额:
use pubs
select sum(ytd_sales)
from titles
下面是结果集:
1 row(s) affected)
使用下面的查询,若将**乘以二,可以得到所有书籍的平均**:
use pubs
select **g(price * 2)
from titles
下面是结果集:
1 row(s) affected)
下表显示了聚合函数的语法及结果(expression 几乎总为列名)。
sum、**g、count、max 和 min 忽略空值,而 count(*)不忽略。
可选关键字 distinct 可以与 sum、**g 和 count 一同使用,以便在应用聚合函数之前消除重复值(默认为 all)。sum([all | distinct] expression)
sum 和 **g 只能对数字列使用,例如 int、smallint、tinyint、decimal、numeric、float、real、money 和 smallmoney 数据类型。min 和 max 不能对 bit 数据类型使用。除 count(*)外,其它聚合函数均不能对 text 和 image 数据类型使用。
除了上述例外情况,聚合函数可以对任何类型的列使用。例如,在 character 数据类型列中,使用 min(最小值)查找最低值(即最接近字母表开头的值):
use pubs
select min(au_lname)
from authors
下面是结果集:
bennet
1 row(s) affected)
聚合函数返回的结果类型的精度可能比输入的类型要高,从而使结果类型大得足以容纳聚合后的结果值。例如,sum 或 **g 函数在输入的数据类型为 smallint 或 tinyint 时返回一个 int 值。有关聚合函数返回的数据类型的更多信息,请参见 microsoft sql server 2000 transact-sql 参考中有关该函数的主题。
说明对于涉及字符列上的 min 或 max 的语句,其输出结果取决于在安装过程中选择的排序规则。有关不同排序规则的效果的更多信息,请参见 sql server 排序规则基础知识。
如果某个选择列表中使用了聚合函数,则该选择列表只能包含:
聚合函数。通过 group by 子句分组的列。
为结果集中每一行返回同一值(例如一个常量)的表达式。
有关为包含多个行的结果集生成聚合值的更多信息,请参见使用 group by 分组多行。
where 子句中不能使用聚合函数。但是,在其选择列表中包含聚合函数的 select 语句经常包括 where 子句,该子句限制要应用聚合函数的行。如果 select 语句中包含 where 子句(但不包含 group by 子句),那么聚合函数将为 where 子句指定的行的子集产生一个值。
不论聚合函数是应用于表中的所有行还是 where 子句定义的行的子集,都会产生该值。这类函数可称为标量聚合。
以下查询只返回商务书籍的预付款平均值和 year-to-date 的销售额总和:
use pubs
select **g(advance), sum(ytd_sales)
from titles
where type = business'
下面是结果集:
1 row(s) affected)
可以在同一个选择列表中使用多个聚合函数,即在一个 select 语句中产生多个标量聚合。
count(*)函数不需要 expression 参数,因为该函数不使用有关任何特定列的信息。该函数计算符合查询限制条件的总行数。count(*)函数返回符合查询中指定的搜索条件的行的数目,而不消除重复值。
它对每行分别进行计数,包括含有空值的行。以下查询查找 titles 中的书籍总数:
use pubs
select count(*)
from titles
下面是结果集:
1 row(s) affected)
count(*)可以与其它聚合函数组合使用。以下查询显示与 **g 函数组合使用的 count(*)其中两个聚合函数都只聚合满足 where 子句搜索条件的行中的数据:
use pubs
select count(*)**g(price)
from titles
where advance > 1000
下面是结果集:
1 row(s) affected)
distinct 是 sum、**g 和 count 的可选关键字。如果使用 distinct,那么在计算总和、平均值或计数之前,先消除重复的值。
如果使用 distinct 关键字,表达式必须只包含列名。而不能包含算术表达式。
以下查询返回商务书籍的平均**(不包括重复的值):
use pubs
select **g(distinct price)
from titles
where type = business'
下面是结果集:
1 row(s) affected)
如果不使用 distinct 关键字,则 **g 函数将计算出所有商务书名的平均**:
use pubs
select **g(price)
from titles
where type = business
下面是结果集:
1 row(s) affected)
运行聚合函数时,列中的空值将被忽略。例如,titles 表中预付款的计数与书名的计数不同,因为 advance 列中的空值不计算在内。
use pubs
select count(advance)
from titles
下面是结果集:
1 row(s) affected)
use pubs
select count(title)
from titles
下面是结果集:
1 row(s) affected)
如果没有符合 where 子句中指定的条件的行,那么 count 函数返回的值为零。其它函数均返回 null。count(*)函数对每一行进行计数,即使所有的列值都为 null。
下面是一些示例:
use pubs
select count(distinct title)
from titles
where type = poetry'
下面是结果集:
1 row(s) affected)
use pubs
select **g(advance)
from titles
where type = poetry'
下面是结果集:
null)1 row(s) affected)
使用 group by 分组多行。
group by 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 group by 子句,则只为 select 语句报告一个聚合值。
以下示例返回分类 2 中每种产品已销售的单位数量:
use northwind
select as prodid,sum( as amountsold
from [order details] as ordd join products as prd
on = and = 2
group by
下面是结果集:
prodid amountsold
SQL高级查询
sql server t sql 1 基本常用查询 3 select 3 all 查询所有 3 distinct 过滤重复 3 count 统计 3 top 取前n条记录 3 alias column name 列重命名 3 alias table name 表重命名 3 column 列运算 3 ...
SQL高级查询语句
交互式sql语句。1.1 创建数据库 unis db 日期 及其基本表 学生 课程 选课 1 建立一个 学生 表student,它由学号sno 姓名sname 性别ssex 年龄sage 所在系sdept五个属性组成,其中学号为主属性,ssex默认为 男 年龄大于0。2 建立 课程 表course,...
SQL 06高级查询
练习6复杂的结构化查询语句。6 1上机目的。1 掌握select语句的统计函数的作用和使用方法。2 通过练习select语句的group by和order by字句的用法,理解其作用,掌握语句的写法。3 通过练习涉及多张表的连接查询,掌握它的作用和写法。6 2上机练习预备知识点。6 2 1汇总函数。...