Базы данных. Краморенко Н.В. - 73 стр.

UptoLike

Составители: 

74
Фраза GROUP BY (группировать по) инициирует перекомпоновку указанной во FROM
таблицы по группам, каждая из которых имеет одинаковые значения в поле, указанном в GROUP BY.
В рассматриваемом примере записи таблицы Продажи группируются так, что в одной группе
содержатся все записи с датой продажи ДатаПродажи = 25.03.03, в другой с датой продажи
ДатаПродажи = 02.01.04 и т.д. (см. Таблицу 3-6). Далее к каждой группе применяется фраза SELECT.
Каждое выражение в этой фразе должно принимать единственное значение для группы, т.е. оно
может быть либо значением поля, указанного в GROUP BY, либо арифметическим выражением,
включающим это значение, либо константой, либо одной из SQL-функций, которая оперирует всеми
значениями поля в группе и сводит эти значения к единственному значению (например, к сумме).
4.2.2. Вложенные подзапросы
Виды вложенных подзапросов
Вложенный подзапрос - это подзапрос, заключенный в круглые скобки и вложенный в
WHERE (HAVING) фразу предложения SELECT или других предложений, использующих WHERE
фразу. Вложенный подзапрос может содержать в своей WHERE (HAVING) фразе другой вложенный
подзапрос и т.д. Вложенный подзапрос создан для того, чтобы при отборе записей таблицы,
сформированной основным запросом, можно было использовать данные из других таблиц.
Существуют простые и коррелированные вложенные подзапросы. Они включаются в WHERE
(HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | >
| >= ). Простые вложенные подзапросы обрабатываются системой "снизу вверх". Первым
обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в
результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.
Запросы с коррелированными вложенными подзапросами обрабатываются системой в
обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным
запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном
подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного
подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока
в результат не будут включены все строки, удовлетворяющие вложенному подзапросу
(последовательности вложенных подзапросов).
Вложенные подзапросы с предикатом IN
Простые вложенные подзапросы используются для представления множества значений,
исследование которых должно осуществляться в каком-либо предикате IN
1. Подзапрос с одним уровнем вложенности
Выдать название и телефон поставщиков продукта с кодом 9, т.е. моркови.
SELECT Поставщик, Телефон
FROM Поставщики
WHERE КодПост IN
(SELECT КодПост
FROM Поставки
WHERE КодПрод=9);
Как уже отмечалось, при обработке полного запроса система выполняет прежде всего
вложенный подзапрос. Этот подзапрос выдает множество номеров поставщиков, которые поставляют
продукт с кодом КодПрод = 9, а именно множество (1, 2, 3). Поэтому первоначальный запрос
эквивалентен такому простому запросу:
SELECT Поставщик, Телефон
FROM Поставщики
WHERE КодПост IN (1,2,3);
Результат запроса
       Фраза GROUP BY (группировать по) инициирует перекомпоновку указанной во FROM
таблицы по группам, каждая из которых имеет одинаковые значения в поле, указанном в GROUP BY.
В рассматриваемом примере записи таблицы Продажи группируются так, что в одной группе
содержатся все записи с датой продажи ДатаПродажи = 25.03.03, в другой с датой продажи
ДатаПродажи = 02.01.04 и т.д. (см. Таблицу 3-6). Далее к каждой группе применяется фраза SELECT.
Каждое выражение в этой фразе должно принимать единственное значение для группы, т.е. оно
может быть либо значением поля, указанного в GROUP BY, либо арифметическим выражением,
включающим это значение, либо константой, либо одной из SQL-функций, которая оперирует всеми
значениями поля в группе и сводит эти значения к единственному значению (например, к сумме).

4.2.2. Вложенные подзапросы
       Виды вложенных подзапросов
       Вложенный подзапрос - это подзапрос, заключенный в круглые скобки и вложенный в
WHERE (HAVING) фразу предложения SELECT или других предложений, использующих WHERE
фразу. Вложенный подзапрос может содержать в своей WHERE (HAVING) фразе другой вложенный
подзапрос и т.д. Вложенный подзапрос создан для того, чтобы при отборе записей таблицы,
сформированной основным запросом, можно было использовать данные из других таблиц.
       Существуют простые и коррелированные вложенные подзапросы. Они включаются в WHERE
(HAVING) фразу с помощью условий IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | >
| >= ). Простые вложенные подзапросы обрабатываются системой "снизу вверх". Первым
обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в
результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.
       Запросы с коррелированными вложенными подзапросами обрабатываются системой в
обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным
запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном
подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного
подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока
в результат не будут включены все строки, удовлетворяющие вложенному подзапросу
(последовательности вложенных подзапросов).

       Вложенные подзапросы с предикатом IN
       Простые вложенные подзапросы используются для представления множества значений,
исследование которых должно осуществляться в каком-либо предикате IN
1. Подзапрос с одним уровнем вложенности
Выдать название и телефон поставщиков продукта с кодом 9, т.е. моркови.
       SELECT Поставщик, Телефон
       FROM Поставщики
       WHERE КодПост IN
       (SELECT КодПост
       FROM Поставки
       WHERE КодПрод=9);
       Как уже отмечалось, при обработке полного запроса система выполняет прежде всего
вложенный подзапрос. Этот подзапрос выдает множество номеров поставщиков, которые поставляют
продукт с кодом КодПрод = 9, а именно множество (1, 2, 3). Поэтому первоначальный запрос
эквивалентен такому простому запросу:
       SELECT Поставщик, Телефон
       FROM Поставщики
       WHERE КодПост IN (1,2,3);




Результат запроса




                                                    74