sql 学习之 group by 及 聚合函数
时间:2018-12-22 13:12 来源:linux.it.net.cn 作者:IT
1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列。同样,如果在SELECT 列表中使用聚合列,SELECT列表必须只包括聚合列,否则必须有一个GROUP BY 子句。例如:
select customerid,salespersonid,count(*)
from sales.salesorderheader
where customerid <= 11010
group by customerid,salespersonid
order by customerid,salespersonid
2.聚合函数。聚合函数用于GROUP BY 字句,用于聚合分组的数据。聚合函数在和GROUP BY子句一起使用时显示出其强大的功能。但聚合函数的使用不限于分组查询;如果查询语句中使用了聚合函数,而没使用GROUP BY子句,则聚合函数是用于聚合整个结果集(匹配WHERE子句的所有行)。当不使用GROUP BY 子句时,在SELECT列表中某些聚合函数只能与其他的聚合函数一起使用,即聚合函数必须使用GROUP BY 子句才能在SELECT列表中与列明配对。例如,不使用GROUP BY子句,SELECT列表中AVG只能和SUM对应,但不能对应特定列。
3.AVG
AVG函数用于计算平均值。
For example:
select salesorderid,avg(orderqty) as orderqtyavg
from sales.salesorderdetail
where salesorderid in (43660,43670,43672)
group by salesorderid
4.MIN/MAX
顾名思义,MIN/MAX用于计算所选择列分组的最小值与最大值。
For example:
select salesorderid,min(orderqty) as orderqtyavg
from sales.salesorderdetail
where salesorderid in (43660,43670,43672)
group by salesorderid
在将查询改为Max函数,For example:
select salesorderid,max(orderqty) as orderqtyavg
from sales.salesorderdetail
where salesorderid in (43660,43670,43672)
group by salesorderid
5.除了Count(*)函数外,所有的聚合函数都忽略NULL值。要考虑到这一点对聚合结果的重要影响。许多用户在求平均值时,把数值类型字段中的NULL值看作0,但实际上NULL值与0并不等同,并不能这样使用。如果对有NULL值的列执行AVG函数或其他聚合函数,NULL值将不会计入聚合值中,除非使用如COALESCE()或ISNULL()等函数,将NULL值转换成非NULL值。
Count函数可与GROUP BY 字句联合使用。
6.使用Having子句给分组设置条件
如果要将查询条件放到分组之后,则可以使用Having子句。
Having 子句仅用于带有GROUP BY 子句的查询语句中。WHERE子句应用于每一行(在变成一组的某一部分之前),而HAVING子句应用于分组的聚合值。
7.Distinct和All
可以在任意聚合函数中使用Distinct谓词,即使聚合函数中使用Distinct谓词没有实际意义。例如,在AVG函数中使用Distinct没有任何意义。
很少在查询语句中使用All谓词,毫无疑问,All与Distinct谓词含义相反。Distinct谓词用于过滤掉重复的行,而All指包括所有的行。All是任意Select语句的默认值,但有Union的Select语句除外。
8.Insert。Insert需要注意的是插入数据时候的格式问题。插入数值不需要使用引号,而插入字符数据时要使用引号。但插入date数据类型时需要使用引号(实际上,其作为字符串输入,然后再转换成日期)。
多行插入:多行插入要用逗号分隔,例如:
INSERT INTO Sales
(StoreCode, OrderNumber, OrderDate, Quantity, Terms, TitleID)
VALUES
('TST2', 'TESTORDER2', '01/01/1999', 10, 'NET 30', 1234567),
('TST2', 'TESTORDER3', '02/01/1999', 10, 'NET 30', 1234567);
这样可以使用一条插入语句插入2条数据。
9.INSERT INTO ......SELECT 语句
语法结构:INSERT INTO <table name>
[<column list>]
<SELECT statement>
(责任编辑:IT)
1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列。同样,如果在SELECT 列表中使用聚合列,SELECT列表必须只包括聚合列,否则必须有一个GROUP BY 子句。例如: select customerid,salespersonid,count(*) from sales.salesorderheader where customerid <= 11010 group by customerid,salespersonid order by customerid,salespersonid 2.聚合函数。聚合函数用于GROUP BY 字句,用于聚合分组的数据。聚合函数在和GROUP BY子句一起使用时显示出其强大的功能。但聚合函数的使用不限于分组查询;如果查询语句中使用了聚合函数,而没使用GROUP BY子句,则聚合函数是用于聚合整个结果集(匹配WHERE子句的所有行)。当不使用GROUP BY 子句时,在SELECT列表中某些聚合函数只能与其他的聚合函数一起使用,即聚合函数必须使用GROUP BY 子句才能在SELECT列表中与列明配对。例如,不使用GROUP BY子句,SELECT列表中AVG只能和SUM对应,但不能对应特定列。 3.AVG AVG函数用于计算平均值。 For example: select salesorderid,avg(orderqty) as orderqtyavg from sales.salesorderdetail where salesorderid in (43660,43670,43672) group by salesorderid 4.MIN/MAX 顾名思义,MIN/MAX用于计算所选择列分组的最小值与最大值。 For example: select salesorderid,min(orderqty) as orderqtyavg from sales.salesorderdetail where salesorderid in (43660,43670,43672) group by salesorderid 在将查询改为Max函数,For example: select salesorderid,max(orderqty) as orderqtyavg from sales.salesorderdetail where salesorderid in (43660,43670,43672) group by salesorderid 5.除了Count(*)函数外,所有的聚合函数都忽略NULL值。要考虑到这一点对聚合结果的重要影响。许多用户在求平均值时,把数值类型字段中的NULL值看作0,但实际上NULL值与0并不等同,并不能这样使用。如果对有NULL值的列执行AVG函数或其他聚合函数,NULL值将不会计入聚合值中,除非使用如COALESCE()或ISNULL()等函数,将NULL值转换成非NULL值。 Count函数可与GROUP BY 字句联合使用。 6.使用Having子句给分组设置条件 如果要将查询条件放到分组之后,则可以使用Having子句。 Having 子句仅用于带有GROUP BY 子句的查询语句中。WHERE子句应用于每一行(在变成一组的某一部分之前),而HAVING子句应用于分组的聚合值。 7.Distinct和All 可以在任意聚合函数中使用Distinct谓词,即使聚合函数中使用Distinct谓词没有实际意义。例如,在AVG函数中使用Distinct没有任何意义。 很少在查询语句中使用All谓词,毫无疑问,All与Distinct谓词含义相反。Distinct谓词用于过滤掉重复的行,而All指包括所有的行。All是任意Select语句的默认值,但有Union的Select语句除外。 8.Insert。Insert需要注意的是插入数据时候的格式问题。插入数值不需要使用引号,而插入字符数据时要使用引号。但插入date数据类型时需要使用引号(实际上,其作为字符串输入,然后再转换成日期)。 多行插入:多行插入要用逗号分隔,例如: INSERT INTO Sales (StoreCode, OrderNumber, OrderDate, Quantity, Terms, TitleID) VALUES ('TST2', 'TESTORDER2', '01/01/1999', 10, 'NET 30', 1234567), ('TST2', 'TESTORDER3', '02/01/1999', 10, 'NET 30', 1234567); 这样可以使用一条插入语句插入2条数据。 9.INSERT INTO ......SELECT 语句 语法结构:INSERT INTO <table name> [<column list>] <SELECT statement> (责任编辑:IT) |