-
2021-03-13 22:49:21
Oracle有很多值得学习的地方,这里我们主要介绍Oracle UNION ALL,包括介绍UNION等方面。通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。假如有column没有被索引,查询效率可能会因为您没有选择OR而降低。在下面的例子中,LOC_ID 和REGION上都建有索引。
高效:
SELECT LOC_ID 。 LOC_DESC ,REGION FROM LOCATION WHERELOC_ID=10UNION SELECT LOC_ID ,
LOC_DESC ,REGION FROM LOCATION WHEREREGION= “MELBOURNE”
低效:
SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERELOC_ID=10ORREGION= “MELBOURNE”
用IN来替换OR:
这是一条简单易记的规则,但是实际的执行效果还须检验,在Oracle8i下,两者的执行路径似乎是相同的:
低效:
SELECT…. FROM LOCATION WHERELOC_ID=10ORLOC_ID=20ORLOC_ID=30
高效:
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
避免在索引列上使用IS NULL和IS NOT NULL:
避免在索引中使用任何能够为空的列,Oracle将无法使用该索引。对于单列索引,假如列包含空值,索引中将不存在此记录。对于复合索引,假如每个列都为空,索引中同样不存在此记录。假如至少有一个列不为空,则记录存在于索引中。举例:假如唯一性索引建立在表的A列和B列上,并且表中存在一条记录的 A,B值为(123,null), Oracle将不接受下一条具备相同A,B值(123,null)的记录(插入)。然而假如任何的索引列都为空,Oracle将认为整个键值为空而空不等于空。因此您能够插入1000 条具备相同键值的记录,当然他们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。
总是使用索引的第一个列:
假如索引是建立在多个列上,只有在他的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引。这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。
用Oracle UNION ALL替换UNION ( 假如有可能的话):
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以Oracle UNION ALL的方式被合并,然后在输出最终结果前进行排序。假如用 Oracle UNION ALL替代UNION,这样排序就不是必要了。效率就会因此得到提高。需要注意的是,Oracle UNION ALL将重复输出两个结果集合中相同记录。因此各位还是要从业务需求分析使用Oracle UNION ALL的可行性。 UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存。对于这块内存的优化也是相当重要的。
===================================================================================
Union和Union all用法
UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。 union只是将两个结果联结起来一起显示,并不是联结两个表
UNION 的语法如下: [SQL 语句 1]
UNION
[SQL 语句 2] 假设我们有以下的两个表格,
Store_Information 表格 store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格 Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales 结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。
SQL Union All
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]
UNION ALL
[SQL 语句 2] 我们用和上一页同样的例子来显示出 UNION ALL 和 UNION 的不同。同样假设我们有以下两个表格:
Store_Information 表格 store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格 Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的SQL语句:
SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales 结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
============
表1
A B
a 1
b 0
c 3
d 0
e 2
表2
A B
c 0
e 4
合并两个表除去重复的数据(以表2的数据为主),我们将会得到以下的表:
A B
a 1
b 0
c 0
d 0
e 4
select A,B from 表1 where A not in(select A from 表2)
union
select A,B from 表2
值得注意的是,sql union all的执行效率要比sql union效率要高很多,这是因为,使用sqlunion需要进行排重,而sql union All是不需要排重的,这一点非常重要,因为对于一些单纯地使用分表来提高效率的查询,完全可以使用sql union All。
还有,如果使用了union,无论是sql union还是sql union all一定要记住对数据库表加上索引!
--合并重复行 select * from A union select * from B --不合并重复行 select * from A union all select * from B 按某个字段排序 --合并重复行 select * from ( select * from A union select * from B) AS T order by 字段名 --不合并重复行 select * from ( select * from A union all select * from B) AS T order by 字段名 //sql server版 Select * From ( select top 2 id,adddate,title,url from bArticle where ClassId=1 order by adddate desc) A Union All Select * From ( select top 2 id,adddate,title,url from bArticle where ClassId=2 order by adddate desc) B Union All Select * From ( select top 2 id,adddate,title,url from bArticle where ClassId=3 order by adddate desc) C Union All Select * From ( select top 2 id,adddate,title,url from bArticle where ClassId=4 order by adddate desc) D //mysql版 Select * From ( select id,adddate,title,url from bArticle where ClassId=1 order by adddate desc limit 0,2) A Union All Select * From ( select id,adddate,title,url from bArticle where ClassId=2 order by adddate desc limit 0,2) B Union All Select * From ( select id,adddate,title,url from bArticle where ClassId=3 order by adddate desc limit 0,2) C Union All Select * From ( select id,adddate,title,url from bArticle where ClassId=4 order by adddate desc limit 0,2) D
更多相关内容 -
Mysql联合查询UNION和UNION ALL的使用介绍
2021-01-19 22:27:42一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中... -
MySQL中UNION与UNION ALL的基本使用方法
2020-09-08 23:39:51主要给大家介绍了关于MySQL中UNION与UNION ALL的基本使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 -
Oracle中Union与Union All的区别(适用多个数据库)
2020-09-11 01:47:14如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来 -
UNION ALL 的使用方法
2019-07-03 08:46:15SELECT ... UNION ALL SELECT C.TRD_NO FROM XXXXXXXXX C WHERE C.CLIENT_CD = W_IN_CLIENT_CD ) D WHERE A.TRD_NO = D.TRD_NO AND A.CLIENT_CD = W_IN_CLIENT_CD AND A.RESULT IS NULL ; -
MySQL如何使用union all获得并集排序
2020-09-08 21:55:18主要介绍了MySQL如何使用union all获得并集排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
SQL语句之Union和Union All的用法
2020-12-15 15:03:25SQL中Union和Join语句非常类似,但是Union有一个限制条件:两个 SQL 语句所产生的栏位需要是同样的资料种类,最后的结果会看到不同的资料值。 格式: [SQL 语句 1] UNION [SQL 语句 2] 例如: 表store_info 和表... -
MySQL中使用or、in与union all在查询命令下的效率对比
2020-12-15 10:06:53OR、in和union all 查询效率到底哪个快? 网上很多的声音都是说union all 快于 or、in,因为or、in会导致全表扫描,他们给出了很多的实例。 但真的union all真的快于or、in? EXPLAIN SELECT * from employees ... -
Sql学习第一天——SQL UNION 和 UNION ALL 操作符认识
2021-01-19 22:14:57关于SQL UNION 操作符 UNION 操作符用于合并... SQL UNION 语法(结果集没有重复值): 代码如下: SELECT s FROM table1 UNION SELECT s FROM table2 SQL UNION ALL 语法(结果集有重复的值): 代码如下: SELECT s FRO -
sql 查询结果合并union all用法_数据库技巧
2020-12-15 10:38:21代码如下:–合并重复行 select * from A union select * from B –不合并重复行 select * from A union all select * from B 按某个字段排序 –合并重复行 select * from ( select * from A union select * from B) ... -
浅析mysql union和union all
2020-12-16 11:49:04在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算... -
简单了解MySQL union all与union的区别
2020-12-14 08:37:48union 是对数据进行并集操作,不包括重复行,同时进行默认排序Union all 是对数据进行并集操作,包括重复行,不进行排序举例说明: 创建数据库表: CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` ... -
sqlserver Union和SQL Union All使用方法
2020-12-15 14:48:34SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中...SQL UNION ALL 语法SELECT -
数据库中union 与union all 的区别
2020-09-11 07:38:00当我们要对两个或两个以上的表进行操作时。我们经常会用到union 与union all -
sql Union和Union All的使用方法
2020-09-11 09:11:33UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料。 -
5分钟了解MySQL5.7中union all用法的黑科技
2020-09-09 17:57:27本文带领大家通过5分钟了解MySQL5.7中union all用法的黑科技,需要的朋友可以参考下 -
使用UNION ALL代替IF语句的合并处理案例
2020-03-03 23:56:52我们可以经常发现在处理SQL Server的时,很多人都会有一句出结果的习惯,但值得注意的是,不恰当的合并处理语句,往往会产生负面的性能,本文针对使用UNION ALL代替IF语句的合并处理做出一个简单的事例,用来说明... -
Mssql Union 与 Union All区别,用union还是union all主要看业务需求.docx
2021-11-07 10:42:51Mssql Union 与 Union All区别,场景示例说明 -
mysql的union和union all
2022-03-14 22:54:121. sql中 union 和 union all 的用法 如果我们需要将两个 select 语句的结果作为一个整体显示出来,我们就需要用到 union 或者 union all 关键字。union (或称为联合)的作用是将多个结果合并在一起显示出来。 ...1. sql中 union 和 union all 的用法
如果我们需要将两个 select 语句的结果作为一个整体显示出来,我们就需要用到 union 或者 union all 关键字。union (或称为联合)的作用是将多个结果合并在一起显示出来。
union 和 union all 的区别是,union 会自动压缩多个结果集合中的重复结果,而 union all 则将所有的结果全部显示出来,不管是不是重复。
union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表 union。
如下sql:SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK' UNION SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
结果:
union all:对两个结果集进行并集操作,包括重复行,不进行排序; 如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
如下sql:SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK' UNION ALL SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
结果:
2. 注意事项
2.1、UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列
2.2、每条 SELECT 语句中列的顺序必须相同
-
先来说下,如果顺序不同,会是什么结果?
答:结果字段的顺序以union all 前面的表字段顺序为准。
union all 后面的表的数据会按照顺序依次附在后面。注意:按照字段顺序匹配,而不是按照字段名称匹配。 -
sql如下:顺序对结果的影响
SELECT * FROM( SELECT msku,create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK' UNION ALL SELECT create_time,msku FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK') t
综上:
union all 结果字段的顺序以 union all 前面的表字段顺序为准。union all 后面的表的数据会按照字段顺序依次附在后面,而不是按照字段名称匹配。
我们上面以*来表示顺序的不同,其实你写成不同顺序的字段结果一致。
3. union all 使用场景
修改前:组合in sql
SELECT ***, ***, ***, ***, *** FROM e_rating_info WHERE rating_quantity <> 0 AND (***, ***) IN (('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***'), ('***', '***')) ORDER BY *** DESC
修改后:UNION ALL sql
<select id="queryRatingInfo" resultType="***"> <foreach collection="ratingList" item="item" index="index" open="" separator="UNION ALL" close=""> SELECT ***, ***, ***, ***, *** FROM e_rating_info WHERE rating_quantity <> 0 AND country_code = #{item.***} AND asin = #{item.***} </foreach> ORDER BY *** DESC; </select>
另外,如果系统中进行了分表,一定要保证各个表的字段顺序一致。特别是修改的时候。否则,如果使用 *汇总查询结果,肯定是会有问题的…亲身踩坑。
-
-
oracle中union和union all区别与性能分析
2021-05-08 07:53:35[ 概要 ]经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并,那么二者有什么区别呢? 下面我们就简单的分析下.[ 比较 ]union: 对两个结果集进行并集操作, 不...[ 概要 ]
经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并,
那么二者有什么区别呢? 下面我们就简单的分析下.
[ 比较 ]
union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序;
union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;
下面我们举一个简单的例子来证明上面的结论:
1. 准备数据:
drop table student;
create table student
(
id int primary key,
name nvarchar2(50) not null,
score number not null
);
insert into student values(1,‘Aaron‘,78);
insert into student values(2,‘Bill‘,76);
insert into student values(3,‘Cindy‘,89);
insert into student values(4,‘Damon‘,90);
insert into student values(5,‘Ella‘,73);
insert into student values(6,‘Frado‘,61);
insert into student values(7,‘Gill‘,99);
insert into student values(8,‘Hellen‘,56);
insert into student values(9,‘Ivan‘,93);
insert into student values(10,‘Jay‘,90);
commit;
2. 比较不同点
查询比较①
-- union all
select * from student where id
union all
select * from student where id > 2 and id
-- union
select * from student where id
union
select * from student where id > 2 and id
union all 查询结果:
union 查询结果:
通过比较不难看出, union all不会去掉重复记录, 而union去掉了重复的记录.
查询比较②
-- union all
select * from student where id > 2 and id
union all
select * from student where id
-- union
select * from student where id > 2 and id
union
select * from student where id
union all 查询结果:
union 查询结果:
通过比较不难看出, union all会按照关联的次序组织数据, 而union会依据一定的规则进行排序.
那么这个规则是什么呢? 我们通过下面的查询得出规律:
-- union
select score,id,name from student where id > 2 and id
union
select score,id,name from student where id
结论: 按照字段出现的顺序进行排序, 之前的查询相当于order by id, name, score, 刚刚的查询相当于order by score, id, name.
[ 总结 ]
1. 因为union all仅仅是简单的合并查询结果, 并不会做去重操作, 也不会排序, 所以union all效率要比union高.
所以在能够确定没有重复记录的情况下, 尽量使用union all.
2. 通常如果表有多个索引列时, 用union替换where子句中的or会起到较好的效果, 索引列使用or会造成全表扫描.
注意: 以上规则只针对多个索引列有效, 假如有column没有被索引, 那还是用or吧.
例如: 还是使用上面的例子, 假定name和score上建有索引.
1 -- 高效2 select id, name, score from student where name like ‘%y%‘3 union4 select id, name, score from student where score between 80 and 905
6 -- 低效7 select id, name, score from student where name like ‘%y%‘ or score between 80 and 90
-
union all与order by用法
2012-12-19 09:33:19union all与order by用法,并详细举例,oracle pl/sql -
MySQL:UNION、UNION ALL以及7种SQL JOINS的实现
2021-12-13 11:26:08MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。 合并查询结果 ...各个SELECT语句之间使用UNION或UNION ALL关键字分隔。 语法格式: SELECT column,... FROM table1 UNION [ALL] SELEC..写在开头:跟随B站的康师傅学习mysql的笔记摘要和自我总结。
前言:
-
虽然MySQL不支持FULL JOIN(满外连接),但是可以用
LEFT JOIN UNION RIGHT JOIN代替。
-
利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,
两个表对应的列数和数据类型必须相同,并且相互对应。
各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
语法格式:
SELECT column,... FROM table1 UNION [ALL] SELECT column,... FROM table2
UNION操作符
UNION 操作符返回两个查询的结果集的并集,
去除重复记录
。UNION ALL操作符
UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,
则尽量使用UNION ALL语句,以提高数据查询的效率。
举例:查询部门编号>90或邮箱包含a的员工信息
#方式1 SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90; #方式2 #一个员工可能符合所有条件,所以要去重 SELECT * FROM employees WHERE email LIKE '%a%' UNION SELECT * FROM employees WHERE department_id>90;
举例:查询中国用户中男性的信息以及美国用户中年男性的用户信息
#由题目可知,该两者之间无任何关联,所以不用去重,UNION ALL 效率高 SELECT id,cname FROM t_chinamale WHERE csex='男' UNION ALL SELECT id,tname FROM t_usmale WHERE tGender='male';
7种SQL JOINS的实现(重点!)
- 7种SQL JOINS 可以归纳为以下图形:
代码实现
以employees表和departments表为例:
#中图:内连接(A B 共有) SELECT employee_id,last_name,department_name FROM employees e JOIN departments d ON e.`department_id` = d.`department_id`;
#左上图:左外连接(A 的全集) SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id`;
#右上图:右外连接(B 的全集) SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
#左中图:(A 的独有) SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL
#右中图:(B 的独有) SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL
#左下图:满外连接 SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL #没有去重操作,效率高 SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
#右下图(A 的独有 + B 的独有) SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL
课后练习题加强:
t_dept表、t_emp表如图所示:
#例题1.所有有门派的人员信息 ( A、B两表共有) SELECT t1.* FROM t_dept t1 INNER JOIN t_emp t2 ON t1.`id` = t2.`id`;
#例题2.列出所有用户,并显示其机构信息 (A的全集) SELECT t1.* FROM t_emp t1 LEFT JOIN t_dept t2 ON t1.`id` = t2.`id`;
#例题3.列出所有门派 (B的全集) SELECT * FROM t_dept ;
#例题4.所有不入门派的人员 (A的独有) SELECT t1.* FROM t_emp t1 LEFT JOIN t_dept t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL;
#例题5.所有没人入的门派 (B的独有) SELECT t1.* FROM t_dept t1 LEFT JOIN t_emp t2 ON t1.`id` = t2.`id` WHERE t2.id IS NULL;
#例题6.列出所有人员和机构的对照关系(AB全有) SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id UNION SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id #查询结果: +------+----------+------+--------+--------+------+----------+---------+ | id | name | age | deptId | empno | id | deptName | address | +------+----------+------+--------+--------+------+----------+---------+ | 1 | 风清扬 | 90 | 1 | 100001 | 1 | 华山 | 华山 | | 2 | 岳不群 | 50 | 1 | 100002 | 1 | 华山 | 华山 | | 3 | 令狐冲 | 24 | 1 | 100003 | 1 | 华山 | 华山 | | 4 | 洪七公 | 70 | 2 | 100004 | 2 | 丐帮 | 洛阳 | | 5 | 乔峰 | 35 | 2 | 100005 | 2 | 丐帮 | 洛阳 | | 6 | 灭绝师太 | 70 | 3 | 100006 | 3 | 峨眉 | 峨眉山 | | 7 | 周芷若 | 20 | 3 | 100007 | 3 | 峨眉 | 峨眉山 | | 8 | 张三丰 | 100 | 4 | 100008 | 4 | 武当 | 武当山 | | 9 | 张无忌 | 25 | 5 | 100009 | 5 | 明教 | 光明顶 | | 10 | 韦小宝 | 18 | NULL | 100010 | NULL | NULL | NULL | | NULL | NULL | NULL | NULL | NULL | 6 | 少林 | 少林寺 | +------+----------+------+--------+--------+------+----------+---------+
#例题7.列出所有没入派的人员和没人入的门派(A的独有 + B的独有) SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id WHERE B.`id` IS NULL UNION ALL SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id WHERE A.`deptId` IS NULL; #查询结果; +------+--------+------+--------+--------+------+----------+---------+ | id | name | age | deptId | empno | id | deptName | address | +------+--------+------+--------+--------+------+----------+---------+ | 10 | 韦小宝 | 18 | NULL | 100010 | NULL | NULL | NULL | | NULL | NULL | NULL | NULL | NULL | 6 | 少林 | 少林寺 | +------+--------+------+--------+--------+------+----------+---------+
爱在结尾:1、UNION ALL 效率比 UNION 高,尽量使用 UNION ALL。 2、若查询A表中独有的数据,查询条件的
is (not) null
对应的字段应该选择B表中为非空的字段。 3、left join (right join) 要理解其作用:在不加筛选条件下,用left join 可以查到所有的字段。 -