SQL涉及多表查询时的各种连接

    科技2022-07-16  128

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

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

    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;

    查询结果

    Processed: 0.009, SQL: 8