## 数据库表 ##
使用Mysql 5.7版本进行验证。
## sql查询 ##
UNION是将多个结果连接在一起,需要注意保持连接的结果列的数量需要保持相同。UNION会以第一个的列的名称进行返回结果,在使用的时候需要多加注意,例如:
SELECT
grade,id,NAME
FROM
student
UNION
SELECT
id,NAME,grade
FROM
student
WHERE
id < 2
===============结果==================
grade id name
------------------------------------
10 1 Allen
90 2 Lol
50 3 meil
89 4 lily
1 Allen 10
首先UNION查询
SELECT
id,name,grade
FROM
student
UNION
SELECT
id,name,grade
FROM
student
;
===============结果==================
id name grade
------------------------------------
1 Allen 10
2 Lol 90
3 meil 50
4 lily 89
使用UNION ALL
SELECT
id,name,grade
FROM
student
UNION ALL
SELECT
id,name,grade
FROM
student;
===============结果==================
id name grade
------------------------------------
1 Allen 10
2 Lol 90
3 meil 50
4 lily 89
1 Allen 10
2 Lol 90
3 meil 50
4 lily 89
从上面可以看出,UNION和UNION ALL的区别在于对重复结果的处理。
再来试一试select不同的顺序是否对查询结果有什么影响
一、
SELECT
id,name,grade
FROM
student
WHERE
id < 2
UNION
SELECT
id,name,grade
FROM
student
WHERE id > 1;
===============结果==================
id name grade
------------------------------------
1 Allen 10
2 Lol 90
3 meil 50
4 lily 89
二、
SELECT
id,NAME,grade
FROM
student
WHERE id > 1
UNION
SELECT
id,NAME,grade
FROM
student
WHERE
id < 2;
===============结果==================
id name grade
------------------------------------
2 Lol 90
3 meil 50
4 lily 89
1 Allen 10
结果是相同的,可见,sql语句的顺序是不影响结果的。但是两次结果的顺序却是不一样的。两次查询到的结果是第一条sql的查询结果在前,第二条的sql查询结果在后进行排序。
那么如何对结果进行自定义排序呢?
对结果可使用order by进行排序,但是order by需要在最后使用,在第一个SQL中使用,则会出现错误。
一、
SELECT
id,NAME,grade
FROM
student
order by id desc
UNION
SELECT
id,
NAME,
grade
FROM
student
WHERE
id < 2;
===============结果==================
[Err] 1221 - Incorrect usage of UNION and ORDER BY
二、
SELECT
id,NAME,grade
FROM
student
UNION
SELECT
id,NAME,grade
FROM
student
WHERE
id < 2
order by id desc;
===============结果==================
id name grade
------------------------------------
4 lily 89
3 meil 50
2 Lol 90
1 Allen 10
三、
SELECT
id,NAME,grade
FROM
student
UNION
SELECT
id,NAME,grade
FROM
student
WHERE
id < 2
===============结果==================
id name grade
------------------------------------
1 Allen 10
2 Lol 90
3 meil 50
4 lily 89
UNION的自动排序规则暂未研究。