SQL Server连接(内连接、外连接、交叉连接)

SQL Server连接(内连接、外连接、交叉连接)

连接查询概念:根据两个表或多个表的列之间的关系,从这些表中查询数据。

笛卡尔积:返回的是两表的乘积。

首先,新建表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
--表结构
/*
Student(ID,Name,Age,Sex) 学生表
Course(ID,Name,TeacherID) 课程表
Score(StudentID,CourseID,Score) 成绩表
Teacher(ID,Name) 教师表
*/

CREATE TABLE [Student] (
[ID] INTEGER NOT NULL PRIMARY KEY identity(1,1),
[Name] NVARCHAR(20),
[Age] INT,
[Sex] INT);

CREATE TABLE [Course] (
[ID] INTEGER NOT NULL PRIMARY KEY identity(1,1),
[Name] NVARCHAR(20),
[TeacherID] INT);

CREATE TABLE [Score] (
[Score] DOUBLE PRECISION,
[StudentID] INT,
[CourseID] INT);

CREATE TABLE [Teacher] (
[ID] INTEGER NOT NULL PRIMARY KEY identity(1,1),
[Name] NVARCHAR(20))

内连接

注:INNER可省略

典型的联接运算,使用像 = 或 <> 之类的比较运算符。

显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

示例:

1
SELECT * FROM [Student] INNER JOIN Score ON Student.ID= Score.StudentID

QQ截图20190315094830.png

隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。

1
SELECT * FROM [Student],Score WHERE Student.ID= Score.StudentID

交叉连接

** 隐式交叉连接,没有CROSS JOIN**

1
SELECT * FROM [Student],Score WHERE Student.ID= Score.StudentID

** 显式交叉连接,使用CROSS JOIN**

1
SELECT * FROM [Student] CROSS JOIN Score WHERE Student.ID= Score.StudentID

以上两条sql 执行结果是相同的。

外连接

左连接

语法:LEFT JOIN 或 LEFT OUTER JOIN

1
SELECT * FROM [Student] LEFT OUTER JOIN Score ON Student.ID= Score.StudentID

左连接显示左表全部行,右表如果匹配,则显示;不匹配,显示Null。

QQ截图20190315095311.png

右连接

语法:RIGHT JOIN 或 RIGHT OUTER JOIN

1
SELECT * FROM [Student] right OUTER JOIN Score ON Student.ID= Score.StudentID

右连接显示右表全部行,左表如果匹配,则显示;不匹配,显示Null。

QQ截图20190315095859.png

全连接

语法:FULL JOIN 或 FULL OUTER JOIN

1
SELECT * FROM [Student]  full JOIN Score ON Student.ID= Score.StudentID

QQ截图20190315100307.png

返回左表和右表中的所有行

参考:

详解SQL Server连接(内连接、外连接、交叉连接)

深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接