show variables like ‘max_allowed_packet’ 表示客户端请求数据库数据包的大小
SHOW VARIABLES LIKE ‘%max_length_for_sort_data%’; 排序查询的数据最大值
1.字符串函数
ASCII(str)返回字符串第一个字符的ascii的值(str是 空串返回0)
SELECT ASCII(‘2’);
bin(n)将n转成二进制并以字符串返回
SELECT BIN(2);
oct(n)将n转成八进制并以字符串返回
SELECT OCT(12);
hex(n)将n转成十六进制并以字符串返回
SELECT HEX(255);
char(n,…)返回参数n对应的ascii码组成的字符串(n是数字,null被跳过)
SELECT CHAR(77,121,83,81,76,NULL);
结果MySQL
concat(str1,…,strn)连接字符串(有一个为null,结果就是null)
select concat(1, ‘a’,3);
length(str)返回字符串长度(按字节统计的)
SELECT LENGTH(‘acv’);
select char_length(‘张3’);
结果4
char_length(str)返回字符串长度(按字符统计的)
select char_length(‘张3’);
结果2
position(substr in str)返回子串第一次出现的位置,没有返回0
SELECT POSITION(‘a’ IN ‘bca’);
结果3
locate(substr, str, pos)返回子串在字符串str第pos个位置起第一次出现的位置,没有返回0
SELECT LOCATE(‘a’,‘bacacd’,2);
结果2
instr(str, substr)返回字符串substr在str第一次出现的位置,没有返回0
SELECT INSTR(‘abcd’,‘c’);
结果3
lpad(str, len, lpad)用lpad填充字符串str左端直到长度为len并返回
SELECT LPAD(‘张三1’, 10, ‘a’);
结果aaaaaaa张三1
rpad(str, len, rpad)用rpad填充字符串str右端直到长度为len并返回
select rpad(‘张三1’, 10, ‘a’);
结果张三1aaaaaaa
left(str, len)返回字符串左端的len个字符
SELECT LEFT(‘abcdef’, 3);
结果abc
right(str, len)返回字符串右端的len个字符
SELECT RIGHT(‘abcdef’, 3);
结果def
substr(str, pos, len) 返回字符串str在位置pos起的len个字符
SELECT SUBSTR(‘zhangsan’, 2, 3);
结果han
substr(str, pos)返回字符串str从pos起的一个子串
select substr(‘zhangsan’, 2);
结果hangsan
substring_index(str, delim, count)返回字符串str第count个分隔符delim之后的子串,count为正数返回左端,为负数返回右端
select substring_index(‘www.qidian.com’, ‘.’,2);
结果www.qidian
SELECT SUBSTRING_INDEX(‘www.qidian.com’, ‘.’,-1);
结果com
ltrim(str)删除左空格的字符串
SELECT LTRIM(’ abc’);
rtrim(str)删除右空格的字符串
SELECT RTRIM('abc ');
trim([[both | leading | trailing] [remstr] from] str)
返回前缀或后缀remstr被删除了的字符串str(位置参数默认both,remstr默认值为空格)
select trim(’ abc ');
结果abc
SELECT TRIM(TRAILING ‘abc’ FROM ‘abcd张3abc’);
结果abcd张3
space(n)返回有n个空格组成的字符串
replace(str, from_str, to_str)用to_str替代from_str,并返回
SELECT REPLACE(‘abcabca’, ‘a’,‘3’);
结果3bc3bc3
repeat(str,count)返回由count个str组成的字符串
select repeat(‘ab’, 3);
结果ababab
reverse(str)颠倒str顺序并返回
SELECT REVERSE(‘abc’);
结果cba
insert(str, pos, len, newstr)字符串str位置pos起len长度的字符串替换成newstr
SELECT INSERT(‘abcdef’, 2, 3,‘李四’);
结果 a李四ef
lower(str)返回小写的字符串
select lower(‘ABc’);
结果: abc
upper(str)返回大写字符串
SELECT UPPER(‘ABc’);
结果: ABC
2.数学函数
abs(n) 返回n的绝对值
SELECT ABS(-2);
结果2
sign(n) 返回参数的符号(-1, 0 , 1)
SELECT SIGN(123);
结果 1
mod(n, m) 取模运算,返回n被m除的余数
SELECT MOD(12,5);
结果 2
floor(n) 返回不大于n的最大整数
select floor(2.2);
结果 2
ceiling(n) 返回不小于n的最小整数
SELECT CEILING(2.3);
结果 3
round(n, d) 四舍五入,保留d位小数
select round(2.375,2);
结果 2.38
exp(n) 返回e的n次方(自然对数的底)
log(n) 返回n的自然对数
log10(n) 返回以10为底的对数
pow(x, y) 返回x的y次幂
SELECT POW(2,3);
结果 8
sqrt(n) 返回非负数n的平方根
select sqrt(4);
结果 2
pi() 返回圆周率
select pi();
cos(n) 返回n的余弦值
sin(n) 返回n的正弦值
rand() 或rand(n)
返回在范围0到1.0内的随机浮点值(可以使用数字n作为初始值)
SELECT RAND();
least(x,y,…)
返回最小值(如果返回值被用在整数(实数或大小敏感字串)上下文或所有参数都是整数(实数或大小敏感字串)则他们作为整数(实数或大小敏感字串)比较,否则按忽略大小写的字符串被比较)
select least(2,0);
结果 0
greatest(x,y,…) 返回最大值(其余同least())
SELECT GREATEST(2,0);
结果 2
3.时间函数
dayofweek(date) 返回日期date是星期几(1=星期天,2=星期一,……7=星期六)
SELECT DAYOFWEEK(NOW());
weekday(date) 返回日期date是星期几(0=星期一,1=星期二,……6= 星期天)
SELECT WEEKDAY(NOW());
dayofmonth(date) 返回date是一月中的第几日(在1到31范围内)
SELECT DAYOFMONTH(NOW());
dayofyear(date) 返回date是一年中的第几日(在1到366范围内)
SELECT DAYOFYEAR(NOW());
month(date) 返回date中的月份数值
SELECT MONTH(NOW());
dayname(date) 返回date是星期几(英文名)
SELECT DAYNAME(NOW());
monthname(date) 返回date是几月(按英文名返回)
SELECT MONTHNAME(NOW());
quarter(date) 返回date是一年的第几个季度
SELECT QUARTER(NOW());
week(date,first) 返回date是一年的第几周(first默认值0,first取值1表示周一是
周的开始,0从周日开始)
year(date) 返回date的年份(范围在1000到9999)
SELECT YEAR(NOW());
hour(time) 返回time的小时数(范围是0到23)
minute(time) 返回time的分钟数(范围是0到59)
second(time) 返回time的秒数(范围是0到59)
period_add(p,n) 增加n个月到时期p并返回(p的格式yymm或yyyymm)
SELECT PERIOD_ADD(199802,2);
结果 199804
period_diff(p1,p2) 返回在时期p1和p2之间月数(p1和p2的格式yymm或yyyymm)
SELECT PERIOD_DIFF(199802,199910);
结果 -20
to_days(date) 返回日期date是西元0年至今多少天(不计算1582年以前)
from_days(n) 给出西元0年至今多少天返回date值(不计算1582年以前)
date_format(date,format) 根据format字符串格式化date值
%S, %s 两位数字形式的秒( 00,01, . . ., 59)
%i 两位数字形式的分( 00,01, . . ., 59)
%H 两位数字形式的小时,24 小时(00,01, . . ., 23)
%h, %I 两位数字形式的小时,12 小时(01,02, . . ., 12)
%k 数字形式的小时,24 小时(0,1, . . ., 23)
%l 数字形式的小时,12 小时(1, 2, . . ., 12)
%T 24 小时的时间形式(hh : mm : s s)
%r 12 小时的时间形式(hh:mm:ss AM 或hh:mm:ss PM)
%p AM 或P M
%W 一周中每一天的名称( Sunday, Monday, . . ., Saturday)
%a 一周中每一天名称的缩写( Sun, Mon, . . ., Sat)
%d 两位数字表示月中的天数( 00, 01, . . ., 31)
%e 数字形式表示月中的天数( 1, 2, . . ., 31)
%D 英文后缀表示月中的天数( 1st, 2nd, 3rd, . . .)
%w 以数字形式表示周中的天数( 0 = Sunday, 1=Monday, . . ., 6=Saturday)
%j 以三位数字表示年中的天数( 001, 002, . . ., 366)
% U 周(0, 1, 52),其中Sunday 为周中的第一天
%u 周(0, 1, 52),其中Monday 为周中的第一天
%M 月名(January, February, . . ., December)
%b 缩写的月名( January, February, . . ., December)
%m 两位数字表示的月份( 01, 02, . . ., 12)
%c 数字表示的月份( 1, 2, . . ., 12)
%Y 四位数字表示的年份
%y 两位数字表示的年份
%% 直接值“%”
select date_format(now(),’%Y-%m-%d %H:%i:%s’);
结果 2018-10-31 11:09:24
time_format(time,format) 和date_format()类似,但time_format只处理小时、分钟和秒(其
余符号产生一个null值或0)
SELECT TIME_FORMAT(NOW(),’%Y-%m-%d %H:%i:%s’);
结果 0000-00-00 11:10:29
curdate() 或current_date() 以’yyyy-mm-dd’或yyyymmdd格式返回当前日期值(根据返回值所处上下文是字符串或数字)
SELECT CURDATE();
curtime() 或current_time() 以’hh:mm:ss’或hhmmss格式返回当前时间值(根据返回值所处上下文是字符串或数字)
now() 以’yyyy-mm-dd hh:mm:ss’或yyyymmddhhmmss格式返回当前日期
时间(根据返回值所处上下文是字符串或数字)
unix_timestamp() 或unix_timestamp(date)
返回一个unix时间戳(从’1970-01-01 00:00:00’gmt开始的秒数,date默认值为当前时间)
SELECT UNIX_TIMESTAMP();
结果 1540955618
from_unixtime(unix_timestamp) 以’yyyy-mm-dd hh:mm:ss’或yyyymmddhhmmss格式返回时间戳的值(根据返回值所处上下文是字符串或数字)
SELECT FROM_UNIXTIME(1540955618);
结果 2018-10-31 11:13:38
sec_to_time(seconds) 以’hh:mm:ss’或hhmmss格式返回秒数转成的time值(根据返回值所处上下文是字符串或数字)
time_to_sec(time) 返回time值有多少秒
str_to_date() 将字符串转换成日期
select str_to_date(‘1999-09-13 13:32:33’, ‘%Y-%m-%d %H:%i:%s’);
结果 1999-09-13 13:32:33
DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔, type 参数可以是下列值MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR);
结果 2018-10-31 17:45:26
DATE_SUB(date,INTERVAL expr type) 日期减少,同date_add参数
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);
结果 2018-10-31 15:46:59
4.控制流程函数
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
在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL
SELECT CASE 11 WHEN 1 THEN ‘one’
WHEN 2 THEN ‘two’ ELSE ‘more’ END;
结果 more
IF(expr1,expr2,expr3) 如果 expr1 是TRUE,则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值
SELECT IF(TRUE, 1, 2);
结果 1
STRCMP(expr1,expr2) 如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1
SELECT STRCMP(‘abc’,‘def’);
结果 -1
IFNULL(expr1,expr2) 假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串
SELECT IFNULL(NULL,‘def’);
结果 def
NULLIF(expr1,expr2) 如果expr1 = expr2成立,那么返回值为NULL,否则返回值为expr1
SELECT NULLIF(‘def’,‘def’);
结果 null
SELECT NULLIF(‘def’,‘bcd’);
结果 def
5.系统函数
VERSION()函数返回数据库的版本号
CONNECTION_ID() 函数返回服务器的连接数,也就是到现在为止MySQL服务的连接次数
DATABASE()和SCHEMA()返回当前数据库名。
USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()和CURRENT_USER这几个函数可以返回当前用户的名称
CHARSET(str)函数返回字符串str的字符集,一般情况这个字符集就是系统的默认字符集;COLLATION(str)函数返回字符串str的字符排列方式
LAST_INSERT_ID()函数返回最后生成的AUTO_INCREMENT值
6.加密函数
加密函数PASSWORD(str)
SELECT PASSWORD(‘123’);
结果 *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
加密函数MD5(str)
SELECT MD5(‘123’);
结果 202cb962ac59075b964b07152d234b70
ENCODE(str,pswd_str)函数可以使用字符串pswd_str来加密字符串str。加密的结果是一个二进制数,必须使用BLOB类型的字段来保存它。
DECODE(crypt_str,pswd_str)函数可以使用字符串pswd_str来为crypt_str解密。crypt_str是通过ENCODE(str,pswd_str)加密后的二进制数据。
7.其他函数
格式化函数FORMAT(x,n) 将数字x进行格式化,将x保留到小数点后n位,这个过程需要进行四舍五入
SELECT FORMAT(5.34, 1);
结果 5.3
INET_ATON(IP)函数可以将IP地址转换为数字表示;INET_NTOA(n)函数可以将数字n转换成IP的形式。其中,INET_ATON(IP)函数中IP值需要加上引号。这两个函数互为反函数
SELECT INET_ATON(‘192.168.0.1’);
结果 3232235521
SELECT INET_NTOA(3232235521);
结果 192.168.0.1
GET_LOCT(name,time)函数定义一个名称为nam、持续时间长度为time秒的锁。如果锁定成功,返回1;如果尝试超时,返回0;如果遇到错误,返回NULL。RELEASE_LOCK(name)函数解除名称为name的锁。如果解锁成功,返回1;如果尝试超时,返回0;如果解锁失败,返回NULL;IS_FREE_LOCK(name)函数判断是否使用名为name的锁。如果使用,返回0;否则,返回1
BENCHMARK(count,expr)函数将表达式expr重复执行count次,然后返回执行时间。该函数可以用来判断MySQL处理表达式的速度
CONVERT(s USING cs)函数将字符串s的字符集变成cs
select convert(‘abc张’ using gbk);
CAST(x AS type)和CONVERT(x,type)这两个函数将x变成type类型。这两个函数只对BINARY、CHAR、DATE、DATETIME、TIME、SIGNED INTEGER、UNSIGNED INTEGER这些类型起作用。但两种方法只是改变了输出值的数据类型,并没有改变表中字段的类型
select cast(5.678 as decimal(6,2));
结果 5.68
SELECT CONVERT(6.432, DECIMAL(4,2));
结果 6.43