聚合与排序:练习题

本文内容

3.1 请指出下述 SELECT 语句中所有的语法错误。

1
2
3
4
5
6
SELECT product_id, SUM(product_name)
-- 本SELECT语句中存在错误。
  FROM Product
 GROUP BY product_type
 WHERE regist_date > '2009-09-01';

  1. 使用了字符类型的列(product_name)作为 SUM 函数的参数。

    » 解答

    SUM 函数只能使用数值类型的列作为参数。

  2. WHERE 子句写在了 GROUP BY 子句之后。

    » 解答

    WHERE 子句必须写在 GROUP BY 子句之前。

  3. SELECT 子句中存在 GROUP BY 子句中未指定的列(product_id)。

    » 解答

    使用 GROUP BY 子句时,书写在 SELECT 子句中的列有很多限制。GROUP BY 子句中未指定的列不能书写在 SELECT 子句之中。

此外,虽然在 SELECT 子句和 FROM 子句之间添加注释在语法上没有问题,但因为这样会使 SQL 语句难以阅读,所以请不要这样书写。

WHERE 子句中指定 regist_date 的大小关系作为条件并没有什么问题。

3.2 请编写一条 SELECT 语句,求出销售单价(sale_price 列)合计值是进货单价(purchase_price 列)合计值 1.5 倍的商品种类。执行结果如下所示。

执行结果

1
2
3
4
SELECT product_type, SUM(sale_price), SUM(purchase_price)
  FROM Product
 GROUP BY product_type
HAVING SUM(sale_price) > SUM(purchase_price) * 1.5;

» 解答

因为该 SELECT 语句是在按照商品种类进行分组之后,指定各组所对应的条件,所以使用了 HAVING 子句。条件为“大于 1.5 倍”,而不是“大于等于 1.5 倍”,因此条件表达式为“>”而不是“>=”。

3.3 此前我们曾经使用 SELECT 语句选取出了 Product(商品)表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。

执行结果

product_id | product_name | product_type | sale_price  | purchase_price | regist_date
-----------+--------------+--------------+-------------+----------------+-----------
0003       | 运动T恤      | 衣服         |        4000 |           2800 |
0008       | 圆珠笔       | 办公用品     |         100 |                | 2009-11-11
0006       | 叉子         | 厨房用具     |         500 |                | 2009-09-20
0001       | T恤衫        | 衣服         |        1000 |            500 | 2009-09-20
0004       | 菜刀         | 厨房用具     |        3000 |           2800 | 2009-09-20
0002       | 打孔器       | 办公用品     |         500 |            320 | 2009-09-11
0005       | 高压锅       | 厨房用具     |        6800 |           5000 | 2009-01-15
0007       | 擦菜板       | 厨房用具     |         880 |            790 | 2008-04-28
1
2
3
SELECT *
  FROM Product
 ORDER BY regist_date DESC, sale_price;

» 解答

使用 ORDER BY 子句指定排列顺序之后,肯定有一列会按照升序或者降序进行排列。本习题中是登记日期(NULL 排在开头还是末尾会根据 DBMS 不同而不同,无需考虑)。因此我们能够推断出首先是按照登记日期的降序进行排序的。

接下来,对于日期相同的记录,例如同为“2009-09-20”的 3 条记录,可以看出是按照销售单价的升序进行排序的。

请参阅#

(完)

comments powered by Disqus

本文内容