公司名稱大全及最新網(wǎng)絡優(yōu)化器
Mysql 函數(shù)參考和擴展:Mysql 常用函數(shù)和基礎查詢、 Mysql 官網(wǎng)
Mysql 語法執(zhí)行順序如下,一定要清楚!!!運算符相關,可前往 Mysql 基礎語法和執(zhí)行順序擴展。
(8) select (9) distinct (11)<columns_name list>
(1) from <left_table>
(3) <join_type> join <right_table>
(2) on <join_condition>
(4) where <where_condition>
(5) group by <group_by columns_name list>
(6) with <rollup>
(7) having <having_condition>
(10) order by <order_by columns_name list>
(12) limit <[offset,] rows>
;
橫向合并
又稱多表聯(lián)結(jié),是通過不同表中具有相同意義的關鍵字段,將多個表進行連接。
多表連接的結(jié)果通過三個屬性決定
- 方向性:在外連接中寫在前邊的表為左表,寫在后邊的表為右表,左右沒有多大關系,主要取決于連接方式。
- 主附關系:主表要出所有的數(shù)據(jù)范圍,附表與主表無匹配項時標記為null,內(nèi)連接無主附表之分。
- 對應關系:關鍵字段中有重復的表為多表,沒有重復的表為一表。對應關系有一對一、一對多、多對一。
常見的連接方式有:內(nèi)連接和外連接(左連接和右連接)。
示例:有兩個表 t1和 t2,t1表的key1元素存在多個,t2表中key2元素為唯一,關鍵連接字段是 t1.key1=t2.key2。
1)內(nèi)連接:[inner] join
。按照關鍵字段合并兩個表,返回滿足條件匹配的行。
select key1,v1,key2,v2
from t1
inner join t2
on t1.key1 = t2.key2
2)左連接:left join
。按照關鍵字段合并兩個表,結(jié)果中除了包括滿足條件的行外,還包括左表的所有行。
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
3)右連接:right join
。按照關鍵字段合并兩個表,結(jié)果中除了包括滿足條件的行外,還包括右表的所有行。
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2
4)左反連接:按照關鍵字段合并兩個表,返回左表有,而右表沒有的記錄。
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
where t2.key2 is null
5)右反連接:按照關鍵字段合并兩個表,返回右表有,而左表沒有的記錄。
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2
where t1.key1 is null
6)笛卡爾積:合并兩個表,返回的記錄數(shù)量是兩個表的數(shù)量乘積,詳情如下:
# 方法一
select key1,v1,key2,v2
from t1
join t2;
# 方法二
select key1,v1,key2,v2
from t1,t2;
其實還有全連接(full join),但是在Mysql中沒有,需要通過其他方式實現(xiàn),這里給大家放到下面的縱向合并講解。
多表聯(lián)結(jié)橫向合并需要特別注意所關聯(lián)的關鍵字段,避免多對多情況或者沒寫關聯(lián)的關鍵字段,并且保證維度表關鍵字段唯一,否則會出現(xiàn)笛卡爾積得到叉乘數(shù)據(jù)記錄。
縱向合并
縱向合并,可以理解為追加或者添加數(shù)據(jù)記錄。將其他數(shù)據(jù)集合并到主數(shù)據(jù)集。
注意事項
:
- 兩張表必須擁有相同數(shù)量的字段
- 兩張表字段的順序必須相同
- 兩張表對應字段的數(shù)據(jù)類型必須一致
※字段名可以不相同,選取主數(shù)據(jù)集的字段名
union all
:返回多個數(shù)據(jù)集中的并集,不會去除重復記錄。其實就是上面的左反和右反連接合并后的結(jié)果。
# 這里將左連接和
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
where t2.key2 is null
union all
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2
where t1.key1 is null;
union
:返回多個數(shù)據(jù)集中的并集,并且去除重復記錄。下面這個示例其實就類似于Oracle/SQL Server中的full join。
select key1,v1,key2,v2
from t1
left join t2
on t1.key1 = t2.key2
union
select key1,v1,key2,v2
from t1
right join t2
on t1.key1 = t2.key2;
union 就是將多段功能類似的sql連接,并去掉重復的行,有distinct的功能。
union all 則只是單純的將多段類似sql連接,將復雜sql按照不同的功能拆分成一小段sql進行拼接,可以有效提高查詢效率。
批注
join和union的用法在sql中非常重要,為了減少數(shù)據(jù)冗余,相同的數(shù)據(jù)不需要在多個表中重復存儲,而應當將其拆分到單獨的表中,以便更有效地管理數(shù)據(jù),簡化維護工作,并且在系統(tǒng)需要擴展時更容易進行水平擴展。因此,除非有特定要求,在實際應用中,盡量將維度表和事實表分開存儲,需要時再使用橫向合并和縱向合并拼接數(shù)據(jù),以避免相關維度表如需調(diào)整,則要調(diào)整所有表的情況。