/ / Wenn ich mysql GROUP BY nicht benutze, erhalte ich nur eine Datenzeile - mysql, relationale Datenbank

Wenn ich nicht mysql GROUP BY verwende, bekomme ich nur eine Zeile Daten - mysql, relational-database

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 № 1

In 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 BYIn 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.DepIDSie haben alle Abteilungen durchschnittlich