前期准备
此表为“course_score”表,表中的数据如下图所示:
此表为“student”表,表中的数据如下图所示:
1.使用场景
JOIN ON 用于将两张或多张表中的记录组合在一起,基于它们之间的一个或多个共同字段。
2.连接的分类
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录
2.1. 三种连接区别的详解
2.1.1. INNER JOIN(内连接,或等值连接)
**相当于两张表中满足某条件在两个表中共有的部分,即:取两个表匹配对应上的交集部分**,
两张表的关系如下图所示:
2.1.2. LEFT JOIN(左连接)
以左边表为主,在查询时左边的表即使没有对应匹配上也会显示出来,但是右边表没有匹配上的部分就不会显示出来
两张表的关系如下图所示:
2.1.2. RIGHT JOIN(右连接)
以右边表为主,在查询时右边的表即使没有对应匹配上也会显示出来,但是左边表没有匹配上的部分就不会显示出来
两张表的关系如下图所示:
2.2. INNER JOIN(内连接,或等值连接)
2.2.1. 语法
SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
注释:
-
column1
,column2
, ... 是你要选择的列的名称,如果使用*
表示选择所有列。 -
table1
,table2
是要连接的两个表的名称。 -
table1.column_name = table2.column_name
是连接条件,指定了两个表中用于匹配的列
2.2.2. SQL语句——例子(简单两张表)
#inner join
#查询student表的学生在course_score表中有成绩的所有学生的学号、课程编号、学生姓名、分数
select id,course_id,name,score from student INNER JOIN course_score ON stu_id=id
#上面的语句和相当于where语句的如下SQL
select id,course_id,name,score from student,course_score where stu_id=id
2.2.3. 执行结果
2.3. LEFT JOIN(左连接)
2.3.1. 语法
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
2.3.2.SQL语句——例子
#left join
#以左边表为主,在查询时左边的表即使没有对应匹配上也会显示出来
#查询出所有学生的学号、课程编号、学生姓名、分数信息
select id,course_id,name,score from student LEFT JOIN course_score ON stu_id=id
2.3.3. 执行结果
2.3. RIGHT JOIN(右连接)
2.3.1. 语法
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
2.3.2. SQL语句——例子
#RIGHT JOIN
#以右边表为主,在查询时右边的表即使没有对应匹配上也会显示出来
#查询出所有有成绩的学生的学号、课程编号、学生姓名、分数信息
select id,course_id,name,score from student RIGHT JOIN course_score ON stu_id=id
2.3.3. 执行结果
注意点:
连接的两张表至少有一个列应该时关联的;(如:演示的student表中的id和course_score表中的stu_id是有关联的)
所谓的左连表和右连表是没有特定规定的,就是在左连SQL语句放在前面的这张表就是左连表,即为左连时显示的主表;右连是以SQL语句中后面的表作为右连表,即显示的主表;
-
因为现在只有两张表,所以只给大家演示两张表的查询,如果存在多张表需要联合查询可以用如下的语法进行查询;(假如有A,B,C,D四张表)
#INNER JOIN多表联查 SELECT A.columnA, B.columnB, C.columnC,D.columnD FROM A INNER JOIN B ON A.column_id2 = B.column_id1 INNER JOIN C ON A.column_id3 = C.column_id2 INNER JOIN D ON C.column_id 1= D.column_id2;
#LEFT JOIN多表联查 SELECT A.columnA, B.columnB, C.columnC,D.columnD FROM A LEFT JOIN B ON A.column_id2 = B.column_id1 LEFT JOIN C ON A.column_id3 = C.column_id2 LEFT JOIN D ON C.column_id 1= D.column_id2;
#RIGHT JOIN多表联查 SELECT A.columnA, B.columnB, C.columnC,D.columnD FROM A RIGHT JOIN B ON A.column_id2 = B.column_id1 RIGHT JOIN C ON A.column_id3 = C.column_id2 RIGHT JOIN D ON C.column_id 1= D.column_id2;
4.连接还可以和where子句一起使用,使用语法如下(以inner join为例子);
#INNER JOIN多表联查 SELECT A.columnA, B.columnB FROM A INNER JOIN B ON A.column_id2 = B.column_id1 where A.columnA1='XX'