1. 程式人生 > >WHERE語句中BETWEEN與IN的使用教程-MySQL

WHERE語句中BETWEEN與IN的使用教程-MySQL

MySQL BETWEEN 用法
MySQL BETWEEN 語法
BETWEEN 運算子用於 WHERE 表示式中,選取介於兩個值之間的資料範圍。BETWEEN 同 AND 一起搭配使用,語法如下:

WHERE column BETWEEN value1 AND value2
WHERE column NOT BETWEEN value1 AND value2

通常 value1 應該小於 value2。當 BETWEEN 前面加上 NOT 運算子時,表示與 BETWEEN 相反的意思,即選取這個範圍之外的值。
BETWEEN 例項
選取 uid 在 2 到 5 之間的使用者資料:

SELECT * FROM user WHERE uid BETWEEN 2 AND 5

返回查詢結果如下:

20151216160201795.png (639×132)

除了數值型別外,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 1230739199

// DATE 格式,查詢 2008-08-08 到 2009-01-01 零點之前的資料
SELECT * FROM table WHERE column_time BETWEEN '2008-08-08' AND '2009-01-01'

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

可見,同樣的需求,不同的欄位型別,寫法可能就不一樣。從效率上來講,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 為 2、3、5 的使用者資料:

SELECT * FROM user WHERE uid IN (2,3,5)

返回查詢結果如下:

20151216160410446.png (638×104)

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 運算子的。

相關推薦

MySQLWHERE語句BETWEENIN的使用教程

MySQLBETWEEN 運算符用於 WHERE 表達式中,選取介於兩個值之間的數據範圍。BETWEEN 同 AND 一起搭配使用,語法如下: WHERE column BETWEEN value1 AND value2WHERE column NOT BETWEEN value1 AND value2 通常

WHERE語句BETWEENIN的使用教程-MySQL

MySQL BETWEEN 用法MySQL BETWEEN 語法 BETWEEN 運算子用於 WHERE 表示式中,選取介於兩個值之間的資料範圍。BETWEEN 同 AND 一起搭配使用,語法如下: WHERE column BETWEEN value1 AND valu

Mysql 數據查詢語句between and 是包含邊界值的

數據查詢 repl use ref net bsp 使用 一個數 not MySQL的sql語句中可以使用between來限定一個數據的範圍,例如: select * from user where userId between 5 and 7; 查詢userId為5、6,

淺析MySQLexistsin的使用 (寫的非常好)

轉自http://sunxiaqw.blog.163.com/blog/static/990654382013430105130443/ exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為

sql語句 havingwhere區別

HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。 HAVING語句的存在彌補了WHERE關鍵字不能與聚合函式聯合使用的不足。     CREATE TABLE `tp5_student` (  &

mysqlEXISTSIN用法比較

1、使用方式: (1)EXISTS用法 select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b where a.projectId = b.i

mysqllimitin不能同時使用的解決辦法

我就有以下的列子來解釋吧,這樣會更好的理解的! 一、新增teacher表和student表 teacher表 student表 二、假如只能同時二個人來查詢老師的資訊,請寫出sql語句實現 S

MySQLexistsin的使用 以及查詢效率比較

exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條

SQL語句exists和in的區別

splay 比較 server for target 空值 不存在 依次 第一個 轉自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/artic

SQL語句事務try catch使用

SQL中的事務和try catch普通SQL事務: begin transaction tr declare @error int; set @error=0; select * from Car_Brand set @error=@error+@@ERROR select 1/

循環語句break continue的區別

ret tty dsm csdn 循環 ade 跳出循環 com %d 循環語句中break 與 continue的區別 總結: 1 break; while循環break是用於永久終止循環。即不執行本次循環中break後面的語句,直接跳出循環。 2con

SqlEXISTSIN的使用及效率

in 和exists 對於以上兩種查詢條件,in是把外表和內表作hash 連線,而exists 是對外表作loop 迴圈,每次loop 迴圈再對內表進行查詢。 一直以來認為exists 比in 效率高的說法是不準確的。在不同的情況下,exists與in的效能各有優缺項,如果查詢的兩個表大小相當,那麼用in

迴圈語句break continue的區別

迴圈語句中break 與 continue的區別 總結: 1 break; while迴圈break是用於永久終止迴圈。即不執行本次迴圈中break後面的語句,直接跳出迴圈。 2continue; while迴圈continue是用於終止本次迴圈。即本次迴圈中c

淺談Oracleexistsin的執行效率問題

淺談Oracle中exists與in的執行效率問題 原創 Oracle 作者:迷倪小魏 時間:2017-11-29 13:43:30  5149  1 in 是把外表和內表作hash join,而exist

SQL語句exists和in的區別?

查詢中涉及到的兩個表,一個books和一個borrow表,具體表的內容如下: 書單(books)表: 借書表borrow IN 一、確定給定的值是否與子查詢或列表中的值相匹配。in在查詢的時候,首先查詢子查詢的表,然後將內表和外表做一個笛卡爾

SQLEXISTSIN的效率問題

一起學習一下;有兩個簡單例子,以說明 “exists”和“in”的效率問題1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;    T1資料量小而T2資料量非常大時,T1<<T

sql語句between...and邊界取值的問題

資料庫版本為SQL server2005 select * from table1 where number between 1 and 5 執行這條語句之後的結果是包含了1和5的 select * from table1 where number not b

oracle的sql語句timestamp字串轉換

字串轉timestamp: update tb_a t set t.upd_timestamp=to_timestamp('2012-12-12 12:12:12.0','yyyy-mm-dd hh24:mi:ss.ff')  where t.id='1' timest

在sql語句替換Not In 的方法

insert into stuinfo(Username,Objjc,Sex,Classid) values ('李明','文科','女','123')insert into stuinfo(Username,Objjc,Sex,Classid)values ('王二','理科','男','121')inse

mysql front安裝使用教程 mysql 工具

數據庫導入 自己的 mys 密碼 setup.exe png 復制 我們 img mysql front安裝與使用教程 由 kaikai0220 創建,Alma 最後一次修改 2018-04-25 mysql front一款小巧的管理Mysql的應用工具,那麽這