[MYSQL -16]建立高階聯結

VictorLeeLk發表於2017-09-18

1、使用表別名

  • 縮短SQL語句;

  • 允許在單條SELECT語句中多次使用相同的表

表別名只在查詢執行使用中使用。與列別名不一樣,表別名不返回到客戶機。

select cust_name,cust_contact
        from customers as c,orders as o,orderitems as oi
        where c.cust_id = o.cust_id
        and oi.order_num= o.order_num
        and prod_id='TNT2';

2、自聯結

單條SELECT語句中不止一次引用相同的表。

  • 子查詢
select prod_id,prod_name
        from products
        where vend_id=(select vend_id from products where prod_id='DTNTR');
  • 自聯結
select prod_id,prod_name
        from products as p1,products as p2
        where p1.vend_id=products.vend_id
        and products.prod_id='DTNTR';

自聯結通常作為外部語句用來替代從相同表中檢索資料時使用的子查詢語句。雖然與子查詢結果是相同的,但有時候比子查詢快的多。

3、自然聯結

只能選擇那些唯一的列,通過對錶使用萬用字元(SELECT *),對所有其他表的列使用明確地子集來完成。自然聯結排除多次出現,每個列只返回一次。

select c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price
        from customers as c,orders as o,orderitems as oi
        where c.cust_id=o.cust_id
        and oi.order_num=o.order_num
        and prod_id='FB';

該例項中,萬用字元只對第一個表使用。所有其他列明確列出,所以沒有重複的列被檢索出來。

4、外部聯結

聯結都是一個表中的行與另一個表中的行相關聯。但有時候需要包含那些沒有關聯行的那些行。

  • LEFT OUTER JOIN ON
  • RIGHT OUTER JOIN ON
select customers.cust_id,orders.order_num
        from customers left outer join orders
        on customers.cust_id=orders.cust_id;

LEFT表示包含其所有行的表(LEFT指出的是OUTER JOIN左邊的表)。

5、使用聚集函式的聯結

select customers.cust_name,
        customers.cust_id,
        count(orders.order_num) as num_ord
        from customers inner join orders
        on customers.cust_id=orders.cust_id
        group by customers.cust_id;

相關文章