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:合并查询结果,保留重复的行。