1. 程式人生 > 其它 >SQL--表關聯與子查詢

SQL--表關聯與子查詢

1、(INNER) JOIN :內連結,常與where配合做條件篩選,這種拼接得到最少的資料量,效率較高,但沒有left join使用頻率高,此方式相當於沒有主表,後期資料處理時常出現因需要用到的資料被排除而需要返工重新拼接資料。

2、LEFT JOIN  :左(外)連線,即左為主表,最常用的拼接。

3、RIGHT JOIN  :右(外)連線與LEFT JOIN 其實等價,一般習慣為左邊主表,所以right join 不常用

4、FULL (OUTER) JOIN :即保留左右未匹配上的資料,一般用於多資料來源的整合拼接,如table_A包含使用者的a、b類資訊,table_B包含使用者的c、d類資訊,但時兩個表包含的使用者量並不相同,此時這需要用到全拼接。

  select nvl(a.a,''),nvl(a.b,'')

    ,nvl(b.c,''),nvl(b.d,'')    

    from table_A a full join table_B b on a.user_id = b.user_id 

  MySQL好像沒有全拼接吧,需要用union 方式轉換一下,貌似。。。

ON 拼接條件,MySQL 允許非等值(>,<...)拼接,hive 只支援等值連結 即 (=)

5、CROSS JOIN  或 ",": select  * from tb_A,tb_B ,這種拼接方法為笛卡兒積,得到所有可能的連線結果,此拼接不需要on 拼接條件

  select * from table_A,table_B

  在一些特殊的情況下,尤其是時間縱向的資料分析有奇效,這種拼接導致資料量指數膨脹,易造成資料傾斜,運算阻塞奔潰,要慎用。。。

WHERE 篩選條件

6、union all :上下拼接(並集),不去重

  union :上下拼接,去重,且按預設方式排序

7、子查詢:即把其中一個select的結果作為另一個select 的where 篩選條件

  select * from table_A  a 

    where a.id in (select id from table_B where id>n)

  實際應用過程中,子查詢情況並不多,執行效率不高,且容易導致指令碼複雜,可讀性太差,尤其時在複雜的SQL指令碼中,實用性不高,可以通過常規拼接代替。