Mysql資料庫連接查詢

來源:互聯網
上載者:User

標籤:mysql

    

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

內串連查詢

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170202135051386-515362233.png" width="364" height="135" style="margin:0px auto;padding:0px;border:0px;" />

表中資料如下:

       650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170202140818558-976117808.png" style="margin:0px;padding:0px;border:0px;" />        650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170202140721901-1993620542.png" style="margin:0px;padding:0px;border:0px;" />

  表的串連查詢語句為: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;

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170202141313058-1919179447.png" style="margin:0px auto;padding:0px;border:0px;" />

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170202151507183-194872848.png" style="margin:0px auto;padding:0px;border:0px;" />

外串連查詢

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

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

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

  • LEFT JOIN 左串連

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

                          650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204153753167-1875641693.png" style="margin:0px;padding:0px;border:0px;" />      650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204153845229-1221607466.png" style="margin:0px;padding:0px;border:0px;" />

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204154117042-867865189.png" style="margin:0px auto;padding:0px;border:0px;" />

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204155022917-650726267.png" style="margin:0px auto;padding:0px;border:0px;" />

  • RIGHT JOIN 右串連

  右串連是左串連的反向串連,將返回右表的所有行,如果右表的某行在左表中沒有匹配項,左表將返回空值,如所示,tb_student表中沒有電腦5班的學生,故電腦5班前學生名為空白。

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204154925604-1322672853.png" style="margin:0px auto;padding:0px;border:0px;" />

子查詢

  子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢,在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);

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204164949120-966209953.png" width="217" height="252" style="margin:0px;padding:0px;border:0px;" />  650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204165059073-998037364.png" width="479" height="247" style="margin:0px;padding:0px;border:0px;" />

  • 帶ALL關鍵字的子查詢

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

  • 帶EXISTS關鍵字的子查詢

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204170823995-351881538.png" style="margin:0px auto;padding:0px;border:0px;" />

  • 帶IN關鍵字的子查詢

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

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204171958917-642859880.png" style="margin:0px auto;padding:0px;border:0px;" />

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170204172622151-1808324286.png" style="margin:0px auto;padding:0px;border:0px;" />

合并查詢

  利用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;

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170207210944322-2017394359.png" style="margin:0px auto;padding:0px;border:0px;" />

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170207211023213-909196573.png" style="margin:0px auto;padding:0px;border:0px;" />

Regex

  Regex通常被用來檢索或替換那些符合某個模式的常值內容,根據指定的匹配模式比對文本中符合要求的特殊字元串。例如從一個文字檔中提取電話號碼,尋找一篇文章中重複淡出或者替換使用者輸入的某些敏感詞語等等,這些地方都可以使用Regex。MySQL中使用REGEXP關鍵字指定Regex的字串匹配模式,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前面有任意個字元f fn,fan,faan,fit
+ 匹配前面的字元1或多次 ‘ba+‘匹配以b開頭後緊跟至少有一個a ba,bay,bare,battle
<字串> 匹配包含指定的字串的文本 ‘ha‘ happy,hacker,hackman
[字元集合] 匹配字元集合中任何一個字元 ‘[xz]‘匹配x或者z dizzy,zebra,x-ray,extra
[^] 匹配不在括弧中的任何字元 ‘[^abc]‘匹配任何不包含a、b和c的字串 desk,fox,file
字串{n,} 匹配前面的字串至少n次 b{2}匹配兩個或者更多個b bb,bbb,bbbb
字串{n,m} 匹配前面字串至少n次,至多m次。如果n=0,此參數為選擇性參數 b{2,4}匹配最少2個,最多4個b bb,bbb,bbbb

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

650) this.width=650;" src="http://images2015.cnblogs.com/blog/786913/201702/786913-20170208104459760-1413231370.png" style="margin:0px auto;padding:0px;border:0px;" />

  其它Regex的舉例略,大家可以根據自己需求自行設計。


Mysql資料庫連接查詢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.