目標:
1. LIKE 操作符
2.使用通配符的技巧
6.1 LIKE操作符
1. 通配符(wildcard)用來匹配值的一部分的特殊字符。
2. 搜索模式(search pattern)由字面值、通配符或兩者組合構成的搜索條件。
3. 為在搜索子句中使用通配符,必須使用 LIKE 操作符。LIKE指示 DBMS,后跟的搜索模式利用通配符匹配而不是簡單的相等匹配進行比較。
4. 謂詞(predicate)操作符何時不是操作符?答案是,它作為謂詞時。從技術上說,LIKE是謂詞而不是操作符。雖然最終的結果是相同的,但應該對此術語有所了解,以免在 SQL 文獻或手冊中遇到此術語時不知所云。
5. 通配符搜索只能用于文本字段(字符串),非文本數據類型字段不能使用通配符搜索。
6.1.1 百分號(%)通配符
最常使用的通配符是百分號(%)。在搜索串中,%表示任何字符出現任意次數。例如,為了找出所有以詞 Fish 起頭的產品,可寫以下的 SELECT 語句:
SELECT prod_name,prod_price
FROM products
WHERE prod_name LIKE 'fish%';
分析▼
?此例子使用了搜索模式'Fish%'。在執行這條子句時,將檢索任意以Fish 起頭的詞。%告訴 DBMS 接受 Fish 之后的任意字符,不管它有多 少字符。
輸出:
說明:區分大小寫,要看配置。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
分析▼
搜索模式'%bean bag%'表示匹配任何位置上包含文本 bean bag 的值,
不論它之前或之后出現什么字符。
輸出:
SELECT prod_name?
FROM Products?
WHERE prod_name LIKE 'F%y';
分析▼?找出以 F 起頭、以 y 結尾的所有產品:
輸出:
提示:根據部分信息搜索電子郵件地址?
?有一種情況下把通配符放在搜索模式中間是很有用的,就是根據郵件地址的一部分來查找電子郵件,例如 WHERE email LIKE 'b%@forta.com'。
需要特別注意,除了能匹配一個或多個字符外,%還能匹配 0 個字符。%代表搜索模式中給定位置的 0 個、1 個或多個字符。
6.1.2 下劃線(_)通配符
1. 另一個有用的通配符是下劃線(_)。下劃線的用途與%一樣,但它只匹配單個字符,而不是多個字符。
2. 說明:DB2 通配符,DB2 不支持通配符_。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
分析▼
這個 WHERE 子句中的搜索模式給出了后面跟有文本的兩個通配符。結果只顯示匹配搜索模式的行:第一行中下劃線匹配 12,第二行中匹配18。8 inch teddy bear 產品沒有匹配,因為搜索模式要求匹配兩個通配符而不是一個。
輸出:
對照一下,下面的 SELECT 語句使用%通配符,返回三行產品:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '% inch teddy bear';
輸出:
6.1.3 方括號([])通配符(MySQL不支持)
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[*JM]%'
ORDER BY cust_contact;
6.2 使用通配符的技巧
1. 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
2. 在確實需要使用通配符時,也盡量不要把它們用在搜索模式的開始處。把通配符置于開始處,搜索起來是最慢的。
3. 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數據。
總之,通配符是一種極其重要和有用的搜索工具,以后我們經常會用到它。
6.3 小結
LIKE操作符后面使用”%“,”_“,"[]"。%可以用在開頭,首尾和中間,_只能匹配單個字符,[]只能SQL server使用
-- ----------第6課 用通配符進行過濾----------------------
-- ---------------------------------
-- 6.1 LIKE操作符
-- 6.1.1 百分號(%)通配符
SELECT prod_name,prod_price
FROM products
WHERE prod_name LIKE 'fish%';
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
SELECT prod_name
FROM Products
WHERE prod_name LIKE 'F%y';
-- 6.1.2 下劃線(_)通配符
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '% inch teddy bear';
-- 6.1.3 方括號([])通配符
/*SELECT cust_contact
FROM Customers;
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[*JM]%'
ORDER BY cust_contact;*/
挑戰題:
1. 編寫 SQL 語句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅返回描述中包含 toy 一詞的產品。
SELECT prod_name,prod_desc
FROM products
WHERE prod_desc LIKE '%toy%';
2. 反過來再來一次。編寫 SQL 語句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅返回描述中未出現 toy 一詞的產品。這次,按產品名稱對結果進行排序。
SELECT prod_name,prod_desc
FROM products
WHERE NOT prod_desc LIKE '%toy%'
ORDER BY prod_name;
3. 編寫 SQL 語句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅返回描述中同時出現 toy 和 carrots 的產品。有好幾種方法可以執行此操作,但對于這個挑戰題,請使用 AND 和兩個 LIKE 比較。
SELECT prod_name,prod_desc
FROM products
WHERE prod_desc LIKE '%toy%' AND prod_desc LIKE '%carrots%';
4. 來個比較棘手的。我沒有特別向你展示這個語法,而是想看看你根據目前已學的知識是否可以找到答案。編寫 SQL 語句,從 Products 表中檢索產品名稱(prod_name)和描述(prod_desc),僅返回在描述中以先后順序同時出現 toy 和 carrots 的產品。提示:只需要用帶有三個 % 符號的 LIKE 即可。
SELECT prod_name,prod_desc
FROM products
WHERE prod_desc LIKE '%toy%carrots%';