Neu in MySQL hier. Ich benutze MySQL Version 5.6.25-Enterprise-Commercial-Advanced, und ich habe Tabellen
mysql> select * from Department;
+-------+--------------+
| DepID | DepName |
+-------+--------------+
| 1 | English |
| 2 | Math |
| 3 | History |
| 4 | French |
| 5 | Geography |
| 6 | Drawing |
| 7 | Architecture |
+-------+--------------+
und
mysql> select * from Student;
+--------+----------+------------+-------+
| StudID | StudName | StudentAge | DepID |
+--------+----------+------------+-------+
| 1 | Alice | 21 | 2 |
| 2 | Alfred | 20 | 3 |
| 3 | Henry | 19 | 3 |
| 4 | Jacobs | 22 | 5 |
| 5 | Bob | 20 | 4 |
| 6 | Shane | 22 | 4 |
| 7 | Linda | 24 | 4 |
| 8 | Stacy | 20 | 1 |
| 9 | Wolfred | 21 | 2 |
| 10 | Sandy | 25 | 1 |
| 11 | Colin | 18 | 1 |
| 12 | Maria | 19 | 3 |
| 13 | Ziva | 20 | 5 |
| 14 | Mark | 23 | 5 |
| 15 | Fred | 25 | 2 |
| 16 | Vic | 25 | NULL |
| 17 | Nick | 25 | NULL |
+--------+----------+------------+-------+
Ich verwende eine Abfrage:
SELECT Department.DepName, AVG(Student.StudentAge) AS AvgStudAge
FROM Student
RIGHT JOIN Department
ON Student.DepID = Department.DepID;
das ergibt nur eine einzige Zeile:
+---------+------------+
| DepName | AvgStudAge |
+---------+------------+
| English | 21.2667 |
+---------+------------+
...Ich bin jedoch der Meinung, dass ich auch alle anderen Zeilen abrufen sollte. In der Spalte DepName wird etwa "Englisch" oder "Mathematik" angezeigt, und das zugehörige Gesamtalter ist das Durchschnittsalter aller mit dieser Abteilung verbundenen Studenten. Warum gibt es nur eine Zeile für Englisch zurück?
Ich habe tatsächlich festgestellt, dass das Einfügen der folgenden Codezeile GROUP BY DepName;
am Ende meiner vorherigen Abfrage gibt mir, was ich will, aber ich verstehe nicht, warum ich nach irgendetwas gruppieren muss.
Jede Klarstellung wäre dankbar!
Antworten:
0 für die Antwort № 1In Ihrer Anfrage:
SELECT Department.DepName, AVG(Student.StudentAge) AS AvgStudAge
FROM Student
RIGHT JOIN Department
ON Student.DepID = Department.DepID;
Mit einem Aggregat wie AVG
ohne auch mit GROUP BY
In SQL wird dies als Durchschnitt aller zurückgegebenen Daten betrachtet, unabhängig von der Abteilung.
Das DepName
dass MySQL in der einzelnen zurückgegebenen Zeile angezeigt wirdist willkürlich der erste zurückgegebene Wert. Anders als MySql löst ein ANSI - kompatibles RDBMS einen Fehler für diese Abfrage aus, da entweder ALLE ausgewählten Spalten mit einem Aggregat eingefügt werden müssen (falls nicht vorhanden) GROUP BY
) oder alle nicht aggregierten Spalten müssen in der GROUP BY
Klausel (wenn gruppiert). MySql ist in dieser Hinsicht ärgerlich tolerant und dies kann zu Fehlern führen.
Beispiel für das durchschnittliche Studentenalter pro Abteilung:
SELECT Department.DepName, AVG(Student.StudentAge) AS AvgStudAge
FROM Student
RIGHT JOIN Department
ON Student.DepID = Department.DepID
GROUP BY Department.DepName;
Durchschnittsalter aller Schüler:
SELECT AVG(Student.StudentAge) AS AvgStudAge
FROM Student;
Beispiele für Aggregate mit / ohne GROUP BY
Hier
-1 für die Antwort № 2
Fügen Sie einfach Group By im letzten hinzu GROUP by Department.DepID
Sie haben alle Abteilungen durchschnittlich