如果查询结果涉及到两个及以上的表,则称为连接查询。连接查询是关系型数据库中最主要的查询,
包括:
等值连接查询
非等值连接查询
自然连接查询
自身连接查询
外连接查询。
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数据库中的两个表
两个表通过P_id等值连接
SELECT *
FROM Orders as o , Persons as p
WHERE o.P_id = p.P_id;
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只出现了一次,这次即自然连接。自然连接通常是选取一个表中的所有,另一个表中的部分,从而去掉重复的列
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表
Orders表
SELECT *
FROM Persons
LEFT OUTER JOIN
Orders ON Persons.P_id = Orders.P_id
ORDER BY Persons.P_id;
外连接查询结果
从查询结果可以看出,即使Persons中没有与Orders中存在匹配的,依然把它连接起来了,没存在的匹配使用NULL值替代。
上述代码(左外连接)也等价于下面的右外连接,只不过是两个表的顺序交换位置了
SELECT *
FROM Orders
RIGHT OUTER JOIN
Persons ON Persons.P_id = Orders.P_id
ORDER BY Persons.P_id;
查询结果