Lorsque nous exécutons, select count(*) from table_name
il renvoie le nombre de lignes.
Que fait count(1)
-on? Que 1
signifie ici? Est-ce le même que count(*)
(car il donne le même résultat à l'exécution)?
Lorsque nous exécutons, select count(*) from table_name
il renvoie le nombre de lignes.
Que fait count(1)
-on? Que 1
signifie ici? Est-ce le même que count(*)
(car il donne le même résultat à l'exécution)?
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 (*).
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
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
Ceci est similaire à la différence entre
SELECT * FROM table_name and SELECT 1 FROM table_name.
Si tu fais
SELECT 1 FROM table_name
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)
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- 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.
SELECT COUNT(1) from <table name>
devrait faire exactement la même chose que
SELECT COUNT(*) from <table name>
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.
dans oracle je crois que ceux-ci ont exactement la même signification
Vous pouvez tester comme ceci:
create table test1(
id number,
name varchar2(20)
);
insert into test1 values (1,'abc');
insert into test1 values (1,'abc');
select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) 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.