## 数据库表 ##
使用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的自动排序规则暂未研究。