表中的数据一般不是应用程序直接需要的,为了效率,最好让mysql对查询结果进行一些处理和整理。
处理之后,对客户端来说,拿到的结果是没有区别的——它不能区分这是原始字段还是处理过的字段
1、计算字段
Concat |calc -AS
拼接时:Concat-RTrim(LTim)
![098656dcf7fbacb340a087d65001e0ff.png](https://i-blog.csdnimg.cn/blog_migrate/adb9e69be9db3768d9190c7f62b6ff49.png)
![e91c62592ef96506388fdf3c67ab2c76.png](https://i-blog.csdnimg.cn/blog_migrate/aac7ed68c81fff428a558ed4b86c2f55.png)
拼接和计算的结果是否符合预期,同样可以select测试:
![51f9916af0c6bb1f398ad351931f99a1.png](https://i-blog.csdnimg.cn/blog_migrate/bb13f63ea6b9bc0fafa4d567f24e878b.png)
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)
![95d6b34ed3874b6863eaa7c1d86bdb3c.png](https://i-blog.csdnimg.cn/blog_migrate/b585f6abd56d08ccd9fe0647cd590862.png)
![783c5d443dd810519e04b72b95e75ade.png](https://i-blog.csdnimg.cn/blog_migrate/96f0100f54ee06c9b46263915d960973.png)
![75b28cbca39d2b740f5d62e56b58b791.png](https://i-blog.csdnimg.cn/blog_migrate/667b287ea1c08170e57f3238b3c194ab.png)
2)日期和时间
![310aaaedc750e238c21829818874bcc4.png](https://i-blog.csdnimg.cn/blog_migrate/1b8421c6c5fc28e2f1fb37e2342bb4e9.png)
大多数时候并不能精确匹配,比如数据库里可能是日期+时间,于是只取日期或时间来匹配,并且配合Between and取范围:
![6430f4890a357ee7da99de7dc6de8e90.png](https://i-blog.csdnimg.cn/blog_migrate/afa6d93beb5adc8811c4bc0c2e1997da.png)
但这个操作需要记得每个月有多少天,可以写作:
![b932d43778ba150d8e3f340d1162a225.png](https://i-blog.csdnimg.cn/blog_migrate/45d29ee9adb122cc0288d77cee24a4a5.png)
4)
![f494e48372c2ebafaba388746d10867a.png](https://i-blog.csdnimg.cn/blog_migrate/46a796944eed54bd48e5383c614fedc7.png)
![f8f6d5152dd3a1dcfdd095d838bbbb50.png](https://i-blog.csdnimg.cn/blog_migrate/a21494d4c9c1a73a370b54f7e5032963.png)
![91dfc7a16bce7ca813a1bc1a30e12a27.png](https://i-blog.csdnimg.cn/blog_migrate/6758b0364b9e9dc1447377975b00d1e0.png)
![e1c473f076e7be63ae72f50dda4a9bf4.png](https://i-blog.csdnimg.cn/blog_migrate/158bfb4d36955ed372d4b752300b864c.png)
![2b8a4fdfda3df954a236dd1559926c44.png](https://i-blog.csdnimg.cn/blog_migrate/dec3f3fa00dbbcac74c626eb356d3f14.png)
![a89fc67641bb7fee4b7160439d01aef4.png](https://i-blog.csdnimg.cn/blog_migrate/c1e065972850023121a2d45cb2fd0abc.png)
3、分组 与过滤分组
1)有一些需求是:返回每一 个供应商提供的产品数量?
GROUP BY 分组和HAVING过滤
![aefb7f875f76ba17e12bf84111994a14.png](https://i-blog.csdnimg.cn/blog_migrate/8a7d943748be9d3c1ce3ee2fbbdafa23.png)
![2bedbf373fc94b79b950d18930ea22a3.png](https://i-blog.csdnimg.cn/blog_migrate/ce1119e12c7efab39cc3738927d42f74.png)
![ae6f4798a65610704cad24c74443ddec.png](https://i-blog.csdnimg.cn/blog_migrate/49cd9c523225a32134edb3728a1deff6.png)
2)分组以后还有要求:列出至少有2个订单的顾客
这个需求首先要把订单按顾客进行分组,然后统计每个组的订单数量,如果满足>=2,则把这个组展示出来(过滤)
![59d2ba44948e4037b7a6dcd17f88b505.png](https://i-blog.csdnimg.cn/blog_migrate/fec9f75bfd1795521c47c75722ca2856.png)
where和having的区别:
where在分组前过滤,where过滤掉的东西不参与分组,having在分组后过滤。
3)列出具有2个以上价格10以上的产品的供应商:
![68823d7b884e2448ecdef3ba40399afa.png](https://i-blog.csdnimg.cn/blog_migrate/bb2592823b4ac9f4fa89253c181d0379.png)
4)列出总计订单价格》=50的订单,要求订单号和总计订单价格:
按订单号分组,算出每个组的总计价格
对分组过滤,条件》=50
![bf2d5e8edb163a8b1b5036352487fa1a.png](https://i-blog.csdnimg.cn/blog_migrate/40698dc2d1daddd64fe83e5d34160044.png)
![a26977caed738a5a5100fe16fe9d4f10.png](https://i-blog.csdnimg.cn/blog_migrate/9dc9f465f62de58cc0b0f6ba9ae520e3.png)
4、总结目前为止的SELECT字句的顺序:
SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT