union、union all
语法:
SELECT …
UNION [ALL | DISTINCT]
SELECT …
[UNION [ALL | DISTINCT]
SELECT …]
union用于把两个或者多个select查询的结果集合并成一个
进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致
默认会去掉两个查询结果集中的重复行
默认结果集不排序
最终结果集的列名来自于第一个查询的SELECT列表
UNION = UNION DISTINCT
作用:对两个结果集进行合并
区别:union会进行去重,union all不会进行去重
注意点:两个结果集的列的数量要相等。
mysql> desc t1;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
mysql> desc student;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
±--------±------------±-----±----±--------±------+
6 rows in set (0.00 sec)
mysql> select * from t1 union select * from student;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
例1:得到那些有罚款或者担任队长,或者两个条件都符合的球员的编号
SELECT playerno
FROM teams
UNION
SELECT playerno
FROM penalties;
如果要对合并后的整个结果集进行排序,ORDER BY子句只能出现在最后面的查询中
例:
SELECT playerno
FROM teams
UNION
SELECT playerno
FROM penalties
ORDER BY playerno;
如果要合并的某个查询需要单独进行排序,那么该查询必须用小括号括起来
例:第一个和第二个查询的结果集分别排序后再进行合并,最终的结果集不排序
(SELECT playerno
FROM teams
ORDER BY playerno)
UNION
(SELECT playerno
FROM penalties
ORDER BY playerno);
集合运算符和NULL值
在去重操作时,如果列值中包含NULL值,认为它们是相等的
例:最终结果集中只有1行
SELECT playerno,leagueno
FROM players
WHERE playerno=7
UNION
SELECT playerno,leagueno
FROM players
WHERE playerno=7;
select各个字句执行顺序:
select
from 1
where 2
group by 3
having 4
union/union all 5
order by 6
limit 7