create table department( id number primary key, name varchar2(30)); create table employee( id number primary key, name varchar2(30) not null, salary number(6,2), title varchar2(30), manager number, deptid number); insert into department values(1,'人力資源'); insert into department values(2,'開發中心'); insert into department values(3,'總裁室'); insert into employee values(4,'趙六',9000,'項目經理',null,2); insert into employee values(3,'王五',7000,'項目組長',4,2); insert into employee values(1,'張三',6000,'程序員',3,2); insert into employee values(2,'李四',7000,'HR',4,1);
不同的 SQL JOIN
??? * JOIN: 如果表中有至少一個匹配,則返回行
??? * LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
??? * RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
??? * FULL JOIN: 只要其中一個表中存在匹配,就返回行
INNER JOIN 關鍵字在表中存在至少一個匹配時返回行。如果 "employee" 中的行在 "department" 中沒有匹配,就不會列出這些行。
LEFT JOIN 關鍵字會從左表 (employee) 那里返回所有的行,即使在右表 (department) 中沒有匹配的行。
RIGHT JOIN 關鍵字會從右表 (department) 那里返回所有的行,即使在左表 (employee) 中沒有匹配的行。
FULL JOIN 關鍵字會從左表 (employee) 和右表 (department) 那里返回所有的行。如果 "employee" 中的行在表 "department" 中沒有匹配,或者如果 "department" 中的行在表 "employee" 中沒有匹配,這些行同樣會列出。
注釋:INNER JOIN 與 JOIN 是相同的。
注釋:在某些數據庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。
注釋:在某些數據庫中, RIGHT JOIN 稱為 RIGHT OUTER JOIN。
注釋:在某些數據庫中, FULL JOIN 稱為 FULL OUTER JOIN。
內連接:是最常用的鏈接,也叫等值鏈接
不管限制條件在on中還是在where中,內連接都得到笛卡爾積中滿足所有條件的記錄。對于inner join, on和where的效果是一樣的。
1)當沒有限制條件,此時為笛卡爾積:
select * from employee , department ; select * from employee inner join department on 1=1;
得到的效果是一樣的.

2)此時如果加上where限制條件,則對上面笛卡爾積的每一條記錄看它是否滿足限制條件,如果滿足,則它在結果集中。
select * from employee emp , department dept where emp.deptid= dept.id; select * from employee emp inner join department dept on emp.deptid= dept.id;

外連接
? 則分為"左外連接(左連接)","右外連接(右連接)"兩種情況: left join / right join
交叉連接(完全連接)cross join 不帶 where 條件的
左連接(left join):
1)當沒加限制條件時,得到笛卡爾積,同內連接沒加限制條件一樣
?
select * from employee left join department on 1=1;
2)當添加特定條件時:
? oracle數據庫中可以用(+)來實現,?
select * from employee emp , department dept where emp.deptid= dept.id(+);
即“(+)”所在位置的另一側為連接的方向,左連接說明等號左側的所有記錄均會被顯示,無論其在右側是否得到匹配;
等同于:
select * from employee emp left join department dept on emp.deptid= dept.id;

右連接:
? oracle數據庫中可以用(+)來實現,?
select * from employee emp , department dept where emp.deptid(+)= dept.id;
即“(+)”所在位置的另一側為連接的方向,右連接說明等號右側的所有記錄均會被顯示,無論其在左側是否得到匹配;
等同于:
select * from employee emp right join department dept on emp.deptid= dept.id;

全連接:會從左表 (employee) 和右表 (department) 那里返回所有的行。如果 "employee" 中的行在表 "department" 中沒有匹配,或者如果 "department" 中的行在表 "employee" 中沒有匹配,這些行同樣會列出
?
連接分為三種:內連接、外連接、交叉連接??
?
1、等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。
2、不等連接: 在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接(僅僅是一種特的等值連接):在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
??????
外連接:??
分為三種:左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種??
?
交叉連接(CROSS JOIN)???
沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積?
先返回 左表所有行,左表行在與右表行一一組合,等于兩個表相乘
select * from employee emp cross join department dept

如果需要加條件,則使用where
select * from employee emp cross join department dept where emp.deptid= dept.id; --等同于 select * from employee emp inner join department dept on emp.deptid= dept.id;

兩個主要的連接類型是內連 接和外連 接。到目前為止,所有示例中使用的都是內連 接。內連 接只保留交叉積中滿足連接條件的那些行。如果某行在一個表中存在,但在另一個表中不存在,則結果表中不包括該信息。
外連 接是內連 接和左表和/或右表中未包括內連 接中的那些行的并置。當對兩個表執行外連 接時,可任意將一個表指定為左表而將另一個表指定為右表。外連 接有三種類型:
左外連 接包括內連 接和左表中未包括在內連 接中的那些行。
右外連 接包括內連 接和右表中未包括在內連 接中的那些行。
全外連 接包括內連 接以及左表和右表中未包括在內連 接中的行。
內連 接一般是檢索兩個表里連接字段都存在的數據。
左連接的意思是,查詢左(語句前面)表里的所有內容,無論右邊表里有沒有。右邊表里沒有的內容用NULL代替。
右連接和左連接相反。
數據表的連接有:
1、內連 接(自然連接): 只有兩個表相匹配的行才能在結果集中出現
2、外連 接: 包括
(1)左外連 接(左邊的表不加限制)
(2)右外連 接(右邊的表不加限制)
(3)全外連 接(左右兩表都不加限制)
3、自連接(連接發生在一張基表內)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
