Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
186 Кб
Скачать
☆

2.8.5Группировка данных

Предложение GROUP BY неразрывно связано с агрегирующими функциями. Предложение GROUP BY разделяет таблицу на наборы, а агрегирующая функция вычисляет для каждого из них итоговое значение.

Пример:

SELECT SUM(Оклад) FROM СП_СЛ

Возвращает фонд заработной платы для ВСЕЙ организации.

SELECT Код лаборатории, SUM(Оклад) FROM СП_СЛ GROUP BY Код лаборатории

Возвращает фонд заработной платы для каждой лаборатории.

В большинстве диалектов SQL каждый элемент из списка GROUP BY должен обязательно присутствовать в списке выбора, то есть группировать можно только выбираемые элементы.

Использование предложения GROUP BY без агрегирующих функций напоминает использование предложения DISTINCT. Оно разделяет таблицу на группы и для каждой из них возвращает по одной строке.

Пример:

SELECT Код лаборатории FROM СП_СЛ GROUP BY Код лаборатории

SELECT DISTINCT Код лаборатории FROM СП_СЛ

Оба запроса возвращают аналогичный результат.

В самом общем смысле, предложение HAVING работает аналогично предложению WHERE, но применяется к группам. WHERE накладывает ограничения на строки, а HAVING – на группы. Как правило, предложение HAVING используется совместно GROUP BY.

Если запрос содержит предложения WHERE, GROUP BY, HAVING и агрегирующие функции, то он выполняется в следующей последовательности.

    1. Предложение WHERE находит требуемые строки.

    2. Предложение GROUP BY делит найденные строки на группы.

    3. Когда группы составлены, вычисляются обобщающие значения для каждой группы.

    4. Предложение HAVING проверяет результирующие строки всех групп и решает, следует ли включить их в окончательный результат.

Пример:

1. SELECT Код лаборатории, COUNT(*) FROM СП_СЛ GROUP BY Код лаборатории HAVING COUNT(*)>5

Выбирает только те лаборатории, в которых работает больше 5 сотрудников.

2. SELECT Код лаборатории, COUNT(*) FROM СП_СЛ GROUP BY Код лаборатории HAVING Код лаборатории LIKE ‘1%’

SELECT Код лаборатории, COUNT(*) FROM СП_СЛ WHERE Код лаборатории LIKE ‘1%’ GROUP BY Код лаборатории

Оба запроса возвращают лаборатории, имеющие код, начинающийся с «1», и количество служащих, работающих в этих лабораториях. Однако второй запрос более эффективен, так как строки, содержащие коды лабораторий, которые не начинаются с «1», будут удалены до группирования, а не после него, как это произойдет в первом случае.

2.9Соединение таблиц и сложный анализ данных

Теоретико-множественные операции – объединения, пересечения и разности – реализованы непосредственно в языке SQL.

SQL позволяет простым и естественным способом сочетать в одном запросе обращения к нескольким отношениям одновременно: достаточно перечислить наименование отношений в предложении FROM, после чего можно обращаться к их атрибутам в предложениях SELECT, WHERE. Соединение двух отношений определяется с помощью двух столбцов, которые называются связанными столбцами. Связанные столбцы должны содержать значения, которые можно сопоставить друг с другом.

2.9.1Соединение

Синтаксис операции соединения имеет следующий вид:

SELECT <Список выбора>

FROM Таблица1, Таблица2 [, Таблица3]

WHERE [Таблица1.]столбец <оператор соединения>

[Таблица2]столбец

Обычно в качестве оператора соединения используют оператор равенства.

Пример:

SELECT Наименование лаборатории, COUNT(СП_СЛ.Код лаборатории) FROM СП_СЛ, ЛАБ WHERE СП_СЛ.Код лаборатории=ЛАБ.Код лаборатории GROUP BY СЛ_СП.Код лаборатории

Возвращает наименование лаборатории и количество служащих, работающих в лаборатории.

Для создания соединения в синтаксисе SQL-92 предусмотрены ключевые слова JOIN, CROSS JOIN, NATURAL JOIN

SELECT <Список выбора>

FROM Таблица1 JOIN Таблица2

[ON [Таблица1.]столбец <оператор соединения> [Таблица2.]столбец

| USING (столбец)]

Пример:

SELECT Наименование лаборатории, COUNT(СП_СЛ.Код лаборатории) FROM СП_СЛ JOIN ЛАБ ON СП_СЛ.Код лаборатории=ЛАБ.Код лаборатории GROUP BY СЛ_СП.Код лаборатории

Если используется оператор CROSS JOIN, то связанные столбцы определяются в предложении WHERE (если предложение WHERE пропущено, то результатом соединения является декартово произведение)

Оператор NATURAL JOIN применяется, только если две таблицы имеют одну пару одинаковых столбцов. Соединение выполняется на основе этих столбцов, при этом предложения IN, USING или WHERE для соединения не нужны и не определяются.

Столбцы в <Списке выбора> при соединении будут включаться в результат в указанном порядке.

SELECT * SELECT [Таблица1.]*, [Таблица2.]*

Необдуманное использование таких операторов при соединении может привести к большей загрузке системы, чем это необходимо. При решении практических задач нужно тщательно выбирать столбы, участвующие в результате.

При соединении таблиц удобно использовать псевдонимы в списке таблиц.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]