就是一個表本身和本身聯結,通常用來替代子查詢數據庫
好比班上有1個學生數學考了100分,你不知道他是誰,你想知道他的其餘學科的成績spa
新手的寫法code
select student_id from score where type='mathematics' and score=100(假設結果爲27) select * from score where student_id=27 或者 select * from score where student_id=( select student_id from score where type='mathematics' and score=100 )
自聯結的寫法blog
select t1.* from score as t1,score as t2 where t1.student_id=t2.student_id and t2.type='mathematics' and t2.score=100 select t1.* from score as t1 inner join score as t2 on t1.student_id=t2.student_id where t2.type='mathematics' and t2.score=100
不管什麼時候對錶進行聯結,應該至少有一個列出如今不止一個表中(被聯結的列)圖片
標準的聯結返回全部數據,甚至相同的列屢次出現數學
天然聯結排除屢次出現,使每一個列只返回一次it
數據庫經過本身的判斷並使用表內全部
相同的字段做爲聯結條件完成聯結過程,不須要指定聯結條件io
通常的寫法是第1個表用*
指定字段,其餘的表用明確的表字段指定class
最好不要讓數據庫自動完成聯結,不推薦使用select
select * from t1 natural join t2(效果有點相似inner join) select * from t1 natural left join t2(效果有點相似left join) select * from t1 natural right join t2(效果有點相似right join)
聯結的2個表必須聯結條件匹配纔會獲得數據
內部聯結通常都是天然聯結,極可能咱們永遠都不會用到不是天然聯結的內部聯結
select a.f1,b.f2 from a,b where a.f3=b.f4(不推薦這樣的寫法) select a.f1,b.f2 from a inner join b on a.f3=b.f4(inner關鍵字能夠省略)
若是兩個表是根據字段名同樣的字段聯結的,能夠這樣寫
select t1.id,t2.name from t1 inner join t2 using(f)
外部聯結根據狀況來肯定是否包含那些在相關表中沒有匹配的行
1.左外部聯結(又叫左聯結)
左表的行必定會列出,右表若是沒有匹配的行,那麼列值就爲null
特別須要注意的是若是右表有多行和左表匹配,那麼左表相同的行會出現屢次
select a.f1,b.f2 from a left outer join b on a.f3=b.f4(outer關鍵字能夠省略)
2.右外部聯結(又叫右聯結)
和左聯結相似,只不過以右表爲主表而已,左聯結和右聯結能夠相互轉化
select a.f1,b.f2 from a right outer join b on a.f3=b.f4(outer關鍵字能夠省略)
3.全外部聯結
返回左表和右表的全部行,無論有沒有匹配,同時具備左聯結和右聯結的特性
select a.f1,b.f2 from a full outer join b on a.f3=b.f4(outer關鍵字能夠省略)
生成笛卡爾積,它不使用任何匹配或者選取條件,而是直接將一個數據源中的每一個行與另外一個數據源的每一個行都一一匹配
select * from a cross join b
UNION不容許同一行(每一個字段都同樣)重複出現,而UNION ALL則沒有這個限制
select A,B from u1 union all select A,B from u2