1. 简介
连接操作是在多张表中根据一定的条件将不同表中的数据联系在一起,实现数据间的逻辑关系。在SQL Server中,连接操作是使用join关键字实现的。
2. 内连接(equi-join)
2.1 概述
内连接是指将两张表中满足特定条件的行相连接,得到符合条件的结果。
2.2 语法
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name = table2.column_name;
其中,JOIN和ON是关键字;table1和table2是表名;column_name是列名,表示待连接的列。
2.3 示例
例如,我们有两个表t1和t2:
t1 | t2 | ||||
---|---|---|---|---|---|
id | name | age | id | gender | address |
1 | Tom | 18 | 1 | Male | Beijing |
2 | Lucy | 20 | 2 | Female | Shanghai |
3 | Jack | 22 | 3 | Male | Guangzhou |
我们想要找出两张表中id相同的行,可以使用以下查询语句:
SELECT t1.name, t2.gender
FROM t1
JOIN t2
ON t1.id = t2.id;
该语句的执行结果为:
name | gender |
---|---|
Tom | Male |
Lucy | Female |
Jack | Male |
3. 外连接(outer join)
3.1 概述
外连接是指将两张表中符合特定条件的行连接在一起,并且保留未连接上的行。
3.2 左外连接(left outer join)
3.2.1 语法
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
其中,LEFT JOIN表示左外连接。
3.2.2 示例
例如,我们有两个表t1和t2:
t1 | t2 | ||||
---|---|---|---|---|---|
id | name | age | id | gender | address |
1 | Tom | 18 | 1 | Male | Beijing |
2 | Lucy | 20 | 2 | Female | Shanghai |
3 | Jack | 22 | 3 | Male | Guangzhou |
我们想要找出两张表中id相同的行,并保留t1中未连接上的行,可以使用以下查询语句:
SELECT t1.name, t2.gender
FROM t1
LEFT JOIN t2
ON t1.id = t2.id;
该语句的执行结果为:
name | gender |
---|---|
Tom | Male |
Lucy | Female |
Jack | Male |
NULL | NULL |
注意到最后一行的结果是NULL NULL,这是因为t1中id为4的行没有和t2中任何行匹配上,所以该行在输出结果中也出现了。
3.3 右外连接(right outer join)
3.3.1 语法
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
其中,RIGHT JOIN表示右外连接。
3.3.2 示例
例如,我们有两个表t1和t2:
t1 | t2 | ||||
---|---|---|---|---|---|
id | name | age | id | gender | address |
1 | Tom | 18 | 1 | Male | Beijing |
2 | Lucy | 20 | 2 | Female | Shanghai |
3 | Jack | 22 | 3 | Male | Guangzhou |
我们想要找出两张表中id相同的行,并保留t2中未连接上的行,可以使用以下查询语句:
SELECT t1.name, t2.gender
FROM t1
RIGHT JOIN t2
ON t1.id = t2.id;
该语句的执行结果为:
name | gender |
---|---|
Tom | Male |
Lucy | Female |
Jack | Male |
NULL | NULL |
同样地,注意到最后一行的结果是NULL NULL,这是因为t2中id为4的行没有和t1中任何行匹配上,所以该行在输出结果中也出现了。
4. 自连接(self join)
4.1 概述
自连接是指将一张表拆分成两个虚拟的表,并在这两个虚拟的表之间执行连接操作。
4.2 语法
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
其中,table1 T1和table1 T2表示两个虚拟的表,需要在表名后使用别名(T1和T2)标识;condition是连接两张表的条件。
4.3 示例
例如,我们有一个表t:
t | ||
---|---|---|
id | name | manager_id |
1 | Alice | 3 |
2 | Bob | 3 |
3 | Charlie | NULL |
4 | Dave | 2 |
5 | Eve | 1 |
我们现在想要查询每个员工的manager的name,可以使用以下查询语句:
SELECT emp.name, mgr.name
FROM t emp, t mgr
WHERE emp.manager_id = mgr.id;
该语句的执行结果为:
name | name |
---|---|
Alice | Charlie |
Bob | Charlie |
Charlie | NULL |
Dave | Bob |
Eve | Alice |
注意到最后一行的结果是Eve Alice,这是因为Eve的manager是Alice,所以该行在输出结果中也出现了。
5. 结语
以上就是SQL Server中连接表的方法探究。除了以上三种常见的连接方法(内连接、左外连接和右外连接),还有一些其他的连接方法(如交叉连接、自然连接等),感兴趣的读者可以继续深入学习。