標籤: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;" />
串連查詢將查詢多個表中相關聯的行,內串連時,返回查詢結果集合中的僅是符合查詢條件和串連條件的行。但有時需要包含沒有關聯的行中資料,即返回查詢結果集合中的不僅包含符合串連條件的行,而且還包括左表(左串連)、右表(右串連)或兩個邊表中的所有資料行。外串連分為左外串連和右外串連;
LEFT JOIN(左串連):返回包括左表中的所有記錄和右表中串連欄位相等的記錄
RIGHT 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;" />
右串連是左串連的反向串連,將返回右表的所有行,如果右表的某行在左表中沒有匹配項,左表將返回空值,如所示,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關鍵字接在一個比較操作符的後面,表示若與子查詢返回的任何值比較為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與ANY和SOME不同,使用ALL時需要同時滿足內層查詢的條件,例如,將如上的例子中的ANY改為ALL,則查詢比學號為1的學產生績(86,90)都高的成績,則如上可看出查詢出結果為空白。
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關鍵字進行子查詢時,內層查詢語句僅僅返回一個資料列,這個資料列裡的值將提供給外層查詢語句進行比較操作。如下兩條語句分別查詢學生的語文成績、查詢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。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資料庫連接查詢