Тема: Примеры группирования, исключения и триггеры Вопросы: 1. Примеры группирования в запросах 2. Обработка исключения 3. Работа с триггерами 1
Вложенные подзапросы Коррелированные подзапросы: в операторе SELECT внутреннего подзапроса можно ссылаться на столбцы внешнего запроса. Такой подзапрос выполняется для каждой строки таблицы, определяя условие ее вхождения в формируемый результирующий набор. Пример коррелированного подзапроса: SELECT * from tbl 1 t 1 WHERE f 2 IN (SELECT f 2 FROM tbl 2 t 2 WHERE t 1. f 3=t 2. f 3); Для каждой строки таблицы tbl 1 будет проверяться условие, что значение поля f 2 совпадает со значением строки таблицы tbl 2, где значение поля f 3 равно значению поля f 3 внешней таблицы (tbl 1). 2
Исходные таблицы TBL 1 и TBL 2 3
Результат запроса 4
Примеры группирования в запросах HAVING — необязательный параметр оператора SELECT для указания условия на результат агрегатных функций (MAX, SUM, AVG, …). HAVING <условия> аналогичен WHERE <условия> за исключением того, что строки отбираются не по значениям столбцов, а строятся из значений столбцов указанных в GROUP BY и значений агрегатных функций, вычисленных для каждой группы, образованной GROUP BY. Необходимо, чтобы в SELECT были заданы только требуемые в выходном потоке столбцы, перечисленные в GROUP BY и/или агрегированные значения. Если параметр GROUP BY в SELECT не задан, HAVING применяется к «группе» всех строк таблицы, полностью дублируя WHERE (допускается не во всех реализациях 5 стандарта SQL).
Вложенные подзапросы Для коррелированного подзапроса во фразе HAVING можно использовать только агрегирующие функции, так как при выполнении подзапроса в качестве проверяемой строки выступает результат группирования строк на основе агрегирующих функций основного запроса. Пример: SELECT f 1, COUNT(*), SUM(f 2) from tbl 1 t 1 GROUP BY f 1 HAVING SUM(f 2)> (SELECT MIN(f 2)*4 FROM tbl 1 t 1_in WHERE t 1. f 1=t 1_in. f 1); 6
Таблица Результат вложенного подзапроса 7
Таблица Результат вложенного подзапроса 8
9