MySQL匹配指定字符串的查詢
使用正則表達式查詢時,正則表達式可以匹配字符串。當表中的記錄包含這個字符串時,就可以將該記錄查詢出來。如果指定多個字符串時,需要用“|”符號隔開,只要匹配這些字符串中的任意一個即可查詢出來。
實例1
從baike369表的name字段中查詢包含“ic”的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP 'ic';
在DOS提示符窗口中查看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個字符串中任意一個的記錄的操作效果。如下圖所示:
上圖中代碼執行的查詢結果中包含了ic、uc和ab3個字符串中的任意一個。
提示
指定多個字符串時,需要用“|”符號將這些字符串隔開。每個字符串與“|”符號之間不能有空格。因為,查詢過程中,數據庫系統會將空格也當作一個字符。如果添加了空格,就查詢不出想要的結果了,查詢結果顯示的字符串可能不止3個,也可能沒有記錄。
MySQL查詢以特定字符或字符串開頭的記錄
使用正則表達式查詢時,使用“^”符號可以匹配以特定字符或字符串開頭的記錄。
注:在鍵盤上按住Shit鍵,然后按下數字“6”鍵,即可輸出“^”字符。
實例1
從baike369表的name字段中查詢以字母“L”開頭的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP '^L';
在DOS提示符窗口中查看name字段中查詢以字母“L”開頭的記錄的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢出了name字段中以字母L開頭的兩條記錄。
實例2
從baike369表的name字段中查詢以字符串“aaa”開頭的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP '^aaa';
在DOS提示符窗口中查看name字段中查詢以字符串“aaa”開頭的記錄的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢出了name字段中以字母aaa開頭的兩條記錄。
MySQL查詢以特定字符或字符串結尾的記錄
使用正則表達式查詢時,使用“$”符號可以匹配以特定字符或字符串結尾的記錄。
實例1
從baike369表name字段中查詢以字母c結尾的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP 'c$';
在DOS提示符窗口中查看name字段中查詢以字母c結尾的記錄的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢出了name字段中以字母c結尾的兩條記錄。
實例2
從baike369表name字段中查詢以字符串“aaa”結尾的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP 'aaa$';
在DOS提示符窗口中查看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次的記錄的操作效果。如下圖所示:
上圖中代碼執行的查詢結果中都包含了aaa。
實例2
從baike369表的name字段中查詢出現過“ab”至少一次,最多3次的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP 'ab{1,3}';
在DOS提示符窗口中查看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”結尾,中間有兩個任意字符的記錄的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢出了Lily和Lucy。它們正好是以字母L開頭,以字母y結尾,中間有兩個任意字符的記錄。
MySQL使用“*”和“+”匹配多個字符的查詢
使用正則表達式查詢時,
“*”(星號)和“+”(加號)都可以匹配多個該符號之前的字符。
但是,“+”至少表示一個字符,而“*”可以表示0個字符。
實例
從baike369表的name字段中查詢字母“c”之前出現過“a”的記錄。SQL代碼如下:
SELECT * FROM baike369 WHERE name REGEXP 'a*c';
在DOS提示符窗口中查看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”的記錄的操作效果。如下圖所示:
上圖中代碼執行的查詢結果只有一條。只有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”字母和數字以外的字符的記錄的操作效果。如下圖所示:
上圖中代碼執行的查詢結果顯示為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個字母中任意一個的記錄的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢出了包含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字段中查詢出的記錄取值都包含數字。
實例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中的任意一個。
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字段的取值。如下圖所示:
2. 查看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關鍵字進行連接的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,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關鍵字進行連接的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢結果中存在着相同的記錄,這說明UNION ALL關鍵字只是將查詢結果直接合並到一起,並沒有去掉相同的記錄。
提示
UNION和UNION ALL關鍵字可以使用WHERE子句,但不能使用ORDER BY關鍵字。
MySQL帶ALL關鍵字的子查詢
用ALL關鍵字時,只有符合內層查詢語句返回的所有結果,才可以執行外層查詢語句。
例如,需要查詢哪些同學能夠獲得一等獎學金。首先必須從獎學金表中查詢出各種獎學金要求的最低分,因為一等獎學金要求的分數最高,只有當同學的成績高於所有獎學金最低分時,這個同學才可能獲得一等獎學金。
ALL關鍵字經常與比較運算符一起使用。例如,>ALL表示大於所有值,<ALL表示小於所有值。
實例
從computer_stu表中查詢出哪些同學可以獲得一等獎學金。獎學金的信息存儲在scholarship表中。操作步驟如下:
1. 查看computer_stu表的信息。如下圖所示:
2. 查看scholarship表的信息。如下圖所示:
3. 需要先從scholarship表中查詢出各種獎學金的最低分,然后,從computer_stu表中查詢哪些人的分數高於所有獎學金的最低分。
SELECT語句的代碼如下:
SELECT * FROM computer_stu WHERE score>=ALL (SELECT score FROM scholarship);
在DOS提示符窗口中查看MySQL帶ALL關鍵字的子查詢的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,只有兩個人可以獲得一等獎學金。因為這兩個人的分數比所有獎學金要求的分數都高。
MySQL使用ANY關鍵字的子查詢
使用ANY關鍵字時,只要符合內層查詢語句返回的結果中的任何一個,就可以通過該條件來執行外層查詢語句。
例如,需要查詢哪些同學能夠獲得獎學金,那么,首先必須從獎學金表中查詢出各種獎學金要求的最低分。只要一個同學的成績高於不同獎學金最低分的任何一個,這個同學就可以獲得獎學金。
ANY關鍵字通常與比較運算符一起使用。例如,>ANY表示大於任何一個值,=ANY表示等於任何一個值。
實例
從computer_stu表中查詢出哪些同學可以獲得獎學金,獎學金的信息存儲在scholarship表中。操作步驟如下:
1. 查看computer_stu表的信息。如下圖所示:
2. 查看scholarship表的信息。如下圖所示:
3. 查詢誰能得到獎學金。需要先從scholarship表中查詢出各種獎學金的最低分,然后從computer_stu表中查詢哪些人的分數高於其中任何一個獎學金的最低分。SELECT語句的代碼如下:
SELECT * FROM computer_stu WHERE score>=ANY (SELECT score FROM scholarship);
在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關鍵字的子查詢的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,查詢出了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關鍵字與其它的查詢條件一起使用的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,從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關鍵字的操作效果。如下圖所示:
上圖中代碼執行的結果顯示,沒有查詢出任何記錄。
因為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);