
- •Поняття баз даних.
- •Реляційні бази даних
- •1.3. Первинні ключі та індекси
- •1.4. Реляційні відношення (зв’язки) між таблицям
- •1.4.1. Відношення "один-до-багатьох"
- •1.4.2. Відношення "один-до-одного"
- •1.4.3. Відношення "багато-до-багатьох"
- •1.4.4. Зв’язки між записами однієї таблиці
- •1.5. Цілісність посилань (referencial integrity)
- •Індекси.
- •Поняття транзакцій
- •Локальні та файл-серверні бази даних
- •Загальний огляд засобів для роботи з базами даних
- •Побудова додатків баз даних в архітектурі "клієнт-сервер"
- •Interbase: деякі технічні характеристики
- •Питання з'єднання з видаленим сервером
- •Приклад бд “Облік товарів на складі”
- •Зміна визначення домена – після create domain (крім типу та not null)
- •Первинний ключ
- •Зовнішній ключ та визначення цілісності посилань
- •Використання генераторів та збережених процедур
- •Знищення таблиці
- •Використання підрядків (containing)
- •Додавання, зміна, видалення записів
- •Оператор insert
- •Явне вказання списку значень
- •Вказання значень за допомогою оператора select
- •Оператор delete
Знищення таблиці
DROP TABLE < ім’я таблиці >;
Оператор SELECT
Оператор SELECT – самий використовуваний оператор SQL. Він дозволяє проводити вибірки даних з ТБД і перетворювати до потрібного вигляду отримані результати. За його допомогою можна реалізувати вельми складні і громіздкі умови вибору даних з різних таблиць.
Оператора SELECT має наступний формат:
SELECT [DISTINCT | ALL] {* | <значення1> [, <значення2> ...]}
FROM <таблиця1> [, < таблиця2> ...]
[WHERE <умови_пошуку>]
[GROUP BY поле [COLLATE collation] ...]
[HAVING < умови пошуку >]
[UNION <оператор select>]
[PLAN <план виконання_запиту>]
[ORDER BY <список_полів>]
Прим. Значення – поле, або арифм. вираз.
Найпростіший різновид оператора SELECT (SELECT .. FROM).
Після ключового слова SELECT приводиться список значень. Кожне з них визначає поле результуючого набору даних. В більшості випадків – це імена полів таблиць, перерахованих після слова FROM. Зірочка '*' указує, що в результат виконання запиту потрібно включити всі поля тієї або іншої таблиці. Після FROM вказується список ТБД, з яких буде відбуватись вибірка даних.
Наприклад, створити набір даних, що складається зі всіх полів і всіх записів з таблиці PRODAZH можна за допомогою такого оператора:
SELECT *
FROM PRODAZH
що еквівалентно
SELECT N_PROD, DAT_PROD, KILK, TOVAR, POKUP
FROM PRODAZH
Використання WHERE
WHERE використовується для включення в НД лише потрібних записів.
У набір даних, який повертається оператором SELECT, включатимуться тільки ті записи, які задовольняють умові пошуку, вказаній після WHERE.
Розглянемо дві прості умови пошуку.
Порівняння значення поля з константою
Приклад. Вибрати з таблиці PRODAZH всі операції продажу товарів об'ємом 20 одиниць
SELECT *
FROM PRODAZH
WHERE KILK = 20
Порівняння значення поля однієї таблиці із значенням поля іншої таблиці (внутрішнє з'єднання)
Приклад 1. Видати всі записи про витрату товару з таблиці PRODAZH і для кожного товару вказати його ціну з таблиці TOVARY
SELECT PRODAZH.*, TOVARY.CINA
FROM PRODAZH, TOVARY
WHERE PRODAZH.TOVAR = TOVARY.TOVAR
Приклад 2. Видати всі записи про витрату товару з таблиці PRODAZH Для кожного покупця вказати його адресу з таблиці POKUPCI
SELECT PRODAZH.*, POKUPCI.ADRESA
FROM PRODAZH, POKUPCI
WHERE POKUPCI.POKUP = PRODAZH.POKUP
Використання псевдонімів таблиць
Використання імен таблиць для ідентифікації полів (див. попер приклади) незручно із-за своєї громіздкості. Набагато краще присвоїти кожній таблиці яке-небудь коротке ім’я. Такі імена називаються псевдонімами таблиць.
Приклад. PR, PO – псевдоніми
SELECT PR.*, РO.ADRESA
FROM PRODAZH PR, POKUPCI PO
WHERE PO.POKUP = PR.POKUP
Визначення сортування (ORDER BY)
Приклад. Видати всі записи продажу товару "Кока-кола", відсортувавши їх по кожному покупцеві
SELECT POKUP, DAT_PROD, TOVAR, KILK
FROM PRODAZH
WHERE TOVAR = "Кока-кола"
ORDER BY POKUP
Приклад. Видати всі записи з таблиці PRODAZH, відсортувавши їх по кожному покупцеві, для кожного покупця - по назві товару, для кожного товару - по даті
SELECT POKUP, TOVAR, DAT_PROD, KILK
FROM PRODAZH
ORDER BY POKUP, TOVAR, DAT_PROD
Усунення значень, що повторюються (DISTINCT)
Часто в результуючий НД необхідно включати не всі записи з однаковим значенням якого-небудь поля (комбінації полів), а тільки одну з них. В цьому випадку після SELECT указують ключове слово DISTINCT.
Приклад. Видати тільки найменування всіх відпущених з складу товарів
SELECT DISTINCT TOVAR
FROM PRODAZH
Розрахунок значень обчислювальних полів
Для розрахунку значень обчислювальних полів результуючого НД використовуються арифметичні вирази.
Приклад. Видати всі записи про продаж товарів з таблиці PRODAZH, для кожного продажу товару розрахувати загальну вартість відпущеного товару і присвоїти обчислювальному полю ім'я VART
SELECT PR.*, T.CINA, PR.KILK * T.CINA AS VART
FROM PRODAZH PR, TOVARY T
WHERE PR.TOVAR = T.TOVAR
Агрегатні функції
Агрегатні функції призначені для видачі підсумкових значень. До агрегатних відносяться функції:
COUNT (<вираз>) – підраховує кількість входжень значення виразу в усі записи результуючого НД;
SUM(<вираз>) – підсумовує значення виразу;
AVG (<вираз>) – знаходить середнє значення;
МАХ(<вираз>) – визначає максимальне значення;
МIN(<вираз>) – визначає мінімальне значення.
Приклад. Підрахувати кількість покупців, що придбали товар на складі
SELECT COUNT(DISTINCT POKUP) AS COUNT_POKUP
FROM PRODAZH
Приклад. Обчислити загальну вартість відпущених товарів за 10.01.2007
SELECT SUM(PR.KILK * T.CINA) AS ZAG_CINA
FROM PRODAZH PR, TOVARY T
WHERE (PR.TOVAR = T.TOVAR) AND
(PR.DAT_PROD = "10.01.2007")
Групування записів (GROUP BY)
Приклад. Видати загальний продаж по кожному з товарів
SELECT PR.TOVAR, SUM(PR.KILK) AS PROD
FROM PRODAZH PR
GROUP BY PR.TOVAR
Приклад. Видати загальну суму відпустки по кожному з товарів (результат на мал. 25.15)
SELECT R.TOVAR, SUM(R.KILK * T.CINA) FROM PRODAZH R, TOVARY T
WHERE T.TOVAR = R.TOVAR GROUP BY R.TOVAR
Приклад. Видати загальну суму продажу по кожному з товарів на кожну дату
SELECT PR.TOVAR, PR.DAT_PROD, SUM(PR.KILK * T.CINA)
FROM PRODAZH PR, TOVARY T
WHERE T.TOVAR = PR.TOVAR GROUP BY PR.TOVAR, PR.DAT_PROD
Приклад. Видати кількість покупців на кожну дату
SELECT DAT_PROD, COUNT(DISTINCT POKUP)
FROM PRODAZH
GROUP BY DAT_PROD
Накладення обмежень на угрупування записів (HAVING)
Приклад. Видати мінімальні покупки товару в одиницях для всіх покупців, у яких мінімальна кількість товару, що купується, не менше 100 одиниць.
SELECT POKUP, MIN(KILK) FROM PRODAZH
GROUP BY POKUP HAVING MIN(KILK) >= 100
Приклад. Видати загальну кількість купленого товару (у одиницях) для всіх покупців, у яких мінімальна кількість товару, що купується, не менше 100 одиниць.
SELECT POKUP, SUM(KILK)
FROM PRODAZH
GROUP BY POKUP
HAVING MIN(KILK) >= 100
Прим.: у умові пошуку WHERE не можна указувати агрегатні функції.
Приклад. Видати на кожну дату число продажів товарів, в яких кількість товару, що відпускається, більше або рівні 1000 одиниць.
SELECT DAT_PROD, COUNT(*)
FROM PRODAZH
WHERE KILK >= 1000
GROUP BY DAT_PROD
Приклад. Видати дати продажів товарів, в яких кількість товару, що продається, більше або рівна 1000 одиниць. У результуючий НД включити тільки ті групи, по яких число таких продажів товарів більше 1.
SELECT DAT_PROD, COUNT(*)
FROM PRODAZH
WHERE KILK >= 1000
GROUP BY DAT_PROD
HAVING COUNT(*)> 1
Задання складних умов пошуку (WHERE)
Використання логічних виразів (AND, OR, NOT)
Приклад. Видати всі записи з таблиці PRODAZH, для кожного товару видати його ціну з таблиці TOVARY, для кожного покупця видати його місто з таблиці POKUPCI.
SELECT PR.*, T.CINA, PO.ADRESA FROM PRODAZH PR, TOVARY T, POKUPCI PO
WHERE (PR.TOVAR = T.TOVAR) AND (PR.POKUP = PO.POKUP)
Приклад. Видати записи з таблиці PRODAZH плюс відповідну кожному товару ціну з таблиці TOVARY. При цьому кількість продажів товару має бути не більше 30 або повинна бути не менше 3000, і назва покупця має бути вказана.
SELECT PR.*, T.CINA
FROM PRODAZH PR, TOVARY T
WHERE (PR.TOVAR = T.TOVAR) AND ((PR.KILK <=30) OR (PR.KILK >= 3000)) AND (PR.POKUP IS NOT NULL)
ORDER BY PR.KILK
Порівняння поля з результатом обчислення виразу
Приклад. Видати з таблиці PRODAZH дату, товар, вартість відпущеного товару. При цьому показувати тільки записи, у яких вартість відпущеного товару більше 120.
SELECT PR.DAT_PROD, PR.TOVAR, (PR.KILK * T.CINA) AS VART
FROM PRODAZH PR, TOVARY T
WHERE (PR.TOVAR = T.TOVAR) AND ((PR.KILK * T.CINA) > 120)
ORDER BY PR.DAT_PROD
Використання діапазонів (BETWEEN)
Приклад. Видати зведення про всі відпустки товару, де кількість відпущеного товару (у одиницях) лежить в діапазоні 1000..3000.
SELECT *
FROM PRODAZH
WHERE KILK BETWEEN 1000 AND 3000
Використання списку значень (IN)
Приклад. Видати зведення про всі продажі товару, де кількість відпущеного товару (у одиницях) рівна або 100, або 1000, або 3000.
SELECT *
FROM PRODAZH
WHERE KILK IN (100, 1000, 3000)
Використання підрядків (STARTING)
Приклад. Видати всі товари, що починаються з букви "С".
SELECT *
FROM TOVARY
WHERE TOVAR STARTING WITH "C"