上個筆記主要介紹了利用SELECT語句檢索單個/多個/所有列,并利用DISTINCT關(guān)鍵字檢索具有唯一性的值、利用LIMIT/OFFSET子句限制結(jié)果;以及利用ORDER BY子句排序檢索出的數(shù)據(jù),主要有按照單個/多個列名/列位置/混合排序、用DESC關(guān)鍵字指定排序方向。
這一次我們來看一下如何使用SELECT語句的WHERE子句來指定搜索條件進行數(shù)據(jù)過濾,包括使用=、>、<等基礎(chǔ)操作符的基礎(chǔ)數(shù)據(jù)過濾;使用AND、OR、IN、NOT操作符的高級數(shù)據(jù)過濾;以及使用%、_、[]通配符的數(shù)據(jù)過濾操作,以及實際使用中的一些細節(jié)。
數(shù)據(jù)庫表一般包含大量的數(shù)據(jù),很少需要檢索表中的所有行。通常只會根據(jù)特定操作或報告的需要提取表數(shù)據(jù)的子集。
只檢索所需數(shù)據(jù)需要指定搜索條件(search criteria),或稱為過濾條件(filter condition)。
1.2.1 檢查單個值
SELECT 列名1,列名2
FROM 表
WHERE 列名1 < 10;
1.2.2 不匹配檢查(!=、<>操作符)
SELECT 列名1,列名2
FROM 表
WHERE 列名1 <> 'DLL01';
提示:
1.2.3 范圍值檢查(BETWEEN操作符)
SELECT 列名1,列名2
FROM 表
WHERE 列名1 BETWEEN 5 AND 10;
提示:
1.2.4 空值檢查(IS NULL操作符)
SELECT 列名1,列名2
FROM 表
WHERE 列名1 IS NULL;
分析:
提示:各DBMS 特有的操作符。
注意:NULL和非匹配。
在上一小節(jié)中,所有的WHERE子句在過濾數(shù)據(jù)時使用的都是單一的條件。為了進行更強的過濾控制,SQL允許給出多個WHERE子句。這些句子有兩種使用方式:以AND子句或OR子句的方式使用。
下面我們就來分別介紹一下AND、OR、IN、NOT四種操作符。
要通過不止一個列進行過濾,可以使用AND操作符給WHERE子句附加條件。
SELECT 列名1,列名2,列名3
FROM 表
WHERE 列名1 = 值1 AND 列名2 <= 值2;
分析:
注意:
SELECT 列名1,列名2,列名3
FROM 表
WHERE 列名1 = 值1 OR 列名2 = 值2;
分析:
提示:
WHERE子句可以包含任意數(shù)目的AND和OR操作符。允許兩者結(jié)合進行復(fù)雜、高級的過濾。
提示:在結(jié)合 AND和OR時,要注意求值的順序(優(yōu)先級):
SELECT 列名1,列名2,列名3
FROM 表
WHERE 列名1 IN (值1,值2)
ORDER BY 列名2;
分析:
IN后跟一組由逗號分隔,括在圓括號(必須)中的合法值。
IN操作符用來指定條件范圍,范圍中的//每個條件都可以進行匹配。功能與OR相當(dāng),下面看一個實例:
語句1:
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
語句2:
SELECT prod_name,prod_price
FROM Products
WHERE vend_id ='DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;
語句1與語句2輸出完全一樣。
注意:使用OR時,即使檢索同一個列的不同值,也不可以直接:vend_id ='DLL01' OR 'BRS01'
那么,既然IN與OR功能相當(dāng),我們?yōu)槭裁催€要使用IN操作符呢?IN操作符的優(yōu)點如下:
SELECT 列名1
FROM 表
WHERE NOT 列名1 = 值1
ORDER BY 列名1;
上面這個例子也可以使用<>或!=操作符來完成。
分析:
說明:
NOT的優(yōu)點:
前面所介紹的所有操作符都是針對已知(完整)值進行過濾的。但是這種過濾方法并不是任何時候都好用。有些時候需要利用通配符,來創(chuàng)建(v)//用于比較(v)特定數(shù)據(jù)的//搜索模式。
通配符本身實際上是SQL的WHERE子句中有特殊含義的字符,SQL支持幾種通配符。
LIKE操作符:
注意:
謂詞(predicate)(選看):
語句:
SELECT 列名1,列名2,列名3
FROM 表
WHERE 列名1 LIKE 'Fish%';
分析:
說明:
注意:
注意字符串后面所跟的空格,包括Access在內(nèi)的許多DBMS都用空格來填補字段的內(nèi)容。(經(jīng)過測試,默認設(shè)置的MySQL中沒有填補空格的機制。)
例如,如果某列有50個字符,而存儲的文本為Fish bean bag toy(17個字符),則為填滿該列需要在文本后附加33個空格。
這樣做一般對數(shù)據(jù)及其使用沒有影響,但是可能對某些SQL語句有負面影響。
例如,子句WHERE prod_name LIKE 'F%y'只匹配以F開頭,以y結(jié)尾的prod_name。如果值后面跟空格,則不是以y結(jié)尾,那么最終檢索結(jié)果就不是我們預(yù)想的。
- 解決辦法:簡單的,給搜索模式再增加一個%,即'F%y%';
更好的解決辦法,用函數(shù)去掉空格(后面詳細介紹)
注意NULL。通配符%無法匹配NULL。
SELECT 列名1,列名2
FROM 表
WHERE 列名1 LIKE '__ inch teddy bear';
分析:
說明:
SELECT 列名1
FROM 表
WHERE 列名1 LIKE '[JM]%'
ORDER BY 列名1;
分析:
說明:
正如本節(jié)我們介紹,SQL的通配符很擁有。但是這種功能是有代價的,即通配符搜索一般比前面討論的其他搜索要耗費更長的處理時間。
使用通配符的技巧:
總之,通配符是一種極其重要和有用的搜索工具,以后我們經(jīng)常會用到它。
參考資料:
1.《SQL必知必會》Ben Forta。