1. left join的概念
在SQL中,左连接(left join)是一种基本连接类型。它返回左表中的所有记录以及右表中与左表中记录匹配的记录。如果右表中没有匹配的记录,则返回NULL。
例如,我们有两个表格students和scores,它们的结构如下:
students表格:
id name age
1 Tom 20
2 Jack 19
3 Lucy 20
scores表格:
sid score
1 95
1 98
2 88
我们可以使用left join查询students表格和scores表格中的记录,查询结果如下:
SELECT students.id, students.name, scores.score
FROM students
LEFT JOIN scores
ON students.id = scores.sid;
结果:
id name score
1 Tom 95
1 Tom 98
2 Jack 88
3 Lucy NULL
通过LEFT JOIN,我们可以看到students表格中所有的记录,同时如果scores表格中有匹配的记录,则将score列返回。如果scores表格中没有匹配的记录,则返回NULL。
2. on和where的区别
在上面的例子中,我们使用了ON students.id = scores.sid
。实际上,我们也可以使用WHERE语句来筛选匹配的记录。例如:
SELECT students.id, students.name, scores.score
FROM students, scores
WHERE students.id = scores.sid;
结果:
id name score
1 Tom 95
1 Tom 98
2 Jack 88
但是,这种方法并不是最优的。使用WHERE语句作为连接条件,SQL会首先生成一个笛卡尔积,然后再筛选出匹配的记录。如果两个表格较大,这将会非常低效。因此,我们应当优先使用ON语句。
此外,ON语句还有一个非常重要的功能:连接条件。连接条件指定了如何在两个表格之间进行匹配。在我们的例子中,我们使用了ON students.id = scores.sid
将students表格和scores表格中的记录匹配。如果我们没有指定连接条件,LEFT JOIN将返回两个表格中的所有记录的笛卡尔积。
3. where条件和on条件的区别
虽然WHERE语句和ON语句都可以用来过滤记录,但它们之间还有一些重要的区别。
3.1 where条件
WHERE语句用于过滤查询结果中的记录。它在查询结果生成后对记录进行筛选。例如:
SELECT * FROM students
WHERE age > 19;
结果:
id name age
1 Tom 20
3 Lucy 20
通过WHERE语句,我们从students表格中筛选出年龄大于19岁的学生记录。
3.2 on条件
ON语句用于连接两个表格并进行匹配。它在连接过程中对记录进行筛选。例如:
SELECT students.id, students.name, scores.score
FROM students
LEFT JOIN scores
ON students.id = scores.sid
AND scores.score >= 90;
结果:
id name score
1 Tom 95
1 Tom 98
通过ON语句,我们连接了students表格和scores表格,并筛选出了score大于等于90的记录。
值得注意的是,在LEFT JOIN中,如果我们使用WHERE语句来筛选记录,则会忽略没有匹配的记录。例如:
SELECT students.id, students.name, scores.score
FROM students
LEFT JOIN scores
ON students.id = scores.sid
WHERE scores.score >=90;
结果:
id name score
1 Tom 95
1 Tom 98
与使用ON语句不同,使用WHERE语句筛选记录时,如果scores表格中没有匹配的记录,则不会返回NULL。
4. 总结
在SQL中,LEFT JOIN是连接两个表格并返回左表中的所有记录的基本连接类型。使用ON语句进行连接和匹配记录,比使用WHERE语句进行筛选记录更加高效。WHERE语句用于在查询生成后对记录进行筛选,而ON语句用于连接过程中对记录进行筛选。在LEFT JOIN中,使用WHERE语句进行筛选记录时会忽略没有匹配的记录。