【數據庫知識掃描】 | SQL複習-中篇 第6課 用通配符進行過濾

看書速度來說,還是比較快的,但需要對學習過程進行記錄和練習過程的回顧,時間就花在這塊上,就很難加大學習的步子,已經做到一天兩課,爭取今天三課吧。

這一課介紹什麼是通配符、如何使用通配符以及怎樣使用LIKE操作符進行通配搜索,以便對數據進行復雜過濾。

目錄

6.1 LIKE操作符

①  百分號(%)通配符

②  下劃線(_)通配符

③  方括號([ ])通配符

6.2 使用通配符的技巧


6.1 LIKE操作符

學習操作符,既要了解操作符本身的用法也要熟悉不同操作對象的區別。比如對於已知值/未知值的過濾,前面學習的AND、OR等操作符都是對確定條件的限定,那麼有沒有其他情況?

比如,怎樣搜索產品名中包含文本bean bag的所有產品?用簡單的比較操作符可能檢索不到想要的結果,可以使用通配符

通配符(wildcard)用來匹配值的一部分的特殊字符。

搜索模式(search pattern)由字面值、通配符或兩者組合構成的搜索條件。

謂詞(predicate)操作符何時不是操作符?作爲謂詞時。從技術上說,LIKE是謂詞而不是操作符。 

搜索子句中使用通配符,必須使用LIKE操作符,LIKE告訴DBMS,後面跟的搜索模式利用通配符匹配,而不是相等檢驗;

通配符搜索只能用於文本字段(字符串),非文本數據類型字段不能使用通配符搜索。

①  百分號(%)通配符

最常使用的通配符是百分號(%)。在搜索串中,%表示任何字符出現任意次數

拿個例子來說明,爲了找出所有以詞Fish起頭的產品:

 SELECT prod_id,prod_name FROM Products WHERE prod_name LIKE 'Fish%';

搜索內容是區分大小寫的,Fish和fish是不匹配的。

通配符可在搜索模式中的任意位置使用,並且可以使用多個通配符。再來一個使用兩個通配符,位於模式的兩端的例子:

SELECT prod_id,prod_name FROM Products WHERE prod_name LIKE '%bean bag%';

表示匹配任何位置上包含文本bean bag的值,不論它之前或之後出現什麼字符。

搜索模式中間出現通配符會出現什麼結果呢?可以試試找出以F起頭、以y結尾的所有產品: 

根據部分信息搜索電子郵件地址:根據郵件地址的一部分來查找電子郵件,例如WHERE email LIKE 'b%@forta.com'。

%代表搜索模式中給定位置的0個、1個或多個字符。

空格問題:許多DBMS都用空格來填補字段的內容。例如,如果某列有50個字符,而存儲的文本爲Fishbean bag toy(17個字符),則爲填滿該列需要在文本後附加33個空格。考慮到子句WHEREprod_name LIKE 'F%y’只匹配以F開頭、以y結尾的prod_name。如果值後面跟空格,則不是以y結尾,所以Fish bean bag toy就不會檢索出來。

簡單的解決辦法是給搜索模式再增加一個%號:'F%y%'還匹配y之後的字符(或空格)。更好的解決辦法是用函數去掉空格。 

NULL問題:通配符%看起來像是可以匹配任何東西,但有個例外,這就是NULL。子句WHERE prod_name LIKE '%’不會匹配產品名稱爲NULL的行,

②  下劃線(_)通配符

和%一樣也是匹配,但它的只匹配單個字符,而不是多字符,

例子說話:

對照練習,上面三組SQL檢索結果,分別爲一個下劃線、兩個下劃線,百分號鎖在搜索模式的結果。

③  方括號([ ])通配符

方括號([])通配符用來指定一個字符集,它必須匹配指定位置(通配符的位置)的一個字符。

不一定總是被支持集合:目前只有微軟Access和SQL Server支持,其他的要參看DBMS文檔。

再來一個實例,找出所有名字以J或M起頭的聯繫人:

這裏由於MySQL不支持集合檢索,這裏使用的SELECT實現不了,所以嘗試使用電腦中的Access。

爲了驗證集合的效果,在電腦中Access中新建了庫及表,執行SQL語句:

輸入命令後,點擊運行,就跳到結果頁,

這裏有三個問題需要注意:1.Access不支持多行SQL的運行;2.匹配符從%換成*;3.在設計表的時候教材提供的create文件中類型有一個提示錯誤“對於Access提示字段語法定義錯誤,然後decimal類型這裏被選中”,改掉這個類型和後面的括號包括裏面的數字,改成numeric就行了,不需精度和小數位的限定。

 

結果顯示:

與教材上的預計結果一致,確實是能夠檢索到集合中的字符:

這裏附贈一個說明,因爲通篇是基於MySQL來學習SQL語句,不支持的部分用Access補充驗證,沒有特殊說明還是使用的MySQL。

此通配符可以用前綴字符^(脫字號)來否定。

Access否定集合特例:如果使用的是Microsoft Access,需要用!而不是^來否定一個集合,因此,使用的是[! JM]而不是[^JM]

NOT操作符有類似結果。

6.2 使用通配符的技巧

 通配符搜索一般比前面討論的其他搜索要耗費更長的處理時間。

不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。

□ 在確實需要使用通配符時,也儘量不要把它們用在搜索模式的開始處。把通配符置於開始處,搜索起來是最慢的。

□ 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數據。

 

講完這部分,這節課就結束了,因爲轉換了一個Access的實例,加上Access不支持多行SQL語句,所以單行完成建表插入數據更改主鍵等操作花了較多時間。

依舊是鼓勵自己~刻意練習,每日精進。

想給一起準備春招實習的朋友一些小小的打氣,也知道競爭激烈,情形不容小覷;也知道要拼盡全力不知未來幾何;可能會被算法題難倒覺得自己純屬小菜雞;可能會精心準備簡歷算準投遞吉時卻連安慰似的淘汰感謝也收不到;但從一開始的致力去準備,從不知水深淺的勇敢嘗試,從打開leetcode互相打卡的那天起,我們就已經是這場戰爭的勇士!至於結果,盡心盡力,交給匹配。

相信自己就好。把多餘的迷茫困惑和壓力,都轉成這個寒冬下仍然可能會看到武漢五月櫻的慶幸。

加油。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章