Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Авт_ПМП / Tema_SQL.doc
Скачиваний:
10
Добавлен:
05.02.2016
Размер:
462.34 Кб
Скачать

Ключові слова exists I not exists

Ключові слова EXISTS i NOT EXIST використовуються лише з підзапитами. Результатом їх виконання є логічне значення “ІСТИНА” або “ХИБНЕ”. Для ключовогослова EXISTS результат дорівнює “ІСТИНА” в тому і лише в тому випадку, коли результуюча таблиця підзапиту містить хоча б один рядок. Якщо результуюча таблиця підзапиту пуста, результат обробки ключового слова EXISTS буде рівним “ХИБНЕ”. Для кючового слова NOT EXISTS використовуються правила обробки, протилежні по відношенню до ключового слова EXISTS. Поскільки по ключсовим словам перевіряється лише наявність рядків результуючої таблиці, ця таблиця може містити довільне число як рядків так і стовпчиків. Приклад використання ключового слова NOT EXISTS наведено вище

SELECT *

FROM Vidomist a

WHERE NOT EXISTS

(SELECT *

FROM Osoba

WHERE a.kod=b.kod)

Наведений запит поверне ті рядки з таблиці Vidomist, які не відповідають жодному рядку з таблиці Osoba, тобто є такими, що порушують цілісність посилань. Отже, якщо цей запит поверне пусту таблицю, цілісність посилань не порушена.

Комбінування результуючих таблиць

(операції UNION, INTERSECT і EXCEPT)

В мові SQL можна використовувати звичні операції над множинами – об’єднання (UNION), перетин (INTERSECT) і різницю (difference), які дозволяють комбінувати результати виконання двох або більше запитів в єдину результуючу таблицю. На таблиці, до яких застосовують теоретико-множинні операції, накладаються певні обмеження. А саме:

  • таблиці повинні мати однакову кількість стовпчиків;

  • типи i-го стовпчика обох таблиць мають бути однаковими;

  • значення відповідних стовчиків обох табллиць належать одному й тому ж домену.

Наведемо приклад використання операції UNION. Потрібно сформувати відомість нарахованої зарплати за лютий місяць 2002 року з обовязковим включенням до списку всіх працівників незалежно від того нараховували їм зарплату чи ні. Відповідний запит матиме вид:

SELECT a.priz AS Прізвище, b.D AS [Нарахована сума]

FROM Osoba a, Vidomist b

WHERE a.kod=b.kod AND b.year=2002 AND b.mounth=2

UNION

SELECT priz,NULL

FROM Osoba

WHERE NOT kod IN(SELECT kod

FROM Osoba a, Vidomist b

WHERE a.kod=b.kod AND b.year=2002 AND b.mounth=2)

Перший оператор SELECT (до UNION) сформує список працівників, яким у лютому 2002 року нарахували зарплату, а другий оператор SELECT (після UNION) сформує список працівників, яким не нарахували зарплату у лютому 2002 року.

Результуюча таблиця матиме вид:

Прізвище

Нарахована сума

Іванов

400

Петров

500

Сидоров

600

Петренко

Поновлення бази даних.

Мова SQL є повнофункціональною мовою маніпулювання даними, яка може використовуватись не лише для виборок даних з бази, але і для внесення змін у базу даних. Оператори модифікації інформації в базі даних не настільки складні як оператор SELECT. Є три оператори модифікації даних в базі. Це

  • INSERT – використовується для вставки нових даних у таблицю

  • UPDATE - використовується для модифікації вже існуючої в таблиці інформації

  • DELETE - використовується для видалення з таблиці рядку(ів) даних.

Вставка нових даних.

Існує дві форми оператора INSERT. Перша використовується для вставки єдиного рядка в таблицю. Ця форма має такий формат:

INSERT INTO table_name [(column_list)]

VALUES (data_value_list)

Тут параметр table_name (Ім’я таблиці) означає або ім’я таблиці або ім’я представлення. Параметр column_list (Список стовпчиків) є списком імен одного або більше стовпчиків розділених комами. Параметр column_list не є обов’язковим. Якщо він відсутній, вважається, що використовується список всіх стовпчиків таблиці, причому імена стовпчиків розташовані в тому ж порядку в якому вони були задані в операторі CREATE TABLE (створення таблиці).

Якщо в операторі INSERT вказується конкретний список імен стовпчиків, то любі пропущені в ньому стовпчики повинні допускати значення NULL.

Параметр data_value_list (список значень) повинен наступним чином відповідати параметру column_list:

  • кількість елементів в обох списках повинна бути однакова;

  • повинна бути пряма відповідність між позиціями одного і того ж елементу в обох списках, тобто перший елемент списку data_value_list відповідає першому елементу списку column_list, другий елемент списку data_value_list відповідає другому елементу списку column_list і т.д.

  • типи даних елементів списку data_value_list повинні бути сумісними з типами даних відповідних стовпчиків з column_list.

Приклад використання конструкції INSERT…VALUES. Оператор:

INSERT INTO Osoba

VALUES(4,’Мельник’)

всталяє новий рядок в таблицю Osoba, в якому стовпчик kod приймає значення 4, а стовпчик priz – Мельник.

Якщо потрібно вставити новий рядок в таблицю з використанням лише деяких стовпчиків, потрібно в круглих дужках перерахувати через кому імена відповідних стовпчиків (параметр column_list). Наприклад, в table_a потрібно додати рядок, в якому kod=4, suma=245, а data невизначена. Оператор INSERT матиме вид:

INSERT INTO table_a (kod,suma)

VALUES(4,245)

Друга форма оператора INSERT дозволяє скопіювати множину рядків однієї таблиці в іншу. Цей оператор має такий формат:

INSERT INTO table_name [(column_list)]

SELECT …

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

Наведемо приклад. Нехай нам потрібно формувати баланс по закупкам товарів за певний період і зберігати в новій таблиці balans. Таблиця balans має два стовпчики – kod - код товару і suma - загальна сума вартості цього товару.

Оператор INSERT, який поповнює таблицю balans сумарними даними з table_a за період з 1.1.2002 по 31.1.2002 року, матиме вид:

INSERT INTO balans(kod,suma)

SELECT kod, SUM(suma)

FROM table_a

WHERE data>=#1/1/2002# AND data<=#31/1/2002#

GROUP BY kod

ORDER BY kod

Результатом виконання цього оператора є таблиця balans:

kod

suma

1

195

2

150

Нижче наведено приклад застосування другої форми оператора INSERT, який поповнює таблицю Vidomist даними з тієї ж таблиці Vidomist. Припустімо, що в 3-му місяці зарплату кожного співробітника збільшили рівно в 1.2 рази по відношенню до зарплати в 2-му місяці. Відповідний оператор INSERT матиме вид:

INSERT INTO Vidomist (kod,year,mounth,D)

SELECT kod, year,3,D*1.2

FROM Vidomist

WHERE mounth=2

Після виконання цього оператора таблиця Vidomist матиме вид:

kod

year

mounth

D

1

2002

1

367.78

2

2002

1

1309.55

3

2002

1

2709.98

1

2002

2

400

2

2002

2

500

3

2002

2

600

1

2002

3

480

2

2002

3

600

3

2002

3

720

Соседние файлы в папке Авт_ПМП