1 小时 SQL 极速入门(二)

eeee.jpg

上篇咱们说了 SQL 的基本语法,掌握了这些基本语法后,咱们能够对单表进行查询及计算分析。可是一个大的系统,每每会有数十上百张表,而业务关系又错综复杂。咱们要查的数据每每在好几张表中,而要从多张表中来获取信息就须要用到表联结了。sql

先说说什么是联结,联结就是用一条 SELECT 语句从多个表中查询数据。经过联结,让多张表中的数据互相关联起来。联结又分为内联结、左外联结、右外联结、全外联结。别怕,我知道有些初学者看到这几个概念就头大,不过请继续日后看,看完后你确定能看明白。在实际中,内联结和左联结应该是使用最多的,我几乎没用到过右链接与全外联结。spa

对初学者来讲,在这里迷惑的缘由是去记这些概念,这是不必的,咱们只要在实际中抱着问题去用一次就能够彻底掌握了。3d

下面咱们就开始: 咱们有下面三张表,一张订单表存放订单头信息,包括订单号、订单类型、订单数量、订单状态信息。 code

ORDER_HEADER.png

一张订单明细表,存储订单的详细信息。包含订单号、订单类型、工序号、工序名称、工序状态、物料号、工位号cdn

ORDER_DETAIL.png

一张物料表,存储订单工序用到的物料。包含物料号、物料名称。blog

PRODUCT.png

内联结

咱们先观察一下,订单头信息中只包含订单的数量、状态信息。订单明细表中包含着订单的详细信息,如工序信息,每道工序用到的物料,每道工序的名称,在哪一个工位操做等信息。假如咱们如今要查询订单号、订单数量、工序号、工序名称、工位等信息,只有一张表咱们是查不到的,那么咱们就要把这两张表结合起来。排序

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.order_line_name,
  od.workcenter
FROM
  order_header oh
INNER JOIN order_detail od
ON
  oh.orderno     =od.orderno
AND oh.order_type=od.order_type
复制代码

解释下:咱们用INNER JOIN 表示内链接,在 INNER JOIN 后写上咱们须要关联的表,oh 和 od 表示别名,方便后面书写,否则后面咱们就要用到表的全称来写了。这里咱们要关联到订单明细表 order_detail,去取出订单详细信息。后面跟上 ON 关键字,表示条件,这里 ON 后面有两个条件。表示咱们经过订单号和订单类型来把两个表中的数据关联起来,经过订单表中的订单号和订单类型做为条件来查找订单明细表中一样订单号和订单类型的订单的详细信息。it

咱们看下结果:io

JOIN1.png

能够看到,咱们查出了订单 1001 ,1002, 1003, 1004, 1005五个订单的总数量,各个工序的名称,在哪一个工位生产等信息。class

细心的读者可能会注意到,在订单表中还有一个 1008 的订单,为何没有查出来?那就接着往下看

左联结

相比于内联结,左联结使用 LEFT JOIN 来表示。咱们先不看概念,咱们直接把刚才的 SQL 语句改为左联结来看一下结果。

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.order_line_name,
  od.workcenter
FROM
  order_header oh
LEFT JOIN order_detail od
ON
  oh.orderno     =od.orderno
AND oh.order_type=od.order_type;

复制代码

结果以下图:

LEFTJOIN.png

对比内联结的结果,咱们发现了什么,咱们发现最下面多了一行,1008 订单,而1008 后面的几个字段为空。咱们看一下订单明细表会发现没有 1008 这个订单。

这样子咱们就明白了,内联结是两张表中都存在才能关联出来。而左联结的意思就是咱们的主表中的全部行都会展现出来,若是在联结的表中找不到对应的,会默认为 null.

右联结

知道了左联结,右联结也就清楚了,右链接呢会把咱们关联的表中的全部行都展现出来,无论主表中有没有匹配的行。右联结关键字为 RIGHT JOIN

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.workcenter
FROM
  order_header oh
RIGHT JOIN order_detail od
ON
  oh.orderno     =od.orderno
AND oh.order_type=od.order_type;
复制代码

RIGHTJOIN.png

能够看到,RIGHT JOIN 把关联的订单明细表中的全部行都显示了出来,可是订单主表中并无 1006 和 1007 两个订单,因此这两行显示为 null

多表联结

多表联结就是超过两张表的联结,上面咱们关联了订单表和订单明细表,如今咱们想知道每道工序用到的物料,就须要关联到物料表。咱们看到订单明细表中有 productid 字段,咱们用这个关联到 product 表中。同时,后面咱们也用了 ORDER BY 进行排序。

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.workcenter,
  p.productno,
  p.product_name
FROM
  order_header oh
INNER JOIN order_detail od
ON
  oh.orderno =od.orderno
INNER JOIN product1 p
ON
  od.productid   =p.ID
AND oh.order_type=od.order_type
ORDER BY
  orderno,
  order_line_no
复制代码

JOIN2.png

注意

在使用联结时必定要注意联结条件,若是 联结条件不正确,就会获得不正确的结果。并且要注意,联结条件是必须的。

UNION 与 UNION ALL

UNION 与 UNION ALL 表示并集,能够把两个 SELECT 查询的结果合并成一个,前提是两个 SELECT 所查询的列数量和字段类型一致。不一样的是 UNION 会去除重复行,而 UNION ALL 不会去除重复行。

若是咱们有两张表,都存有类似的信息。好比咱们在一个其余表中也存储的有订单信息。举个栗子,order_header_bak 表中存有以下两条数据。

ORDERBAK.png

咱们用 UNION ALL 试一下

SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header
UNION ALL
SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header_bak;
复制代码

UNIONALL.png

看到查出了 8 条信息,1001 订单有两条同样的信息。 咱们用 UNION 试一下

SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header
UNION
SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header_bak
复制代码

UNION.png

看到只有 7 条数据了, 1001 订单只有一行数据。

相关文章
相关标签/搜索