SQL vs MySQL: Regeln über Aggregat operations und GROUP BY

In dieses Buch ich bin derzeit zu Lesen, während im Anschluss ein Kurs auf Datenbanken das folgende Beispiel einer illegalen Abfrage mit einem aggregate-operator ist gegeben:

Finden Sie die Namen und das Alter der älteste Seemann.

Betrachten Sie den folgenden Versuch, diese zu beantworten-Abfrage:

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

Die Absicht für diese Abfrage nicht nur das maximale Alter, aber
auch die Namen der Segler mit dem Alter. Allerdings ist diese Abfrage
illegal in SQL--wenn der SELECT-Klausel verwendet eine Aggregat-Betrieb, dann
es muss nur Aggregat-Operationen, es sei denn, die Abfrage enthält eine GROUP BY-Klausel!

Einige Zeit später, während Sie eine übung mit MySQL, ich Stand vor einem ähnlichen problem und einen Fehler gemacht hat, ähnlich wie der erwähnte. Aber MySQL nicht beschweren und Spucke einige Tabellen, die später stellte sich heraus, nicht das zu sein, was ich brauchte.

Ist die obige Abfrage eigentlich illegal in SQL, aber legal in MySQL, und wenn ja, warum ist das so?
In welcher situation würde man brauchen, um eine solche Abfrage?

Weitere Ausarbeitung der Frage:

Die Frage ist nicht, ob oder nicht alle genannten Attribute in einer SELECT-sollte auch erwähnt werden, dass in einer GRUPPE DURCH.
Es geht darum, warum die obige Abfrage unter Verwendung Attribute zusammen mit Aggregat-Operationen auf Attributen, ohne jede GRUPPE, die VON ist legal in MySQL.

Lassen Sie uns sagen, die Sailors-Tabelle sah so aus:

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

Die Abfrage würde dann wieder:

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

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

SQL würde sagen, dass diese Abfrage ist illegal, aber MySQL nur Einnahmen und spuckt "Müll".
Wer würde brauchen diese Art von Ergebnis?
Warum macht MySQL erlauben, diese kleine Falle für Neulinge?

  • Sie sicher, dass das die genaue Abfrage aus dem Buch? Es gibt kein Aggregat in es.
  • 1. Ja. 2. Ja. 3. das weiß Gott allein. 4. Faulheit
  • Ich gehe davon aus, dass der Abfrage ist es, zu geben, die grundlegenden schema, mit zu arbeiten.
  • Stellen Sie sich die situation, entwickeln eine Menge von Abfragen in MySql mithilfe dieser syntax dann vorstellen, das Szenario, wo Sie haben sich zu bewegen, diese Abfragen an SQL-Server... müsste man ändern alle Ihre Anfragen, die diese verwendet. Wenn, jedoch, Sie würde die ANSI-syntax in den ersten Platz, dann wäre dies nicht (unbedingt) der Fall sein.
  • Hoppla, du hast Recht, ich habe vergessen zu schreiben, MAX (S. Alter), es ist nun behoben. =)
  • Klar, es gibt zwei verschiedene "Probleme" hier - 1) die Tatsache, dass keine GROUP BY - Klausel wird angegeben, an allen 2) Die Tatsache, dass Sie eine nicht-Aggregat-Spalte aufgelistet (der name der Seemann). Welches sind Sie tatsächlich besorgt um.
  • Dies könnte helfen, das Verständnis der seltsame MySQL-Verhalten: rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html
  • Realted Frage: Warum hat MySQL ein feature hinzufügen, dass Konflikte mit SQL-standards?
  • Wir können bestätigen, dass die Abfrage sollte illegal sein. Entweder eine weitere Zeile "GROUP BY sname" sollte Hinzugefügt werden, oder "sname" sollte nicht erwähnt werden, dass in der SELECT-Anweisung. Wie ich es sehe, nach SQL, nicht-Aggregat-Spalten und GROUP BY sollte "gehen hand-in-hand". =)
  • Scheint so, ich check it out. Thx!!! ^_^
  • Eine interessante Lektüre, Es scheint, es hat alle Antworten, thx!!! Ich würde vorschlagen, du postest es als Antwort statt eines Kommentars. ^_^

InformationsquelleAutor phaz | 2012-10-11
Schreibe einen Kommentar