- •4. Нормалізація реляційної моделі даних
- •5, Мова sql.Загальна характеристика.
- •7. Використання агрегатних функцій
- •8. Вибір з кількох таблиць
- •9. Підзапити
- •10. Засоби маніпулювання даними
- •12. Представлення
- •1. Спосіб створення і вміст уявлень
- •2. Використання
- •3. Специфічні типи уявлень
- •13. Індекси
- •14. Транзакції
5, Мова sql.Загальна характеристика.
SQL (англ. Structured query language — мова структурованих запитів) — декларативна мова програмування для взаємодії користувача з базами даних, що застосовується для формування запитів, оновлення і керування реляційними БД, створення схеми бази даних і її модифікації, системи контролю за доступом до бази даних. Сам по собі SQL не є ні системою керування базами даних, ні окремим програмним продуктом. Не будучи мовою програмування в тому розумінні, як C або Pascal, SQL може формувати інтерактивні запити або, будучи вбудованою в прикладні програми, виступати в якості інструкцій для керування даними. Стандарт SQL, крім того, вміщує функції для визначення зміни, перевірки і захисту даних.
SQL — це діалогова мова програмування для здійснення запиту і внесення змін до бази даних, а також управління базами даних. Багато баз даних підтримує SQL з розширеннями до стандартної мови. Ядро SQL формує командна мова, яка дозволяє здійснювати пошук, вставку, обновлення, і вилучення даних, використовуючи систему управління і адміністративні функції. SQL також включає CLI (Call Level Interface) для доступу і управління базами даних дистанційно.
Перша версія SQL була розроблена на початку 1970-х років у IBM. Ця версія носила назву SEQUEL і була призначена для обробки і пошуку даних, що містилися в реляційній базі даних IBM, System R . Мова SQL пізніше була стандартизована Американськими Держстандартами (ANSI) в 1986. Спочатку SQL розроблялась як мова запитів і управління даними, пізніші модифікації SQL створено продавцями системи управління базами даних, які додали процедурні конструкції, control-of-flow команд і розширення мов. З випуском стандарту SQL:1999 такі розширення були формально запозичені як частина мови SQL через Persistent Stored Modules (SQL/PSM).
Критики SQL включає відсутність крос-платформенності , невідповідною обробкою відсутніх даних (дивіться Null (SQL)), і іноді неоднозначна граматика і семантика мови.
7. Використання агрегатних функцій
В інформатиці, агрегатна функція (дослівно - функція складеного значення) — функція, яка повертає одинарне значення з колекції вхідних значень такої як множина (set), мультимножина (multiset) або список (list).
Серед набільш поширених агрегатних функцій:
Average()
Count()
Maximum()
Median()
Minimum()
Mode()
Sum()
Агрегатні функції широко вживані в багатьох мовах програмування, наприклад, Ruby, в електронних таблицях, в реляційній алгебрі.
Агрегатні функції в SQL
В SQL агрегатні функції повертають одинарне значення, обчислене зі значень в стовпці.
Деякі корисні агрегатні функції:
* AVG() - Повертає середнє значення
* COUNT() - Повертає кількість рядків
* FIRST() - Повертає перше значення
* LAST() - Повертає останнє значення
* MAX() - Повертає найбільше значення
* MIN() - Повертає найменше значення
* SUM() - Повертає суму
8. Вибір з кількох таблиць
Використання об'єднань для запитів до кількох
таблиць
За умов нормалізованої бази даних, коли дані зберігаються не в одній, а в цілому наборі
таблиць, можливість вибору даних тільки з однієї таблиці, звичайно ж, є великим
обмеженням. Добре спроектована реляційна база даних стає цікавим об'єктом через
відношення, що існують у ній, тобто через зв'язки між таблицями. При виборі даних з
кількох таблиць такі зв'язки називають
об'єднаннями
. Розглянемо запити, в яких
об'єднуються дві таблиці.
Об'єднання двох таблиць
Розглянемо такий запит:
select knygy.nazva, grupy.nazvaGrupy
from knygy, grupy
where knygy.grupID = grupy.grupID;
Тут у виразі FROM замість однієї таблиці вказані дві. У цьому випадку ми хотіли б
відшукати в базі даних назви книг разом з назвами груп, до яких вони відносяться.
У першому запиті, що використовує вираз
WHERE
, відобразилися назви книг з
відповідними назвами груп, а в другому — всі можливі комбінації книг і назв груп. Проте
це не дає можливості з'ясувати, які рядки несуть правильну інформацію, а які —
помилкову. Результуючу множину, що містить всі можливі комбінації даних з двох
таблиць, називають
декартовим добутком
цих
таблиць.
Вираз
WHERE
важливий з погляду отримання потрібного результату. Набір умов,
використаних при створенні зв'язку для об'єднання таблиць, називають
умовою
об'єднання
.
У цьому випадку ми використовували умову
knygy
.
grupID
=
grupy
.
grupID
,
що
зв'язує таблиці за зовнішнім ключем.
Об'єднання кількох таблиць
Об'єднання кількох таблиць аналогічне об'єднанню двох таблиць.
Розглянемо випадок, коли вимагається з'ясувати, книги якиї тематики (групи) читає
відвідувач
Гарбузинський Володимир
. Як знайти ці дані?
Ми знаємо ім'я відвідувача і, знайшовши його в таблиці відвідувачів, можна з'ясувати його
кодовий номер (
vidvID
). Це можна використати для того, щоб знайти відповідні
замовлення в таблиці замовлень і побачити, які книги читав відвідувач. З таблиці
замовлень ми одержимо кодові номери книг
(
knygaID
)
, а з таблиці книг можна з'ясувати
номери груп, до яких віднесені ці книги. За цими даними ми можемо звернутися до
таблиці
grupy
і знайти назву відповідної групи.
Запит може виглядати так:
Нам довелося вказати спочатку всі таблиці шляху, що ми спланували, а потім умови
об'єднань, що зв'язують ці таблиці одна з одною. Ми тут маємо і одну звичайну умову —
vidviduvachi
.
imja
='Гарбузинський Володимир'
— і кілька умов об'єднання. Для об’єднання
чотирьох таблиць нам знадобилися три умови об'єднання.
Якщо вимагається об'єднати
n
таблиць, то, як правило, кожна умова зв'язуватиме пару
таблиць, тому потрібно вказати
n
-1
умову об'єднання. Об'єднання таблиць з наведеного
прикладу показані на рис. 1, з якого зрозуміло, чому для чотирьох таблиць потрібні три
умови об'єднання.
vidviduvachi.vidvID = zamovlennya.vidvID
zamovlennya.knygaID = knygy.knygaID
vidviduvachi
zamovlennya
knygy
grupy
knygy.grupID = grupy.grupID
Рис. 1 Для об’єднання чотирьох таблиць потрібно три умови об’єднання
Самооб’єднання таблиць
Аналогічно об'єднанню таблиці з іншою таблицею,
можна
об'єднати таблицю саму з
собою. Але навіщо це робити? Припустимо, що ви хочете з'ясувати назви книг групи, до
якої належить «
Сталкер»
. Для цього необхідно знайти в таблиці
knygy
номер групи
(
grupID
), до якої належить «
Сталкер»
, а потім подивитися в таблиці
knygy
, які книги ще
належать до цієї групи.
У цьому запиті для таблиці
knygy
ми визначили два різні псевдоніми. По суті ми
«повідомили» MySQL, що хотіли б мати дві окремі таблиці,
k
l і
k
2, що мають містити
однакові дані. Після цього ми об'єднуємо їх так само, як будь-які інші таблиці. Знаходимо
рядок «Сталкера»
в таблиці
Тут представлені всі книги, що належать до однієї групи з «Сталкером», включаючи іцю
книжку. Дуже просто додати умову, що виключить її із результуючого списку:
Типи об'єднань
Існують різні типи об'єднань, що можуть використовуватися в MySQL.
Основне об'єднання
У попередньому розділі ми згадали поняття декартового добутку. У цьому контексті його
іноді називають повним або перехресним об'єднанням, але, незалежно від термінології,
таке об'єднання повертає повний набір комбінацій рядків. При додаванні до об'єднання
деякого умовного виразу (типу
knygy
.
grupID
=
grupy
.
grupID
) ми перетворюємо його на
об'єднання за еквівалентністю
, що обмежує число рядків, що повертаються запитом.
До тепер ми використовували набір таблиць, записаних у виразі
FROM
і розділених
комами. Це визначало, як було показано вище, перехресне об'єднання, що
перетворювалося на об'єднання за еквівалентністю за допомогою виразу
WHERE
. MySQL
пропонує різні форми синтаксису для об'єднань такого типу.
Розглянемо запит:
При використанні цього типу об'єднання MySQL знаходить зв'язані таблиці і намагається
об'єднати їх оптимально, не обов'язково в тому порядку, в якому їх записує користувач.
Іноді така оптимізація запиту виявляється не зовсім правильною. Якщо необхідно
відмінити оптимізацію і «примусити» MySQL зв'язати таблиці у вказаному порядку, слід
використати вказівку
STRAIGHT
_
JOIN
(безпосереднє об'єднання), вставивши її відразу
після слова
select
.
Ліві і праві об'єднання
При об'єднанні за еквівалентністю в попередньому розділі ми використовували
JOIN
,
CROSS
JOIN
,
INNER
JOIN
або, можливо,
STRAIGHT
JOIN
і шукали рядки, що
задовольняють критеріям пошуку для двох або кількох таблиць.