寻找畅销与滞销
字段段的计算
1、借助 SQL 实现字段间计算的方法非常简洁,只需要把算式写在 SELECT
关键字后面
销量 = 备货量 - 库存量,那么,让备货量对应的字段 total
减去库存量对应的 surplus
2、在介绍源数据表时我们说过,price
、total
、surplus
这三个需要频繁参与算术运算的列,都是 浮点数 类型的,目的就是为了保证除法运算中不出错。
SELECT event_name,
total,
surplus,
surplus / total
FROM stocks;
SQL 中的运算要怎样保留小数呢?给你介绍一个快捷小工具:round()
函数
我们把 surplus/total
这个算式写到 round()
函数的括号里,其后跟一个英文逗号 ,
,逗号后面跟我们想要保留小数的位数。round(surplus/total, 2)
的含义就是对 surplus/total
的计算结果保留两位小数
SELECT event_name,
total,
surplus,
round(surplus/total, 2)
FROM stocks;
AS关键字
我们可以用 AS
关键字给字段取别名,这里的字段可以是数据表中的单独一列,也可以是算术运算后得到的新字段。
SELECT event_name,
price,
total - surplus AS sales
FROM stocks;
-
别名为关键字且不加任何标识,SQL 就无法辨认你写的到底是字段别名,还是它自己的关键字了;
-
别名以数字开头且不加标识,那么像科学计数法表示的
10e5
究竟是数字还是字段名呢? -
别名中包含特殊字符,如
互联网+
、2021-01月收入
,那这里的加号和减号到底是别名的一部分,还是 SQL 中的运算操作符呢?
ORDER BY子句
SQL 中排序靠的是 ORDER BY
子句,它可以按指定字段对查询结果进行排序——和 AS
关键字一样,这个字段可以是数据表中的某一列,也可以是数学运算的执行结果。ORDER BY
子句用法灵活,可以实现很多复杂的操作:
- 按单个字段排序;
- 按多个字段排序;
- 按字段间的计算结果排序;
- 按字段别名排序;
- 对筛选结果的排序……
按单个字符进行排序
SELECT *
FROM stocks
ORDER BY price;
按多个字符进行排序
因其能极大地方便数据查询,多层排序在业务场景中相当常用。ORDER BY
同样支持将多个字段作为排序依据,实现多层排序。
这些字段之间要用 英文逗号 ,
分隔,并按照 外层排序依据 → 内层排序依据 的顺序写在 ORDER BY
之后。
SELECT *
FROM stocks
ORDER BY event_type, price;
按字段间的计算结果排序
SELECT *
FROM stocks
ORDER BY total - surplus;
按字段别名排序
-- 按英文别名排序
SELECT event_name,
price,
total - surplus AS sales
FROM stocks
ORDER BY sales;
-- 按中文别名排序
SELECT event_name AS 演出名称,
price AS 价格,
total - surplus AS 销量
FROM stocks
ORDER BY 销量;
LIMIT关键字
在查询结果中数据量较大,而我们又只需要其中特定几行时,可以用 LIMIT
关键字来限制查询结果的数量,我们来看下它的使用手册:
LIMIT
关键字可以接两个参数,分别是获取结果的 起始位置 和返回结果的 行数。
这两个参数指定了待获取的行号。以 LIMIT 0, 5
为例,起始位置是 0,返回结果的行数是 5,那么,从 0 开始往后数 5 个数,就得到了待获取的行号:1, 2, 3, 4, 5,最终返回了第 1~5 行数据。
LIMIT
参数最常见的应用,就是取出查询结果的前几行。SQL 为了方便我们写代码,支持将第一个参数省略,写成 LIMIT 返回结果的行数
,这时 SQL 会自己帮我们将前一个参数设为 0,LIMIT 5
也就相当于 LIMIT 0, 5
。
除了参数之外,我们还需要注意 LIMIT
关键字所在的位置。LIMIT
关键字是等一切都尘埃落定以后才起效的,它在 SQL 语句中的位置也很靠后,要放在我们曾经学过的 WHERE
子句和 ORDER BY
子句后面。
指定排序方向
按多个字段排序时,我们还可以给每一个字段指定不同的排序方向。比如下面的例子,对数据表 seasons_revenue
按渠道 channel
升序排序,并在每个渠道内部按营收额 revenue
降序排序:
SELECT *
FROM seasons_revenue
ORDER BY channel, revenue DESC;