如果查询结果涉及到两个及以上的表,则称为连接查询。连接查询是关系型数据库中最主要的查询,
包括:

等值连接查询
非等值连接查询
自然连接查询
自身连接查询
外连接查询。

1.等值连接与非等值连接

连接查询的WHERE 子句中用来连接两个表的运算符是“=”时称为等值连接,使用其他运算符的称为非等值连接。

1.1等值连接方式1:

SELECT * 
FROM table_1, table_2
WHERE table_1.Pid = table_2.Pid;

这种方式会先用两个表做一个笛卡尔积,比较费时间

等值连接方式2(内连接):

SELECT *
FROM table_1 INNER JOIN table_2 ON table_1.Pid = table_2.Pid;

2个表根据共同ID进行逐条匹配,不会出现笛卡尔乘积的现象,效率比较高,优先使用这种方法。

1.2数据库中的两个表

sql server 2表拼接成1个表 sql两张表连接_等值连接


两个表通过P_id等值连接

SELECT * 
FROM Orders as o , Persons as p
WHERE o.P_id = p.P_id;

sql server 2表拼接成1个表 sql两张表连接_数据库_02

FROM 后面表的顺序会影响连接后列名的顺序,上面的例子中FROM 后紧接着时Orders,然后才是Persons所以连接后的表,左面的属性是Orders,然后才是Persons的属性。

数据库管理系统在执行等值连接的一种可能的过程是:(嵌套循环)

//i是Orders中的每条记录
for i in Orders:
	//j是Persons中的每条记录
	for j in Persons:
		if(i.P_id == j.P_id):
			//把j连接到i后面

非等值连接就是不用=连接,想不到什么时候应用这种场景???
一般是通过外键建立索引使用等值连接,如果没有索引则需要遍历整个表,非常耗费时间,建立了索引就可以通过特定的值找到特定的记录。

2.自身连接

之前说的as起别名,既什么又什么
自身连接

3.自然连接

自然连接就是把目标列中的重复属性列去掉则为自然连接。
在等值连接的基础上,去掉重复的列:P_id,只出现一个

SELECT
o.O_id, o.OrderNo, p.* 
FROM
Orders as o , Persons as p 
WHERE 
o.P_id = p.P_id

结果,P_id只出现了一次,这次即自然连接。自然连接通常是选取一个表中的所有,另一个表中的部分,从而去掉重复的列

sql server 2表拼接成1个表 sql两张表连接_数据库的连接查询_03

4.外连接

外连接包括左外连接,和右外连接,两个都可以相互转换,只需要把两个表的顺序交换
具体使用左外还是右外 哪个方便实用哪个,例如

左连接

SELECT *
FROM table_a LEFT OUTER JOIN table_b ON (table_a.Pid = table_b.Pid)

上述代码等价于下面的右连接

SELECT *
FROM table_b RIGHT OUTER JOIN table_a ON (table_a.Pid = table_b.Pid)

现在为了介绍外连接,我们给Persons表中添加两条记录

Persons表

sql server 2表拼接成1个表 sql两张表连接_等值连接_04

Orders表

sql server 2表拼接成1个表 sql两张表连接_sql server 2表拼接成1个表_05

SELECT * 
FROM Persons 
LEFT OUTER JOIN
Orders ON Persons.P_id = Orders.P_id
ORDER BY Persons.P_id;

外连接查询结果

sql server 2表拼接成1个表 sql两张表连接_数据库的连接查询_06

从查询结果可以看出,即使Persons中没有与Orders中存在匹配的,依然把它连接起来了,没存在的匹配使用NULL值替代。
上述代码(左外连接)也等价于下面的右外连接,只不过是两个表的顺序交换位置了

SELECT * 
FROM Orders 
RIGHT OUTER JOIN
Persons ON Persons.P_id = Orders.P_id
ORDER BY Persons.P_id;

查询结果

sql server 2表拼接成1个表 sql两张表连接_mysql_07