標籤:去重 技術 http rom exist als 運算子 php ima
一、聯集查詢
在兩種情況下可能用到:1、想要的結果在一條語句中會引起邏輯衝突,只能放在兩條語句中是要使用聯集查詢
2、一張表的資料量非常大時,會分隔成多張表格儲存體,要查詢時也要用到聯集查詢
使用時要注意:1, 聯集查詢中如果要使用order by,那麼就必須對這個select語句加上一對括弧!
2, 聯集查詢中的order by必須搭配上limit關鍵字才會生效!因為系統預設的聯集查詢的結果往往比較多,所以要加以限制,當然,如果想顯示全部的資料,可以在limit子句後面加上一個很大的數,比如:999999
關鍵字:union
文法形式
select語句1
union[union選項]
select 語句2
union[union選項]
select 語句3
union[union選項]
……
union 選項 all:也是預設值,保留所有的查詢結果!
distinct:去重(預設值),去掉重複的查詢結果!
二、交叉串連
關鍵字:cross join
文法:select * | 欄位列表 from 表1 cross join 表2
含義:就是從一張表的一條記錄去串連另一張表中的所有記錄,並且儲存所有的記錄,其中包括兩個表的所有的欄位!從結果上看,就是對兩張表做笛卡爾積!
三、內串連文法:
select *|
欄位列表
from
左表
inner join
右表
on
左表
.
欄位
=
右表
.
欄位
; 其中inner可以省略
內串連的本質還是在做交叉串連,只不過是在交叉串連的基礎之上加上一定的串連條件!符合串連條件的才會被顯示,不符合的就不顯示!(這樣有可能遺失資料)!
所以,如果內串連的時候沒有串連條件,此時內串連就相當於是交叉串連!
四、外串連
外串連分為左外串連left outer join(左表為主表)和右外串連right outer join(右表為主表);
是拿主表的每一條記錄按照on後面的條件去匹配從表,如果匹配成功,那麼就保留兩張表的所有的記錄,如果匹配失敗(也就是主表的一條記錄無法匹配從表的所有的記錄),此時,只保留主表的記錄,從表的記錄全部用null代替,這樣主表資料不會丟失
五、自然串連
自然串連分為自然內串連natural inner join ,自然左/右串連natural left/right join
自然串連的本質跟前面的內串連和外串連沒有太大區別,只是這裡的串連條件不是由使用者來指定,而是由系統來指定罷了
只要兩張表中具有相同的欄位名,系統就認為是一個串連條件,就會主動的去匹配這兩個相同的欄位名的值是否相同,如果兩個表的相同的欄位名的值相同,就認為匹配成功;如果兩張表中有多個欄位名相同,則所有相同的欄位名的值都要相同才算是匹配成功
六、子查詢1、標量子查詢
往往就是把標量子查詢的結果當成一個值來使用,比如用來判斷,參與運算等
例:
2、列子查詢
也就是返回單列的子查詢,也叫作列子查詢!
列子查詢的結果往往就是一系列相同屬性的資料的集合,所以,我們一般就是把列子查詢的結果當成一個集合來看待,也通常就是配合in和not in集合運算子來使用!
3、行子查詢
查詢結果為一行的子查詢就叫作行子查詢!
行子查詢使用的不是很多,必須在查詢的過程中構造一個行元素才能與子查詢的結果進行比較!
所謂的構造行元素,就是一個由多個欄位組成的元素,形式上就是將多個欄位用一個括弧括起來!
4、表子查詢
返回結果是多行多列的子查詢就叫作表子查詢!
表子查詢一般都是from型,也就是出現在from之後,一般當成一個資料來源來使用!
例:不使用統計函數,而使用表子查詢
1), 先對整個表根據score欄位進行排序(升序)
2), 對排序後的結果再根據home欄位進行group by,因為group by只取每一個分組的第一個記錄!
如果想查所有家鄉的所有的最低分(可能有重複情況):
select * from php_student natural join (select home,min(score) as score from php_student group by home) as m;
5、exists子查詢
exists主要是用來做判斷的,返回的結果是一個布爾值!
判斷依據:如果子查詢可以返回資料,那麼exists的結果就是true,否則就是false!
exists的主要作用就是判斷後面的select語句有沒有查詢到資料
mysql基礎3