Mysql數據庫連接查詢

Mysql數據庫連接查詢

  • 連接是關係數據庫模型的主要特點。連接查詢是關係數據庫中最主要的查詢,主要包括內連接、外連接等。通過連接運算可以實現多個表查詢。當查詢數據時,通過連接操作查詢出存放在多個表中的不同實體信息。當兩個或多個表中存在相同意義的字段時,便可以通過這些字段對不同的表進行連接查詢。如下將介紹多表之間的內連接查詢、外連接查詢以及複合條件連接查詢。

內連接查詢

  內連接(inner join)使用比較運算符進行表間列數據的比較操作,並列出這些表中與連接條件相匹配的數據行,並組合成新的記錄。新建學生表、班級表,在兩個表之間實現連接查詢。其中tb_class中的主鍵id爲tb_student的外鍵,表結構如下:

表中數據如下:

               

  表的連接查詢語句爲:SELECT tb_student.*,tb_class.name FROM tb_student,tb_class WHERE tb_student.classID=tb_class.id; 或 SELECT tb_student.*,tb_class.name FROM tb_student INNER JOIN tb_class ON tb_student.classID=tb_class.id;

  如果在一個連接查詢中,涉及到的兩個表都是同一個表,這種查詢稱爲自連接查詢,自連接是一種特殊的內連接,它是指相互連接的表在物理上爲同一張表,但可以在邏輯上分爲兩張表。如下是對tb_student表的查詢,查詢和id爲1的學生爲同一個班的同學:

外連接查詢

   連接查詢將查詢多個表中相關聯的行,內連接時,返回查詢結果集合中的僅是符合查詢條件和連接條件的行。但有時需要包含沒有關聯的行中數據,即返回查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左連接)、右表(右連接)或兩個邊表中的所有數據行。外連接分爲左外連接和右外連接;

  1. LEFT JOIN(左連接):返回包括左表中的所有記錄和右表中連接字段相等的記錄

  2. RIGHT JOIN(右連接):返回包括右表中所有記錄和左表中連接字段相等的記錄

  • LEFT JOIN 左連接

  左連接的結果包括LEFT OUTER子句中指定的左表的所有行,而不僅僅是連接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果行中右表的所有選擇列表列均爲空值。如下是學生表和班級表,查詢所有學生所在班級的名稱,包括還沒有給分配班級的學生。

                                

  左連接語句爲:SELECT tb_student.name,tb_class.name FROM tb_student LEFT OUTER JOIN tb_class ON tb_student.classID=tb_class.id;

  • RIGHT JOIN 右連接

  右連接是左連接的反向連接,將返回右表的所有行,如果右表的某行在左表中沒有匹配項,左表將返回空值,如下圖所示,tb_student表中沒有計算機5班的學生,故計算機5班前學生名爲空。

子查詢

  子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢,在SELECT子句中先計算子查詢,子查詢結果作爲外層另一個查詢的過濾條件,查詢可以基於一個表或者多個表。子查詢中常用的操作符有ANY(SOME)、ALL、IN、EXISTS。子查詢可以添加到SELECT、UPDATE和DELETE語句中,而且可以進行多層嵌套。子查詢中也可以使用比較運算符,如“<”、“<=”、“>”、“>=”和“!=”等。本節將介紹如何在SELECT語句中嵌套子查詢。

  • 帶ANY、SOME關鍵字的子查詢

  ANY和SOME關鍵字是同義詞,表示滿足其中任一條件,他們允許創建一個表達式對子查詢的返回值列表進行比較,只要滿足內層子查詢中的任何一個比較條件,就返回一個結果作爲外層查詢的條件。ANY關鍵字接在一個比較操作符的後面,表示若與子查詢返回的任何值比較爲TRUE,則返回TRUE。如下是是查詢比學號爲1學生最低成績(86)高的所有成績列表:

  SQL查詢語句爲:SELECT * FROM tb_score WHERE grade> ANY(SELECT grade FROM tb_score WHERE sID=1);

  

  • 帶ALL關鍵字的子查詢

  關鍵字ALL與ANY和SOME不同,使用ALL時需要同時滿足內層查詢的條件,例如,將如上的例子中的ANY改爲ALL,則查詢比學號爲1的學生成績(86,90)都高的成績,則如上可看出查詢出結果爲空。

  • 帶EXISTS關鍵字的子查詢

  EXISTS關鍵字後面的參數是一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行,如果至少返回一行,那麼EXISTS的結果爲TRUE,此時外層查詢語句將進行查詢;如果子查詢沒有返回任何行,那麼EXISTS返回的結果爲FALSE,此時外層語句將不進行查詢。

  • 帶IN關鍵字的子查詢

  IN關鍵字進行子查詢時,內層查詢語句僅僅返回一個數據列,這個數據列裏的值將提供給外層查詢語句進行比較操作。如下兩條語句分別查詢學生的語文成績、查詢2班學生的所有成績:

  查詢學生語文成績:SELECT sID,grade FROM tb_score WHERE cID IN (SELECT id FROM tb_course WHERE name='語文');

  查詢2班學生的所有成績:SELECT sID,cID,grade FROM tb_score WHERE sID IN (SELECT id FROM tb_student WHERE classID=2);

合併查詢

  利用UNION關鍵字,可以給出多條SELECT語句,並將它們的結果組合成單個結果集。合併時兩個表對應的列數和數據類型必須相同。各個SELECT語句之間使用UNION或UNION ALL關鍵字分隔。UNION不使用關鍵字ALL執行時,刪除重複記錄,所有返回行都是唯一的;使用關鍵字ALL的作用是不刪除重複行也不對結果進行自動排序。

  如查詢1號課程且大於80分和4號學生的成績:SELECT sID,grade FROM tb_score WHERE grade>80 AND cID=1 UNION SELECT sID,grade FROM tb_score WHERE sID=4;SELECT sID,grade FROM tb_score WHERE grade>80 AND cID=1 UNION ALL SELECT sID,grade FROM tb_score WHERE sID=4;

正則表達式

  正則表達式通常被用來檢索或替換那些符合某個模式的文本內容,根據指定的匹配模式匹配文本中符合要求的特殊字符串。例如從一個文本文件中提取電話號碼,查找一篇文章中重複淡出或者替換用戶輸入的某些敏感詞語等等,這些地方都可以使用正則表達式。MySQL中使用REGEXP關鍵字指定正則表達式的字符串匹配模式,a如下表列出了REGEXP操作符中常用匹配列表。

選項說明例子匹配值實例
^匹配文本的開始字符'^b'匹配以字母b開頭的字符串book,big,banana,bike
$匹配文本的結束字符'st$'匹配以st結尾的字符串test,resist,rest,persist
.匹配任何單個字符'b.t'匹配任何b和t之間一個字符bit,bat,but,bite
*匹配零個或多個在它前面的字符'f*n'匹配字符n前面有任意個字符ffn,fan,faan,fit
+匹配前面的字符1或多次'ba+'匹配以b開頭後緊跟至少有一個aba,bay,bare,battle
<字符串>匹配包含指定的字符串的文本'ha'happy,hacker,hackman
[字符集合]匹配字符集合中任何一個字符'[xz]'匹配x或者zdizzy,zebra,x-ray,extra
[^]匹配不在括號中的任何字符'[^abc]'匹配任何不包含a、b和c的字符串desk,fox,file
字符串{n,}匹配前面的字符串至少n次b{2}匹配兩個或者更多個bbb,bbb,bbbb
字符串{n,m}匹配前面字符串至少n次,至多m次。如果n=0,此參數爲可選參數b{2,4}匹配最少2個,最多4個bbb,bbb,bbbb

  選擇學生表中information列中首字母爲z的行:SELECT * FROM tb_student WHERE information REGEXP '^z'; 

  其它正則表達式的舉例略,大家可以根據自己需求自行設計。


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