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

8.3. Обмеження на запити з групуванням

На запити, в яких використовується групування, накладаються додаткові обмеження. Стовпчики групування повинні бути реальними стовпчиками таблиць, вказаних в секції FROM – це повинні бути фізичні поля таблиць, не можна групувати рядки на основі значення обчислювального виразу.

Крім того, існують обмеження на елементи списку полів секції SELECT. Всі елементи цього списку повинні мати одне значення для кожної групи рядків. Це означає, що елементом списку полів секції SELECT може бути:

  • константа;

  • статистична функція, яка повертає одне значення для всіх рядків, що входять у групу;

  • стовпчик групування, який за означенням має одне і те саме значення у всіх рядках групи;

  • вираз, який складається із вищевказаних елементів.

На практиці в список полів секції SELECT запита з угрупуванням завжди входять стовпчик групування і статистична функція. Якщо не вказано статистичної функції – значить запит можна зробити простішим за допомогою ключового слова DISTINCT без використання секції GROUP BY. Якщо ж не включати в результати запиту стовпчик групування, то не можна визначити, до якої групи належить кожний рядок результатів!

8.4. Значення null в стовпчиках групування

Коли в стовпчику групування міститься значення NULL, виникають додаткові ускладнення: якщо значення стовпчика невідоме, то до якої групи його потрібно віднести?

В секції WHERE при порівнянні двох значень NULL результат має значення NULL (а не TRUE) тобто два значення NULL не вважається однаковими! Якщо таке правило застосовувати в секції GROUP BY, то це приведе до того, що кожний рядок із значенням NULL в стовпчику групування буде занесений в окрему групу, яка складається із одного цього рядка.

На практиці – це дуже незручно. Тому в стандарті SQL визначається, що два значення NULL в секції GROUP BY – співпадають! Тобто, якщо два рядка мають значення NULL в однакових стовпчиках групування та ідентичні значення у всіх інших стовпчиках групування, то вони заносяться в одну групу.

Хоча такий принцип опрацювання значень NULL визначений в стандарті SQL, він реалізований не для всіх діалектів SQL - потрібно перевірити комерційну СУБД.

Нехай

People

Name

Hair

Eyes

Cindy

Louise

Harry

Samantha

Joanne

George

Mary

Paula

Kevin

Joel

Susan

Marie

Brown

NULL

NULL

NULL

NULL

Brown

Brown

Brown

Brown

Brown

Blonde

Blonde

Blue

Blue

Blue

NULL

NULL

NULL

NULL

NULL

NULL

Brown

Blue

Blue

(при виконанні таких прикладів на ЕОМ значення NULL – не вводяться, - треба замість них залишати порожні клітинки!)

23). SELECT Hair, Eyes, COUNT (*)

FROM People

GROUP BY Hair, Eyes

результат виконання запиту №23:

23)

Hair

Eyes

COUNT (*)

Brown

NULL

NULL

Brown

Brown

Blonde

Blue

Blue

NULL

NULL

Brown

Blue

1

2

2

4

1

2

Лекція №14. Обмеження на запити з групуванням. Секція HAVING – умова відбору груп.

Якщо в результуючому НД потрібно виводити підсумкові значення не для всіх груп, а лише для тих, які задовольняють певній умові, то після секції GROUP BY (перед секцією ORDER BY) вказується секція

Як правило, умова секції HAVING має вигляд:

  • точно так само, як секція WHERE використовується для відбору окремих рядків, секція HAVING використовується для відбору груп рядків.

Формат секції HAVING відповідає формату секції WHERE, за одним важливим винятком.

!в секції WHERE не можна вказувати агрегатних функцій!

Приклади

24) # Яка середня вартість замовлення для кожного працівника із тих, у яких загальна вартість замовлень перевершує 3000?

24). SELECT Pracivnyk, AVG (Vartist)

FROM Zamovlennia

GROUP BY Pracivnyk,

HAVING SUM (Vartist) > 3000

  • можна вказувати різні агрегатні функції для результуючого стовпчика в секції SELECT та для умови відбору груп в секції HAVING.

25). # Вивести загальну кількість купленого товару (в одиницях вимірювання) для всіх покупців, яких мінімальна кількість купленого товару не менша 100 шт.

25). SELECT Pokupets,

SUM (Kilkist)

FROM Vidpusk

GROUP BY Pokupets

HAVING MIN (Kilkist) > =100

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