Мова SQL. Формування запитів до бази даних. Агрегатні функції SQL. Мова запитів SQL

Стандарт ISO містить визначення наступних п'яти агрегуючих функцій:

COUNT– повертає кількість значень у вказаному стовпці;

SUM– повертає суму значень у вказаному стовпці;

AVG– повертає усереднене значення у вказаному стовпці;

MIN– повертає мінімальне значення у вказаному стовпці;

МАХ– повертає максимальне значення у вказаному стовпці.

Всі ці функції оперують із значеннями в єдиному стовпці таблиці та повертають єдине значення. Функції COUNT, MIN та МАХ застосовні як до числових, так і до нечислових полів, тоді як функції SUM та AVG можуть використовуватися лише у разі числових полів. За винятком COUNT (*), при обчисленні результатів будь-яких функцій спочатку виключаються всі порожні значення, після чого необхідна операція застосовується тільки до непустих значень стовпця. Варіант COUNT (*) є особливим випадком використання функції COUNT – його призначення полягає у підрахунку всіх рядків у таблиці, незалежно від того, містяться там порожні, повторювані чи будь-які інші значення. Якщо перед застосуванням функції, що агрегує, необхідно виключити повторювані значення, слід перед ім'ям стовпця у визначенні функції помістити ключове слово DISTINCT. Стандарт ISO допускає використання ключового слова ALL з метою явного вказівки того, що виключення значень, що повторюються, не потрібне, хоча це ключове слово мається на увазі за умовчанням, якщо ніякі інші визначники не задані. Ключове слово DISTINCT немає сенсу для функцій MIN і МАХ. Однак його використання може впливати на результати виконання функцій SUM і AVG, тому слід заздалегідь обміркувати, чи має бути присутнім у кожному конкретному випадку. Крім того, ключове слово DISTINCT у кожному запиті може бути вказано не більше одного разу.

Слід зазначити, що функції, що агрегують, можуть використовуватися тільки в списку вибірки SELECT і в конструкції HAVING (див. розділ 5.3.4). У всіх інших випадках застосування цих функцій є неприпустимим. Якщо список вибірки SELECT містить функцію, що агрегує, а в тексті запиту відсутня конструкція GROUP BY, що забезпечує об'єднання даних у групи, то жоден з елементів списку вибірки SELECT не може включати будь-яких посилань на стовпці, за винятком випадку, коли цей стовпець використовується як параметр функції, що агрегує. Наприклад, наступний запит є некоректним:

SELECTstaffNo,COUNT (Salary)

FROMStaff;

Помилка полягає в тому, що в цьому запиті відсутня конструкція GROUP BY, а звернення до стовпця staffNo у списку вибірки SELECT виконується без застосування функції, що агрегує.

Приклад 13. Використання функції COUNT(*).Визначте, скільки об'єктів, що здаються в оренду, мають ставку орендної плати більше 350 фунтів стерлінгів на місяць,

SELECT COUNT(*) AS count

FROMPropertyForRent

WHERErent > 350;

Обмеження на підрахунок тільки тих об'єктів, що здаються в оренду, орендна плата яких складає більше 350 фунтів стерлінгів на місяць, реалізується за допомогою використання конструкції WHERE. Загальна кількість об'єктів, що здаються в оренду, що відповідають зазначеній умові, може бути визначена за допомогою функції COUNT, що агрегує. Результати виконання запиту наведено в табл. 23.

Таблиця 23

count

Приклад 14. Використання функції COUNT(DISTINCT).Визначте, скільки різних об'єктів, що здаються в оренду, було оглянуто клієнтами в травні 2001 року.

SELECT COUNT(DISTINCTpropertyNo) AS count

FROMViewing

І в цьому випадку обмеження результатів запиту аналізом лише тих об'єктів, що здаються в оренду, які були оглянуті в травні 2001 року, досягається за допомогою використання конструкції WHERE. Загальна кількість оглянутих об'єктів, що задовольняють зазначеній умові, може бути визначена за допомогою функції COUNT, що агрегує. Однак, оскільки один і той же об'єкт може бути оглянутий різними клієнтами кілька разів, необхідно у визначенні функції вказати ключове слово DISTINCT – це дозволить виключити з розрахунку значення, що повторюються. Результати виконання запиту наведено в табл. 24.

Таблиця 24

Приклад 16. Використання функції MIN, MAXnAVG.Обчисліть значення мінімальної, максимальної та середньої заробітної плати.

SELECT MIN(Salary) AS min, MAX(Salary) AS max, AVG(Salary) AS avg

FROMStaff;

У цьому прикладі необхідно опрацювати відомості про весь персонал компанії, тому використовувати конструкцію WHERE не потрібно. Необхідні значення можуть бути обчислені за допомогою функцій MIN, MAX та AVG, які застосовуються до стовпця salary таблиці Staff. Результати виконання запиту наведено в табл. 26.

Таблиця 26

Результат виконання запиту

min max avg
9000.00 30000.00 17000.00

Групування результатів (конструкція GROUP BY).Наведені вище приклади зведених даних подібні до підсумкових рядків, які зазвичай розміщуються в кінці звітів. У підсумку всі детальні дані звіту стискаються в один узагальнюючий рядок. Проте, дуже часто у звітах потрібно формувати і проміжні підсумки. Для цього в операторі SELECT може вказуватися конструкція GROUP BY. Запит, в якому є конструкція GROUP BY, називається групуючим запитом,оскільки в ньому групуються дані, отримані в результаті виконання операції SELECT, після чого для кожної групи створюється єдиний підсумковий рядок. Стовпці, перелічені у конструкції GROUP BY, називаються групованими стовпцями.Стандарт ISO вимагає, щоб конструкції SELECT та GROUP BY були тісно пов'язані між собою. При використанні в операторі SELECT конструкції GROUP BY, кожен елемент списку у списку вибірки SELECT повинен мати єдине значення для всієї групи.Більш того, конструкція SELECT може включати лише такі типи елементів:

Імена стовпців;

агрегуючі функції;

Константи;

Вирази, що включають комбінації зазначених вище елементів.

Усі імена стовпців, наведені у списку вибірки SELECT, повинні бути присутніми і в конструкції GROUP BY, за винятком випадків, коли ім'я стовпця використовується тільки в функції, що агрегує. Протилежне твердження не завжди справедливе – у конструкції GROUP BY можуть бути імена стовпців, які відсутні у списку вибірки SELECT. Якщо спільно з конструкцією GROUP BY використовується конструкція WHERE, вона обробляється в першу чергу, а групуванню піддаються лише ті рядки, які задовольняють умові пошуку. Стандартом ISO визначено, що з групування всі відсутні значення розглядаються як рівні. Якщо два рядки таблиці в тому самому групованому стовпці містять значення NULL і ідентичні значення у всіх інших непустих групованих стовпцях, вони поміщаються в одну і ту ж групу.

Приклад 17. Використання конструкції GROUP BY.Визначте кількість персоналу, що працює у кожному з відділень компанії, а також їхню сумарну заробітну плату.

SELECTbranchNo, COUNT(staffNo) AS count, SUM(Salary) AS sum

FROMStaff

GROUP BYbranchNo

ORDER BYbranchNo;

Немає необхідності включати імена стовпців staffNo і salary до списку елементів GROUP BY, оскільки вони з'являються лише у списку вибірки SELECT з функціями, що агрегують. У той же час стовпець branchNo в списку конструкції SELECT не пов'язаний з будь-якою функцією, що агрегує, і з цієї причини обов'язково повинен бути вказаний в конструкції GROUP BY. Результати виконання запиту наведено в табл. 27.

Таблиця 27

Результат виконання запиту

branchNo Count Sum
В003 54000.00
В005 39000.00
В007 9000.00

Концептуально під час обробки цього запиту виконуються такі действия.

1. Рядки таблиці Staff розподіляються у групи відповідно до значень у стовпці номера відділення компанії. У межах кожної із груп виявляються дані про весь персонал одного з відділень компанії. У нашому прикладі буде створено три групи, як показано на рис. 1.

2. Для кожної з груп обчислюються загальна кількість рядків, яка дорівнює кількості працівників відділення, а також сума значень у стовпці salary, яка і є цікавою для нас сумою заробітної плати всіх працівників відділення. Потім генерується єдиний підсумковий рядок для всієї групи вихідних рядків.

3. Отримані рядки результуючої таблиці сортуються у порядку зростання номера відділення, зазначеного у стовпці branchNo.

branchNo staffNo Salary
В00З SG37 12000.00
В00З SG14 18000.00
В00З SG5 24000.00
В005 SL21 30000.00
В005 SL41 9000.00
В007 SA9 9000.00
COUNT(staffNo) SUM(salary)
54000.00
39000.00
9000.00

Мал. 1. Три групи записів, що створюються під час виконання запиту

Стандарт SQL допускає розміщення до списку вибірки SELECT вкладених запитів. Тому наведений вище запит можна також подати так:

SELECTbranchNo, (SELECT COUNT(staffNo)AS count

FROMStaff s

WHEREs.branchNo = b.branchNo),

(SELECT SUM(salary) AS sum

FROMStaff s

WHEREs.branchNo = b.branchNo)

FROMBranch b

ORDER BYbranchNo;

Але в цій версії запиту для кожного з відділень компанії, описаних у таблиці Branch, створюються два результати обчислення функцій, що агрегують, тому в деяких випадках можлива поява рядків, що містять нульові значення.

Обмеження виконання групування (конструкція HAVING).Конструкція HAVING призначена для використання спільно з конструкцією GROUP BY для завдання обмежень, що вказуються з метою відбору тех. груп,які будуть поміщені до результуючої таблиці запиту. Хоча конструкції HAVING і WHERE мають подібний синтаксис, їхнє призначення по-різному. Конструкція WHERE призначена для відбору окремих рядків, призначених для заповнення результуючої таблиці запиту, а конструкція HAVING використовується для відбору груп,розміщені в результуючу таблицю запиту. Стандарт ISO вимагає, щоб імена стовпців, які застосовуються в конструкції HAVING, обов'язково були присутні у списку елементів GROUP BY або застосовувалися в функціях, що агрегують. На практиці умови пошуку в конструкції HAVING завжди включають щонайменше одну функцію, що агрегує; в іншому випадку ці умови пошуку повинні бути поміщені в конструкцію WHERE та застосовані для відбору окремих рядків. (Пам'ятайте, що функції, що агрегують, не можуть використовуватися в конструкції WHERE.) Конструкція HAVING не є необхідною частиною мови SQL – будь-який запит, написаний з використанням конструкції HAVING, може бути представлений в іншому вигляді, без її застосування.

Приклад 18. Використання конструкції HAVING.Для кожного відділення компанії з чисельністю персоналу більше однієї людини визначте кількість працюючих та суму їхньої заробітної плати.

SELECTbranchNo, COUN T(staffNo) AS count, SUM(Salary) AS sum

FROMStaff

GROUP BYbranchNo

HAVING COUNT(staffNo) > 1

ORDER BYbranchNo;

Цей приклад аналогічний попередньому, але тут використовуються додаткові обмеження, що вказують на те, що нас цікавлять відомості лише про ті відділення компанії, в яких працює більше однієї людини. Така вимога накладається на групи, тому у запиті слід використовувати конструкцію HAVING. Результати виконання запиту наведено в табл. 28.

Таблиця 28

branchNo count sum
В00З 3 54000.00
В005 2 39000.00

Підзапити.У цьому розділі ми обговоримо використання закінчених операторів SELECT, які були впроваджені в тіло іншого оператора SELECT. Зовнішній(другий) оператор SELECT використовує результат виконання внутрішнього(першого) оператора визначення змісту остаточного результату всієї операції. Внутрішні запити можуть перебувати в конструкціях WHERE та HAVING зовнішнього оператора SELECT – у цьому випадку вони отримують назву підзапитів,або вкладених запитів.Крім того, внутрішні оператори SELECT можуть використовуватись в операторах INSERT, UPDATE та DELETE . Існують три типи підзапитів.

Скалярний підзапитповертає значення, яке вибирається з перетину одного стовпця з одним рядком, тобто. єдине значення. У принципі скалярне підзапит може використовуватися скрізь, де потрібно вказати єдине значення. Варіанти скалярних підзапитів наведено у прикладах 13 та 14.

Строковий підзапитповертає значення кількох стовпців таблиці, але у вигляді єдиного рядка. Строковий підзапит може використовуватися скрізь, де застосовується конструктор рядкових значень – зазвичай це предикати. Варіант рядкового підзапиту наведено у прикладі 15.

Табличний підзапитповертає значення одного або кількох стовпців таблиці, розміщені у більш ніж одному рядку. Табличне підзапит може використовуватися скрізь, де допускається вказувати таблицю, наприклад, як операнд предикату IN.

Приклад 19. Використання підзапиту з перевіркою на рівність.Складіть список персоналу, що працює у відділенні компанії, розташованому за адресою 463 Main St1.

SELECT

FROMStaff

WHEREbranchNo = (SELECT branchNo

FROMBranch

WHEREstreet = "163 Main S t");

Внутрішній оператор SELECT (SELECT branchNo FROM Branch...) призначений для визначення номера відділення компанії, розташованого за адресою "163 Main St". (Існує тільки одне таке відділення компанії, тому цей приклад є прикладом скалярного підзапиту.) Після отримання номера необхідного відділення виконується зовнішній підзапит, призначений для вибірки докладних відомостей працівників цього відділення. Інакше кажучи, внутрішній оператор SELECT повертає таблицю, що складається з єдиного значення "BOOV. Воно є номером того відділення компанії, яке знаходиться за адресою "163 Main St1. Б результаті зовнішній оператор SELECT набуває наступного вигляду:

SELECTstaffNo, fName, IName, position

FROMStaff

WHEREbranchNo = "B0031;

Результати виконання цього запиту наведено в табл. 29.

Таблиця 29

Результат виконання запиту

staffNo fName IName position
SG37 Ann Beech Assistant
SG14 David Форд Supervisor
SG5 Susan Brand Manager

Підзапит є інструментом створення часової таблиці, вміст якої витягується і обробляється зовнішнім оператором. Підзапит можна вказувати безпосередньо після операторів порівняння (тобто операторів =,<, >, <=, >=, <>) у конструкції WHERE або HAVING. Текст підзапиту має бути поміщений у круглі дужки.

Приклад 20Використання підзапитів з функціями, що агрегують. Складіть список усіх співробітників, які мають зарплату вище за середню, вказавши, наскільки їхня зарплата перевищує середню зарплату по підприємству.

SELECTstaffNo, fName, IName, position, salary - ( SELECT AVG(Salary) FROM Staff) AS salDiff

FROMStaff

WHEREsalary > ( SELECT AVG(Salary) FROM S t a f f);

Слід зазначити, що не можна безпосередньовключити в запит вираз"WHERE salary > AVG (salary)", оскільки застосовувати агрегуючіфункції у конструкції WHERE заборонено. Для досягнення бажаного результату слід створити підзапит, що обчислює середнє значення річної заробітної плати, а потім використовувати його у зовнішньому операторі SELECT, призначеному для вибірки відомостей про тих працівників компанії, зарплата яких перевищує це середнє значення. Інакше кажучи, підзапит повертає значення середньої зарплати по компанії на рік 17 000 фунтів стерлінгів.

Результат виконання цього скалярного підзапиту використовується у зовнішньому операторі SELECT як обчислення відхилення зарплати від середнього рівня, так відбору відомостей про працівників. Тому зовнішній оператор SELECT набуває наступного вигляду:

SELECTstaffNo, fName, IName, position, salary - 17000 As salDiff

FROMStaff

WHEREsalary > 17000;

Результати виконання запиту наведено в табл. 30.

Таблиця 30

Результат виконання запиту

staffNo fName IName position salDiff
SL21 Джон White Manager 13000.00
SG14 David Форд Supervisor 1000.00
SG5 Susan Brand Manager 7000.00

До підзапитів застосовуютьсянаступні правила та обмеження.

1. У підзапитах не повинна використовуватися конструкція ORDER BY, хоча вона може бути у зовнішньому операторі SELECT.

2. Список вибірки SELECT підзапиту повинен складатися з імен окремих стовпців або складених із них виразів, за винятком випадку, коли у підзапиті використовується ключове слово EXISTS.

3. За замовчуванням імена стовпців у підзапиті відносяться до таблиці, ім'я якої зазначено у конструкції FROM підзапиту. Однак дозволяється посилатися і на стовпці таблиці, вказаної в конструкції FROM зовнішнього запиту, для чого використовуються уточнені імена стовпців (як описано нижче).

4. Якщо підзапит є одним із двох операндів, які беруть участь в операції порівняння, то підзапит має вказуватися в правій частині цієї операції. Наприклад, наведений нижче варіант запису запиту з попереднього прикладу є некоректним, оскільки підзапит розміщений у лівій частині операції порівняння зі значенням стовпця salary.

SELECT

FROMStaff

WHERE(SELECT AVG(salary) FROM Staff)< salary;

Приклад 21. Вкладені підзапити та використання предикату IN. Складіть перелік об'єктів, що здаються в оренду, за які відповідають працівники відділення компанії, розташованого за адресою "163 Main st1.

SELECTpropertyNo, street, city, postcode, type, rooms, rent

FROMPropertyForRent

Розділ 5. Мова SQL: маніпулювання даними 189

WHEREstaffNo IN (SELECT staffNo

FROMStaff

WHEREbrancliNo = (SELECT branchNo

FROMBranch

WHEREstreet = "163 Main S t "));

Перший, найвнутрішній, запит призначений для визначення номера відділення компанії, розташованого за адресою 463 Main St". Другий, проміжний, запит здійснює вибірку відомостей про персонал, що працює в цьому відділенні. У даному випадку вибирається більше одного рядка даних і тому у зовнішньому запиті не можна використовувати оператор порівняння = Замість нього необхідно використовувати ключове слово IN.Зовнішній запит здійснює вибірку відомостей про об'єкти, що здаються в оренду, за які відповідають ті працівники компанії, дані про які були отримані в результаті виконання проміжного запиту.Результати виконання запиту представлені в табл. 31.

Таблиця 31

Результат виконання запиту

propertyNo street city postcode type rooms rent
PG16 5 Novar Dr Glasgow G129AX Flat
PG36 2 Manor Rd Glasgow G324QX Flat
PG21 18 Dale Rd Glasgow G12 House

Ключові слова ANY та ALL.Ключові слова ANY та ALL можуть використовуватися з підзапитами, що повертають один стовпець чисел. Якщо підзапиту передуватиме ключове слово ALL, умова порівняння вважається виконаною лише в тому випадку, якщо воно виконується для всіх значень у результуючому стовпці підзапиту. Якщо тексту запиту передує ключове слово ANY, то умова порівняння буде вважатися виконаним, якщо воно задовольняється хоча б для будь-якого (одного або кількох) значення в результуючому стовпці підзапиту. Якщо в результаті виконання підзапиту буде отримано порожнє значення, то для ключового слова ALL умова порівняння вважатиметься виконаною, а для ключового слова ANY – невиконаною. Відповідно до стандарту ISO, додатково можна використовувати ключове слово SOME, що є синонімом ключового слова ANY.

Приклад 22.Використання ключових слів ANY та SOME. Знайдіть усіх працівників, чия зарплата перевищує зарплату хоча бодного працівника відділення компанії під номером "віз".

SELECTstaffNo, fName, IName, position, salary

FROMStaff

WHEREsalary > SOME(SELECT salary

FROMStaff

WHEREbranchNo = "B003");

Хоча цей запит може бути записаний з використанням підзапиту, що визначає мінімальну зарплату персоналу відділення під номером "ВООЗ", після чого зовнішнє підзапит зможе вибрати відомості про весь персонал компанії, чия зарплата перевищує це значення (див. приклад 20), можливий інший підхід, полягає у використанні ключових слів SOME/ANY. У цьому випадку внутрішній підзапит створює безліч значень (12000, 18000, 24000), а зовнішній запит вибирає відомості про тих працівників, чия зарплата більша за будь-який із значень у цьому

множині (фактично більше мінімального значення – 12000). Подібний альтернативний метод можна вважати природнішим, ніж визначення у підзапиті мінімальної зарплати. Але й у тому й іншому випадку виробляються однакові результати виконання запиту, які у табл. 32 .

Таблиця 32

Результат виконання запиту

staffNo fName IName position salary
SL21 Джон White Manager 30000.00
SG14 David Форд Supervisor 18000.00
SG5 Susan Brand Manager 24000.00

Приклад 23.Використання ключового слова ALL. Знайдіть всіх працівників, чия заробітна плата більша за заробітну плату будь-якого працівника відділення компанії під номером "воз".

SELECTstaffNo, fName, INarae, position, salary

FROMStaff

WHEREsalary > ALL(SELECT salary

FROMStaff

WHEREbranchNo = "BOG3");

Загалом цей запит подібний до попереднього. І в даному випадку можна було б використовувати підзапит, який визначає максимальне значення зарплати персоналу відділення під номером "ВООЗ", після чого за допомогою зовнішнього запиту вибрати відомості про всіх працівників компанії, зарплата яких перевищує це значення. Однак у цьому прикладі вибрано підхід з використанням ключового слова ALL. Результати виконання запиту наведено в табл. 33 .

Таблиця 33

Результат виконання запиту

staffNo IName fName position salary
SL21 White Джон Manager 30000,00

Багатотабличні запити.Всі розглянуті вище приклади мають одне й те важливе обмеження: стовпці, що містяться в результуючу таблицю, завжди вибираються з єдиної таблиці. Однак у багатьох випадках цього виявляється недостатньо. Для того щоб об'єднати в результуючій таблиці стовпці з декількох вихідних таблиць, необхідно виконати операцію з'єднання.У мові SQL операція з'єднання використовується об'єднання інформації з двох таблиць у вигляді утворення пар пов'язаних рядків, вибраних із кожної таблиці. Пари рядків, що містяться в об'єднану таблицю, складаються по рівності значень зазначених стовпців, що входять до них.

Якщо потрібно отримати інформацію з кількох таблиць, можна застосувати підзапит, або з'єднання таблиць. Якщо результуюча таблиця запиту повинна містити стовпці з різних таблиць, то доцільно використовувати механізм з'єднання таблиць. Для виконання з'єднання достатньо в конструкції FROM вказати імена двох і більше таблиць, розділивши їх комами, після чого включити в запит конструкцію WHERE з визначенням стовпців, які використовуються для з'єднання зазначених таблиць. Крім цього, замість імен таблиць можна використовувати псевдоніми,призначені ним у конструкції FROM. У цьому випадку імена таблиць і псевдоніми, що їм призначаються, повинні розділятися пробілами. Псевдоніми можуть використовуватися з метою уточнення імен стовпців у всіх випадках, коли можлива неоднозначність щодо того, до якої таблиці належить той чи інший стовпець. Крім того, псевдоніми можуть бути використані для скороченого позначення імен таблиць. Якщо для таблиці визначено псевдонім, він може застосовуватись у будь-якому місці, де потрібна вказівка ​​імені цієї таблиці.

Приклад 24Просте з'єднання. Складіть список імен усіх клієнтів, які вже оглянули хоча б один об'єкт, що здається в оренду, і повідомили свою думку з цього приводу.

SELECTc.clientNo, fName, IName, propertyNo, comment

FROMClient c, Viewing v

WHEREc.clientNo = v.clientNo;

У цьому звіті потрібно надати відомості як із таблиці Client, так і з таблиці Viewing, тому при побудові запиту ми скористаємося механізмом з'єднання таблиць. У конструкції SELECT перераховуються всі стовпці, які мають бути поміщені в результуючу таблицю запиту. Зверніть увагу, що для стовпця з номером клієнта (clientNo) необхідне уточнення, оскільки такий стовпець може бути присутнім і в іншій таблиці, яка бере участь у з'єднанні. Тому необхідно вказати, значення якої таблиці нас цікавлять. (У цьому прикладі з тим самим успіхом можна було вибрати значення стовпця clientNo з таблиці Viewing). Уточнення імені здійснюється шляхом вказівки як префікс перед ім'ям стовпця імені відповідної таблиці (або її псевдоніма). У прикладі використовується значення " с " , задане як псевдонім таблиці Client. Для формування результуючих рядків використовуються рядки вихідних таблиць, які мають ідентичне значення в стовпці clientNo. Ця умова визначається за допомогою умови пошуку с.clientNo=v.clientNo. Подібні стовпці вихідних таблиць називають сполучними стовпцями.Описана операція еквівалентна операції з'єднання по рівностіреляційної алгебри. Результати виконання запиту наведено в табл. 34.

Таблиця 34

Результат виконання запиту

clientNo fName IName propertyNo comment
CR56 Aline Stewart PG36
CR56 Aline Stewart PA14 too small
CR56 Aline Stewart PG4
CR62 Mary Tregear PA14 no dining room
CR76 Джон Kay PG4 too remote

Найчастіше багатотабличні запити виконуються для двох таблиць, з'єднаних зв'язком типу "один до багатьох" (1: *), або батьківсько-дочірнім зв'язком. У наведеному прикладі, що включає звернення до таблиць Client і Viewing, останні з'єднані саме таким зв'язком. Кожен рядок таблиці Viewing (дочірньої) пов'язаний лише з одним рядком таблиці Client (батьківської), тоді як один і той же рядок таблиці Client (батьківської) може бути пов'язаний

з багатьма рядками таблиці Viewing (дочірньої). Пари рядків, які генеруються при виконанні запиту, є результатом всіх допустимих комбінацій рядків дочірньої та батьківської таблиць. У розділі 3.2.5 було докладно описано, як у реляційній базі даних первинний та зовнішній ключі таблиць створюють "батьківсько-дочірню" зв'язок. Таблиця, що містить зовнішній ключ, зазвичай є дочірньою, тоді як таблиця, що містить первинний ключ, завжди буде батьківською. Для використання батьківсько-дочірнього зв'язку в запиті SQL необхідно вказати умову пошуку, в якій будуть порівнюватися зовнішній та первинний ключі. У прикладі 24 первинний ключ таблиці Client (с. clientNo) порівнюється із зовнішнім ключем таблиці Viewing (v. clientNo).

Стандарт SQL додатково надає такі способи визначення даного з'єднання:

FROMClient з JOIN Viewing v ONс.clientNo = v.clientNo

FROMClient J OIN Viewing USING clientNo

FROMClient NATURAL JOIN Viewing

У кожному випадку конструкція FROM заміняє вихідні конструкції FROM та WHERE. Однак у першому варіанті створюється таблиця з двома ідентичними стовпцями clientNo, тоді як в інших двох випадках результуюча таблиця міститиме тільки один стовпець clientNo.

Приклад 25.Сортування результатів з'єднання таблиць. Для кожного відділення компанії перерахуйте табельні номери та імена працівників, які відповідають за будь-які об'єкти, що здаються в оренду, а також вкажіть об'єкти, за

які вони відповідають.

SELECTs.branchNo, s.staffNo, fName, IName, propertyNo

FROMStaff s, PropertyForRent p

WHEREs.staffNo = p.staffNo

ORDER BYs.branchNo, s.staffNo, propertyNo;

Для того, щоб результати стали більш зручними для читання, отриманий висновок відсортовано з використанням номера відділення як старшого ключа сортування, а табельного номера та номера власності – як молодших ключів. Результати виконання запиту наведено в табл. 35.

Таблиця 35

Результат виконання запиту

branchNo StaffNo fName IName propertyNo
ВООЗ SG14 David Форд PG16
ВООЗ SG37 Ann Beech PG21
ВООЗ SG37 Ann Beech PG36
BOO5 SL41 Mary Lee PL94
ВГО7 SA9 Julie Howe PA14

Приклад 26.Поєднання трьох таблиць. Для кожного відділення компанії перерахуйте табельні номери та імена працівників, які відповідають за будь-які об'єкти, що здаються в оренду, із зазначенням міста, в якому розташоване дане відділення компанії, та номерів об'єктів, за які відповідає кожен працівник.

SELECT b.branchNo, b.city, s.staffNo, fName, IName, propertyNo

FROM Branch b, Staff s, PropertyForRent p

WHERE b.branchNo = s.branchNo AND s.staffNo = p.staffNo

ORDER BY b.branchNo, s.staffNo, propertyNo;

У результуючу таблицю необхідно помістити стовпці з трьох вихідних таблиць – Branch, Staff та PropertyForRent, тому у запиті слід з'єднати ці таблиці. Таблиці Branch і Staff можуть бути з'єднані за допомогою умови b.branchNo=*s .branchNo, внаслідок чого відділення компанії будуть пов'язані з персоналом, що працює в них. Таблиці Staff та PropertyForRent можуть бути з'єднані за допомогою умови s.staffNo = p.staffNo. У результаті кожен працівник буде пов'язаний з тими об'єктами, що здаються в оренду, за які він відповідає. Результати виконання запиту наведено в табл. 36.

Таблиця 36

Результати виконання запиту

branchNo city staffMo fName IName propertyNo
В003 Glasgow SG14 David Форд PG16
В003 Glasgow SG37 Ann Beech PG21
В003 Glasgow SG37 Ann Beech PG36
В005 London SL41 Julie Lee PL94
В007 Aberdeen SA9 Mary Howe PA14

Зауважимо, що стандарт SQL дозволяє використовувати альтернативний варіант формулювання конструкцій FROM та WHERE:

FROM(Branch b JOIN Staff s USING branchNo) AS bs

JOINPropertyForRent p USING staffNo

Приклад 27.Групування по кількох шпальтах. Визначте кількість об'єктів, що здаються в оренду, за які відповідає кожен із працівників компанії.

SELECTs.branchNo, S.staffNo, COUNT(*) AS count

FROM Staff s, PropertyForRent p

WHERE S.staffNo = p.staffNo

GROUP BYs.branchNo, s.staffNo

ORDER BYs.branchNo, s.staffNo;

Щоб скласти необхідний звіт, перш за все необхідно з'ясувати, хто з працівників компанії відповідає за об'єкти, що здаються в оренду. Це завдання можна вирішити за допомогою з'єднання таблиць Staff і PropertyForRent по стовпцю staffNo в конструкціях FROM/WHERE. Потім необхідно сформувати групи, що складаються з номера відділення та табельних номерів його працівників, для чого слід застосувати конструкцію GROUP BY. Зрештою, результуюча таблиця має бути відсортована за допомогою завдання конструкції ORDER BY. Результати виконання запиту представлені в табл. 37.

Таблиця 37

Результат виконання запиту

branchNo staffNo count
В00З SG14
В00З SG37
В005 SL41
В007 SA9

Виконання з'єднань.З'єднання є підмножиною більш загальної комбінації даних двох таблиць декартовим. Декартово добуток двох таблиць являє собою іншу таблицю, що складається з усіх можливих пар рядків, що входять до складу обох таблиць. Набір стовпців результуючої таблиці є всі стовпці першої таблиці, за якими слідують усі стовпці другої таблиці. Якщо ввести запит до двох таблиць без завдання конструкції WHERE, результат виконання запиту в середовищі SQL буде декартовим добутком цих таблиць. Крім того, стандарт ISO передбачає спеціальний формат оператора SELECT, що дозволяє обчислити декартовий добуток двох таблиць:

SELECT (* j columnList]

FROM tableNamel CROSS JOINСаІеУлте2

Ще раз розглянемо приклад у якому з'єднання таблиць client і Viewing виконується з використанням загального стовпця clientNo, При роботі з таблицями, вміст яких наведено в табл. 3.6 і 3.8, декартове добуток цих таблиць включатиме 20 рядків (4 рядки таблиці Client x 5 рядків таблиці viewing = 20 рядків). Це еквівалентно видачі запиту, що використовується в прикладі 5.24, але без застосування конструкції WHERE. Процедура генерації таблиці, що містить результати з'єднання двох таблиць за допомогою оператора SELECT, полягає у наступному.

1. Формується декартове добуток таблиць, зазначених у конструкції FROM.

2. Якщо у запиті є конструкція WHERE, застосування умов пошуку до кожного рядка таблиці декартового твору та збереження в таблиці лише тих рядків, які задовольняють заданим умовам. У термінах реляційної алгебри ця операція називається обмеженнямдекартового твору

3. Для кожного рядка, що залишився, визначається значення кожного елемента, зазначеного в списку вибірки SELECT, в результаті чого формується окремий рядок результуючої таблиці.

4. Якщо у вихідному запиті є конструкція SELECT DISTINCT, з результуючої таблиці видаляються всі рядки-дублікати.

5. Якщо запит, що виконується, містить конструкцію ORDER BY,


©2015-2019 сайт
Усі права належати їх авторам. Цей сайт не претендує на авторства, а надає безкоштовне використання.
Дата створення сторінки: 2016-08-07

Пропозиція GROUP BY(Інструкції SELECT) дозволяє групувати дані (рядки) за значенням будь-якого стовпця або кількох стовпців або виразів. Результатом буде набір зведених рядків.

Кожен стовпець у списку вибірки має бути присутнім у пропозиції GROUP BY, виняток становлять лише константи та стовпці — операнди агрегатних функцій.

Таблицю можна згрупувати за будь-якою комбінацією її стовпців.

Агрегатні функціївикористовуються для одержання із групи рядків одного єдиного сумарного значення. Всі агрегатні функції виконують обчислення над одним аргументом, який може бути стовпцем, або виразом. Результатом обчислень будь-якої агрегатної функції є константне значення, що відображається в окремому стовпці результату.

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

Якщо запит містить пропозицію WHERE, агрегатні функції обчислюють значення для результатів вибірки.

Агрегатні функції MIN та MAXобчислюють найменше та найбільше значення стовпця відповідно. Аргументами можуть бути числа, рядки та дати. Всі значення NULL видаляються перед обчисленням (тобто не беруться до уваги).

Агрегатна функція SUMобчислює загальну суму значень шпальти. Аргументами можуть бути лише числа. Використання параметра DISTINCT усуває всі повторювані значення в стовпці перед застосуванням функції SUM. Аналогічно видаляються всі значення NULL перед використанням цієї агрегатної функції.

Агрегатна функція AVGповертає середнє значення всім значень стовпця. Аргументами можуть бути лише числа, проте значення NULL видаляються перед обчисленням.

Агрегатна функція COUNTмає дві різні форми:

  • COUNT( col_name) — підраховує кількість значень у стовпці col_name, значення NULL не враховуються
  • COUNT(*) — підраховує кількість рядків у таблиці, значення NULL також враховуються

Якщо у запиті використовується ключове слово DISTINCT, перед застосуванням функції COUNT видаляються всі значення стовпця, що повторюються.

Функція COUNT_BIGаналогічна функції COUNT. Єдина різниця між ними полягає в типі результату, що повертається ними: функція COUNT_BIG завжди повертає значення типу BIGINT, тоді як функція COUNT повертає значення даних типу INTEGER.

У пропозиції HAVINGвизначається умова, яка застосовується до групи рядків. Воно має такий же зміст для груп рядків, що і пропозиція WHERE для вмісту відповідної таблиці (WHERE застосовується до угруповання, HAVING після).

Вчимося підбивати підсумки. Ні, це ще результати вивчення SQL, а підсумки значень стовпців таблиць бази даних. Агрегатні функції SQL діють щодо значень шпальти з метою отримання єдиного результуючого значення. Найчастіше застосовуються агрегатні функції SQL SUM, MIN, MAX, AVG та COUNT. Слід розрізняти два випадки застосування агрегатних функцій. Перший: агрегатні функції використовуються власними силами і повертають одне результуюче значення. Другий: агрегатні функції використовуються з оператором SQL GROUP BY, тобто з групуванням по полях (стовпцям) для отримання результуючих значень у кожній групі. Розглянемо спочатку випадки використання агрегатних функцій без угруповання.

Функція SQL SUM

Функція SQL SUM повертає суму значень шпальти таблиці бази даних. Вона може застосовуватися тільки до стовпців, значення яких числа. Запити SQL для отримання результуючої суми починаються так:

SELECT SUM(ІМ'Я_СТОЛБЦЯ) ...

Після цього виразу слідує FROM (ІМ'Я_ТАБЛИЦІ), а далі за допомогою конструкції WHERE може бути задана умова. Крім того, перед іменем стовпця може бути вказано DISTINCT, і це означає, що враховуватимуться лише унікальні значення. За умовчанням враховуються всі значення (для цього можна особливо вказати не DISTINCT, а ALL, але слово ALL не є обов'язковим).

приклад 1.Є база даних фірми з даними про її підрозділи та співробітників. Таблиця Staff також має стовпець з даними про заробітну плату співробітників. Вибірка з таблиці має такий вигляд (для збільшення картинки клацнути по ній лівою кнопкою миші):

Для отримання суми розмірів усіх заробітних плат використовуємо наступний запит:

SELECT SUM(Salary) FROM Staff

Цей запит поверне значення 287664,63.

А зараз . У вправах вже починаємо ускладнювати завдання, наближаючи їх до тих, що зустрічаються практично.

Функція SQL MIN

Функція SQL MIN також діє щодо стовпців, значеннями яких є числа та повертає мінімальне серед усіх значень стовпця. Ця функція має синтаксис, аналогічний синтаксису функції SUM.

приклад 3.База даних та таблиця - ті ж, що й у прикладі 1.

Потрібно дізнатися про мінімальну заробітну плату співробітників відділу з номером 42. Для цього пишемо наступний запит:

Запит поверне значення 10 505,90.

І знову вправу для самостійного вирішення. У цьому та деяких інших вправах знадобиться вже не лише таблиця Staff, а й таблиця Org, що містить дані про підрозділи фірми:


приклад 4.До таблиці Staff додається таблиця Org, що містить дані підрозділах фірми. Вивести мінімальну кількість років, опрацьованих одним співробітником у відділі, розташованому у Бостоні.

Функція SQL MAX

Аналогічно працює та має аналогічний синтаксис функція SQL MAX, яка застосовується, коли потрібно визначити максимальне значення серед усіх значень стовпця.

Приклад 5.

Потрібно дізнатися про максимальну заробітну плату співробітників відділу з номером 42. Для цього пишемо наступний запит:

Запит поверне значення 18352,80

Прийшов час вправи для самостійного вирішення.

Приклад 6.Знову працюємо з двома таблицями – Staff та Org. Вивести назву відділу та максимальне значення комісійних, які отримують один співробітник у відділі, що відноситься до групи відділів (Division) Eastern. Використати JOIN (з'єднання таблиць) .

Функція SQL AVG

Зазначене щодо синтаксису для попередніх описаних функцій є правильним і щодо функції SQL AVG. Ця функція повертає середнє серед усіх значень стовпця.

Приклад 7.База даних та таблиця - ті ж, що й у попередніх прикладах.

Нехай потрібно дізнатися середній стаж працівників відділу з номером 42. Для цього пишемо наступний запит:

Результатом буде значення 6,33

Приклад 8.Працюємо з однією таблицею – Staff. Вивести середню зарплату працівників зі стажем від 4 до 6 років.

Функція SQL COUNT

Функція SQL COUNT повертає кількість записів таблиці бази даних. Якщо в запиті вказати SELECT COUNT(ІМ'Я_СТОЛБЦЯ) ..., то результатом буде кількість записів без урахування записів, у яких значенням стовпця є NULL (невизначене). Якщо використовувати як аргумент зірочку і почати запит SELECT COUNT(*) ..., то результатом буде кількість всіх записів (рядків) таблиці.

Приклад 9.База даних та таблиця - ті ж, що й у попередніх прикладах.

Потрібно дізнатися про кількість всіх співробітників, які отримують комісійні. Число співробітників, у яких значення стовпця Comm – не NULL, поверне наступний запит:

SELECT COUNT(Comm) FROM Staff

Результатом буде 11.

приклад 10.База даних та таблиця - ті ж, що й у попередніх прикладах.

Якщо потрібно дізнатися загальну кількість записів у таблиці, то застосовуємо запит зі зірочкою як аргумент функції COUNT:

SELECT COUNT(*) FROM Staff

Результатом буде 17.

В наступному вправі для самостійного вирішенняпотрібно використовувати підзапит.

Приклад 11.Працюємо з однією таблицею – Staff. Вивести кількість співробітників у відділі планування (Plains).

Агрегатні функції разом із SQL GROUP BY (угрупуванням)

Тепер розглянемо застосування агрегатних функцій разом із оператором SQL GROUP BY. Оператор SQL GROUP BY служить для групування результуючих значень стовпчиків таблиці бази даних.

приклад 12.Існує база даних порталу оголошень. Вона містить таблицю Ads, яка містить дані про оголошення, подані за тиждень. Стовпець Category містить дані про великі категорії оголошень (наприклад, Нерухомість), а стовпець Parts - про дрібніші частини, що входять до категорії (наприклад, частини Квартири та Дачі є частинами категорії Нерухомість). Стовпець Units містить дані про кількість поданих оголошень, а стовпець Money - про грошові суми, отримані за подачу оголошень.

CategoryPartUnitsMoney
ТранспортАвтомашини110 17600
НерухомістьКвартири89 18690
НерухомістьДачі57 11970
ТранспортМотоцикли131 20960
БудматеріалиДошки68 7140
ЕлектротехнікаТелевізори127 8255
ЕлектротехнікаХолодильники137 8905
БудматеріалиРегіпс112 11760
ДозвілляКниги96 6240
НерухомістьБудинки47 9870
ДозвілляМузика117 7605
ДозвілляІгри41 2665

Використовуючи оператор SQL GROUP BY, знайти суми грошей, отриманих за подачу оголошень в кожній категорії. Пишемо наступний запит.

Для підбиття підсумків за інформацією, що міститься в БД, SQL передбачені агрегатні функції. Агрегатна функція приймає як аргумент будь-який стовпець даних цілком, а повертає одне значення, яке певним чином підсумовує цей стовпець.

Наприклад, агрегатна функція AVG() приймає як аргумент стовпець чисел і обчислює їхнє середнє значення.

Щоб обчислити середньодушовий дохід мешканця Зеленограда, потрібен такий запит:

SELECT 'СЕРДНЕДУШОВИЙ ДОХІД=', AVG(SUMD)

SQL має шість агрегатних функцій, які дозволяють отримувати різні види підсумкової інформації (рис. 1):

- SUM() обчислює суму всіх значень, що містяться в стовпці;

– AVG() обчислює середнє серед значень, які у стовпці;

– MIN() знаходить найменше серед усіх значень, які у стовпці;

– MAX() знаходить найбільше серед усіх значень, які у стовпці;

– COUNT() підраховує кількість значень, що містяться у стовпці;

– COUNT(*) підраховує кількість рядків у таблиці результатів запиту.

Аргументом агрегатної функції може бути просте ім'я стовпця, як у попередньому прикладі, або вираз, як у наступному запиті, що визначає обчислення середньодушового податку:

SELECT AVG(SUMD*0.13)

Під час виконання цього запиту створюється тимчасовий стовпець, що містить значення (SUMD*0.13) для кожного рядка таблиці PERSON, а потім обчислюється середнє значення тимчасового стовпця.

Суму доходів у всіх мешканців Зеленограда можна обчислити за допомогою агрегатної функції SUM:

SELECT SUM(SUMD) FROM PERSON

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

SELECT SUM(MONEY)

FROM PROFIT, HAVE_D

WHERE PROFIT.ID=HAVE_D.ID

AND PROFIT.SOURCE='Стипендія'

Агрегатні функції MIN() і MAX() дозволяють знайти відповідно найменше та найбільше значення у таблиці. При цьому стовпець може містити числові чи рядкові значення чи значення дати чи часу.

Наприклад, можна визначити:

(а) найменший загальний дохід, отриманий жителями, та найбільший податок, що підлягає сплаті:

SELECT MIN(SUMD), MAX(SUMD*0.13)

(б) дати народження найстарішого і наймолодшого жителя:

SELECT MIN(RDATE), MAX(RDATE)

(в) прізвища, імена та по батькові найпершого і найостаннішого мешканців у списку, впорядкованому за абеткою:

SELECT MIN(FIO), MAX(FIO)

Застосовуючи ці агрегатні функції, потрібно пам'ятати, що числові дані порівнюються за арифметичними правилами, порівняння дат відбувається послідовно (раніше значення дат вважаються меншими, ніж пізніші), порівняння інтервалів часу виконується на підставі їх тривалості.

При використанні функції MIN() і MAX() з рядковими даними результат порівняння двох рядків залежить від таблиці кодування символів, що використовується.

Агрегатна функція COUNT() підраховує кількість значень у стовпці будь-якого типу:

(а) скільки квартир у 1-му мікрорайоні?

SELECT COUNT(ADR) FROM FLAT WHERE ADR LIKE "%, 1_ _-%"

(б) скільки мешканців мають джерела доходу?

SELECT COUNT(DISTINCT NOM) FROM HAVE_D

(в) скільки джерел доходу використовуються мешканцями?

SELECT COUNT(DISTINCT ID) FROM HAVE_D (ключове слово DISTINCT вказує, що підраховуються неповторні значення у стовпці).

Спеціальна агрегатна функція COUNT(*) підраховує рядки у таблиці результатів, а не значення даних:

(а) скільки квартир у 2-му мікрорайоні?

SELECT COUNT(*) FROM FLAT WHERE ADR LIKE "%, 2__-%"

(б) скільки джерел доходу Іванова Івана Івановича?

SELECT COUNT(*) FROM PERSON, HAVE_D WHERE FIO="Іванов Іван Іванович" AND PERSON.NOM=HAVE_D.NOM

(в) скільки мешканців проживає у квартирі за певною адресою?

SELECT COUNT(*) FROM PERSON WHERE ADR="Зеленоград, 1001-45"

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

Наприклад, розглянемо наступний складний запит: знайти середньодушовий загальний дохід, суму загальних доходів жителів, а також середню доходність джерела у відсотках загального доходу жителя. Відповідь дає оператор

SELECT AVG(SUMD), SUM(SUMD), (100*AVG(MONEY/SUMD)) FROM PERSON, PROFIT, HAVE_D WHERE PERSON.NOM=HAVE_D.NOM AND HAVE_D.ID=PROFIT.ID

Без агрегатних функцій запит виглядав би так:

SELECT SUMD, SUMD, MONEY/SUMD FROM PERSON, PROFIT, HAVE_D WHERE PERSON.NOM=HAVE_D.NOM AND HAVE_D.ID=PROFIT.ID

та повертав би один рядок результатів для кожного мешканця та конкретного джерела доходу. Агрегатні функції використовують стовпці таблиці результатів цього запиту отримання однорядкової таблиці з підсумковими результатами.

У рядку стовпців, що повертаються, замість імені будь-якого стовпця можна вказати агрегатну функцію. Наприклад, вона може входити у вираз, в якому підсумовуються або віднімаються значення двох агрегатних функцій:

SELECT MAX(SUMD)-MIN(SUMD) FROM PERSON

Проте агрегатна функція може бути аргументом для інший агрегатної функції, тобто. заборонено вкладені агрегатні функції.

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

SELECT FIO, SUM(SUMD) FROM PERSON

Тут перший елемент списку вказує, щоб СУБД створила таблицю, яка складатиметься з кількох рядків та міститиме по одному рядку для кожного мешканця. Другий елемент списку вимагає СУБД отримати одне результуюче значення, що є сумою значень стовпця SUMD. Ці дві вказівки суперечать одна одній, що призводить до помилки.

Сказане не відноситься до випадків обробки підзапитів та запитів із угрупованням.

Використання агрегатних функцій

У SQL визначено безліч вбудованих функцій різних категорій, серед яких особливе місце займають агрегатні функції, що оперують значеннями стовпців множини рядків та повертають одне значення. Аргументами агрегатних функцій може бути як стовпці таблиць, і результати виразів з них. Агрегатні функції і можуть включатися в інші арифметичні висловлювання. У наступній таблиці наведені стандартні унарні агрегатні функції, що найчастіше використовуються.


Загальний формат унарної агрегатної функції наступний:

ім'я_функції ([АLL | DISTINCT] вираз)

де DISTINCT вказує, що функція повинна розглядати лише різні значення аргументу, а ALL - усі значення, включаючи повторювані (цей варіант використовується за умовчанням). Наприклад, функція AVG із ключовим словом DISTINCT для рядків стовпця зі значеннями 1, 1, 1 і 3 поверне 2, а за наявності ключового слова ALL поверне 1,5.

Агрегатні функції застосовуються у фразах SELECT та HAVING. Тут ми розглянемо їхнє використання у фразі SELECT. У цьому випадку вираз у аргументі функції застосовується до всіх рядків вхідної таблиці фрази SELECT. Крім того, у фразі SELECT не можна використовувати і агрегатні функції, і стовпці таблиці (або вирази з ними) за відсутності фрази GROUP BY, яку ми розглянемо у наступному розділі.

Функція COUNT має два формати. У першому випадку повертається кількість рядків вхідної таблиці, у другому випадку – кількість значень аргументу у вхідній таблиці:

  • COUNT(*)
  • COUNT (вираз)

Найпростіший спосіб використання цієї функції - підрахунок кількості рядків у таблиці (всіх або задовольняють зазначеній умові). Для цього використається перший варіант синтаксису.

Запит: Кількість видів продукції, інформація про які є у базі даних.

SELECT COUNT(*) AS "Кількість видів продукції"

FROM Product

У другому варіанті синтаксису функції COUNT як аргумент може бути використане ім'я окремого стовпця. У цьому випадку підраховується кількість або всіх значень у цьому стовпці вхідної таблиці, або лише неповторних (у разі використання ключового слова DISTINCT).

Запит: Кількість різних імен, які містяться у таблиці Customer.

SELECT COUNT (DISTINCT FNAME)

FROM Customer

Використання інших унарних агрегатних функцій аналогічно COUNT тим винятком, що з функцій MIN і MAX використання ключових слів DISTINCT і ALL немає сенсу. З функціями COUNT, MAX та MIN крім числових можуть використовуватись і символьні поля. Якщо аргумент агрегатної функції не містить значень, функція COUNT повертає 0, а решта - значення NULL.

SELECT MAX (OrdDate)

FROM

WHERE OrdDate"1.09.2010"

Завдання для самостійної роботи: Сформулюйте на мові SQL запити на вибір наступних даних:

  • Сумарна вартість усіх замовлень;
  • Кількість різних міст, що містяться в таблиці Customer.