JOIN
連接組合兩個表中的字段記錄,包括三種:
?
INNER?JOIN
運算式:連接組合兩個表中的字段記錄。
?
LEFT?JOIN
運算式:連接組合兩個表中的字段記錄,并將包含了
LEFT?JOIN
左邊表中的全部記錄。
?
RIGHT?JOIN
運算式:連接組合兩個表中的字段記錄,并將包含了
RIGHT?JOIN
右邊表中的全部記錄。
?
INNER?JOIN
設定兩個表相關聯的運算式,以連接組合兩個表中的字段記錄。
?
INNER?JOIN
語法如下:
?
FROM?
表
1?INNER?JOIN?
表
2?ON?
表
1.
字段
1?
比較運算子
?
表
2.
字段
2?
兩個表連接的字段,譬如
?[
表
1.
字段
1=
表
2.
字段
2]
,必須具有相同的字段類型,但是字段名稱不需要相同。
?
例如,自動編號字段類型可以連接
Long?
的字段類型,但是單精整數字段類型不能連接雙精整數的字段類型。
?
比較運算子可為
=
、
<
、
>
、
<=
、
>=
、或
<>
。
?
JOIN
連接的字段,不可以包含
MEMO
字段類型或
OLE
對象類型,否則會發生錯誤。
?
在一個
JOIN
表達式中,可以連結多個
ON
子句:
?
SELECT?fields?
FROM?
表
1?INNER?JOIN?
表
2?
ON?
表
1.
字段
1?
比較運算子
?
表
2.
字段
1?AND?
ON?
表
1.
字段
2?
比較運算子
?
表
2.
字段
2)?OR?
ON?
表
1.
字段
3?
比較運算子
?
表
2.
字段
3)?
JOIN
表達式中,可以為巢狀式:
?
SELECT?fields?
FROM?
表
1?INNER?JOIN?
(
表
2?INNER?JOIN?[(?]
表
3?
[INNER?JOIN?[(?]?
表
x?[INNER?JOIN?...)]?
ON?
表
3.
字段
3?
比較運算子
?
表
x.
字段
x)]?
ON?
表
2.
字段
2?
比較運算子
?
表
3.
字段
3)?
ON?
表
1.
字段
1?
比較運算子
?
表
2.
字段
2?
在一個
INNER?JOIN
中,可以包括巢狀式的
LEFT?JOIN
或
RIGHT?JOIN
,但是在一個
LEFT?JOIN
或
RIGHT?JOIN
中不能包括巢狀式的
INNER?JOIN
。
?
==================================================
看一下一個查詢的問題 ?
我有兩張表 ?
tab1 ?
? ? ? ?字段 ?
? ? ? ?aID ?
? ? ? ?bID ?
?
tab2 ?
? ? ? ?字段 ?
? ? ? ?aID ?
? ? ? ?bID ?
tab1中有記錄: ?
aID ? ?bID ?
as1 ? ?19 ?
as2 ? ?19 ?
as3 ? ?23 ?
as4 ? ?45 ?
tab2中有記錄: ?
aID ? ?bID ?
as2 ? ?19 ?
as3 ? ?19 ?
as4 ? ?19 ?
現在需要查找出兩張表中bID相等的且bID=19的記錄,應該是5條記錄 ?
我用的方法是: ?
方法1:select ?tab1.aID,tab2.aID ?from ?tab1,tab2 ?where ?tab1.bID=tab2.bID ?and ?tab2.bID=19 ?
方法2:select ?tab1.aID,tab2.aID ?from ?tab1 ?join ?tab2 ?on ?tab1.bID=tab2.bID ?where ?tab1.bID=19 ?
上面兩中方法選出的記錄都是6條,為什么出這樣的問題,應該怎么做呢? ?
--------------------------------------------------------------- ?
?
select ?* ?form ?tab1 ?where ?bID=19 ?
union ?all ? ?
select ?* ?form ?tab2 ?where ?bID=19 ?
?
?
--------------------------------------------------------------- ?
?
create ?table ?tab1 ?
? ? ? ?(aID ?char(10), ?
? ? ? ?bID ?char(10)) ?
go ?
?
insert ?into ?tab1(aid,bid) ?values('as1','19') ?
insert ?tab1 ?values('as2','19') ?
insert ?tab1 ?values('as3','38') ?
insert ?tab1 ?values('as4','45') ?
go ?
create ?table ?tab2 ?
? ? ? ?(aID ?char(10), ?
? ? ? ?bID ?char(10)) ?
go ?
go ?
insert ?tab2 ?values('as2','19') ?
insert ?tab2 ?values('as3','19') ?
insert ?tab2 ?values('as4','19') ?
go ?
select ?* ?from ?tab1 ?
?
select ?* ?from ?tab1 ?where ?tab1.bid='19'union ?all ?select ?* ?from ?tab2 ? ?where ?tab2.bid='19' ?
?
?
斑竹加的話: ?
1、join ?產生的是笛卡爾積。 ?
2、union ?會排除重復的記錄 ?
3、union ?all ?不會排除重復的記錄??
?
?
union子句
union操作符將兩個查詢結果合并為一個結果集。為連接查詢合并兩個表時:列的數日和順序在查中必須一致;數據類型兼容
語法:
select
?語句
union
?
[
all
]
select
?語句
注意:
1
.union運算從最終結果集中刪除重復記錄,如想不刪除重復記錄使用all關鍵字
2
.第一個select語句中不能用order?by或compute子句,只能是最后一個select語名后用
例:查詢計算機系的學生式年齡不大于19歲的學習,按年齡倒排序
select
?
*
?
from
?department?
where
?dept
=
'
computer
'
;
union
;
?select?
*
?
from
?student?
where
?age
<=
19
order
?
by
?age?
desc
posted on 2007-03-16 17:04
有貓相伴的日子 閱讀(1176)
評論(0) 編輯 收藏 所屬分類:
pl/sql