Wie funktioniert der Count(*) Befehl bei Access. Woher weiss "der Computer" was er zählen soll wenn doch in der Klammer ein Stern und keine konkrete zu zählende Spalte steht?
count(*) gibt die Anzahl von Elementen in einer Gruppe zurück. Dieses betrifft auch die NULL-Werte und/oder Duplikate. Gezählt werden hier die Tupel (Datensätze).
Wir bereits geantwortet, werden hier schlicht Datensätze gezählt. count(*) ist deshalb auch etwas ganz Besonderes, denn es gibt zu Recht eben kein sum(*), min(*) oder andere Aggregate zusammen mit *.
Deshalb wird count(*) von einigen DB Systemen in Zusammenhang mit einer leeren where clause und ohne join optimiert und gibt einfach die Anzahl der Datensätze der Tabelle zurück, die häufig in den Metadaten zu finden ist. D.h. ein 'select count(*) from foo' kann auch bei Millarden Datensätzen innerhalb von µs beantwortet werden, während ein 'select count(bar) from foo' vielleicht Minuten benötigt, obwohl das Ergebnis das selbe ist.
Und, wenn wir gerade dabei sind, fürs nächste Mal: "Rückfragen oder Anmerkungen zur Frage selbst sollten als Kommentare unter die Frage geschrieben werden.". ;-)
Das COUNT(*) die Anzahl aller der Elemente incl. derer die NULL-Werte beinhalten ist ja schon erwähnt worden.
COUNT(foo) allerdings zählt nur dann das Element mit, wenn foo nicht NULL ist. Insbesondere dann wichtig wenn man unter anderem die Zahl der Elemente ermitteln möchte, die aber über einen LEFT OUTER JOIN mit in der Ergebnismenge sind!
Mit anderen Worten, folgende beiden Ergebnisse für die Aliase "countall" und "countfoo" können (müssen aber nicht) unterschiedlich sein:
SELECT COUNT(*) AS countall, COUNT(bar2.foo) AS countfoo FROM bar1 LEFT OUTER JOIN bar2 ON bar1.x = bar2.y
Es ist anzumerken, das statt COUNT(*) neuerdings bei SQL-SERVER und ORACLE zunehmend COUNT(1) verwendet wird. Die Zahl 1 ist hier als Konstanter Wert zu verstehen, der verwendete Wert ist belaglos. Da der Wert eh konstant ist kann diese Abfrage vermutlich noch etwas performanter ausgeführt werden. Vom Ergebnis her kommt jedenfalls das gleiche raus.
Hab mir auf dem MSSQL 2008 den Executionplan angeschaut und er ist in beiden Fällen exakt der selbe. Gemessen auf eine Tabelle mit 13.000.000 Einträgen. Wobei es keinen Einfluss nimmt ob ein Index benutzt wird oder nicht.