前面的章节讲述了一些基本的mysql select语法,有时我们不需要列值本身,而是需要变换格式或统计筛选后的结果,SQL支持一些计算字段和函数等来方便地应对这些情况。
一、计算字段
在select语句中创建计算字段并起别名来显示不实际存在的列。
1、拼接字段 Concat()函数
eg1: 从供应商表vendors中将供应商的名字vend_name和地区vend_city两列以一列 “供应商名(地区)” 的形式返回
SELECT CONCAT(vend_name, '(', vend_city, ')') FROM vendors
可以利用RTrim(), LTrim(), Trim()来删除列左/右的空格,整理数据格式。
2、算术计算
eg2: 返回订单中的商品数量和单价并汇总商品价格
SELECT order_item, quantity, item_price, quantity*item_price AS sum_price FROM orderitems WHERE order_num=20005 ORDER BY order_item
二、数据处理函数
1、文本处理(较常用)
Upper()/Lower()将文本转换为大/小写
Left()/Right()返回串左边/右边的字符
Length()返回串的长度
LTrim()/RTrim()删除左/右的空格
Locate()找出串的一个子串
SubString()找出子串的字符
Soundex()返回类似发音的值
2、日期和时间处理(常用)
注意日期格式尽量写为 yyyy-mm-dd,虽然其他日期格式MySQL也能处理,但是有时会产生歧义。
另外类型为datetime时,如列值为2019-09-17 21:45:30,则其不能与'2019-09-17'直接匹配,根据具体问题采用Date()等函数进行过滤才能得到想要的结果。
eg3: 检索2005年9月的所有订单
SELECT order_num,cust_id,order_date FROM orders WHERE YEAR(order_date)=2005 AND MONTH(order_date)=9
3、数值处理(不常用)
三、聚集函数
用法较为简单就不一一举例了,说明一下每个函数使用的注意点。
1、平均值AVG()
用于确定特定数值列的平均值,参数为该列。
2、最大值MAX()
返回指定列的最大值,可以是数值,日期,文本等。忽略NULL。
3、最小值MIN()
返回指定列的最小值,可以是数值,日期,文本等。忽略NULL。
4、统计COUNT()
COUNT(*)用来返回所有行,包含NULL。
COUNT(column)返回特定列具有值的行,不包含NULL。
5、求和SUM()
用于返回指定列值的和。
eg4: SELECT SUM(quantity) AS sum_quantity FROM orderitems WHERE order_num=20005
用于合计计算结果。
eg5: SELECT SUM(quantity*item_price) AS sum_price FROM orderitems WHERE order_num=20005
6、聚集不同值DISTINCT
eg6: 和AVG()组合返回不同价格的平均值
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products 与 SELECT AVG(prod_price) AS avg_price FROM products在有多个产品价格相同时结果不同。
eg7: 和COUNT()结合返回某指定列值不同的行数
SELECT COUNT(DISTINCT vend_id) FROM products 正确
SELECT COUNT(DISTINCT) FROM products 错误,distinct不能作用于 *
7、组合聚集函数
SELECT
COUNT(*) AS num_items,
MIN(prod_price) AS min_price,
MAX(prod_price) AS max_price
FROM products;