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); -- 檢索出至少下過一個訂單的使用者(這個為相關子查詢:及
對使用者表中的每一條記錄,進行子查詢匹配。如果基數過大,小心給資料庫伺服器帶來的負荷)。