SQL 连接详解:内连接、左连接、右连接和全连接
SQL 连接详解:内连接、左连接、右连接和全连接
SQL连接语句是数据库查询中非常重要的概念,它允许我们根据两个或多个表之间的公共字段组合数据。本文将详细介绍四种主要的连接类型:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN),并通过具体的语法和示例帮助读者理解它们的使用场景和效果。
考虑以下两个表格:
Student
StudentCourse
A. 内连接(INNER JOIN)
内连接是最简单的连接方式,它将从两个表中选择所有满足条件的行。具体来说,内连接将通过合并两个表中满足条件的所有行来创建结果集,即公共字段的值将是相同的。
语法:
SELECT table1.column1,table1.column2,table2.column1,....
FROM table1
INNER JOIN table2
ON table1.matching_column = table2.matching_column;
table1: 第一个表.
table2: 第二个表
matching_column: 两个表共用的列.
注意:我们也可以用JOIN来代替INNER JOIN。JOIN与INNER JOIN相同。
示例查询(内连接)
这个查询将显示注册不同课程的学生的姓名和年龄。
SELECT StudentCourse.COURSE_ID, Student.NAME, Student.AGE FROM Student
INNER JOIN StudentCourse
ON Student.ROLL_NO = StudentCourse.ROLL_NO;
B. 左连接(LEFT JOIN)
左连接返回联接左侧表的所有行,并匹配联接右侧表的行。对于右边没有匹配行的行,结果集将包含null。左连接也称为左外连接。
语法:
SELECT table1.column1,table1.column2,table2.column1,....
FROM table1
LEFT JOIN table2
ON table1.matching_column = table2.matching_column;
table1: 第一个表.
table2: 第二个表
matching_column: 两个表共用的列.
注意:我们也可以使用LEFT OUTER JOIN来代替LEFT JOIN,两者是相同的。
示例查询(LEFT JOIN)
SELECT Student.NAME,StudentCourse.COURSE_ID
FROM Student
LEFT JOIN StudentCourse
ON StudentCourse.ROLL_NO = Student.ROLL_NO;
C. 右连接(RIGHT JOIN)
右连接类似于左连接。这个联接返回联接右侧表的所有行,并返回联接左侧表的匹配行。对于左侧没有匹配行的行,结果集将包含null。右连接也称为右外连接。
语法:
SELECT table1.column1,table1.column2,table2.column1,....
FROM table1
RIGHT JOIN table2
ON table1.matching_column = table2.matching_column;
table1: 第一个表.
table2: 第二个表
matching_column: 两个表共用的列.
注意:我们也可以使用RIGHT OUTER JOIN来代替RIGHT JOIN,两者是相同的。
示例查询(RIGHT JOIN)
SELECT Student.NAME,StudentCourse.COURSE_ID
FROM Student
RIGHT JOIN StudentCourse
ON StudentCourse.ROLL_NO = Student.ROLL_NO;
D. 全连接(FULL JOIN)
全连接通过组合LEFT JOIN和RIGHT JOIN的结果来创建结果集。结果集将包含来自两个表的所有行。对于没有匹配的行,结果集将包含NULL values。
语法:
SELECT table1.column1,table1.column2,table2.column1,....
FROM table1
FULL JOIN table2
ON table1.matching_column = table2.matching_column;
table1: 第一个表.
table2: 第二个表
matching_column: 两个表共用的列.
示例查询(全部加入)
SELECT Student.NAME,StudentCourse.COURSE_ID
FROM Student
FULL JOIN StudentCourse
ON StudentCourse.ROLL_NO = Student.ROLL_NO;
输出:
NAME COURSE_ID
HARSH 1
PRATIK 2
RIYANKA 2
DEEP 3
SAPTARHI 1
DHANRAJ NULL
ROHIT NULL
NIRAJ NULL
NULL 4
NULL 5
NULL 4