MySQL匹配指定字符串的查詢


MySQL匹配指定字符串的查詢

使用正則表達式查詢時,正則表達式可以匹配字符串。當表中的記錄包含這個字符串時,就可以將該記錄查詢出來。如果指定多個字符串時,需要用“|”符號隔開,只要匹配這些字符串中的任意一個即可查詢出來。


實例1

從baike369表的name字段中查詢包含“ic”的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'ic';

在DOS提示符窗口中查看name字段中查詢包含“ic”的記錄的操作效果。如下圖所示:

查看name字段中查詢包含“ic”的記錄的操作效果

上圖中代碼執行的查詢結果為Aric和Eric。這兩條記錄中都包含ic。


實例2

從baike369表的name字段中查詢包含ic、uc和ab這3個字符串中任意一個的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'ic|uc|ab';

在DOS提示符窗口中查看name字段中查詢包含ic、uc和ab這3個字符串中任意一個的記錄的操作效果。如下圖所示:

查看name字段中查詢包含ic、uc和ab這3個字符串中任意一個的記錄的操作效果

上圖中代碼執行的查詢結果中包含了ic、uc和ab3個字符串中的任意一個。


提示

指定多個字符串時,需要用“|”符號將這些字符串隔開。每個字符串與“|”符號之間不能有空格。因為,查詢過程中,數據庫系統會將空格也當作一個字符。如果添加了空格,就查詢不出想要的結果了,查詢結果顯示的字符串可能不止3個,也可能沒有記錄。

MySQL查詢以特定字符或字符串開頭的記錄

使用正則表達式查詢時,使用“^”符號可以匹配以特定字符或字符串開頭的記錄。

注:在鍵盤上按住Shit鍵,然后按下數字“6”鍵,即可輸出“^”字符。


實例1

從baike369表的name字段中查詢以字母“L”開頭的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '^L';

在DOS提示符窗口中查看name字段中查詢以字母“L”開頭的記錄的操作效果。如下圖所示:

查看name字段中查詢以字母“L”開頭的記錄的操作效果

上圖中代碼執行的結果顯示,查詢出了name字段中以字母L開頭的兩條記錄。


實例2

從baike369表的name字段中查詢以字符串“aaa”開頭的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '^aaa';

在DOS提示符窗口中查看name字段中查詢以字符串“aaa”開頭的記錄的操作效果。如下圖所示:

查看name字段中查詢以字符串“aaa”開頭的記錄的操作效果

上圖中代碼執行的結果顯示,查詢出了name字段中以字母aaa開頭的兩條記錄。

MySQL查詢以特定字符或字符串結尾的記錄

使用正則表達式查詢時,使用“$”符號可以匹配以特定字符或字符串結尾的記錄。


實例1

從baike369表name字段中查詢以字母c結尾的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE  name REGEXP 'c$';

在DOS提示符窗口中查看name字段中查詢以字母c結尾的記錄的操作效果。如下圖所示:

查看name字段中查詢以字母c結尾的記錄的操作效果

上圖中代碼執行的結果顯示,查詢出了name字段中以字母c結尾的兩條記錄。


實例2

從baike369表name字段中查詢以字符串“aaa”結尾的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'aaa$';

在DOS提示符窗口中查看name字段中查詢以字符串“aaa”結尾的記錄的操作效果。如下圖所示:

查看name字段中查詢以字符串“aaa”結尾的記錄的操作效果

上圖中代碼執行的結果顯示,查詢出了name字段中以字母aaa結尾的兩條記錄。

 

 

MySQL使用{M}或者{M,N}指定字符串連續出現的次數的查詢

使用正則表達式查詢時,

“字符串{M}”表示字符串連續出現M次

“字符串{M,N}”表示字符串連續出現至少M次,最多N次。

例如,“ab{2}”表示字符串“ab”連續出現兩次;“ab{2,4}”表示字符串“ab”連續出現至少兩次,最多4次。


實例1

從baike369表的name字段中查詢出現過“a”3次的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'a{3}';

在DOS提示符窗口中查看name字段中查詢出現過“a”3次的記錄的操作效果。如下圖所示:

查看name字段中查詢出現過“a”3次的記錄的操作效果

上圖中代碼執行的查詢結果中都包含了aaa。


實例2

從baike369表的name字段中查詢出現過“ab”至少一次,最多3次的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'ab{1,3}';

在DOS提示符窗口中查看name字段中查詢出現過“ab”至少一次,最多3次的記錄的操作效果。如下圖所示:

查看name字段中查詢出現過“ab”至少一次,最多3次的記錄的操作效果

上圖中代碼執行的查詢結果中,abc12和aaabd中ab出現了一次,ababab中ab出現了3次。

 

MySQL用“.”符號替換字符串中的任意一個字符的查詢

使用正則表達式查詢時,使用“.”符號可以替代字符串中的任意一個字符。


實例

從baike369表name字段中查詢以字母“L”開頭,以字母“y”結尾,中間有兩個任意字符的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '^L..y$';

“^L”表示以字母L開頭;兩個“.”表示兩個任意字符;“y$”表示以字母y結尾。

在DOS提示符窗口中查看name字段中查詢以字母“L”開頭,以字母“y”結尾,中間有兩個任意字符的記錄的操作效果。如下圖所示:

查看name字段中查詢以字母“L”開頭,以字母“y”結尾,中間有兩個任意字符的記錄的操作效果

上圖中代碼執行的結果顯示,查詢出了Lily和Lucy。它們正好是以字母L開頭,以字母y結尾,中間有兩個任意字符的記錄。

 

 

MySQL使用“*”和“+”匹配多個字符的查詢

使用正則表達式查詢時,

“*”(星號)和“+”(加號)都可以匹配多個該符號之前的字符。

但是,“+”至少表示一個字符,而“*”可以表示0個字符。


實例

從baike369表的name字段中查詢字母“c”之前出現過“a”的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'a*c';

在DOS提示符窗口中查看name字段中查詢字母“c”之前出現過“a”的記錄的操作效果。如下圖所示:

查看name字段中查詢字母“c”之前出現過“a”的記錄的操作效果

上圖中代碼執行的查詢結果開始,abc12、Aric、Lucy和Eric中的字母c之前並沒有a。因為“*”可以表示0個字符,所以“a*c”表示字母c之前有0個或者多個a出現。上述情況都屬於前面出現過0個的情況。

如果使用“+”時,查詢字母“c”之前出現過“a”的記錄。則SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP 'a+c';

在DOS提示符窗口中查看如果使用“+”時,查詢字母“c”之前出現過“a”的記錄的操作效果。如下圖所示:

查看如果使用“+”時,查詢字母“c”之前出現過“a”的記錄的操作效果

上圖中代碼執行的查詢結果只有一條。只有Jack是正好字母c前面出現了a。因為“a+c”表示字母c前面至少有一個字母a。

 

 

MySQL匹配指定字符以外的字符的查詢

使用正則表達式查詢時,使用“[^字符集合]”可以匹配指定字符以外的字符。


實例

從baike369表的name字段中查詢包含“a”到“w”字母和數字以外的字符的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '[^a-w0-9]';

在DOS提示符窗口中查看name字段中查詢包含“a”到“w”字母和數字以外的字符的記錄的操作效果。如下圖所示:

查看name字段中查詢包含“a”到“w”字母和數字以外的字符的記錄的操作效果

上圖中代碼執行的查詢結果顯示為Lily和Lucy。因為這兩個字符串包含字母y,這個字母在指定范圍之外。

 

MySQL匹配指定字符中的任意一個的查詢

使用正則表達式查詢時,使用方括號([])可以將需要查詢的字符組成一個字符集,只要記錄中包含方括號中的任意字符,該記錄都將會被查詢出來。

例如,通過“[abc]”可以查詢包含a、b和c等3個字母中任何一個的記錄。


實例1

從baike369表的name字段中查詢包含c、e和o等3個字母中任意一個的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '[ceo]';

在DOS提示符窗口中查看name字段中查詢包含c、e和o等3個字母中任意一個的記錄的操作效果。如下圖所示:

查看name字段中查詢包含c、e和o等3個字母中任意一個的記錄的操作效果

上圖中代碼執行的結果顯示,查詢出了包含c、e和o等3個字母中任意一個的所有記錄。


實例2

使用方括號([])可以指定集合的區間。如

“[a-z]”表示從a~z的所有小寫字母;

“[A-Z]”表示從A~Z的所有大寫字母;

“[0-9]”表示從0~9的所有數字;

“[a-z0-9]”表示包含所有的小寫字母和數字。

從baike369表的name字段中查詢出包含數字的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '[0-9]';

在DOS提示符窗口中查看name字段中查詢出包含數字的記錄的操作效果。如下圖所示:

查看name字段中查詢出包含數字的記錄的操作效果

上圖中代碼執行的結果顯示,name字段中查詢出的記錄取值都包含數字。


實例3

從baike369表的name字段中查詢包含數字或者字母a、b和c的記錄。SQL代碼如下:

SELECT * FROM baike369 WHERE name REGEXP '[0-9a-c]';

在DOS提示符窗口中查看name字段中查詢包含數字或者字母a、b和c的記錄的操作效果。如下圖所示:

查看name字段中查詢包含數字或者字母a、b和c的記錄的操作效果

上圖中代碼執行的查詢結果中,name字段取值都包含數字或者字母a、b和c中的任意一個。

 

 

MySQL合並查詢結果(UNION|UNION ALL)

合並查詢結果是將多個SELECT語句的查詢結果合並到一起。因為某種情況下,需要將幾個SELECT語句查詢出來的結果合並起來顯示。

例如,現在需要查詢公司甲和公司乙這兩個公司所有員工的信息。這就需要從公司甲中查詢出所有員工的信息,再從公司乙中查詢出所有員工的信息,然后將兩次的查詢結果合並到一起。

使用UNION和UNION ALL關鍵字可以進行合並操作。

  • 使用UNION關鍵字時,數據庫系統會將所有的查詢結果合並到一起,然后去除掉相同的記錄。

  • 使用UNION ALL關鍵字時,只是簡單地將所有的查詢結果合並到一起,不會去掉相同的記錄。

基本的語法格式如下:

SELECT 語句1
    UNION | UNION ALL
SELECT 語句2
    UNION | UNION ALL
......
SELECT 語句n;

從上面的代碼格式可以看出,可以合並多個SELECT語句的查詢結果。而且,每個SELECT語句之間使用UNION或UNION ALL關鍵字連接。


實例1

從department表和employee表中查詢d_id字段的取值,然后通過UNION關鍵字將結果合並到一起。操作步驟如下:

1. 查看department表中d_id字段的取值。如下圖所示:

查看department表中d_id字段的取值

2. 查看employee表中d_id字段的取值。如下圖所示:

查看employee表中d_id字段的取值

3. 從查詢結果中可以看出,department表的d_id字段取值分別為1001、1002和1003。employee表的d_id字段取值分別為1001、1002和1004,其中,d_id為1001的記錄有兩條,為1004的記錄有兩條。

將這兩個表中的d_id字段的取值合並到一起。SELECT語句的代碼如下:

SELECT d_id FROM department
  UNION
SELECT d_id FROM employee;

兩個SELECT語句之間使用UNION關鍵字進行連接。

在DOS提示符窗口中查看MySQL使用UNION關鍵字進行連接的操作效果。如下圖所示:

查看MySQL使用UNION關鍵字進行連接的操作效果

上圖中代碼執行的結果顯示,d_id字段的取值為1001、1002、1003和1004,這正好是department表和employee表d_id字段的所有取值,同時,查詢結果中沒有任何重復的記錄。


實例2

使用UNION ALL關鍵字,只是將查詢結果直接合並到一起,結果中可能存在相同的記錄。

從department表和employee表中查詢d_id字段的取值,然后通過UNION ALL關鍵字將結果合並到一起。SELECT語句的代碼如下:

SELECT d_id FROM department
  UNION ALL
SELECT d_id FROM employee;

兩個SELECT語句之間用UNION ALL關鍵字進行連接。

在DOS提示符窗口中查看MySQL用UNION ALL關鍵字進行連接的操作效果。如下圖所示:

查看MySQL用UNION ALL關鍵字進行連接的操作效果

上圖中代碼執行的結果顯示,查詢結果中存在着相同的記錄,這說明UNION ALL關鍵字只是將查詢結果直接合並到一起,並沒有去掉相同的記錄。


提示

UNION和UNION ALL關鍵字可以使用WHERE子句,但不能使用ORDER BY關鍵字。

 

MySQL帶ALL關鍵字的子查詢

 

用ALL關鍵字時,只有符合內層查詢語句返回的所有結果,才可以執行外層查詢語句

例如,需要查詢哪些同學能夠獲得一等獎學金。首先必須從獎學金表中查詢出各種獎學金要求的最低分,因為一等獎學金要求的分數最高,只有當同學的成績高於所有獎學金最低分時,這個同學才可能獲得一等獎學金。

ALL關鍵字經常與比較運算符一起使用。例如,>ALL表示大於所有值,<ALL表示小於所有值。


實例

從computer_stu表中查詢出哪些同學可以獲得一等獎學金。獎學金的信息存儲在scholarship表中。操作步驟如下:

1. 查看computer_stu表的信息。如下圖所示:

查看computer_stu表的信息

2. 查看scholarship表的信息。如下圖所示:

查看scholarship表的信息

3. 需要先從scholarship表中查詢出各種獎學金的最低分,然后,從computer_stu表中查詢哪些人的分數高於所有獎學金的最低分。

SELECT語句的代碼如下:

SELECT * FROM computer_stu
       WHERE score>=ALL
       (SELECT score FROM scholarship);

在DOS提示符窗口中查看MySQL帶ALL關鍵字的子查詢的操作效果。如下圖所示:

查看MySQL帶ALL關鍵字的子查詢的操作效果

上圖中代碼執行的結果顯示,只有兩個人可以獲得一等獎學金。因為這兩個人的分數比所有獎學金要求的分數都高。

 

 

MySQL使用ANY關鍵字的子查詢

使用ANY關鍵字時,只要符合內層查詢語句返回的結果中的任何一個,就可以通過該條件來執行外層查詢語句。

例如,需要查詢哪些同學能夠獲得獎學金,那么,首先必須從獎學金表中查詢出各種獎學金要求的最低分。只要一個同學的成績高於不同獎學金最低分的任何一個,這個同學就可以獲得獎學金。

ANY關鍵字通常與比較運算符一起使用。例如,>ANY表示大於任何一個值,=ANY表示等於任何一個值。


實例

從computer_stu表中查詢出哪些同學可以獲得獎學金,獎學金的信息存儲在scholarship表中。操作步驟如下:

1. 查看computer_stu表的信息。如下圖所示:

查看computer_stu表的信息

2. 查看scholarship表的信息。如下圖所示:

查看scholarship表的信息

3. 查詢誰能得到獎學金。需要先從scholarship表中查詢出各種獎學金的最低分,然后從computer_stu表中查詢哪些人的分數高於其中任何一個獎學金的最低分。SELECT語句的代碼如下:

SELECT * FROM computer_stu
       WHERE score>=ANY
       (SELECT score FROM scholarship);

在DOS提示符窗口中查看MySQL使用ANY關鍵字的子查詢的操作效果。如下圖所示:

在DOS提示符窗口中查看MySQL使用ANY關鍵字的子查詢的操作效果

上圖中代碼執行的結果顯示,有7個人可以獲得獎學金。只有id為1005的學生沒有獲得獎學金,因為他的分數為65,不高於獎學金指定的最低分的任何一個。


提示

使用ANY關鍵字時,只要符合內層查詢語句返回的結果中的任何一個,就可以通過該條件來執行外層查詢語句。

MySQL帶EXISTS關鍵字的子查詢

EXISTS關鍵字表示存在。使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄,而是返回一個真假值。

如果內層查詢語句查詢到符合條件的記錄,就返回一個真值(true),否則,將返回一個假值(false):

  • 當返回的值為true時,外層查詢語句將進行查詢

  • 當返回的值為false時,外層查詢語句將不進行查詢或者查詢不出任何記錄。


實例1

如果department表中存在d_id取值為1003的記錄,則查詢employee表的記錄。SELECT語句的代碼如下:

SELECT * FROM employee
         WHERE EXISTS
         (SELECT d_name FROM department WHERE d_id=1003);

在DOS提示符窗口中查看MySQL帶EXISTS關鍵字的子查詢的操作效果。如下圖所示:

查看MySQL帶EXISTS關鍵字的子查詢的操作效果

上圖中代碼執行的結果顯示,查詢出了employee表中的所有記錄。

因為department表中存在d_id值為1003的記錄,內層查詢語句返回一個true,外層查詢語句接收true后,開始查詢employee表中的記錄。因為沒有設置查詢employee表的查詢條件,所以查詢出了employee表的所有記錄。


實例2

EXISTS關鍵字可以與其它的查詢條件一起使用。條件表達式與EXISTS關鍵字之間用AND或者OR進行連接。

如果department表中存在d_id取值為1003的記錄,則查詢employee表中age大於24歲的記錄。SELECT語句的代碼如下:

SELECT * FROM employee
         WHERE age>24 AND EXISTS
         (SELECT d_name FROM department WHERE d_id=1003);

在DOS提示符窗口中查看EXISTS關鍵字與其它的查詢條件一起使用的操作效果。如下圖所示:

查看EXISTS關鍵字與其它的查詢條件一起使用的操作效果

上圖中代碼執行的結果顯示,從employee表中查詢出了兩條記錄。這兩條記錄的age字段的取值分別是25和25。

因為,當內層查詢語句從department表中查詢到記錄,返回一個true,外層查詢語句開始進行查詢,根據查詢條件,從employee表中查詢出age大於24歲的兩條記錄。


實例3

NOT EXISTS與EXISTS正好相反。使用NOT EXISTS關鍵字時,當返回的值是true時,外層查詢語句不進行查詢或者查詢不出任何記錄;當返回值是false時,外層查詢語句將進行查詢。

如果department表中不存在d_id字段取值為1003的記錄,則查詢employee表的記錄。SELECT語句的代碼如下:

SELECT * FROM employee
       WHERE NOT EXISTS
       (SELECT d_name FROM department WHERE d_id=1003);

在DOS提示符窗口中查看使用NOT EXISTS關鍵字的操作效果。如下圖所示:

查看使用NOT EXISTS關鍵字的操作效果

上圖中代碼執行的結果顯示,沒有查詢出任何記錄。

因為department表中存在d_id為1003的記錄,內層查詢語句返回了一個true,外層查詢語句接收到true后,將不從employee表中查詢記錄。

MySQL帶比較運算符的子查詢

子查詢可以使用比較運算符。比較運算符有=、!=、>、>=、<、<=和<>等。其中,<>與!=是等價的。

MySQL帶IN關鍵字的子查詢

一個查詢語句的條件可能落在另一個SELECT語句的查詢結果中,這可以通過IN關鍵字進行判斷。

SELECT * FROM employee
       WHERE d_id IN
             (SELECT d_id FROM department);

​NOT IN關鍵字的作用和IN關鍵字正好相反。


 

SELECT語句的代碼如下:

SELECT * FROM employee
       WHERE d_id NOT IN
             (SELECT d_id FROM department);



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM