类似于INNER JOIN
子句,LEFT JOIN
子句是SELECT语句的可选子句。可以使用LEFT JOIN
子句来查询来自多个相关表的数据。
假设有两个表:A
和B
A
表有m
和f
字段。B
表有n
和f
字段。要使用LEFT JOIN
子句执行A
和B
之间的连接,请使用以下语句:
SELECT m, n FROM A LEFT JOIN B ON A.f = B.f WHERE search_condition;
表达式A.f = B.f
是条件表达式。 除了等于(=
)运算符之外,还可以使用大于(>
),小于(<
)等的其他比较运算符。
该语句返回一个结果集,其中包含:
A
表中的行(左表)在B
表中具有相应的行。A
表中的行存在,但在B
表中不存的行使用NULL
值填充。换句话说,A
表中的所有行都包含在结果集中,无论B
表中是否有匹配的行,如果B
表中不匹配则使用NULL
值填充。
如果语句中有WHERE
子句,那么在LEFT JOIN
子句的匹配完成之后,WHERE
子句中的search_condition
将被应用。
请参考A
表和B
表之间的LEFT JOIN
子句,如下图所示 -
A
表中的所有行都包含在结果集中。
因为第二行(a2,2)在B
表中没有相应的行,所以LEFT JOIN
子句创建一个填充有NULL
值的假行。
以下图说明了LEFT JOIN
子句,黄色部分为最终查询结果集 -
假设有两个表:class
和 student
,分别表示班级和学生。其数据如下 -
sqlite> select id,class_name,student_id from class; 1|网络工程-001班|1 2|网络工程-002班|2 3|网络工程-003班|3 4|网络工程-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>
现在使用 left join
查询每个学生所在的班级信息 -
select name,age,address,fees,class_name from student left join class on student.id=class.student_id where student.id > 0;
执行上面语句,得到以下结果 -
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|网络工程-001班 2|Minsu|25|Beijing|15000.0|网络工程-002班 3|Avgsu|23|Shanghai|2000.0|网络工程-003班 4|Linsu|25|Guangzhou|65000.0|网络工程-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>