UNION 与 UNION ALL 的区别

UNION:合并查询结果,并去掉重复的行。

UNION ALL:合并查询结果,保留重复的行。

举例验证说明:

创建两个表:user_info 和 user_info_b,设置联合主键约束,联合主键的列是(user_id 和 user_name),并在两个表中分别插入数据。

SQL语句如下:

 1 create table user_info
 2 (
 3     user_id VARCHAR(3),
 4     user_name VARCHAR(32) ,
 5     user_gender VARCHAR(2) NOT NULL,
 6     user_nation VARCHAR(7) NOT NULL,
 7     user_info_affiliate VARCHAR(12) NOT NULL,
 8     PRIMARY KEY (user_id,user_name)
 9 )
10 
11 create table user_info_b
12 (
13     user_id_b VARCHAR(3) ,
14     user_name_b VARCHAR(32) ,
15     user_gender_b VARCHAR(2) NOT NULL,
16     user_nation_b VARCHAR(7) NOT NULL,
17     user_info_b_affiliate VARCHAR(12) NOT NULL,
18     PRIMARY KEY (user_id_b,user_name_b)
19 )
20 
21 insert into user_info
22 values ('001','秦始皇','','中国','user_info')
23 
24 insert into user_info
25 values ('002','刘邦','','中国','user_info')
26 
27 insert into user_info
28 values ('003','赵匡胤','','中国','user_info')
29 
30 insert into user_info
31 values ('004','成吉思汗','','中国','user_info')
32 
33 insert into user_info
34 values ('005','朱元璋','','中国','user_info')
35 
36 insert into user_info
37 values ('006','孙中山','','中国','user_info')
38 
39 insert into user_info
40 values ('007','武则天','','中国','user_info')
41 
42 insert into user_info
43 values ('008','孝庄太后','','中国','user_info')
44 
45 
46 insert into user_info_b
47 values ('001','华盛顿','','美国','user_info_b')
48 
49 insert into user_info_b
50 values ('002','杰斐逊','','美国','user_info_b')
51 
52 insert into user_info_b
53 values ('003','林肯','','美国','user_info_b')
54 
55 insert into user_info_b
56 values ('004','肯尼迪','','美国','user_info_b')
57 
58 insert into user_info_b
59 values ('005','朴槿惠','','韩国','user_info_b')
60 
61 insert into user_info_b
62 values ('006','默克尔','','德国','user_info_b')
63 
64 insert into user_info_b
65 values ('007','撒切尓夫人','','英国','user_info_b')
66 
67 insert into user_info_b
68 values ('008','特蕾莎·梅','','英国','user_info_b')

表创建好并插入数据后,我们查询下表里面的内容信息。

先查询user_info表,查询语句如下:

 1 select * from user_info 

查询结果:

再查询user_info_b表,查询语句如下:

 1 select * from user_info_b 

查询结果:

通过查询结果,我们看到,user_info表里有2条 user_gender = '女'的记录,user_info_b表里有4条 user_gender_b = '女'的记录。

现在有一个查询的任务,任务要求是:在两张表里查询女性用户的国籍,查询结果要求用性别和国籍两个字段展示。

好,我们写SQL语句,语句如下:

1  select user_gender,user_nation from user_info
2  where user_gender =''
3  UNION 
4  select user_gender_b,user_nation_b from user_info_b
5  where user_gender_b =''

执行结果:

查询结果只有4条记录,但是,我们知道,两张表里女性记录共有2+4=6条,为什么会这样呢?

原因是:UNION操作,合并查询结果,并去掉重复的行。

在user_info表中,有2条 (user_gender = '女'  and user_nation = '中国')的记录 ;

在user_info_b表中,也有2条(user_gender = '女'  and user_nation = '英国')的记录

UNION查询后,去掉重复行保留1行,本来4条(user_gender = '女' )记录,保留为2条。

我们知道,实际上有6为女性用户,UNION查询结果只有4条,造成真实数据缺失,一般在这样的情况下,我们用UNION  ALL就能避免上述问题的产生。

上述语句修改如下:

1 select user_gender,user_nation from user_info
2 where user_gender =''
3 UNION ALL
4 select user_gender_b,user_nation_b from user_info_b
5 where user_gender_b =''

我们再来看下查询结果:

最后,我们再来复盘下 UNION 与UNION ALL的区别:

UNION:合并查询结果,并去掉重复的行。

UNION ALL:合并查询结果,保留重复的行。

 

posted @ 2022-05-20 18:27  美人她爹  阅读(315)  评论(0编辑  收藏  举报