黑马程序员技术交流社区
标题: 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_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
现在,我们希望计算客户 "Carter" 的订单数。
我们使用如下 SQL 语句:
SELECT COUNT(Customer) AS CustomerNilsen FROM OrdersWHERE Customer='Carter'以上 SQL 语句的结果是 2,因为客户 Carter 共有 2 个订单:
SQL COUNT(*) 实例 如果我们省略 WHERE 子句,比如这样:
SELECT COUNT(*) AS NumberOfOrders FROM Orders结果集类似这样:
这是表中的总行数。
SQL COUNT(DISTINCT column_name) 实例现在,我们希望计算 "Orders" 表中不同客户的数目。
我们使用如下 SQL 语句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders结果集类似这样:
这是 "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
- IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
- CREATE TABLE #temp
- (
- "ID" INT,
- "NAME" nvarchar(100)
- )
- insert into #temp(ID, NAME) values(1, 'doris');
- insert into #temp(ID, NAME) values(2, 'wander');
- insert into #temp(ID, NAME) values(3, 'mavis');
- insert into #temp(ID, NAME) values(4, '');
- insert into #temp(ID) values(5);
- select * from #temp;
- select count(1),count(2),count(*),count(NAME) from #temp;
- 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
谢谢,现在明了了
作者: lyn 时间: 2013-6-29 11:00
太感谢了
作者: lyn 时间: 2013-6-29 11:00
太感谢了
作者: lyn 时间: 2013-6-29 11:00
太感谢了
作者: ゞ灬伊夏風 时间: 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 |