sqlite join
sqlite 的 join 子句用于結(jié)合兩個(gè)或多個(gè)數(shù)據(jù)庫中表的記錄。join 是一種通過共同值來結(jié)合兩個(gè)表中字段的手段。
sql 定義了三種主要類型的連接:
- 交叉連接 - cross join
- 內(nèi)連接 - inner join
- 外連接 - outer join
在我們繼續(xù)之前,讓我們假設(shè)有兩個(gè)表 company 和 department。我們已經(jīng)看到了用來填充 company 表的 insert 語句。現(xiàn)在讓我們假設(shè) company 表的記錄列表如下:
id name age address salary ---------- ---------- ---------- ---------- ---------- 1 paul 32 california 20000.0 2 allen 25 texas 15000.0 3 teddy 23 norway 20000.0 4 mark 25 rich-mond 65000.0 5 david 27 texas 85000.0 6 kim 22 south-hall 45000.0 7 james 24 houston 10000.0
另一個(gè)表是 department,定義如下:
create table department( id int primary key not null, dept char(50) not null, emp_id int not null );
下面是填充 department 表的 insert 語句:
insert into department (id, dept, emp_id) values (1, 'it billing', 1 ); insert into department (id, dept, emp_id) values (2, 'engineering', 2 ); insert into department (id, dept, emp_id) values (3, 'finance', 7 );
最后,我們?cè)?department 表中有下列的記錄列表:
id dept emp_id ---------- ---------- ---------- 1 it billing 1 2 engineerin 2 3 finance 7
1. 交叉連接 - cross join
交叉連接(cross join)把第一個(gè)表的每一行與第二個(gè)表的每一行進(jìn)行匹配。如果兩個(gè)輸入表分別有 x 和 y 行,則結(jié)果表有 x*y 行。由于交叉連接(cross join)有可能產(chǎn)生非常大的表,使用時(shí)必須謹(jǐn)慎,只在適當(dāng)?shù)臅r(shí)候使用它們。
交叉連接的操作,它們都返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。
下面是交叉連接(cross join)的語法:
select ... from table1 cross join table2 ...
基于上面的表,我們可以寫一個(gè)交叉連接(cross join),如下所示:
sqlite> select emp_id, name, dept from company cross join department;
上面的查詢會(huì)產(chǎn)生以下結(jié)果:
emp_id name dept ---------- ---------- ---------- 1 paul it billing 2 paul engineerin 7 paul finance 1 allen it billing 2 allen engineerin 7 allen finance 1 teddy it billing 2 teddy engineerin 7 teddy finance 1 mark it billing 2 mark engineerin 7 mark finance 1 david it billing 2 david engineerin 7 david finance 1 kim it billing 2 kim engineerin 7 kim finance 1 james it billing 2 james engineerin 7 james finance
2. 內(nèi)連接 - inner join
內(nèi)連接(inner join)根據(jù)連接謂詞結(jié)合兩個(gè)表(table1 和 table2)的列值來創(chuàng)建一個(gè)新的結(jié)果表。查詢會(huì)把 table1 中的每一行與 table2 中的每一行進(jìn)行比較,找到所有滿足連接謂詞的行的匹配對(duì)。當(dāng)滿足連接謂詞時(shí),a 和 b 行的每個(gè)匹配對(duì)的列值會(huì)合并成一個(gè)結(jié)果行。
內(nèi)連接(inner join)是最常見的連接類型,是默認(rèn)的連接類型。inner 關(guān)鍵字是可選的。
下面是內(nèi)連接(inner join)的語法:
select ... from table1 [inner] join table2 on conditional_expression ...
為了避免冗余,并保持較短的措辭,可以使用 using 表達(dá)式聲明內(nèi)連接(inner join)條件。這個(gè)表達(dá)式指定一個(gè)或多個(gè)列的列表:
select ... from table1 join table2 using ( column1 ,... ) ...
自然連接(natural join)類似于 join...using,只是它會(huì)自動(dòng)測試存在兩個(gè)表中的每一列的值之間相等值:
select ... from table1 natural join table2...
基于上面的表,我們可以寫一個(gè)內(nèi)連接(inner join),如下所示:
sqlite> select emp_id, name, dept from company inner join department on company.id = department.emp_id;
上面的查詢會(huì)產(chǎn)生以下結(jié)果:
emp_id name dept ---------- ---------- ---------- 1 paul it billing 2 allen engineerin 7 james finance
3. 外連接 - outer join
外連接(outer join)是內(nèi)連接(inner join)的擴(kuò)展。雖然 sql 標(biāo)準(zhǔn)定義了三種類型的外連接:left、right、full,但 sqlite 只支持 左外連接(left outer join)。
外連接(outer join)聲明條件的方法與內(nèi)連接(inner join)是相同的,使用 on、using 或 natural 關(guān)鍵字來表達(dá)。最初的結(jié)果表以相同的方式進(jìn)行計(jì)算。一旦主連接計(jì)算完成,外連接(outer join)將從一個(gè)或兩個(gè)表中任何未連接的行合并進(jìn)來,外連接的列使用 null 值,將它們附加到結(jié)果表中。
下面是左外連接(left outer join)的語法:
select ... from table1 left outer join table2 on conditional_expression ...
為了避免冗余,并保持較短的措辭,可以使用 using 表達(dá)式聲明外連接(outer join)條件。這個(gè)表達(dá)式指定一個(gè)或多個(gè)列的列表:
select ... from table1 left outer join table2 using ( column1 ,... ) ...
基于上面的表,我們可以寫一個(gè)外連接(outer join),如下所示:
sqlite> select emp_id, name, dept from company left outer join department on company.id = department.emp_id;
上面的查詢會(huì)產(chǎn)生以下結(jié)果:
emp_id name dept ---------- ---------- ---------- 1 paul it billing 2 allen engineerin teddy mark david kim 7 james finance