1. 程式人生 > >4.連接查詢

4.連接查詢

根據 方法 exc 查詢 執行 中產 什麽 舉例 自連接

1.什麽是連接查詢?
2.內連接;
3.外連接;
4.交叉連接;
5.自連接;
6.聯合查詢;

一.只要涉及兩個或者兩個以上的表,就稱為連接查詢.
比如:查詢出女客戶號購買了哪些商品,即由客戶表查出女性客戶結果集作為條件,然後再在明細表中查詢出客戶號;
select 商品ID --應該有重復行,消除重復行distinct
from 明細表
where cno in --除了in之外,也可以使用=any 或者=some
{
select cno
from 客戶表
where csex=‘女‘
}
這是最明顯的嵌套,但思維比較復雜,如果能把兩張表合成一個結果集,查詢就簡單明了.
如:先把兩個查詢語句一起執行.
select * from 客戶表
select * from 明細表
查看結果:...
select *
from 客戶表 as t1 ,明細表 as t2
where
有了這個結果集就更容易了.那就應該寫成:
select distinct 商品ID
from 客戶表 as t1 ,明細表 as t2
where t1.cno=t2.cno and t1.csex=‘女‘
這和上面的查詢結果是一致的.把多個表組合成一個大表!!!
還可以使用inner join ...on來實現:
select distinct 商品ID
from 客戶表 as t1 inner join 明細表 as t2
on t1.cno=t2.cno
where t1.csex=‘女‘

--內連接:對兩個表進行連接查詢,滿足條件的顯示出來,不滿足的舍棄.舉例:有兩個客戶表,只有客戶號有相同的,字段和記錄個數都不相同,看看查詢結果:
--兩條語句一起執行:
select * from 客戶表1
select * from 客戶表2
--組合查詢,兩個表的相同的也在一個結果集中了
select *
from 客戶表1,客戶表2
where 客戶表1.cno=客戶表2.cno
--內連接查詢,和上面的結果一樣
select *
from 客戶表1 inner join 客戶表2 on 客戶表1.cno=客戶表2.cno
--外連接(左外連接,右外連接和全連接),和內連接不同的是根據哪張表連接.比如:
--左外連接
select * from 客戶表1
select * from 客戶表2
select *
from 客戶表1 left outer join 客戶表2 on 客戶表1.cno=客戶表2.cno
--右外連接,就是把left換成right,是以第二個表為基準.
--全連接,就是把left 換成full,是把兩個表全部疊加起來.

練習 :
1.查詢出女客戶購買了哪些商品?
2.查詢出哪些被購買的商品中產地是北京的?intersect也可以用內連接(生產廠家表)
3.查詢出哪些人從來沒購買過商品?


select 商品名稱
from
(
select distinct 商品ID
from 客戶表 as t1 inner join 明細表 as t2
on t1.cno=t2.cno
where t1.csex=‘女‘
) as t3 inner join 商品表 as t4 on t3.商品ID=t4.商品ID

也可以把三張表連接起來:
select distinct 商品名稱 from 客戶表 as t1
inner join
明細表 as t2 on t1.cno=t2.cno
inner join
商品表 as t3 on t2.商品ID=t3.商品ID
where t1.csex=‘女‘

第2題:最容易想到的方法就是求北京廠家生產的商品和被購買過的商品的交集.
--產地為北京的商品名稱集合
(
select 商品名稱
from 商品表
where 生產廠家 in
(
select 商品ID
from 廠家表
where 廠家所在地市=‘北京‘
)
)
intersect --求交集 union並集
--被購買過的商品名稱集合
(
select 商品名稱
from 商品表
where 商品ID in
(
select distinct 商品ID
from 明細表
)
)
--使用inner join
select distinct 商品名稱
from 商品表 as t1
inner join
廠家表 as t2 on t1.生產廠商 = t2.廠家ID
inner join
明細表 as t3 on t1.商品ID = t3.商品ID
where t2.廠家所在地市=‘北京‘

第3題:
1.select 客戶姓名
from 客戶表
where 客戶ID not in
(
select distinct 客戶ID
from 明細表
)
2.
select 客戶姓名
from 客戶表
where 客戶ID in
(
(
select 客戶ID
from 客戶表
)
except--除...之外
(
select distinct 客戶ID
from 明細表
)
)
3.連接查詢
select 客戶姓名 from 客戶表 as t1
left outer join
明細表 as t2 on t1.客戶ID = t2.客戶ID
where 購買日期 is null


4.連接查詢