BETWEEN 運算符用於 WHERE 表達式中,選取介於兩個值之間的數據範圍。BETWEEN 同 AND 一塊兒搭配使用,語法以下:數據庫
WHERE column BETWEEN value1 AND value2
WHERE column NOT BETWEEN value1 AND value2ide
一般 value1 應該小於 value2。當 BETWEEN 前面加上 NOT 運算符時,表示與 BETWEEN 相反的意思,即選取這個範圍以外的值。
BETWEEN 實例
選取 uid 在 2 到 5 之間的用戶數據:ui
SELECT * FROM user WHERE uid BETWEEN 2 AND 5索引
除了數值類型外,BETWEEN 也支持字符串範圍,以下選擇出全部 username 介於 a 至 j 之間的用戶(幷包括單字母k/K):
SELECT * FROM user WHERE username BETWEEN 'a' AND 'k'
字符範圍也支持漢字,但一般來講沒什麼意義。
MySQL BETWEEN 邊界
雖然幾乎全部的數據庫都支持 BETWEEN ... AND 運算符,但不一樣的數據庫對 BETWEEN ... AND 處理方式是有差別的。在 MySQL 中,BETWEEN 包含了 value1 和 value2 邊界值,如上面選取 uid 在 2 到 5 之間的用戶數據例子。
而有的數據庫則不包含 value1 和 value2 邊界值(相似於 > and <),也有數據庫包含 value1 而不包含 value2(相似於 >= and <)。因此在使用 BETWEEN ... AND 的時候,請檢查你的數據庫是如何處理 BETWEEN 邊界值的。
MySQL BETWEEN 時間日期
BETWEEN AND 經常使用於檢索時間或日期段內的內容,下面是一些常見的 BETWEEN 時間日期例子:字符串
// int 時間戳格式,查詢 2008-08-08 20:00:00 到 2009-01-01 零點以前的數據
SELECT * FROM table WHERE column_time BETWEEN 1218196800 AND 1230739199it
// DATE 格式,查詢 2008-08-08 到 2009-01-01 零點以前的數據
SELECT * FROM table WHERE column_time BETWEEN '2008-08-08' AND '2009-01-01'table
// DATETIME 格式,查詢 2008-08-08 20:00:00 到 2009-01-01 零點以前的數據
SELECT FROM table WHERE column_time BETWEEN '2008-08-08 20:00:00' AND '2008-12-31 23:59:59'
但對於查詢到當前時間的數據,建議使用 >= 運算符:
// DATETIME 格式,查詢 2008-08-08 20:00:00 到當前時刻的數據
SELECT FROM table WHERE column_time >= '2008-08-08 20:00:00'class
可見,一樣的需求,不一樣的字段類型,寫法可能就不同。從效率上來說,int 時間戳格式效率最優。
以上 BETWEEN 的各個例子,雖然都是 SELECT 查詢,但 BETWEEN 也能夠用於 UPDATE、DELETE 等適用 WHERE 表達式的 SQL 中。
MySQL BETWEEN 數據比較
BETWEEN 還具備數據比較功能,語法以下:效率
expr BETWEEN min AND max語法
當 expr 表達式的值大於或等於 min 且小於或等於 max 時, BETWEEN 的返回值爲 1 ,不然返回 0 。利用這個功能,能夠判斷一個表達式或值不然在某個區間:
// 返回 0
SELECT 1 BETWEEN 2 AND 3
// 返回 1
SELECT 'b' BETWEEN 'a' AND 'c'
// 判斷日期範圍
SELECT 20080808 BETWEEN 20080101 AND 20090101
BETWEEN 與 <、<=、>=、> 等運算符在某些狀況下有着相似的功能,但 BETWEEN 運算級別更高且效率上更甚一籌。固然因爲 BETWEEN 存在邊界值的問題而不夠靈活,所以不一樣的狀況,採用何種運算符,須要具體對待。
MySQL IN 用法
MySQL IN 語法
IN 運算符用於 WHERE 表達式中,以列表項的形式支持多個選擇,語法以下:
WHERE column IN (value1,value2,...)
WHERE column NOT IN (value1,value2,...)
當 IN 前面加上 NOT 運算符時,表示與 IN 相反的意思,即不在這些列表項內選擇。
IN 使用實例
選取 uid 爲 二、三、5 的用戶數據:
SELECT * FROM user WHERE uid IN (2,3,5)
IN 子查詢
更多狀況下,IN 列表項的值是不明確的,而多是經過一個子查詢獲得的:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)
在這個 SQL 例子裏,咱們實現了查出全部狀態爲 0 的用戶(多是被禁止)的全部文章。首先經過一個查詢獲得全部全部 status=0 的用戶:
SELECT uid FROM user WHERE status=0
而後將查詢結果做爲 IN 的列表項以實現最終的查詢結果,注意在子查詢中返回的結果必須是一個字段列表項。
IN 運算符補充說明
IN 列表項不只支持數字,也支持字符甚至時間日期類型等,而且能夠將這些不一樣類型的數據項混合排列而無須跟 column 的類型保持一致:
SELECT * FROM user WHERE uid IN(1,2,'3','c')
一個 IN 只能對一個字段進行範圍比對,若是要指定更多字段,可使用 AND 或 OR 邏輯運算符:
SELECT * FROM user WHERE uid IN(1,2) OR username IN('admin','5idev')
使用 AND 或 OR 邏輯運算符後,IN 還能夠和其餘如 LIKE、>=、= 等運算符一塊兒使用。
關於 IN 運算符的效率問題
若是 IN 的列表項是肯定的,那麼能夠用多個 OR 來代替:
SELECT FROM user WHERE uid IN (2,3,5)
// 等效爲:
SELECT FROM user WHERE (uid=2 OR aid=3 OR aid=5)
通常認爲,若是是對索引字段進行操做,使用 OR 效率高於 IN,但對於列表項不肯定的時候(如須要子查詢獲得結果),就必須使用 IN 運算符。另外,對於子查詢表數據小於主查詢的時候,也是適用 IN 運算符的。