Mysql技术内幕—计算字段(函数)

Posted 喜欢敲代码的胖虎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql技术内幕—计算字段(函数)相关的知识,希望对你有一定的参考价值。

上一小节讲了mysql数据过滤的两种方法。第一种是关键字like加通配符“%”或“”,“%”可以匹配任意字符,_”匹配单个字符。第二种是正则表达式匹配,并且举例了几种特殊场景。

本小节讲下什么是Mysql计算字段

计算字段可以理解为某种函数,遇到如下场景可以使用计算字段:

  • 在一个字段既显示姓名又显示地址,姓名和地址存储在表中不同的列。
  • 列数据大小写混合,但是需要全部大写或者小写显示。
  • 表数据的一般运算(加、减、乘、除) 。
  • 日期处理。
这就是计算字段通常干的事情,Mysql表不需要存储计算结果,而是在SELECT时候通过计算字段,计算出想要的结果。Mysql计算字段所完成的功能在服务器代码中也可以完成,但是效率远远比不上Mysql计算字段,因为Mysql计算字段是由DBMS专门设计快速完成此类功能的函数。

1.拼接字段

拼接函数CONCAT(str1,str2,...),可以将多个字符串拼接在一起,形成一个长串。 如订单表order_info有数据:
select * from order_info;
id name prod_name order_price address order_time
1 高虎 西瓜 23 北京市西城区 2021-02-21 18:39:59
2 胖虎 香蕉 13 北京市朝阳区 2021-02-20 12:32:53
3 瘦虎 苹果 24 北京市海淀区 2021-01-20 13:31:59
4 矮虎 梨子 22 北京市通州区 2021-01-12 14:31:52
select CONCAT(name,',',address) as name_address from order_info;
name_address
高虎,北京市西城区
胖虎,北京市朝阳区
瘦虎,北京市海淀区
矮虎,北京市通州区

2.执行算数计算

在select语句中可以使用+ 、-、*、/ 一般运算符。

select order_price*order_price as double_price from order_info ;
double_price
529
169
576
484

3.字符函数

文本处理函数RTrim()会去除掉列值右边的空格,而Upper()函数会把列中小写转换为大写。

同样的函数还有:

函 数 说明
RTrim() 去掉右边空格
SubString() 返回子串字符
Upper() 小写转为大写

4.日期处理函数

(1)使用AddDate()函数添加或者删除指定时间。在原有order_time时间基础上增加32天:

SELECT ADDDATE(order_time,INTERVAL 32 DAY) as new_time from `order_info`;
new_time
2021-03-25 18:39:59
2021-03-24 12:32:53
2021-02-21 13:31:59
2021-02-13 14:31:52

order_time时间基础上增加2分2秒:

SELECT ADDDATE(order_time,INTERVAL ‘2:2’ MI_SE) as new_time from `order_info`;
new_time
2021-02-22 18:39:59
2021-02-21 12:32:53
2021-01-21 13:31:59
2021-01-13 14:31:52

(2)使用DateDiff计算两个日期之间的间隔天数。

SELECT DATEDIFF('2021-2-21','2021-2-23') as col
col
-2

(3)使用Year()、Month()和Day()函数获取日期对应的年、月和日。

SELECT YEAR(order_time),MONTH(order_time), Day(order_time) from `order_info`;
year month day
2021 2 21

(4)如果我们仅仅是想年月日与表里的日期匹配,怎么办?下列语句是不可行的。

SELECT * from `order_info` where order_time='2021-02-21';

检索为空。

如果我们只想查询02月21日当天的订单可以使用Date函数,Date函数可以提取年月日。

SELECT * from `order_info` where Date(order_time)='2021-02-21';
id name prod_name order_price address order_time
1 高虎 西瓜 23 北京市西城区 2021-02-21 18:39:59

(5)如果我们只想检索出2021年2月的所有订单应该怎么办?

两种查询方法:

SELECT * from `order_info` where YEAR(order_time)='2021' and MONTH(order_time)='2';
SELECT * from `order` where Date(time) BETWEEN '2021-02-01' and '2021-02-29'
id name prod_name order_price address order_time
1 高虎 西瓜 23 北京市西城区 2021-02-21 18:39:59
2 胖虎 香蕉 13 北京市朝阳区 2021-02-20 12:32:53

还有经常使用的函数有如下:

函数 说明
AddDate() 增加一个日期
CurDate() 返回当前日期(yyy-mm-dd)
CurTime() 返回当前时间(hh:ss:mm)
Date() 返回当前时间
DateDiff() 计算两个日期差
Date_Add() 时间运算
Date_Format() 返回格式化的时间字符串
Day() 返回日
DayOfWeek() 返回星期
Hour() 返回小时
Minute() 返回分钟
Month() 返回月
Now() 返回当前日期和时间
Second() 返回秒
Time() 返回时间部分
Year() 返回年

5.数值处理函数

函数 说明
Abs() 返回一个数的绝对值
Cos() 返回角度的余弦值
Exp() 返回一个数的指数值
Mod() 返回余数
Pi() 返回圆周率
Rand() 返回随机数

6.聚集函数

有以下场景:

  • 确定表中的函数。
  • 确定表列的最大值和最小值。
以上场景都是对表中数据的汇总,无需返回实际的数据去处理。
当我们只是想要知道Mysql表的汇总数据而不是表里实际检索的数据时,可以用聚集函数。
聚集函数如下:
函 数 说明
AVG() 返回列的平均值
COUNT() 返回列的行数
MAX() 返回列的最大值
MIN() 返回列的最小值
SUM() 返回列的和

7.组合聚集函数

select count(*) as total ,Min(price) as min_price ,Max(price) as max_price ,Avg(price) as avg_price from order_info;
total min_price max_price avg_price
4 23 23 23.00

返回四个商品的价格最低、最高和平均价格以及所有条数。

8.小结

本小节给出了,Mysql常用的函数并举例具体用法,下一节将更新表的全文搜索方法。  

我是胖虎,用心写好每篇文,下期再见 Mysql技术内幕—计算字段(函数)               

                  胖虎出品|必属精品

                         点击阅读