A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lyn 中级黑马   /  2013-6-28 10:56  /  2217 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lyn 于 2013-6-29 10:58 编辑

在SQL语句中,select count(1) from tablename和select count(*) from tablename两个语句有什么区别??两者的执行效率又怎样?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

10 个回复

倒序浏览
SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_nameSQL COUNT(*) 语法COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_nameSQL COUNT(DISTINCT column_name) 语法COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name
注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。

SQL COUNT(column_name) 实例我们拥有下列 "Orders" 表:
O_IdOrderDateOrderPriceCustomer
12008/12/291000Bush
22008/11/231600Carter
32008/10/05700Bush
42008/09/28300Bush
52008/08/062000Adams
62008/07/21100Carter
现在,我们希望计算客户 "Carter" 的订单数。
我们使用如下 SQL 语句:
SELECT COUNT(Customer) AS CustomerNilsen FROM OrdersWHERE Customer='Carter'以上 SQL 语句的结果是 2,因为客户 Carter 共有 2 个订单:
CustomerNilsen
2

SQL COUNT(*) 实例 如果我们省略 WHERE 子句,比如这样:
SELECT COUNT(*) AS NumberOfOrders FROM Orders结果集类似这样:
NumberOfOrders
6
这是表中的总行数。

SQL COUNT(DISTINCT column_name) 实例现在,我们希望计算 "Orders" 表中不同客户的数目。
我们使用如下 SQL 语句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders结果集类似这样:
NumberOfCustomers
3
这是 "Orders" 表中不同客户(Bush, Carter 和 Adams)的数目。


评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
select count(1) from tablename 是 tablename中列名为“1”的列有多少条数据
select count(*)from tablename 是 tablename 中所有列 有多少条数据
两个的结果是不同的,比如tablename有10条数据,列“1”有2行数据为Null
select count(*) from tablename 结果为10
select count(1) from tablename 结果为8

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
  1. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
  2. CREATE TABLE #temp
  3. (
  4. "ID" INT,
  5. "NAME" nvarchar(100)
  6. )

  7. insert into #temp(ID, NAME) values(1, 'doris');
  8. insert into #temp(ID, NAME) values(2, 'wander');
  9. insert into #temp(ID, NAME) values(3, 'mavis');
  10. insert into #temp(ID, NAME) values(4, '');
  11. insert into #temp(ID) values(5);

  12. select * from #temp;
  13. select count(1),count(2),count(*),count(NAME) from #temp;

  14. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
复制代码

select count(1) from test
-- 在没有聚集的情况下,这种查询的效率可能会高一点
select count(*) from test
-- 有索引走索引,没索引全表扫描,可以利用表的统计信息
select count(a) from test
-- 扫描a列的数据记录数,如果a上没有索引,则效率最差,并且如果a列包含null,则不会计数

另外,当数据量达到10w多的时候,使用count(1)要比使用count(*)的用时稍微少点!
如果你的数据表没有主键,那么count(1)比count(*)快
如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
如果你的表只有一个字段的话那count(*)就是最快的啦
count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的

因此:count(1)和count(*)基本没有差别!
但目前我所在的这家公司,还是建议用count(1)...

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 关关雎鸠 于 2013-6-28 16:27 编辑

第一个效率高。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
彭家贰小姐 发表于 2013-6-28 13:55
select count(1) from test
-- 在没有聚集的情况下,这种查询的效率可能会高一点
select count(*) from t ...

谢谢,现在明了了
回复 使用道具 举报
lyn 中级黑马 2013-6-29 11:00:33
7#
万琪 发表于 2013-6-28 10:58
SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT ...

太感谢了
回复 使用道具 举报
lyn 中级黑马 2013-6-29 11:00:43
8#
杨威yangwei 发表于 2013-6-28 12:21
select count(1) from tablename 是 tablename中列名为“1”的列有多少条数据
select count(*)from tablena ...

太感谢了
回复 使用道具 举报
lyn 中级黑马 2013-6-29 11:00:53
9#

太感谢了
回复 使用道具 举报
总结:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = 'value’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename的出现。
回复 使用道具 举报
ykrh 中级黑马 2014-2-22 14:03:10
11#
前者高,扫描一列与扫描整个表,效率对比可想而知
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马