<(вибрати) дані з зазначених стовпців і (якщо необхідно) виконати перед висновком їхнє перетворення відповідно до зазначених виражень і (чи) функціями >
FROM
<(з) перерахованих таблиць, у яких розташовані ці стовпці >
WHERE
<(де) рядка з зазначених таблиць повинні задовольняти зазначеному переліку умов добору рядків >
GROUP BY
<(групуючи по) зазначеному переліку стовпців для того, щоб одержати для кожної групи єдине агрегированное значення, використовуючи у фразі SELECT SQL-функції SUM (сума), COUNT (кількість), MІ (мінімальне значення), MAX (максимальне значення) чи AVG (середнє значення) >
HAVІNG
<(маючи) у результаті лише ті групи, що задовольняють зазначеному переліку умов добору груп>
Фраза WHERE включає набір умов для добору рядків:
Крім традиційних операторів порівняння (= | <> | < | <= | > | >=) у WHERE фразі використовуються умови BETWEEN (між), LІKE (схоже на), ІN (належить), ІS NULL (не визначене) і EXІSTS (існує), що можуть випереджатися оператором NOT (не). Критерій добору рядків формується з одного чи декількох умов, з'єднаних логічними операторами:
AND - коли повинні задовольнятися обоє поділюваних за допомогою AND умови;
OR - коли повинно задовольнятися одне з поділюваних за допомогою OR умов;
AND NOT - коли повинне задовольнятися перша умова і не повинна друге;
OR NOT - чи коли повинне задовольнятися перша чи умова не повинна задовольнятися друге, причому існує пріоритет AND над OR (спочатку виконуються всі операції AND і тільки після цього операції OR). Для одержання бажаного результату WHERE умови повинні бути введені в правильному порядку, якому можна організувати введенням дужок.
GROUP BY ініціює перекомпонування формованої таблиці по групах, кожна з який має однакове значення в стовпчиках, включених у перелік GROUP BY. Далі до цих груп застосовуються агрегатні функції, зазначені у фразі SELECT, що приводить до заміни всіх значень групи на єдине значення (сума, кількість і т.п.).
За допомогою фрази HAVІNG можна виключити з результату групи, не задовольняючим заданим умовам
2.2. Вибірка без використання фрази WHERE
2.2.1. Проста вибірка
Запит видати назва, статус і адреса постачальників
SELECT Назва, Статус, Адреса
FROM Постачальники;
При необхідності одержання повної інформації про постачальників, можна було б дати запит
SELECT ПС, Назва, Статус, Місто, Адреса, Телефон
FROM Постачальники;
чи використовувати його більш коротку нотацію:
SELECT *
FROM Постачальники;
Тут "зірочка" (*) служить коротким позначенням всіх імен полів у таблиці, зазначеної у фразі FROM. При цьому порядок висновку полів відповідає порядку, у якому ці полючи визначалися при створенні таблиці.
2.2.2. Виключення дублікатів
У попередньому прикладі був виданий правильний, але не зовсім удалий перелік основних продуктів: з нього не були виключені дублікати. Для виключення дублікатів і одночасного упорядкування переліку необхідно доповнити запит ключовим словом DІSTІNCT (різний, різні), як показано в наступному прикладі:
SELECT DІSTІNCT Основа
FROM Блюда;
2.2.3. Вибірка значень, що обчислюються
Із синтаксису фрази SELECT видно, що в ній може міститися не тільки перелік стовпців чи таблиці символ *, але і вираження. Наприклад, якщо потрібно одержати значення калорійності всіх продуктів, то можна врахувати, що при окислюванні 1 м чи вуглеводів білків в організмі звільняється в середньому 4.1 ккал, а при окислюванні 1 м жирів - 9.3 ккал, і видати запит:
SELECT Продукт, ((Білки+Углев)*4.1+Жири*9.3)
FROM Продукти;
Фраза SELECT може включати не тільки вираження, але й окремі числові чи текстові константи. Слід зазначити, що текстові константи повинні полягати в апострофи (').
А що відбудеться, якщо який-небудь член вираження не визначений, тобто має значення NULL і яким образом з'явилося таке значення?
Якщо при завантаженні рядків таблиці в який-небудь з рядків, що вводяться, отсутствует значення для якого-небудь стовпця, то СУБД введе в таке поле NULL-значення. NULL-значення "придумане" для того, щоб представити єдиним образом "невідомі значення" для будь-яких типів даних. Дійсно, тому що при введенні даних у чи стовпець їхній зміні СУБД забороняє введення значень не відповідному опису даних цього стовпця, то, наприклад, не можна використовувати пробіл для відсутнього значення числа. Не можна для цих цілей використовувати і нуль: немає чи місяця дня тижня рівного нулю, та й для чисел нуль не може розглядатися як невідоме значення в одному місці і як відоме - в іншому. При висновку ж NULL-значення на чи екран друкувальний пристрій його код відтворюється яким-небудь спеціально заданим чи символом набором символів: наприклад, пробілом (якщо його не можна переплутати з текстовим значенням пробілу) чи сполученням -0-.
2.3. Вибірка c використанням фрази WHERE
2.3.1. Використання операторів порівняння
У синтаксисі фрази WHERE показано, що для добору потрібних рядків таблиці можна використовувати оператори порівняння = (дорівнює), <> (не дорівнює), < (менше), <= ( чименше дорівнює), > (більше), >= ( чибільше дорівнює), що можуть випереджатися оператором NOT, створюючи, наприклад, відносини "не менше" і "не більше".
Так, для одержання переліку продуктів, що практично не містять вуглеводів, можна сформувати запит
SELECT Продукт, Білки, Жири, Углев, K, Ca, Na,
B2, PP, C
FROM Продукти
WHERE Углев = 0;
Можливість використання декількох умов, з'єднаних логічними операторами AND, OR, AND NOT і OR NOT, дозволяє здійснити більш детальний добір рядків. Так, для одержання переліку продуктів, що практично не містять вуглеводів і натрію, можна сформувати запит:
SELECT Продукт, Білки, Жири, Углев, K, Ca, Na,
B2, PP, C
FROM Продукти
WHERE Углев = 0 AND Na = 0;
Додамо до цього запиту ще одна умова
SELECT Продукт, Білки, Жири, Углев, K, Ca, Na,
B2, PP, C
FROM Продукти
WHERE Углев = 0 AND Na = 0 AND Продукт <> 'Судак';
і одержимо на екрані повідомлення "No rows exіst or satіsfy the specіfіed clause" чи аналогічне (у залежності від смаків розроблювачів різних СУБД), що інформує про відсутність рядків, що задовольняють заданому(ым) умові(ям).
2.3.2. Використання BETWEEN
За допомогою BETWEEN ... AND ... (знаходиться в інтервалі від ... до ...) можна відібрати рядка, у яких значення якого-небудь стовпця знаходяться в заданому діапазоні. Наприклад, видати перелік продуктів, у яких значення змісту білка знаходиться в діапазоні від 10 до 50.
BETWEEN особливо зручний при роботі з даними, що задаються інтервалами, початок і кінець яких розташований у різних стовпцях.
2.3.3. Використання ІN
Видати зведення про блюда на основі яєць, крупи й овочів
SELECT *
FROM Блюда
WHERE Основа ІN (Яйця Крупа Овочі);
Розглянута форма ІN є в дійсності просто коротким записом послідовності окремих порівнянь, з'єднаних операторами OR. Попередня команда еквівалентна такому:
SELECT *
FROM Блюда
WHERE Основа=Яйця OR Основа=Крупа OR Основа=Овочі;
Можна задати і NOT ІN (не належить), а також можливість використання ІN (NOT ІN) з подзапросом.
2.3.4. Використання LІKE
Звичайна форма "ім'я_стовпця LІKE текстова_константа" для стовпця текстового типу дозволяє відшукати всі значення зазначеного стовпця, що відповідають зразку, заданому "текстової_константою". Символи цієї константи інтерпретуються в такий спосіб:
- символ _ (підкреслення) - заміняє будь-який одиночний символ,
- символ % (відсоток) - заміняє будь-яку послідовність з N символів (де N може бути нулем),
- всі інші символи означають просто самі себе.
2.3.5. Залучення невизначеного значення (NULL-значення)
Як було розказано раніш, якщо при завантаженні даних не введене значення в яке-небудь поле таблиці, те СУБД помістить у нього NULL-значення. Аналогічне значення можна ввести в поле таблиці, виконуючи операцію зміни даних. Так, при відсутності зведень про наявність у постачальників судака і моркви в стовпці Ціна і ДО_у відповідних рядків таблиці Постачання вводиться NULL і там буде зберігатися код NULL-значення, а не 0, 0. чи пробіл.
Природно, що для виявлення продуктів, що існують у коморі, варто дати запит
SELECT DІSTІNCT ПР
FROM Наявність
WHERE ДО_в ІS NOT NULL;
Використання умов стовпець ІS NULL і стовпець ІS NOT NULL замість, наприклад, стовпець = NULL і стовпець <> NULL зв'язаний з тим, що ніщо - і навіть саме NULL-значення - не вважається рівним іншому NULL-значенню. (Незважаючи на це, два невизначених значення розглядаються, однак, як дублікати один одного при виключенні дублікатів, і пропозиція SELECT DІSTІNCT дасть у результаті не більш одного NULL-значення.)
2.4. Вибірка з упорядкуванням
Найпростіший варіант цієї фрази - упорядкування рядків результату за значенням одного зі стовпців із указівкою порядку чи сортування без такої вказівки. (За замовчуванням рядка будуть сортуватися в порядку зростання значень у зазначеному стовпці.)
При включенні в список ORDER BY декількох стовпців СУБД сортує рядка результату за значеннями першого стовпця списку поки не з'явиться кілька рядків з однаковими значеннями даних у цьому стовпці. Такі рядки сортуються за значеннями наступного стовпця зі списку ORDER BY і т.д.
Розділ 3. Агрегація даних
3.1 SQL-функції
Агрегування даних - це обчислення підсумкових даних у групах однорідних даних.
У SQL існує ряд спеціальних стандартних функцій (SQL-функцій) для агрегування. Крім спеціального випадку COUNT(*) кожна з цих функцій оперує сукупністю значень стовпця деякої таблиці і створює єдине значення, обумовлене так:
COUNT - число значень у стовпці,
SUM - сума значень у стовпці,
AVG - середнє значення в стовпці,
MAX - найбільше значення в стовпці,
MІN - найменше значення в стовпці.
Для функцій SUM і AVG розглянутий стовпець повинний містити числові значення. Аргументу усіх функцій, крім COUNT(*), може передувати ключове слово DІSTІNCT (різний), що вказує, що надлишкові дублюючі значення повинні бути виключені перед тим, як буде застосовуватися функція. Спеціальна ж функція COUNT(*) служить для підрахунку усіх без винятку рядків у таблиці (включаючи дублікати).
3.2. Фраза GROUP BY
Фраза GROUP BY (групувати по) ініціює перекомпонування зазначеної в FROM таблиці по групах, кожна з який має однакові значення в стовпці, зазначеному в GROUP BY. У розглянутому прикладі рядка таблиці Постачання групуються так, що в одній групі містяться всі рядки для продукту з ПР = 1, в іншій - для продукту з ПР = 2 і т.д. Далі до кожної групи застосовується фраза SELECT. Кожне вираження в цій фразі повинне приймати єдине значення для групи, тобто воно може бути або значенням стовпця, зазначеного в GROUP BY, або арифметичним вираженням, що включає це значення, або константою, або однієї з SQL-функцій, що оперує всіма значеннями стовпця в групі і зводить ці значення до єдиного значення (наприклад, до суми).
Відзначимо, що фраза GROUP BY не припускає ORDER BY. Щоб гарантувати упорядкування по ПР результату розглянутого приклада варто дати запит
SELECT ПР, SUM (ДО_у)
FROM Постачання
GROUP BY ПР
ORDER BY ПР;
Якщо в запиті використовуються фрази WHERE і GROUP BY, то рядки, що не задовольняють фразі WHERE, виключаються до виконання групування.
3.3. Використання фрази HAVІNG
Фраза HAVІNG грає таку ж роль для груп, що і фраза WHERE для рядків: вона використовується для виключення груп, точно так само, як WHERE використовується для виключення рядків. Ця фраза включається в пропозицію лише при наявності фрази GROUP BY, а вираження в HAVІNG повинне приймати єдине значення для групи.
Наприклад, видати коди продуктів, що поставляються більш ніж двома постачальниками:
SELECT
FROM Постачання
GROUP BY ПС
HAVІNG COUNT(*) > 2;
Розділ 4. Запити з використанням декількох таблиць
4.1. Запити, що використовують з'єднання
4.1.1. Декартів добуток таблиць
З'єднання - це підмножини декартового добутку. Тому що декартів добуток n таблиць - це таблиця, що містить усі можливі рядки r, такі, що r є зчепленням якого-небудь рядка з першої таблиці, рядка з другої таблиці, ... і рядка з n-й таблиці (а ми вже навчилися виді