類似于INNER JOIN
子句,LEFT JOIN
子句是SELECT語(yǔ)句的可選子句??梢允褂?code>LEFT JOIN子句來(lái)查詢來(lái)自多個(gè)相關(guān)表的數(shù)據(jù)。
假設(shè)有兩個(gè)表:A
和B
A
表有m
和f
字段。B
表有n
和f
字段。要使用LEFT JOIN
子句執(zhí)行A
和B
之間的連接,請(qǐng)使用以下語(yǔ)句:
SELECT
m, n
FROM A
LEFT JOIN B ON A.f = B.f
WHERE search_condition;
表達(dá)式A.f = B.f
是條件表達(dá)式。 除了等于(=
)運(yùn)算符之外,還可以使用大于(>
),小于(<
)等的其他比較運(yùn)算符。
該語(yǔ)句返回一個(gè)結(jié)果集,其中包含:
A
表中的行(左表)在B
表中具有相應(yīng)的行。A
表中的行存在,但在B
表中不存的行使用NULL
值填充。換句話說(shuō),A
表中的所有行都包含在結(jié)果集中,無(wú)論B
表中是否有匹配的行,如果B
表中不匹配則使用NULL
值填充。
如果語(yǔ)句中有WHERE
子句,那么在LEFT JOIN
子句的匹配完成之后,WHERE
子句中的search_condition
將被應(yīng)用。
請(qǐng)參考A
表和B
表之間的LEFT JOIN
子句,如下圖所示 -
A
表中的所有行都包含在結(jié)果集中。
因?yàn)榈诙?a2,2)在B
表中沒(méi)有相應(yīng)的行,所以LEFT JOIN
子句創(chuàng)建一個(gè)填充有NULL
值的假行。
以下圖說(shuō)明了LEFT JOIN
子句,黃色部分為最終查詢結(jié)果集 -
假設(shè)有兩個(gè)表:class
和 student
,分別表示班級(jí)和學(xué)生。其數(shù)據(jù)如下 -
sqlite> select id,class_name,student_id from class;
1|網(wǎng)絡(luò)工程-001班|1
2|網(wǎng)絡(luò)工程-002班|2
3|網(wǎng)絡(luò)工程-003班|3
4|網(wǎng)絡(luò)工程-004班|4
sqlite>
sqlite> select id,name,age,address,fees from student;
1|Maxsu|27|Shengzhen|20000.0
2|Minsu|25|Beijing|15000.0
3|Avgsu|23|Shanghai|2000.0
4|Linsu|25|Guangzhou|65000.0
5|Sqlsu|26|Haikou|25000.0
6|Javasu|21|Shengzhen|18000.0
7|Linsu|27|Haikou|10000.0
8|Minsu|23|Guangzhou|5000.0
9|Maxsu|23|Shenzhen|9000.0
sqlite>
現(xiàn)在使用 left join
查詢每個(gè)學(xué)生所在的班級(jí)信息 -
select name,age,address,fees,class_name from student left join class on student.id=class.student_id where student.id > 0;
執(zhí)行上面語(yǔ)句,得到以下結(jié)果 -
sqlite> select student.id,name,age,address,fees,class_name from student left join class on student.id=class.student_id where student.id > 0;
1|Maxsu|27|Shengzhen|20000.0|網(wǎng)絡(luò)工程-001班
2|Minsu|25|Beijing|15000.0|網(wǎng)絡(luò)工程-002班
3|Avgsu|23|Shanghai|2000.0|網(wǎng)絡(luò)工程-003班
4|Linsu|25|Guangzhou|65000.0|網(wǎng)絡(luò)工程-004班
5|Sqlsu|26|Haikou|25000.0|
6|Javasu|21|Shengzhen|18000.0|
7|Linsu|27|Haikou|10000.0|
8|Minsu|23|Guangzhou|5000.0|
9|Maxsu|23|Shenzhen|9000.0|
sqlite>