- •Тема 5. Запити на мові sql
- •Діалекти sql
- •Типи даних в sql
- •Прості запити на мові sql
- •Проекція в sql
- •Порівняння рядків
- •Значення дати і часу в sql
- •Значення null і операції з ним
- •Значення unknown і операції з ним
- •Запити до декількох відношень Декартів добуток і з’єднання відношень у sql
- •Розрізнення одноіменних атрибутів кількох відношень
- •Змінні кортежів та псевдоніми відношень
- •Об’єднання запитів
- •Мова sql. Підзапити та вирази з’єднання Підзапити
- •Підзапити для обчислення скалярних значень
- •Умови рівня відношення
- •Умови рівня кортежу
- •Корельовані підзапити
- •Підзапити в реченнях from
- •Вирази з’єднання в sql
- •Перехресне з’єднання
- •Тета-з’єднання
- •Натуральне з’єднання
- •Зовнішнє тета-з’єднання
- •З’єднання у діалектах Jet sql та Transact sql
- •Приклад правого зовнішнього з’єднання для Oracle:
Корельовані підзапити
У простих випадках підзапит виконується один раз, повертає константу, і результат використовується у „зовнішніх” запитах. У більш складних випадках підзапит має виконуватись багатократно, по одному разу для кожного значення, отриманого підзапитом ззовні. Такі підзапити називають корельовані (correlated subquery).
Приклад 5.9. Нехай треба знайти кінофільми, назви яких повторюються два рази і більше, а роки випуску різні (оскільки атрибути title, year становлять ключ). БД представлена схемою
Повний текст запиту:
Рис.5.18. Запит з корельованим підзапитом
Підзапит (рядки 4-6) шукає значення року випуску фільму з заданою назвою, хоча ця назва невідома (підзапит схожий на функцію з параметром).
По мірі проглядання кортежів Movie у процесі обробки зовнішнього запиту (рядки 1-3) кожний з них надає значення Old.title для використання у вкладеному запиті з метою обчислення умови WHERE (рядки 3-6).
Умова в рядку 3 виконується, допоки зміст компонента year змінної кортежу old не дорівнює максимальному з років фільмів з одною назвою. Тому при виконанні „основного” запиту буде повернуто копій певної назви, на одиницю менше загальної кількості фільмів з такою назвою: назва, використана двічі, буде повернута один раз; тричі – два рази і т.д.
У підзапиті є атрибути двох видів:
Або атрибут належить до одної зі змінних кортежу підзапиту (title),
Або атрибут належить до запиту вищого рівня (old.title). Для звернення до нього введений псевдонім відношення (змінна кортежу) old.
Підзапити в реченнях from
У цьому випадку текст підзапиту у круглих дужках поміщається у список імен відношень речення FROM. Оскільки підсумкове відношення підзапиту не має імені, треба надати йому псевдонім. Тоді можна посилатись на його атрибути як на атрибути інших відношень зі списку FROM.
Приклад 5.10. Повернімося до прикладу 5.2: з якими продюсерами співпрацював актор ‘Harrison Ford’?
Реляційна схема БД наступна:
Нехай є запит, який повертає сертифікаційні номери всіх цих продюсерів. Пов’язавши це відношення з відношенням MovieExec, визначимо імена продюсерів.
Рис.5.19. Запит з підзапитом у реченні FROM
Підзапит повертає відношення Prod з сертифікаційними номерами продюсерів, які співробітничали з актором ‘Harrison Ford’. Умова рівності сертифікаційних номерів (рядок 8) з’єднує відношення MovieExec та Prod. Увесь запит повертає множину значень атрибуту Name відношення MovieExec, яким відповідають значення producerC# відношення Prod.
Вирази з’єднання в sql
SQL дозволяє використовувати різні варіанти оператора з’єднання (join) двох відношень для створення нових відношень:
Український термін |
Англійський термін |
Відповідник у реляційній алгебрі |
Декартів добуток |
Cartesian product |
|
Натуральне з’єднання |
natural join |
|
Тета-з’єднання |
theta-join |
|
Зовнішнє з’єднання |
outerjoin |
|
Оператори можуть використовуватись як у самостійних запитах, так і в підзапитах.
