MySQL 單表過濾方式詳解

要對(duì)表里的數(shù)據(jù)進(jìn)行過濾,則在select語句后邊加上where和過濾條件。

過濾原理有兩種:全表掃描過濾、索引掃描過濾。

▲ 全表掃描過濾的原理:

從表的第一行的第一列開始掃描數(shù)據(jù),一直掃描到第一行的最后一列,如果滿足過濾條件(條件為真),則取出該行數(shù)據(jù),如果不滿足過濾條件(條件為假),則不要改行數(shù)據(jù),接著從第二行第一列掃描到第二行的最后一列,判斷是否滿足過濾條件,滿足取出改行數(shù)據(jù),不滿足不要改行數(shù)據(jù),一直重復(fù)這個(gè)操作到表的最后一行的第一列到最后一列。把所有滿足條件的行的數(shù)據(jù)取出來。這個(gè)過程叫全表掃描過濾。

▲ 索引掃描過濾:

如果過濾時(shí)進(jìn)行的是索引掃描,則從表的第一行的索引列開始掃描判斷是否滿足過濾條件,其他列不掃描判斷,滿足過濾條件取出改行數(shù)據(jù),不滿足過濾條件不要改行數(shù)據(jù)。接著掃描第二行索引列,第三索引列,一致到表的最后一行的索引列,把滿足過濾條件的行取出來,這個(gè)過程叫索引掃描過濾,索引掃描過濾要比全表掃描過濾快很多。

索引:將表的某一列作為了表的索引,相當(dāng)于把該列作為了表的目錄一樣。

過濾方式通常包括以下7類:使用比較謂詞進(jìn)行過濾,使用范圍謂詞進(jìn)行過濾,使用集合成員謂詞進(jìn)行過濾,使用模糊匹配謂詞進(jìn)行過濾,對(duì)空值進(jìn)行過濾,使用not關(guān)鍵字過濾,使用limit子句過濾。

1)使用比較謂詞進(jìn)行過濾;

比較謂詞有:> < >= <= = <>或!=

語法:ve(代表列名) 比較謂詞 常量。

常量:就是一個(gè)由字符串或者數(shù)字,或者日期時(shí)間構(gòu)成的一個(gè)固定值,字符串常量和日期時(shí)間常量都要用單引號(hào)或雙引號(hào)括起來。

查找王五同學(xué)的信息。

select * from student where sname="王五";

查找年齡大于20歲的學(xué)生有哪些?

select * from student where sage>20;

查找市場(chǎng)價(jià)格大于1000的商品有哪些?

select * from ecs_goods where market_price>1000;

2)使用范圍謂詞BETWEEN進(jìn)行過濾

語法:ve BETWEEN A and B; 等價(jià)于 ve>=A and ve<=B;

查找年齡在15到18歲之間的學(xué)生有哪些?

select * from student where sage BETWEEN 15 and 18;

select * from student where sage >= 15 and sage<=18;

查找工資在2000到3000之間的員工有哪些?

select * from emp where sal BETWEEN 2000 and 3000;

select * from emp where sal>=2000 and sal<=3000;

3)使用集合成員謂詞in進(jìn)行過濾

語法:ve in (x1,x2,...,xn); 等價(jià)于 ve=x1 or ve=x2 or ... or ve=xn;

查找劉關(guān)張三兄弟的信息。

select * from student where sname in ("劉備","關(guān)羽","張飛");

select * from student where sname="劉備" or sname="關(guān)羽" or sname="張飛";

查找崗位為銷售、經(jīng)理的人有哪些?

select * from emp where job="salesman" or job="manager";

select * from emp where job in ("salesman" , "manager");

4)使用模糊匹配謂詞like進(jìn)行過濾

語法:ve like "普通字符+通配符";

通配符:%,_

%代表匹配任意0個(gè)或多個(gè)字符 。比如: abc%代表以abc開頭的字符。 %abc代表以abc結(jié)尾的字符。

%abc%代表包含了abc的字符。

_代表匹配任意單個(gè)字符。 比如:abc_ 代表以abc開頭緊接著后邊還有一字符的字符,abc_h

查找姓張的同學(xué)有哪些。

select * from student where sname like "張%";

查找姓張的同學(xué)且姓名由三個(gè)字構(gòu)成。

select * from student where sname like "張__";

查找商品描述中包含諾基亞三個(gè)字的商品有哪些?

select * from ecs_goods where goods_desc like "%諾基亞%";

5)對(duì)空值進(jìn)行過濾

mysql中空值有兩種類型:一種是什么都不顯示的空,一種是顯示為null的空,某一列值只可能會(huì)出現(xiàn)其中一種空值類型。而oracle數(shù)據(jù)庫中只有null的空值。

什么都不顯示的空值過濾語法:ve="";

顯示為null的空值過濾語法為:ve is null;

查找商品描述為空的商品有哪些?

select * from ecs_goods where goods_desc="";

查找用戶表中沒有設(shè)置密保的用戶有哪些?

select * from ecs_users where passwd_question is null;

6)使用not關(guān)鍵字進(jìn)行過濾

not關(guān)鍵字就是取非的意思,一般和和上邊我們學(xué)到的過濾方式結(jié)合起來使用。

not ve 比較謂詞 常量

什么都不顯示的空值過濾語法:ve<>"";

顯示為null的空值過濾語法為:ve is not null;

ve not like "普通字符+通配符"

ve not in (x1,x2,...,xn); 等價(jià)于 ve<>x1 and ve<>x2 and ... and ve<>xn;

ve not BETWEEN A and B; 等價(jià)于 veB;

查找商品搜索關(guān)鍵字非空的商品有哪些。

select * from ecs_goods where keywords<>"";

select * from ecs_goods where not keywords="";

查找商品描述非空的商品有哪些。

select * from ecs_goods where goods_desc<>"";

查找設(shè)了密碼問題的用戶有哪些?

select * from ecs_users where passwd_answer is not null;

查找不姓張的同學(xué)有哪些?

select * from student where sname not like "張%";

查找年齡不是15歲,14歲,13歲學(xué)生有哪些。

select * from student where sage not in(13,14,15);

select * from student where sage <>13 and sage<>14 and sage<>15;

查找商品售價(jià)不在1000到2000之間的商品有哪些?

select * from ecs_goods where shop_price<1000 or shop_price>2000;

select * from ecs_goods where shop_price not BETWEEN 1000 and 2000;

7)使用limit子句進(jìn)行過濾

想從查詢結(jié)果集里邊取出部分連續(xù)的行時(shí),在語句后半加上limit X,Y;

語法:limit X,Y;

X 代表偏移量,偏移X行則從X+1行開始取數(shù)據(jù),當(dāng)X為0的時(shí)候表示取前Y行,這時(shí)X可以省略。

Y 代表取多行數(shù)據(jù)。

比如:limit 10;代表取前10行數(shù)據(jù)。 limit 4,8; 代表從第五行開始取8行。

查找年齡最大的前三個(gè)學(xué)生。

select * from student order by sage desc limit 0,3;

按照年齡從大到小排列,請(qǐng)取出排名7到第10學(xué)生。

select * from student order by sage desc limit 4;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容