MySQL中SELECT DISTINCT两表城市列与UNION合并城市查询的区别是什么
两条MySQL查询语句的核心区别
两条语句的实际作用
第一条语句
SELECT DISTINCT S.City , C.City FROM Suppliers S,Customers C;
这是没有加连接条件的隐式交叉连接,会先对Suppliers和Customers两个表做笛卡尔积:把供应商表的每一行和客户表的每一行两两拼接,再对拼接后得到的「供应商城市+客户城市」组合去重,最终返回两列数据,分别对应供应商的城市、客户的城市。
第二条语句
SELECT City FROM Suppliers UNION SELECT City FROM Customers;
这是结果集的垂直合并操作,UNION会把两个单字段查询的结果按行拼接,并且自动对合并后的所有城市值去重,最终返回单列的城市列表,内容是两个表中出现过的所有不重复的城市。
核心差异点
- 结果结构不同:第一条返回2列数据,第二条只返回1列数据
- 逻辑本质不同:第一条是两个表的水平拼接,求不重复的城市对组合;第二条是两个结果集的上下拼接,求两个表城市的并集
- 结果量级差异极大:假设供应商表有M个不重复城市,客户表有N个不重复城市,第一条最多返回
M*N条结果,第二条最多返回M+N条结果 - 去重规则不同:第一条是对两个城市的组合去重,只有两个城市同时和已有行重复才会被过滤;第二条是对单个城市值去重,只要值重复就会被过滤
举个简单示例:
假设Suppliers的城市有「上海、北京、广州」3个不重复值,Customers的城市有「北京、广州、深圳」3个不重复值
第一条的输出是9组不重复的城市对:(上海,北京)、(上海,广州)、(上海,深圳)、(北京,北京)、(北京,广州)...共9条2列数据
第二条的输出是4个不重复的城市:上海、北京、广州、深圳,共4条1列数据
内容的提问来源于stack exchange,提问作者Mahmuod Sameh
相关产品推荐
相关产品推荐

