2008-10-08 3 views
53

Lorsque nous exécutons select count(*) from table_name, il renvoie le nombre de lignes. Qu'est-ce que count(1)? Que signifie 1 ici? Est-ce le même que count(*) (car il donne le même résultat à l'exécution)?Que signifie "select count (1) from nom_table" sur les tables de base de données?

+0

Question intéressante. Je serais également intéressé si la réponse est dépendante de l'implémentation (par exemple, si le résultat de la requête est le même dans SQL Server que dans Oracle). –

Répondre

70

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 é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 rejeté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. Comme l'expression "1" est non nulle pour chaque ligne et que vous ne supprimez pas de doublons, COUNT (1) doit toujours retourner le même nombre que COUNT (*).

+0

Rappelez-vous sélectionnez DISTINCT coloumn1 à partir de table1! = Select count (DISTINCT coloumn1) from table1; –

+0

Comptez aussi (1) ici 1 n'est pas coloumn non, c'est une expression. par exemple) sélectionnez 1 dans le tableau 1; affichera 1 fois non pour les lignes de cette table. –

+0

sélectionnez count (DISTINCT/ALL columnName) à partir de table1; renverra aucune valeur/NULL NOT NULL de la colonne (columnName). –

2

dans l'oracle Je crois que ces ont exactement le même sens

+0

Est-ce que le 1 se rapporte à la première colonne? – dacracot

+0

non, 1 fait référence au nombre constant 1. Lorsque vous dites, ORDER BY 1, il se réfère à la colonne un. – Thilo

+0

c'est ce que je me demandais il y a un moment, mais vous pouvez spécifier n'importe quel nombre qui est supérieur au nombre de colonnes, mais le résultat est toujours le même. Donc, ce n'est certainement pas le numéro de la colonne. – Nrj

6

Ceci est similaire à la différence entre

SELECT * FROM table_name and SELECT 1 FROM table_name. 

Si vous

SELECT 1 FROM table_name 

il vous donnera le numéro 1 chaque rangée dans le tableau. Donc oui count(*) et count(1) fourniront les mêmes résultats que le count(8) ou count(column_name)

+3

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: http://stackoverflow.com/questions/169784 – Blorgbeard

+0

Hmm, en fait c'est pour SQL Server. Oracle peut fonctionner différemment, je suppose. – Blorgbeard

+0

Compte ne devrait jamais utiliser les valeurs NULL selon le SQL standard, ORacle et SQL Server doivent avoir le même comportement à cet égard. – Thorsten

4

Il n'y a pas de différence.

COUNT(1) est simplement de 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

L'optimiseur Oracle ne semble utiliser pour avoir des bugs dans ce qui a causé le nombre d'être affecté par quelle colonne que vous avez choisi et si elle était dans un index, de sorte que le COUNT (1) Convention est entrée en étant.

2
SELECT COUNT(1) from <table name> 

devrait faire exactement la même chose que

SELECT COUNT(*) from <table name> 

Il peut y avoir été ou encore être des raisons pour lesquelles il effectuerait mieux que SELECT COUNT(*) sur une base de données, mais je considère qu'un bug dans le DB. Cependant, la signification est différente, car elle ne compte que les lignes avec une valeur non nulle pour la colonne donnée.

17

Voici a link qui aidera à répondre à vos questions.En bref:

count (*) est la bonne façon d'écrire et compter (1) est Optimisés de count (*) en interne - depuis

a) compter les lignes où 1 est non nul est moins efficace que
b) compter les lignes

0

en fonction de qui vous demandez, certaines personnes déclarent que l'exécution select count(1) from random_table; fonctionne plus vite que select count(*) from random_table. D'autres prétendent qu'ils sont exactement les mêmes.

Cette link indique que la différence de vitesse entre les deux est due à un SCAN COMPLET FULL FAST SCAN.

+0

Vous interprétez mal le lien. LS fait le point que COUNT (COLUMN) peut être le même que et plus rapide que COUNT (*), mais seulement quand aucune colonne NOT NULL n'est indexée mais COLUMN est indexée et n'a en réalité aucune valeur nulle. Plus d'une question piège. –

+1

J'essayais d'utiliser le lien pour documenter l'affirmation que, dans certaines circonstances, COUNT (1) pourrait être plus rapide que COUNT (*). Certaines réponses antérieures avaient fait l'affirmation qu'il n'y avait pas de différences entre les 2, et je fournissais un contre-exemple possible. –

10

Différence entre le nombre (*) et le nombre (1) dans Oracle? comte

(*) signifie qu'il comptera tous les enregistrements ie nombre chaque cellule MAIS

(1) signifie qu'il ajoutera une colonne de pseudo avec la valeur 1 et renvoie le nombre de tous les dossiers

+0

merci! cela a aidé après avoir lu d'autres réponses top –

1
Vous

peut 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; 
Questions connexes