mysql常用函数

mysql 函数笔记

本章内容会用到的建表语句和表数据

-- 创建t_info表
CREATE TABLE `t_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT '姓名',
  `age` int(2) DEFAULT NULL COMMENT '年龄',
  `c_score` int(3) DEFAULT NULL COMMENT '语文分数',
  `e_score` int(3) DEFAULT NULL COMMENT '英语分数',
  `the_date` date DEFAULT NULL COMMENT '出分日期',
  `the_time` datetime DEFAULT NULL COMMENT '出分时间',
  `str_time` varchar(30) DEFAULT NULL COMMENT '字符串时间',
  `level` int(1) DEFAULT NULL COMMENT '1优秀 2良好 3还行',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf-8;

-- 插入测试数据
INSERT INTO `t_info`(`id`, `user_name`, `age`, `c_score`, `e_score`, `the_date`, `the_time`, `str_time`, `level`) VALUES (1, '张三他爷爷的孙子', 18, 66, 76, '2022-09-01', '2022-09-01 09:01:10', '2022-09-01 09:01:10', 1);
INSERT INTO `t_info`(`id`, `user_name`, `age`, `c_score`, `e_score`, `the_date`, `the_time`, `str_time`, `level`) VALUES (2, '李四他爸爸的儿子', 21, 38, 86, '2022-10-13', '2022-10-13 09:01:58', '2022-10-13 09:01:58', 2);
INSERT INTO `t_info`(`id`, `user_name`, `age`, `c_score`, `e_score`, `the_date`, `the_time`, `str_time`, `level`) VALUES (3, '王五他自己的自己', NULL, 70, 81, '2022-10-16', '2022-10-16 09:02:32', '2022-10-16 09:02:32', 3);

1.日期时间字段相关函数

-- 1. now()获取当前日期和时间  current()   CURRENT_DATE()获取当前日期   CURRENT_TIME()获取当前时间
select now(),CURRENT_DATE(),CURRENT_TIME() from dual;

-- 2. DATE()用来提取时间字段的日期  YEAR() 提取年  MONTH()提取月份,会省略前面的0  DAY()提取天,若日期前有0会忽略
select DATE(str_time), YEAR(the_time), MONTH(the_time), DAY(str_time) from t_info;

-- 3. UNIX_TIMESTAMP()函数,获取当前时间戳,还可以将时间字段转换成时间戳
select UNIX_TIMESTAMP();
select UNIX_TIMESTAMP(the_time) from t_info;

-- 4. 时间格式化函数  DATE_FORMAT()和TIME_FORMAT()功能相同
select DATE_FORMAT(the_time,'%Y/%m/%d %H:%i:%s') from t_info;
select DATE_FORMAT(the_time,'%Y/%m/%d') from t_info;

2. 字符串字段相关函数

-- 1.CONCAT(str1,str2,...,strn)  将str1,str2,...,strn连接为一个完整的字符串
select concat(user_name,age,the_date) from t_info;
select concat(user_name,age,the_date,null) from t_info;               -- 拼接null的话,会将整体返回null
select * from t_info where user_name like concat('%','三','%');       -- mybatis 中使用模糊查询的常见用法

-- 2.CONCAT_WS(sep,str1,str2,...,strn)  拼接并使用tep隔开
select CONCAT_WS('-',user_name,age,'哈哈') from t_info;

-- 3.STRCMP(str1,str2);  如果传入的参数str1大于str2,则返回true;如果参数str1小于str2,则返回false;如果参数str1等于str2,则返回0
select strcmp('22','33') from dual;
select strcmp('33','33') from dual;
select strcmp('33','22') from dual;
select strcmp('33','3a') from dual;     -- 是比较asscll码

-- 4.获取字符串长度函数LENGTH()和字符数函数CHAR_LENGTH()
select LENGTH('张三'),LENGTH('avfwa') from dual;
select CHAR_LENGTH('张三'),CHAR_LENGTH('avfwa') from dual;

-- 5.实现字母大小写转换函数UPPER()和LOWER()
select UPPER('AbCd') from dual;
select LOWER('AbCd') from dual;

-- 6.从现有字符串中截取子字符串 LEFT(str,num);  RIGHT(str,num);  SUBSTRING(str,num,len);  substring_index(str,sep,num)
select LEFT('张三是一个大叔啊',2) from dual;
select RIGHT('张三是一个大叔啊',3) from dual;
select SUBSTRING('张三是一个大叔啊',4,5) from dual;
select substring_index('张三是一个大叔啊','-',-1) from dual;
select substring_index('张三是-一个大叔啊','-',-1) from dual;
select substring_index('张三是-一个-大叔啊','-',2) from dual;

-- 7.去除字符串开始的首位空格  LTRIM(str);去除首部空格  RTRIM(str);去除尾部空格  TRIM(str);去除首尾空格
select LTRIM(' mysql '),RTRIM(' mysql '),TRIM(' mysql ') from dual;     -- 看不出效果
select concat('-',LTRIM('   mysql    '),'-'),concat('-',RTRIM('   mysql   '),'-'),concat('-',TRIM('   mysql   '),'-') from dual;     

-- 8.替换字符串 REPLACE(str,substr,newstr);   INSERT(str,pos,len,newstr);
select REPLACE('1234567','56','aa') from dual;
select INSERT('1234567',2,3,'aaa') from dual;

-- 9.字符串截取 SUBSTRING(param1,param2,param3) param1代表要截取的字符串 ,param2代表开始截取的起始位置,  param3代表要截取的长度
SELECT SUBSTRING('Hello World',7,5) FROM DUAL

-- 10.获取字符在字符串中第一次出现的位置  LOCATE(p1,p2)  p1代表要查找的字符,p2代表字符串
SELECT LOCATE('o','Hello World');

3. 数值相关函数

-- 1. abs(num)返回num的绝对值   ceil(num)返回大于 num 的最小整数值   floor(num)返回小于 num 的最大整数值  
select abs(-3), ceil(3.1), floor(3.1) from dual;

-- 2.rand() 返回 0 到 1 内的随机值。
select rand();

-- 3.round(num,n) 返回 num 的四舍五入的 n 位小数的值。
select round(16.1466,2);

-- 4.truncate(num,n) 返回数字 num 截断为 n 位小数的结果。
select truncate(3.1466,2) from dual;


4.流程控制函数

-- 1.IF(value,value1,value2)    value结果是true,那返回value1,否则返回value2
select IF(1=1,'是','否');
select IF(c_score > 60,'牛啊','菜啊') from t_info;

-- 2.IFNULL(value1,value2)      如果value1不是null返回value1,否则返回value2
select IFNULL(age,'年龄哪去了?') from t_info;

-- 3.CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ... [ELSE 结果n] END 别名
select id , user_name,
(CASE 
	WHEN c_score > 60 THEN
		'牛啊'
	WHEN c_score = 60 THEN
		'刚好'
	ELSE
		'菜啊'
END) as "result"
from t_info;

-- 4.CASE 目标字段 WHEN 数值1 THEN 结果1 WHEN 数值2 THEN 结果2 ... [ELSE 结果n] END 别名
select id, user_name,
(case level 
when 1 then '优秀'
when 2 then '良好'
when 3 then '还行'
else '垃圾'
end) as '等级'
from t_info;


5.聚合函数,排序函数,分页

(常用,在此不举例子)

-- 1.AVG()求平均值,  SUM()求和,  MAX()最大值, MIN()最小值,  COUNT()总条数

-- 2.GROUP BY 字段   分组,     HAVING 分组过滤

-- 3.order by  字段   排序,   limit v1, v2   分页

6.其他用到过的函数

1.时间加减

DATE_SUB()和DATE_ADD()函数,实现日期增减

DATE_SUB(NOW(),INTERVAL 30 MINUTE) 当前时间减30分钟

DATE_SUB(NOW(),INTERVAL 1 day) 当前时间减1天

DATE_SUB(NOW(),INTERVAL 1 hour) 当前时间减1小时

DATE_SUB(NOW(),INTERVAL 1 second) 当前时间减1秒

DATE_SUB(NOW(),INTERVAL 1 week) 当前时间减1星期

DATE_SUB(NOW(),INTERVAL 1 month) 当前时间减1个月

DATE_SUB(NOW(),INTERVAL 1 quarter) 当前时间减1季度

DATE_SUB(NOW(),INTERVAL 1 year) 当前时间减1年

相对DATE_ADD()是加时间

demo

获取最近10天的数据:

SELECT
*
FROM loit_net_option
WHERE
event_time > DATE_SUB(now(),INTERVAL 10 DAY)

2.判空函数

IFNULL(expression, alt_value)

解释:

expression 必须,要测试的值
alt_value 必须,expression 表达式为 NULL 时返回的值

demo

判断,如果region为null,那么返回值为 “其他”

SELECT IFNULL(region,'其他') as name FROM loit_bear_mine_metal

3.多表拼接总数求和

SELECT
   sum(a)
FROM
   ( SELECT count(*) a FROM loit_bear_pub_school
     UNION
     SELECT count(*) a FROM loit_bear_pub_medical
     UNION
     SELECT count(*) a FROM loit_bear_pub_hotel
     UNION
     SELECT count(*) a FROM loit_bear_pub_sports
     UNION
     SELECT count(*) a FROM loit_bear_pub_culture
     UNION
     SELECT count(*) a FROM loit_bear_pub_religion
     UNION
     SELECT count(*) a FROM loit_bear_pub_scenic_spot
     UNION
     SELECT count(*) a FROM loit_bear_pub_supermarket
     UNION
     SELECT count(*) a FROM loit_bear_pub_social
   ) AS b

4.case判断

SELECT
   ( CASE warning_level WHEN 1 THEN '一级' WHEN 2 THEN '二级' WHEN 3 THEN '三级' ELSE '其他' END ) AS LEVEL,
   count(*) AS count
FROM
   loit_warning_info

5.时间格式的过滤条件

SELECT
   a.area AS code,b.area as name,count(*) AS num
FROM
   loit_warning_info a
LEFT JOIN loit_area b on a.area=b.`code`
where 1=1
<if test="type == 1">
   and  DATE_FORMAT(warning_time,'%Y') BETWEEN #{startDate} and #{endDate}
</if>
<if test="type == 2">
   and  DATE_FORMAT(warning_time,'%Y-%m-%d') BETWEEN #{startDate} and #{endDate}
</if>
<if test="type == 3">
   and  DATE_FORMAT(warning_time,'%Y-%m') BETWEEN #{startDate} and #{endDate}
</if>
GROUP BY a.area
ORDER BY num desc

6.查看大串包小串
FIND_IN_SET(str,strlist) : str 要查询的字符串,strlist 需查询的字段,参数以”,”分隔,形式如 (1,2,6,8,10,22);该函数的作用是查询字段(strlist)中是否包含(str)的结果,返回结果为null或记录。

posted @ 2022-10-25 19:09  木糖醇困了  阅读(43)  评论(0)    收藏  举报