powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объясните логику запроса вида having + константа
8 сообщений из 8, страница 1 из 1
Объясните логику запроса вида having + константа
    #39755346
Dmi_tri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица EXAM_MARKS(EXAM_ID, STUDENT_ID, SUBJ_ID, MARK, EXAM_DATE). Необходимо определить сумму полученных студентами оценок (mark), сгруппировав значения оценок по датам экзаменов и исключив те дни, когда число студентов, сдававших в течение дня экзамены, было меньше 10

В учебнике дан следующий вариант запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT EXAM_DATE, SUM(MARK)
FROM EXAM_MARKS A
GROUP BY EXAM_DATE
HAVING 10 <
(SELECT COUNT(MARK)
FROM EXAM_MARKS B
WHERE A.EXAM_DATE = B.EXAM.DATE);



Не понимаю, как к запросу подсоединено условие HAVING? Обычно, это ключевое слово отсеивает группы, сформированные с помощью GROUP BY. Тут же оно почему-то употребляется с константой, никак не связанной с GROUP BY. Да и непонятен сам смысл выражения HAVING const < const. Как тут накладывается ограничение? Например, если подзапрос вернул COUNT(MARK)=5. Тогда мы имеем HAVING 10 < 5, что всегда false. Что из этого следует?
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39755538
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmi_tri,

having это условие отсеивающее после выборки, ну и не константное условие, да и подзапрос привязывается по A.EXAM_DATE
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39755600
Dmi_tri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
artasDmi_tri,

having это условие отсеивающее после выборки

да, знаю. вопрос был про синтаксическую корректность конкретного запроса. почему HAVING употреблено с константой? ведь SQL славится тем, что у него человеко читаемый синтаксис, а в данном запросе это явно нарушается.
"имеющий 10 меньше, чем количество оценок" так никто не говорит. легко перестроить в человеко читаемый формат - имеющий количество оценок большее, чем 10. и тогда запрос трансформируется в такой вид:
Код: sql
1.
2.
3.
4.
SELECT exam_date, SUM(mark) 
FROM exam_marks 
GROUP BY exam_date 
HAVING count(mark)>10;


Запустил в воркбенч, запрос выдает тот же результат. Они абсолютно идентичны?
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39755667
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmi_triОни абсолютно идентичны?
Да.
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39756178
Dmi_tri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Другой пример: есть таблица Сессия(ФИО, Дисциплина, Оценка). Нужно найти студентов, которые сдали все экзамены на оценку не ниже, чем 4.

Написал такой запрос:
Код: sql
1.
2.
SELECT * FROM Сессия
WHERE Оценка>=4;



В учебнике дан ответ:
Код: sql
1.
2.
3.
SELECT ФИО
FROM Сессия
WHERE 4>=ALL (SELECT Оценка FROM Сессия AS Сессия1 WHERE Сессия.ФИО=Сессия1.ФИО);



Вопрос: зачем использовать такой перегруженный синтаксис, если можно обойтись простейшим запросом?
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39756181
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmi_triВопрос: зачем использовать такой перегруженный синтаксис, если можно обойтись простейшим запросом?читай задачу
Код: plaintext
которые сдали все экзамены на оценку не ниже, чем 4.
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39756190
Dmi_tri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, не заметил. Но все равно задача решается простейшим запросом
Код: sql
1.
select фио from сессия group by фио having min(оценка)>=4;
...
Рейтинг: 0 / 0
Объясните логику запроса вида having + константа
    #39756280
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmi_triЕсть таблица EXAM_MARKS(EXAM_ID, STUDENT_ID, SUBJ_ID, MARK, EXAM_DATE). Необходимо определить сумму полученных студентами оценок (mark), сгруппировав значения оценок по датам экзаменов и исключив те дни, когда число студентов, сдававших в течение дня экзамены, было меньше 10

В учебнике дан следующий вариант запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT EXAM_DATE, SUM(MARK)
FROM EXAM_MARKS A
GROUP BY EXAM_DATE
HAVING 10 <
(SELECT COUNT(MARK)
FROM EXAM_MARKS B
WHERE A.EXAM_DATE = B.EXAM.DATE);



Не понимаю, как к запросу подсоединено условие HAVING? Обычно, это ключевое слово отсеивает группы, сформированные с помощью GROUP BY. Тут же оно почему-то употребляется с константой, никак не связанной с GROUP BY. Да и непонятен сам смысл выражения HAVING const < const. Как тут накладывается ограничение? Например, если подзапрос вернул COUNT(MARK)=5. Тогда мы имеем HAVING 10 < 5, что всегда false. Что из этого следует?

Тут так и есть, отсеивается группа, и не константа, а поле таблицы из формируемой группы
.EXAM_DATE участвует в условии корреляции подзапрос а, то есть таким образом накладывается фильтр на группу.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объясните логику запроса вида having + константа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]