MySQL常用函数

常用函数

COUNT()加条件

原文链接:Mysql中使用count加条件统计

使用 COUNT() 函数实现条件统计的基础是对于值为 NULL 的记录不计数,常用的有以下三种方式,假设统计 num 大于 200 的记录

1. select count(num > 200 or null) from a;
2. select count(if(num > 200, 1, null)) from a
3. select count(case when num > 200 then 1 end) from a

COUNT()去重加条件

count(DISTINCT case when ss.status = 40 then ss.id end) as leave_total
语法:
count(DISTINCT case when 条件 then  去重的字段 end)
也就是对满足条件的字段再次去重。
 
count 单纯的条件不加去重语法:
count(ss.status = 50 or null) as seats_total
只统计status = 50的

CAST 强转

原文链接:MYSQL中,CAST函数的使用规则

CAST函数语法规则是:Cast(字段名 as 转换的类型 ),其中类型可以为:

CHAR[(N)] 	 	字符型 
DATE 			日期型
DATETIME 		日期和时间型
DECIMAL 	  	float型
SIGNED		  	int
TIME 			时间型

实例:

实例1:

表table1

date:2015-11-03 15:31:26

select cast(date as signed) as date from  table1;
结果如下:

date:20151103153126
select cast(date as char) as date from  table1;
结果如下:

date:2015-11-03 15:31:26
 实例2:

select cast(date as datetime) as date from  table1;
结果如下:

date:2015-11-03 15:31:26
 实例3:

select cast(date as date) as date from  table1;
结果如下:

date:2015-11-03
 实例4:

select cast(date as time) as date from  table1;
结果如下:

date:15:31:26
这里date对应日期,time对应时间

实例5:

表table2

num:20

select cast(num as decimal(10, 2)) as num from table2
结果如下:

num:20.00
解释:decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边.decimal 数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值.其中10是小数点左边和右边的数字个数之和(不包括小数点),2代表小数点右边的小数位数或数字个数.decimal(10,2)可以存储8位整数2位小数的数字.

排序相关

ORDER BY RAND()

对结果集进行随机排序

ORDER BY IF()条件排序

原文链接:MYSQL ORDER BY 使用 if 以及使用 IN

将结果按特定顺序排序,相当于附加一个隐藏属性,满足条件的结果进行相应排序。

test表数据:
+----+------+																					
| id | type |
+----+------+
|  1 |    1 |
|  2 |    1 |
|  3 |    1 |
|  4 |    2 |			
|  5 |    2 |
|  6 |    3 |
|  7 |    3 |
+----+------+

IF:
SELECT * FROM test ORDER BY IF(type=3,0,1);
+----+------+
| id | type |
+----+------+
|  6 |    3 |
|  7 |    3 |
|  1 |    1 |
|  2 |    1 |
|  3 |    1 |
|  4 |    2 |
|  5 |    2 |
+----+------+

IN:
SELECT * FROM ORDER BY type IN(2,3) DESC
+----+------+
| id | type |
+----+------+
|  4 |    2 |
|  5 |    2 |
|  6 |    3 |
|  7 |    3 |
|  1 |    1 |
|  2 |    1 |
|  3 |    1 |
+----+------+

ORDER BY FIELD() 自定义排序

语法:FIELD(str,str1,str2,str3,...),str与str1、str2、str3...比较,返回1、2、3,如遇到null或者不结果集中的数据则返回0,然后根据升序进行排序。

test表数据:
+----+------+																					
| id | type |
+----+------+
|  1 |    1 |
|  2 |    1 |
|  3 |    1 |
|  4 |    2 |			
|  5 |    2 |
|  6 |    3 |
|  7 |    3 |
+----+------+

查询
SELECT * FROM test ORDER BY FIELD(type,3,1,2);// 类型按照给定3-1-2顺序排序
+----+------+
| id | type |
+----+------+
|  6 |    3 |
|  7 |    3 |
|  1 |    1 |
|  2 |    1 |
|  3 |    1 |
|  4 |    2 |
|  5 |    2 |
+----+------+

字符串相关

LOCATE 定位

判断字符串(string)中是否包含另一个字符串(subStr)

locate(subStr,string) :函数返回subStr在string中出现的位置

// 如果字符串 string 包含 subStr
locate(subStr,string) > 0
  
// 如果字符串 string 不包含 subStr
locate(subStr,string) = 0
 
// 返回 3
SELECT LOCATE('q', 'asqdfasdfser')           
 
//返回 8
SELECT LOCATE('q', 'asqdfasqdfser',4)

SUBSTRING_INDEX

原文链接:mysql处理字符串的两个绝招:substring_index,concat

语法:

SUBSTRING_INDEX(str,delim,count)

str:要处理的字符串
delim:分隔符
count:计数

案例:

str=www.google.com

substring_index(str,'.',1)

结果是:www

substring_index(str,'.',2)

结果是:www.google

也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容

相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:

substring_index(str,'.',-2)

结果为:google.com

有人会为,如果我呀中间的的google怎么办?

很简单的,两个方向:

1、从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:

substring_index(substring_index(str,'.',-2),‘.’,1);

FIND_IN_SET()

原文链接:Mysql中find_in_set()函数的使用

语法:

FIND_IN_SET(str,strlist)	

str 要查询的字符串	

strlist 参数以,分隔的字段名 如 (1,2,6,8,10,22)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录

案例:

SELECT FIND_IN_SET('b', 'a,b,c,d'); 结果为2
SELECT FIND_IN_SET('6', '1'); 		返回0  strlist中不存在str,所以返回0

GROUP_CONCAT()

语法:

group_concat([DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )

案例:

test表数据:
+----+------+																					
| id | type |
+----+------+
|  1 |    1 |
|  2 |    1 |
|  3 |    1 |
|  4 |    2 |			
|  5 |    2 |
|  6 |    3 |
|  7 |    3 |
+----+------+

select type, group_concat(id) from test group by type; 
+----+------+																					
|type|  id 	|
+----+------+
|  1 | 1,2,3|
|  2 |  4,5 |
|  3 |  6,7 |
+----+------+

乱码问题

group_concat子查询返回数字是乱码,既不是utf8也不是gbk,后来看了下子表的字段编码是gbk的,但sql整体返回的是utf8,group_concat前把字段转换成utf8的,convert(fieldvale using utf8)

GROUP_CONCAT(DISTINCT CONVERT(srtc.class_id USING utf8)  SEPARATOR '-') AS class_id

LENGTH() / CHAR_LENGTH()

原文链接:java和mysql的length()区别及char_length()

介绍:

mysql里面的有length和char_length两个长度函数,区别在于:

length: 一个汉字是算三个字符,一个数字或字母算一个字符。

char_length: 不管汉字还是数字或者是字母都算是一个字符。

案例:

select length('办公室零食m')  ---> 字节数16
 
select char_length('办公室零食m')  ---> 字符数6

一般判断是否纯英文时:length(str)=char_length(str)

Java中的字节和字符数:

System.out.println("办公室零食m".getBytes("utf-8").length); -->字节数 16
System.out.println("办公室零食m".length()); ---> 字符数 6

时间日期相关

DATEDIFF 日期间隔

DATEDIFF(date1,date2) 返回起始时间 date1 和结束时间 date2 之间的天数。date1 和 date2 为日期或 datetime 表达式。计算时只用到这些值的日期部分。

案例:

SELECT DATEDIFF('2021-01-25','2021-01-20') 返回5

SELECT DATEDIFF('2021-01-20','2021-01-25 23:59:59') 返回-5

CONVERT_TZ() 转换时区

原文链接:MySQL UTC时间转北京时间 | convert_tz()函数

CONVERT_TZ(dt,from_tz,to_tz)

转换datetime值dt,从from_tz时区转到to_tz时区,并返回结果。参数无效返回NULL。

案例:

-- UTC时间转东八区时间
SELECT CONVERT_TZ('2020-05-20 00:00:00','+00:00',"+08:00")
返回:2020-05-20 08:00:00
posted @ 2021-03-25 16:38  halo623  阅读(75)  评论(0编辑  收藏  举报