在实际应用中,我们常常需要查询多个表的数据并且将它们联系起来,这就是多表连接查询(Multi-Table Join Query)。
在进行多表连接查询之前,我们需要了解几种连接类型:
本文主要介绍 INNER JOIN 和 LEFT JOIN 的使用方法。
INNER JOIN 可以使用 ON 关键字或者 USING 关键字。在 ON 中,我们需要指定相互匹配的列,而在 USING 中,我们只需要指定相同的列名即可。
例如我们有两个表 students 和 courses,它们的结构如下:
[students] table:
id name age class_id
-- ---- --- -------
1 Tom 18 1
2 Lucy 17 1
3 Jack 19 2
4 Mary 18 2
[courses] table:
id course_name score student_id
-- ----------- ----- ----------
1 Math 90 1
2 English 88 1
3 Math 85 2
4 English 92 2
5 Chinese 95 3
6 Math 89 3
7 English 92 4
我们想要查询每个学生的名字和成绩,可以使用 INNER JOIN:
SELECT students.name, courses.score FROM students
INNER JOIN courses ON students.id = courses.student_id;
上述 SQL 语句中,我们使用 ON 关键字来指定 students.id 和 courses.student_id 相互匹配。
结果如下:
name score
---- -----
Tom 90
Tom 88
Lucy 85
Lucy 92
Jack 95
Jack 89
Mary 92
LEFT JOIN 返回所有左表和右表匹配的行,但是对于右表中没有匹配到的行,返回空值。
例如我们有两个表 students 和 classes,我们想要查询每个学生所在的班级名称和人数,可以使用 LEFT JOIN:
[classes] table:
id class_name student_num
-- ---------- -----------
1 Class 1 30
2 Class 2 40
SELECT students.name, classes.class_name, classes.student_num FROM students
LEFT JOIN classes ON students.class_id = classes.id;
上述 SQL 语句中,我们使用 LEFT JOIN 来连接两个表,并且使用 students.class_id 和 classes.id 来指定匹配列。
结果如下:
name class_name student_num
---- --------- -----------
Tom Class 1 30
Lucy Class 1 30
Jack Class 2 40
Mary Class 2 40
对于结果中没有匹配到的 Lucy,我们可以看到类别的信息和人数都是 NULL。
假设我们有三个表:A、B、C。
A 表包含着 id、name、age 三个列,B 表包含着 id、phone、email 三个列,C 表包含着 aid、bid、description 三个列。现在要求查询出每个人名下的联系方式和其它信息。
我们可以使用下面的 SQL 语句:
SELECT A.name, B.phone, B.email, C.description
FROM A
JOIN C ON A.id = C.aid
JOIN B ON B.id = C.bid;
上述 SQL 语句中,我们首先使用 A 表和 C 表的 id 列进行内连接匹配,然后再使用上一步中得到的结果和表 B 中的 id 列进行内连接匹配。最终获得每个人的名字、号码、邮箱和描述等信息。
再假设我们现在要查询各个课程的成绩情况,包括课程名称、学生姓名以及成绩。
我们可以使用下面的 SQL 语句:
SELECT C.course_name, S.name, C.score
FROM students S
JOIN courses C ON S.id = C.student_id;
上述 SQL 语句中,我们首先使用 students 和 courses 表中的 id 列进行内连接匹配,然后取出每个科目、每个学生和其对应的成绩。
本文主要介绍了 INNER JOIN 和 LEFT JOIN 两种连接类型,以及它们的使用方法。我们还通过两个实际的示例说明了多表连接查询的具体实现方法,希望对大家学习多表连接查询技术有所帮助。
本文链接:http://task.lmcjl.com/news/3411.html