Appearance
SQL INNER JOIN
SQL INNER JOIN 是最常用的连接类型,它返回两个表中匹配的记录。只有当两个表中的连接条件都满足时,才会返回记录。
语法
sql
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;示例
假设我们有以下两个表:
students 表
| id | name | age | grade |
|---|---|---|---|
| 1 | 张三 | 18 | 高三 |
| 2 | 李四 | 17 | 高二 |
| 3 | 王五 | 19 | 高三 |
| 4 | 赵六 | 16 | 高一 |
| 5 | 钱七 | 18 | 高三 |
scores 表
| id | student_id | subject | score |
|---|---|---|---|
| 1 | 1 | 数学 | 90 |
| 2 | 1 | 语文 | 85 |
| 3 | 2 | 数学 | 95 |
| 4 | 2 | 语文 | 88 |
| 5 | 3 | 数学 | 80 |
| 6 | 6 | 数学 | 75 |
| 7 | 6 | 语文 | 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;结果:
| id | name | subject | score |
|---|---|---|---|
| 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;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 2 | 李四 | 数学 | 95 |
示例 4:连接多个表
假设我们还有一个 classes 表:
| id | class_name | teacher |
|---|---|---|
| 1 | 高三一班 | 王老师 |
| 2 | 高二一班 | 李老师 |
| 3 | 高一一班 | 张老师 |
以及一个 student_class 表,用于关联学生和班级:
| id | student_id | class_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
| 4 | 4 | 3 |
| 5 | 5 | 1 |
查询学生的姓名、班级和数学成绩:
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 |
注意事项
连接条件:INNER JOIN 必须指定连接条件,否则会产生笛卡尔积。
性能考虑:对于大型表,INNER JOIN 可能会影响查询性能。为了提高性能,应该确保连接的列上有索引。
等价语法:在某些 SQL 方言中,可以使用
JOIN关键字而不使用INNER JOIN,因为INNER是默认的连接类型。多列连接:可以使用多个列作为连接条件,例如:
sqlINNER JOIN table2 ON table1.column1 = table2.column1 AND table1.column2 = table2.column2
小结
SQL INNER JOIN 是一种常用的连接类型,用于从两个或多个表中获取匹配的记录。它只返回满足连接条件的记录,是查询相关数据的基础工具。