Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LECTIONS_BDBZ.doc
Скачиваний:
20
Добавлен:
16.12.2018
Размер:
1.63 Mб
Скачать

Правила виконання sql–запиту на вибірку (з врахуванням секції having)

  1. Сформувати декартовий добуток таблиць, вказаних в секції FROM. Якщо в секції FROM вказана лише одна таблиця, то декартовим добутком буде вона сама.

  2. Якщо є секція WHERE – то застосувати умову секції WHERE до кожного рядка таблиці, утвореної в результаті декартового добутку і залишити тільки ті рядки, для яких ця умова виконується, - тобто має значення TRUE; рядки, для яких умова має значення FALSE або NULL – відкидаються.

  3. Якщо є секція GROUP BY, - то розділити рядки, що залишилися в результуючій таблиці, на групи таким чином, щоб рядки в кожній групі мали одинакові значення по всіх стовпчиках групування.

  4. Якщо є секція HAVING, - то застосувати умову секції HAVING до кожної групи рядків і залишити в результуючій таблиці тільки ті групи рядків, для яких ця умова виконується, - тобто має значення TRUE; групи, для яких ця умова має значення FALSE або NULL – відкидаються.

  5. Для кожного рядка (чи для кожної групи рядків), що залишилися, - обчислити значення кожного елемента із списку полів секції SELECT і утворити один рядок в таблиці результатів запиту. При будь-якому звертанні до стовпчика береться значення стовпчика для біжучого рядка (або групи рядків).

В якості аргумента статистичної функції використовуються значення стовпчика із всіх рядків, які входять у групу (якщо є секція GROUP BY); якщо ж секції GROUP BY – немає, то використовуються значення стовпчика із всіх рядків таблиці результатів запиту.

  1. Якщо є ключове слово DISTINCT – вилучити із результуючої таблиці всі рядки-дублікати.

  2. Якщо є секція ORDER BY – відсортувати результати запиту.

Нехай є таблиці

Товари

Код виробника

Код

товару

Назва

Ціна

Кількість наявного

Замовлення

замовл.

Дата

Код

клієнта

Код

працівника

Код

виробника

Код

товару

Кількість

Приклад

26). Вивести ціну, кількість наявних на складі товарів та загальну кількість замовлених одиниць для кожної назви товару, якщо для нього загальна кількість замовлених одиниць для кожної назви товару, якщо для нього загальна кількість замовлених одиниць більша, ніж 75% від кількості наявних на складі товарів.

26). SELECT

T. Nazva,

T. Cina,

T. Najavna_Kilkist,

SUM (Z.Kilkist)

FROM Tovary T,

Zamovlennia Z

WHERE

Z. Kod Vyrobn = T. Kod Vyrobn

AND Z. Kod Tovaru = T. Kod Tovaru

GROUP BY

T. Kod Vyrobn,

T. Kod Tovaru,

T. Nazva,

T. Cina,

T. Najavna_Kilkist

HAVING

SUM (Z.Kilkist) > (0.75 * T. Najavna_Kilkist)

ORDER BY

T. Najavna_Kilkist DESC

При реалізації цього запиту СУБД виконує дії:

  1. Сполучає таблиці Tovary та Zamovlennia, щоб отримати назву, ціну і наявну на складі кількість одиниць для кожного замовленого товару.

  2. Групує рядки сполучуваної таблиці по коду виробника та коду товару.

  3. Вилучає групи, в яких кількість замовлених одиниць становить не більше 75% від кількості на складі.

  4. Обчислює загальну кількість замовлених одиниць для кожної групи.

  5. Генерує один підсумковий рядок запиту для кожної групи.

  6. Сортує результати запиту таким чином, щоб товари, яких на складі більше, йшли першими.

Як було сказано раніше, стовпчики T. Nazva, T. Cina, T. Najavna_Kilkist повинні бути вказані в списку стовпчиків групування секції GROUP BY – бо вони є в списку результуючих стовпчиків секції SELECT.

Але фактично вони не приймають участі в процесі групування, бо стовпчики T. Kod Vyrobn та T. Kod Tovaru повністю визначають рядок таблиці Tovary і стовпчики T. Nazva, T. Cina, T. Najavna_Kilkist автоматично мають в групі одне значення.

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