Skip to content

SQL INNER JOIN

SQL INNER JOIN 是最常用的连接类型,它返回两个表中匹配的记录。只有当两个表中的连接条件都满足时,才会返回记录。

语法

sql
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

示例

假设我们有以下两个表:

students 表

idnameagegrade
1张三18高三
2李四17高二
3王五19高三
4赵六16高一
5钱七18高三

scores 表

idstudent_idsubjectscore
11数学90
21语文85
32数学95
42语文88
53数学80
66数学75
76语文82

示例 1:基本 INNER JOIN

查询所有有成绩的学生及其成绩:

sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;

结果:

idnamesubjectscore
1张三数学90
1张三语文85
2李四数学95
2李四语文88
3王五数学80

示例 2:使用表别名

为表指定别名,简化查询语句:

sql
SELECT s.id, s.name, sc.subject, sc.score
FROM students AS s
INNER JOIN scores AS sc ON s.id = sc.student_id;

结果与示例 1 相同。

示例 3:添加 WHERE 子句

查询数学成绩大于 85 的学生:

sql
SELECT s.id, s.name, sc.subject, sc.score
FROM students AS s
INNER JOIN scores AS sc ON s.id = sc.student_id
WHERE sc.subject = '数学' AND sc.score > 85;

结果:

idnamesubjectscore
1张三数学90
2李四数学95

示例 4:连接多个表

假设我们还有一个 classes 表:

idclass_nameteacher
1高三一班王老师
2高二一班李老师
3高一一班张老师

以及一个 student_class 表,用于关联学生和班级:

idstudent_idclass_id
111
222
331
443
551

查询学生的姓名、班级和数学成绩:

sql
SELECT s.name AS 学生姓名, c.class_name AS 班级, sc.score AS 数学成绩
FROM students AS s
INNER JOIN student_class AS scs ON s.id = scs.student_id
INNER JOIN classes AS c ON scs.class_id = c.id
INNER JOIN scores AS sc ON s.id = sc.student_id
WHERE sc.subject = '数学';

结果:

学生姓名班级数学成绩
张三高三一班90
李四高二一班95
王五高三一班80

注意事项

  1. 连接条件:INNER JOIN 必须指定连接条件,否则会产生笛卡尔积。

  2. 性能考虑:对于大型表,INNER JOIN 可能会影响查询性能。为了提高性能,应该确保连接的列上有索引。

  3. 等价语法:在某些 SQL 方言中,可以使用 JOIN 关键字而不使用 INNER JOIN,因为 INNER 是默认的连接类型。

  4. 多列连接:可以使用多个列作为连接条件,例如:

    sql
    INNER JOIN table2 ON table1.column1 = table2.column1 AND table1.column2 = table2.column2

小结

SQL INNER JOIN 是一种常用的连接类型,用于从两个或多个表中获取匹配的记录。它只返回满足连接条件的记录,是查询相关数据的基础工具。