首頁 >資料庫 >mysql教程 >mysql 操作符

mysql 操作符

伊谢尔伦
伊谢尔伦原創
2016-11-23 13:08:411049瀏覽

1. 操作符優先順序

以下列表顯示了操作符優先順序的低到高的順序。排列在同一行的操作符具有相同的優先權。

:=

||, OR, XOR

&&, AND

NOT

BETWEEN, CASE, WHEN, THEN, ELSE

BETWEEN, CASE, WHEN, THEN, ELSE

=, >, , !=, IS, LIKE, REGEXP, IN

|

&

>

-, +

*, /, DIV, %, MOD

-, +

*, /, DIV, %, MOD

號), ~ (一元位元反轉)

!

BINARY, COLLATE

註釋:假如 HIGH_NOT_PRECEDENCE SQL 模式被激活,則 NOT 的優先順序相同。

2. 圓括號

( ... )使用括弧來規定表達式的運算順序,例如:

mysql> SELECT 1+2*3;
        -> 7
mysql> SELECT (1+2)*3;
        -> 9

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()將字串值轉為不同的字元集。

以下例子說明了比較運算中將字串轉為數字的過程:

mysql> SELECT 1 > '6x';

-> 0

mysql> SELECT 7 > '6x';

mysql> SELECT 0 > 'x6';

-> 0

mysql> SELECT 0 = 'x6';

-> 1

,將一個字串進行比較時注意不能使用列中的索引進行快速尋找。假如str_col 是編入索引的字串列,則在下列語句中,索引不能執行查找功能:

SELECT * FROM tbl_name WHERE str_col=1;

其原因是許多不同的字串都可轉換為數值 1: '1'、 ' 1'、 '1a'、 …

=

等於:

mysql> SELECT 1 = 0;

-> 0

>

-> 1

mysql> SELECT '0.0' = 0;

-> 1

mysql> SELECT '0.01' = 0;

-> 0313%

-> 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

> 1

> ';

-> 0

mysql> SELECT 'zapp' 'zappp';

-> 1

小於或等於:

mysql> SELECT 0.1

-> 1

小於:

mysql> SELECT 2 2; :

mysql> SELECT 2 >= 2;

-> 1

>

大於:

mysql> SELECT 2 > 2;

根據一個布林值來檢定一個值,在這裡,布林值可以是TRUE、FALSE或UNKNOWN。

mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;

-> 1, 1, 1

mysql> SELECT 1 IS NOT UNKNOWN,

mysql> SELECT 1 IS NOT UNKNOWN,

mysql> SELECT 1 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

mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL; 1, 1, 0

為了能夠順利的使用ODBC 程式工作,在使用IS NULL時,MySQL支援額外特性:

在一個值產生後,立即執行一個以下格式的語句,從而找到最新AUTO_INCREMENT 值的所在行:

o                     SELECT * FROM tbl_name WHERE auto_col IS N

對於命名為NOT NULL 的DATE 和DATETIME列,可透過使用以下的語句找到特定日期 '0000-00-00':

o      date_column IS NULL

運行這一步驟需要使用一些 ODBC應用軟體,因為 ODBC本身不支援一個 '0000-00-00'的時間值。

expr BETWEEN min AND max

假如expr大於或等於 min 且expr 小於或等於max, 則BETWEEN 的回復值為1,或為0。若所有參數都是同一類型,則上述關係相當於表達式   (min 

mysql> SELECT 1 BETWEEN 2 AND 3;

-> 0

mysql> SELECT 'b' BETWEEN 'a' AND 'c';

> 75-> 1my ;

-> 1

mysql> SELECT 2 BETWEEN 2 AND 'x-3';

-> 0

expr NOT BETWEEN min ANDAND 0

expr NOT BETWEEN min收到

· COALESCE(value,...)

傳回值為清單當中的第一個非 NULL值,在沒有非NULL 值得情況下傳回值為 NULL 。

mysql> SELECT COALESCE(NULL,1);

-> 1

mysql> SELECT COALESCE(NULL,NULL,NULL);

-> NULLvalue

當有2或多個參數時,傳回值為最大(最大值的)參數。比較參數所依據的規律同LEAST()相同。

mysql> SELECT GREATEST(2,0);

-> 2

mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);M 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');

IN 清單中所列值的個數僅受限於 max_allowed_pa​​cket 值。

為了同SQL 標準相一致,在左側表達式為NULL的情況下,或是表中找不到匹配項或是表中一個表達式為NULL 的情況下,IN的回傳值均為NULL。

IN() 語構也可用書寫某些類型的子查詢。

· 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

ISNULL() 函數同 IS NULL比較運算子具有一些相同的特性。請參閱IS NULL 的說明。

· INTERVAL(N,N1,N2,N3,...)

假如N 

mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);

-> 3

mysql> SELECT INTERVAL(10, 1, 10, 1001,

mysql> SELECT INTERVAL(22, 23, 30, 44, 200);

-> 0

· LEAST(value1,value2,...)

· 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,5.0,767.0);

-> 3.05% A','C');

-> 'A'

注意,上面的轉換規則在一些邊界情形中會產生一些奇特的結果:

mysql> SELECT CAST(LEAST(3600, 92233720368547758.03720368547758 );

-> -9223372036854775808

發生這種情況的原因是MySQL在整數語境中讀取9223372036854775808.0。整數表示法不利於保存數值,因此它包括一個帶符號整數。

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

my> ) ;

-> 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

my 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

my> 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

my 1 XOR 1 XOR 1;

-> 1

a XOR b 的計算等同於  (a AND (NOT b)) OR ((NOT a)和 b)。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn