НОУ ІНТУІТ, Лекція, Вибірка даних

Уточнення 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).