zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    vue中$router和$route的区别
    移动端rem自适应
    如何用Mac自带的QuickTime Player录制视频并制作GIF动图
    vue页面刷新重定向
    JavaScript Functional Programming:声明式与命令式
    配置一个可以使用Vue的History模式的后端服务
    vue使用jsx语法开发
    vue多页面项目配置
    JavaScript的本来面貌之默认结构
    JavaScript的本来面貌之默认值
  • 原文地址:https://www.cnblogs.com/halo623/p/14578096.html
Copyright © 2011-2022 走看看