SQL 学习笔记:高级查询语句

注:这篇文章中将使用下表进行举例说明。

表名:sales
列名:id, name, amount

1. 限制查询记录的条数

SQL 中默认会将所有查询到的结果都一一列出。当我们不需要输出全部的查询结果时,例如只想输出其中的前n条记录,这时就可以使用 TOP 子句来实现。

语法:

SELECT TOP n <列名> FROM <表名> [...];

示例:

SELECT TOP 5 name FROM sales_table;

除了指定具体的记录条数之外,还可以指定输出记录占总记录数的百分比。

语法:

SELECT TOP n PERCENT <列名> FROM <表名> [...];

示例:

SELECT TOP 20 PERCENT name, amount FROM sales_table;

在SQLite中,不支持 TOP 子句。不过它的 LIMIT 子句同样提供了这一功能,与 OFFSET 搭配则更加强大。

语法:

SELECT <列名> FROM <表名> [...] LIMIT n;

sales_table 中选择前10条记录

SELECT * FROM sales_table LIMIT 10;

从第5条记录(偏移量为4)开始,选择10条记录

SELECT * FROM sales_table LIMIT 10 OFFSET 4;

2. 使用聚集函数

SQL提供了若干聚集函数(Aggregate Functions),进一步增强了检索功能。

  • COUNT: 统计表中元组个数
  • SUM : 计算某列值的总和
  • AVG : 计算某列值的平均
  • MAX : 求出某列的最大值
  • MIN : 求出某列的最小值

上述聚集函数都可作用于某一列,语法也基本一致。

语法:

函数名([DISTINCT|ALL] <列名>)

此外,COUNT函数还可作用于所有列的查询结果

语法:

COUNT([DISTINCT|ALL] *)

说明:
括号内的DISTINCT表示消除重复的记录后再进行计算,ALL则保留所有值。
如未指定该关键字,则默认为ALL。

查询共有多少笔交易记录

SELECT COUNT(ID) FROM sales_table;

查询所有商品出售的总量

SELECT SUM(amount) FROM sales_table;

查询单价最高的商品记录

SELECT MAX(price) FROM sales_table;

查询所有交易记录涉及的商品种类数目(需消除重复记录)

SELECT COUNT(DISTINCT name) FROM sales_table;

3. 对查询结果分组

在对数据进行统计时,有时并不是针对全表进行计算,而是针对某些具有相同值的记录进行计算。
在这种情况下,我们可以使用 GROUP BY 子句将查询结果按单列或多列的值进行分组,值相等的记录为一组。

语法:

GROUP BY <列名> [, <列名> ...]

查询每件商品的销售总量

SELECT SUM(amount) FROM sales_table GROUP BY name;

该语句会将记录按商品名 name 进行分组,然后对具有相同商品名的记录计算amount字段的总和,最后得到每件商品的销售总量。

按价格对查询结果进行分组

SELECT * FROM sales_table GROUP BY price;

4. 对分组进行过滤

在前面的介绍中,我们使用 WHERE 子句对查询结果进行过滤。如果我们想对分组进行过滤,则可以使用 HAVING 子句。

HAVING 子句的作用对象是组而不是单个记录。在 HAVING 子句中可以使用聚集函数,但再 WHERE 子句中则不能。HAVING 通常和 GROUP BY 子句一起使用。

统计交易记录大于2条的每件商品的销售总量

SELECT SUM(amount) FROM sales_table GROUP BY name HAVING COUNT(*) > 2;

该语句先将记录按商品名进行分组,再过滤出交易记录大于2条的商品,然后分别对这些商品统计销售总量。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注