转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

一直以来,对于数据库SQL方面都是半吊子水平,能写一些基本的增删改查的语句,大部分时间都是用下Where,偶尔用用Order By、Limit,Like什么的。连表查询也是一些很简单的使用。至于那些高级用法,都还给老师了。最近接腾讯的IDIP的SDK,需要查询一些游戏数据,发现自己的SQL水平不够用,温习了一些以前忘记的语法,顺便记录一下,方便以后偶尔来查查。


Union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

//联合两个表,没有重复
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

数据源:

结果:

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

//联合两个表,允许重复
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA

结果:


JOIN

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

数据源:
Persion表:

Orders表:

//使用连表查询
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P //使用join查询
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

结果:

不同的 SQL JOIN
除了我们在上面的例子中使用的 INNER JOIN(内连接),JOIN默认使用内连接,可以省略INNER。 我们还可以使用其他几种连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

  • JOIN: 如果表中有至少一个匹配,则返回行(INNER JOIN 与 JOIN)
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

LEFT JOIN

//使用left join查询,只要左表有匹配的条件,就会生成一行,右表的列值为空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果:


RIGHT JOIN

//使用right join查询,只要右表有匹配的条件,就会生成一行,左表的列值为空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果:


FULL JOIN

//使用full join查询,只要其中一个表中存在匹配,就会生成一行,另一个表的列值为空。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果:


多表连接

有时候会遇到需要多个表连接的情况,只要遵守以下规则就可以轻松的应对多表连接的情况了。

  • 在可以指定一个表名的任何地方,都可以指定一个括号括起来的join子句。
  • 在两个表的一个完整join语句出现的任何一个地方,我们都可以只用一个表名来代替它。所谓“两个表的一个完整join语句”也即“join子句”,就是指如“A join B on A.a= B.b”这样一个完整的句子。

比如:欲连接ABCDE五个表

//A: 可以这样:
Select * from A inner join(((
B inner join C on B.b = C.c)
inner join D on B.b = D.d)
inner join E on D.d = E.e)
on A.a = E.e//B: 也可以这样:
select * from (((
A inner join B on A.a = B.b)
inner join C on C.c = A.a)
inner join D on D.d = C.c)
inner join E
on E.e = D.d//C: 也可以这样:
select * from
A inner join B on A.a = B.b
inner join C on C.c = A.a
inner join D on D.d = C.c
inner join E on E.e = D.d

我们可以先把A和B连接起来,然后将结果与C连接,当然,如果C只和B相关而不和A相关的话,我们也可以先把B和C连接起来,结果再与A连接,只要保持关系是正确的,你可以以任意方式来定义嵌套的join。


先记录到这里吧,后面有时间再继续温习下。

关于SQL中Union和Join的用法相关推荐

  1. python threading join_Python中threading模块join函数用法实例分析

    本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后joi ...

  2. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

  3. Spark SQL中出现 CROSS JOIN 问题解决

    Spark SQL中出现 CROSS JOIN 问题解决 参考文章: (1)Spark SQL中出现 CROSS JOIN 问题解决 (2)https://www.cnblogs.com/yjd_hy ...

  4. sql中的left join、right join、inner join

    sql中的left join.right join.inner join 转自:http://www.cnblogs.com/pcjim/articles/799302.html left join( ...

  5. SQL中 UNION 和 UNION ALL 操作符小结

    SQL中 UNION 和 UNION ALL 操作符小结1.UNION 和 UNION ALL 操作符用于合并两个或多个 SELECT 语句的结果集[适用场景] 2.UNION 和 UNION ALL ...

  6. mysql join union_MySQL中union和join语句使用区别的辨析教程

    union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确. 先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同 ...

  7. sql中的left join 查询

    join 是 SQL查询中很常见的一种操作,具体来讲有join,left join, right join,full join等很多形式.具体的原理如下图所示.但其中最常见的还是使用left join ...

  8. SQL中连接(JOIN)子句介绍

    本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法. 说明:本文的用法示例是面向 MySQL 数据库的. 1 ...

  9. sql中group by 和having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

最新文章

  1. 110道Python面试真题
  2. 作为JavaScript开发人员,这些必备的VS Code插件你都用过吗?
  3. 作业调度问题java代码_Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码...
  4. C语言之字符数组在if{}里面赋值给char *引发的问题
  5. Java常见面试知识点:继承、接口、多态、代码块
  6. matplot绘制图形入门
  7. Tensorflow(r1.4)API--tf.truncated_normal()
  8. ELM322 - OBD (VPW) to RS232 Interpreter (v2.0)
  9. python在生态学领域运用_科学网-那些生态学可能会用到的工具软件-张金龙的博文...
  10. 从认知语言学的角度来看计算机没有,从认知语言学的角度来看「ところ」
  11. 九章云极DataCanvas公司荣获机器之心三大奖项,助力产业数智化升级
  12. python画指数函数图像_如何使用python的matplotlib模块画指数函数图像
  13. 2022盘点工作室常用的API数据接口开发平台
  14. vi php pear,PEAR
  15. 谈谈我在企业内部的创业经历
  16. 《Pro SQL Server Internals, 2nd edition》 作者:Dmitri KorotkevitchP55-58 P62-65 P68-69
  17. linux下udev详解
  18. GaussDB数据库管理
  19. Linux 开发环境工具 下载网址大全 --转
  20. html后续及css

热门文章

  1. 2016中国互联网安全大会:我国网络安全人才缺口至少50万
  2. 内存管理-alloc_pages()函数分配内存
  3. TensorFlow Fundation
  4. 第53篇:某OA系统的H2数据库延时注入点不出网拿shell方法
  5. 银行 计算机科技大赛,分行成功举办2019年数字化转型创意大赛
  6. Unity2019_3D模型管理
  7. 氢气球条幅广告的介绍
  8. worker服务器推送消息,关于Worker如何向指定Client推送消息
  9. Layui 数据表格多条件查询与后端交互
  10. 【mac】查找字体路径