sqlite join
sqlite 的 join 子句用于結(jié)合兩個或多個數(shù)據(jù)庫中表的記錄。join 是一種通過共同值來結(jié)合兩個表中字段的手段。
sql 定義了三種主要類型的連接:
- 交叉連接 - cross join
- 內(nèi)連接 - inner join
- 外連接 - outer join
在我們繼續(xù)之前,讓我們假設(shè)有兩個表 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
另一個表是 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 );
最后,我們在 department 表中有下列的記錄列表:
id dept emp_id ---------- ---------- ---------- 1 it billing 1 2 engineerin 2 3 finance 7
1. 交叉連接 - cross join
交叉連接(cross join)把第一個表的每一行與第二個表的每一行進行匹配。如果兩個輸入表分別有 x 和 y 行,則結(jié)果表有 x*y 行。由于交叉連接(cross join)有可能產(chǎn)生非常大的表,使用時必須謹慎,只在適當?shù)臅r候使用它們。
交叉連接的操作,它們都返回被連接的兩個表所有數(shù)據(jù)行的笛卡爾積,返回到的數(shù)據(jù)行數(shù)等于第一個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)。
下面是交叉連接(cross join)的語法:
select ... from table1 cross join table2 ...
基于上面的表,我們可以寫一個交叉連接(cross join),如下所示:
sqlite> select emp_id, name, dept from company cross join department;
上面的查詢會產(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é)合兩個表(table1 和 table2)的列值來創(chuàng)建一個新的結(jié)果表。查詢會把 table1 中的每一行與 table2 中的每一行進行比較,找到所有滿足連接謂詞的行的匹配對。當滿足連接謂詞時,a 和 b 行的每個匹配對的列值會合并成一個結(jié)果行。
內(nèi)連接(inner join)是最常見的連接類型,是默認的連接類型。inner 關(guān)鍵字是可選的。
下面是內(nèi)連接(inner join)的語法:
select ... from table1 [inner] join table2 on conditional_expression ...
為了避免冗余,并保持較短的措辭,可以使用 using 表達式聲明內(nèi)連接(inner join)條件。這個表達式指定一個或多個列的列表:
select ... from table1 join table2 using ( column1 ,... ) ...
自然連接(natural join)類似于 join...using,只是它會自動測試存在兩個表中的每一列的值之間相等值:
select ... from table1 natural join table2...
基于上面的表,我們可以寫一個內(nèi)連接(inner join),如下所示:
sqlite> select emp_id, name, dept from company inner join department on company.id = department.emp_id;
上面的查詢會產(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)的擴展。雖然 sql 標準定義了三種類型的外連接:left、right、full,但 sqlite 只支持 左外連接(left outer join)。
外連接(outer join)聲明條件的方法與內(nèi)連接(inner join)是相同的,使用 on、using 或 natural 關(guān)鍵字來表達。最初的結(jié)果表以相同的方式進行計算。一旦主連接計算完成,外連接(outer join)將從一個或兩個表中任何未連接的行合并進來,外連接的列使用 null 值,將它們附加到結(jié)果表中。
下面是左外連接(left outer join)的語法:
select ... from table1 left outer join table2 on conditional_expression ...
為了避免冗余,并保持較短的措辭,可以使用 using 表達式聲明外連接(outer join)條件。這個表達式指定一個或多個列的列表:
select ... from table1 left outer join table2 using ( column1 ,... ) ...
基于上面的表,我們可以寫一個外連接(outer join),如下所示:
sqlite> select emp_id, name, dept from company left outer join department on company.id = department.emp_id;
上面的查詢會產(chǎn)生以下結(jié)果:
emp_id name dept ---------- ---------- ---------- 1 paul it billing 2 allen engineerin teddy mark david kim 7 james finance