1. 數學函數
數學函數用於執行一些比較復雜的算術操作。MySQL支持很多的數學函數。若發生錯誤,所有的數學函數都會返回NULL。
(1)greatest()和least()函數
是數學函數中經常使用的函數,它們的功能是獲得一組數中的最大值和最小值。例如:SELECTGREATEST(10,9,128,1),LEAST(1,2,3);
數學函數還可以嵌套使用,例如:
SELECT GREATEST(-2,LEAST(0,3)),LEAST(1,GREATEST(1,2));
注意:MySQL不允許函數名和括號之間有空格。
(2)FLOOR()和CEILING()函數
floor()用於獲得小於一個數的最大整數值,ceiling()函數用於獲得大於一個數的最小整數值,例如:
SELECT FLOOR(-1.2), CEILING(-1.2),FLOOR(9.9), CEILING(9.9);
結果為:-2,-1,9,10;
(3)ROUND()和TRUNCATE()函數
round()函數用於獲得一個數的四捨五入的整數值:
SELECTROUND(5.1),ROUND(25.501),ROUND(9.8);
結果為:5,26,10;
truncate()函數用於把一個數字截取為一個指定小數個數的數字,逗號後面的數字表示指定小數的個數:
SELECT TRUNCATE(1.54578, 2),TRUNCATE(-76.12, 5);
結果為:1.54,-76.12000;
(4)ABS()函數:用來獲得一個數的絕對值
(5)sign()函數
返回數字的符號,返回的結果是正數(1)、負數(-1)或者零(0):
SELECT SIGN(-2),SIGN(2),SIGN(0);
結果為:-1,1,0;
(6)sqrt()函數返回一個數的平方根
(7)POW()函數
pow()函數以一個數作為另外一個數的指數,並返回結果:
SELECTPOW(2,2),POW(10, -2),POW(0,3);
結果為:4,0.01,0;
(8)SIN()、COS()、TAN()、ASIN()、ACOS()和ATAN()函數
分別返回一個角度(弧度)的正弦、余弦、正切、反正弦、反余弦和反正切值
如果使用的是角度而不是弧度,可以使用degrees()和radians ()函數進行轉換。
(9)BIN()、OTC()和HEX()函數
BIN()、OTC()和HEX()函數分別返回一個數的二進制、八進制和十六進制值,這個值作為字符串返回;
2. 聚合函數
MySQL有一組函數是特意為求和或者對表中的數據進行集中概括而設計的。這一組函數就叫做聚合函數。聚合函數常常用於對一組值進行計算,然後返回單個值。通過把聚合函數(如COUNT和SUM)添加到帶有一個GROUPBY子句的SELECT語句塊中,數據就可以聚合。聚合意味著是求一個和、平均、頻次及子和,而不是單個的值。
3. 字符串函數
因為MySQL數據庫不僅包含數字數據,還包含字符串,因此MySQL有一套為字符串操作而設計的函數。在字符串函數中,包含的字符串必須要用單引號括起。
(1)ASCII()函數
語法格式: ASCII (char)
返回字符表達式最左端字符的ASCII值。參數char的類型為字符型的表達式,返回值為整型。
例: 返回字母A的ASCII碼值。SELECTASCII('A'); 結果為:65
(2)CHAR()函數
語法格式: CHAR (x1,x2,x3,…)
將x1、x2……的ASCII碼轉換為字符,結果組合成一個字符串。參數x1,x2,x3……為介於0~255之間的整數,返回值為字符型。
例: 返回ASCII碼值為65、66、67的字符,組成一個字符串。
SELECTCHAR(65,66,67); 結果為:ABC
(3)LEFT和RIGHT函數
語法格式: left | right ( str ,x )
分別返回從字符串str左邊和右邊開始指定x個字符。
例: SELECT LEFT(課程是什麼, 2)
執行結果為:課程;
(4)TRIM、LTRIM 和RTRIM函數(刪除)
語法格式: trim | ltrim |rtrim(str)
使用LTRIM和RTRIM分別刪除字符串中首(左邊)空格和尾(右邊)空格,返回值為字符串。參數str為字符型表達式,返回值類型為varchar。TRIM刪除字符串首部和尾部的所有空格。
(5)RPAD和LPAD函數(填補)
語法格式: rpad | lpad( str, n, pad)
使用RPAD和LPAD分別用字符串pad對字符串str的右邊和左邊進行填補直至str中字符數目達到n個,最後返回填補後的字符串。若str中的字符個數大於n,則返回str的前n個字符。
例: 執行如下語句:
SELECT RPAD('中國加油',8, '!'),LPAD('welcome',10, '*');
結果為:中國加油!!!!(共八個),***welcome(共十個);
(6)REPLACE函數
語法格式: replace (str1 , str2 , str3 )
REPLACE函數用於用字符串str3替換str1中所有出現的字符串str2。最後返回替換後的字符串。
例: 執行如下語句:
SELECTREPLACE('Welcome to CHINA','o', 'K');
結果為:WelcKme tK CHINA
(7)CONCAT函數
語法格式: concat(s1,s2,…sn)
CONCAT函數用於連接指定的幾個字符串。
例: 執行如下語句:SELECT CONCAT('中國', '加油');
結果為:中國加油
(8)SUBSTRING函數
語法格式: substring (expression , Start, Length )
返回expression中指定的部分數據。參數expression可為字符串、二進制串、text、image字段或表達式。
Start、Length均為整型,前者指定子串的開始位置,後者指定子串的長度(要返回字節數)。如果 expression 是字符類型和二進制類型,則返回值類型與expression的類型相同。如果為text類型,返回的是varchar類型。
例: 如下程序在一列中返回XS表中所有女同學的姓氏,在另一列中返回名字。
USEXSCJ;SELECT SUBSTRING(姓名,1,1) AS 姓, SUBSTRING(姓名, 2,LENGTH(姓名)-1) AS 名
FROM XS WHERE 性別=0 ORDER BY 姓名;
說明:LENGTH函數的作用是返回一個字符串的長度。
(9)STRCMP函數
語法格式: strcmp (s1,s2)
STRCMP函數用於比較兩個字符串,相等返回0,s1大於s2返回1,s1小於s2返回-1。
例: 執行如下語句: SELECT STRCMP('A', 'A'), STRCMP('ABC', 'OPQ'),STRCMP('T', 'B');
結果為:0,-1,1;
4. 日期和時間函數
MySQL有很多日期和時間數據類型,所以有相當多的操作日期和時間的函數。
(1)NOW()
使用NOW()函數可以獲得當前的日期和時間,它以YYYY-MM-DD HH∶MM∶SS的格式返回當前的日期和時間:
(2)CURTIME()和CURDATE()
curtime()和curdate()函數比NOW更為具體化,它們分別返回的是當前的時間和日期,沒有參數:
(3)YEAR()
YEAR()函數分析一個日期值並返回其中關於年的部分:
SELECTYEAR(20080512142800),YEAR('1982-11-02');
結果為:2008,1982;
(4)MONTH()和MONTHNAME()
month()和monthname()函數分別以數值和字符串的格式返回月的部分:
(5)DAYOFYEAR(),DAYOFWEEK()和DAYOFMONTH()
dayofyear(),DAYOFWEEK()和DAYOFMONTH()函數分別返回這一天在一年、一星期及一個月中的序數:
(6)DAYNAME()
和MONTHNAME()相似,dayname()以字符串形式返回星期名:
(7)WEEK()和YEARWEEK()
WEEK()函數返回指定的日期是一年的第幾個星期,而YEARWEEK()函數返回指定的日期是哪一年的哪一個星期:
(8)HOUR()、MINUTE()和SECOND()
HOUR(),MINUTE()和SECOND()函數分別返回時間值的小時、分鐘和秒的部分:
(9)DATE_ADD()和DATE_SUB()
DATE_ADD()和DATE_SUB()函數可以對日期和時間進行算術操作,它們分別用來增加和減少日期值,其使用的關鍵字如下表所示。
關 鍵 字
間隔值的格式
關 鍵 字
間隔值的格式
DAY
日期
MINUTE
分鐘
DAY_HOUR
日期∶小時
MINUTE_ SECOND
分鐘∶秒
DAY_MINUTE
日期∶小時∶分鐘
MONTH
月
DAY_SECOND
日期∶小時∶分鐘∶秒
SECOND
秒
HOUR
小時
YEAR
年
HOUR_MINUTE
小時∶分鐘
YEAR_MONTH
年-月
HOUR_ SECOND
小時∶分鐘∶秒
DATE_ADD()和DATE_SUB()函數的語法格式為:
DATE_ADD | DATE_SUB(date, INTERVAL int keyword)
date是需要的日期和時間,INTERVAL關鍵字表示一個時間間隔。int表示需要計算的時間值,keyword已經在上表中列出。DATE_ADD函數是計算date加上間隔時間後的值,DATE_SUB則是計算date減去時間間隔後的值。
舉例: SELECT DATE_ADD('1986-08-08',INTERVAL 17 DAY);
5. 加密函數(非重點)
MySQL特意設計了一些函數對數據進行加密。這裡簡單介紹如下幾個函數。
(1)AES_ENCRYPT和AES_DECRYPT函數
語法格式為:aes_encrypt aes_decrypt(str,key)
AES_ENCRYPT函數返回的是密鑰key對字符串str利用高級加密標准(AES)算法加密後的結果,結果是一個二進制的字符串,以BLOB類型存儲。而AES_DECRYPT函數用於對用高級加密方法加密的數據進行解密。若檢測到無效數據或不正確的填充,函數會返回NULL。AES_ENCRYPT和AES_DECRYPT函數可以被看做MySQL中普遍使用的最安全的加密函數。
(2)ENCODE和DECODE函數
語法格式為: encode |deCODE(str,key)
ENCODE函數用來對一個字符串str進行加密,返回的結果是一個二進制字符串,以BLOB類型存儲。DECODE函數使用正確的密鑰對加密後的值進行解密。與上面的AES_ENCRYPT和AES_DECRYPT函數相比,這兩個函數加密程度相對較弱。
(3)ENCRYPT函數
使用UNIX crypt()系統加密字符串,encrypt(str,salt)函數接收要加密的字符串和用於加密過程的salt(一個可以確定唯一口令的字符串)。在Windows上不可用。
(4)PASSWORD函數
格式為: password(str)
返回字符串str加密後的密碼字符串,適合於插入到MySQL的安全系統。該加密過程不可逆,和UNIX密碼加密過程使用不同的算法。主要用於MySQL的認證系統。
例: 返回字符串“MySQL”的加密版本。
SELECTPASSWORD('MySQL');
6. 控制流函數
MySQL有幾個函數是用來進行條件操作的。這些函數可以實現SQL的條件邏輯,允許開發者將一些應用程序業務邏輯轉換到數據庫後台。
(1)IFNULL和NULLIF函數
IFNULL函數的語法格式為: IFNULL(expr1,expr2)
此函數的作用是:判斷參數expr1是否為NULL,當參數expr1為NULL時返回expr2,不為NULL時返回expr1。IFNULL的返回值是數字或字符串。
例: 執行如下語句:
SELECT IFNULL(1,2), IFNULL(NULL, 'MySQL'), IFNULL(1/0,10);
結果為:1,MySQL,10.0000;
NULLIF函數的語法格式為:NULLIF(expr1,expr2)
NULLIF函數用於檢驗提供的兩個參數是否相等,如果相等,則返回NULL,如果不相等就返回第一個參數。
例: 執行如下語句:
SELECTNULLIF(1,1), NULLIF('A', 'B'), NULLIF(2+3, 3+4);
結果為:null,A,5;
(2)IF函數
和許多腳本語言提供的IF()函數一樣,MySQL的IF()函數也可以建立一個簡單的條件測試。
語法格式如下: IF(expr1,expr2,expr3)
這個函數有3個參數,第一個是要被判斷的表達式,如果表達式為真,IF()將會返回第二個參數;如果為假,IF()將會返回第三個參數。
例: 判斷2*4是否大於9–5,是則返回“是”,否則返回“否”。
SELECTIF(2*4>9–5, '是', '否'); 結果為:是;
例:返回XS表名字為兩個字的學生姓名、性別和專業名。性別值如為0則顯示為“女”,為1則顯示為“男”。
SELECT 姓名, IF(性別=0, '女', '男') AS 性別, 專業名
FROMXS WHERE 姓名LIKE '__';
7. 格式化函數
MySQL還有一些函數是特意為格式化數據設計的。
(1)FORMAT()函數
語法格式為: format(x, y)
FORMAT()函數把數值格式化為以逗號間隔的數字序列。FORMAT()的第一個參數x是被格式化的數據,第二個參數y是結果的小數位數。
例如: SELECT FORMAT(111111.23654,2), FORMAT(-5468,4);
結果為:111111.23,-5468.0000;
(2)DATE_FORMAT()和TIME_FORMAT()函數
用來格式化日期和時間值。語法格式如下:
DATE_FORMAT/TIME_FORMAT(date | time, fmt)
其中,date和time是需要格式化的日期和時間值,fmt是日期和時間值格式化的形式,下表列出了MySQL中的日期/時間格式化代碼。
關 鍵 字
間隔值的格式
關 鍵 字
間隔值的格式
%a
縮寫的星期名(Sun,Mon…)
%p
AM或PM
%b
縮寫的月份名(Jan,Feb…)
%r
時間,12小時的格式
%d
月份中的天數
%S
秒(00,01)
%H
小時(01,02…)
%T
時間,24小時的格式
%I
分鐘(00,01…)
%w
一周中的天數(0,1)
%j
一年中的天數(001,002…)
%W
長型星期的名字(Sunday,Monday…)
%m
月份,2位(00,01…)
%Y
年份,4位
%M
長型月份的名字(January,February)
舉例:SELECT DATE_FORMAT(NOW(), '%W,%d,%M,%Y %r');
注意:這兩個函數是對大小寫敏感的。
(3)INET_NTOA()和INET_ATON()函數
MySQL中的inet_ntoa()和inet_aton()函數可以分別把IP地址轉換為數字或者進行相反的操作。如下面的例子所示:
SELECTINET_ATON('192.168.1.1');
8. 類型轉換函數
MySQL提供cast()函數進行數據類型轉換,它可以把一個值轉換為指定的數據類型。
語法格式: CAST(expr, AS type)
expr是CAST函數要轉換的值,type是轉換後的數據類型。
在CAST函數中MySQL支持這幾種數據類型:BINARY、CHAR、DATE、TIME、DATETIME、SIGNED和UNSIGNED。
通常情況下,當使用數值操作時,字符串會自動地轉換為數字,因此下面例子中兩種操作得到相同的結果:
SELECT1+'99', 1+CAST('99' AS SIGNED);
字符串可以指定為binary類型,這樣它們的比較操作就成為大小寫敏感的。使用CAST()函數指定一個字符串為BINARY和字符串前面使用BINARY關鍵詞具有相同的作用。
例: 執行如下語句:
SELECT'a'=BINARY 'A', 'a'=CAST('A' AS BINARY);
結果為:0,0;(兩個表達式的結果都為零表示兩個表達式都為假)
MySQL還可以強制將日期和時間函數的值作為一個數而不是字符串輸出。
例: 將當前日期顯示成數值形式。
SELECTCAST(CURDATE() AS SIGNED);
9. 系統信息函數
MySQL還具有一些特殊的函數用來獲得系統本身的信息,下表列出了大部分信息函數。
函 數
功 能
DATABASE()
返回當前數據庫名
benchmark(n,expr)
將表達式expr重復運行n次
charsetstr)
返回字符串str的字符集
Connection_id()
返回當前客戶的連接ID
FOUND_ROWS()
將最後一個SELECT查詢(沒有以LIMIT語句進行限制)返回的記錄行數返回
GET_LOCK(str,dur)
獲得一個由字符串str命名的並且有dur秒延時的鎖定
IS_FREE_LOCK(str)
檢查以str命名的鎖定是否釋放
LAST_INSERT_ID()
返回由系統自動產生的最後一個AUTOINCREMENT ID的值
master_pos_wait(log,pos,dur)
鎖定主服務器dur秒直到從服務器與主服務器的日志log指定的位置pos同步
please_lock(str)
釋放由字符串str命名的鎖定
USER()或SYSTEM_USER()
返回當前登錄用戶名
version()
返回MySQL服務器的版本
(1)DATABASE()、USER()和VERSION()函數可以分別返回當前所選數據庫、當前用戶和MySQL版本信息:
(2)BENCHMARK() 函數用於重復執行n次表達式expr。它可以被用於計算MySQL 處理表達式的速度。結果值通常為零。另一種用處來自 MySQL客戶端內部,能夠報告問詢執行的次數,根據經過的時間值可以推斷服務器的性能。例如:
SELECT BENCHMARK(10000000, ENCODE('hello','goodbye'));
結果為:0;
這個例子中,MySQL計算ENCODE('hello','goodbye')表達式10 000 000次需要2.16秒。
(3)FOUND_ROWS()函數用於返回最後一個SELECT語句返回的記錄行的數目。
如最後執行的SELECT語句是:SELECT * FROM XS;
之後執行如下語句:SELECT FOUND_ROWS();
結果為:22;
說明:SELECT語句可能包括一個LIMIT子句,用來限制服務器返回客戶端的行數。在有些情況下,需要不用再次運行該語句而得知在沒有LIMIT 時到底該語句返回了多少行。為了知道這個行數,包括在SELECT 語句中選擇SQL_CALC_FOUND_ROWS,隨後調用FOUND_ROWS()。例如,執行如下語句:
SELECT SQL_CALC_FOUND_ROWS * FROM XS WHERE 性別=1 LIMIT 5;
之後可以使用FOUND_ROWS()函數,顯示在沒有LIMIT子句的情況下SELECT語句所返回的行數。
結果如下:14;
作者 tianyazaiheruan