关于SQL中Union和Join的用法
转载请注明出处:帘卷西风的专栏(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的用法相关推荐
- python threading join_Python中threading模块join函数用法实例分析
本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后joi ...
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...
- Spark SQL中出现 CROSS JOIN 问题解决
Spark SQL中出现 CROSS JOIN 问题解决 参考文章: (1)Spark SQL中出现 CROSS JOIN 问题解决 (2)https://www.cnblogs.com/yjd_hy ...
- sql中的left join、right join、inner join
sql中的left join.right join.inner join 转自:http://www.cnblogs.com/pcjim/articles/799302.html left join( ...
- SQL中 UNION 和 UNION ALL 操作符小结
SQL中 UNION 和 UNION ALL 操作符小结1.UNION 和 UNION ALL 操作符用于合并两个或多个 SELECT 语句的结果集[适用场景] 2.UNION 和 UNION ALL ...
- mysql join union_MySQL中union和join语句使用区别的辨析教程
union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确. 先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同 ...
- sql中的left join 查询
join 是 SQL查询中很常见的一种操作,具体来讲有join,left join, right join,full join等很多形式.具体的原理如下图所示.但其中最常见的还是使用left join ...
- SQL中连接(JOIN)子句介绍
本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法. 说明:本文的用法示例是面向 MySQL 数据库的. 1 ...
- sql中group by 和having 用法解析
--sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...
最新文章
- 110道Python面试真题
- 作为JavaScript开发人员,这些必备的VS Code插件你都用过吗?
- 作业调度问题java代码_Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码...
- C语言之字符数组在if{}里面赋值给char *引发的问题
- Java常见面试知识点:继承、接口、多态、代码块
- matplot绘制图形入门
- Tensorflow(r1.4)API--tf.truncated_normal()
- ELM322 - OBD (VPW) to RS232 Interpreter (v2.0)
- python在生态学领域运用_科学网-那些生态学可能会用到的工具软件-张金龙的博文...
- 从认知语言学的角度来看计算机没有,从认知语言学的角度来看「ところ」
- 九章云极DataCanvas公司荣获机器之心三大奖项,助力产业数智化升级
- python画指数函数图像_如何使用python的matplotlib模块画指数函数图像
- 2022盘点工作室常用的API数据接口开发平台
- vi php pear,PEAR
- 谈谈我在企业内部的创业经历
- 《Pro SQL Server Internals, 2nd edition》 作者:Dmitri KorotkevitchP55-58 P62-65 P68-69
- linux下udev详解
- GaussDB数据库管理
- Linux 开发环境工具 下载网址大全 --转
- html后续及css