Union和Union All的区别
SQL 的Union操作符合并两个或者多个select语句的结果.
请注意:Union内部的每个select语句必须拥有相同数量的列,且列必须有相似的数据类型,同时select语句中列的顺序必须相同.
table1
建表语句:
CREATE TABLE `table1`( `id` INT(2) AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(2), `age` INT(2) ) INSERT INTO table1 VALUES('1','A','2'); INSERT INTO table1 VALUES('2','B','3'); INSERT INTO table1 VALUES('3','C','2'); INSERT INTO table1 VALUES('4','D','4');
table2
建表语句:
CREATE TABLE `table2`( `id` INT(2)AUTO_INCREMENT PRIMARY KEY, `name`VARCHAR(2), `age`INT(2) ) INSERT INTO table2 VALUES('1','a','2'); INSERT INTO table2 VALUES('2','b','5'); INSERT INTO table2 VALUES('3','c','2'); INSERT INTO table2 VALUES('4','d','3');
SQL Union语法:
eg:
1.1:执行sql
SELECT age FROM table1 UNION SELECT age FROM table2
1.2:结果
结论:默认地Union操作符作查询操作查询的值不得重复.不区分大小写.如果允许有重复的值请使用Union All
2.1:执行sql
SELECT age FROM table1 UNION SELECT `name` FROM table2
2.2:结果
结论:Union操作列名总是等于Union中第一个select中的列名
3.1:Union和Union All查询出的结果默认都不会进行排序,上面展示的数据貌似排序但是只是数据碰巧故此做出以下数的改变来证名我们的观点
3.1.1:将表一的第二条记录的age字段进行调整如下
3.1.2:执行sql
SELECT `age` FROM table1 UNION SELECT `age` FROM table2
3.1.3:结果
3.1.4:结论:Union操作后不会自动进行排序
SELECT `age` FROM table1 UNION SELECT `age` FROM table2 ORDER BY age
4.1.2:结果
注意1:Order By后面根据哪个字段排序,此字段必须是在Union连接的Select中都存在的字段.且两个表中都必须存在此字段.
执行sql
SELECT `age`,`sex` FROM table1 UNION SELECT `age` FROM table2 ORDER BY sex
结果: 报错—>Unknown column ‘sex’ in ‘field list’
执行sql
SELECT `age` FROM table1 UNION SELECT `age` FROM table2 ORDER BY sex
结果: 报错—>Unknown column ‘sex’ in 'order clause
原因是要在select 后面加上分组的字段
SELECT `age`,`sex` FROM table1 UNION SELECT `age`,`sex` FROM table2 ORDER BY sex
结果:
证实了***注意1***
4.2:Union操作多字段如何排序
前面我们说了Union操作查询的值不重复,但是从上面看按照sex分组为女男男男,有三个男有重复的值.
注意2:此时的重复值判断标准是按照查询出的字段联合判断的重复值,而并非通过某一个字段进行重复的判断.
证实注意2:
table1添加score字段
table2添加score字段
执行sql
SELECT `age`,`sex`,`score` FROM table1 UNION SELECT `age`,`sex` ,`score` FROM table2 ORDER BY score
结果
证实了注意2
根据score分组,Union虽然select出的值没有重复,它是根据age+sex+score三个字段联合来判断是否是重复的值.而非某一个字段来判断重复的值.
SQL Union All语法
Union All 同Union的上部分的那些特性一致,只是它select出来的会有重复的值.