只是想知道你们中的任何一个人是否Count(1)过度使用过Count(*),如果性能有显着差异,或者这只是从过去几天带来的遗留习惯?
(具体数据库是SQL Server 2005.)
我经常发现这三种变体:
SELECT COUNT(*) FROM Foo;
SELECT COUNT(1) FROM Foo;
SELECT COUNT(PrimaryKey) FROM Foo;
Run Code Online (Sandbox Code Playgroud)
据我所知,他们都做同样的事情,我发现自己在我的代码库中使用了三个.但是,我不喜欢以不同的方式做同样的事情.我应该坚持哪一个?他们中的任何一个比其他两个更好吗?
我有以下查询:
select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;
Run Code Online (Sandbox Code Playgroud)
会有什么区别,如果我更换了所有调用count(column_name)到count(*)?
这个问题的灵感来自于如何在Oracle中的表中找到重复值?.
为了澄清已接受的答案(也许是我的问题),替换count(column_name)为count(*)将在结果中返回一个额外的行,其中包含a null和null列中的值计数.
我在MSSQL2008中运行这样的查询:
select count(*)
from t1
inner join t2 on t1.id = t2.t1_id
inner join t3 on t1.id = t3.t1_id
Run Code Online (Sandbox Code Playgroud)
假设t1.id有一个NOT NULL约束.因为它们是内连接并且t1.id永远不能为null,所以使用count(t1.id)而不是count(*)应该产生完全相同的最终结果.我的问题是:性能是否相同?
我也想知道联接是否会影响这个.我意识到添加或删除连接会影响性能和结果集的长度.假设在不更改连接模式的情况下,您设置count为仅定位一个表.会有什么不同吗?换句话说,这两个查询之间是否存在差异:
select count(*) from t1 inner join t2 on t1.id = t2.t1_id
select count(t1.*) from t1 inner join t2 on t1.id = t2.t1_id
Run Code Online (Sandbox Code Playgroud)
MySQL中的COUNT(id)与COUNT(*)为MySQL回答了这个问题,但是我找不到具体的MS-SQL答案,而且我找不到任何考虑join因素的东西.
注意:我试图在Google和SO上找到这些信息,但很难弄清楚如何说出我的搜索.
我有一个简单的pdo准备查询:
$result = $db->prepare("select id, course from coursescompleted where person=:p");
$result ->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rows = $result->fetch(PDO::FETCH_NUM);
echo $rows[0];
Run Code Online (Sandbox Code Playgroud)
echo似乎返回记录的ID值,而不是查询返回的记录数?
对此有何想法或解释?
简短而简单:在 MySQL 中,会比我理解的MySQL 中的“all”选择器SELECT COUNT(fld) AS count FROM tbl更快。SELECT COUNT(*) AS count FROM tbl*
是否COUNT(*)选择所有行来计算计数,从而使查询SELECT(id)更便宜?或者这并不重要?
人们早就知道PDO不支持COUNT(*),如下所示的查询会失败,因为它不会返回任何受影响的行,
$q = $dbc -> prepare("SELECT COUNT(*) FROM table WHERE id = ?");
$q -> execute(array($id));
echo $q -> rowCount();
Run Code Online (Sandbox Code Playgroud)
做一些研究我发现你也可以使用其他计数方法来获取行计数而根本不使用计数,例如下面的查询应该与上面相同,但是对于PDO会返回正确的,
$q = $dbc -> prepare("SELECT 1 FROM table WHERE id = ?");
$q -> execute(array($id));
echo $q -> rowCount();
Run Code Online (Sandbox Code Playgroud)
互联网上有各种各样的消息来源声称;
"SELECT COUNT(*)
"SELECT COUNT(col)
"SELECT 1
Run Code Online (Sandbox Code Playgroud)
两者都是相同的(有一些差异)所以如何使用mysql哪个PDO无法正确返回真正的计数,
"SELECT 1
Run Code Online (Sandbox Code Playgroud)
工作?
计数讨论的方法