web-dev-qa-db-fra.com

Que signifie "select count (1) from nom_table" dans les tables de base de données?

Lorsque nous exécutons select count(*) from table_name, il renvoie le nombre de lignes.

Que fait count(1)? Que signifie 1 Ici? Est-ce la même chose que count(*) (car cela donne le même résultat à l'exécution)?

83
Nrj

Le paramètre de la fonction COUNT est une expression à évaluer pour chaque ligne. La fonction COUNT renvoie le nombre de lignes pour lesquelles l'expression est évaluée comme une valeur non nulle. (* est une expression spéciale non évaluée, elle renvoie simplement le nombre de lignes.)

Il existe deux modificateurs supplémentaires pour l'expression: ALL et DISTINCT. Celles-ci déterminent si les doublons sont éliminés. Comme ALL est la valeur par défaut, votre exemple correspond au nombre (ALL 1), ce qui signifie que les doublons sont conservés.

Étant donné que l'expression "1" a la valeur non nulle pour chaque ligne et que vous ne supprimez pas les doublons, COUNT (1) doit toujours renvoyer le même nombre que COUNT (*).

99

Voici n lien qui 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 - depuis

a) compter les lignes où 1 n'est pas nul est moins efficace que
b) compter les rangées

26
Eddie Awad

Différence entre le compte (*) et le compte (1) dans oracle?

compte (*) signifie que tous les enregistrements seront comptés, à savoir chaque cellule MAIS

count (1) signifie qu'il va ajouter une pseudo-colonne avec la valeur 1 et renvoie le nombre de tous les enregistrements

17
rakesh

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

cela vous donnera le nombre 1 pour chaque ligne du tableau. Donc oui count(*) et count(1) fourniront les mêmes résultats que count(8) ou count(column_name)

8
ChrisHDog

Il n'y a pas de différence.

COUNT(1) ne fait que compter une colonne de valeur constante 1 pour chaque ligne. Comme d’autres utilisateurs l’ont dit, c’est la même chose que COUNT(0) ou COUNT(42). Toute valeur non -NULL suffira.

http://asktom.Oracle.com/pls/asktom/f?p=100:11:2603224624843292:::P11_QUESTION_ID:1156151916789

Apparemment, l'optimiseur Oracle avait l'habitude de contenir des bogues, ce qui affectait le compte de la colonne que vous aviez sélectionnée et si elle figurait dans un index. La convention COUNT (1) est donc apparue.

6
Cade Roux
SELECT COUNT(1) from <table name>

devrait faire exactement la même chose que

SELECT COUNT(*)  from <table name>

Il y a peut-être eu ou il y a encore des raisons pour lesquelles il fonctionnerait mieux que SELECT COUNT(*) sur une base de données, mais je considérerais cela comme un bogue dans la base de données.

SELECT COUNT(col_name) from <table name>

cependant, sa signification est différente, car elle ne compte que les lignes avec une valeur non nulle pour la colonne donnée.

5
Thilo

dans Oracle, je pense que ceux-ci ont exactement le même sens

2
Jarod Elliott

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;
2
Vikas Kumar

Selon vos interlocuteurs, certaines personnes signalent que l'exécution de select count(1) from random_table; est plus rapide que select count(*) from random_table. D'autres prétendent qu'ils sont exactement les mêmes.

Ce lien affirme que la différence de vitesse entre les 2 est due à un balayage complet par rapport à un balayage rapide rapide.

0
Johann Zacharee