MySQL必知必會(huì) 第7-9章

第七章 數(shù)據(jù)過濾

7.1 組合WHERE子句

在第六章介紹的所有WHERE子句在過濾時(shí),使用的都是單一的條件。為了進(jìn)行更強(qiáng)的過濾控制,MySQL允許給出多個(gè)WHERE子句,并通過ANDOR操作符的方式組合使用。

  • 操作符(operator)
    用來聯(lián)接或改變WHERE子句中關(guān)鍵字,也成為邏輯操作符。
7.1.1 AND操作符

AND操作符可以使用對(duì)多列的條件進(jìn)行累加過濾。

  • 輸入:
    SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
  • 輸出:略
  • 分析:此語(yǔ)句檢索由供應(yīng)商1003制造,且價(jià)格小于等于10美元的產(chǎn)品的編號(hào)、名稱和價(jià)格。AND操作符“并且”的語(yǔ)意。
7.1.2 OR操作符

OR操作符可以使用對(duì)多列的條件進(jìn)行累加過濾。

  • 輸入:
    SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1002 OR vend_id = 1003;
  • 輸出:略
  • 分析:此語(yǔ)句檢索由供應(yīng)商1002或1003制造的所有產(chǎn)品的編號(hào)、名稱和價(jià)格。OR操作符“或者”的語(yǔ)意。
7.1.3 計(jì)算次序

WHERE子句可包含任意數(shù)目的ANDOR操作符。但是AND的優(yōu)先級(jí)比OR高,應(yīng)使用適當(dāng)?shù)膱A括號(hào)分組操作符。

  • 輸入:
    SELECT prod_id, prod_price, prod_name FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
  • 輸出:略
  • 分析:此語(yǔ)句檢索由供應(yīng)商為1002,或1003,價(jià)格大于等于10美元的所有產(chǎn)品的編號(hào)、名稱和價(jià)格。如果沒有加圓括號(hào),則 vend_id = 1003 先和 prod_price >= 10 進(jìn)行AND操作,再與vend_id = 1002進(jìn)行OR操作,得不到想要的結(jié)果。

注意:任何時(shí)候都不應(yīng)該過分依賴默認(rèn)計(jì)算次序,使用圓括號(hào)可以增加可讀性,消除歧義。

7.2 IN操作符

IN操作符用來指定條件范圍,范圍中每個(gè)條件都可以進(jìn)行匹配。IN的合法值由逗號(hào)分隔,并全部括在圓括號(hào)中。

  • 輸入:
    SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id IN (1002,1003);
  • 輸出:略
  • 分析:此語(yǔ)句檢索由供應(yīng)商1002或1003制造的所有產(chǎn)品的編號(hào)、名稱和價(jià)格。所完成的功能與OR類似。

使用IN的優(yōu)點(diǎn)為:

  • 在使用長(zhǎng)的合法選項(xiàng)清單時(shí),IN操作符的語(yǔ)法更清楚更直觀。
  • IN操作符比OR操作符清單執(zhí)行更快
  • IN操作符最大的優(yōu)點(diǎn)是可以包含其他SELECT語(yǔ)句(將在14章說明),能夠更動(dòng)態(tài)地建立WHERE子句。
7.3 NOT操作符

WHERE子句中的NOT操作符有且只有一個(gè)功能,就是否定它之后的任何條件。

  • 輸入:
    SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id NOT IN (1002,1003);
  • 輸出:略
  • 分析:此語(yǔ)句檢索由供應(yīng)商1002或1003以外供應(yīng)商提供的所有產(chǎn)品的編號(hào)、名稱和價(jià)格。

注意:MySQL支持使用NOT對(duì)IN、BETWEEN和EXISTS子句取反,這與其他大多數(shù)DBMS允許使用NOT對(duì)各種條件取反有很大區(qū)別。

第八章 使用通配符進(jìn)行過濾

8.1 LIKE操作符

之前介紹的都是針對(duì)已知值的過濾。而對(duì)進(jìn)行未知內(nèi)容的匹配,可以使用通配符創(chuàng)建比較數(shù)據(jù)的搜索模式來完成。通配符的匹配,需要通過LIKE操作符指示MySQL完成。

  • 通配符
    用來匹配值的一部分的特殊字符。

  • 搜索模式
    由字面值、通配符或兩者組合成的搜索條件。

  • 謂詞
    從技術(shù)上說,LIKE是謂詞而不是操作符,雖然結(jié)果是相同的,但是需要明白此術(shù)語(yǔ)。

8.1.1 百分號(hào)(%)通配符

%表示任何字符出現(xiàn)任意次。例如,為了找到所有以 jet起頭的產(chǎn)品,可使用以下SELECT語(yǔ)句

  • 輸入:
    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';
  • 輸出:略
  • 分析:此例子使用了搜索模式 'jet%',它告訴MySQL接受jet之后任意字符,不管有多少字符。

注意:

  • %通配符可放在搜索模式的任意位置,例如 '%anvil%' 表示匹配任何位置包含anvil的字符; 's%e'表示以s開頭以e結(jié)尾的字符。
  • %除了可以匹配一個(gè)或者多個(gè)字符外,還可以匹配0個(gè)字符。%代表給定位置的0、1或多個(gè)字符。
  • 尾空格將影響匹配結(jié)果:'%anvil '將匹配不到anvil_Blank
  • WHERE prod_name LIKE '%'也無(wú)法匹配NULL值作為產(chǎn)品名的行。
8.1.2 下劃線(_)通配符

下劃線(_)通配符只匹配單個(gè)字符而不是多個(gè)字符。

  • 輸入:
    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
  • 輸出:略
  • 分析:此例子使用了搜索模式 '_ ton anvil',它能夠匹配1 ton anvil2 ton anvil ,但不能匹配 .5 ton anvil,因?yàn)橄聞澗€通配符只對(duì)應(yīng)一個(gè)字,不可多也不能少 。

通配符使用技巧:

  • 通配符的處理通常比值匹配花費(fèi)的時(shí)間更多。不要過度使用通配符,能夠用其他操作符達(dá)到同樣目的時(shí),應(yīng)使用其他操作符。
  • 除非確實(shí)有必要,否則盡量不要在模式搜索開始時(shí)使用通配符,否則速度尤其慢。
  • 仔細(xì)注意通配符的位置,錯(cuò)誤的位置將得不到想要的結(jié)果。

第九章 使用正則表達(dá)式進(jìn)行搜索

9.1 正則表達(dá)式介紹

正則表達(dá)式是用來匹配文本的特殊串(字符集合),所有種類的程序設(shè)計(jì)語(yǔ)言、文本編輯器、操作系統(tǒng)等都支持正則表達(dá)式。

9.2 使用MySQL正則表達(dá)式

MySQL中的正則表達(dá)式僅是正則表達(dá)式的一個(gè)子集。

9.2.1 基本字符匹配
  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '1000';

  • 輸出:略

  • 分析:除關(guān)鍵詞字LIKEREGEXP替代外,這條語(yǔ)句看上去非常像LIKE語(yǔ)句,但不同在于LIKE匹配整個(gè)行,REGEXP在列值中進(jìn)行匹配,如果被匹配的值在文本中出現(xiàn)則匹配成功。因此,對(duì)于以上輸入,REGEXP可以匹配到 Jet 1000,但LIKE則匹配不到。REGEXP可以通過定位符的使用,來匹配整個(gè)行,將在9.2.8中介紹定位符。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '.000';

  • 輸出:略

  • 分析:這里使用了正則表達(dá)式'.000'.是正則表達(dá)式語(yǔ)言中一個(gè)特殊的字符。它表示匹配任意一個(gè)字符。因此JetPack 1000·JetPack 2000都可以匹配返回。

9.2.2 進(jìn)行OR匹配

為搜索兩個(gè)串之一,使用(|)。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name ;
  • 輸出:略
  • 分析:這里使用了正則表達(dá)式'1000|2000'。|是正則表達(dá)式語(yǔ)言中的OR操作符。另外,|還支持兩個(gè)以上的條件,例如'1000|2000|3000'
9.2.3 匹配幾個(gè)字符之一

如果想匹配特定的單一字符,可以使用[]將一組指定的內(nèi)容括起來。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '[123] ton' ORDER BY prod_name ;
    *輸出:略
    分析:這里使用了正則表達(dá)式'[123] ton'。[123]定義一組字符,意為匹配1、2或3。因此,1 ton、2 ton3 ton都能匹配。[]是另一種形式的OR語(yǔ)句。

注意:

  • 事實(shí)上,'[123] ton''[1|2|3] ton'的縮寫,也可以使用后者。
  • WHERE prod_name REGEXP '1|2|3 ton'并不能得到想要的答案,因?yàn)楸籑ySQL理解為'1''2'‘3 ton’。
  • 字符集也可用于否定,只需要在集合開始處放置一個(gè)^即可。例如[^123]可以匹配'1'、'2'、'3'以外的其他字符。
9.2.4 匹配范圍

集合可用來定義要匹配一個(gè)或多個(gè)字符,此時(shí)可以使用-來定義一個(gè)范圍,例如[0-9]表示數(shù)字0到9,[a-z]表示字母a到z。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] ton' ORDER BY prod_name ;
  • 輸出:略
  • 分析:這里使用了正則表達(dá)式'[1-5] ton'。[1-5]定義了一個(gè)范圍,表示數(shù)字1到5。
9.2.5 匹配特殊字符

正則表達(dá)式語(yǔ)句由具有特定含義的特殊字符構(gòu)成。例如|-等。如果要表示一些特殊的字母,如含.的值,則應(yīng)該使用\\\為前導(dǎo)。\\\-表示查找-,\\\.表示查找.。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '\\\.' ORDER BY prod_name ;
  • 輸出:略
  • 分析:這里使用了正則表達(dá)式'\\\.',可以順利匹配到.。這種處理方式就是所謂的轉(zhuǎn)義,正則表達(dá)式內(nèi)具有特殊意義的所有字符都需要轉(zhuǎn)義。包括. | [ ]等,\\\\也用來引用元字符,如下:

注意:

  • 為匹配\\應(yīng)使用\\\\\
  • 多數(shù)正則表達(dá)式實(shí)現(xiàn)單個(gè)反斜桿轉(zhuǎn)義特殊字符。但MySQL要求兩個(gè)反斜桿(MySQL自己解釋一個(gè),正則表達(dá)式解釋一個(gè))。
9.2.6 匹配字符類

為方便常見字符集的查找,可以使用預(yù)定義的字符集。稱為字符類。如下圖所示:

9.2.7 匹配多個(gè)實(shí)例

目前為止使用的所有正則表達(dá)式都試圖匹配單詞出現(xiàn)。但有時(shí)需要對(duì)匹配的數(shù)目進(jìn)行更強(qiáng)的控制,此時(shí)可以使用下列正則表達(dá)式重復(fù)元字符來完成。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '\\\([0-9] sticks?\\\)' ORDER BY prod_name ;

  • 輸出:略
    分析:這里使用了正則表達(dá)式'\\\([0-9] sticks?\\\)',?表示,它前面的字母s出現(xiàn)0次或1次。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name ;

  • 輸出:略

  • 分析:這里使用了正則表達(dá)式'[[:digit:]]{4}',表示匹配連在一起的四位數(shù)字。

注意:使用正則表達(dá)式時(shí),編寫某個(gè)特定的表達(dá)式幾乎總是有多種方法。

9.2.8 定位符

目前為止,所有例子都是匹配一個(gè)串中任意位置的文本,為了匹配特定位置的文本,需要使用定位符。

  • 輸入:
    SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name ;
  • 輸出:略
  • 分析:^匹配串的開始,'^[0-9\\\.]' 表示匹配以數(shù)字或.開始的串。

注意:

  • ^有兩個(gè)用法,在集合中(用[]定義),用來表示幾何的否定,在集合外,用來表示串的起始。
  • REGEXP用來匹配子串,LIKE用來匹配整個(gè)串,REGEXP^做開頭,用$為結(jié)束時(shí),作用與LIKE相同。
  • 可在不使用數(shù)據(jù)庫(kù)的情況下,對(duì)正則表達(dá)式做簡(jiǎn)單測(cè)試,REGEXP檢查總是返回0或1,后者表示匹配成功。例如:SELECT 'hello' FROM ‘[0-9]';將返回0。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容