首页
学习
活动
专区
工具
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)讨论,可能你方法比我能想到方法更好

41810

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; +----+---

    5410

    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

    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索引优化实战总结,涵盖了几乎所

    - 全表扫描 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 当查询确定只有一条记录时,

    40510

    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.2K30

    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.6K20

    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

    几种去重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

    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 关键字用于查询结果中去除重复行,只返回唯一行。

    23320
    领券