通过UNION,可以组合多条SELECT语句,并且将它们的结果组合成一个结果集返回,就叫做复合查询。
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔。
UNION中的每个查询必须包含相同的列、表达式或聚合函数,不过,各个列不需要以相同的次序列出。
Students表:
| id | class_id | name | gender | score | | --- | -------- | ---- | ------ | ----- | | 1 | 1 | 小明 | M | 90 | | 2 | 1 | 小红 | F | 95 | | 3 | 1 | 小军 | M | 88 | | 4 | 1 | 小米 | F | 73 | | 5 | 2 | 小白 | F | 81 | | 6 | 2 | 小兵 | M | 55 | | 7 | 2 | 小林 | M | 85 | | 8 | 3 | 小新 | F | 91 | | 9 | 3 | 小王 | M | 89 | | 10 | 3 | 小丽 | F | 88 |
SELECT name, score FROM Students WHERE score > 90 UNION SELECT name, score FROM Students WHERE name = '小兵'; | name | score | |------|-------| | 小兵 | 55 | | 小红 | 95 | | 小新 | 91 |
这条语句由两条SELECT语句组成,之间用UNION关键字分隔,最终返回一个查询结果集。
默认情况下,UNION会从查询结果集中自动去除重复的行。
SELECT name, score FROM Students WHERE score > 90 UNION SELECT name, score FROM Students WHERE name = '小红'; | name | score | |------|-------| | 小红 | 95 | | 小新 | 91 |
如果想返回所有的匹配行,可使用UNION ALL而不是UNION。
SELECT name, score FROM Students WHERE score > 90 UNION ALL SELECT name, score FROM Students WHERE name = '小红'; | name | score | |------|-------| | 小红 | 95 | | 小新 | 91 | | 小红 | 95 |