15-合并查询结果
8.9 合并查询结果
本节视频教学录像:2分钟MySQL中使用UNION关键字,可以将多个SELECT结果集合并为单个结果集,但要求参加合并的结果集对应的列数和数据类型必须相同。在第一个SELECT语句中被使用的列名称也被用于结果的列名称。语法格式如下。
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
语法中不使用关键词ALL,则所有返回的行都是唯一的,就好像对整个结果集合使用了DISTINCT一样。如果指定了ALL,SELECT语句中得到所有匹配的行都会出现。DISTINCT关键词是一个自选词,不起任何作用,但是根据SQL标准的要求,在语法中允许采用。
【范例8-46】
查询女生的信息或年龄大于20的学生信息。
MySQL> select -> from student -> where ssex='女' -> union -> select -> from student -> where sage>20;
结果如下。
+-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| | 4|孟欣 |女 | 21|信管 | | 2|周松 |男 | 21|计算机| +-----+-------+------+------+--------+ 3 rows in set (0.09 sec)
可以看一下参加合并的两个查询单独执行的结果。
MySQL> select * -> from student -> where ssex='女'; +-----+-------+------+------+--------+ | sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| | 4|孟欣 |女 | 21|信管 | +-----+-------+------+------+--------+ 2 rows in set (0.00 sec)
年龄大于20岁的学生信息。
MySQL> select * -> from student -> where sage>20; +-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 2|周松 |男 | 21|计算机| | 4|孟欣 |女 | 21|信管 | +-----+-------+------+------+--------+ 2 rows in set (0.00 sec)
可以看到,学生孟欣的记录在两个查询中都出现了,但合并的结果只出现了一次,因为没有加关键字ALL,系统自动删除了所有重复的行。
范例中如果加上关键字ALL, 结果如下。
MySQL> select -> from student -> where ssex='女' -> union all -> select -> from student -> where sage>20; +-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| | 4|孟欣 |女 | 21|信管 | | 2|周松 |男 | 21|计算机| | 4|孟欣 |女 | 21|信管 | +-----+-------+------+------+--------+ rows in set (0.00 sec)
加入关键字ALL之后,两个查询中所有符合条件的记录都出现在结果中,没有消除重复记录。