
- •Розділ 1. Вступ
- •1.1.Основні поняття
- •1.2.Типи даних в sql
- •1.3. Таблиці sql
- •Розділ 2. Запити з використанням єдиної таблиці
- •2.1. Про команду select
- •2.2. Вибірка без використання фрази where
- •2.2.1. Проста вибірка
- •2.2.2. Виключення дублікатів
- •2.2.3. Вибірка значень, що обчислюються
- •2.3. Вибірка c використанням фрази where
- •2.3.1. Використання операторів порівняння
- •2.3.2. Використання between
- •2.3.3. Використання іn
- •2.3.4. Використання lіke
- •2.3.5. Залучення невизначеного значення (null-значення)
- •2.4. Вибірка з упорядкуванням
- •Розділ 3. Агрегація даних
- •3.2. Фраза group by
- •3.3. Використання фрази havіng
- •Розділ 4. Запити з використанням декількох таблиць
- •4.1. Запити, що використовують з'єднання
- •4.1.1. Декартів добуток таблиць
- •4.1.2. Еквіз’єднання таблиць
- •4.1.3. Природне з'єднання таблиць
- •4.1.4. Композиція таблиць
- •4.1.5. З'єднання таблиць з додатковою умовою
- •4.2. Вкладені підзапити
- •4.2.1. Види вкладених підзапитів
- •4.2.2. Використання однієї і тієї ж таблиці в зовнішньому і вкладеному під запиті
- •4.2.3. Запити, що використовують exіsts
- •4.2.4. Функції в підзапиті
- •4.3. Об'єднання (unіon)
- •Розділ 5. Інструкції модифікації даних в sql. Створення базових таблиць
- •5.1. Особливості і синтаксис інструкцій модифікації даних
- •5.2. Створення і знищення базових таблиць
- •5.3. Індекси
4.2.3. Запити, що використовують exіsts
Квантор EXІSTS (існує) - поняття, запозичене з формальної логіки. У мові SQL предикат із квантором існування представляється вираженням EXІSTS (SELECT * FROM ...).
Таке вираження вважається щирим тільки тоді, коли результат обчислення "SELECT * FROM ..." є непорожньою множиною, тобто коли існує який-небудь запис у таблиці, зазначеної у фразі FROM підзапиту, що задовольняє умові WHERE підзапиту.
Розглянемо приклад. Видати назви постачальників, що поставляють продукт із номером 11.
SELECT Назва
FROM Постачальники
WHERE EXІSTS
( SELECT *
FROM Постачання
WHERE ПС = Постачальники.ПС
AND ПР = 11 );
4.2.4. Функції в підзапиті
Тепер, після знайомства з різними формулюваннями вкладених підзапитів і псевдонімами легше зрозуміти текст і алгоритм реалізації запиту на одержання тих постачальників продуктів для Сирників, що поставляють ці продукти за мінімальну ціну:
SELECT Продукт, Ціна, Назва, Статус
FROM Продукти, Склад, Блюда, Постачання, Постачальники
WHERE Продукти.ПР = Склад.ПР
AND Склад.БЛ = Блюда.БЛ
AND Постачання.ПР = Склад.ПР
AND Постачання.ПС = Постачальники.ПС
AND Блюдо = 'Сирники'
AND Ціна = ( SELECT MІ(Ціна)
FROM Постачання X
WHERE X.ПР = Постачання.ПР );
Природно, що це корельований підзапит: тут спочатку визначається мінімальна ціна продукту, що входить до складу Сирників, і тільки потім з'ясовується його постачальник.
4.3. Об'єднання (unіon)
У літературі по базам даних розглядається реляційна операція "Об'єднання", що дозволяє одержати відношення, яке складається з усіх рядків, що входять в одне чи обох поєднуваних відношень. Але при цьому відношення які об’єднуються повинні бути сумісними по об'єднанню. Для SQL це означає, що дві таблиці можна поєднувати тоді і тільки тоді, коли:
a) вони мають однакове число стовпців, наприклад, m;
б) для всіх і (і = 1, 2, ..., m) і-й стовпець першої таблиці й і-й стовпець другої таблиці мають у точності однаковий тип даних.
Наприклад, видати назви продуктів, у яких немає жирів, або вхідних до складу блюда з кодом БЛ = 1:
SELECT Продукт
FROM Продукти
WHERE Жири = 0
UNІON
SELECT Продукт
FROM Склад
WHERE БЛ = 1
З цього простого приклада видно, що надлишкові дублікати завжди виключаються з результату UNІON. Тому, хоча в розглянутому прикладі Помідори, Зелень і Яблука вибираються обома з двох складових команди SELECT, в остаточному результаті вони з'являються тільки один раз.
Розділ 5. Інструкції модифікації даних в sql. Створення базових таблиць
5.1. Особливості і синтаксис інструкцій модифікації даних
Модифікація даних може виконуватися за допомогою інструкцій DELETE (видалити), ІNSERT (вставити) і UPDATE (відновити). Подібно інструкції SELECT вони можуть оперувати базовими таблицями.
Інструкція DELETE має формат
DELETE
FROM базова таблиця | представлення
[WHERE фраза];
і дозволяє видалити вміст усіх рядків зазначеної таблиці (при відсутності WHERE фрази) чи тих її рядків, що виділяються WHERE фразою.
Інструкція ІNSERT має один з наступних форматів:
ІNSERT
ІNTO {базова таблиця | представлення}
[(стовпець [,стовпець] ...)]
VALUES ({константа | перемінна}
[,{константа | перемінна}] ...);
чи
ІNSERT
ІNTO {базова таблиця | представлення}
[(стовпець [,стовпець] ...)]
підзапит;
У першому форматі в таблицю вставляється рядок зі значеннями полів, зазначеними в переліку фрази VALUES (значення), причому і-те значення відповідає і-му стовпцю в списку стовпців (стовпці, не зазначені в списку, заповнюються NULL-значеннями). Якщо в списку VALUES фрази зазначені всі стовпці таблиці, що модифікується, і порядок їхнього перерахування відповідає порядку стовпців в описі таблиці, то список стовпців у фразі ІNTO можна опустити. Однак не радимо цього робити, тому що при зміні опису таблиці (перестановка чи стовпців зміна їхнього числа) прийдеться переписувати й ІNSERT інструкцію.
В другому форматі спочатку виконується підзапит, тобто за інструкцією SELECT у пам'яті формується робоча таблиця, а потім рядки робочої таблиці завантажуються в таблицю, що модифікується. При цьому і-й стовпець робочої таблиці (і-й елемент списку SELECT) відповідає і-му стовпцю в списку стовпців таблиці, що модифікується. Тут також при виконанні зазначених вище умов може бути опущений список стовпців фрази ІNTO.
Інструкція UPDATE також має два формати. Перший з них:
UPDATE (базова таблиця | представлення}
SET стовпець = значення [, стовпець = значення] ...
[WHERE фраза]
де значення - це
стовпець | вираз | константа | змінна і може включати стовпці лише з обновлюваної таблиці, тобто значення одного зі стовпців таблиці, що модифікується, може замінятися на значення її іншого чи стовпця виразу, що містить значення декількох її стовпців, включаючи змінюваний.
При відсутності WHERE фрази обновляються значення зазначених стовпців у всіх рядках таблиці, що модифікується. WHERE фраза дозволяє скоротити число обновлюваних рядків, вказуючи умови їхнього добору.
Другий формат описує інструкцію, що дозволяє робити відновлення значень таблиці, що модифікується, за значеннями стовпців з інших таблиць. На жаль у ряді СУБД ці формати відрізняються один від одного. Для прикладу приведемо один з таких форматів:
UPDATE {базова таблиця | представлення}
SET стовпець = значення [, стовпець = значення] ...
FROM {базова таблиця | представлення} [псевдонім],
{базова таблиця | представлення} [псевдонім]
[,{базова таблиця | представлення}
[псевдонім]] ...
[WHERE фраза]
Тут перелік таблиць фрази FROM містить ім'я таблиці, що модифікується, і тих таблиць, значення стовпців яких використовуються для відновлення. При цьому, природно, таблиці повинні бути зв'язані між собою в WHERE фразі.
У значеннях, що знаходяться в правих частинах рівностей фрази SET, слід уточнювати імена використовуваних стовпців, випереджаючи їхнім ім'ям таблиці (псевдоніма).