- •Тема 5. Запити на мові sql
- •Діалекти sql
- •Типи даних в sql
- •Прості запити на мові sql
- •Проекція в sql
- •Порівняння рядків
- •Значення дати і часу в sql
- •Значення null і операції з ним
- •Значення unknown і операції з ним
- •Запити до декількох відношень Декартів добуток і з’єднання відношень у sql
- •Розрізнення одноіменних атрибутів кількох відношень
- •Змінні кортежів та псевдоніми відношень
- •Об’єднання запитів
- •Мова sql. Підзапити та вирази з’єднання Підзапити
- •Підзапити для обчислення скалярних значень
- •Умови рівня відношення
- •Умови рівня кортежу
- •Корельовані підзапити
- •Підзапити в реченнях from
- •Вирази з’єднання в sql
- •Перехресне з’єднання
- •Тета-з’єднання
- •Натуральне з’єднання
- •Зовнішнє тета-з’єднання
- •З’єднання у діалектах Jet sql та Transact sql
- •Приклад правого зовнішнього з’єднання для Oracle:
Перехресне з’єднання
Це найпростіша форма з’єднання. Наприклад, для отримання декартового добутку двох відношень
можна написати
і результатом буде відношення з дев’ятьма атрибутами – усі можливі пари кортежів Movie та StarsIn. З тим же результатом можна написати
Movie, StarsIn
Тета-з’єднання
Перехресне з’єднання в чистому вигляді використовується рідко. Ширше застосовується тета-з’єднання
R JOIN S ON C
Сенс цієї конструкції: обчислення декартового добутку та після цього застосування відбору по критерію C, заданому після ON.
Приклад 5.11. Нехай треба з’єднати відношення
при умові, що злиттю підлягають лише кортежі, які посилаються на один і той же фільм. Тобто вони повинні мати однакові значення компонентів
Title = movieTitle
Та year = movieYear.
Речення FROM запиту має вигляд:
Результат – також відношення з дев’ятьма атрибутами з початковими іменами. Кожний кортеж Movie з’єднується з деякими кортежами StarsIn, але лише з тими, де співпадають значення назви і року виробництва. В підсумку 2 стовпця будуть зайвими, оскільки містять однакові значення. Для уникнення цього слід вираз з’єднання помістити у речення FROM, а у речення WHERE – бажані атрибути.
Натуральне з’єднання
Нехай треба розібратись, хто з акторів є одночасно продюсерами або президентами студій. Треба проаналізувати відношення
Відношення з’єднуються по атрибутах з однаковими іменами. Результат матиме вигляд:
R(name, address, gender, birthDate, cert#, netWorth).
Для його отримання треба виконати запит
SELECT * FROM MovieStar NATURAL JOIN MovieExec
На жаль, ні в Jet SQL, ні у Transact SQL нема цього оператора. Реалізація такого запиту існуючими засобами Jet SQL:
SELECT MovieStar.name AS name, MovieStar.address AS address, gender, birthDate, cert#, netWorth
FROM MovieStar INNER JOIN MovieExec
ON MovieStar.name=MovieExec.name AND MovieStar.address=MovieExec.address
Зовнішнє тета-з’єднання
Оператори зовнішнього з’єднання, які ми розглядали як операції реляційної алгебри, призначені для поповнення підсумкового відношення інформацією висячих кортежів (dangling tuples). При з’єднанні деякі кортежі одного з відношень R залишаються „висячими”, якщо умова відповідності в реченні ON не виконується для жодного кортежу з другого відношення S.
Розглянемо операцію зовншнього тета-з’єднання (theta-outerjoin). Нехай знову (приклад 5.5) треба з’єднати відношення
при умові співпадання назви і року випуску фільму.
Запит на повне зовнішнє з’єднання:
SELECT title, year, starName
FROM Movie FULL OUTER JOIN StarsIn ON title=movieTitle AND year=movieYear
У результат будуть уключені:
Кортежі Movie для фільмів за участі акторів, згаданих у StarsIn;
Висячі кортежі Movie для фільмів, відсутніх у StarsIn;
Висячі кортежі StarsIn для акторів, що не знімались у фільмах, перелічених у Movie.
Запит на ліве зовнішнє з’єднання:
SELECT title, year, starName
FROM Movie LEFT OUTER JOIN StarsIn ON title=movieTitle AND year=movieYear
У результат будуть уключені:
Кортежі Movie для фільмів за участі акторів, згаданих у StarsIn;
Висячі кортежі Movie для фільмів, відсутніх у StarsIn.
Висячі кортежіStarsInдля акторів, що не знімались у фільмах, перелічених уMovie.
Запит на праве зовнішнє з’єднання:
SELECT title, year, starName
FROM Movie RIGHT OUTER JOIN StarsIn ON title=movieTitle AND year=movieYear
У результат будуть уключені:
Кортежі Movie для фільмів за участі акторів, згаданих у StarsIn;
Висячі кортежіMovieдля фільмів, відсутніх уStarsIn;Висячі кортежі StarsIn для акторів, що не знімались у фільмах, перелічених у Movie.
