mysql5.7内置函数和操作

本文最后更新于:2023年12月5日 晚上

表达式求值中的类型转换

CONCAT() 隐式转换

CONCAT()的参数为string类型,所以如果传入其他类型,会被隐式转换。

mysql> SELECT 1+'1';
        -> 2
mysql> SELECT CONCAT(2,' test');
        -> '2 test'

如果想显式转换,请使用 CAST

mysql> SELECT 38.8, CAST(38.8 AS CHAR);
        -> 38.8, '38.8'
mysql> SELECT 38.8, CONCAT(38.8);
        -> 38.8, '38.8'

比较操作

  • NULL和任何数据进行对比,都返回NULL,除非使用<=>运算符,<=>相比=,可以对NULL进行比较,两个NULL使用<=>比较,返回true。
  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
  • 如果两个参数都是整数,则将它们作为整数进行比较。
  • 十六进制如果不与数字进行比较,则将十六进制值视为二进制字符串。
  • 关于时间的比较需要将timestamp或datetime转成时间戳,但是我们约定:时间统统存储时间戳,避免比较时间的转换问题。
  • 如果其中一个参数是 decimal 类型,则比较依赖于另一个参数。如果另一个参数是 decimal 或 integer ,则将这些参数作为 decimal 进行比较; 如果另一个参数是浮点值,则将其作为浮点值进行比较。
  • 除了以上情况,所有其他情况下,参数都作为浮点数(双精度)进行比较。例如,字符串和数值操作数的比较是作为浮点数的比较进行的。

字符串与数字的比较

  • 对于字符串与数字的比较,如果字符串上有索引,索引会失效,例如下例中,很多不同的字符串都可以转换为1,例如“1“、” 1“或者”1a“

    SELECT * FROM tbl_name WHERE str_col=1;
  • 对于大数字符串和大数之间的比较,应该要把大数转成字符串再进行比较

  • 对于浮点数字符串和浮点数的比较,应该要把浮点数转成字符串再进行比较

浮点数之间比较

浮点数之间比较,不能用=直接对比,应该先设置一个可接受的公差,例如同意精度在万分之一(0.0001)以内,它俩相等,那么ABS(a - b) < 0.0001就认为a和b相等,同理:a - b > 0.0001 可以认为a > b,b - a > 0.0001 可以认为a < b

运算符

Name Description Introduced
& Bitwise AND
> Greater than operator
>> Right shift
>= Greater than or equal operator
< Less than operator
<>, != Not equal operator
<< Left shift
<= Less than or equal operator
<=> NULL-safe equal to operator
%, MOD Modulo operator
* Multiplication operator
+ Addition operator
- Minus operator
- Change the sign of the argument
-> Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT().
->> Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). 5.7.13
/ Division operator
:= Assign a value
= Assign a value (as part of a SET statement, or as part of the SET clause in an UPDATE statement)
= Equal operator
^ Bitwise XOR
AND, && Logical AND
BETWEEN ... AND ... Whether a value is within a range of values
BINARY Cast a string to a binary string
CASE Case operator
DIV Integer division
IN() Whether a value is within a set of values
IS Test a value against a boolean
IS NOT Test a value against a boolean
IS NOT NULL NOT NULL value test
IS NULL NULL value test
LIKE Simple pattern matching
NOT, ! Negates value
NOT BETWEEN ... AND ... Whether a value is not within a range of values
NOT IN() Whether a value is not within a set of values
NOT LIKE Negation of simple pattern matching
NOT REGEXP Negation of REGEXP
[OR, ` `](https://dev.mysql.com/doc/refman/5.7/en/logical-operators.html#operator_or)
REGEXP Whether string matches regular expression
RLIKE Whether string matches regular expression
SOUNDS LIKE Compare sounds
XOR Logical XOR
[` `](https://dev.mysql.com/doc/refman/5.7/en/bit-functions.html#operator_bitwise-or) Bitwise OR
~ Bitwise inversion

运算符优先级

以下列表中,从上到下,优先级从高到低。一行中的运算符具有相同的优先级。

INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
AND, &&
XOR
OR, ||
= (assignment), :=

= 的优先级取决于它是用作 比较 还是 赋值

记不住优先级没关系,会用括号就行。

比较函数和运算符

Name Description
> 大于
>= 大于等于
< 小于
<>, != 不等于
<= 小于等于
<=> 不等于,相比=,<=>可以用于比较NULL
= 等于
BETWEEN ... AND ... 值是否在值的范围内
NOT BETWEEN ... AND ...
COALESCE() 返回第一个非 NULL 参数
GREATEST() 返回最大的参数
IN() 判断值在一组值中
NOT IN()
INTERVAL() INTERVAL(N,N1,N2,N3,……….) N是要判断的数值,N1,N2,N3,…是分段的间隔。返回值是段的位置,区间前闭后开
IS 测试值为 TRUE/FALSE/UNKNOW
IS NOT
IS NULL 测试值为NULL
IS NOT NULL
ISNULL() IS NULL
LEAST() 返回最小的参数
LIKE 简单的正则匹配
NOT LIKE
STRCMP() 比较两个字符串

INTERVAL(N,N1,N2,N3,…)

mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);  // 17 <= 23 < 30,1和15之间返回1,15和17之间返回2,17和30之间返回3
        -> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);   // 10 <= 10 < 100,区间前闭后开
        -> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);   // 22 < 23
        -> 0

IS bool_value

mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
        -> 1, 1, 1

LEAST(value1,value2,…)

mysql> SELECT LEAST(2,0);
        -> 0
mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
        -> 3.0
mysql> SELECT LEAST('B','A','C');
        -> 'A'
  • 如果参数中有 NULL,则直接返回 NULL
  • 如果参数是数字和字符串,则将他们作为数字进行比较
  • 如果参数都是字符串,则按照二进制字符串进行比较

expr LIKE pattern

如果expr或pattern为NULL,则结果为NULL

在pattern中,可以使用以下两个通配符:

  • %:匹配任意数量的字符,甚至零个字符
  • _:匹配一个字符

转义符是 \

LIKE匹配字符串不区分大小写,除非expr或者pattern区分大小写(使用区分大小写的排序规则或二进制字符串):

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE _latin1 'ABC' COLLATE latin1_general_cs;
        -> 0
mysql> SELECT 'abc' LIKE _latin1 'ABC' COLLATE latin1_bin;
        -> 0
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0

作为标准 SQL 的扩展,MySQL 允许在数值表达式上使用 LIKE:

mysql> SELECT 10 LIKE '1%';
        -> 1

STRCMP(expr1,expr2)

如果字符串相同,返回0,如果根据当前排序顺序,第一个参数小于第二个参数,返回 -1;否则返回1

mysql> SELECT STRCMP('text', 'text2');
        -> -1
mysql> SELECT STRCMP('text2', 'text');
        -> 1
mysql> SELECT STRCMP('text', 'text');
        -> 0

逻辑运算符

Name Description
AND, && 逻辑与
NOT, !
OR, `
XOR 逻辑异或

在 SQL 中,所有逻辑运算符的计算结果为 TRUE、 FALSE 或 NULL (UNKNOWN)。在 MySQL 中,它们被实现为1(TRUE)、0(FALSE)和 NULL。

MySQL 将任何非零、非 NULL 值计算为 TRUE:

mysql> SELECT 10 IS TRUE;
-> 1
mysql> SELECT -10 IS TRUE;
-> 1
mysql> SELECT 'string' IS NOT NULL;
-> 1

NOT

mysql> SELECT NOT 10;
        -> 0
mysql> SELECT NOT 0;
        -> 1
mysql> SELECT NOT NULL;
        -> NULL
mysql> SELECT ! (1+1);
        -> 0
mysql> SELECT ! 1+1;
        -> 1

AND,&&

mysql> SELECT 1 AND 1;
        -> 1
mysql> SELECT 1 AND 0;
        -> 0
mysql> SELECT 1 AND NULL;
        -> NULL
mysql> SELECT 0 AND NULL;
        -> 0
mysql> SELECT NULL AND 0;
        -> 0

OR,||

mysql> SELECT 1 OR 1;
        -> 1
mysql> SELECT 1 OR 0;
        -> 1
mysql> SELECT 0 OR 0;
        -> 0
mysql> SELECT 0 OR NULL;
        -> NULL
mysql> SELECT 1 OR NULL;
        -> 1

XOR

mysql> SELECT 1 XOR 1;
        -> 0
mysql> SELECT 1 XOR 0;
        -> 1
mysql> SELECT 1 XOR NULL;
        -> NULL
mysql> SELECT 1 XOR 1 XOR 1;
        -> 1

分配运算符 :=

= 不同,:= 运算符从不被解释为比较运算符

流程控制

Name Description
CASE Case operator
IF() If/else construct
IFNULL() Null if/else construct
NULLIF() Return NULL if expr1 = expr2

CASE

CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END

CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
    ->     WHEN 2 THEN 'two' ELSE 'more' END;
        -> 'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
        -> 'true'
mysql> SELECT CASE BINARY 'B'
    ->     WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
        -> NULL

IF(expr1,expr2,expr3)

mysql> SELECT IF(1>2,2,3);
        -> 3
mysql> SELECT IF(1<2,'yes','no');
        -> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
        -> 'no'

IFNULL(expr1,expr2)

如果 expr1不为 NULL,则 IFNULL ()返回 expr1; 否则返回 expr2

mysql> SELECT IFNULL(1,0);
        -> 1
mysql> SELECT IFNULL(NULL,10);
        -> 10
mysql> SELECT IFNULL(1/0,10);
        -> 10
mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'

NULLIF(expr1,expr2)

如果 expr1 = expr2为 true,则返回 NULL,否则返回 expr1。这与 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END 相同。

mysql> SELECT NULLIF(1,1);
        -> NULL
mysql> SELECT NULLIF(1,2);
        -> 1

注意:如果参数不相等,MySQL 将计算 expr1两次

数值函数和运算符(Numeric)

算术运算符

Name Description
%, MOD 取余
*
+
-
/
DIV 整数除法,结果向下取整

数学函数

常用的数学函数如下:

Name 姓名 Description 描述
ABS() 返回绝对值
CEIL() 返回不小于参数的最小整数值
CEILING() CEIL()
CONV() 进制转换,返回字符串
FLOOR() 向下取整,注意负数,示例:1.23向下取整是1、-1.23向下取整是-2
MOD() 返回余数
POW() 求幂
POWER() POW()
RAND() Return a random floating-point value 返回一个随机浮点值
ROUND() 四舍五入
SIGN() 根据 X 是否为负、0或正,返回参数的符号 -1、0或1
TRUNCATE() 截断到指定的小数位数,区别与ROUND()

CONV(N,from_base,to_base)

N是待转换的数字,from_base是N当前的进制,to_base是N要输出的进制。

mysql> SELECT CONV(2,10,2);   // 将10进制中的2转换为2进制输出
  -> '10'

mysql> SELECT CONV('a',16,2);  // 16进制中,a是10
        -> '1010'
mysql> SELECT CONV('6E',18,8);
        -> '172'
mysql> SELECT CONV(-17,10,-18);
        -> '-H'
mysql> SELECT CONV(10+'10'+'10'+X'0a',10,10);
        -> '40'

POW(X,Y)

mysql> SELECT POW(2,3);
        -> 8
mysql> SELECT POW(2,-2);
        -> 0.25

ROUND(X), ROUND(X,D)

将参数 X 四舍五入到小数位 D,D默认是0,D可以为负,D绝对值最大30:

mysql> SELECT ROUND(-1.23);
        -> -1
mysql> SELECT ROUND(-1.58);
        -> -2
mysql> SELECT ROUND(1.58);
        -> 2
mysql> SELECT ROUND(1.298, 1);
        -> 1.3
mysql> SELECT ROUND(1.298, 0);
        -> 1
mysql> SELECT ROUND(23.298, -1);
        -> 20
mysql> SELECT ROUND(.12345678901234567890123456789012345, 35);
        -> 0.123456789012345678901234567890

SIGN(X)

mysql> SELECT SIGN(-32);
        -> -1
mysql> SELECT SIGN(0);
        -> 0
mysql> SELECT SIGN(234);
        -> 1

TRUNCATE(X,D)

mysql> SELECT TRUNCATE(1.223,1);
        -> 1.2
mysql> SELECT TRUNCATE(1.999,1);
        -> 1.9
mysql> SELECT TRUNCATE(1.999,0);
        -> 1
mysql> SELECT TRUNCATE(-1.999,1);
        -> -1.9
mysql> SELECT TRUNCATE(122,-2);
       -> 100
mysql> SELECT TRUNCATE(10.28*100,0);
       -> 1028

日期和时间函数

INTERVAL 运算符

INTERVAL 运算符表示时间间隔,用法如下:

INTERVAL expr unit

exprunit的对应关系

unit expr 示例
MICROSECOND MICROSECONDS
SECOND SECONDS INTERVAL 1 SECOND
MINUTE MINUTES
HOUR HOURS
DAY DAYS INTERVAL 1 DAY
WEEK WEEKS
MONTH MONTHS
QUARTER QUARTERS
YEAR YEARS INTERVAL 1 YEAR
SECOND_MICROSECOND 'SECONDS.MICROSECONDS' INTERVAL '1.999999' SECOND_MICROSECOND
MINUTE_MICROSECOND 'MINUTES:SECONDS.MICROSECONDS'
MINUTE_SECOND 'MINUTES:SECONDS' INTERVAL '1:1' MINUTE_SECOND
HOUR_MICROSECOND 'HOURS:MINUTES:SECONDS.MICROSECONDS'
HOUR_SECOND 'HOURS:MINUTES:SECONDS'
HOUR_MINUTE 'HOURS:MINUTES'
DAY_MICROSECOND 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS'
DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS' INTERVAL '1 1:1:1' DAY_SECOND
DAY_MINUTE 'DAYS HOURS:MINUTES'
DAY_HOUR 'DAYS HOURS' INTERVAL '-1 10' DAY_HOUR
YEAR_MONTH 'YEARS-MONTHS'

注意:

  • expr中可以使用任意分割符,上表中主要以:为例演示。
  • expr 被视为一个字符串,所以当expr为非字符串时要小心。以HOUR _ MINUTE为例:’6/4‘ 被视为6小时4分钟,而6/4会先计算得1.5000,然后被视作‘1.5000’,也就是1小时5000分钟。
    • 如果确实想要6/4表示1.5小时,可以将结果转一下,例如:INTERVAL CAST(6/4 AS DECIMAL(3,1)) HOUR_MINUTE

用途

  • 某些函数,如 DATE ADD ()、 DATE SUB ()、EXTRACT()

    mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);
            -> '2018-05-02'
    mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR);
            -> '2017-05-01'
    mysql> SELECT EXTRACT(YEAR FROM '2019-07-02');
            -> 2019
  • +/-运算

    date + INTERVAL expr unit
    date - INTERVAL expr unit
    mysql> SELECT '2018-12-31 23:59:59' + INTERVAL 1 SECOND;
            -> '2019-01-01 00:00:00'
    mysql> SELECT INTERVAL 1 DAY + '2018-12-31';
            -> '2019-01-01'
    mysql> SELECT '2025-01-01' - INTERVAL 1 SECOND;
            -> '2024-12-31 23:59:59'

    注:对于-运算,INTERVAL expr 只允许在右边,因为从一个间隔中减去一个日期或日期时间值是没有意义的。

日期和时间函数

Name 姓名 Description 描述
DATE_ADD() date 加 time
DATE_SUB() date 减 time
ADDDATE() 当用三个参数调用时,同DATE_ADD()
SUBDATE() 当用三个参数调用时,同DATE_SUB()
ADDTIME() time 或 datetime 加 time
TIMESTAMPADD() 向 datetime 表达式添加间隔
SUBTIME() time 或 datetime 减 time
CONVERT_TZ() 转换日期的时区
CURDATE() 返回当前日期,返回 YYYY-MM-DD'YYYYMMDD 格式
CURRENT_DATE(), CURRENT_DATE CURDATE()
CURTIME() 返回当前时间,返回 'hh:mm:ss' or hhmmss 格式
CURRENT_TIME(), CURRENT_TIME CURTIME()
NOW() 返回当前日期和时间,返回 'YYYY-MM-DD hh:mm:ss'YYYYMMDDhhmmss 格式
LOCALTIME(), LOCALTIME NOW()
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP NOW()
LOCALTIMESTAMP, LOCALTIMESTAMP() NOW()
DATE() 提取 date 或 datetime 表达式的 date 部分
DATE_FORMAT() 格式化日期
TIME_FORMAT() DATE_FORMAT()类似,但format只包含小时、分钟、秒和微秒的格式说明符。其他说明符产生 NULL 值或0。
DATEDIFF() 两个日期相减,返回差的天数
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) datetime expr2 - datetime expr1
TIMEDIFF() expr1-expr2,返回的结果限制在 TIME 值允许的范围内
DAYOFMONTH() 返回月份的日期(0-31)
DAY() DAYOFMONTH()
DAYOFWEEK() 返回一周中的第几天,1对应周日,7对应周六
DAYOFYEAR() 返回一年当中的第几天(1-366)
EXTRACT() 提取日期的一部分
TIME() 提取传递的表达式的时间部分
FROM_DAYS() 给定一个天数 N,返回一个 DATE 值。它不适用于公历(1582)出现之前的值
FROM_UNIXTIME() 将 Unix 时间戳格式化为日期
GET_FORMAT() 返回日期格式字符串
HOUR() 提取小时
LAST_DAY() 返回日期所在月最后一天
MAKEDATE() 从一年中的某一天创建一个日期
MAKETIME() 从小时、分钟、秒开始创建时间
MICROSECOND() 返回参数中的微秒
MINUTE() 返回参数的分钟
MONTH() 返回日期的月份,范围为1至12
PERIOD_DIFF() 返回两个期间之间的月数
QUARTER() 返回日期所在的季度,范围在1到4之间
SEC_TO_TIME() 将秒数转换为‘ hh: mm: ss’格式
TIME_TO_SEC() time转换为秒
SECOND() 返回秒(0-59)
STR_TO_DATE() 将字符串转换为日期
SYSDATE() 返回SYSDATE()函数开始执行的时间
TIMESTAMP() 对于单个参数,此函数返回 date 或 datetime 表达式; 对于两个参数,返回参数之和
TO_DAYS() Return the date argument converted to days 返回转换为天数的日期参数
TO_SECONDS() Return the date or datetime argument converted to seconds since Year 0 返回自0年以来转换为秒的日期或日期时间参数
UNIX_TIMESTAMP() 返回一个 Unix 时间戳
UTC_DATE() Return the current UTC date 返回当前的 UTC 日期
UTC_TIME() Return the current UTC time 返回当前的 UTC 时间
UTC_TIMESTAMP() Return the current UTC date and time 返回当前的 UTC 日期和时间
WEEK() Return the week number 返回星期号码
WEEKDAY() Return the weekday index 返回工作日索引
WEEKOFYEAR() Return the calendar week of the date (1-53) 返回日期的日历周(1-53)
YEAR() Return the year 返回年份
YEARWEEK() Return the year and week 返回年份和周数

ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)

以下两种写法等价:

mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY);
        -> '2008-02-02'
        
mysql> SELECT ADDDATE('2008-01-02', 31);
        -> '2008-02-02'

ADDTIME(expr1,expr2)

expr1是time或datetime,expr2是time:

mysql> SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');
        -> '2008-01-02 01:01:01.000001'
mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
        -> '03:00:01.999997'

CURDATE()

以“ YYYY-MM-DD”或 YYYYMMDD 格式返回当前日期值,具体取决于函数是在字符串上下文中使用还是在数字上下文中使用:

mysql> SELECT CURDATE();
        -> '2008-06-13'
mysql> SELECT CURDATE() + 0;
        -> 20080613

DATE(expr)

mysql> SELECT DATE('2003-12-31 01:02:03');
        -> '2003-12-31'

DATE_FORMAT(date,format)

常用format:也适用于其他函数: STR_TO_DATE()TIME_formAT()UNIX_TIMESTAMP()

Specifier Description
%c 月份,数字(0..12)
%d 月份的日期,数字(00..31)
%e 月份的日期,数字(0..31)
%f 微秒(000000..999999)
%H 小时(00..23)
%h 小时(01..12)
%I 小时(01..12)
%i 分钟,数字(00..59)
%j 年份日(001..366)
%k 小时(0..23)
%l 小时(1..12)
%m 月份,数字(00..12)
%S 秒(00..59)
%s 秒(00..59)
%T 时间,24小时(hh:mm:ss)
%w 星期几(0=Sunday.. = 星期天.6=Saturday) = 星期六)
%Y 年,数字,四位数
%y 年份,数字(两位数字)

DATEDIFF(expr1,expr2)

返回以天为单位表示的 expr1 - expr2,计算中只使用expr1和expr2的date的部分,会直接舍弃time的部分。

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
        -> 1
mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
        -> -31

DAYOFMONTH(date)

mysql> SELECT DAYOFMONTH('2007-02-03');
        -> 3

EXTRACT(unit FROM date)

mysql> SELECT EXTRACT(YEAR FROM '2019-07-02');
        -> 2019
mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03');
        -> 201907
mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03');
        -> 20102
mysql> SELECT EXTRACT(MICROSECOND
    ->                FROM '2003-01-02 10:30:00.000123');
        -> 123

FROM_UNIXTIME(unix_timestamp[,format])

mysql> SELECT FROM_UNIXTIME(1447430881);
        -> '2015-11-13 10:08:01'
mysql> SELECT FROM_UNIXTIME(1447430881) + 0;
        -> 20151113100801
mysql> SELECT FROM_UNIXTIME(1447430881,
    ->                      '%Y %D %M %h:%i:%s %x');
        -> '2015 13th November 10:08:01 2015'

GET_FORMAT({DATE|TIME|DATETIME}, {‘EUR’|’USA’|’JIS’|’ISO’|’INTERNAL’})

Function Call 函数调用 Result 结果
GET_FORMAT(DATE,'USA') '%m.%d.%Y'
GET_FORMAT(DATE,'JIS') '%Y-%m-%d'
GET_FORMAT(DATE,'ISO') '%Y-%m-%d'
GET_FORMAT(DATE,'EUR') '%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL') '%Y%m%d'
GET_FORMAT(DATETIME,'USA') '%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'JIS') '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO') '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR') '%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL') '%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA') '%h:%i:%s %p'
GET_FORMAT(TIME,'JIS') '%H:%i:%s'
GET_FORMAT(TIME,'ISO') '%H:%i:%s'
GET_FORMAT(TIME,'EUR') '%H.%i.%s'
GET_FORMAT(TIME,'INTERNAL') '%H%i%s'

HOUR(time)

返回时间的小时。对于时间值,返回值的范围是0到23。但是,TIME 值的范围实际上要大得多,因此 HOUR 可以返回大于23的值:

mysql> SELECT HOUR('10:05:03');
        -> 10
mysql> SELECT HOUR('272:59:59');
        -> 272

LAST_DAY(date)

返回date或datetime所在月最后一天。如果参数无效,返回 NULL:

mysql> SELECT LAST_DAY('2003-02-05');
        -> '2003-02-28'
mysql> SELECT LAST_DAY('2004-02-05');
        -> '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
        -> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
        -> NULL

MAKEDATE(year,dayofyear)

dayofyear 必须大于0,否则返回NULL

mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32);
        -> '2011-01-31', '2011-02-01'
mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365);
        -> '2011-12-31', '2014-12-31'
mysql> SELECT MAKEDATE(2011,0);
        -> NULL

TIMESTAMP(expr), TIMESTAMP(expr1,expr2)

mysql> SELECT TIMESTAMP('2003-12-31');
        -> '2003-12-31 00:00:00'
mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
        -> '2004-01-01 00:00:00'

字符串函数和运算符

强制转换函数和运算符

Name 类型 描述
BINARY 运算符 将expr的字符集(character)转成binary、排序规则(collation)转成binary,注意:只转字符集和排序规则,便于字符串进行比较
CAST() 函数
CONVERT() 函数

BINARY expr

一般情况下,我们将字符集设置为 utf8mb4,排序规则设置为 utf8mb4_general_ci,这种排序规则在使用 = 进行比较的时候不区分大小写,而binary排序规则是区分大小写的

mysql中字符串使用 = 进行比较的时候,会忽略掉尾部的空空格,这符合SQL标准,无需设置也无法更改。利用BINARY将字符串的排序规则转成binary后,尾部的空格就不会忽略了

CAST(expr AS type)

type: []表示可选

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME[(M)]
  • DECIMAL[(M[,D])]
  • JSON
  • NCHAR[(N)]
  • SIGNED [INTEGER]
  • TIME[(M)]
  • UNSIGNED [INTEGER]

CAST(expr, type)CONVERT(expr, type) 同 CAST(expr AS type)

CONVERT(expr USING transcoding_name)

字符集转换

位函数和运算符

加密和压缩函数

略…

信息函数

Name Description
BENCHMARK() Repeatedly execute an expression 重复执行一个表达式
CHARSET() Return the character set of the argument 返回参数的字符集
COERCIBILITY() Return the collation coercibility value of the string argument 返回字符串参数的排序规则强制性值
COLLATION() Return the collation of the string argument 返回字符串参数的排序规则
CONNECTION_ID() Return the connection ID (thread ID) for the connection 返回连接的连接 ID (线程 ID)
CURRENT_USER(), CURRENT_USER The authenticated user name and host name 经过身份验证的用户名和主机名
DATABASE() Return the default (current) database name 返回默认(当前)数据库名称
FOUND_ROWS() For a SELECT with a LIMIT clause, the number of rows that would be returned were there no LIMIT clause 对于带有 LIMIT 子句的 SELECT,如果没有 LIMIT 子句,则返回的行数
LAST_INSERT_ID() Value of the AUTOINCREMENT column for the last INSERT 最后一次 INSERT 的 AUTOINCREMENT 列的值
ROW_COUNT() The number of rows updated 更新的行数
SCHEMA() Synonym for DATABASE() DATABASE ()的同义词
SESSION_USER() Synonym for USER() USER ()的同义词
SYSTEM_USER() Synonym for USER() USER ()的同义词
USER() The user name and host name provided by the client 客户端提供的用户名和主机名
VERSION() Return a string that indicates the MySQL server version 返回指示 MySQL 服务器版本的字符串

json函数

与全局事务标识符(GTID)一起使用的函数

聚合函数

聚合函数通常与 GROUP BY 子句一起使用,以将值分组为子集。

Name 姓名 Description 描述 Introduced 介绍
AVG() Return the average value of the argument 返回参数的平均值
BIT_AND() Return bitwise AND 按位返回 AND
BIT_OR() Return bitwise OR 按位返回 OR
BIT_XOR() Return bitwise XOR 返回按位异或
COUNT() Return a count of the number of rows returned 返回返回行数的计数
COUNT(DISTINCT) Return the count of a number of different values 返回许多不同值的计数
GROUP_CONCAT() Return a concatenated string 返回连接的字符串
JSON_ARRAYAGG() Return result set as a single JSON array 以单个 JSON 数组的形式返回结果集 5.7.22
JSON_OBJECTAGG() Return result set as a single JSON object 将结果集作为单个 JSON 对象返回 5.7.22
MAX() Return the maximum value 返回最大值
MIN() Return the minimum value 返回最小值
STD() Return the population standard deviation 返回人口标准差
STDDEV() Return the population standard deviation 返回人口标准差
STDDEV_POP() Return the population standard deviation 返回人口标准差
STDDEV_SAMP() Return the sample standard deviation 返回样本标准差
SUM() Return the sum 把钱退回去
VAR_POP() Return the population standard variance 返回总体标准方差
VAR_SAMP() Return the sample variance 返回样本方差
VARIANCE() Return the population standard variance 返回总体标准方差

其他函数

Name 姓名 Description 描述
ANY_VALUE() Suppress ONLY_FULL_GROUP_BY value rejection 禁止拒绝 ONLY_ FULL GROUP BY 值
DEFAULT() Return the default value for a table column 返回表列的默认值
INET_ATON() Return the numeric value of an IP address 返回 IP 地址的数值
INET_NTOA() Return the IP address from a numeric value 从数值返回 IP 地址
INET6_ATON() Return the numeric value of an IPv6 address 返回 IPv6地址的数值
INET6_NTOA() Return the IPv6 address from a numeric value 从数值中返回 IPv6地址
IS_IPV4() Whether argument is an IPv4 address 参数是否为 IPv4地址
IS_IPV4_COMPAT() Whether argument is an IPv4-compatible address 参数是否为 IPv4兼容地址
IS_IPV4_MAPPED() Whether argument is an IPv4-mapped address 参数是否为 IPv4映射的地址
IS_IPV6() Whether argument is an IPv6 address 参数是否为 IPv6地址
MASTER_POS_WAIT() Block until the replica has read and applied all updates up to the specified position 块,直到副本读取并应用到指定位置的所有更新
NAME_CONST() Cause the column to have the given name 使列具有给定的名称
SLEEP() Sleep for a number of seconds 睡几秒钟
UUID() Return a Universal Unique Identifier (UUID) 返回通用唯一标识符(UUID)
UUID_SHORT() Return an integer-valued universal identifier 返回整数值通用标识符
VALUES() Define the values to be used during an INSERT 定义在 INSERT 过程中使用的值

精确数学


mysql5.7内置函数和操作
http://blog.lujinkai.cn/运维/MySQL/mysql5.7内置函数和操作/
作者
像方便面一样的男子
发布于
2022年9月24日
更新于
2023年12月5日
许可协议