Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 3 · Урок 17

Клаузите ORDER BY и GROUP BY

Сортиране на резултата (ASC/DESC, по няколко атрибута) и групиране с агрегатните функции Avg, Sum, Min, Max и Count.

Операцията сортиране

От уроците по алгоритми знаем: сортираните данни подобряват значително сложността на останалата обработка. Сортиране е възможно, когато домейнът е напълно подреден:

  • числата — по големина;
  • низовете — лексикографски;
  • Date & Time — по време;
  • логическите — false (0) преди true (1);
  • OLE Object (BLOB) — НЕ може: такава наредба е невъзможна.

Две посоки: възходящ ред (ascending — от най-малкия към най-големия) и низходящ (descending).

Клаузата ORDER BY

ORDER BY атрибут1 {ASC|DESC} {, атрибут2 {ASC|DESC}, …}

Сортира резултата по първия атрибут; при равни стойности — по втория, и т.н. Посоката се посочва след всеки атрибут; при пропускане по премълчаване е възходящ ред (ASC). Клаузата стои в КРАЯ на заявката.

Бележка

SELECT Номер, Име, Презиме, Фамилия FROM Ученик ORDER BY Име, Презиме, Фамилия; — списъкът по обичайния начин: по име, презиме и фамилия.

Групиране

Не всички кортежи се различават по неключовите си атрибути: много клиенти се казват Иванов, много коли са една марка. Когато група кортежи с обща стойност представлява интерес, искаме обобщена характеристика на групата: колко са; каква е минималната мощност на двигателите от марка; какъв е средният успех по предмет на момичетата и момчетата.

SQL събира в група кортежите с обща стойност в един или няколко атрибута — операцията групиране — и пресмята характеристики на групата. Тези стойности наричаме агрегирани, а функциите — агрегатни. По същността си групирането е вариант на сортирането: за да се формира група, всичките ѝ кортежи трябва да се съберат заедно.

Агрегатни функции

ФункцияПресмятаПриложима върху
Avg(атрибут)средна стойностсамо числови атрибути
Sum(атрибут)сума от стойноститесамо числови атрибути
Min(атрибут)минимална стойностчислови и всякакви напълно подредени
Max(атрибут)максимална стойностчислови и всякакви напълно подредени
Count(атрибут)брой на елементитепроизволен атрибут

Count и null

Count не използва стойностите за пресмятане, но за да сработи коректно, стойността на атрибута не бива да е null в някой от кортежите. Добра практика: прилагай Count върху ключа — той не допуска празни стойности (Not null).

Понякога търсим обобщена характеристика по всички кортежи — тогава прилагаме агрегатна функция без групиране: SELECT Max(Цена) AS [Максимална цена] FROM Детайли;

Заявка за групиране

SELECT функция(атрибут) AS име {, …}, атрибути FROM таблица WHERE условие GROUP BY атрибут1 {, атрибут2, …};

Двете множества атрибути: атрибути НА ГРУПИРАНЕ (в GROUP BY) и атрибути НА ИЗЧИСЛЕНИЕ (в агрегатните функции).

Особености (за варианта на SQL в MS Access):

  • Всяка агрегирана стойност става атрибут на резултата с името от AS (или служебно име като Expr1).
  • Агрегираните стойности се изреждат ПРЕДИ останалите атрибути.
  • Освен тях в резултата може да участват САМО атрибути, по които е групирано.

Примерите от учебника (база „Фирма“)

  • Най-скъпият детайл (без групиране): SELECT Max(Цена) AS [Максимална цена] FROM Детайли;
  • Най-евтин и най-скъп по вид: SELECT Min(Цена) AS Минимум, Max(Цена) AS Максимум, Име FROM Детайли GROUP BY Име;
  • Брой ученици, родени преди 2003 г. (WHERE образува групата): SELECT Count(ID) FROM Ученик WHERE [Дата на раждане] < 01/01/2003;

Какво трябва да запомниш

  • ORDER BY атрибути + ASC/DESC; по премълчаване — възходящ ред; клаузата е в края.
  • При равенство в първия атрибут сортира по втория и т.н.
  • Групиране = събиране на кортежите с обща стойност + агрегатни функции.
  • Avg и Sum — само числа; Min, Max, Count — и други подредени типове.
  • Count — най-добре върху ключа (той няма null).
  • В резултата: агрегати (с AS име) + само групиращите атрибути.