本篇内容介绍了“MySQL中常见的函数以及常见的问题汇总”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
MySQL中常见的函数:
if语句:
格式:IF(Condition,A,B)
说明:当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。
case when语句:
举例:
SELECT t.message_id,t.title,
CASE
WHEN TO_DAYS(t.date)= TO_DAYS(NOW()) THEN '今天'
WHEN TO_DAYS(t.date)= (TO_DAYS(NOW())-1) THEN '昨天'
ELSE date_format(t.date,'%Y-%m-%d')
END AS datestr
FROM t_message t
字符串截取/连接函数:
CONCAT函数:
格式:
CONCAT(columnName1,columnName2,'otherString')
说明:返回一个字符串结果,该结果由参数中的值连接(不使用分隔符)而成,如果某一个参数为NULL ,则返回值为NULL。
GROUP_CONCAT函数:
格式:
GROUP_CONCAT(columnName)
GROUP_CONCAT(columnName SEPARATOR ';')
说明:返回一个字符串结果,该结果由分组中的(columnName列的)值用分隔符(默认为英文逗号)拼接而成。
RIGHT函数
格式:right(str, length)
说明:返回字符串str最右面的length个字符。
INSTR函数
格式:INSTR(str,substr)
说明:返回子串substr在字符串str中第一个出现的位置,位置从1开始计算。若在str中找不到substr则返回0。
补充:
LOCATE(substr,str,pos):返回子串substr在字符串str中从pos开始第一个出现的位置。如果substr不是在str里面,返回0。
SUBSTRING函数
格式:substring(str, pos, length);
说明:截取字符串。从pos开始,截取length长度。
字符串替换函数:
举例:将content字段值中的'{URL}'替换为download_url字段的值。
select t.id, t.title, replace(content,'{URL}',t.download_url) from t_helpcenter t
时间函数:
函数:
NOW() eg:2018-03-19 19:18:55
CURDATE() eg:2018-03-19
DATE_SUB(CURDATE(), INTERVAL 7 day) eg:若今天是2018-03-19,则结果为2018-03-12
DATE_SUB(CURDATE(), INTERVAL 1 week) eg:若今天是2018-03-19,则结果为2018-03-12
DATE_SUB(CURDATE(), INTERVAL 1 month) eg:若今天是2018-03-19,则结果为2018-02-19
DATE_SUB(CURDATE(), INTERVAL 1 year) eg:若今天是2018-03-19,则结果为2017-03-19
DATE_FORMAT(CURDATE(), '%Y%m') eg:201803
quarter(NOW()) eg:若今天是2018-03-19(3月属于第1季度),则结果为1
year(NOW()) eg:2018
举例:
今天: SELECT * FROM t_advertise_message WHERE TO_DAYS(update_time) = TO_DAYS(NOW())
昨天: SELECT * FROM t_advertise_message WHERE TO_DAYS(update_time) = TO_DAYS(NOW()) -1
7天内: SELECT * FROM t_advertise_message WHERE DATE(update_time) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
本月: SELECT * FROM t_advertise_message WHERE DATE_FORMAT(update_time,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m')
本季度:SELECT * FROM t_advertise_message WHERE quarter(update_time) = quarter(NOW())
本年度:SELECT * FROM t_advertise_message WHERE year(update_time) = year(NOW())
将字符串转换为时间的函数:
str_to_date('2000-05-24 14:00:00', '%Y-%m-%d %H:%i:%s')
MySQL中常见的问题:
1)MySQL关于查询条件中:字符串类型的值忽略英文字母的大小写以及字符串尾部包含空格的问题
举例:MySQL中执行下面3条查询语句,查询出来的结果完全相同。
SELECT * FROM t_accounts WHERE account= "xiaoning"
SELECT * FROM t_accounts WHERE account= "XiaoNing"
SELECT * FROM t_accounts WHERE account= "xiaoning "
分析:
1)MySQL对CHAR或VARCHAR类型的值进行比较(=)时,会忽略字符串中英文字母的大小写以及尾部的空格
2)对CHAR和VARCHAR类型的值进行LIKE查询时,会忽略英文字母的大小写,但是不会忽略字符串尾部的空格
解决方案:
SELECT * FROM t_accounts WHERE account= BINARY "xiaoning" 或 SELECT * FROM t_accounts WHERE BINARY account= "xiaoning"
SELECT * FROM t_accounts WHERE account= BINARY "XiaoNing" 或 SELECT * FROM t_accounts WHERE BINARY account= "XiaoNing"
SELECT * FROM t_accounts WHERE account= BINARY "xiaoning " 或 SELECT * FROM t_accounts WHERE BINARY account= "xiaoning "
说明:
1>BINARY不是函数,是类型转换运算符
2>BINARY强制将后面的字符串转换为一个二进制的字符串,可以理解为在字符串比较的时候区分英文字母的大小写以及空格,即精确匹配。
2)对varchar类型的字段和数字进行比较时,mysql会把varchar转换为数字:
举例:
当varchar类型字段的首字符为非数字时(eg:asdf),该字段会被转换为数字0;
当varchar类型字段的首字符为数字0时(eg:0abcd),该字段会被转换为数字0;
eg:varchar类型字段=0 只能排除首字符为非数字0的字符串
同理:varchar类型字段=1 只能排除首字符为非数字1的字符串
3)在MySQL客户端中查看MySQL的安装目录:
SELECT @@basedir AS MySqlDir FROM DUAL
4)MySQL中存储超长字符串:
MySQL中字段的类型设为:MEDIUMTEXT
Mybatis中对应的类型为:JdbcType.LONGVARCHAR
其它:
replace into语句:
原理:
replace into语句首先会判断表中是否已经存在该行数据(根据主键或唯一索引来判断),如果该行数据已存在,则删除已存在的该行数据并插入新的数据;如果该行数据不存在,则直接将数据插入。
注意:
插入数据的表必须有主键或唯一索引,否则replace into语句会直接将数据插入到表中,从而可能导致表中出现重复的数据。
如果要插入的数据已存在,那么,replace into语句的返回值为2 (受影响的行数为2)
举例:
DDL:
CREATE TABLE `t_site_id` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`unique_column` varchar(1) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_column` (`unique_column`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
说明:
1>t_site_id表有两列:id、unique_column,表中只有一条数据:id=1,unique_column="a"
2>执行:replace into t_site_id set unique_column="a" 后,表中的数据变成了:id=2,unique_column="a"
3>在mybatis中执行replace into语句后,可以使用@SelectKey注解来获取到自增后最新的id,从而我们可以获取到一个全局唯一(且递增)的id。
代码:
@Insert({"replace into t_site_id set unique_column='a'" })
@SelectKey(before = false, keyProperty = "id", resultType = Long.class, statementType = StatementType.STATEMENT, statement = "SELECT LAST_INSERT_ID() ")
public Long getNewSiteId(ReqAddSite req);
“MySQL中常见的函数以及常见的问题汇总”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云数据库 MySQL」免部署即开即用,比自行安装部署数据库高出1倍以上的性能,双节点冗余防止单节点故障,数据自动定期备份随时恢复。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/1399755/blog/1839057