黑马程序员技术交流社区

标题: SQL语句,求解释! [打印本页]

作者: lyn    时间: 2013-6-28 10:56
标题: SQL语句,求解释!
本帖最后由 lyn 于 2013-6-29 10:58 编辑

在SQL语句中,select count(1) from tablename和select count(*) from tablename两个语句有什么区别??两者的执行效率又怎样?
作者: 万琪    时间: 2013-6-28 10:58
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)的数目。



作者: 杨威yangwei    时间: 2013-6-28 12:21
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
作者: 彭家贰小姐    时间: 2013-6-28 13:55
  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)...


作者: 关关雎鸠    时间: 2013-6-28 16:25
本帖最后由 关关雎鸠 于 2013-6-28 16:27 编辑

第一个效率高。
作者: lyn    时间: 2013-6-29 10:59
彭家贰小姐 发表于 2013-6-28 13:55
select count(1) from test
-- 在没有聚集的情况下,这种查询的效率可能会高一点
select count(*) from t ...

谢谢,现在明了了
作者: lyn    时间: 2013-6-29 11:00
万琪 发表于 2013-6-28 10:58
SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT ...

太感谢了
作者: lyn    时间: 2013-6-29 11:00
杨威yangwei 发表于 2013-6-28 12:21
select count(1) from tablename 是 tablename中列名为“1”的列有多少条数据
select count(*)from tablena ...

太感谢了
作者: lyn    时间: 2013-6-29 11:00
关关雎鸠 发表于 2013-6-28 16:25
第一个效率高。

太感谢了
作者: ゞ灬伊夏風    时间: 2013-6-29 15:32
总结:
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
前者高,扫描一列与扫描整个表,效率对比可想而知




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2