SQLite Join

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

下一節(jié):sqlite unions 子句

sqlite教程

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频