Question interessante. Je serais également intéressé de savoir si la réponse dépend de la mise en œuvre (par exemple, si le résultat de la requête est le même dans SQL Server que dans Oracle).
Jon Schneider
Réponses:
106
Le paramètre de la fonction COUNT est une expression qui doit être évaluée pour chaque ligne. La fonction COUNT renvoie le nombre de lignes pour lesquelles l'expression évalue une valeur non nulle. (* est une expression spéciale qui n'est pas évaluée, elle renvoie simplement le nombre de lignes.)
Il existe deux modificateurs supplémentaires pour l'expression: ALL et DISTINCT. Ceux-ci déterminent si les doublons sont supprimés. Puisque ALL est la valeur par défaut, votre exemple est le même que count (ALL 1), ce qui signifie que les doublons sont conservés.
Étant donné que l'expression «1» est évaluée comme non nulle pour chaque ligne et que vous ne supprimez pas les doublons, COUNT (1) doit toujours renvoyer le même nombre que COUNT (*).
N'oubliez pas de sélectionner DISTINCT coloumn1 de table1! = Sélectionner count (DISTINCT coloumn1) de table1;
Kanagavelu Sugumar
Aussi count (1) ici 1 n'est pas coloumn no, c'est une expression. par exemple) sélectionnez 1 dans le tableau 1; affichera 1 nombre de fois pour le nombre de lignes de la table.
Kanagavelu Sugumar
sélectionnez count (DISTINCT / ALL columnName) dans table1; renverra non de toutes / valeurs NOT NULL distinctes de la colonne (columnName).
Kanagavelu Sugumar
sélectionnez DISTINCT colonne1 de table1; inclura une valeur NULL dans la colonne (colonne1). sélectionnez count (DISTINCT coloumn1) dans table1; n'inclura même pas une seule ligne NULL.
Kanagavelu Sugumar
1
@datps - Il existe en fait un nombre illimité d'expressions qui donnent le même résultat. COUNT ('Hello, world!') Devrait fonctionner aussi bien. (Je ne l'ai pas essayé.) La question est donc: pourquoi créer une expression spéciale (*) alors qu'il existe déjà un nombre illimité de façons de faire la même chose? Je ne peux pas parler au nom des créateurs de SQL (qui ont beaucoup de péchés à expier :)), mais c'était probablement pour que les gens n'aient pas à choisir arbitrairement une expression non nulle. Cela aurait brouillé l'intention de l'auteur de la requête. "Pourquoi ont-ils écrit 1 au lieu de 2? Cela doit signifier quelque chose!"
Jeffrey L Whitledge
26
Voici un lien qui vous aidera à répondre à vos questions. En bref:
count (*) est la bonne façon de l'écrire et count (1) est OPTIMISÉ POUR ÊTRE count (*) en interne - puisque
a) compter les lignes où 1 n'est pas nul est moins efficace que
b) compter les lignes
il vous donnera le numéro 1 pour chaque ligne du tableau. Alors oui count(*)et count(1)fournira les mêmes résultats que la volonté count(8)oucount(column_name)
count (nom_colonne) n'est pas tout à fait le même - il ne compte pas les lignes avec null dans cette colonne. Voir ici pour plus de détails: stackoverflow.com/questions/169784
Blorgbeard sort
Hmm, en fait, c'est pour SQL Server. Oracle peut fonctionner différemment je suppose.
Blorgbeard sort
Count ne doit jamais utiliser de valeurs NULL selon SQL standard, ORacle et SQL Server doivent avoir le même comportement à cet égard.
Thorsten
"similaire à la différence entre SELECT * FROM nom_table et SELECT 1 FROM nom_table." -- pas vraiment. SELECT * et SELECT 1 sont différents. SELECT (*) et SELECT (1) donnent le même résultat.
David Aldridge
7
Il n'y a pas de différence.
COUNT(1)est essentiellement de compter une colonne de valeur constante 1 pour chaque ligne. Comme d'autres utilisateurs l'ont dit ici, c'est la même chose que COUNT(0)ou COUNT(42). Toute non- NULLvaleur suffira.
L'optimiseur Oracle avait apparemment l'habitude de contenir des bogues, ce qui affectait le nombre de colonnes que vous avez choisies et s'il était dans un index, de sorte que la convention COUNT (1) est née.
Il peut y avoir eu ou encore quelques raisons pour lesquelles il fonctionnerait mieux que SELECT COUNT(*)sur certaines bases de données, mais je considérerais qu'il s'agit d'un bogue dans la base de données.
SELECT COUNT(col_name)from<table name>
a cependant une signification différente, car il ne compte que les lignes avec une valeur non nulle pour la colonne donnée.
non, 1 fait référence au nombre constant 1. Lorsque vous dites, ORDER BY 1, cela fait référence à la première colonne.
Thilo
c'est ce que je me demandais il y a quelque temps, mais vous pouvez spécifier n'importe quel nombre qui est supérieur au nombre de colonnes, le résultat est toujours le même. Donc, ce n'est certainement pas le numéro de colonne.
Nrj
@dacracot: c'est possible mais je ne le crois pas. D'après ce que je comprends, oracle réécrit simplement le compte (1) pour qu'il soit le compte (*) en arrière
Jarod Elliott
2
Vous pouvez tester comme ceci:
createtable test1(
id number,
name varchar2(20));insertinto test1 values(1,'abc');insertinto test1 values(1,'abc');select*from test1;select count(*)from test1;select count(1)from test1;select count(ALL1)from test1;select count(DISTINCT1)from test1;
Selon la personne à qui vous demandez, certaines personnes signalent que l'exécution select count(1) from random_table;s'exécute plus rapidement queselect count(*) from random_table . D'autres prétendent qu'ils sont exactement les mêmes.
Ce lien prétend que la différence de vitesse entre les 2 est due à un FULL TABLE SCAN vs FAST FULL SCAN.
Vous interprétez mal le lien. LS fait valoir que COUNT (COLUMN) peut être identique et plus rapide que COUNT (*), mais uniquement lorsqu'aucune colonne NOT NULL n'est indexée mais que COLUMN est indexé et n'a en fait aucune valeur NULL. Plus une question piège.
David Aldridge
1
J'essayais d'utiliser le lien pour documenter l'affirmation selon laquelle, dans certaines circonstances, COUNT (1) pourrait être plus rapide que COUNT (*). Certaines réponses antérieures avaient déclaré qu'il n'y avait aucune différence entre les 2, et je donnais un contre-exemple possible.
Réponses:
Le paramètre de la fonction COUNT est une expression qui doit être évaluée pour chaque ligne. La fonction COUNT renvoie le nombre de lignes pour lesquelles l'expression évalue une valeur non nulle. (* est une expression spéciale qui n'est pas évaluée, elle renvoie simplement le nombre de lignes.)
Il existe deux modificateurs supplémentaires pour l'expression: ALL et DISTINCT. Ceux-ci déterminent si les doublons sont supprimés. Puisque ALL est la valeur par défaut, votre exemple est le même que count (ALL 1), ce qui signifie que les doublons sont conservés.
Étant donné que l'expression «1» est évaluée comme non nulle pour chaque ligne et que vous ne supprimez pas les doublons, COUNT (1) doit toujours renvoyer le même nombre que COUNT (*).
la source
Voici un lien qui vous aidera à répondre à vos questions. En bref:
la source
Différence entre count (*) et count (1) dans oracle?
count (*) signifie qu'il comptera tous les enregistrements, c'est-à-dire chaque cellule MAIS
count (1) signifie qu'il ajoutera une pseudo colonne avec la valeur 1 et renvoie le nombre de tous les enregistrements
la source
Ceci est similaire à la différence entre
Si tu fais
il vous donnera le numéro 1 pour chaque ligne du tableau. Alors oui
count(*)
etcount(1)
fournira les mêmes résultats que la volontécount(8)
oucount(column_name)
la source
Il n'y a pas de différence.
COUNT(1)
est essentiellement de compter une colonne de valeur constante 1 pour chaque ligne. Comme d'autres utilisateurs l'ont dit ici, c'est la même chose queCOUNT(0)
ouCOUNT(42)
. Toute non-NULL
valeur suffira.http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
L'optimiseur Oracle avait apparemment l'habitude de contenir des bogues, ce qui affectait le nombre de colonnes que vous avez choisies et s'il était dans un index, de sorte que la convention COUNT (1) est née.
la source
devrait faire exactement la même chose que
Il peut y avoir eu ou encore quelques raisons pour lesquelles il fonctionnerait mieux que
SELECT COUNT(*)
sur certaines bases de données, mais je considérerais qu'il s'agit d'un bogue dans la base de données.a cependant une signification différente, car il ne compte que les lignes avec une valeur non nulle pour la colonne donnée.
la source
dans oracle je crois que ceux-ci ont exactement la même signification
la source
Vous pouvez tester comme ceci:
la source
Selon la personne à qui vous demandez, certaines personnes signalent que l'exécution
select count(1) from random_table;
s'exécute plus rapidement queselect count(*) from random_table
. D'autres prétendent qu'ils sont exactement les mêmes.Ce lien prétend que la différence de vitesse entre les 2 est due à un FULL TABLE SCAN vs FAST FULL SCAN.
la source