Язык SQL Применение агрегатных функций и вложенных запросов в операторе выбора
Агрегатные функции
Рассмотрим базу данных, которая моделирует сдачу сессии в некотором учебном заведении, Пусть она состоит из трех отношении R1, R2, Rз- Будем считать, что они представлены таблицами R1, R2 и R3 соответственно. R1 =(ФИО, Дисциплина, Оценка); R2 = (ФИО, Группа); R3 = (Группы, Дисциплина ) R1 =(ФИО, Дисциплина, Оценка); R2 = (ФИО, Группа); R3 = (Группы, Дисциплина )
Пример
Пример с Count() Посчитать количество 2-к за экзамен «базы данных» Посчитать количество 2-к за экзамен «базы данных» SELECT количество 2-к = count(*) FROM R1 WHERE Дисциплина =Базы данных AND Оценка = 2 Результат Результат Количесто 2-к = 2
Группировки
Рассмотрим подробно, как работает этот запрос
Результат
определить для каждой группы и каждой дисциплины количество успешно сдавших экзамен и средний балл по дисциплине.
Результат
Отбор групп Построим запрос, который выводит группы, в которых по одной дисциплине на экзаменах получено больше одной двойки Построим запрос, который выводит группы, в которых по одной дисциплине на экзаменах получено больше одной двойки
БД Банк F = (N, ФИО, Филиал, ДатаОткрытия, ДатаЗакрытия, Остаток); F = (N, ФИО, Филиал, ДатаОткрытия, ДатаЗакрытия, Остаток); Q = (Филиал, Город); Q = (Филиал, Город); Например, предположим, что мы хотим найти суммарный остаток на счетах филиалах. Например, предположим, что мы хотим найти суммарный остаток на счетах филиалах. SELECT SUM(Oстаток) FROM F SELECT SUM(Oстаток) FROM F GROUP BY Филиал; GROUP BY Филиал;
Особенности HAVING Аргументы в предложении HAVING подчиняются тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода. Аргументы в предложении HAVING подчиняются тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода. Пример неправильного запроса SELECT Филиал, SUM(Остаток) FROM F GROUP ВУ Филиал HAVING ДатаОткрытия = 27/12/1999:
Особенности Having предложение HAVING должно ссылаться только на агрегаты и поля, выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос: предложение HAVING должно ссылаться только на агрегаты и поля, выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос: SELECT Филиал, SUM(Остаток) - FROM F WHERE ДатаОткрытия = '27/12/1999' GROUP BY Филиал; Смысл данного запроса следующий: найти сумму остатков по каждому филиалу счетов, открытых 27 декабря 1999 года.
Пример суммарные остатки на счетах филиалов в Санкт-Петербурге, Пскове и Урюпинске: суммарные остатки на счетах филиалов в Санкт-Петербурге, Пскове и Урюпинске: SELECT Филиал, SUM(Ocтaток) FROM F, Q WHERE F.Филиал = Q.Филиал GROUP BY Филиал HAVING Филиал IN («Санкт-Петербург». «Псков», «Урюпинск»);