首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么"SELECT DISTINCT a,b FROM ..."返回的记录少于"SELECT DISTINCT A +'|' + B FROM ......"?

"SELECT DISTINCT a,b FROM ..."返回的记录少于"SELECT DISTINCT A +'|' + B FROM ......"是因为两个查询语句的结果集不同。

在第一个查询语句中,使用了"SELECT DISTINCT a,b",表示只返回不重复的a和b的组合。这意味着如果有多个记录具有相同的a和b值,只会返回其中的一条记录。

而在第二个查询语句中,使用了"SELECT DISTINCT A +'|' + B",表示返回不重复的A和B的组合,并且将它们拼接成一个字符串。这意味着即使有多个记录具有相同的A和B值,它们拼接后的字符串可能是不同的,因此会返回更多的记录。

举个例子来说明:

假设有以下数据:

a

b

A

B

1

2

a

b

1

2

a

b

1

2

c

d

对于第一个查询语句"SELECT DISTINCT a,b FROM ...",结果集只会返回一条记录:(1, 2)。

对于第二个查询语句"SELECT DISTINCT A +'|' + B FROM ......",结果集会返回两条记录:"a|b"和"c|d"。

因此,第一个查询语句返回的记录少于第二个查询语句。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

97- 优化select distinct owner from tbig

朋友发来一个SQL: select distinct owner from tbig where owner is not null; 已知tbig表很大, owner 的唯一值个数比较少, 问如何利用...owner字段上的普通索引,让上面的查询做到最优(不考虑位图索引和物化视图的方法) (tbig表几千万记录以上, 如果要模拟, 可以通过dba_object几次复制, 生成几十万记录就可以了, 然后创建...not null ; 有个学员也给出了他的写法: with r(owner) as ( select owner from (select t.owner from tbig t where t.owner...下面再把这个sql"简化"一下, 看看你能不能在上面的基础上, 用最优的方法得到下面的结果(owner 字段定义是可为null): select distinct owner from tbig;...就是上面的SQL去掉了where owner is not null, 如果owner有null值,也要返回.有兴趣的朋友可以在留言区留言或加本人微信(ora_service)讨论,可能你的方法比我能想到的方法更好

42710

Hive性能优化统计每日IP CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logda

例如,若有以下查询: SELECT a,b FROM q WHERE e<10; 在实施此项查询中,Q 表有 5 列(a,b,c,d,e),Hive 只读取查询逻辑中真实需要 的 3 列 a、b、e,...All SELECT auction_string_id AS auction_id FROM auctions) b ON a.auction_id=b.auction_id 比分别过滤数字 id,...把 这个 SQL 换成 Map/Reduce 代码的话,Map 的时候,把 a 表的记录打上标签 a,商品表记录 每读取一条,打上标签 b,变成两个对,b,数字 id),value...SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT c1,c2,c3 COUNT(DISTINCT c4) FROM t2 GROUP BY c1,c2,c3...TABLE ip_2014_12_29 AS SELECT COUNT(1) AS IP FROM (SELECT DISTINCT ip from logdfs WHERE logdate='2014

1.7K50
  • 技术分享 | MySQL 生产环境 GROUP BY 优化实践

    使用场景 当需要获取每个分组的某条记录,而非对全部记录做聚合运算时可能会用到,比如: 最小值或最大值:MIN()、MAX() 统计类:COUNT(distinct)、SUM(distinct)、AVG(...distinct)、sum(distinct)、avg(distinct) SELECT c1,count(distinct c2,c3) FROM t2 GROUP BY c1; SELECT c1,...两种方式在引擎层主要包含的成本: Loose Index Scan 读取分组的第一条记录,得到分组前缀 根据分组前缀读取分组的第一条或最后一条记录返回给 SERVER 层 Tight Index Scan...从 ENGINE 层读取数据,返回给 SERVER 层 SERVER 层判断是否符合 WHERE 条件的记录,并根据聚合函数进行处理 可以看到,对于 ENGINE 层的访问,Loose Index Scan...select count(distinct c1,c2) from t2; mysql> explain select count(distinct c1,c2) from t2; +----+---

    8310

    MySQL索引优化实战

    全表扫描 select * from article where id = 100 -- 走索引 select * from article where id = '100' 为什么呢?...这时候索引的作用只是用于优化WHERE条件的查找 如果在a b列上建立联合索引,该如何建立,才能使查询效率最高 select count(distinct a) / count(*), count(distinct...例如下面的2个写法是等价的,因为MySQL会将查询的顺序优化成和联合索引的顺序一致 select * from table where a = '1' and b = '1' select * from...一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算 明确知道只会返回一条记录,可以加limit1 当查询确定只有一条记录时,可以加...,要么对超过特定阈值的页数进行 SQL 改写,单开一文来讲 推荐阅读 MySQL索引为什么要用B+树实现?

    1.1K30

    面试必备,MySQL索引优化实战总结,涵盖了几乎所

    - 全表扫描 select * from article where id = 100 -- 走索引 select * from article where id = '100' 为什么呢?...这时候索引的作用只是用于优化WHERE条件的查找 如果在a b列上建立联合索引,该如何建立,才能使查询效率最高 select count(distinct a) / count(*), count(distinct...例如下面的2个写法是等价的,因为MySQL会将查询的顺序优化成和联合索引的顺序一致 select * from table where a = '1' and b = '1' select * from...MySQL中,有两种方式生成有序结果集: 通过有序索引顺序扫描直接返回有序数据 Filesort排序,对返回的数据进行排序 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引...一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算 明确知道只会返回一条记录,可以加limit1 当查询确定只有一条记录时,

    41410

    sql DISTINCT去掉重复的数据统计方法

    如果没有指定 DISTINCT,那么将返回所有行,包括重复的行。...= ( select max(b.rowid) from 表名 b where a.字段1 = b.字段1 and a.字段2 = b.字段2 ) 下面我就来讲解一下,上面括号中的语句是查询出重复数据中...= ( select max(b.rowid) from 表名 b where a.字段1 = b.字段1 and a.字段2 = b.字段2 ) 随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表...= ( select b.dataid from 临时表 b where a.字段1 = b.字段1 and a.字段2 = b.字段2 ); commit; 二、对于完全重复记录的删除 对于表中两行记录完全一样的情况...,可以用下面语句获取到去掉重复数据后的记录: select distinct * from 表名 可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。

    2.9K10

    MySQL最常用分组聚合函数

    常用的组函数: AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 统计行的数量 MAX([distinct] expr) 求最大值 MIN([distinct...------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from salary_tab...我们可以将group by操作想象成如下的一个过程:首先系统根据select语句得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。...,然后将其放在对应的数据格中,那么完成这个步骤的就是前面讲到的聚合函数,这也就是为什么这些函数叫聚合函数了。...having子语句与where子语句区别:   where子句在分组前对记录进行过滤;   having子句在分组后对记录进行过滤 mysql> select salary,count(*) from

    5.2K20

    MySQL最常用分组聚合函数

    常用的组函数: AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 统计行的数量 MAX([distinct] expr) 求最大值 MIN([distinct...------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from salary_tab...我们可以将group by操作想象成如下的一个过程:首先系统根据select语句得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。...,然后将其放在对应的数据格中,那么完成这个步骤的就是前面讲到的聚合函数,这也就是为什么这些函数叫聚合函数了。...having子语句与where子语句区别:   where子句在分组前对记录进行过滤;   having子句在分组后对记录进行过滤 mysql> select salary,count(*) from

    5.1K10

    【两只鱼】SQL 调优之13条锦囊妙计

    Count(distinct)优化: 最有效的方法是利用索引来做排重操作,先把排重打记录查找出来在通过count统计。...如:select count(distinct k) from user 可优化为:select count(*) from (select distinct k from user) tmp...Select * from user where age=19 having 优化: 使用where子句替换having子句 因为having只会在检索出所有记录才对结果过滤,这个处理需要排序...表很小,大约少于10行,这个没有什么危害,因为即使你有索引,优化器也会判断在边读索引边取数据时,直接全表扫描快些 你在一个where字句中使用含有索引的列,但这个列的值很集中化,比如字段...统计记录时可去掉不必要的排序 Where、order by、group by、join、distinct union 后面的字段最好加上索引

    2.3K30

    SQL语句逻辑执行过程和相关语法详解

    例如,使用"group by a"对a列分组,那么后续的select列表中就不能使用b列,除非是对b列进行分组聚合运算。...例如select col1+1 as a,a+1 as b from t1是错误的,因为"col1+1"和"a+1"之间没有执行上的先后顺序,所以它认为"a+1"中的a列是不存在的。...例如select distinct a,b from t order by c;是错误的。但MySQL和mariadb又在这里进行了扩展,它们的排序列允许非select_list中的列。...假如DISTINCT消除了部分列的重复值,最终将只返回一条重复记录,而如果使用非select_list的列排序,将要求返回一条重复记录的同时还要返回每个重复值对应的多条记录以便排序,而在要求范式的关系表中是无法整合这样的结果...SELECT sid,name FROM Student GROUP BY class; 事实上从严格意义上看待这条语句,它没有实现分组的意义:既然不返回分组列的分组结果,那为什么还要进行分组呢?

    3.7K20

    Vc数据库编程基础MySql数据库的表查询功能

    过滤重复查询关键字 distinct select distinct name from user; 查询名字.过滤掉重复的. like关键字.模糊查询. 百分比号查询.   ...------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from salary_tab...我们可以将group by操作想象成如下的一个过程:首先系统根据select语句得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。...,然后将其放在对应的数据格中,那么完成这个步骤的就是前面讲到的聚合函数,这也就是为什么这些函数叫聚合函数了。...having子语句与where子语句区别:   where子句在分组前对记录进行过滤;   having子句在分组后对记录进行过滤 mysql> select salary,count(*) from

    9.7K30

    MySQL DQL 数据查询

    SELECT * FROM inner_raw_add_friend_20170514 ORDER BY uin DESC; 8.LIMIT 子句 LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数...offset,row_count # 或 row_count OFFSET offset offset 为返回记录行的开始偏移量,从 0 开始,row_count 为返回记录行的最大数目。...只给一个参数,表示返回记录行的 Top 最大行数,起始偏移量默认为 0。 返回从起始偏移量开始,返回剩余所有的记录,可以使用一些值很大的第二个参数。如检索所有从第 96 行到最后一行。...SELECT * FROM tbl LIMIT 95,18446744073709551615; 注意,MySQL目前不支持使用 -1 表示返回从偏移量开始剩余的所有记录,即下面的写法是错误的: SELECT...* FROM tbl LIMIT 95,-1 9.DISTINCT 子句 DISTINCT 关键字用于查询结果中去除重复的行,只返回唯一的行。

    24920

    几种去重的SQL写法

    ---------- 1 2 选项B,他使用的是UNION,略微迷惑,但他是正确选项, SQL> select id from t1 union select null from dual...这就很清楚了,虽然select id from t1返回了所有数据,但通过使用UNION,就可以达到去重,而且连接UNION的可以是select 1 from t1,可以是select id from...选项D,是正确选项,返回不重复记录,是distinct标准用途,distinct和unique的区别,就在于distinct是ANSI SQL标准语法,unique只在Oracle中支持,在其他的方面,...两者是相同的, SQL> select distinct id from t1; ID ---------- 1 2 要是深挖下distinct和unique的用法,如下这个算是要注意的...4/ce01b/51 ? 但是表中若存在clob类型的字段,此时用distinct *和unique *,就会报错, http://sqlfiddle.com/#!4/97d3e/26 ?

    1.8K20
    领券