如果查询结果涉及到两个及以上的表,则称为连接查询。连接查询是关系型数据库中最主要的查询, 包括:
等值连接查询 非等值连接查询 自然连接查询 自身连接查询 外连接查询。连接查询的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进行逐条匹配,不会出现笛卡尔乘积的现象,效率比较高,优先使用这种方法。
两个表通过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后面非等值连接就是不用=连接,想不到什么时候应用这种场景??? 一般是通过外键建立索引使用等值连接,如果没有索引则需要遍历整个表,非常耗费时间,建立了索引就可以通过特定的值找到特定的记录。
之前说的as起别名,既什么又什么 自身连接
自然连接就是把目标列中的重复属性列去掉则为自然连接。 在等值连接的基础上,去掉重复的列:P_id,只出现一个
SELECT o.O_id, o.OrderNo, p.* FROM Orders as o , Persons as p WHERE o.P_id = p.P_id外连接包括左外连接,和右外连接,两个都可以相互转换,只需要把两个表的顺序交换 具体使用左外还是右外 哪个方便实用哪个,例如
左连接
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中存在匹配的,依然把它连接起来了,没存在的匹配使用NULL值替代。 上述代码(左外连接)也等价于下面的右外连接,只不过是两个表的顺序交换位置了
SELECT * FROM Orders RIGHT OUTER JOIN Persons ON Persons.P_id = Orders.P_id ORDER BY Persons.P_id;