msyql SELECT 和 WHERE 教程
SQL 語句中的 select_expression 或 where_definition 可由任何使用了下面所描述函數的表達式組成。
包含 NULL 的表達式總是得出一個 NULL 值結果,除非表達式中的操作和函數在文檔中有另外的說明。
注意:在一個函數名和跟隨它的括號之間必須不存在空格。這有助於 MySQL 語法分析程序區分函數調用和對恰巧與函數同名表或列的引用。然而,參數左右兩邊的空格卻是允許的。
你可以強制 MySQL 接受函數名後存在空格的形式,這需要通過以 --ansi 選項啟動 mysqld,或在 mysql_connect() 中使用 CLIENT_IGNORE_SPACE,但是,在這種情況下,所有的函數名均將成為保留字。查看章節 1.8.2 以 ANSI 模式運行 MySQL.
為了簡潔,從 mysql 程序輸出的例子以縮寫的形式顯示。因此:
mysql> SELECT MOD(29,9);
1 rows in set (0.00 sec)
+-----------+
| mod(29,9) |
+-----------+
| 2 |
+-----------+
將被顯示為這樣:
mysql> SELECT MOD(29,9);
-> 2
6.3.1 無類型的特殊運算符和函數
6.3.1.1 圓括號
( ... )
括號,使用它來強制一個表達式的計算順序。
mysql> SELECT 1+2*3;
-> 7
mysql> SELECT (1+2)*3;
-> 9
6.3.1.2 比較運算符
比較運算符的結果是 1 (TRUE)、0 (FALSE) 或 NULL。這些函數可工作於數字和字符串上。根據需要,字符串將會自動地被轉換到數字,以及數字被轉換成字符串(比如在 Perl 中)。
MySQL 使用下列規則進行比較:
如果一個或兩個參數是 NULL,比較的結果是 NULL,除了 <=> 運算符。
如果在一個比較操作中兩個參數均是字符串,他們將作為字符串被比較。
如果兩個參數均是整數,他們作為整數被比較。
十六進制值如果不與一個數字進行比較,那麼它將當作一個二進制字符串。
如果參數之一是一個 TIMESTAMP 或 DATETIME 列,而另一參數是一個常數,在比較執行之前,這個常數被轉換為一個時間戳。這樣做是為了對 ODBC 更友好。
在所有其它情況下,參數作為浮點(real)數字被比較。
缺省地,字符串使用當前字符集以忽略字母大小寫的方式進行比較(缺省的字符集為 ISO-8859-1 Latin1,它對英語處理得很出色)。
下面的例子演示了對於比較操作字符串到數字的轉換:
mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
=
等於:
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
<>
!=
不等於:
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
<=>
NULL 值安全等於:
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 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
為了能夠與其它程序更好的工作,在使用 IS NULL 是 MySQL 支持下列額外選擇性:
通過它,你可以找到最後插入的記錄行:
SELECT * FROM tbl_name WHERE auto_col IS NULL
這個操作可以通過設置 SQL_AUTO_IS_NULL=0 來禁止。查看章節 5.5.6 SET 句法.
對於 NOT NULL 的 DATE 和 DATETIME 列,可以通過使用下列語句找到特殊的值 0000-00-00:
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) ,只要所有的參數均是相同的類型。 否則類型會依照上面的規則發生轉換,但是應用於所有三個參數。注意,在 MySQL 4.0.5 之前,參數被轉換到 expr 的類型。
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)。
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
從 MySQL 4.1 開始(符合 SQL-99 標准),如果左手邊的表達式是 NULL,或者在列表中沒有發現相匹配的值並且列表中的一個表達式是 NULL,IN 均返回 NULL。
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 值使用 = 進行比較總是為 false !
COALESCE(list)
返回列表中第一個非 NULL 的元素:
mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
INTERVAL(N,N1,N2,N3,...)
Returns 如果 N < N1 返回 0,如果 N < N2 返回 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
如果以任何一個標准運算符(=, <>..., 但除了 LIKE)對一個忽略大小寫的字符串進行比較,尾部的空白空間(空格、TAB 和換行)均被忽略。