佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > MySQL全面瓦解之查詢的過濾條件詳解

MySQL全面瓦解之查詢的過濾條件詳解

熱門標簽:百度競價排名 呼叫中心市場需求 服務(wù)外包 地方門戶網(wǎng)站 AI電銷 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) Linux服務(wù)器

概述

在實際的業(yè)務(wù)場景應(yīng)用中,我們經(jīng)常要根據(jù)業(yè)務(wù)條件獲取并篩選出我們的目標數(shù)據(jù)。這個過程我們稱之為數(shù)據(jù)查詢的過濾。而過濾過程使用的各種條件(比如日期時間、用戶、狀態(tài))是我們獲取精準數(shù)據(jù)的必要步驟,

這樣才能得到我們期望的結(jié)果。所以本章我們來學(xué)習MySQL中查詢過濾條件的各種用法。

關(guān)系運算

關(guān)系運算就是where語句后跟上一個或者n個條件,滿足where后面條件的數(shù)據(jù)會被返回,反之不滿足的就會被過濾掉。operators指的是運算符 ,有如下幾種情況:


運算符 說明
= 等于
> 或者 != 不等于
> 大于
>= 大于等于
小于
= 小于等于

關(guān)系運算基本的語法格式如下:

 select cname1,cname2,... from tname where cname operators cval 

等于=

查詢出 列和后面的值嚴格相等的數(shù)據(jù),非值類型的需要對后面值加上引號,值類型的不需要。

語法格式如下:

select cname1,cname2,... from tname where cname = cval;
mysql> select * from user2;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+----------+-----+
3 rows in set

mysql> select * from user2 where name='helen';
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 2 | helen | 20 | quanzhou | 0 |
+----+-------+-----+----------+-----+
1 row in set

mysql> select * from user2 where age=21;
+----+-------+-----+---------+-----+
| id | name | age | address | sex |
+----+-------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+---------+-----+
2 rows in set

不等于(>、!=)

不等于有兩種寫法,一種是>,另一種是!=,意思一樣,可隨意切換使用,但是 > 先于 != 出現(xiàn),所以看很多以前的例子,> 出現(xiàn)頻率比較高,可移植性更強,推薦使用。

不等于的目的是查詢出與條件不符和結(jié)果,格式如下:

select cname1,cname2,... from tname where cname > cval;
或
select cname1,cname2,... from tname where cname != cval;
mysql> select * from user2;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+----------+-----+
3 rows in set

mysql> select * from user2 where age>20;
+----+-------+-----+---------+-----+
| id | name | age | address | sex |
+----+-------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+---------+-----+
2 rows in set

大于小于(> )

一般用于數(shù)值或者日期、時間類型的比較,格式如下:

select cname1,cname2,... from tname where cname > cval;

select cname1,cname2,... from tname where cname  cval;

select cname1,cname2,... from tname where cname >= cval;

select cname1,cname2,... from tname where cname = cval;
mysql> select * from user2 where age>20;
+----+-------+-----+---------+-----+
| id | name | age | address | sex |
+----+-------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+---------+-----+
2 rows in set

mysql> select * from user2 where age>=20;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+----------+-----+
3 rows in set

mysql> select * from user2 where age21;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 2 | helen | 20 | quanzhou | 0 |
+----+-------+-----+----------+-----+
1 row in set

mysql> select * from user2 where age=21;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+----------+-----+
3 rows in set

邏輯運算  

運算符 說明
AND 多個條件都成立
OR 多個條件中滿足一個
NOT 對條件進行取非操作

AND(且)

當需要多個條件進行數(shù)據(jù)過濾的時候,使用這種方式,and的每個表達式都是要成立,過濾出來的數(shù)據(jù)就是用戶需要的。

下面過濾出年齡和性別兩個條件都成立的數(shù)據(jù),語法格式如下:

select cname1,cname2,... from tname where cname1 operators cval1 and cname2 operators cval2 
mysql> select * from user2;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
+----+-------+-----+----------+-----+
4 rows in set

mysql> select * from user2 where age >20 and sex=1;
+----+-------+-----+---------+-----+
| id | name | age | address | sex |
+----+-------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 4 | weng | 33 | guizhou | 1 |
+----+-------+-----+---------+-----+
2 rows in set

OR(或)

當多個條件中只要滿足一個條件即進行數(shù)據(jù)過濾。

下面條件過濾出年齡大于21歲和小于21歲的數(shù)據(jù),語法格式如下:

select cname1,cname2,... from tname where cname1 operators cval1 or cname2 operators cval2 
mysql> select * from user2;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
+----+-------+-----+----------+-----+
4 rows in set

mysql> select * from user2 where age>21 or age21;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 2 | helen | 20 | quanzhou | 0 |
| 4 | weng | 33 | guizhou | 1 |
+----+-------+-----+----------+-----+
2 rows in set

NOT(取非)

對某個滿足的條件進行取反,過濾出來的數(shù)據(jù)就是用戶需要的。

下面過濾不屬于年齡大于20的數(shù)據(jù),語法格式如下:

select cname1,cname2,... from tname where not(cname operators cval) 
mysql> select * from user2;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
+----+-------+-----+----------+-----+
4 rows in set

mysql> select * from user2 where not(age>20);
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 2 | helen | 20 | quanzhou | 0 |
+----+-------+-----+----------+-----+
1 row in set

模糊匹配

就像我們上面的那個用戶表信息表(包含名稱、年齡、地址、性別),當我們要查詢名稱為s開頭的用戶時,就可以用到 like 關(guān)鍵字了,他用以模糊匹配數(shù)據(jù)。

語法格式如下,pattern中可以包含通配符,有兩種。%:表示匹配任意一個或n個字符; _:表示匹配任意一個字符。

select cname1,cname2,... from tname where cname like pattern; 

%的使用

mysql> select * from user2;
+----+--------+-----+----------+-----+
| id | name | age | address | sex |
+----+--------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+----------+-----+
5 rows in set

mysql> select * from user2 where name like 's%';
+----+--------+-----+---------+-----+
| id | name | age | address | sex |
+----+--------+-----+---------+-----+
| 3 | sol | 21 | xiamen | 0 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+---------+-----+
2 rows in set

_的使用

mysql> select * from user2;
+----+--------+-----+----------+-----+
| id | name | age | address | sex |
+----+--------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+----------+-----+
5 rows in set

mysql> select * from user2 where name like 's_l';
+----+------+-----+---------+-----+
| id | name | age | address | sex |
+----+------+-----+---------+-----+
| 3 | sol | 21 | xiamen | 0 |
+----+------+-----+---------+-----+
1 row in set

注意點

1、不要過度使用模糊匹配得通配符。如果其他操作符能達到相同的目的,應(yīng)該使用其他操作符

2、對大體量的表進行模糊匹配的時候盡量不要以%開頭,比如 like '%username',這樣會執(zhí)行掃表,效率較慢。盡量明確模糊查找的開頭部分,比如 like 'brand%',會先定位到brand開頭的數(shù)據(jù),效率高很多。

范圍值檢查

BETWEEN AND(區(qū)間查詢)

操作符 BETWEEN … AND 會選取介于兩個值之間的數(shù)據(jù)范圍,這些值可以是數(shù)值、文本或者日期,屬于一個閉區(qū)間查詢。

and 的左邊val1 和 右邊 val2 分別表示兩個臨界值,等同于數(shù)學(xué)公式[val1,val2] ,屬于這兩個區(qū)間的數(shù)據(jù)會被過濾出來(>=val1 和 =val2),所以語法格式如下:

 selec cname1,cname2,... from tname where cname between val1 and val2;
 等同于
 selec cname1,cname2,... from tname where cname >= val1 and cname = val2;

查詢年齡在[21,25]之間的數(shù)據(jù):

mysql> select * from user2;
+----+--------+-----+----------+-----+
| id | name | age | address | sex |
+----+--------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+----------+-----+
5 rows in set

mysql> select * from user2 where age between 21 and 25;
+----+--------+-----+---------+-----+
| id | name | age | address | sex |
+----+--------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 3 | sol | 21 | xiamen | 0 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+---------+-----+
3 rows in set

mysql> select * from user2 where age >= 21 and age = 25;
+----+--------+-----+---------+-----+
| id | name | age | address | sex |
+----+--------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 3 | sol | 21 | xiamen | 0 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+---------+-----+
3 rows in set

IN(包含查詢)

按照上面得數(shù)據(jù),如果我們想查出居住地位于福州和廈門得用戶數(shù)據(jù),應(yīng)該使用 IN操作符,因為 IN 操作符允許我們在 WHERE 子句中指定多個值,符合這些值中得某一項,既滿足條件返回數(shù)據(jù)。

語法格式如下,in 后面列表的值類型必須一致或兼容,且不支持通配符:

select cname1,cname2,... from tname where cname in (val1,val2,...);
mysql> select * from user2;
+----+--------+-----+----------+-----+
| id | name | age | address | sex |
+----+--------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+----------+-----+
5 rows in set

mysql> select * from user2 where address in('fuzhou','xiamen');
+----+-------+-----+---------+-----+
| id | name | age | address | sex |
+----+-------+-----+---------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 3 | sol | 21 | xiamen | 0 |
+----+-------+-----+---------+-----+
2 rows in set

NOT IN(對包含查詢?nèi)》矗?/strong>

我們上面已經(jīng)學(xué)習過了not得用戶,對not后面執(zhí)行得表達式進行取反得操作,測試下:

mysql> select * from user2;
+----+--------+-----+----------+-----+
| id | name | age | address | sex |
+----+--------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+----------+-----+
5 rows in set

mysql> select * from user2 where address not in('fuzhou','quanzhou','xiamen');
+----+--------+-----+---------+-----+
| id | name | age | address | sex |
+----+--------+-----+---------+-----+
| 4 | weng | 33 | guizhou | 1 |
| 5 | selina | 25 | taiwang | 0 |
+----+--------+-----+---------+-----+
2 rows in set

空值檢查

IS NULL/IS NOT NULL

判斷是否為空,語法格式如下,這邊注意的是,對值為null的數(shù)據(jù),各種比較運算符、like、between and、in、not in查詢都不起作用,只有is null 能夠過濾出來。

 select cname1,cname2,... from tname where cname is null;
 或者
 select cname1,cname2,... from tname where cname is not null;
mysql> select * from user2 where address is null;
+----+--------+-----+---------+-----+
| id | name | age | address | sex |
+----+--------+-----+---------+-----+
| 5 | selina | 25 | NULL | 0 |
+----+--------+-----+---------+-----+
1 row in set

mysql> select * from user2 where address is not null;
+----+-------+-----+----------+-----+
| id | name | age | address | sex |
+----+-------+-----+----------+-----+
| 1 | brand | 21 | fuzhou | 1 |
| 2 | helen | 20 | quanzhou | 0 |
| 3 | sol | 21 | xiamen | 0 |
| 4 | weng | 33 | guizhou | 1 |
+----+-------+-----+----------+-----+
4 rows in set

有一種關(guān)鍵字 =>,可以包含對null值得判斷,但是目前用的比較少了,有興趣可以去查查,這邊不贅述。

總結(jié)

1、like表達式中的%匹配一個到多個任意字符,_匹配一個任意字符

2、空值查詢需要使用IS NULL或者IS NOT NULL,其他查詢運算符對NULL值無效。即使%通配符可以匹配任何東西,也不能匹配值NULL的數(shù)據(jù)。

3、建議創(chuàng)建表的時候,表字段不設(shè)置空,給字段一個default 默認值。

4、MySQL支持使用NOT對IN 、BETWEEN 和EXISTS子句取反 。

到此這篇關(guān)于MySQL全面瓦解之查詢的過濾條件的文章就介紹到這了,更多相關(guān)MySQL查詢的過濾條件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • mysql查詢條件not in 和 in的區(qū)別及原因說明
  • mysql條件查詢and or使用方法及優(yōu)先級實例分析
  • 詳解Mysql查詢條件中字符串尾部有空格也能匹配上的問題
  • MySQL查詢條件常見用法詳解
  • MySQL查詢條件中in會用到索引嗎
  • mysql 帶多個條件的查詢方式

標簽:銅川 蘭州 仙桃 湖南 湘潭 黃山 衡水 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL全面瓦解之查詢的過濾條件詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    体育| 静宁县| 龙海市| 溆浦县| 邯郸县| 瑞丽市| 富蕴县| 云阳县| 兴城市| 六枝特区| 北票市| 河间市| 酉阳| 莆田市| 连州市| 高碑店市| 沙坪坝区| 长乐市| 铅山县| 张家界市| 嘉义县| 诸城市| 垦利县| 寿宁县| 三明市| 乌兰察布市| 江津市| 常宁市| 桂阳县| 准格尔旗| 福清市| 桃园县| 黑水县| 井冈山市| 木兰县| 沐川县| 大厂| 登封市| 年辖:市辖区| 黑龙江省| 宜宾市|