SQL开发知识:sql中的left join及on、where条件关键字的区别详解

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语句进行筛选记录时会忽略没有匹配的记录。

数据库标签