1 小时 SQL 极速入门(二)

eeee.jpg

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

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

对初学者来说,在这里迷惑的原因是去记这些概念,这是没必要的,我们只要在实际中抱着问题去用一次就可以完全掌握了。

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


ORDER_HEADER.png

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

ORDER_DETAIL.png

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

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 后面有两个条件。表示我们通过订单号和订单类型来把两个表中的数据关联起来,通过订单表中的订单号和订单类型作为条件来查找订单明细表中同样订单号和订单类型的订单的详细信息。

我们看下结果:

JOIN1.png

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

细心的读者可能会注意到,在订单表中还有一个 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 订单只有一行数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352