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)