1樓:千鋒教育
使用join連表,缺陷的情況下是inner join,開發中使用的left join和right join屬於outer join,outer join還包括full join
現有兩張表,table a 是左邊的表。table b 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的:
1.inner join 產生的結果是ab的交集
select * from tablea inner join tableb on tablea.name = tableb.name
2.left [outer] join 產生表a的完全集,而b表中匹配的則有值,沒有匹配的則以null值取代。
select * from tablea left outer join tableb on tablea.name = tableb.name
3.right [outer] join 產生表b的完全集,而a表中匹配的則有值,沒有匹配的則以null值取代。
select * from tablea right outer join tableb on tablea.name = tableb.name
圖示如left join類似。
4.full [outer] join 產生a和b的並集。對於沒有匹配的記錄,則會以null做為值。
select * from tablea full outer join tableb on tablea.name = tableb.name
可以通過is null將沒有匹配的值找出來:
select * from tablea full outer join tableb on tablea.name = tableb.name
where tablea.id is null or tableb.id is null
5. cross join 把表a和表b的資料進行一個n*m的組合,即笛卡爾積。如本例會產生4*4=16條記錄,在開發過程中我們肯定是要過濾資料,所以這種很少用。
select * from tablea cross join tableb
2樓:匿名使用者
沒區別。
1、inner join可以簡寫成join2、left outer join 可以簡寫為left join3、right outer join 可以簡寫為rightjoin4、full outer join 可以簡寫為full join
sql中的inner join和join有什麼區別
3樓:
沒有區別
inner join等價於 join
你可以理解為 join 是 inner join 的縮寫。
leftjoin 等價於 leftouter joinrightjoin 等價於 rightouter join
4樓:匿名使用者
一樣的。
inner join 內連線
內連線就是關聯的兩張或多張表中,根據關聯條件,顯示所有匹配的記錄,匹配不上的,不顯示。
以下兩種是標準寫法:
sql> select ename,sal2 from emp2 e inner join dept2 d3 on e.deptno=d.deptno;
--也可以省略inner關鍵字,直接寫joinsql> select ename,sal2 from emp2 e join dept2 d3 on e.deptno=d.deptno;
--如果兩張表的關聯欄位名相同,也可以使用using子句。
sql> select ename,sal2 from emp2 e join dept2 d3 using(deptno);
--oracle的寫法
sql> select ename,sal2 from emp2 e,dept2 d3 where e.deptno=d.deptno;
5樓:千鋒教育
123456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
4344
4546
4748
4950
5152
5354
5556
5758
5960
6162
6364
6566
6768
6970
7172
7374
7576
7778
7980
8182
8384
8586
8788
8990
9192
9394
9596
9798
99100
101102
103104
105table a
aid adate
1 a1
2 a2
3 a3
tableb
bid bdate
1 b1
2 b2
4 b4
兩個表a,b相連線,要取出id相同的欄位
select * from a inner join b on a.aid = b.bid這是僅取出匹配的資料.
此時的取出的是:
1 a1 b1
2 a2 b2
那麼left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有資料,然後再加上與a,b匹配的的資料
此時的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字元
同樣的也有right join
指的是首先取出b表中所有資料,然後再加上與a,b匹配的的資料
此時的取出的是:
1 a1 b1
2 a2 b2
4 空字元 b4
left join 或 left outer join。
左向外聯接的結果集包括 left outer 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值
二. left join/right join/inner join操作演示
表a記錄如下:
aid anum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表b記錄如下:
bid bname
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
實驗如下:
1. left join
sql語句如下:
select * from a
left join b
on a.aid = b.bid
結果如下:
aid anum bid bname
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 null null
(所影響的行數為 5 行)
結果說明:
left join是以a表的記錄為基礎的,a可以看成左表,b可以看成右表,left join是以左表為準的.
換句話說,左表(a)的記錄將會全部表示出來,而右表(b)只會顯示符合搜尋條件的記錄(例子中為: a.aid = b.bid).
b表記錄不足的地方均為null.
2. right join
sql語句如下:
select * from a
right join b
on a.aid = b.bid
結果如下:
aid anum bid bname
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
null null 8 2006032408
(所影響的行數為 5 行)
結果說明:
仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(b)為基礎的,a表不足的地方用null填充.
3.inner join
sql語句如下:
select * from a
innerjoin b
on a.aid = b.bid
結果如下:
aid anum bid bname
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
結果說明:
很明顯,這裡只顯示出了 a.aid = b.bid的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄.
sql中varchar和nvarchar有什麼區別
墨汁諾 sql中varchar和nvarchar區別 輸入不同,含義不同。一 輸入不同 varchar 4 可以輸入4個字線,也可以輸入兩個漢字。nvarchar 4 可以輸四個漢字,也可以輸4個字母,但最多四個。二 含義不同 varchar n 長度為n個位元組的可變長度且非unicode的字元資...
SQL中char和varvhar的區別
char 資料型別的列存放固定個數的非unicode字元。varchar資料型別的列存放不固定個數的非unicode字元。固定,就是說如果定義的是5個字元,那麼就分配不個字元,如果你的值是 ab 也分配5個字元,不足的位數補足空格或其他字元 ab 後面不足了3個空格 不固定,就是可變,就是實際多少個...
SQL查詢中in和exists的區別分析
在用in的子查詢中只能返回一列值,比如 where 成績 in select 成績,學號 from 成績表 這種用法是不允許的。exists是一個函式,是根據子查詢有無記錄返回判斷條件的成立,如果子查詢有記錄返回,那麼條件成立,否則不成立,所以子查詢中給出列名無意義的,因此子查詢通常用 返回所有列。...