MySQL数据库的UNION语句是一种用于合并两个或多个SELECT语句结果集的强大工具。它返回一个结果集,其中包含所有输入查询的唯一行。不允许查询结果列数不同。
UNION语法的基本形式如下:
SELECT column_name(s) FROM table1 UNION [ALL | DISTINCT] SELECT column_name(s) FROM table2;
在上述语法中,table1和table2是你要从中检索数据的表的名称,column_name(s)是你希望在结果集中包含的列的名称,可以是相同的列名,也可以是不同的列名。ALL和DISTINCT都是可选。使用UNION时,默认使用DISTINCT下会返回所有行的唯一集合。如果两个查询返回的行中有相同的值,则只会返回一次该行。ALL :返回所有结果集,包含重复数据。
假设我们有两个表,一个是博客表(blog),另一个是社区表(community)。这两个表都有"title"和"content"的列。我们想要获取所有标题和内容。
-- ---------------------------- -- Table structure for blog -- ---------------------------- DROP TABLE IF EXISTS `blog`; CREATE TABLE `blog` ( `id` int(8) DEFAULT NULL, `user` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `content` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records of blog -- ---------------------------- INSERT INTO `blog` VALUES ('1', 'John', 'php博客文章1', 'php博客文章内容1'); INSERT INTO `blog` VALUES ('2', 'David', 'php博客文章2', 'php博客文章内容2'); INSERT INTO `blog` VALUES ('3', 'David', 'HTML博客文章', 'HTML博客内容'); -- ---------------------------- -- Table structure for community -- ---------------------------- DROP TABLE IF EXISTS `community`; CREATE TABLE `community` ( `id` int(8) DEFAULT NULL, `users` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `content` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records of community -- ---------------------------- INSERT INTO `community` VALUES ('3', 'Emily', 'HTML社区文章', 'HTML社区文章内容'); INSERT INTO `community` VALUES ('4', 'David', 'HTML社区文章2', 'HTML社区文章内容2'); INSERT INTO `community` VALUES ('5', 'banana', 'CSS社区文章', 'CSS社区文章内容');
博客表原始数据:
mysql> select * from blog; +------+-------+------------------+------------------------+ | id | user | title | content | +------+-------+------------------+------------------------+ | 1 | John | php博客文章1 | php博客文章内容1 | | 2 | David | php博客文章2 | php博客文章内容2 | | 3 | David | HTML博客文章 | HTML博客内容 | +------+-------+------------------+------------------------+
社区表原始数据:
mysql> select * from community; +------+--------+-------------------+-------------------------+ | id | users | title | content | +------+--------+-------------------+-------------------------+ | 3 | Emily | HTML社区文章 | HTML社区文章内容 | | 4 | David | HTML社区文章2 | HTML社区文章内容2 | | 5 | banana | CSS社区文章 | CSS社区文章内容 | +------+--------+-------------------+-------------------------+
我们可以使用UNION语句来合并这两个表的结果,如下所示:
mysql> SELECT title,content FROM blog -> UNION -> SELECT title,content FROM community; +-------------------+-------------------------+ | title | content | +-------------------+-------------------------+ | php博客文章1 | php博客文章内容1 | | php博客文章2 | php博客文章内容2 | | HTML博客文章 | HTML博客内容 | | HTML社区文章 | HTML社区文章内容 | | HTML社区文章2 | HTML社区文章内容2 | | CSS社区文章 | CSS社区文章内容 | +-------------------+-------------------------+
这将返回一个包含所有标题和内容的结果集。
mysql> SELECT id,user FROM blog -> UNION -> SELECT id,users FROM community where users like '%Em%'; +------+-------+ | id | user | +------+-------+ | 1 | John | | 2 | David | | 3 | David | | 3 | Emily | +------+-------+
两张表用于记录用户名的字段名称不一样分别是"user","use"。以第一张表的user为列表。
mysql> SELECT user FROM blog -> UNION -> SELECT users FROM community; +--------+ | user | +--------+ | John | | David | | Emily | | banana | +--------+
mysql> SELECT user FROM blog -> UNION all -> SELECT users FROM community; +--------+ | user | +--------+ | John | | David | | David | | Emily | | David | | banana | +--------+
这把重复的数据都显示出来。
在使用UNION语句时,有几个注意事项需要考虑:
列数和类型:确保你在每个SELECT语句中选择的列的数量和类型是一致的。如果列的数量或类型不匹配,UNION语句将无法执行。
排序:默认情况下,UNION语句的结果集是无序的。如果你需要按照某种特定的顺序返回结果,你需要使用ORDER BY子句。
性能:虽然UNION语句可以方便地合并两个或多个表的结果集,但它在性能方面可能不是最佳选择。如果可能,你应该考虑使用JOIN语句来连接表并检索你需要的数据。
空值:如果某个SELECT语句返回的行中包含NULL值,而另一个SELECT语句中没有NULL值,那么UNION语句的结果集中将包含NULL值。如果你希望排除这些NULL值,你可以使用IS NOT NULL条件来过滤结果。