НОУ ІНТУІТ, Лекція, Вибірка даних
Уточнення DISTINCT (UNIQUE)
Нехай потрібно дізнатися, у яких відділах є співробітники:
Це незручно великою кількістю повторень навіть за такої скромної вибірки, як у цьому випадку. Ключове слово DISTINCT дозволяє не виводити в остаточну відповідь рядки, що повторюються:
Особливості технічного відсіву повторень у результаті вживання слова DISTINCT:
- Він потребує додаткового часу для свого здійснення.
- Він не потрібний, коли рядки гарантовано різні (наприклад, відбираються первинні ключі таблиці).
- До версії 10 його здійснення має побічний ефект як упорядкування рядків результату. Хоча він був і "поза законом", деякі програмісти ним користувалися, "бо так було завжди". З версії 10 побічний порядок результату зник, так що змусити СУБД обробляти DISTINCT по-старому все ще можна, але вже штучним шляхом.
- довжина обраного рядка повинна бути меншою за розмір блоку;
- відсів дублікатів неможливий за наявності стовпців з типами LOB, LONG та деяких інших.
Щоб підкреслити відсутність відсіву повторень, на противагу DISTINCT можна явно вказати ALL :
На рівних правах зі словом DISTINCT у фразі SELECT Oracle допускає вказівку UNIQUE. Так, один із попередніх запитів може бути записаний інакше з повним збереженням сенсу:
З реляційної точки зору DISTINCT (UNIQUE) мало б не те, що матися на увазі за умовчанням, але "бути" за умовчанням єдино можливим.
Врахування відсутніх значень при відсіві дублікатів
Відсутні значення в полях рядків при внутрішньому, технічному порівнянні з уже відібраними в процесі відсіву дублікатіврядками вважаютьсярівними один одному:
Така поведінка суперечить правилу, згідно з якимявно вказане в запитіпорівняння з відсутнім значенням дає відсутній логічний результат ( NULL , тобто не TRUE і не FALSE ), зміст якого - "Розрівнювані величини не рівні". Це ж виняток із загального правила порівняння значень SQL має місце при групуванні GROUP BY і при операції UNION результатів SELECT (наводяться нижче). Це вимушений захід: якби не було цього винятку, SQL значно втратив би у своїй практичній цінності.
Агрегатні функції у пропозиції SELECT
Нижче перераховуються деякі приклади популярних стандартних агрегатних (узагальнюючих) функцій, аргументом для яких є стовпець значень. Функції COUNT, MIN, MAX працюють на типах: числа, рядки тексту, моменти часу, інтервали часу, об'єкти (MIN та MAX – не завжди); решта працюютьтількина числових виразах.
Функція COUNT
COUNT використовується для підрахунку рядків та для підрахунку значень у стовпці, що задається виразом.
Підрахунок рядків у таблиці – це окремий випадок. COUNT ( * ) можна застосовувати і у запиті до кількох джерел даних.
Підрахунок кількості значень бере до уваги саме наявні в стовпці значення (в останньому запиті їх буде чотири).
Вказівка у виразі-аргументі для агрегатної функції слова DISTINCT (або UNIQUE ) дозволить підрахувати узагальнення на вибірці з різних значень, наявних у стовпці:
Формально це ж уточнення DISTINCT допускається і у всіх інших агрегатних функціях, але не завжди при цьому воно має сенс (порівняйте з SELECT MAX (DISTINCT …), SELECT SUM (DISTINCT …)).
Функції MIN та MAX
Видають мінімальне та максимальнезначення з наявних у стовпці. Приклади наведені нижче.
"Видати максимальний оклад співробітників":
"Видати мінімальний оклад співробітників з Далласа":
"Скільки співробітників прийшло першими?":
"Яка різниця між максимальним та мінімальним окладами в центах?":
Інші приклади
Приклад використання функції підсумовування значень SUM.
"Видати суму різних значень окладів співробітників із Далласа":
Приклад підрахунку середнього значення з наявних у стовпці.
"Видати посади, для яких оклад вищий за середній":
Загальні правила для стандартних агрегатних функцій
Для стандартних агрегатних функцій виконуються загальні правила обчислення.
- Якщо для якихось рядків стовпця оцінка виразу наводить NULL, агрегатна функція ці рядки ігнорує, вона узагальнює дані тількиіснуючих значень (не-NULL).
- За винятком COUNT , якщовсезначення в стовпці відсутні ( NULL ) або якщо стовпець порожній, то буде відсутній ( NULL ) результат узагальнення.
- Виняток: COUNT завжди повертає значення в крайньому випадку 0 (стовпець відсутніх значень або з відсутніх рядків).
Виходячи з цього наступні вирази при зверненні до EMP у загальному випадкунерівнозначні:
Використовувати агрегатні функції в запиті слід з обережністю, усвідомлюючи їхню поведінку на порожній безлічі значень або рядків. Виняток для COUNT у таких випадках неінтуїтивний. Насправді відомо, що COUNT — не самостійна по суті операція, що зводиться до SUM. Наприклад, COUNT ( * ) по суті рівносильний SUM ( 1 ) , а COUNT ( вираз ) по суті рівносильний SUM ( CASE WHEN вираз IS NOT NULL THEN 1 END ), проте на порожній множиніSQL (стандарт, і виконання Oracle) ці формулювання оцінює по-різному.
Існують також формально-синтаксичні заборони на вживання. Якщо в пропозиції SELECT немає GROUP BY і якщо для формування стовпців результату застосовуються агрегатні функції, то використання в стовпцях результату імен стовпців таблиць-джерелпозаагрегатною функцією заборонено.
приклади. Наступна пропозиціянекоректна(помилково) синтаксично:
Наступна пропозиція коректна:
Вправа. Дайте відповідь прямою промовою, що видасть останній запит. Порівняйте вирази AVG(comm) та SUM(comm)/COUNT(comm).