SQL JOIN
前面我们一直学习的是单表上的查询、更新、删除等操作,但是往往需要操作的数据并非都在同一张表上,因此有很多需求都要涉及到多表的连接查询,也叫跨表查询。此时便需要将多张表进行连接,方便我们对其中的数据进行操作,这就是 JOIN 语句的作用。
JOIN 用于把来自两个或多个表的行结合起来。
示例表除了之前的学生数据students表之外,还需要再创建两个表,分别是学生分数score表(3个字段,共六千条数据),以及课程数据subject表(2个字段,共9条数据),两个表的sql文件已绑定。
首先,观察一下这三张表,我们发现students表与score表具有共同字段 id 字段(学生id),score表与subject表具有相同字段 subject_id 字段(课程id),这也是关联三三张表的前提条件。
INNER JOIN
INNER JOIN 用于关联两个表,ON 关键字后指定两个表共有的字段,表的每一行数据的该字段值与另一张表的每行数据该字段值匹配,字段值相同,两个表该数据行进行合并返回结果,两表中匹配不上的数据行则不返回结果。
语法:
SELECT column
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
columns:要显示的列名。
table1:表1的名称。
table2:表2的名称。
column_name:表中用于连接的列名。
table1.column_name:表示table1表的column_name字段。
例如:
将学生成绩表与课程数据表进行关联,显示每个学生的各科成绩:
SELECT *
FROM score
INNER JOIN subject
ON score.subject_id = subject.subject_id;
从结果中能看到,两张表匹配成功的数据行拼接到一起,所有同时有两个 subject_id 字段。如果不想显示所有字段,只需要在SELECT语句后指定要显示的字段即可,但是需要注意的是只显示一个匹配字段,也需要使用 table1.column_name 的形式 ,否则就会报错。如下:
SELECT id,subject_id
FROM score
INNER JOIN subject
ON score.subject_id = subject.subject_id;
报错信息 Column ‘subject_id’ in field list is ambiguous 意思为 字段列表中的列’subject_id’是不明确的,也就是说系统不知道你是要查询哪张表的subject_id字段。
正确写法:
SELECT id,score.subject_id,subject_name,score
FROM score
INNER JOIN subject
ON score.subject_id = subject.subject_id;
强调两张表共有的字段要使用 table1.column_name 的形式,其他字段不需要
强调两张表共有的字段要使用 table1.column_name 的形式,其他字段不需要
强调两张表共有的字段要使用 table1.column_name 的形式,其他字段不需要
同样的,两表关联后也可以进行WHERE条件查询,例如:
关联学生成绩表与课程数据表,只查询语文科目的学生成绩:
SELECT id,score.subject_id,subject_name,score
FROM score
INNER JOIN subject
ON score.subject_id = subject.subject_id
WHERE subject_name = '语文';