1 小时 SQL 极速入门(二)

转自:https://www.cnblogs.com/injet/p/10061372.html

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

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

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

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

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

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

内联结

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

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

我们看下结果:

可以看到,我们查出了订单 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;

结果如下图:

对比内联结的结果,我们发现了什么,我们发现最下面多了一行,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;

可以看到,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

注意

在使用联结时一定要注意联结条件,如果 联结条件不正确,就会得到不正确的结果。而且要注意,联结条件是必须的。

UNION 与 UNION ALL

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

如果我们有两张表,都存有相似的信息。比如我们在一个其他表中也存储的有订单信息。举个栗子,order_header_bak 表中存有如下两条数据。

我们用 UNION ALL 试一下

SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header
UNION ALL
SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header_bak;

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

SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header
UNION
SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header_bak

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

原文地址:https://www.cnblogs.com/hmms/p/10130680.html

时间: 2024-11-10 13:43:49

1 小时 SQL 极速入门(二)的相关文章

1 小时 SQL 极速入门(三)——分析函数

转自:https://www.cnblogs.com/injet/p/10122832.html 前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询.大家可以点击链接查看1 小时 SQL 极速入门(一)1 小时 SQL 极速入门(二)今天我们讲一些在做报表和复杂计算时非常实用的分析函数.由于各个数据库函数的实现不太一样,本文基于 Oracle 12c . ROW_NUMBER()函数 这个函数在平时用的还是比较多的.这个函数的作用是为分组内的每一行返回一个行号.我们还是举例来说明.假设我

1 小时 SQL 极速入门(一)

前几天,我在论坛溜达.看到一个人发帖说 做了6年的企业级开发,总是被互联网行业的人认为没技术含量,不就是CRUD么 先解释下 CRUD 是什么.CRUD 就是我们常说的增删改查(Create,Retrieve,Update,Delete) 其实,对这个问题,我也思考过.我们所有的业务流程,最终都会抽象出数据模型,保存到数据库中.把业务之间的联系抽象成数据库中表与表,字段与字段之间的联系.实际上,企业的各种系统,在技术层面上确实是在 CRUD. 不过话说回来了,互联网的系统不是 CRUD 吗?只不

Unity3D新手教学,让你十二小时,从入门到掌握!(三 ) [转]

版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 这一讲,我会教大家如何写碰撞检测的代码,然后还会教大家如何使用我介绍给大家的第一个Unity的插件. 那么,废话不多说,我先介绍插件如何下载和安装. VS For Unity 下载链接 进入这个页面,按编译器版本进行下载,我用的是2010,所以要下载这个. 安装就不用我教了,下面开始看我是如何导入Unity VS的. 点击Import之后我们会发现并没有发生什么,但是接下来我们按一下刷

Unity3D新手教学,让你十二小时,从入门到掌握!(二) [转]

版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 继续上一讲的内容,首先呢, 为了接下来要做的小游戏,在这里我要小小的修改一下移动的代码. public class PlayerMove : MonoBehaviour { //定义移动的速度 public float MoveSpeed = 8f; void Start () { } void Update () { //如果按下W或上方向键 if(Input.GetKey(KeyC

《Python黑客编程之极速入门》正式开课

玄魂 玄魂工作室 今天 之前开启了一个<Python黑客编程>的系列,后来中断了,内容当时设置的比较宽,不太适合入门.现在将其拆分成两个系列<Python黑客编程之极速入门>和<Python黑客编程之网络安全>,以便初学者有一个入门和提升的过程. 我们首先开启的是<Python黑客编程之极速入门>,考虑到学习质量的保证问题, 这次采用的是培训的方式,图文教程+课后练习+答疑+案例介绍+扩展阅读. 培训目前只面向我们知识星球内部成员(加入星球自动享受该课程权益

SparkSQL极速入门 整合Kudu实现广告业务数据分析

第1章 课程介绍&学习指南本章会对这门课程进行说明并进行学习方法介绍. 第2章 为什么要学SparkSpark作为近几年最火爆的大数据处理技术,是成为大数据工程师必备的技能之一.本章节将从如下几个方面对Spark进行一个宏观上的介绍:Spark产生背景.特性.环境部署.Spark与Hadoop的对比.Spark开发语言及运行模式等. 第3章 Spark SQL快速入门Spark SQL面世已来,深受小伙伴们的喜爱,继续为Spark用户提供高性能SQL on Hadoop解决方案,还为Spark带

AppCan开发极速入门,从0开始!

由于种种原因而不能参加AppCan线下培训,遗憾! 不喜欢视频教程的单机节奏,苦恼! AppCan线上直播课堂,冲破时间.地域.空间限制,从0开始,教你如何极速入门AppCan移动开发! 本次线上直播内容以插件的使用.项目实战为主,将线下开发者培训课程进行精简,高效的呈现给大家, 6小时即可让你快速上手移动APP开发! PS:直播课堂中老师会按需求量进行大众问题的答疑,对课程有疑问的同学请将问题统统抛过来! 1.开播时间 3月24 日-3月25日(14:30-17:30) 2.必备知识 1).H

每篇半小时1天入门MongoDB——2.MongoDB环境变量配置和Shell操作

上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program Files\MongoDB\Server\3.0\bin;.注意:要以;隔开各种变量. 这样的话就可以直接在CMD命令窗口中输入mongo 表示环境变量设置成功,并已经连接到默认数据库test中. 我们可以输入mongod --help来查看相关的帮助信息 C:\Users\zouqi>mongod

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作