1. 程式人生 > >Mysql常用的函式及引數

Mysql常用的函式及引數

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