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

select count(*)、count(1)、count(主键列)和count(包含空值的列)有何区别?

下班路上看见网上有人问一个问题: oracle 10g以后count(*)和count(非空列)性能方面有什么区别?...我们分别用10053打印如下4组SQL的trace, SQL1:select count(*) from bisal; SQL2:select count(1) from bisal; SQL3:select...count(id1) from bisal; SQL4:select count(id2) from bisal; 我们来看下这四个SQL的执行结果, ?...前三个均为表数据总量,第四个SQL结果是99999,仅包含非空记录数据量,说明若使用count(允许空值的列),则统计的是非空记录的总数,空值记录不会统计,这可能和业务上的用意不同。...总结: 11g下,通过实验结论,说明了count()、count(1)和count(主键索引字段)其实都是执行的count(),而且会选择索引的FFS扫描方式,count(包含空值的列)这种方式一方面会使用全表扫描

3.4K30

性能大PK count(*)、count(1)和count(列)

最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,说到以下内容: 你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,用 count(1),这样比较快...count(*) 性能与存储引擎相关 我们都知道,MySQL 常见的存储引擎有两种:MyISAM 和 InnoDB。...count(字段) 分为两种情况,字段定义为 not null 和 null: 1)为 not null 时:逐行从记录里面读出这个字段,判断不为 null,累加; 2)为 null 时:执行时,判断到有可能是...执行效果上: count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为null count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为null count...(*) 如果有主键,则 select count(主键) 的执行效率是最优的 如果表只有一个字段,则 select count(*)最优。

1.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause

    GROUP BY 后 SELECT 列的限制 标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键、聚合函数(SUM 、...cno,cname,count(sno),MAX(sno) FROM tbl_student_class GROUP BY cno,cname; 因为cno 和 cname 本来就是一对一,cno...SELECT cno,cname,count(sno),MAX(sno) FROM tbl_student_class GROUP BY cno; 执行报错了,提示信息:SELECT 列表中的第二个表达式...SQL 模式主要分两类:语法支持类和数据检查类,常用的如下 语法支持类    ONLY_FULL_GROUP_BY 对于 GROUP BY 聚合操作,如果在 SELECT 中的列、HAVING 或者...SELECT 子句中不能直接引用原表中的列的原因;   3、一般来说,单元素集合的属性和其唯一元素的属性是一样的。

    3.2K50

    Select count(*)、Count(1)、Count(0)的区别和执行效率比较

    结论 https://www.cnblogs.com/sueris/p/6650301.html 这里把上面实验的结果总结一下: count()和count(1)执行的效率是完全一样的。...count()的执行效率比count(col)高,因此可以用count()的时候就不要去用count(col)。...count(col)的执行效率比count(distinct col)高,不过这个结论的意义不大,这两种方法也是看需要去用。...如果是对特定的列做count的话建立这个列的非聚集索引能对count有很大的帮助。 如果经常count()的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。...在不加WHERE限制条件的情况下,COUNT()与COUNT(COL)基本可以认为是等价的; 但是在有WHERE限制条件的情况下,COUNT()会比COUNT(COL)快非常多; count(0)=

    1.4K20

    Hive读取索引文件问题:select * 和select count(*)读取出来的行数不一致

    两种方式,分别查询数据有多少行: hive (gmall)> select * from ods_log; Time taken: 0.706 seconds, Fetched: 2955 row(s)...hive (gmall)> select count(*) from ods_log; 2959 两次查询结果不一致的原因分析 hive (gmall)> drop table if exists...所以在HDFS上的hive里存着lzo格式数据和lzo.index索引文件,这便于对文件进行切片。...但是select * from ods_log不执行MR操作,默认采用的是ods_log建表语句中指定的DeprecatedLzoTextInputFormat,能够识别lzo.index为索引文件。...select count(*) from ods_log执行MR操作,默认采用的是CombineHiveInputFormat,不能识别lzo.index为索引文件,将索引文件当做普通文件处理。

    1.1K10

    wm_concat()和group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别

    原标题:oracle的wm_concat()和mysql的group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别 前言 标题几乎已经说的很清楚了,在oracle中,concat...()函数和 “ || ” 这个的作用是一样的,是将不同列拼接在一起;那么wm_concat()是将同属于一个组的(group by)同一个字段拼接在一起变成一行。...wm_concat()和concat()具体的区别 oracle中concat()的使用 和 oracle中 “ || ” 的使用 这两个都是拼接字段或者拼接字符串的功能。...oracle中: concat只能连接两个字符串或者两个字段,|| 可以多次使用,拼接n个字符串或者字段。.../*简单的合并同一个同学的课程*/ select stuid,wm_concat(coursename) from stu_score group by stuid ?

    8.9K50

    MySQL最常用分组聚合函数

    4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...规则:   ①出现在SELECT子句中的单独的列,必须出现在GROUP BY子句中作为分组列   ②分组列可以不出现在SELECT子句中   ③分组列可出现在SELECT子句中的一个复合表达式中   ...,则可以合并group by和order by子句 mysql> select teamno,count(*) -> from MATCHES -> group by teamno...例1:对于每个球队,得到其编号和所有球员的编号 mysql> select teamno,group_concat(playerno) -> from MATCHES -> group...默认情况下,UNION = UNION DISTINCT   ①进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致;   ②默认会去掉两个查询结果集中的重复行;默认结果集不排序

    5.1K10

    MySQL最常用分组聚合函数

    4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...规则:   ①出现在SELECT子句中的单独的列,必须出现在GROUP BY子句中作为分组列   ②分组列可以不出现在SELECT子句中   ③分组列可出现在SELECT子句中的一个复合表达式中   ...,则可以合并group by和order by子句 mysql> select teamno,count(*) -> from MATCHES -> group by teamno...例1:对于每个球队,得到其编号和所有球员的编号 mysql> select teamno,group_concat(playerno) -> from MATCHES -> group...默认情况下,UNION = UNION DISTINCT   ①进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致;   ②默认会去掉两个查询结果集中的重复行;默认结果集不排序

    5.2K20

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

    两者之间 between 关键字就是两者之间我来查询....4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...规则:   ①出现在SELECT子句中的单独的列,必须出现在GROUP BY子句中作为分组列   ②分组列可以不出现在SELECT子句中   ③分组列可出现在SELECT子句中的一个复合表达式中   ...,则可以合并group by和order by子句 mysql> select teamno,count(*) -> from MATCHES -> group by teamno...默认情况下,UNION = UNION DISTINCT   ①进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致;   ②默认会去掉两个查询结果集中的重复行;默认结果集不排序

    9.7K30

    mysql架构sql基础2

    查询整表数据 select * from t1; *代表所有的列,也可以把所有的列都写上 也可以查询部分列,性能没有保证 表大要加过滤条件(生产中要禁止使用) select 配合 from + where...count() , sum() , avg(), max(), min(), group_concat() 统计每个国家有多少城市 select countrycode,count(*) from world.city...2然后按照国家代码分组 3先把每个国家有多少城市加起来 然后group_concat类似于列转换行 不然不符合sql_mode标准 要求要么在group by后 要么在聚合函数中 执行逻辑 select...by 条件升序排序 3针对 group by 分组,去重复 变成 4然后 把每个分组对应的数据行进行count(数一下组内有多少行) 5然后在group_concat 列转换成行显示按照,分割 统计city...谁来做过滤条件 统计每个学生学习课程的门数 1这里有陷阱,需要两张表就行了需要学生表和成绩表(因为学生,学了这门课就会有成绩) 1 select student.sname,count(*) from

    40241

    SQL必知必会总结2-第8到13章

    上面的两个最值函数会自动忽略掉值为NULL的行 4、SUM()函数 返回指定列值的和(总计) SELECT SUM(quantity) AS items_ordered FROM OrderItems...FROM Products; 分组数据 分组使用的是两个子句: GROUP BY() HAVING() 创建分组 分组是使用SELECT子句的GROUP BY子句建立的,看个例子: SELECT vend_id...,COUNT(*) AS num_prods FROM Products GROUP BY vend_id; -- 分组的列 GROUP BY子句使用时候的常见规定: GROUP BY子句可以包含任意数目的列...,可以对分组进行嵌套 GROUP BY子句中列出的每一列都是检索列或者有效的表达式(但是不能是聚集函数) 如果在SELECT中使用表达式,则必须在GROUP BY子句中使用相同的表达式,而不是使用别名...BY vend_id HAVING COUNT(*) >= 2; -- 分组后再执行,找出数目大于2的数据 分组和排序 ORDER BY 和GROUP BY的差异: ORDER BY GROUP BY

    2.3K21

    MySQL(五)汇总和分组数据

    ()函数{avg()函数忽略列值为NULL的行}; 2、count()函数 count()函数进行计数,可利用count()确定表中行的数目或符合特定条件的行的数目; count()函数有两种使用方式:...二、分组数据 1、group by创建分组 在MySQL中,分组是在select语句中的group by子句中建立的,比如: select vend-id,count(*) as num_prods from...(但不能是聚集函数),如果在select中使用表达式,则必须在group by子句中指定相同的表达式(不能使用别名); ④除了聚集计算语句外,select中每个列都必须在group by子句中给出; ⑤...) having和where可以同时使用,比如: select vend_id, count(*) as num_prods from products where prod_price>=10 group...2或2以上的分组; 3、分组和排序 group by和order by的区别: ?

    4.7K20

    sql中的 where 、group by 和 having 用法解析

    group by 的执行的过程,先执行select 的操作返回一个程序集, --然后去执行分组的操作,这时候他将根据group by 后面的字段 --进行分组,并且将相同的字段并称一列数据,如果group...--但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的 --数据系统不知道将数据放入哪里,所以就出现此错误 --目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的...–但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的 –数据系统不知道将数据放入哪里,所以就出现此错误 –目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的...--但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的 --数据系统不知道将数据放入哪里,所以就出现此错误 --目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的...–但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的 –数据系统不知道将数据放入哪里,所以就出现此错误 –目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的

    12.9K30
    领券