前言:總是忘記表連接的區別,在面試的時候也容易被問到,因此就好記性不如爛筆頭吧
集合運算
有并集、交集、差集
聯合查詢*(針對行合并的)*
union為關鍵字,就是將兩個select的結果求并集(此時重復的只出現一次,要是想把重復的也都展示出來 應該用 union all)
ps:以上這些是用行進行計算的,而下面的內連接和外連接是用列進行計算的
內連接
只會現實關鍵字所在的共有的行,各自的獨特的行沒有,
假如實現a表和b表通過關鍵字sid來鏈接起來
a中sid是1~5,b中sid是2-8,那么結果中sid只有2-5.
select * from a #展示的是a表中的全部
inner join b
on a.sid=b.sid;
###如果結果只展示a中的sid、sex、name列,一定要使用“表名+點+列名”格式,
###如果加上別名,用as,同時還使用where函數則為
select a.sid,a.sex,a.name from a as staff
inner join b as market
on a.sid=b.sid
where b.age>20;
由于內連接會忽略一些結果,但是實際中可能想展示a中的所有sid或者b中的所有sid,則需要其他連接方式,如左外連接or右外連接
外連接
1.左外連接
結果以左表a中為準,sid就是1-5啦,可能1中有些內容是空白,因為b中沒有sid=1的內容
select * from a
left outer join b
on a.sid=b.sid;
2.右外連接
結果以左表b中為準,sid就是2-8啦,可能5-8中有些內容是空白,因為a中沒有sid=6到8的內容
select * from a
right outer join b
on a.sid=b.sid;
3.完全連接
就是左連接union有鏈接,把a和b中全部的展示,有點像就并集
select * from a
right outer join b
on a.sid=b.sid;
union
select * from a
left outer join b
on a.sid=b.sid;
笛卡爾積
也稱交叉連接,有點像排列組合的感覺
像a中有1-3,b中有ijk,
則結果就是1i、1j、1k、2i、2j、2k、3i以此類推
1.笛卡爾積連接
select 列名
from a,b;
或者是
select 列名
from a cross join b;
2.自連接
就是自己連接自己,但是的區分,用as來重命名
select 列名
from a as a1,a as a2;
一個例子,自連接實現排序
select a.name,a.age,count(*) as 排名
from a as a1,a as a2
where a1.age<=a2.age
group by a1.sid
order by 排名;