1. 程式人生 > >SQL必知必會-筆記(七)查詢

SQL必知必會-筆記(七)查詢

聯結 nta mys 語句 地方 沒有 表結構 問題 我們

目錄

  • 子查詢
  • 聯結表

子查詢

即嵌套在其他查詢中的查詢

  • 表結構說明:每個訂單包含訂單編號,客戶ID,訂單日期,在Orders表中。各訂單的物品存儲在相關的OrderItems表中,Orders表中不存儲客戶信息,只存儲客戶ID。客戶實際信息存儲在Customers表中。
  • 問題1:檢索出訂購物品RGAN01的所有顧客

  • 解:
    • 步驟一:檢索出包含物品RGAN01的訂單
    select order_num from OrderItems where prod_id = ‘RGAN01‘;
    可以得到,
    技術分享圖片
    • 步驟二:檢索出和訂單號20007,20008相關的顧客
    select cust_id from Orders where order_num in (20007,20008);
    可以得到,
    技術分享圖片
    • 步驟三:檢索出這些客戶ID的顧客信息
    select cust_name,cust_contact from Customers where cust_id in (‘1000000004‘,‘1000000005‘);
    可以得到,
    技術分享圖片
  • 總結:

    select cust_name,cust_contact from Customers where cust_id in (select cust_id from Orders where order_num in (select order_num from OrderItems where prod_id = ‘RGAN01‘));

    需要註意的地方:1. 作為子查詢的SELECT語句只能查詢單個列,企圖檢索多個列將返回錯誤;2. 對於能嵌套的子查詢的數目沒有限制,不過在實際使用的時候由於性能的限制,不能嵌套太多的子查詢。

  • 問題2:顯示Custormers表中每個顧客的訂單總數

  • 解:
    • 步驟一:檢索出Custormers表中的顧客列表
      select cust_name,cust_state,cust_id from Customers order by cust_name;
    • 步驟二:對於檢索出的顧客,檢索其在Orders表中的訂單數目
    select count(*) from Orders where cust_id = ‘1000000003‘;
  • 總結:
   select cust_name, cust_state , (select count(*) from Orders where Orders.cust_id = Customers.cust_id) from Customers order by cust_name;

其中,where Orders.cust_id = Customers.cust_id表示比較從Orders表中的cust_id和當前正從Customers表中檢索出的cust_id。

另外,雖然樣例可以完成需求,但並不是解決這種數據檢索的最有效方法,後面講到JOIN方法時我們會重新做這道題。


聯結表

SQL必知必會-筆記(七)查詢