上篇主要介绍了如何检索需要的数据,在检索得到数据后有时候需要进行对结果进行一定处理,再展示,本篇介绍几种处理方案。
假设在采购数据库中有prod_id,quantity,item_price三列,现在想要得到带有采购总价的数据检索结果,如下
...
SELECT prod_id,quantity,item_price,
quantity*item_price AS price
FROM prodfamily
WHERE ID = 2001
上述语句会输出订单号为2001的货品,数量,单价和总价
+----------+----------+-------------+-------+
| prod_id | quantity | item_price | price |
+----------+----------+-------------+-------+
| laptop | 5 | 3000 | 15000 |
| printer | 1 | 4000 | 4000 |
+----------+----------+-------------+-------+
这里值得注意的是我们用了AS关键词,AS关键词的主要功能是定义导出列名或者叫别名。
Mysql中数值处理函数如下
函数 | 意义 |
---|---|
Abs() | 绝对值 |
Sqrt() | 开方 |
Cos() | 余弦 |
Sin() | 正弦 |
Tan() | 正切 |
Exp() | 指数 |
Mod() | 整除余数 |
Rand() | 随机数 |
典型例子
>SELECT Abs(-5);
输出就是5
比如我们需要在订单库中查询某一天的订单,那么就以时间为条件检索查询。
...
SELECT prod_id,quantity,item_price
FROM prodfamily
WHERE proddate = '2019-07-30'
#时间格式总是yyyy-mm-dd
但是如果在proddate列中录入的时间是2019-07-30 17:30:05那就过滤失败了,这时候就需要用上时间处理函数中的Date()函数(取日期部分),语句改成如下
...
SELECT prod_id,quantity,item_price
FROM prodfamily
WHERE Date(proddate) = '2019-07-30'
#时间格式总是yyyy-mm-dd
这样就能够正确查找了。当然日期处理函数非常多,详见下表
函数 | 意义 |
---|---|
Date() | 日期部分 |
Year() | 年份 |
Month() | 月份 |
Day() | 天 |
DayofWeek() | 星期几 |
Time() | 非日期部分 |
Hour() | 小时 |
Minute() | 分 |
Second() | 秒 |
例如在myfriends中检索完想把结果展现成WANG dachui(CHINA)应该怎么办呢?这就需要用到文本处理函数Concat()。
...
SELECT Concat(names, '(', nation, ')')
FROM myfriends
文本处理函数非常多,比如去除空格的Trim()函数(RTrim\LTrim表示去右/左空格),改大小写的Upper()和Lower()函数等等
函数 | 意义 |
---|---|
Trim() | 去除左右空格 |
LTrim() | 去除左空格 |
RTrim() | 去除右空格 |
Lower() | 小写字符 |
Upper() | 大写字符 |
Length() | 字符串长度 |
Left() | 字符串左侧开始截取 |
Right() | 字符串右侧开始截取 |
我们在利用检索的数据开展分析的时候经常需要利用数据的统计信息,在Mysql中直接由定义的简单统计函数,可以在检索的时候直接计算。
执行语句例如
...
SELECT AVG(statue) AS avg_statue
FROM myfriends
#计算了我朋友的平均身高
在Mysql中定义的统计函数分为均值、最大最小值、和值、行数五种,见下表。
函数 | 意义 |
---|---|
AVG() | 均值 |
COUNT() | 行数 |
MAX() | 最大值 |
MIN() | 最小值 |
SUM() | 和值 |
范例如下
...
SELECT MAX(statue) AS max_statue
FROM myfriends;
#计算了我朋友的最高身高
...
SELECT MIN(statue) AS min_statue
FROM myfriends;
#计算了我朋友的最矮身高
...
SELECT COUNT(statue) AS cnt_statue
FROM myfriends;
#计算了我朋友有身高记录的行数
...
SELECT COUNT(*) AS cnt
FROM myfriends;
#计算了我朋友有多少个
除了统计所有行的COUNT(*)之外其他都不考虑值为NULL的行。
我们来看这样的供货表
#prod table
+-----------+----------+------------+-------------+
| prod_name | quantity | item_price | supplier_id |
+-----------+----------+------------+-------------+
| A | 100 | 100 | 001 |
| B | 50 | 300 | 001 |
| C | 55 | 100 | 002 |
| D | 35 | 100 | 002 |
| E | 65 | 100 | 002 |
| F | 56 | 100 | 002 |
...
+-----------+----------+------------+-------------+
我想知道每个供应商的商品种类有多少呢?那么就需要在按不同供应商计数(COUNT(*)),这就是数据分组。
通过在SELECT中的GROUP BY子句来创建数据分组,例如
SELECT supplier_id, COUNT(*) AS num
FROM prodtable
GROUP BY supplier_id;
这样就能够按照供应商来统计商品种类了
#prod table summary
+-------------+----------+
| supplier_id | num |
+-------------+----------+
| 001 | 2 |
| 002 | 4 |
...
+-------------+----------+
回想在条件检索的时候利用的是WHERE子句,条件分组用的是HAVING子句,比如
SELECT supplier_id, COUNT(*) AS num
FROM prodtable
GROUP BY supplier_id
HAVING COUNT(*)<3;
结果就是001和002号供应商的统计数据
#prod table summary
+-------------+----------+
| supplier_id | num |
+-------------+----------+
| 001 | 2 |
| 002 | 4 |
+-------------+----------+
在SQL中语句顺序一定得遵照规则,不然会报错,以上已经存在很多语句了,那么顺序如何呢?
顺序应该遵照一下范例
SELECT supplier_id, COUNT(*) AS num
FROM prodtable
WHERE ...
GROUP BY supplier_id
HAVING COUNT(*)<3
ORDER BY supplier_id
LIMIT 2;