1. 程式人生 > >mysql (dml) 連結串列查詢 和 子查詢

mysql (dml) 連結串列查詢 和 子查詢

連表查詢,分為內連線和外連線,外連線又分為左連線和右連線。

    1.內連線:select 列名.... from 表1 inner join 表2 on 表1.外來鍵=表2.主鍵 【where /order by]

         示例:select user.name,order_basic.oid from order_basic inner join user on order_basic.uid=user.uid;       

         內連線查詢出的資料一定是orde_basic表中的uid與user表中uid相一致,切都存在的記錄。

    2.外連線:

        2.1》左連線:select 列名.... from 表1 left outer join 表2 on 表1.外來鍵=表2.主鍵      

                   示例:select a.name , b.oid from order_basic  as b left join user as a on a.uid=b.uid; -- 查詢與使用者相關的訂單資訊一覽,沒有任何訂單資訊的使用者也會被檢索出來

                              --查詢出a表所有的資訊記錄,不管b表有莫有對應的,都會被檢索到,如同2.2右連線

        2.2》右連線:select 列名.... from 表1 right outer join 表2  on 表1.外來鍵=表2.主鍵

                  示例:select a.name,b.oid from order_basic as b right outer join user as a on a.uid=b.uid; -- 查詢出b表所有的資訊,如果b表中有的記錄中a表沒有對應的資訊,也會顯示

        ****

        ****

        內連線時抽取的是兩表間鍵值一致的記錄,外連線時是以其中一個表的全部記錄為基準進行檢索。左右外連線只是選擇那個表作為資料抽取的基準上有所區別,實質是一致的。

   3.3個或者3個以上表間的連線:

        下面是訂單基本資訊表(order_basic),訂單詳細表(order_details),產品表(product),使用者表(user)間的連線例項。

        select ob.oid,ob.odate,p.name,p.price,od.quantity,u.name from

                  (                                                                                            1

                        ( order_basic as ob inner join order_details as od                2

                          on ob.oid=od.oid)

                          inner join product as p on od.pid=p.pid

                  }

                  inner join user as u on ob.uid=u.uid;                                  -- 要把1和2括號中的看成一個表。

子查詢:

       語法:select 列名..... from 表名 where 列名 比較運算子 (select 命令);

       示例:select * from product where price > (select AVG(price) from product);          --

                 select name,address from user where uid not in(select uid from order_basic where odate='2014/7/28');  -- 在那一天沒有下單的使用者

                select name,address from user where exists (select * from order_basic where user.uid=order_basic.uid);  -- 檢索出至少下過一個訂單的使用者(這個為相關子查詢:及

                          對使用者表中的每一條記錄,進行子查詢匹配。如果基數過大,小心給資料庫伺服器帶來的負荷)。