### 第12章:函數和操作符
在SQL 語句中,表達式可用于一些諸如SELECT語句的ORDER BY 或HAVING子句、SELECT、 DELETE或 UPDATE語句的WHERE 子句或 SET語句之類的地方。使用文本值、column值、NULL值、函數、 操作符來書寫表達式。 本章敘述了可用于書寫MySQL表達式的函數和操作符。
除非在文檔編制中對一個函數或操作符另有指定的情況外,一個包含NULL 的表達式通常產生一個NULL 值。
**注釋**:在默認狀態下, 在函數和緊隨其后的括號之間不得存在空格。這能幫助? MySQL 分析程序區分一些同函數名相同的函數調用以及表或列。不過,函數自變量周圍允許有空格出現。
可以通過選擇--sql-mode=IGNORE_SPACE來打開MySQL服務器的方法使服務器接受函數名后的空格。 個人客戶端程序可通過選擇mysql_real_connect()的CLIENT_IGNORE_SPACE 實現這一狀態。在以上兩種情況中, 所有的函數名都成為保留字。請參見[5.3.2節,“SQL服務器模式”](# "5.3.2.?The Server SQL Mode").?
為節省時間,本章中對大多數例子使用簡寫形式展示了 **mysql**程序的輸出結果。 對于以下格式的舉例展示:
mysql> **SELECT MOD(29,9);**
+-----------+
| mod(29,9) |
+-----------+
|???????? 2 |
+-----------+
1 rows in set (0.00 秒)
使用如下格式進行代替:
mysql> **SELECT MOD(29,9);**
??????? -> 2
### 12.1.?操作符
[ 12.1.1. 操作符優先級](#)[ 12.1.2. 圓括號](#)[ 12.1.3. 比較函數和操作符](#)[ 12.1.4. 邏輯操作符](#)
### 12.1.1.?操作符優先級
以下列表顯示了操作符優先級的由低到高的順序。排列在同一行的操作符具有相同的優先級。
:=
||, OR, XOR
&&, AND
NOT
BETWEEN, CASE, WHEN, THEN, ELSE
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
|
&
<<, >>
-, +
*, /, DIV, %, MOD
^
- (一元減號), ~ (一元比特反轉)
!
BINARY, COLLATE
**注釋**:假如 HIGH_NOT_PRECEDENCE SQL 模式被激活,則 NOT 的優先級同 the? ! 操作符相同。請參見[5.3.2節,“SQL服務器模式”](# "5.3.2.?The Server SQL Mode")。
### 12.1.2.?圓括號
-
( ... )
使用括弧來規定表達式的運算順序,例如:
mysql> SELECT 1+2*3;
-> 7
mysql> SELECT (1+2)*3;
-> 9
### 12.1.3.?比較函數和操作符
比較運算產生的結果為1(TRUE)、0 (FALSE)或 NULL。這些運算可用于數字和字符串。根據需要,字符串可自動轉換為數字,而數字也可自動轉換為字符串。
本章中的一些函數 (如LEAST()和GREATEST()) 的所得值不包括 1 (TRUE)、 0 (FALSE)和 NULL。然而,其所得值乃是基于按照下述規則運行的比較運算:??
MySQL按照以下規則進行數值比較:
- 若有一個或兩個參數為 NULL,除非NULL-safe <=> 等算符,則比較運算的結果為NULL。
- 若同一個比較運算中的兩個參數都是字符串,則按照字符串進行比較。
- 若兩個參數均為整數,則按照整數進行比較。?
- 十六進制值在不需要作為數字進行比較時,則按照二進制字符串進行處理。
- 假如參數中的一個為 TIMESTAMP 或 DATETIME 列,而其它參數均為常數, 則在進行比較前將常數轉為 timestamp。這樣做的目的是為了使ODBC的進行更加順利。注意,這不適合IN()中的參數!為了更加可靠,在進行對比時通常使用完整的 datetime/date/time字符串。
- 在其它情況下,參數作為浮點數進行比較。??
在默認狀態下,字符串比較不區分大小寫,并使用現有字符集(默認為cp1252 Latin1,同時對英語也適合)。
為了進行比較,可使用CAST()函數將某個值轉為另外一種類型。 使用CONVERT()將字符串值轉為不同的字符集。請參見[12.8節,“Cast函數和操作符”](# "12.8.?Cast Functions and Operators")。
以下例子說明了比較運算中將字符串轉為數字的過程:
mysql> ** SELECT 1 > '6x';**
??????? -> 0
mysql> ** SELECT 7 > '6x';**
??????? -> 1
mysql> ** SELECT 0 > 'x6';**
??????? -> 0
mysql> ** SELECT 0 = 'x6';**
??????? -> 1
注意,在將一個字符串列同一個數字進行比較時, MySQL 不能使用列中的索引進行快速查找。假如_str_col_是一個編入索引的字符串列,則在以下語句中,索引不能執行查找功能:
SELECT * FROM _tbl_name_ WHERE _str_col_=1;
其原因是許多不同的字符串都可被轉換為數值 1: '1'、 ' 1'、 '1a'、 ……
- =
等于:
mysql> ** SELECT 1 = 0;**
??????? -> 0
mysql> ** SELECT '0' = 0;**
??????? -> 1
mysql> ** SELECT '0.0' = 0;**
??????? -> 1
mysql> ** SELECT '0.01' = 0;**
??????? -> 0
mysql> ** SELECT '.01' = 0.01;**
??????? -> 1
- <=>
NULL-safe equal.這個操作符和=操作符執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。
mysql> ** SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;**
??????? -> 1, 1, 0
mysql> ** SELECT 1 = 1, NULL = NULL, 1 = NULL;**
??????? -> 1, NULL, NULL
- <> !=
不等于:
mysql> ** SELECT '.01' <> '0.01';**
??????? -> 1
mysql> ** SELECT .01 <> '0.01';**
??????? -> 0
mysql> ** SELECT 'zapp' <> 'zappp';**
??????? -> 1
- <=
小于或等于:
mysql> ** SELECT 0.1 <= 2;**
??????? -> 1
- <
小于:
mysql> ** SELECT 2 < 2;**
??????? -> 0
- >=
大于或等于:
mysql> ** SELECT 2 >= 2;**
??????? -> 1
- >
大于:
mysql> ** SELECT 2 > 2;**
??????? -> 0
- IS _ boolean_value_ IS NOT _boolean_value_
根據一個布爾值來檢驗一個值,在這里,布爾值可以是TRUE、FALSE或UNKNOWN。
mysql> ** SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;**
??????? -> 1, 1, 1
mysql> ** SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;**
??????? -> 1, 1, 0
- IS NULL IS NOT NULL
檢驗一個值是否為 NULL。
mysql> ** SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;**
??????? -> 0, 0, 1
mysql> ** SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;**
??????? -> 1, 1, 0
為了能夠順利的使用ODBC 程序工作,在使用IS NULL時,MySQL支持一下額外特性:
- 在一個值產生后,立即運行一個以下格式的語句,從而找到最新AUTO_INCREMENT 值的所在行:
o???????????????????? SELECT * FROM _tbl_name_ WHERE _auto_col_ IS NULL
當設置SQL_AUTO_IS_NULL=0時,這項操作無法運行。請參見[13.5.3節,“SET語法”](# "13.5.3.?SET Syntax")。
- 對于命名為NOT NULL 的DATE 和DATETIME列,可通過使用如下的 語句找到特定日期 '0000-00-00':
o???????????????????? SELECT * FROM _tbl_name_ WHERE _date_column_ IS NULL
運行這一步需要使用一些 ODBC 應用軟件,因為 ODBC本身不支持 一個 '0000-00-00'的時間值。?
- _expr_ BETWEEN _min_ AND _max_
假如_expr大于或等于__min_且_expr_小于或等于_max_, 則BETWEEN 的返回值為1,或是0。若所有參數都是同一類型,則上述關系相當于表達式?? (_min_ <= _expr_ AND _expr_ <= _max_)。其它類型的轉換根據本章開篇所述規律進行,且適用于3種參數中任意一種。?
mysql> ** SELECT 1 BETWEEN 2 AND 3;**
??????? -> 0
mysql> ** SELECT 'b' BETWEEN 'a' AND 'c';**
??????? -> 1
mysql> ** SELECT 2 BETWEEN 2 AND '3';**
??????? -> 1
mysql> ** SELECT 2 BETWEEN 2 AND 'x-3';**
??????? -> 0
- _expr_ NOT BETWEEN _min_ AND _max_
這相當于NOT(_expr_ BETWEEN _min_ AND _max_)。
·???????? COALESCE(_value_,...)
返回值為列表當中的第一個非 NULL值,在沒有非NULL 值得情況下返回值為 NULL 。
mysql> ** SELECT COALESCE(NULL,1);**
??????? -> 1
mysql> ** SELECT COALESCE(NULL,NULL,NULL);**
??????? -> NULL
·???????? GREATEST(_value1_,_value2_,...)
當有2或多個參數時,返回值為最大(最大值的)參數。比較參數所依據的規律同LEAST()相同。
mysql> ** SELECT GREATEST(2,0);**
??????? -> 2
mysql> ** SELECT GREATEST(34.0,3.0,5.0,767.0);**
??????? -> 767.0
mysql> ** SELECT GREATEST('B','A','C');**
??????? -> 'C'
在沒有自變量為NULL的情況下,GREATEST()的返回值為NULL。
·???????? _expr_ IN (_value_,...)
- 若_expr_為IN列表中的任意一個值,則其返回值為 1 , 否則返回值為0。假如所有的值都是常數,則其計算和分類根據 _expr_ 的類型進行。這時,使用二分搜索來搜索信息。如IN值列表全部由常數組成,則意味著IN 的速度非常之快。如_expr_是一個區分大小寫的字符串表達式,則字符串比較也按照區分大小寫的方式進行。?
mysql> ** SELECT 2 IN (0,3,5,'wefwf');**
??????? -> 0
mysql> ** SELECT 'wefwf' IN (0,3,5,'wefwf');**
??????? -> 1
IN 列表中所列值的個數僅受限于 max_allowed_packet 值。
為了同SQL 標準相一致,在左側表達式為NULL的情況下,或是表中找不到匹配項或是表中一個表達式為NULL 的情況下,IN的返回值均為NULL。
IN() 語構也可用書寫某些類型的子查詢。請參見[13.2.8.3節,“使用ANY、IN和SOME進行子查詢”](# "13.2.8.3.?Subqueries with ANY, IN, and SOME")。
·???????? _expr_ NOT IN (_value_,...)
這與NOT (_expr_ IN (_value_,...))相同。
- ISNULL(_expr_)
如_expr_為NULL,那么ISNULL() 的返回值為 1,否則返回值為 0。
mysql> ** SELECT ISNULL(1+1);**
??????? -> 0
mysql> ** SELECT ISNULL(1/0);**
??????? -> 1
使用= 的NULL 值對比通常是錯誤的。
?ISNULL() 函數同 IS NULL比較操作符具有一些相同的特性。請參見有關IS NULL 的說明。
·???????? INTERVAL(_N_,_N1_,_N2_,_N3_,...)
假如_N_ < _N1__,_則返回值為0;假如_N_ < _N2_等等,則返回值為1;假如_N_為NULL,則返回值為 -1 。所有的參數均按照整數處理。為了這個函數的正確運行,必須滿足 _N1_ < _N2_ < _N3_ < ……< _Nn_。其原因是使用了二分查找(極快速)。
mysql> ** SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);**
??????? -> 3
mysql> ** SELECT INTERVAL(10, 1, 10, 100, 1000);**
??????? -> 2
mysql> ** SELECT INTERVAL(22, 23, 30, 44, 200);**
??????? -> 0
·???????? LEAST(_value1_,_value2_,...)
在有兩個或多個參數的情況下, 返回值為最小 (最小值)參數。用一下規則將自變量進行對比:
- 假如返回值被用在一個 INTEGER 語境中,或是所有參數均為整數值,則將其作為整數值進行比較。
- 假如返回值被用在一個 REAL語境中,或所有參數均為實值,則 將其作為實值進行比較。
- 假如任意一個參數是一個區分大小寫的字符串,則將參數按照區分大小寫的字符串進行比較。
- 在其它情況下,將參數作為區分大小寫的字符串進行比較。
假如任意一個自變量為NULL,則 LEAST()的返回值為NULL 。
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'
注意,上面的轉換規則在一些邊界情形中會產生一些奇特的結果:??
mysql> ** SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);**
??????? -> -9223372036854775808
發生這種情況的原因是MySQL在整數語境中讀取9223372036854775808.0。整數表示法不利于保存數值,因此它包括一個帶符號整數。
### 12.1.4.?邏輯操作符
在SQL中,所有邏輯 操作符的求值所得結果均為 TRUE、FALSE或 NULL (UNKNOWN)。在 MySQL中,它們體現為? 1 (TRUE)、 0 (FALSE)和 NULL。其大多數都與不同的數據庫SQL通用,然而一些服務器對TRUE的返回值可能是任意一個非零值。
- NOT !
邏輯 NOT。當操作數為0 時,所得值為 1 ;當操作數為非零值時,所得值為? 0 ,而當操作數為NOT NULL時,所得的返回值為 NULL。
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
最后一個例子產生的結果為 1,原因是表達式的計算方式和(!1)+1相同。
- AND &&
邏輯AND。當所有操作數均為非零值、并且不為NULL時,計算所得結果為? 1 ,當一個或多個操作數為0 時,所得結果為 0 ,其余情況返回值為 NULL 。
mysql> ** SELECT 1 && 1;**
??????? -> 1
mysql> ** SELECT 1 && 0;**
??????? -> 0
mysql> ** SELECT 1 && NULL;**
??????? -> NULL
mysql> ** SELECT 0 && NULL;**
??????? -> 0
mysql> ** SELECT NULL && 0;**
??????? -> 0
- OR ||
邏輯 OR。當兩個操作數均為非 NULL值時,如有任意一個操作數為非零值,則結果為1,否則結果為0。當有一個操作數為NULL時,如另一個操作數為非零值,則結果為1,否則結果為 NULL 。假如兩個操作數均為? NULL,則所得結果為 NULL。
mysql> ** SELECT 1 || 1;**
??? ????-> 1
mysql> ** SELECT 1 || 0;**
??????? -> 1
mysql> ** SELECT 0 || 0;**
??????? -> 0
mysql> ** SELECT 0 || NULL;**
??????? -> NULL
mysql> ** SELECT 1 || NULL;**
??????? -> 1
- XOR
邏輯XOR。當任意一個操作數為 NULL時,返回值為NULL。對于非?? NULL 的操作數,假如一個奇數操作數為非零值,則計算所得結果為? 1 ,否則為? 0 。
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
a XOR b 的計算等同于? (a AND (NOT b)) OR ((NOT a)和 b)。
同樣見 [ 12.1.1節,“操作符優先級”](# "12.1.1.?Operator Precedence")。
### 12.2.?控制流程函數
- 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。
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
一個CASE表達式的默認返回值類型是任何返回值的相容集合類型,但具體情況視其所在語境而定。如果用在字符串語境中,則返回結果味字符串。如果用在數字語境中,則返回結果為十進制值、實值或整數值。?
- IF(_expr1_,_expr2_,_expr3_)
如果 _ expr1_是TRUE (_expr1_ <> 0 and _expr1_ <> NULL),則 IF()的返回值為_expr2_; 否則返回值則為 _expr3_。IF() 的返回值為數字值或字符串值,具體情況視其所在語境而定。
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'
如果_expr2_或_expr3_中只有一個明確是 NULL,則IF() 函數的結果類型 為非NULL表達式的結果類型。
_expr1_ 作為一個整數值進行計算,就是說,假如你正在驗證浮點值或字符串值,?? 那么應該使用比較運算進行檢驗。
mysql> ** SELECT IF(0.1,1,0);**
??????? -> 0
mysql> ** SELECT IF(0.1<>0,1,0);**
??????? -> 1
在所示的第一個例子中,IF(0.1)的返回值為0,原因是 0.1 被轉化為整數值,從而引起一個對 IF(0)的檢驗。這或許不是你想要的情況。在第二個例子中,比較檢驗了原始浮點值,目的是為了了解是否其為非零值。比較結果使用整數。
IF() (這一點在其被儲存到臨時表時很重要 ) 的默認返回值類型按照以下方式計算:
<table border="1" cellpadding="0" id="table1"><tr><td> <p><b> <span>表達式</span></b></p></td> <td> <p><b> <span>返回值</span></b></p></td> </tr><tr><td> <p><i> <span> expr2</span></i><span> </span><span>或<i><span>expr3</span></i><span> </span>返回值為一個字符串。</span></p></td> <td> <p> <span>字符串</span></p></td> </tr><tr><td> <p><i> <span> expr2</span></i><span> </span><span>或<i><span>expr3</span></i><span> </span>返回值為一個浮點值。</span></p></td> <td> <p> <span>浮點</span></p></td> </tr><tr><td> <p><i> <span> expr2</span></i><span> </span><span>或 <i> <span>expr3</span></i><span> </span> 返回值為一個整數。<span>? </span></span></p></td> <td> <p> <span>整數</span></p></td> </tr></table>
假如_expr2_和_expr3_ 都是字符串,且其中任何一個字符串區分大小寫,則返回結果是區分大小寫。
- IFNULL(_expr1_,_expr2_)
假如_expr1_不為 NULL,則 IFNULL() 的返回值為 _expr1_; 否則其返回值為 _expr2_。IFNULL()的返回值是數字或是字符串,具體情況取決于其所使用的語境。
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'
IFNULL(_expr1_,_expr2_)的默認結果值為兩個表達式中更加“通用”的一個,順序為STRING、 REAL或 INTEGER。假設一個基于表達式的表的情況,? 或MySQL必須在內存儲器中儲存一個臨時表中IFNULL()的返回值:
CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
在這個例子中,測試列的類型為 CHAR(4)。
- NULLIF(_expr1_,_expr2_)
如果_expr1_ = _expr2_? 成立,那么返回值為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 。
### 12.3.?字符串函數
[ 12.3.1. 字符串比較函數](#)
假如結果的長度大于 max_allowed_packet 系統變量的最大值時,字符串值函數的返回值為NULL。請參見[7.5.2節,“調節服務器參數”](# "7.5.2.?Tuning Server Parameters")。
對于在字符串位置操作的函數,第一個位置的編號為 1。
- ASCII(_str_)
返回值為字符串_str_的最左字符的數值。假如_str_為空字符串,則返回值為 0 。假如_str_為NULL,則返回值為 NULL。 ASCII()用于帶有從 0到255的數值的字符。
mysql> **SELECT ASCII('2');**
??????? -> 50
mysql> **SELECT ASCII(2);**
??????? -> 50
mysql> **SELECT ASCII('dx');**
??????? -> 100
見 ORD()函數。
- BIN(_N_)
返回值為_N_的二進制值的字符串表示,其中? _N_為一個longlong (BIGINT) 數字。這等同于 CONV(_N_,10,2)。假如_N_為NULL,則返回值為 NULL。
mysql> **SELECT BIN(12);**
??????? -> '1100'
- BIT_LENGTH(_str_)
返回值為二進制的字符串_str _長度。
mysql> **SELECT BIT_LENGTH('text');**
??????? -> 32
- CHAR(_N_,... [USING _charset_])
CHAR()將每個參數_N_理解為一個整數,其返回值為一個包含這些整數的代碼值所給出的字符的字符串。NULL值被省略。
mysql> **SELECT CHAR(77,121,83,81,'76');**
??????? -> 'MySQL'
mysql> **SELECT CHAR(77,77.3,'77.3');**
??????? -> 'MMM'
大于 255的CHAR()參數被轉換為多結果字符。 例如,CHAR(256) 相當于 CHAR(1,0), 而CHAR(256*256) 則相當于 CHAR(1,0,0):
mysql> **SELECT HEX(CHAR(1,0)), HEX(CHAR(256));**
+----------------+----------------+
| HEX(CHAR(1,0)) | HEX(CHAR(256)) |
+----------------+----------------+
| 0100?????????? | 0100?????????? |
+----------------+----------------+
mysql> **SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));**
+------------------+--------------------+
| HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |
+------------------+--------------------+
| 010000?????????? | 010000???????????? |
+------------------+--------------------+
CHAR()的返回值為一個二進制字符串。可選擇使用USING語句產生一個給出的字符集中的字符串:
mysql> **SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));**
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
+---------------------+--------------------------------+
| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |
+---------------------+--------------------------------+
| binary????????????? | utf8?????????????????????????? |
+---------------------+--------------------------------+
如果 USING已經產生,而結果字符串不符合給出的字符集,則會發出警告。?? 同樣,如果嚴格的SQL模式被激活,則CHAR()的結果會成為 NULL。
- CHAR_LENGTH(_str_)
返回值為字符串_str_ 的長度,長度的單位為字符。一個多字節字符算作一個單字符。_對于一個_包含五個二字節字符集, LENGTH()返回值為 10, 而CHAR_LENGTH()的返回值為5。
- CHARACTER_LENGTH(_str_)
CHARACTER_LENGTH()是CHAR_LENGTH()的同義詞。
- COMPRESS(_string_to_compress_)
壓縮一個字符串。這個函數要求 MySQL已經用一個諸如zlib的壓縮庫壓縮過。?? 否則,返回值始終是NULL。UNCOMPRESS() 可將壓縮過的字符串進行解壓縮。
mysql> **SELECT LENGTH(COMPRESS(REPEAT('a',1000)));**
?????? ?-> 21
mysql> **SELECT LENGTH(COMPRESS(''));**
??????? -> 0
mysql> **SELECT LENGTH(COMPRESS('a'));**
??????? -> 13
mysql> **SELECT LENGTH(COMPRESS(REPEAT('a',16)));**
??????? -> 15
壓縮后的字符串的內容按照以下方式存儲:
- 空字符串按照空字符串存儲。
- 非空字符串未壓縮字符串的四字節長度進行存儲(首先為低字節),后面是壓縮字符串。如果字符串以空格結尾,就會在后加一個"."號,以防止當結果值是存儲在CHAR或VARCHAR類型的字段列時,出現自動把結尾空格去掉的現象。(不推薦使用 CHAR 或VARCHAR 來存儲壓縮字符串。最好使用一個 BLOB 列代替)。
- CONCAT(_str1_,_str2_,...)???????????????????????
返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。或許有一個或多個參數。 如果所有參數均為非二進制字符串,則結果為非二進制字符串。 如果自變量中含有任一二進制字符串,則結果為一個二進制字符串。一個數字參數被轉化為與之相等的二進制字符串格式;若要避免這種情況,可使用顯式類型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql> **SELECT CONCAT('My', 'S', 'QL');**
??????? -> 'MySQL'
mysql> **SELECT CONCAT('My', NULL, 'QL');**
??????? -> NULL
mysql> **SELECT CONCAT(14.3);**
??????? -> '14.3'
- CONCAT_WS(_separator_,_str1_,_str2_,...)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。?? 第一個參數是其它參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數。如果分隔符為 NULL,則結果為 NULL。函數會忽略任何分隔符參數后的 NULL 值。
mysql> **SELECT CONCAT_WS(',','First name','Second name','Last Name');**
??????? -> 'First name,Second name,Last Name'
mysql> **SELECT CONCAT_WS(',','First name',NULL,'Last Name');**
??????? -> 'First name,Last Name'
CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。
- CONV(_N_,_from_base_,_to_base_)
不同數基間轉換數字。返回值為數字的_N_字符串表示,由_from_base_基轉化為 _to_base _基。如有任意一個參數為NULL,則返回值為 NULL。自變量 _N_ 被理解為一個整數,但是可以被指定為一個整數或字符串。最小基數為 2 ,而最大基數則為 36。 If _to_base_是一個負數,則 _N_被看作一個帶符號數。否則, _N_被看作無符號數。 CONV() 的運行精確度為 64比特。
mysql> **SELECT CONV('a',16,2);**
??????? -> '1010'
mysql> **SELECT CONV('6E',18,8);**
??????? -> '172'
mysql> **SELECT CONV(-17,10,-18);**
??????? -> '-H'
mysql> **SELECT CONV(10+'10'+'10'+0xa,10,10);**
??????? -> '40'
- ELT(_N_,_str1_,_str2_,_str3_,...)
若_N_ = 1,則返回值為? _str1_,若_N_ = 2,則返回值為 _str2_,以此類推。?? 若_N_小于1或大于參數的數目,則返回值為 NULL 。 ELT() 是? FIELD()的補數。
mysql> **SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');**
??????? -> 'ej'
mysql> **SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');**
??????? -> 'foo'
- EXPORT_SET(_bits_,_on_,_off_[,_separator_[,_number_of_bits_]])
返回值為一個字符串,其中對于_bits_值中的每個位組,可以得到一個 _on_ 字符串,而對于每個清零比特位,可以得到一個_off_字符串。_bits_ 中的比特值按照從右到左的順序接受檢驗 (由低位比特到高位比特)。字符串被分隔字符串分開(默認為逗號‘,’),按照從左到右的順序被添加到結果中。_number_of_bits_會給出被檢驗的二進制位數 (默認為 64)。
mysql> **SELECT EXPORT_SET(5,'Y','N',',',4);**
??????? -> 'Y,N,Y,N'
mysql> **SELECT EXPORT_SET(6,'1','0',',',10);**
???? ???-> '0,1,1,0,0,0,0,0,0,0'
- FIELD(_str_,_str1_,_str2_,_str3_,...)
返回值為_str1_, _str2_, _str3_,……列表中的_str_指數。在找不到_str_ 的情況下,返回值為 0 。
如果所有對于FIELD() 的參數均為字符串,則所有參數均按照字符串進行比較。如果所有的參數均為數字,則按照數字進行比較。否則,參數按照雙倍進行比較。
如果_str_為NULL,則返回值為0 ,原因是NULL不能同任何值進行同等比較。FIELD() 是ELT()的補數。
mysql> **SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');**
??????? -> 2
mysql> **SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');**
??????? -> 0
- FIND_IN_SET(_str_,_strlist_)
假如字符串_str_在由_N_ 子鏈組成的字符串列表_strlist_ 中, 則返回值的范圍在 1 到 _N_之間 。一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。如果第一個參數是一個常數字符串,而第二個是type SET列,則?? FIND_IN_SET() 函數被優化,使用比特計算。如果_str_不在_strlist_或_strlist_ 為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。 這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。?
mysql> **SELECT FIND_IN_SET('b','a,b,c,d');**
??????? -> 2
- FORMAT(_X_,_D_)
將number _X_設置為格式 '#,###,###.##', 以四舍五入的方式保留到小數點后_D_位, 而返回結果為一個字符串。詳見[12.9.4節,“其他函數”](# "12.9.4.?Miscellaneous Functions").
- HEX(_N_or_S_)
如果_N_OR_S_是一個數字,則返回一個 十六進制值 _N 的_字符串表示,在這里,?? _N_是一個longlong (BIGINT)數。這相當于 CONV(N,10,16)。
如果_N_OR_S_是一個字符串,則返回值為一個_N_OR_S_的十六進制字符串表示, 其中每個_N_OR_S_ 里的每個字符被轉化為兩個十六進制數字。
mysql> **SELECT HEX(255);**
??????? -> 'FF'
mysql> **SELECT 0x616263;**
??????? -> 'abc'
mysql> **SELECT HEX('abc');**
??????? -> 616263
- INSERT(_str_,_pos_,_len_,_newstr_)
返回字符串 _str_, 其子字符串起始于 _pos_位置和長期被字符串 _newstr_取代的_len_字符。? 如果_pos_超過字符串長度,則返回值為原始字符串。 假如_len_的長度大于其它字符串的長度,則從位置_pos_開始替換。若任何一個參數為null,則返回值為NULL。
mysql> **SELECT INSERT('Quadratic', 3, 4, 'What');**
??????? -> 'QuWhattic'
mysql> **SELECT INSERT('Quadratic', -1, 4, 'What');**
??????? -> 'Quadratic'
mysql> **SELECT INSERT('Quadratic', 3, 100, 'What');**
??????? -> 'QuWhat'
這個函數支持多字節字元。
- INSTR(_str_,_substr_)
返回字符串 _str_中子字符串的第一個出現位置。這和LOCATE()的雙參數形式相同,除非參數的順序被顛倒。?
mysql> **SELECT INSTR('foobarbar', 'bar');**
??????? -> 4
mysql> **SELECT INSTR('xbar', 'foobar');**
??????? -> 0
這個函數支持多字節字元,并且只有當至少有一個參數是二進制字符串時區分大小寫。
- LCASE(_str_)
LCASE() 是 LOWER()的同義詞。
- LEFT(_str_,_len_)
返回從字符串_str_開始的_len_最左字符。
mysql> **SELECT LEFT('foobarbar', 5);**
??????? -> 'fooba'
- LENGTH(_str_)
返回值為字符串_str_的長度,單位為字節。一個多字節字符算作多字節。這意味著 對于一個包含5個2字節字符的字符串, LENGTH() 的返回值為 10, 而 CHAR_LENGTH()的返回值則為5。
mysql> **SELECT LENGTH('text');**
??????? -> 4
- LOAD_FILE(_file_name_)
讀取文件并將這一文件按照字符串的格式返回。 文件的位置必須在服務器上,你必須為文件制定路徑全名,而且你還必須擁有FILE 特許權。文件必須可讀取,文件容量必須小于 max_allowed_packet字節。
若文件不存在,或因不滿足上述條件而不能被讀取, 則函數返回值為 NULL。
mysql> **UPDATE _tbl_name_**
?????????? SET _blob_column_=LOAD_FILE('/tmp/picture')
?????????? WHERE id=1;
- LOCATE(_substr_,_str_) , LOCATE(_substr_,_str_,_pos_)
第一個語法返回字符串 _str_中子字符串_substr_的第一個出現位置。第二個語法返回字符串 _str_中子字符串_substr_的第一個出現位置, 起始位置在_pos_。如若_substr_不在_str_中,則返回值為0。
mysql> **SELECT LOCATE('bar', 'foobarbar');**
??????? -> 4
mysql> **SELECT LOCATE('xbar', 'foobar');**
??????? -> 0
mysql> **SELECT LOCATE('bar', 'foobarbar',5);**
??????? -> 7
這個函數支持多字節字元,并且只有當至少有一個參數是二進制字符串時區分大小寫。?
- LOWER(_str_)
返回字符串 _str_ 以及所有根據最新的字符集映射表變為小寫字母的字符 (默認為? cp1252 Latin1)。
mysql> **SELECT LOWER('QUADRATICALLY');**
??????? -> 'quadratically'
這個函數支持多字節字元。
- LPAD(_str_,_len_,_padstr_)
返回字符串 _str_, 其左邊由字符串_padstr_填補到_len_ 字符長度。假如_str_的長度大于_len_, 則返回值被縮短至 _len_ 字符。
mysql> **SELECT LPAD('hi',4,'??');**
??????? -> '??hi'
mysql> **SELECT LPAD('hi',1,'??');**
??????? -> 'h'
- LTRIM(_str_)
返回字符串 _str_,其引導空格字符被刪除。
mysql> **SELECT LTRIM('? barbar');**
??????? -> 'barbar'
這個函數支持多字節字元。
- MAKE_SET(_bits_,_str1_,_str2_,...)
返回一個設定值 (一個包含被‘,’號分開的字字符串的字符串) ,由在_bits_ 組中具有相應的比特的字符串組成。_str1_對應比特 0, _str2_對應比特1,以此類推。_str1_, _str2_, ...中的 NULL值不會被添加到結果中。
mysql> **SELECT MAKE_SET(1,'a','b','c');**
??????? -> 'a'
mysql> **SELECT MAKE_SET(1 | 4,'hello','nice','world');**
??????? -> 'hello,world'
mysql> **SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');**
??????? -> 'hello'
mysql> **SELECT MAKE_SET(0,'a','b','c');**
??????? -> ''
- MID(_str_,_pos_,_len_)
MID(_str_,_pos_,_len_) 是 SUBSTRING(_str_,_pos_,_len_)的同義詞。
- OCT(_N_)
返回一個 _N_的八進制值的字符串表示,其中 _N_是一個longlong (BIGINT)數。這等同于CONV(N,10,8)。若_N_為 NULL ,則返回值為NULL。
mysql> **SELECT OCT(12);**
??????? -> '14'
- OCTET_LENGTH(_str_)
OCTET_LENGTH() 是 LENGTH()的同義詞。
- ORD(_str_)
若字符串_str_的最左字符是一個多字節字符,則返回該字符的代碼, 代碼的計算通過使用以下公式計算其組成字節的數值而得出:
?? (1st byte code)
+ (2nd byte code × 256)
+ (3rd byte code × 2562) ...
?
假如最左字符不是一個多字節字符,那么 ORD()和函數ASCII()返回相同的值。
mysql> **SELECT ORD('2');**
??????? -> 50
- POSITION(_substr_ IN _str_)
POSITION(_substr_ IN _str_)是 LOCATE(_substr_,_str_)同義詞。
- QUOTE(_str_)
引證一個字符串,由此產生一個在SQL語句中可用作完全轉義數據值的結果。? 返回的字符串由單引號標注,每例都帶有單引號 (‘'’)、 反斜線符號 (‘\’)、 ASCII NUL以及前面有反斜線符號的Control-Z 。如果自變量的值為NULL, 則返回不帶單引號的單詞 “NULL”。
mysql> **SELECT QUOTE('Don\'t!');**
??????? -> 'Don\'t!'
mysql> **SELECT QUOTE(NULL);**
??????? -> NULL
- REPEAT(_str_,_count_)
返回一個由重復的字符串_str_ 組成的字符串,字符串_str_的數目等于_count_。 若 _count_ <= 0,則返回一個空字符串。若_str_或 _count_為 NULL,則返回 NULL 。
mysql> **SELECT REPEAT('MySQL', 3);**
??????? -> 'MySQLMySQLMySQL'
- REPLACE(_str_,_from_str_,_to_str_)
返回字符串_str_以及所有被字符串_to_str_替代的字符串_from_str_。
mysql> **SELECT REPLACE('www.mysql.com', 'w', 'Ww');**
??????? -> 'WwWwWw.mysql.com'
這個函數支持多字節字元。
- REVERSE(_str_)
返回字符串 _str_,順序和字符順序相反。
mysql> **SELECT REVERSE('abc');**
????? ??-> 'cba'
這個函數支持多字節字元。
- RIGHT(_str_,_len_)
從字符串_str_開始,返回最右_len_ 字符。
mysql> **SELECT RIGHT('foobarbar', 4);**
??????? -> 'rbar'
這個函數支持多字節字元。
- RPAD(_str_,_len_,_padstr_)
返回字符串_str_, 其右邊被字符串 _padstr_填補至_len_字符長度。假如字符串_str_的長度大于 _len_,則返回值被縮短到與 _len_字符相同長度。
mysql> **SELECT RPAD('hi',5,'?');**
??????? -> 'hi???'
mysql> **SELECT RPAD('hi',1,'?');**
??????? -> 'h'
這個函數支持多字節字元。
- RTRIM(_str_)
返回字符串 _str_,結尾空格字符被刪去。
mysql> **SELECT RTRIM('barbar?? ');**
??????? -> 'barbar'
這個函數支持多字節字元。
- SOUNDEX(_str_)
從_str_返回一個soundex字符串。 兩個具有幾乎同樣探測的字符串應該具有同樣的 soundex 字符串。一個標準的soundex 字符串的長度為4個字符,然而SOUNDEX() 函數會返回一個人以長度的字符串。 可使用結果中的SUBSTRING() 來得到一個標準 soundex 字符串。在_str_中_,_會忽略所有未按照字母順序排列的字符。 所有不在A-Z范圍之內的國際字母符號被視為元音字母。
mysql> **SELECT SOUNDEX('Hello');**
??????? -> 'H400'
mysql> **SELECT SOUNDEX('Quadratically');**
?????? ?-> 'Q36324'
**注意:**這個函數執行原始的Soundex算法,而非更加流行的加強版本(如D. Knuth所述)。其區別在于原始版本首先會刪去元音,其次是重復,而加強版則首先刪去重復,而后刪去元音。
- _expr1_ SOUNDS LIKE _expr2_
這相當于SOUNDEX(_expr1_) = SOUNDEX(_expr2_)。
- SPACE(_N_)
返回一個由_N_間隔符號組成的字符串。
mysql> **SELECT SPACE(6);**
??????? -> '????? '
- SUBSTRING(_str_,_pos_) , SUBSTRING(_str_ FROM _pos_) SUBSTRING(_str_,_pos_,_len_) , SUBSTRING(_str_ FROM _pos_ FOR _len_)
不帶有_len_參數的格式從字符串_str_返回一個子字符串,起始于位置 _pos_。帶有_len_參數的格式從字符串_str_返回一個長度同_len_字符相同的子字符串,起始于位置 _pos_。 使用 FROM的格式為標準 SQL 語法。也可能對_pos_使用一個負值。假若這樣,則子字符串的位置起始于字符串結尾的_pos_字符,而不是字符串的開頭位置。在以下格式的函數中可以對_pos_使用一個負值。
mysql> **SELECT SUBSTRING('Quadratically',5);**
??????? -> 'ratically'
mysql> **SELECT SUBSTRING('foobarbar' FROM 4);**
??????? -> 'barbar'
mysql> **SELECT SUBSTRING('Quadratically',5,6);**
??????? -> 'ratica'???????
mysql> **SELECT SUBSTRING('Sakila', -3);**
??????? -> 'ila'???????
mysql> **SELECT SUBSTRING('Sakila', -5, 3);**
??????? -> 'aki'
mysql> **SELECT SUBSTRING('Sakila' FROM -4 FOR 2);**
??????? -> 'ki'
這個函數支持多字節字元。
注意,如果對_len_使用的是一個小于1的值,則結果始終為空字符串。
SUBSTR()是 SUBSTRING()的同義詞。
- SUBSTRING_INDEX(_str_,_delim_,_count_)
在定界符 _delim_以及_count_出現前,從字符串_str_返回自字符串。若_count_為正值,則返回最終定界符(從左邊開始)左邊的一切內容。若_count_為負值,則返回定界符(從右邊開始)右邊的一切內容。
mysql> **SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);**
??????? -> 'www.mysql'
mysql> **SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);**
??????? -> 'mysql.com'
這個函數支持多字節字元。
- TRIM([{BOTH | LEADING | TRAILING} [_remstr_] FROM] _str_) TRIM(_remstr_ FROM] _str_)
返回字符串 _str_, 其中所有_remstr_前綴和/或后綴都已被刪除。若分類符BOTH、LEADIN或TRAILING中沒有一個是給定的,則假設為BOTH 。 _remstr_ 為可選項,在未指定情況下,可刪除空格。
mysql> **SELECT TRIM('? bar?? ');**
??????? -> 'bar'
mysql> **SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');**
??????? -> 'barxxx'
mysql> **SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');**
??????? -> 'bar'
mysql> **SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');**
? ??????-> 'barx'
這個函數支持多字節字元。
- UCASE(_str_)
UCASE()是UPPER()的同義詞。
- UNCOMPRESS(_string_to_uncompress_)
對經COMPRESS()函數壓縮后的字符串進行解壓縮。若參數為壓縮值,則結果為 NULL。這個函數要求? MySQL 已被諸如zlib 之類的壓縮庫編譯過。否則, 返回值將始終是 NULL。
mysql> **SELECT UNCOMPRESS(COMPRESS('any string'));**
??????? -> 'any string'
mysql> **SELECT UNCOMPRESS('any string');**
??????? -> NULL
- UNCOMPRESSED_LENGTH(_compressed_string_)
返回壓縮字符串壓縮前的長度。
mysql> **SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));**
??????? -> 30
- UNHEX(_str_)
執行從HEX(_str_)的反向操作。就是說,它將參數中的每一對十六進制數字理解為一個數字,并將其轉化為該數字代表的字符。結果字符以二進制字符串的形式返回。
mysql> **SELECT UNHEX('4D7953514C');**
??????? -> 'MySQL'
mysql> **SELECT 0x4D7953514C;**
??????? -> 'MySQL'
mysql> **SELECT UNHEX(HEX('string'));**
??????? -> 'string'
mysql> **SELECT HEX(UNHEX('1267'));**
??????? -> '1267'
- UPPER(_str_)
返回字符串_str,_ 以及根據最新字符集映射轉化為大寫字母的字符 (默認為cp1252 Latin1).
mysql> **SELECT UPPER('Hej');**
??????? -> 'HEJ'
該函數支持多字節字元。
### 12.3.1.?字符串比較函數
根據,MySQL 會自動將數字轉化為字符串,反之亦然。?
mysql> **SELECT 1+'1';**
??????? -> 2
mysql> **SELECT CONCAT(2,' test');**
??????? -> '2 test'
若想要將數字明確地轉化為字符串,可使用 CAST()或 CONCAT()函數:
mysql> **SELECT 38.8, CAST(38.8 AS CHAR);**
??????? -> 38.8, '38.8'
mysql> **SELECT 38.8, CONCAT(38.8);**
??????? -> 38.8, '38.8'
CAST() 比較可取。.
若已經對一個字符串函數給定一個二進制字符串作為參數, 則所得到的結果字符串也是一個二進制字符串。一個轉化為字符串的數字被作為二進制字符串對待。這僅會對比較結果產生影響。
一般而言, 若字符串比較中任意一個表達式是區分大小寫的,則執行比較時也區分大小寫。?
- _expr_ LIKE _pat_ [ESCAPE '_escape-char_']
模式匹配,使用SQL簡單正規表達式比較。返回1 (TRUE) 或 0 (FALSE)。 若 _expr_或 _pat_中任何一個為 NULL,則結果為 NULL。
模式不需要為文字字符串。例如,可以被指定為一個字符串表達式或表列。
在模式中可以同LIKE一起使用以下兩種通配符:
<table border="1" cellpadding="0" id="table2"><tr><td> <p> <b> <span> 字符</span></b></p></td> <td> <p> <b> <span> 說明</span></b></p></td> </tr><tr><td> <p> <span> %</span></p></td> <td> <p> <span> 匹配任何數目的字符,甚至包括零字符<span>? </span></span></p></td> </tr><tr><td> <p> <span> _</span></p></td> <td> <p> <span> 只能匹配一種字符 </span></p></td> </tr></table>
mysql> **SELECT 'David!' LIKE 'David_';**
??????? -> 1
mysql> **SELECT 'David!' LIKE '%D%v%';**
??????? -> 1
若要對通配符的文字實例進行檢驗, 可將轉義字符放在該字符前面。如果沒有指定 ESCAPE字符, 則假設為‘\’。
<table border="1" cellpadding="0" id="table3"><tr><td> <p> <b> <span> 字符串</span></b></p></td> <td width="103"> <p> <b> <span> 說明</span></b></p></td> </tr><tr><td> <p> <span> \%</span></p></td> <td colspan="2"> <p> <span> 匹配一個<span>? </span>‘<span>%</span>’字符</span></p></td> </tr><tr><td> <p> <span> \_</span></p></td> <td colspan="2"> <p> <span> 匹配一個 ‘<span>_</span>’ 字符</span></p></td> </tr></table>
mysql> **SELECT 'David!' LIKE 'David\_';**
??????? -> 0
mysql> **SELECT 'David_' LIKE 'David\_';**
??????? -> 1
要指定一個不同的轉義字符,可使用ESCAPE語句:
mysql> **SELECT 'David_' LIKE 'David|_' ESCAPE '|';**
??????? -> 1
轉義序列可以為空,也可以是一個字符的長度。 從 MySQL 5.1.2開始, 如若 NO_BACKSLASH_ESCAPES SQL模式被激活, 則該序列不能為空。
以下兩個語句舉例說明了字符串比較不區分大小寫,除非其中一個操作數為二進制字符串:
mysql> **SELECT 'abc' LIKE 'ABC';**
??????? -> 1
mysql> **SELECT 'abc' LIKE BINARY 'ABC';**
??????? -> 0
在MySQL中, LIKE 允許出現在數字表達式中。 (這是標準SQL LIKE 的延伸)。
mysql> **SELECT 10 LIKE '1%';**
??????? -> 1
**注釋**: 由于 MySQL在字符串中使用 C轉義語法(例如, 用‘\n’代表一個換行字符),在LIKE字符串中,必須將用到的‘\’雙寫。例如, 若要查找 ‘\n’, 必須將其寫成 ‘\\n’。而若要查找 ‘\’, 則必須將其寫成 it as ‘\\\\’;原因是反斜線符號會被語法分析程序剝離一次,在進行模式匹配時,又會被剝離一次,最后會剩下一個反斜線符號接受匹配。
- _expr_ NOT LIKE _pat_ [ESCAPE '_escape-char_']
這相當于 NOT (_expr_ LIKE _pat_ [ESCAPE '_escape-char_'])。
- _expr_ NOT REGEXP _pat__expr_ NOT RLIKE _pat_
這相當于NOT (_expr_ REGEXP _pat_)。
- _expr_ REGEXP _pat__expr_ RLIKE _pat_
執行字符串表達式 _expr_ 和模式_pat_ 的模式匹配。該模式可以被延伸為正規表達式。正規表達式的語法在[附錄G:](#)[_MySQL正則表達式_](# "Appendix?G.?MySQL Regular Expressions")中有詳細討論。若_expr_匹配 _pat,_則返回 1; 否則返回0。若 _expr_或 _pat_ 任意一個為 NULL, 則結果為 NULL。 RLIKE 是REGEXP的同義詞, 作用是為mSQL 提供兼容性。
模式不需要為文字字符串。例如,可以被指定為一個字符串表達式或表列。
**注釋**:由于在字符串中, MySQL使用 C 轉義語法 (例如, 用‘\n’來代表換行字符 ),在REGEXP字符串中必須將用到的‘\’ 雙寫。
REGEXP 不區分大小寫, 除非將其同二進制字符串同時使用。
mysql> **SELECT 'Monty!' REGEXP 'm%y%%';**
??????? -> 0
mysql> **SELECT 'Monty!' REGEXP '.*';**
??????? -> 1
mysql> **SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';**
??????? -> 1
mysql> **SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';**
??????? -> 1? 0
mysql> **SELECT 'a' REGEXP '^[a-d]';**
??????? -> 1
在確定字符類型時,REGEXP 和 RLIKE 使用當前字符集 (默認為cp1252 Latin1 )。 **警告:**這些操作符不支持多字節字元。
- STRCMP(_expr1_,_expr2_)
若所有的字符串均相同,則返回STRCMP(),若根據當前分類次序,第一個參數小于第二個,則返回? -1,其它情況返回 1 。
mysql> **SELECT STRCMP('text', 'text2');**
??????? -> -1
mysql> **SELECT STRCMP('text2', 'text');**
??????? -> 1
mysql> **SELECT STRCMP('text', 'text');**
??????? -> 0
在執行比較時,STRCMP() 使用當前字符集。這使得默認的比較區分大小寫,當操作數中的一個或兩個都是二進制字符串時除外。
### 12.4.?數值函數
[ 12.4.1. 算術操作符](#)[ 12.4.2. 數學函數](#)
### 12.4.1.?算術操作符
可使用常見的算術操作符。注意就 -、 +和 *而言, 若兩個參數均為正數,則其計算結果的精確度為 BIGINT (64比特),若其中一個參數為無符號整數, 而其它參數也是整數, 則結果為無符號整數。請參見[12.8節,“Cast函數和操作符”](# "12.8.?Cast Functions and Operators")。
- +
加號:
mysql> **SELECT 3+5;**
??????? -> 8
- -
減號:
mysql> **SELECT 3-5;**
??????? -> -2
- -
一元減號。更換參數符號。
mysql> **SELECT - 2;**
??????? -> -2
**注意**:若該 操作符同一個BIGINT同時使用,則返回值也是一個BIGINT。這意味著你應當盡量避免對可能產生–263的整數使用 –。
- *
乘號:
mysql> **SELECT 3*5;**
??????? -> 15
mysql> **SELECT 18014398509481984*18014398509481984.0;**
??????? -> 324518553658426726783156020576256.0
mysql> **SELECT 18014398509481984*18014398509481984;**
??????? -> 0
最后一個表達式的結果是不正確的。原因是整數相乘的結果超過了BIGINT 計算的 64比特范圍。 (見[11.2節,“數值類型”](# "11.2.?Numeric Types").)
- /
除號:
mysql> **SELECT 3/5;**
??????? -> 0.60
被零除的結果為 NULL:
mysql> **SELECT 102/(1-1);**
??????? -> NULL
只有當執行的語境中,其結果要被轉化為一個整數時 ,除法才會和 BIGINT 算法一起使用。
- DIV
整數除法。 類似于 FLOOR(),然而使用BIGINT 算法也是可靠的。
mysql> **SELECT 5 DIV 2;**
??????? -> 2
### 12.4.2.?數學函數
若發生錯誤,所有數學函數會返回 NULL 。
- ABS(_X_)
返回_X_的絕對值。
mysql> **SELECT ABS(2);**
??????? -> 2
mysql> **SELECT ABS(-32);**
??????? -> 32
該函數支持使用BIGINT值。
- ACOS(_X_)
返回_X_反余弦, 即, 余弦是_X_的值。若_X_不在-1到 1的范圍之內,則返回 NULL 。
mysql> **SELECT ACOS(1);**
??????? -> 0
mysql> **SELECT ACOS(1.0001);**
??????? -> NULL
mysql> **SELECT ACOS(0);**
??????? -> 1.5707963267949
- ASIN(_X_)
返回_X_的反正弦,即,正弦為_X_的值。若_X_? 若_X_不在-1到 1的范圍之內,則返回 NULL 。
?
mysql> SELECT ASIN(0.2);
??????? -> 0.20135792079033
mysql> SELECT ASIN('foo');
?
+-------------+
| ASIN('foo') |
+-------------+
|?????????? 0 |
+-------------+
1 row in set, 1 warning (0.00 sec)
?
mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------+
| Level?? | Code | Message??????? ?????????????????????????|
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'foo' |
+---------+------+-----------------------------------------+
- ATAN(_X_)
返回_X_的反正切,即,正切為_X_的值。
mysql> **SELECT ATAN(2);**
??????? -> 1.1071487177941
mysql> **SELECT ATAN(-2);**
??????? -> -1.1071487177941
- ATAN(_Y_,_X_) , ATAN2(_Y_,_X_)
返回兩個變量_X_及_Y_的反正切。 它類似于 _Y_或 _X_的反正切計算,? 除非兩個參數的符號均用于確定結果所在象限。
mysql> **SELECT ATAN(-2,2);**
??????? -> -0.78539816339745
mysql> **SELECT ATAN2(PI(),0);**
??? ????-> 1.5707963267949
- CEILING(_X_) CEIL(_X_)
返回不小于_X_的最小整數值。
mysql> **SELECT CEILING(1.23);**
??????? -> 2
mysql> **SELECT CEIL(-1.23);**
??????? -> -1
這兩個函數的意義相同。注意返回值會被轉化為一個BIGINT。
- COS(_X_)
返回_X_的余弦,其中_X_在弧度上已知。?
mysql> **SELECT COS(PI());**
??????? -> -1
- COT(_X_)
返回_X_的余切。
mysql> **SELECT COT(12);**
??????? -> -1.5726734063977
mysql> **SELECT COT(0);**
??????? -> NULL
- CRC32(_expr_)
計算循環冗余碼校驗值并返回一個 32比特無符號值。若參數為NULL ,則結果為 NULL。該參數應為一個字符串,而且在不是字符串的情況下會被作為字符串處理(若有可能)。
mysql> **SELECT CRC32('MySQL');**
??????? -> 3259397556
mysql> **SELECT CRC32('mysql');**
??????? -> 2501908538
- DEGREES(_X_)
返回參數 _X_, 該參數由弧度被轉化為度。
mysql> **SELECT DEGREES(PI());**
??????? -> 180
mysql> **SELECT DEGREES(PI() / 2);**
??????? -> 90
- EXP(_X_)
返回e的_X_乘方后的值(自然對數的底)。
mysql> **SELECT EXP(2);**
??????? -> 7.3890560989307
mysql> **SELECT EXP(-2);**
??????? -> 0.13533528323661
mysql> **SELECT EXP(0);**
??????? -> 1
- FLOOR(_X_)
返回不大于_X_的最大整數值 。
mysql> **SELECT FLOOR(1.23);**
??????? -> 1
mysql> **SELECT FLOOR(-1.23);**
??????? -> -2
注意,返回值會被轉化為一個 BIGINT。
- FORMAT(_X_,_D_)
將數字_X_的格式寫成'#,###,###.##'格式, 即保留小數點后 _D_位,而第D位的保留方式為四舍五入,然后將結果以字符串的形式返回。詳見[12.9.4節,“其他函數”](# "12.9.4.?Miscellaneous Functions")。
- LN(_X_)
返回_X_的自然對數,即,_ X_相對于基數e 的對數。
mysql> **SELECT LN(2);**
??????? -> 0.69314718055995
mysql> **SELECT LN(-2);**
??????? -> NULL
這個函數同LOG(_X_)具有相同意義。
- LOG(_X_) LOG(_B_,_X_)
若用一個參數調用,這個函數就會返回_X_的自然對數。
mysql> **SELECT LOG(2);**
??????? -> 0.69314718055995
mysql> **SELECT LOG(-2);**
??????? -> NULL
若用兩個參數進行調用,這個函數會返回_X_對于任意基數_B_ 的對數。
mysql> **SELECT LOG(2,65536);**
??????? -> 16
mysql> **SELECT LOG(10,100);**
? ??????-> 2
LOG(_B_,_X_) 就相當于 LOG(_X_) / LOG(_B_)。
- LOG2(_X_)
返回_X_的基數為2的對數。
mysql> **SELECT LOG2(65536);**
??????? -> 16
mysql> **SELECT LOG2(-100);**
??????? -> NULL
對于查出存儲一個數字需要多少個比特,LOG2()非常有效。這個函數相當于表達式 LOG(_X_) / LOG(2)。
- LOG10(_X_)
返回_X_的基數為10的對數。
mysql> **SELECT LOG10(2);**
? ??????-> 0.30102999566398
mysql> **SELECT LOG10(100);**
??????? -> 2
mysql> **SELECT LOG10(-100);**
??????? -> NULL
LOG10(_X_)相當于LOG(10,_X_)。
- MOD(_N_,_M_) , _N_ % _M__N_ MOD _M_
模操作。返回_N_被 _M_除后的余數。
mysql> **SELECT MOD(234, 10);**
??????? -> 4
mysql> **SELECT 253 % 7;**
??????? -> 1
mysql> **SELECT MOD(29,9);**
??????? -> 2
mysql> **SELECT 29 MOD 9;**
??????? -> 2
這個函數支持使用BIGINT 值。
MOD() 對于帶有小數部分的數值也起作用, 它返回除法運算后的精確余數:
mysql> **SELECT MOD(34.5,3);**
??????? -> 1.5
- PI()
返回 ? (pi)的值。默認的顯示小數位數是7位,然而 MySQL內部會使用完全雙精度值。
mysql> **SELECT PI();**
??????? -> 3.141593
mysql> **SELECT PI()+0.000000000000000000;**
??????? -> 3.141592653589793116
- POW(_X_,_Y_) , POWER(_X_,_Y_)
返回_X_的_Y_乘方的結果值。
mysql> **SELECT POW(2,2);**
??????? -> 4
mysql> **SELECT POW(2,-2);**
??????? -> 0.25
- RADIANS(_X_)
返回由度轉化為弧度的參數 _X_,? (注意 ?弧度等于180度)。
mysql> **SELECT RADIANS(90);**
??????? -> 1.5707963267949
- RAND() RAND(_N_)
返回一個隨機浮點值 _v_ ,范圍在 0 到1 之間 (即, 其范圍為 0 ≤ _v_≤ 1.0)。若已指定一個整數參數 _N_,則它被用作種子值,用來產生重復序列。?
mysql> **SELECT RAND();**
??????? -> 0.9233482386203
mysql> **SELECT RAND(20);**
??????? -> 0.15888261251047
mysql> **SELECT RAND(20);**
??????? -> 0.15888261251047
mysql> **SELECT RAND();**
??????? -> 0.63553050033332
mysql> **SELECT RAND();**
??????? -> 0.70100469486881
mysql> **SELECT RAND(20);**
??????? -> 0.15888261251047
若要在_i_≤ _R_≤ _j_這個范圍得到一個隨機整數_R_,需要用到表達式 FLOOR(_i_ + RAND() * (_j_– _i_ + 1))。例如, 若要在7 到 12 的范圍(包括7和12)內得到一個隨機整數, 可使用以下語句:
SELECT FLOOR(7 + (RAND() * 6));
在ORDER BY語句中,不能使用一個帶有RAND()值的列,原因是 ORDER BY 會計算列的多重時間。然而,可按照如下的隨機順序檢索數據行:
mysql> **SELECT * FROM _tbl_name_ ORDER BY RAND();**
ORDER BY RAND()同 LIMIT 的結合從一組列中選擇隨機樣本很有用:
mysql> **SELECT * FROM table1, table2 WHERE a=b AND c<d**
??? -> **ORDER BY RAND() LIMIT 1000;**
注意,在WHERE語句中,WHERE每執行一次, RAND()就會被再計算一次。
RAND()的作用不是作為一個精確的隨機發生器,而是一種用來發生在同樣的 MySQL版本的平臺之間的可移動_ad hoc_隨機數的快速方式。
- ROUND(_X_) ROUND(_X_,_D_)
返回參數_X_, 其值接近于最近似的整數。在有兩個參數的情況下,返回 _X_,其值保留到小數點后_D_位,而第_D_位的保留方式為四舍五入。若要接保留_X_值小數點左邊的_D_位,可將 _D_ 設為負值。
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
返回值的類型同 第一個自變量相同(假設它是一個整數、雙精度數或小數)。這意味著對于一個整數參數,結果也是一個整數(無小數部分)。
當第一個參數是十進制常數時,對于準確值參數,ROUND() 使用精密數學題庫:
- 對于準確值數字, ROUND() 使用“四舍五入” 或“舍入成最接近的數” 的規則:對于一個分數部分為 .5或大于 .5的值,正數則上舍入到鄰近的整數值, 負數則下舍入臨近的整數值。(換言之, 其舍入的方向是數軸上遠離零的方向)。對于一個分數部分小于.5 的值,正數則下舍入下一個整數值,負數則下舍入鄰近的整數值,而正數則上舍入鄰近的整數值。
- 對于近似值數字,其結果根據C 庫而定。在很多系統中,這意味著 ROUND()的使用遵循“舍入成最接近的偶數”的規則: 一個帶有任何小數部分的值會被舍入成最接近的偶數整數。
以下舉例說明舍入法對于精確值和近似值的不同之處:
mysql> **SELECT ROUND(2.5), ROUND(25E-1);**
+------------+--------------+
| ROUND(2.5) | ROUND(25E-1) |
+------------+--------------+
| 3????????? |??????????? 2 |
+------------+--------------+
詳見[第24章:](#)[_精度數學_](# "Chapter?24.?Precision Math")。
- SIGN(_X_)
返回參數作為-1、 0或1的符號,該符號取決于_X_的值為負、零或正。
mysql> **SELECT SIGN(-32);**
??????? -> -1
mysql> **SELECT SIGN(0);**
??????? -> 0
mysql> **SELECT SIGN(234);**
??????? -> 1
- SIN(_X_)
返回_X_正弦,其中 _X_ 在弧度中被給定。
mysql> **SELECT SIN(PI());**
??????? -> 1.2246063538224e-16
mysql> **SELECT ROUND(SIN(PI()));**
??????? -> 0
- SQRT(_X_)
返回非負數_X_的二次方根。
mysql> **SELECT SQRT(4);**
??????? -> 2
mysql> **SELECT SQRT(20);**
??????? -> 4.4721359549996
mysql> **SELECT SQRT(-16);**
??????? -> NULL???????
- TAN(_X_)
返回_X_的正切,其中_X_ 在弧度中被給定。
mysql> **SELECT TAN(PI());**
??????? -> -1.2246063538224e-16
mysql> **SELECT TAN(PI()+1);**
??????? -> 1.5574077246549
- TRUNCATE(_X_,_D_)
返回被舍去至小數點后_D_位的數字_X_。若_D_的值為 0, 則結果不帶有小數點或不帶有小數部分。可以將D設為負數,若要截去(歸零) 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
所有數字的舍入方向都接近于零。
### 12.5.?日期和時間函數
本章論述了一些可用于操作時間值的函數。關于每個時間和日期類型具有的值域及指定值的有效格式,請參見[11.3節,“日期和時間類型”](# "11.3.?Date and Time Types")。
下面的例子使用了時間函數。以下詢問選擇了最近的 30天內所有帶有date_col 值的記錄:
mysql> **SELECT _something_ FROM _tbl_name_**
??? -> **WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= _date_col_;**
注意,這個詢問也能選擇將來的日期記錄。?
用于日期值的函數通常會接受時間日期值而忽略時間部分。而用于時間值的函數通常接受時間日期值而忽略日期部分。
返回各自當前日期或時間的函數在每次詢問執行開始時計算一次。這意味著在一個單一詢問中,對諸如NOW() 的函數多次訪問總是會得到同樣的結果(未達到我們的目的,單一詢問也包括對存儲程序或觸發器和被該程序/觸發器調用的所有子程序的調用 )。這項原則也適用于 CURDATE()、 CURTIME()、 UTC_DATE()、 UTC_TIME()、UTC_TIMESTAMP(),以及所有和它們意義相同的函數。
CURRENT_TIMESTAMP()、 CURRENT_TIME()、 CURRENT_DATE()以及FROM_UNIXTIME()函數返回連接當前時區內的值,這個值可用作time_zone系統變量的值。此外, UNIX_TIMESTAMP() 假設其參數為一個當前時區的時間日期值。請參見[5.10.8節,“MySQL服務器時區支持”](# "5.10.8.?MySQL Server Time Zone Support")。
以下函數的論述中返回值的范圍會請求完全日期。 若一個日期為“零” 值,或者是一個諸如'2001-11-00'之類的不完全日期, 提取部分日期值的函數可能會返回 0。 例如, DAYOFMONTH('2001-11-00') 會返回0。
- ADDDATE(_date_,INTERVAL _expr__type_) ADDDATE(_expr_,_days_)
當被第二個參數的INTERVAL格式激活后, ADDDATE()就是DATE_ADD()的同義詞。相關函數SUBDATE() 則是DATE_SUB()的同義詞。對于INTERVAL參數上的信息 ,請參見關于DATE_ADD()的論述。
mysql> **SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);**
??????? -> '1998-02-02'
mysql> **SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);**
??????? -> '1998-02-02'
若 _days_參數只是整數值,則 MySQL 5.1將其作為天數值添加至 _expr_。
mysql> **SELECT ADDDATE('1998-01-02', 31);**
??????? -> '1998-02-02'
- ADDTIME(_expr_,_expr2_)
ADDTIME()將 _expr2_添加至_expr_然后返回結果。 _expr_ 是一個時間或時間日期表達式,而_expr2_是一個時間表達式。
mysql> **SELECT ADDTIME('1997-12-31 23:59:59.999999',**
??? ->?? ?????????????**'1 1:1:1.000002');**
??????? -> '1998-01-02 01:01:01.000001'
mysql> **SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');**
??????? -> '03:00:01.999997'
- CONVERT_TZ(_dt_,_from_tz_,_to_tz_)
CONVERT_TZ() 將時間日期值_dt_從_from_tz_ 給出的時區轉到_to_tz_給出的時區,然后返回結果值。關于可能指定的時區的詳細論述,請參見[5.10.8節,“MySQL服務器時區支持”](# "5.10.8.?MySQL Server Time Zone Support")。若自變量無效,則這個函數會返回 NULL。
在從若_from_tz_到UTC的轉化過程中,該值超出 TIMESTAMP 類型的被支持范圍,那么轉化不會發生。關于 TIMESTAMP 范圍的論述,請參見[11.1.2節,“日期和時間類型概述”](# "11.1.2.?Overview of Date and Time Types")。
mysql> **SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');**
??????? -> '2004-01-01 13:00:00'
mysql> **SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');**
??????? -> '2004-01-01 22:00:00'
**注釋**:若要使用諸如 'MET'或 'Europe/Moscow'之類的指定時間區,首先要設置正確的時區表。詳細說明見[5.10.8節,“MySQL服務器時區支持”](# "5.10.8.?MySQL Server Time Zone Support")。?
- CURDATE()
將當前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式的值返回,具體格式根據函數用在字符串或是數字語境中而定。
mysql> **SELECT CURDATE();**
??????? -> '1997-12-15'
mysql> **SELECT CURDATE() + 0;**
??????? -> 19971215
- CURRENT_DATE CURRENT_DATE()
CURRENT_DATE和CURRENT_DATE()是的同義詞.
- CURTIME()
將當前時間以'HH:MM:SS'或 HHMMSS 的格式返回, 具體格式根據函數用在字符串或是數字語境中而定。?
mysql> **SELECT CURTIME();**
??????? -> '23:50:26'
mysql> **SELECT CURTIME() + 0;**
??????? -> 235026
- CURRENT_TIME, CURRENT_TIME()
CURRENT_TIME 和CURRENT_TIME() 是CURTIME()的同義詞。
- CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP和 CURRENT_TIMESTAMP()是NOW()的同義詞。
- DATE(_expr_)
提取日期或時間日期表達式_expr_中的日期部分。
mysql> **SELECT DATE('2003-12-31 01:02:03');**
??????? -> '2003-12-31'
- DATEDIFF(_expr_,_expr2_)
DATEDIFF() 返回起始時間 _expr_和結束時間_expr2_之間的天數。_Expr_和_expr2_為日期或 date-and-time 表達式。計算中只用到這些值的日期部分。
mysql> **SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');**
??????? -> 1
mysql> **SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');**
??????? -> -31
- DATE_ADD(_date_,INTERVAL _expr__type_) DATE_SUB(_date_,INTERVAL _expr__type_)
這些函數執行日期運算。 _date_ 是一個 DATETIME 或DATE值,用來指定起始時間。 _expr_ 是一個表達式,用來指定從起始日期添加或減去的時間間隔值。? _Expr_是一個字符串;對于負值的時間間隔,它可以以一個 ‘-’開頭。 _type_為關鍵詞,它指示了表達式被解釋的方式。?
關鍵詞INTERVA及 _type_分類符均不區分大小寫。
以下表顯示了_type_
- 前言
- 1. 一般信息
- 2. 安裝MySQL
- 3. 教程
- 4. MySQL程序概述
- 5. 數據庫管理
- 6. MySQL中的復制
- 7. 優化
- 8. 客戶端和實用工具程序
- 9. 語言結構
- 10. 字符集支持
- 11. 列類型
- 12. 函數和操作符
- 13. SQL語句語法
- 14. 插件式存儲引擎體系結構
- 15. 存儲引擎和表類型
- 16. 編寫自定義存儲引擎
- 17. MySQL簇
- 18. 分區
- 19. MySQL中的空間擴展
- 20. 存儲程序和函數
- 21. 觸發程序
- 22. 視圖
- 23. INFORMATION_SCHEMA信息數據庫
- 24. 精度數學
- 25. API和庫
- 26. 連接器
- 27. 擴展MySQL
- A. 問題和常見錯誤
- B. 錯誤代碼和消息
- C. 感謝
- D. MySQL變更史
- E. 移植到其他系統
- F. 環境變量
- G. MySQL正則表達式
- H. MySQL中的限制
- I. 特性限制
- J. GNU通用公共許可
- K. MySQL FLOSS許可例外
- 索引