SELECT COUNT

  • SQL

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Es soll einfache Abfrage erstellt werden:

    gegeben ist eine Tabelle: "aufgabe" mit der Spalte "aufgabe_id"
    Es soll die Anzahl aller Datensätze in der Tabelle in der Spalte "aufgabe_id" gezählt werden:

    SQL-Abfrage

    1. SELECT COUNT `aufgabe_id` FROM `aufgabe`


    Es kommt die Fehlermeldung: Unbekanntes Tabellenfeld 'COUNT' in field list

    Es muß ein sehr simpler Fehler sein aber ich sehe es nicht.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    SELECT COUNT(1) FROM …
    Hätte man auch googlen können :whistling:
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Immer Count(*) statt Count(1). Zumindest in MS Sql Server macht sich der Optimierer die geringste Arbeit, wenn man ihn auch lässt.
    Je nach zugrunde liegender Tabelle rechnet er sich da sonst x Millionen 1sen hin. Kann aber auch sein, dass er oftmals schlau genug ist und erkennt, dass er das trotzdem nicht tun sollte.
    Na ja sortieren wir mal das Ganze:

    SQL-Abfrage

    1. SELECT COUNT(`aufgabe_id`) FROM `aufgabe`

    Gibt die Anzahl der Datensätze zurück, die in der Spalte aufgabeid einen Eintrag haben.

    SQL-Abfrage

    1. SELECT COUNT(*) FROM `aufgabe`
    2. SELECT COUNT(1) FROM `aufgabe`

    Gibt die Anzahl aller Datensätze zurück, die in der Tabelle vorhanden sind.

    SQL-Abfrage

    1. SELECT DISTINCTCOUNT(`aufgabe_id`) FROM `aufgabe`

    Gibt die Anzahl der eindeutigen Datensätze zurück, die in der Spalte aufgabeid einen Eintrag haben. D.h. wenn es 3-Mal den Eintrag A gibt, wird nur 1 als Ergebnis gezählt.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    Haudruferzappeltnoch schrieb:

    Immer Count(*) statt Count(1).
    Hast du eine Quelle mit der ich das Nachvollziehen kann?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Also denkst du und weißt es nicht?

    Daher die Frage nach der Quelle auf derer Grundlage du deine Aussage begründest. als Entwickler sollte man seine Annahmen validieren. Klassisches Problem.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Nun gelesen hab ich dazu auch mal, auf sowas kommt man ja nicht von allein.

    Schau mal hier her kommt das, aus Berichtigungen von Ratschlägen, dass Count(*) schädlich sei.
    In diesem Beispiel, wo solche Hinweise kritisiert werden, wird dann anschließend Count(1) als schlechter bezeichnet für "gewisse" DB Engines.

    Am Ende ists also wohl dasselbe in MSSQL, aber für andere kann es Unterschiede machen.

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    oder verwende ein DataSet

    VB.NET-Quellcode

    1. Private Sub Button8_Click(sender As System.Object, e As System.EventArgs) Handles Button8.Click
    2. Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    3. "Data Source=D:\Db2010.accdb;"
    4. Dim query As String = "SELECT * FROM tbl_Artikel"
    5. Dim dataSet As New DataSet()
    6. Using adapter As New OleDbDataAdapter(query, connectionString)
    7. adapter.Fill(dataSet)
    8. End Using
    9. Dim dataTable As DataTable = dataSet.Tables(0)
    10. Dim rowCount As Integer = dataTable.Rows.Count
    11. Debug.WriteLine("Anzahl Datensätze: " & rowCount)
    12. End Sub
    In meiner Programmierausbildung von 2001 bis 2004 habe ich gelernt – das bezog sich aber auf das DBMS Interbase bzw. Firebird – dass ich COUNT(0) verwenden soll, weil das Zählen der Nullen schneller geht als das Zählen der Datensätze. Wie gesagt, anderes System und alte Information, also keine Ahnung, wie es bei MSSQL und heutzutage ist. Aber verwendet der TE überhaupt MSSQL? Im Profil steht was von MySQL, sonst sehe ich nichts zum verwendeten System.

    Mittlerweile verwende ich nur MySQL bzw. MariaDB und habe gelesen (Quelle im Moment unbekannt), dass man unbedingt COUNT(*) nehmen soll, weil das dann optimiert ist.

    Thomas2705 schrieb:

    Die Klammer muß unmittelbar nach Count erfolgen

    Eben getestet, für MySQL gilt das, für MSSQL nicht. Habe jeweils eine Online-Demo benutzt.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    also zumindest für SqlServer ist mein Wissensstand, dass es immer egal ist, wie der Sql-Server Datensätze zählt, und was er dafür braucht.
    Ich gehe sogar noch weiter, nämlich das wissen wir doch garnet - also es muss uns ja egal sein.

    Und ich würde der Aussage von deim Link aus post#9 widersprechen, oder zumindest stark in Zweifel ziehen.
    Und dem keinen Glauben schenken, ohne belastbare Tests gesehen zu haben.

    Edit: So, glaub endlich verstanden was du meinst, nu stimme ich dir zu.
    Ich hab den Artikel grad falschrum verstanden - mein Englisch ist schlecht und ich bin ein schlampiger Leser, sorry.



    Das * in Count(*) ist mitnichten zu verstehen als Kurzschreibe für "alle Spalten" (wie etwa in einem Select-Abschnitt).
    Sondern es bedeutet: keine Expression: zähle einfach alles, was da ist.

    Selbstredend ist ein Count() mit Expression langsamer als einer ohne. Und komplizierte Expressions sicher langsamer als primitive. Da möge man in komplizierten Fällen halt die Doku lesen, wenn man mit der Performance unzufrieden ist.
    Also komplexe Sachen kann man vielleicht besser oder schlechter machen.
    Aber zu 99% braucht man ein bestimmtes Ergebnis (alle, alle NotNulls, Distinct), und muss den Befehl für eingeben, und hat keine Wahl. Wie SqlServer das intern umsetzt kann man nicht wissen - ist somit egal.

    Imo klarere Syntax wäre, es gäbe überhaupt kein * bei Count() - aber Sql ist ja eh die vermurksteste Sprache ever.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Nun der Link ist ja nicht sonderlich unplausibel und Tests hat er ja mit angegeben, ob man denen glaubt steht auf einem anderen Blatt...Aber da sind wir ja auch bei postgre.
    Was der Link zu anderen Systemen sagt ist ja erstmal dasselbe wie du! Die Aussage dort zu "alle Spalten" ist doch genau die Aussage, die kritisiert wird, nicht die getroffen wird...