Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verstößt MySQL gegen den Standard, indem es die Auswahl von Spalten zulässt, die nicht Teil der group by-Klausel sind?

Standard-SQL würde Ihre Abfrage ablehnen, da Sie keine nicht aggregierten Felder auswählen können die nicht Teil der GROUP BY-Klausel sind in einer aggregierten Abfrage

Das ist richtig, bis 1992 .

Aber es ist einfach falsch, ab 2003 und darüber hinaus.

Aus dem SQL-2003-Standard, 6IWD6-02-Foundation-2011-01.pdf, von http ://www.wiscorp.com/ , Absatz-7.12 (Abfragespezifikation), Seite 398 :

  1. Wenn T eine gruppierte Tabelle ist, dann sei G der Satz von Gruppierungsspalten von T. In jedem ((Wertausdruck)) enthalten in ((Auswahlliste)) soll jede Spaltenreferenz, die eine Spalte von T referenziert, einige referenzieren Spalte C, die funktionsabhängig ist auf G oder muss in einem aggregierten Argument enthalten sein einer ((Set Function Specification)), deren Aggregationsabfrage QS ist

Jetzt hat MYSQL diese Funktion implementiert, indem es nicht nur zulässt Spalten, die funktionsabhängig sind auf den Gruppierungsspalten aber alle Spalten zulassen . Dies verursacht einige Probleme bei Benutzern, die nicht verstehen, wie die Gruppierung funktioniert, und unbestimmte Ergebnisse erhalten, wo sie es nicht erwarten.

Aber Sie haben Recht, wenn Sie sagen, dass MySQL eine Funktion hinzugefügt hat, die mit SQL-Standards in Konflikt steht (obwohl Sie das aus dem falschen Grund zu glauben scheinen). Es ist nicht ganz korrekt, da sie eine SQL-Standardfunktion hinzugefügt haben, aber nicht auf die beste Art (eher auf die einfache Art), aber es widerspricht den neuesten Standards.

Um Ihre Frage zu beantworten, der Grund für diese MySQL-Funktion (Erweiterung) ist vermutlich die Übereinstimmung mit den neuesten SQL-Standards (2003+). Warum sie sich entschieden haben, es auf diese Weise zu implementieren (nicht vollständig konform), können wir nur spekulieren.

Wie @Quassnoi und @Johan mit Beispielen antworteten, handelt es sich hauptsächlich um ein Leistungs- und Wartbarkeitsproblem. Aber man kann das RDBMS nicht so einfach ändern, dass es schlau genug ist (Skynet ausgenommen), um funktionsabhängige Spalten zu erkennen, also haben die MySQL-Entwickler eine Wahl getroffen:

Wir (MySQL) geben Ihnen (MySQL-Benutzer) diese Funktion, die in den SQL-2003-Standards enthalten ist. Es verbessert die Geschwindigkeit in bestimmten GROUP BY Abfragen, aber es gibt einen Haken. Aufpassen muss man (und nicht die SQL-Engine) also auf Spalten im SELECT und HAVING Listen sind funktional abhängig von GROUP BY Säulen. Andernfalls erhalten Sie möglicherweise unbestimmte Ergebnisse.

Wenn Sie es deaktivieren möchten, können Sie sql_mode festlegen zu ONLY_FULL_GROUP_BY .

Es steht alles in der MySQL-Dokumentation:Erweiterungen zu GROUP BY (5.5) - zwar nicht im obigen Wortlaut, aber wie in Ihrem Zitat (sie haben sogar vergessen zu erwähnen, dass es sich um eine Abweichung vom Standard-SQL-2003 handelt, während es sich nicht um Standard-SQL-92 handelt). Diese Art von Auswahl ist meiner Meinung nach in jeder Software üblich, einschließlich anderer RDBMS. Sie sind auf Leistung, Abwärtskompatibilität und viele andere Gründe ausgelegt. Oracle hat den berühmten '' is the same as NULL zum Beispiel und SQL-Server hat wahrscheinlich auch welche.

Es gibt auch diesen Blogbeitrag von Peter Bouman, in dem die Wahl der MySQL-Entwickler verteidigt wird:GRUPPE NACH Mythen entlarven .

2011 als @Mark Byers informierte uns in einem Kommentar (in einer verwandten Frage bei DBA.SE), PostgreSQL 9.1 hat eine neue Funktion hinzugefügt (Veröffentlichungsdatum:September 2011) für diesen Zweck entwickelt. Sie ist restriktiver als die Implementierung von MySQL und näher am Standard.

Später, im Jahr 2015, gab MySQL bekannt, dass das Verhalten in Version 5.7 verbessert wurde, um dem Standard zu entsprechen und funktionale Abhängigkeiten tatsächlich zu erkennen (sogar besser als die Postgres-Implementierung). Die Dokumentation:MySQL-Behandlung von GROUP BY (5.7) und ein weiterer Blogbeitrag von Peter Bouman:MySQL 5.7.5:GROUP BY respektiert funktionale Abhängigkeiten!