SQL vs MySQL: Regeln für Aggregatoperationen und GROUP BY

Imdieses Buch Ich lese gerade, während ich einen Kurs über Datenbanken besuche. Das folgende Beispiel zeigt eine unzulässige Abfrage mit einem Aggregatoperator:

Finden Sie den Namen und das Alter des ältesten Seemanns.

Betrachten Sie den folgenden Versuch, diese Abfrage zu beantworten:

SELECT S.sname, MAX(S.age)
FROM Sailors S

Mit dieser Abfrage soll nicht nur das Höchstalter, sondern auch der Name der Matrosen mit diesem Alter zurückgegeben werden. Diese Abfrage ist in SQL jedoch unzulässig. Wenn die SELECT-Klausel eine Aggregatoperation verwendet, muss sie verwendet werdennur Aggregatoperationen, es sei denn, die Abfrage enthält eine GROUP BY-Klausel!

Einige Zeit später, als ich eine Übung mit MySQL durchführte, hatte ich ein ähnliches Problem und machte einen Fehler, der dem erwähnten ähnlich war. MySQL beschwerte sich jedoch nicht und spuckte nur einige Tabellen aus, die sich später als nicht das herausstellten, was ich brauchte.

Ist die obige Abfrage in SQL wirklich illegal, in MySQL jedoch legal, und wenn ja, warum? In welcher Situation müsste man eine solche Abfrage machen?

Weitere Ausarbeitung der Frage:

Die Frage ist nicht, ob alle Attribute, die in einem SELECT erwähnt werden, auch in einem GROUP BY erwähnt werden sollen. Es geht darum, warum die obige Abfrage, die Attribute zusammen mit Aggregatoperationen für Attribute ohne GROUP BY verwendet, in MySQL zulässig ist.

Angenommen, die Sailors-Tabelle sah folgendermaßen aus:

+----------+------+
| sname    | age  |
+----------+------+
| John Doe |   30 |
| Jane Doe |   50 |
+----------+------+

Die Abfrage würde dann zurückgeben:

+----------+------------+
| sname    | MAX(S.age) |
+----------+------------+
| John Doe |         50 |
+----------+------------+

Nun, wer würde das brauchen? John Doe ist nicht 50, er ist 30! Wie in dem Zitat aus dem Buch angegeben, ist dies ein erster Versuch, den Namen und das Alter des ältesten Seemanns zu ermitteln, in diesem Beispiel Jane Doe im Alter von 50 Jahren.

SQL würde sagen, dass diese Abfrage illegal ist, aber MySQL fährt einfach fort und spuckt "Müll" aus. Wer würde ein solches Ergebnis brauchen? Warum erlaubt MySQL diese kleine Falle für Neulinge?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage