/ / Коли я не використовую mysql GROUP BY, я отримую лише один ряд даних - mysql, реляційна база даних

Коли я не використовую mysql GROUP BY, я отримую лише один рядок даних - mysql, relational-database

нова для mysql тут. Я використовую mysql версії 5.6.25-підприємство-комерційний-просунутий, і у мене є таблиці

mysql> select * from Department;
+-------+--------------+
| DepID | DepName      |
+-------+--------------+
|     1 | English      |
|     2 | Math         |
|     3 | History      |
|     4 | French       |
|     5 | Geography    |
|     6 | Drawing      |
|     7 | Architecture |
+-------+--------------+

і

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 |
+--------+----------+------------+-------+

Я використовую запит:

SELECT Department.DepName, AVG(Student.StudentAge) AS AvgStudAge
FROM Student
RIGHT JOIN Department
ON Student.DepID = Department.DepID;

що призводить лише до одного рядка:

+---------+------------+
| DepName | AvgStudAge |
+---------+------------+
| English |    21.2667 |
+---------+------------+

...але я вважаю, що я повинен отримувати і всі інші рядки, коли стовпець DepName дає мені щось на кшталт "англійська мова" або "математика", а відповідний сукупний вік є середнім віком усіх студентів, пов'язаних з цим відділом. Чому він повертає лише рядок англійською мовою?

Я фактично виявив, що вставляючи наступний рядок коду GROUP BY DepName; наприкінці мого попереднього запиту дає мені те, що я хочу, але я не розумію, чому мені доводиться щось групувати.

Будь-яке уточнення буде вдячно!

Відповіді:

0 для відповіді № 1

У вашому запиті:

SELECT Department.DepName, AVG(Student.StudentAge) AS AvgStudAge
FROM Student
RIGHT JOIN Department
ON Student.DepID = Department.DepID;

За допомогою сукупності like AVG без використання GROUP BY, SQL трактує це як середнє значення всіх повернених даних, незалежно від відділу.

The DepName що MySql відображається на повернутому одному рядкудовільно перше значення, яке повертається. За винятком MySql, СУБД, що відповідає стандарту ANSI, спричинить помилку для цього запиту, оскільки ВСІ вибрані стовпці повинні бути введені з сукупністю (якщо немає GROUP BY), або всі неагреговані стовпці повинні бути в GROUP BY речення (при групуванні). MySql у цьому відношенні дратує терпимість, і це може призвести до помилок.

Приклад середнього віку студентів на кафедру:

SELECT Department.DepName, AVG(Student.StudentAge) AS AvgStudAge
FROM Student
RIGHT JOIN Department
ON Student.DepID = Department.DepID
GROUP BY Department.DepName;

Середній студентський вік усіх студентів:

SELECT AVG(Student.StudentAge) AS AvgStudAge
FROM Student;

Приклади агрегатів з / без GROUP BY тут


-1 для відповіді № 2

Просто додайте Group By в останню GROUP by Department.DepID, ви будете мати середні усі відділи