5-高級(jí)數(shù)據(jù)過(guò)濾
通過(guò)組合WHERE子句,建立功能更強(qiáng)的檢索語(yǔ)句。
5.1-組合WHERE子句
前面寫(xiě)的都是單一條件下的WHERE子句,SQL語(yǔ)句允許給出多個(gè)WHERE子句來(lái)組合檢索,這些WHERE子句通過(guò)AND子句或者OR子句進(jìn)行連接。
操作符(operator) 用來(lái)聯(lián)結(jié)或改變WHERE子句中的子句的關(guān)鍵字,也稱(chēng)為邏輯操作符(logical operator)。
5.1.1 AND操作符
要通過(guò)不止一個(gè)列進(jìn)行過(guò)濾,可以通過(guò)AND操作符進(jìn)行連接。
select prod_id,prod_price,prod_name
from products
where vend_id = 'DLL01' AND prod_price <= 4;
上述SQL語(yǔ)句用于檢索由DLL01供應(yīng)商提供的價(jià)格小于等于4元的所有產(chǎn)品的價(jià)格和名稱(chēng)。該條語(yǔ)句包含兩個(gè)查詢(xún)條件,一個(gè)是供應(yīng)商id為DLL01,另一個(gè)條件為價(jià)格小于等于4,使用AND進(jìn)行連接。
上述語(yǔ)句使用了一個(gè)AND連接符,因此只有兩個(gè)過(guò)濾條件。可以增加多個(gè)過(guò)濾條件,每個(gè)條件之間都要使用AND連接符進(jìn)行連接。
5.1.2 OR連接符
OR操作符與AND操作符正好相反,它指示DBMS檢索匹配任一條件的行。事實(shí)上,許多DBMS在OR WHERE子句的第一個(gè)條件得到滿(mǎn)足的情況下,就不再計(jì)算第二個(gè)條件了(在第一個(gè)條件滿(mǎn)足時(shí),不管第二個(gè)條件是否滿(mǎn)足,相應(yīng)的行都將被檢索出來(lái))。
select prod_id,prod_price,prod_name
from products
where vend_id = 'DLL01' OR vend_id = 'BRS01';
?
上述SQL語(yǔ)句通過(guò)OR連接符進(jìn)行檢索,只要滿(mǎn)足任意一個(gè)條件,就會(huì)將數(shù)據(jù)納入檢索范圍。
5.1.3 求值順序
WHERE子句可以包含很多的AND和OR操作符。但是這么做可能會(huì)有一些小問(wèn)題。
例如:想要列出價(jià)格為10元以上,且有DLL01或者BRS01制造的所有產(chǎn)品
select prod_id,prod_price,prod_name
from products
where vend_id = 'DLL01' or vend_id = 'BRS01' and prod_price >= 10;
?
可以看到,價(jià)格低于十元的產(chǎn)品也被輸出了出來(lái)。
原因 在于求值順序,SQL在處理OR操作符前,會(huì)優(yōu)先處理AND操作符。當(dāng)SQL看到上述語(yǔ)句時(shí),會(huì)理解為:由供應(yīng)商BRS01提供的10元以上的產(chǎn)品,以及由供應(yīng)商DLL01提供的所有產(chǎn)品,而不管其價(jià)格如何。BRS01和價(jià)格大于等于10優(yōu)先組合在一起。
解決辦法是使用圓括號(hào)對(duì)操作符進(jìn)行分組:
select prod_id,prod_price,prod_name
from products
where (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10;
?
圓括號(hào)具有比AND或OR操作符更高的優(yōu)先級(jí),所以DBMS首先過(guò)濾圓括號(hào)內(nèi)的OR條件。
注意:任何時(shí)候使用具有AND和OR操作符的WHERE子句,都應(yīng)該使用圓括號(hào)明確地分組操作符。不要過(guò)分依賴(lài)默認(rèn)求值順序,即使它確實(shí)如你希望的那樣。使用圓括號(hào)沒(méi)有什么壞處,它能消除歧義。
5.2-IN操作符
IN操作符用來(lái)指定條件范圍,范圍中的每個(gè)條件都可以進(jìn)行匹配。
select prod_name,prod_price
from products
where vend_id IN ('DLL01','BRS01')
order by prod_name;
?
上述語(yǔ)句檢索由供應(yīng)商DLL01和供應(yīng)商BRS01所提供的產(chǎn)品。
IN操作符完成的功能與OR操作符完成的功能類(lèi)似。
select prod_name,prod_price
from products
where vend_id = 'DLL01' OR vend_id = 'BRS01'
order by prod_name;
? 兩個(gè)語(yǔ)句輸出的內(nèi)容相同。
使用IN操作符的優(yōu)點(diǎn):
有很多合法選項(xiàng)時(shí),IN操作符更為清晰明了。
在與其他AND和OR操作符組合使用IN時(shí),求值順序更容易理解。
IN操作符一般比一組OR操作符執(zhí)行速度更快。
IN最大的優(yōu)點(diǎn)是,可以包含其他select語(yǔ)句,能夠更動(dòng)態(tài)的建立where子句。
5.3-NOT操作符
WHERE子句中的NOT操作符有且只有一個(gè)作用,否定其后跟隨的任何條件。
NOT從不單獨(dú)使用,總是與其他操作符一起使用。
select prod_name
from products
where NOT vend_id = 'DLL01'
order by prod_name;
檢索所有vend_id不是DLL01的行。
上面的語(yǔ)句也可以使用"<>"或者"!="來(lái)實(shí)現(xiàn)。
select prod_name
from products
where vend_id <> 'DLL01'
order by prod_name;
select prod_name
from products
where vend_id != 'DLL01'
order by prod_name;
對(duì)于簡(jiǎn)單的where語(yǔ)句來(lái)說(shuō),使用NOT操作符確實(shí)沒(méi)有多少優(yōu)勢(shì),但是如果SQL語(yǔ)句比較復(fù)雜的話(huà),NOT就非常有用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-643786.html
例如,在與IN操作符聯(lián)合使用時(shí),NOT可以非常簡(jiǎn)單地找出與條件列表不匹配的行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-643786.html
到了這里,關(guān)于SQL | 高級(jí)數(shù)據(jù)過(guò)濾的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!