天天看点

SQL JOIN简介

SQL JOIN

什么是JOIN

JOIN是一种从多个表源取数据的操作,常用于合并表。常见的JOIN操作包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN、自关联等

SQL JOIN简介
  • JOIN和INNER JOIN一致,是获取两张表交集部分数据的方法。也就是两张表间相互匹配的那部分记录会被列举。
  • OUTER JOIN包含LEFT JOIN、RIGHT JOIN、FULL JOIN三种。具体地:

    1. LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

    2. RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

    3. FULL JOIN:只要其中一个表中存在匹配,就返回行

  • 自关联是指一张表与同一张表按照某种筛选条件进行合并,生成新表。

常用的JOIN策略

  1. 需要展示的字段内容分别存储在不同的表里,此时需要用JOIN来合并表

    举个例子:

    数据库中包含Persons和Orders表,如果我们希望列出所有人的定购数,可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons JOIN Orders
ON Persons.Id_P = Orders.Id_P
           

这里的JOIN可以理解为Persons表和Orders表的各自任取一行组合成行记录,得到临时表t,然后针对临时表t 进行ON条件筛选,即选择Persons表部分Id_P与Orders表部分Id_P一致的行记录,最终得到结果表。

  1. 需要展示的字段内容在同一个表中,但仅通过一个表不能直接得到最终结果,此时需要用JOIN来合并表

    举个例子:

    数据库中包含employees表,其中包含员工id及姓名、经理id。如果我们希望列出所有员工及其经理姓名,可以使用下面的 SELECT 语句:

SELECT worker.last_name, manager.last_name
FROM employees worker JOIN employees manager
ON (workers.manager_id = manager.employee_id)
           
SQL JOIN简介

3. 需要展示的字段内容在同一张表里,但是对不同行记录的起始截止有条件限定

在SQL实现深圳地铁换乘小项目中,同一条线路不同站点上下车或者站点间换乘的场景,对线路信息表的起始截止站点【不同行记录】均有条件限制,因此采用自关联的方式,

例1: 同一条线路不同站点上下车

SELECT a.num, a.stopid,b.stopid
FROM szsubway a JOIN szsubway b ON (a.num=b.num)
WHERE a.stopid=1 AND b.stopid= 22
           

例2: 站点间换乘

SELECT a.stopid,a.num, b.stopid, c.num, d.stopid
FROM szsubway a 
JOIN szsubway b ON (a.num=b.num)
JOIN szsubway c ON (b.stopid=c.stopid AND b.num != c.num)
JOIN szsubway d ON (c.num=d.num)
WHERE a.stopid=70 AND d.stopid= 108