1 使用多个表格

在「world」资料库的「country」表格中,储存世界上所有的国家资料,其中有一个栏位「Capital」用来储存首都资料,不过它只是储存一个编号;另外在「city」表格中,储存世界上所有的城市资料,它主要的栏位有城市编号和城市的名称:

虽然「country」表格自己没有储存城市名称,不过它可以使用「Capital」栏位的值,对照到「city」表格中的「ID」栏位,也可以知道城市的名称。在这样的表格设计架构下,如果你想要查询「所有国家的首都名称」:

这样的查询需求就称为「结合查询」,也就是你要查询的资料,来自于一个以上的表格,而且两个表格之间具有上列讨论的「对照」情形。

2 Inner Join

「Inner join」通常称为「内部结合」,它可以应付大部份的结合查询需求,内部结合有两种写法,差异在把结合条件设定在「WHERE」子句或「FROM」子句中。

2.1 使用结合条件

下列是在「WHERE」子句中设定结合条件来执行结合查询的语法:

虽然这里会先介绍使用结合条件的结合查询,不过不管使用哪一种写法,在使用结合查询时都会有一样的想法。首先是你想要查询的栏位:

把需要查询的栏位列在「SELECT」之后,「FROM」子句后面该需要哪一些表格就很清楚了:

最后把表格与表格之间「对照」的结合条件放在「WHERE」子句中:

这样的叙述就可以查询「所有国家的首都名称」。

2.2 指定表格名称

在上列的讨论中,因为使用到多个表格了,所以在使用表格的栏位时,都特别提醒你要在栏位名称前面加上表格名称。其实并不是全部都要指定表格名称,你只有在一种情况下,才「一定要」在栏位名称前指定表格名称:

在查询叙述的「FROM」子句中用到的表格,如果有一样的栏位名称,而且你在查询叙述中也用到了这些栏位,就「一定要」在栏位名称前指定表格名称,否则都可以省略:

所以省略掉一些表格名称以后,查询叙述就简短多了,不过它执行查询后的结果也是一样的:

SELECT Code, Capital, city.Name

FROM country, city

WHERE Capital = ID

如果不小心违反上列的规则,你的查询叙述在执行以后就会发生错误:

2.3 表格别名

如果你想要查询「国家和首都的人口和比例」:

这样的结合查询刚好都使用到两个表格中,有同样名称的栏位,所以你一定要指定表格名称:

SELECT country.name, country.Population coPop,

city.Name, city.Population ciPop,

city.Population / country.Population * 100 Scale

FROM country, city

WHERE Capital = ID

这样的查询叙述就会比较长一些,也比较容易打错;所以在结合查询的叙述中,通常为帮「FROM」子句后面的表格都取一个「表格别名」:

使用表格别名以后:

帮「FROM」子句中使用到的表格都取一个表格别名,这样的查询叙述通常也可以比较简短一些了。

2.4 使用「INNER JOIN」

执行结合查询除了使用上列讨论的方式外,还有另外一种结合查询语法:

虽然这两种写法看起来的差异很大,不过它们的想法会是一样的。首先是需要查询的栏位:

接下来是需要用到的表格,不过你要使用「INNER JOIN」把两个表格「结合」起来:

最后是结合条件:

上列使用「INNER JOIN」的结合查询执行以后,跟之前使用结合条件的结合查询,所得到的结果是完全一样的。所以查询「国家和首都的人口和比例」的结合查询,也可以改用下列的写法:

SELECT a.name, a.Population coPop,

b.Name, b.Population ciPop,

b.Population / a.Population * 100

FROM country a INNER JOIN city b ON Capital = ID

使用「INNER JOIN」的结合查询还有另外一种选择:

下列是使用「ON」或是「USING」来设定结合条件的情况:

所以如果想要查询「cmdev」资料库中,员工资料和他们的部门名称,就会有三种写法可以选择了:

3 Outer Join

在「cmdev」的员工资料(emp)表格中,部门编号(deptno)栏位是用来储存员工所属的部门用的;不过有一些员工并没有部门编号:

所以如果你使用「内部结合」的作法执行下列的查询,你会发现少了两个员工的资料:

这是因为使用「内部结合」的查询,一定要符合「结合条件」的资料才会出现:

如果你想查询的资料是「包含部门名称的员工资料,可是没有分派部门的员工就不用出现了」,那使用「内部结合」就可以完成你的工作了;可是如果你想要查询的资料是「包含部门名称的员工资料,没有分派部门的员工也要出现」,那你就要使用「OUTER JOIN」,这种结合查询通常称为「外部结合」:

除了多一个「LEFT」或「RIGHT」,还有把「INNER」换成「OUTER」外,其它的部份与内部结合的作法都是一样的。

3.1 LEFT OUTER JOIN

所以在结合查询的应用中,如果你想要查询的资料是「包含部门名称的员工资料,没有分派部门的员工也要出现」,也就是希望不符合结合条件的资料也要出现的话,就要换成使用「LEFT OUTER JOIN」来执行结合查询。OUTER JOIN分为LEFT和RIGHT两种,在这个范例中,要使用LEFT才符合查询的需求:

3.2 RIGHT OUTER JOIN

其实使用「LEFT OUTER JOIN」或是「RIGHT OUTER JOIN」并没有差异,以上列的需求来说,要查询「包含部门名称的员工资料,没有分派部门的员工也要出现」,就是要以「cmdev.emp」表格的资料为主,所以下列两种写法所得到的结果是完全一样的:

了解两种「OUTER JOIN」的后,下列这两个看起来会有点混淆的查询,虽然只有「LEFT」与「RIGHT」的差异,它们所完成的查询需求,却是完全不一样的:

所以使用「RIGHT OUTER JOIN」的查询需求,就成为「部门名称与该部门的员工资料,没有员工的部门也要出现」:

4 合并查询

在关联式资料库中,因为表格的设计,你常会使用结合查询来取得需要的资料,结合查询指的是在「一个」查询叙述中使用「多个」资料表。而现在要讨论的「合并、UNION」查询,指的是把一个以上的查询叙述所得到的结果合并为一个,有这样的需求时,你会在多个查询叙述之间使用「UNION」关键字:

以下列这两个独立的查询来说,它们在执行以后会得到各自传回查询的纪录:

如果使用「UNION」关键字把这两个查询合并起来的话,就只会得到一个查询结果,不过这个查询结果会包含两个查询所得到的纪录:

在执行合并查询的时候,有一些规则要知道与遵守。第一个规则是回传结果的栏位名称:

第二个规则是所有查询叙述的栏位数量一定要一样:

上列的范例比较看不出为什么要使用合并查询,一般来说,你大概会因为下列的原因,把原来的查询叙改用合并查询的写法来完成你的需求:

mysql union join_MySQL 超新手入门(5) JOIN 与 UNION 查询相关推荐

  1. MySQL入门 (四) : JOIN 与UNION 查询

    1 使用多个表格 在「world」资料库的「country」表格中,储存世界上所有的国家资料,其中有一个栏位「Capital」用来储存首都资料,不过它只是储存一个编号:另外在「city」表格中,储存世 ...

  2. Mysql下载以及安装(新手入门,超详细)

    一.Mysql下载 1.官网地址 https://www.mysql.com/ 2.或者百度搜索官网 3.找到Downloads按钮 4.找到社区版 5.找到对应电脑系统,这里选择Mysql on W ...

  3. mysql inner join_MySQL内连接(INNER JOIN)

    MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录. INNER JOIN子句是SELECT语句的可选部分,它出现在FROM子句之后. 在使用 ...

  4. mysql数据库命令_新手入门MYSQL数据库命令大全

    一.命令行连接数据库 Windows操作系统进入CMD命令行,进入mysql.exe所在目录,运行命令 mysql.exe -h主机名 -u用户名 -p密码 注意:参数名与值之间没有空格 , 如:-h ...

  5. 7620a路由mysql,7620A路由求助 - 新手入门及其它(软件) - 恩山无线论坛 - Powered by Discuz!...

    得一个"恒邦卫士HBG-300路由,TTL信息如下: U-Boot 1.1.3 (Jul 30 2015 - 23:49:54) Board: Ralink APSoC DRAM:  128 ...

  6. mysql 记录更新 内部_MySQL 入门(1):查询和更新的内部实现

    摘要 在MySQL中,简单的CURD是很容易上手的. 但是,理解CURD的背后发生了什么,却是一件特别困难的事情. 在这一篇的内容中,我将简单介绍一下MySQL的架构是什么样的,分别有什么样的功能.然 ...

  7. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  8. Java新手入门200例124之用JDBC连接Mysql数据库

    文章目录 作者简介 引言 导航 热门专栏推荐 一.创建web项目 二.加入Mysql驱动 三.编写查询代码 四.测试查询代码 五.编写插入代码 六.编写修改代码 七.编写删除代码 小结 导航 热门专栏 ...

  9. mysql从服务器能否修改数据,mysql数据库操作新手入门,手把手的教会你 _数据库教程...

    由于新手入门PHP+Mysql技术,必定对Mysql操作存有疑问. 尽管PHPMyadmin管理数据库对新手来说也不妨为一种很好的方式.但更多的实际使用还要靠大家对Myql语句格式 的精通和熟练的操作 ...

最新文章

  1. cufflinks基于dataframe数据绘制股票数据:直方图、时序图
  2. GitHub:我开源我自己;CEO:不存在的
  3. 每日一皮:多线程理想与现实的差距
  4. Django URL
  5. mysql调优的一些方面
  6. 1、深入理解 Laravel Eloquent(一)——基本概念及用法
  7. 后端服务慢成狗?试试这 7 招!
  8. 使用rsync+inotify配置触发式(实时)远程同步
  9. 仿城通网盘分享下载系统源码下载,强大功能完美商用
  10. 《漫步》flash动画制作全记录六
  11. 浅谈信息安全的职业发展方向规划(乙方安全公司篇)
  12. 微信忘记支付密码,实名认证的身份证又没有办理银行卡怎么破?(未解决)
  13. snv服务器备份方案
  14. Java学习 --- 设计模式七大原则的依赖倒转原则
  15. Word文档粘贴的表格中文字有淡灰色背景的去除方法
  16. Redis命令语法大全
  17. 计算机基础之计算机硬件软件数据结构
  18. Vite打包项目提示“some chunks are larger than 500 kib....“
  19. foursquare url 令牌
  20. QQ空间批量删除说说 (此处用的是chrome浏览器)

热门文章

  1. Python编程基础:第三十八节 问答游戏Quiz Game
  2. solr查询工作原理深入内幕
  3. 【NLP】Transformer详解
  4. 人工智能靠人工:标注员1天要听1000条录音
  5. 量子计算机编程原理简介 和 机器学习
  6. 从变量到封装:一文带你为机器学习打下坚实的Python基础 By 机器之心2017年10月13日 10:43 本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要的且常
  7. 谈无人车安卓为时尚早,投自动驾驶有三个标准
  8. LambdaMART简介——基于Ranklib源码(一 lambda计算)
  9. 用gdb调试core dump文件
  10. 白话Elasticsearch12-深度探秘搜索技术之基于multi_match + best fields语法实现dis_max+tie_breaker