在程序上,字符串的編號從 0 開始,但在 MySQL 中,從 1 開始。mysql
函數 | 功能 |
---|---|
concat(s1, s2, ..., sn) | 鏈接 s1, s2, ..., sn 爲一個字符串 |
insert(str, x, y, instr) | 將字符串 str 從 x 位置開始,y 個字符長的字串替換爲字符串 instr |
lower(str) | 將字符串 str 中全部字符變爲小寫 |
upper(str) | 將字符串 str 中全部字符變爲大寫 |
lpad(str, n, pad) | 用字符串 pad 對 str 最左邊進行填充,直到長度爲 n 個字符長度 |
rpad(str, n, pad) | 用字符串 pad 對 str 最右邊進行填充,直到長度爲 n 個字符長度 |
repeat(str, x) | 返回 str 重複 x 次的結果 |
replace(str, a, b) | 用字符串 b 替換字符串 str 中全部出現的字符串 a |
strcmp(s1, s2) | 比較字符串 s1 和 s2,s1 比 s2 小,返回 -1;s1 與 s2 相等,返回 0;s1 比 s2 大,返回 1 |
ltrim(str) | 去掉字符串左側的空格 |
rtrim(str) | 去掉字符串右側的空格 |
trim(str) | 去掉字符串 str 行尾和行頭的空格 |
left(str, x) | 返回字符串 str 最左邊的 x 個字符 |
right(str, x) | 返回字符串 str 最右邊的 x 個字符 |
substring(str, x, y) | 返回從字符串 str x 位置起 y 個字符長度的子串 |
示例sql
> select concat('aaa', 'bbb', 'ccc'), concat('aaa', null); +-----------------------------+---------------------+ | concat('aaa', 'bbb', 'ccc') | concat('aaa', null) | +-----------------------------+---------------------+ | aaabbbccc | NULL | +-----------------------------+---------------------+ 1 row in set (0.00 sec) > select insert('beijing2008you', 12, 3, 'me'); +---------------------------------------+ | insert('beijing2008you', 12, 3, 'me') | +---------------------------------------+ | beijing2008me | +---------------------------------------+ 1 row in set (0.00 sec) > select lower('BEIJING2008'), upper('beijing2008'); +----------------------+----------------------+ | lower('BEIJING2008') | upper('beijing2008') | +----------------------+----------------------+ | beijing2008 | BEIJING2008 | +----------------------+----------------------+ 1 row in set (0.00 sec) > select lpad('2008', 20, 'beijing'), rpad('beijing', 20, '2008'); +-----------------------------+-----------------------------+ | lpad('2008', 20, 'beijing') | rpad('beijing', 20, '2008') | +-----------------------------+-----------------------------+ | beijingbeijingbe2008 | beijing2008200820082 | +-----------------------------+-----------------------------+ 1 row in set (0.00 sec) > select repeat('mysql ', 3); +---------------------+ | repeat('mysql ', 3) | +---------------------+ | mysql mysql mysql | +---------------------+ 1 row in set (0.00 sec) > select replace('beijing_2010', '_2010', '2008'); +------------------------------------------+ | replace('beijing_2010', '_2010', '2008') | +------------------------------------------+ | beijing2008 | +------------------------------------------+ 1 row in set (0.00 sec) > select strcmp('a', 'b'), strcmp('b', 'b'), strcmp('c', 'b'); +------------------+------------------+------------------+ | strcmp('a', 'b') | strcmp('b', 'b') | strcmp('c', 'b') | +------------------+------------------+------------------+ | -1 | 0 | 1 | +------------------+------------------+------------------+ 1 row in set (0.00 sec) > select ltrim(' |beijing'), rtrim('beijing| '); +--------------------+--------------------+ | ltrim(' |beijing') | rtrim('beijing| ') | +--------------------+--------------------+ | |beijing | beijing| | +--------------------+--------------------+ 1 row in set (0.00 sec) > select trim(' $ beijing2008 $ '); +---------------------------+ | trim(' $ beijing2008 $ ') | +---------------------------+ | $ beijing2008 $ | +---------------------------+ 1 row in set (0.00 sec) > select left('beijing2008', 7), left('beijing', null), right('beijing2008', 4); +------------------------+-----------------------+-------------------------+ | left('beijing2008', 7) | left('beijing', null) | right('beijing2008', 4) | +------------------------+-----------------------+-------------------------+ | beijing | NULL | 2008 | +------------------------+-----------------------+-------------------------+ 1 row in set (0.00 sec) > select substring('beijing2008', 8, 4), substring('beijing2008', 1, 7); +--------------------------------+--------------------------------+ | substring('beijing2008', 8, 4) | substring('beijing2008', 1, 7) | +--------------------------------+--------------------------------+ | 2008 | beijing | +--------------------------------+--------------------------------+ 1 row in set (0.00 sec)
MySQL 中另一類很重要的函數就是數值函數,這些函數能處理不少數值方面的運算。數據庫
函數 | 功能 |
---|---|
abs(x) | 返回 x 的絕對值 |
ceil(x) | 返回大於 x 的最小整數值 |
floor(x) | 返回小於 x 的最大整數值 |
mod(x, y) | 返回 x/y 的模,模數和被模數任何一個爲 NULL 結果都爲 NULL |
rand() | 返回 0~1 內的隨機值 |
round(x, y) | 返回參數 x 四捨五入的有 y 位小數的值,若是不寫 y,則默認 y 爲 0,即將 x 四捨五入後取整 |
truncate(x, y) | 返回數字 x 截斷爲 y 位小數的結果 |
示例網絡
> select abs(-0.8), abs(0.8); +-----------+----------+ | abs(-0.8) | abs(0.8) | +-----------+----------+ | 0.8 | 0.8 | +-----------+----------+ 1 row in set (0.00 sec) > select ceil(-0.8), ceil(0.8); +------------+-----------+ | ceil(-0.8) | ceil(0.8) | +------------+-----------+ | 0 | 1 | +------------+-----------+ 1 row in set (0.01 sec) > select floor(-0.8), floor(0.8); +-------------+------------+ | floor(-0.8) | floor(0.8) | +-------------+------------+ | -1 | 0 | +-------------+------------+ 1 row in set (0.00 sec) > select mod(15, 10), mod(1, 11), mod(null, 10); +-------------+------------+---------------+ | mod(15, 10) | mod(1, 11) | mod(null, 10) | +-------------+------------+---------------+ | 5 | 1 | NULL | +-------------+------------+---------------+ 1 row in set (0.00 sec) > select rand(), rand() * 100, ceil(rand() * 100); +--------------------+--------------------+--------------------+ | rand() | rand() * 100 | ceil(rand() * 100) | +--------------------+--------------------+--------------------+ | 0.6922199192384444 | 37.314064183564916 | 79 | +--------------------+--------------------+--------------------+ 1 row in set (0.00 sec) > select round(1.1), round(1.1, 2), round(1, 2); +------------+---------------+-------------+ | round(1.1) | round(1.1, 2) | round(1, 2) | +------------+---------------+-------------+ | 1 | 1.10 | 1 | +------------+---------------+-------------+ 1 row in set (0.00 sec) > select round(1.235, 2), truncate(1.235, 2); +-----------------+--------------------+ | round(1.235, 2) | truncate(1.235, 2) | +-----------------+--------------------+ | 1.24 | 1.23 | +-----------------+--------------------+ 1 row in set (0.00 sec)
經常使用日期和時間函數函數
函數 | 功能 |
---|---|
curdate() | 返回當前日期,只包含年月日 |
curtime() | 返回當前時間,只包含時分秒 |
now() | 返回當前日期和時間,年月日時分秒全都包含 |
unix_timestamp(date) | 返回日期 date 的 unix 時間戳 |
from_unixtime(timestamp) | 返回 unix 時間戳的日期和時間值,和 unix_timestamp(date) 互逆 |
week(date) | 返回日期 date 爲一年中的第幾周 |
year(date) | 返回日期 date 的年份 |
hour(time) | 返回 time 的小時值 |
minute(time) | 返回 time 的分鐘值 |
monthname(date) | 返回 date 的月份名 |
date_format(date, fmt) | 返回按字符串 fmt 格式化日期 date 值 |
date_add(date, interval expr type) | 返回與 date 相差 interval 時間段的日期,interval 是間隔類型關鍵字,expr 是一個表達式,這個表達式對應後面的類型,type 是日期間隔類型 |
datediff(expr, expr2) | 返回起始時間 expr 和結束時間 expr2 之間的天數 |
日期和時間格式加密
格式符 | 格式說明 |
---|---|
%S、%s | 兩位數字形式的秒(00, 01, ..., 59) |
%i | 兩位數字形式的分(00, 01, ..., 59) |
%H | 兩位數字形式的小時,24 小時(00, 01, ..., 23) |
%h、%I | 兩位數字形式的小時,12 小時(00, 01, ..., 12) |
%k | 數字形式的小時,24 小時(0, 1, ..., 23) |
%l | 數字形式的小時,12 小時(0, 1, ..., 12) |
%T | 24 小時的時間形式(hh:mm:ss) |
%r | 12 小時的時間形式(hh:mm:ss AM |
%p | AM 或 PM |
%W | 一週中每一天的名稱(Sunday, Monday, ..., Saturday) |
%a | 一週中每一天的名稱縮寫(Sum, Mon, ..., Sat) |
%d | 兩位數字表示月中的天數(00, 01, ..., 31) |
%e | 數字形式表示月中的天數(1, 2, ..., 31) |
%D | 英文後綴表示月中的天數(1st, 2nd, 3rd, ...) |
%w | 以數字形式表示週中的天數(0 = Sunday, 1 = Monday, ..., 6 = Saturday) |
%j | 以 3 位數字表示年中的天數(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 | 兩位數字表示的年份 |
%% | 直接值 "%" |
日期間隔類型unix
表達式類型 | 描述 | 格式 |
---|---|---|
HOUR | 小時 | hh |
MINUTE | 分 | mm |
SECOND | 秒 | ss |
YEAR | 年 | YY |
MONTH | 月 | MM |
DAY | 日 | DD |
YEAR_MONTH | 年和月 | YY-MM |
DAY_HOUR | 日和小時 | DD hh |
DAY_MINUTE | 日和分鐘 | DD hh:mm |
DAY_SECOND | 日和秒 | DD hh:mm:ss |
HOUR_MINUTE | 小時和分 | hh:mm |
HOUR_SECOND | 小時和秒 | HH:ss |
MINUTE_SECOND | 分和秒 | mm:ss |
示例code
> select curdate(); +------------+ | curdate() | +------------+ | 2018-06-20 | +------------+ 1 row in set (0.00 sec) > select curtime(); +-----------+ | curtime() | +-----------+ | 15:27:19 | +-----------+ 1 row in set (0.00 sec) > select now(); +---------------------+ | now() | +---------------------+ | 2018-06-20 15:28:12 | +---------------------+ 1 row in set (0.00 sec) > select unix_timestamp(now()); +-----------------------+ | unix_timestamp(now()) | +-----------------------+ | 1529479736 | +-----------------------+ 1 row in set (0.00 sec) > select from_unixtime(1529479736); +---------------------------+ | from_unixtime(1529479736) | +---------------------------+ | 2018-06-20 15:28:56 | +---------------------------+ 1 row in set (0.00 sec) > select week(now()), year(now()); +-------------+-------------+ | week(now()) | year(now()) | +-------------+-------------+ | 24 | 2018 | +-------------+-------------+ 1 row in set (0.00 sec) > select hour(curtime()), minute(curtime()); +-----------------+-------------------+ | hour(curtime()) | minute(curtime()) | +-----------------+-------------------+ | 15 | 37 | +-----------------+-------------------+ 1 row in set (0.00 sec) > select monthname(now()); +------------------+ | monthname(now()) | +------------------+ | June | +------------------+ 1 row in set (0.00 sec) > select date_format(now(), '%M, %D, %Y'); +----------------------------------+ | date_format(now(), '%M, %D, %Y') | +----------------------------------+ | June, 20th, 2018 | +----------------------------------+ 1 row in set (0.00 sec) # 第 1 列返回了當前日期時間,第 2 列返回距離當前日期 31 天后的日期時間,第 3 列返回距離當前日期一年兩個月後的日期時間 > select now() current, date_add(now(), interval 31 day) after31days, date_add(now(), interval '1_2' year_month) after_oneyear_twomonth; +---------------------+---------------------+------------------------+ | current | after31days | after_oneyear_twomonth | +---------------------+---------------------+------------------------+ | 2018-06-20 15:44:16 | 2018-07-21 15:44:16 | 2019-08-20 15:44:16 | +---------------------+---------------------+------------------------+ 1 row in set (0.00 sec) # 第 1 列返回了當前日期時間,第 2 列返回距離當前日期 31 天前的日期時間,第 3 列返回距離當前日期一年兩個月前的日期時間 > select now() current, date_add(now(), interval -31 day) after31days, date_add(now(), interval '-1_-2' year_month) after_oneyear_twomonth; +---------------------+---------------------+------------------------+ | current | after31days | after_oneyear_twomonth | +---------------------+---------------------+------------------------+ | 2018-06-20 15:46:56 | 2018-05-20 15:46:56 | 2017-04-20 15:46:56 | +---------------------+---------------------+------------------------+ 1 row in set (0.00 sec) > select datediff(now(), '2008-08-08'); +-------------------------------+ | datediff(now(), '2008-08-08') | +-------------------------------+ | 3603 | +-------------------------------+ 1 row in set (0.00 sec)
流程函數也是很經常使用的一類函數,用戶可使用這類函數在一個 SQL 語句中實現條件選擇,這樣作可以提升語句的效率。orm
函數 | 功能 |
---|---|
if(value, t f) | 若是 value 是真,返回 t,不然返回 f |
ifnull(value1, value2) | 若是 value1 不爲空,返回 value1,不然返回 value2 |
case when [value] then [result] ... else [default] end | 若是 value 是真,返回 result,不然返回 default |
case [expr] when [value] then [result] ... else [default] end | 若是 expr 等於 value,返回 result,不然返回 default |
示例ip
> select salary, if(salary > 2000, 'high', 'low') from salary; +---------+----------------------------------+ | salary | if(salary > 2000, 'high', 'low') | +---------+----------------------------------+ | 1000.00 | low | | 2000.00 | low | | 3000.00 | high | | 4000.00 | high | | 5000.00 | high | | NULL | low | +---------+----------------------------------+ 6 rows in set (0.00 sec) > select salary, ifnull(salary, 0) from salary; +---------+-------------------+ | salary | ifnull(salary, 0) | +---------+-------------------+ | 1000.00 | 1000.00 | | 2000.00 | 2000.00 | | 3000.00 | 3000.00 | | 4000.00 | 4000.00 | | 5000.00 | 5000.00 | | NULL | 0.00 | +---------+-------------------+ 6 rows in set (0.00 sec) > select salary, case when salary <= 2000 then 'low' else 'high' end from salary; +---------+-----------------------------------------------------+ | salary | case when salary <= 2000 then 'low' else 'high' end | +---------+-----------------------------------------------------+ | 1000.00 | low | | 2000.00 | low | | 3000.00 | high | | 4000.00 | high | | 5000.00 | high | | NULL | high | +---------+-----------------------------------------------------+ 6 rows in set (0.00 sec) > select salary, case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary; +---------+-----------------------------------------------------------------------+ | salary | case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end | +---------+-----------------------------------------------------------------------+ | 1000.00 | low | | 2000.00 | mid | | 3000.00 | high | | 4000.00 | high | | 5000.00 | high | | NULL | high | +---------+-----------------------------------------------------------------------+ 6 rows in set (0.00 sec)
MySQL 提供的函數很豐富,除了前面介紹的字符串函數、數字函數、日期函數、流程函數之外還有不少其餘函數。
函數 | 功能 |
---|---|
database() | 返回當前數據庫名 |
version() | 返回當前數據庫版本 |
user() | 返回當前登陸用戶名 |
inet_aton(ip) | 返回 IP 地址的數字表示,將字符串的IP地址轉換爲數字表示的網絡字節序,這樣能夠更方便地進行 IP 或者網段的比較 |
inet_ntoa(num) | 返回數字表明的 IP 地址 |
password(str) | 返回字符串 str 的加密版本,一個 41 位長的字符串,Removed in MySQL 8.0.11. |
md5() | 返回字符串 str 的 MD5 值,經常使用來對應用中的數據進行加密 |
示例
> select database(); +------------+ | database() | +------------+ | test | +------------+ 1 row in set (0.00 sec) > select version(); +-----------+ | version() | +-----------+ | 8.0.11 | +-----------+ 1 row in set (0.01 sec) > select user(); +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) > select inet_aton('192.16.0.100'); +---------------------------+ | inet_aton('192.16.0.100') | +---------------------------+ | 3222274148 | +---------------------------+ 1 row in set (0.00 sec) > select inet_ntoa(3222274148); +-----------------------+ | inet_ntoa(3222274148) | +-----------------------+ | 192.16.0.100 | +-----------------------+ 1 row in set (0.00 sec) > select PASSWORD('123456'); +-------------------------------------------+ | PASSWORD('123456') | +-------------------------------------------+ | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-------------------------------------------+ 1 row in set (0.08 sec) > select md5('12345'); +----------------------------------+ | md5('12345') | +----------------------------------+ | 827ccb0eea8a706c4c34a16891f84e7b | +----------------------------------+ 1 row in set (0.00 sec)