表中的数据一般不是应用程序直接需要的,为了效率,最好让mysql对查询结果进行一些处理和整理。
处理之后,对客户端来说,拿到的结果是没有区别的——它不能区分这是原始字段还是处理过的字段
1、计算字段
Concat |calc -AS
拼接时:Concat-RTrim(LTim)
拼接和计算的结果是否符合预期,同样可以select测试:
2、使用函数
1)文本处理流函数Upper()Soundex()Right()Left()Length()
2)日期和时间处理函数Date()
where Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
where Year(order_date) = 2005 AND Month(order_date) = 9;
3)数值处理函数 Abs() Pi() Cos()
4)聚集函数(不需要原始数据,而需要汇总数据)AVG()MAX()MIN()SUM()COUNT()
聚集函数除了基本用法,还有高级一点的:
- 只聚集不同的值(比如计算AVG时重复的数值只算1次)
- 组合聚集函数(在一条语句里使用多个基本聚集函数)
select AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id=1003;
SELECT COUNT(*) AS num_items,
-> MIN(prod_price) AS price_min,
-> MAX(prod_price) AS price_max,
-> AVG(prod_price) AS price_abg
-> FROM products;
函数移植性不如SQL。
1)
2)日期和时间
大多数时候并不能精确匹配,比如数据库里可能是日期+时间,于是只取日期或时间来匹配,并且配合Between and取范围:
但这个操作需要记得每个月有多少天,可以写作:
4)
3、分组 与过滤分组
1)有一些需求是:返回每一 个供应商提供的产品数量?
GROUP BY 分组和HAVING过滤
2)分组以后还有要求:列出至少有2个订单的顾客
这个需求首先要把订单按顾客进行分组,然后统计每个组的订单数量,如果满足>=2,则把这个组展示出来(过滤)
where和having的区别:
where在分组前过滤,where过滤掉的东西不参与分组,having在分组后过滤。
3)列出具有2个以上价格10以上的产品的供应商:
4)列出总计订单价格》=50的订单,要求订单号和总计订单价格:
按订单号分组,算出每个组的总计价格
对分组过滤,条件》=50
4、总结目前为止的SELECT字句的顺序:
SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT