- •Тема 5. Запити на мові sql
- •Діалекти sql
- •Типи даних в sql
- •Прості запити на мові sql
- •Проекція в sql
- •Порівняння рядків
- •Значення дати і часу в sql
- •Значення null і операції з ним
- •Значення unknown і операції з ним
- •Запити до декількох відношень Декартів добуток і з’єднання відношень у sql
- •Розрізнення одноіменних атрибутів кількох відношень
- •Змінні кортежів та псевдоніми відношень
- •Об’єднання запитів
- •Мова sql. Підзапити та вирази з’єднання Підзапити
- •Підзапити для обчислення скалярних значень
- •Умови рівня відношення
- •Умови рівня кортежу
- •Корельовані підзапити
- •Підзапити в реченнях from
- •Вирази з’єднання в sql
- •Перехресне з’єднання
- •Тета-з’єднання
- •Натуральне з’єднання
- •Зовнішнє тета-з’єднання
- •З’єднання у діалектах Jet sql та Transact sql
- •Приклад правого зовнішнього з’єднання для Oracle:
Запити до декількох відношень Декартів добуток і з’єднання відношень у sql
Нехай необхідно визначити ім’я продюсера фільму “Star Wars” з двох відношень бази фільмів:
producerC# i cert# - сертифікаційний № продюсера, семантика цих атрибутів однакова.
В SQL ми виконуємо пошук за один етап, адресуючи відношення Movie та MovieExec одночасно:
У разі відсутності речення WHERE ми отримуємо Декартів добуток відношень.
Пари Декартового добутку відбираються в результат, якщо компонент title відношення Movies містить значення ‘Star Wars’, а компонент producerC# - число, що співпадає з cert# у MovieExec. Останньому відповідає значення атрибуту name ‘George Lukas’. Результат запиту – один рядок ‘George Lukas’.
Розрізнення одноіменних атрибутів кількох відношень
Якщо з’єднуються відношення з одноіменними атрибутами, для таких атрибутів використовуються „повні” імена атрибутів, у яких є префікс – ім’я відношення, після нього крапка. Приклад: нехай є 2 відношення
Нехай треба знайти інформацію про акторів та керівників індустрії кіно, які мають однакові адреси. Для цього складемо запит:
Його результат:
Конструкцію „повного” імені атрибута можна застосовувати і в разі якщо нема співпадання імен відношень.
Змінні кортежів та псевдоніми відношень
Інколи виникає необхідність з’єднання кількох кортежів одного відношення. SQL дозволяє надати кожному екземпляру імені відношення R у реченні FROM унікального псевдоніму (alias), або змінної кортежу (tuple variable). Ім’я відношення та псевдонім розділяються необов’язквим службовим словом AS.
Якщо псевдонім визначений у реченні FROM, він може бути використаний замість імені відношення в інших реченнях запиту, як-от SELECT, WHERE, для звернення до (в т.ч.одноіменних) атрибутів.
Приклад 5.6. Нехай треба відшукати інформацію про двох акторів, що мають одну адресу.
Речення FROM містить визначення двох псевдонімів, Star1 та Star2.
Без умови Star1.name < Star2.name, псевдоніми Star1 та Star2 могли би вказувати на той самий кортеж.
Якщо замість оператора < (або >) застосувати <>, це тягне відбір узаємно „зворотніх” пар, як-от
.
Об’єднання запитів
Нехай треба відібрати назви і дати випуску фільмів, які згадуються в будь-якому з відношень
БД фільмів.
SELECT title, year FROM Movie
UNION
(SELECT movieTitle AS title, movieYear AS year FROM StarsIn)
Movie
Рис. 5.14. Об’єднання запитів
При об’єднанні ми просто дописуємо друге відношення в кінець першого. Оскільки імена атрибутів не співпадають, вони перейменовуються примусово. Взагалі схеми об’єднуваних відношень мають співпадати. Але в Transact SQL за основу береться перше відношення, і треба лише, щоби кількість і порядок полів співпадали та їхні типи були сумісні.
UNION залишає лише один з однакових кортежів (створює множину кортежів), UNION ALL залишає дублікати (створює мультімножину).
Кількість UNION в одному реченні не обмежується, але десь біля 7 штук можуть викликати аварійне повідомлення (особливо в Access): „Надто складний запит”.
На жаль, оператори EXCEPT та INTERSECT не вдалось задіяти в Transact SQL, хоча вони згадуються в переліку ключових слів.
