Операцията сортиране
От уроците по алгоритми знаем: сортираните данни подобряват значително сложността на останалата обработка. Сортиране е възможно, когато домейнът е напълно подреден:
- числата — по големина;
- низовете — лексикографски;
- 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 име) + само групиращите атрибути.