MySQL全连接(Full Join)实现,union和union all用法
下面是一个简单测试,可以看看:
mysql> CREATE TABLE a(id int,name char(1));
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE b(id int,name char(1));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO a VALUES(1,'a'),(2,'b');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> INSERT INTO b VALUES(2,'b'),(3,'c');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM a LEFT JOIN b ON a.id=b.id
-> UNION
-> SELECT * FROM a RIGHT JOIN b ON a.id=b.id;
+------+------+------+------+
| id | name | id | name |
+------+------+------+------+
| 1 | a | NULL | NULL |
| 2 | b | 2 | b |
| NULL | NULL | 3 | c |
+------+------+------+------+
3 rows in set (0.00 sec)
mysql>
MySQL UNION 语法
MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中。语法为:
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2
...
在多个 SELECT 语句中,对应的列应该具有相同的字段属性,且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。
UNION 与 UNION ALL 的区别
当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
MySQL UNION 用法实例
UNION 常用于数据类似的两张或多张表查询,如不同的数据分类表,或者是数据历史表等。下面是用于例子的两张原始数据表:
| aid | title | content |
|---|---|---|
| 1 | 文章1 | 文章1正文内容... |
| 2 | 文章2 | 文章2正文内容... |
| 3 | 文章3 | 文章3正文内容... |
| bid | title | content |
|---|---|---|
| 1 | 日志1 | 日志1正文内容... |
| 2 | 文章2 | 文章2正文内容... |
| 3 | 日志3 | 日志3正文内容... |
上面两个表数据中,aid=2 的数据记录与 bid=2 的数据记录是一样的。
使用 UNION 查询
查询两张表中的文章 id 号及标题,并去掉重复记录:
SELECT aid,title FROM article UNION SELECT bid,title FROM blog
返回查询结果如下:
| aid | title |
|---|---|
| 1 | 文章1 |
| 2 | 文章2 |
| 3 | 文章3 |
| 1 | 日志1 |
| 3 | 日志3 |
UNION 查询结果说明
- 重复记录是指查询中各个字段完全重复的记录,如上例,若 title 一样但 id 号不一样算作不同记录。
- 第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称,如上例的 aid。
- 各 SELECT 语句字段名称可以不同,但字段属性必须一致。
使用 UNION ALL 查询
查询两张表中的文章 id 号及标题,并返回所有记录:
SELECT aid,title FROM article UNION ALL SELECT bid,title FROM blog
返回查询结果如下:
| aid | title |
|---|---|
| 1 | 文章1 |
| 2 | 文章2 |
| 3 | 文章3 |
| 1 | 日志1 |
| 2 | 文章2 |
| 3 | 日志3 |
显然,使用 UNION ALL 的时候,只是单纯的把各个查询组合到一起而不会去判断数据是否重复。因此,当确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应当使用 UNION ALL 以提高查询效率。
-
连接就是将两个表按照某个公共字段来拼成一个大表。
左连接就是在做连接是以左边这个表为标准,来遍历右边的表。
1、引子
左连接,自连接

结果:

2、问题 例子:
用户访问记录:

问题:查出看了湖南卫视但没有看北京卫视的用户信息
逻辑:先通过左连接将看了湖南卫视和北京卫视的查出来,然后再将看了湖南卫视但不在刚才查出的结果中的用户查出来。
123SELECT*FROMtest_visitWHEREchannel='湖南卫视'ANDuidNOTIN(SELECTDISTINCTt1.uidFROMtest_visit t1LEFTJOINtest_visit t2ONt1.uid = t2.uidWHEREt1.channel='湖南卫视'ANDt2.channel='北京卫视')SELECT语句中的自连接。
到目前为止,我们连接的都是两张不同的表,那么能不能对一张表进行自我连接呢?答案是肯定的。
有没有必要对一张表进行自我连接呢?答案也是肯定的。表的别名:
一张表可以自我连接。进行自连接时我们需要一个机制来区分一个表的两个实例。
在FROM clause(子句)中我们可以给这个表取不同的别名, 然后在语句的其它需要使用到该别名的地方
用dot(点)来连接该别名和字段名。我们在这里同样给出两个表来对自连接进行解释。
爱丁堡公交线路,车站表:
stops(id, name)公交线路表:
route(num, company, pos, stop)一、对公交线路表route进行自连接。
SELECT * FROM route R1, route R2
WHERE R1.num=R2.num AND R1.company=R2.company我们route表用字段(num, company)来进行自连接. 结果是什么意思呢?
你可以知道每条公交线路的任意两个可联通的车站。二、用stop字段来对route(公交线路表)进行自连接。
SELECT * FROM route R1, route R2
WHERE R1.stop=R2.stop;查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢。
从这两个例子我们可以看出,自连接的语法结构很简单,但语意结果往往不是
那么容易理解。就我们这里所列出的两个表,如果运用得当,能解决很多实际问题,
例如,任意两个站点之间如何换乘。SELECT R1.company, R1.num
FROM route R1, route R2, stops S1, stops S2
WHERE R1.num=R2.num AND R1.company=R2.company
AND R1.stop=S1.id AND R2.stop=S2.id
AND S1.name='Craiglockhart'
AND S2.name='Tollcross'
MySQL全连接(Full Join)实现,union和union all用法的更多相关文章
- mysql 全连接 报错1051的原因
由于mysql 不支持 直接写full outer join 或者 full join来表示全外连接但是可以用left right union right 代替 下面是例子: select * fro ...
- mysql 全连接和 oracle 全连接查询、区别
oracle的全连接查询可以直接用full on,但是在mysql中没有full join,mysql使用union实现全连接. oracle的全连接 select * from a full joi ...
- mysql全连接
Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+ union+右外连接实现 SELECT * FROM t1 LEFT JOIN t2 ON ...
- mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等
mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...
- SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
SQL 连接 JOIN 例解.(左连接,右连接,全连接,内连接,交叉连接,自连接) 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想-现在在这写写关于它们的作用假设有 ...
- oracle 内连接(inner join)、外连接(outer join)、全连接(full join)
转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...
- MySQL的连接类型
首先我们来创建两个数据表: 结构: 我们用内连接来查看一下: select * from test1 join test2 on test1.aid=test2.aid; 由于内连接是等值连接,所 ...
- 图解SQL inner join、left join、right join、full outer join、union、union all的区别
转于:http://justcoding.iteye.com/blog/2006487 这是一篇来自Coding Horror的文章. SQL的Join语法有很多:有inner的,有outer的,有l ...
- MySQL内连接和外连接
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...
随机推荐
- MongoDB与传统数据库的使用区别——批量插入与批量查询
我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型. 我的回答是:不行,因为MongoDB不是 ...
- 面向新手的Webserver搭建(一)——IIS的搭建
非常多童鞋说自己是做移动开发的,想挂个简单的Web API,但是server又不会搭,这样一来測试就成了问题.看看网上的教程.发现略难懂,并且大多是一个转一个,没价值,所以干脆写几篇文章讲讲简单的We ...
- provider: 命名管道提供, error: 40 - 无法打开 SQL Server 联系)
李和server连接错误. 在连接 SQL Server 2005 时刻.在默认设置 SQL Server 不同意的远程连接可能导致此故障. (provider: 命名管道提供, error: 40 ...
- LTTng调试: 一个系统软件工程师的随手涂鸦
http://nanxiao.me/install-lttng/ http://packages.efficios.com/ http://lttng.org/ http://lttng.org/do ...
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
写在前面 首先声明哈,不是广告,我就是用的时候觉得这个功能比较好玩,就想着实现了一下.效果如图: 接下来简单的说一下思路吧~ 大体思路 可能我们看到这种功能的实现的时候,首先想着的是我在这个控制器中左 ...
- 堆和栈 内存分配 heap stack
Java中的堆和栈 在[函数]中定义的一些[基本类型的变量]和[对象的引用变量]都是在函数的[栈内存]中分配的.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间, ...
- segue生命周期
segue生命周期:概述: 理解segue工作原理,需要理解一个segue对象的生命周期.segue对象是UIStoryboardSegue的实例或者是它的一个子类.所有iOS app都不能直接创建s ...
- c-函数指针(求奇数偶数的和)
#include <stdio.h> /* 编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+...+1/n,当输入 n 为奇数时,调用函数1/1+1/3+...+1/n(利用 ...
- big_table练习数据表
big_table练习数据表 create table big_table as select rownum id, a.* from all_objects a / alter table big_ ...
- 34.Spring-Aop.md
http://blog.csdn.net/bigtree_3721/article/details/50759843 目录 [toc] --- 1.概念 1.1概念 AOP是Spring提供的关键特性 ...
我要投稿