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

Ключові слова any I all

Ключові слова ANY i ALL використовуються лише з підзапитами, які повертають один стовпчик чисел. Якщо перед підзапитом стоятиме ключове слово ALL, умова зрівняння вважається істинною, якщо вона виконується для всіх значень в результуючому стовпчику підзапиту. Наприклад, запит

SELECT *

FROM Vidomist

WHERE D> ALL (SELECT D FROM Vidomist WHERE kod IN (1,2))

Результат наведено нижче

kod

Year

mounth

D

3

2002

1

2709.98

В даному конкретному випадку внутрішній запит

SELECT D FROM Vidomist WHERE kod IN (1,2)

відбере такі значення: {367.78,1309.55,400,500}.

Очевидно, умова D> ALL (SELECT D FROM Vidomist WHERE kod IN (1,2))

еквівалентна умові D> (SELECT MAX(D) FROM Vidomist WHERE kod IN (1,2)).

Власне кажучи, цей запит еквівалентний запиту (дасть той же результат)

SELECT *

FROM Vidomist

WHERE D> (SELECT MAX(D) FROM Vidomist WHERE kod IN (1,2))

Якщо перед підзапитом стоятиме ключове слово ANY, умова зрівняння вважається істинною, якщо вона виконується хоча б для одного значення в результуючому стовпчику підзапиту. Наприклад, умова

D> ANY(SELECT D FROM Vidomist WHERE kod IN (1,2))

істинна тоді і тільки тоді коли вона істинна хоча б для одного значення, яке відбере внутрішній запит. Отже, любе D, яке більше 400, задовольнить нашій умові.

Результатом запиту

SELECT *

FROM Vidomist

WHERE D> ANY (SELECT D FROM Vidomist WHERE kod IN (1,2))

буде таблиця:

kod

Year

mounth

D

1

2002

1

367.78

2

2002

1

1309.55

3

2002

1

2709.98

2

2002

2

500

3

2002

2

600

Очевидно, цей запит буде еквівалентний запиту

SELECT *

FROM Vidomist

WHERE D> (SELECT MIN(D) FROM Vidomist WHERE kod IN (1,2))

Ключові слова 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

Петренко

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