Меня учили и слышали, что в sql / mysql элементы в select
предложении должны появляться в предложении GROUP BY или использоваться в статистической функции , как в здесь
Однако приведенный ниже пример мог изменить мое мнение.
Две таблицы: Студент (ключ - это sid)
sid | name | email
========================
99901| mike | mike@a.edu
99902| jane | jane@b.edu
99903| peter| pete@b.edu
Взял (sid + oid вместе - это ключ, oid означает предложение идентификатора)
sid | oid| grade
==================
99901| 1 | 100
99901| 2 | 30
99901| 3 | 40
99902| 4 | 100
99902| 5 | 100
99902| 6 | 40
99903| 6 | 95
Вопрос : я хочу найти sid, имя и среднюю оценку каждого ученикакоторый прошел как минимум 2 курса.
Ответ :
select s.sid, name, avg(grade) as average
from Student as s, Took as t
where s.sid = t.sid
group by s.sid
having count(*) >= 2;
Результат:
sid | name | avgerage
=======================
99901| mike | 56.6667
99902| jane | 80.0000
На основе должно появиться в предложении GROUP BY или использоваться в статистической функции , запрос должен быть неверным, поскольку name
отсутствует ни в групповом предложении, ни в статистической функции.
Я посмотрел некоторыесообщений и это , я понимаю, что хотя name
не входит ни в групповое предложение, ни в агрегатную функцию, мы группируем по sid
, чтоключ и каждый sid
соответствуют только одному name
, поэтому он не будет возвращать несколько опций, из которых sql не знает, какой из них вернуть. Чтобы подтвердить мое понимание, если я выберу еще один столбец email
, все равно все в порядке;но если я выберу oid
, это выдаст ошибку, потому что каждый sid
соответствует более чем одному oid
.
Может ли кто-нибудь исправить мое понимание, если оно неверно, или уточнить подробнее об этом утверждении: must appear in the GROUP BY clause or be used in an aggregate function
Спасибо.
Первое редактирование :
Кстати, я тестировал в MySQL 8.0.17
Второе редактирование :
Просто краткое изложение полезных ссылок, когда вы читаете ответы / комментарии ниже.
Функциональная зависимость
Изменение стандарта SQL