Запити, що використовують з'єднання ⇐ ПредыдущаяСтр 4 из 4
Декартів добуток таблиць З'єднання - це підмножини декартова добутку. Тому що декартів добуток n таблиць - це таблиця, що містить усі можливі рядки r, такі, що r є зчепленням якого-небудь рядка з першої таблиці, рядка з другої таблиці, ... і рядка з n-й таблиці (а ми вже навчилися виділяти за допомогою SELECT будь-яка підмножина реляційної таблиці), те залишилося лише з'ясувати, чи можна за допомогою SELECT одержати декартів добуток. Для одержання декартова добутку кількох таблиць треба указати у фразі FROM перелік таблиць, що перемножуються, а у фразі SELECT v усі їхні стовпці. Так, для одержання декартова добутку Вид_блюд і Трапези треба видати запит SELECT Вигляд_блюд.*, Трапези.* FROM Вигляд_блюд, Трапези; Еквіз'єднання таблиць Якщо з декартова добутку забрати непотрібні рядки і стовпці, то можна одержати актуальні таблиці, що відповідають кожному з з'єднань. Очевидно, що добір актуальних рядків забезпечується введенням у запит WHERE фрази, у якій установлюється відповідність між: · кодами трапез (Т) у таблицях Меню і Трапези (Меню.Т = Трапези.Т), · кодами видів блюд (У) у таблицях Меню і Вид_блюд (Меню.У = Вид_блюд.В), · номерами блюд (БЛ) у таблицях Меню і Блюда (Меню.БЛ = Блюда.БЛ). Такий скоректований запит буде мати вид: SELECT Меню.*, Трапези.*, Вид_блюд.*, Блюда.* FROM Меню, Трапези, Вид_блюд, Блюда WHERE Меню.Т = Трапези.Т AND Меню.У = Вид_блюд.В AND Меню.БЛ = Блюда.БЛ; Природне з'єднання таблиць У эквисоединение таблиць увійдуть дублікати стовпців, по яких проводилося з'єднання (Т, В и БЛ). Для виключення цих дублікатів можна створити природне з'єднання тих же таблиць: SELECT Т, У, БЛ, Трапеза, Вид, Блюдо, Основа, Вихід, Праця FROM Меню, Трапези, Вид_блюд, Блюда WHERE Меню.Т = Трапези.Т AND Меню.У = Вид_блюд.В AND Меню.БЛ = Блюда.БЛ; Композиція таблиць Для виключення всіх стовпців, по яких проводиться з'єднання таблиць, треба створити композицію SELECT Трапеза, Вид, Блюдо, Основа, Вихід, Праця FROM Меню, Трапези, Вид_блюд, Блюда WHERE Меню.Т = Трапези.Т AND Меню.У = Вид_блюд.В AND Меню.БЛ = Блюда.БЛ;
З'єднання таблиць з додатковою умовою При формуванні з'єднання створюється робоча таблиця, до якої застосовні всі розглянуті операції: добір потрібних рядків з'єднання (WHERE фраза), упорядкування одержуваного результату (ORDER BY фраза) і агрегатування даних (SQL-функції і GROUP BY фраза). Наприклад, для одержання переліку блюд, пропонованих у меню на сніданок, можна сформувати запит на основі композиції: SELECT Вид, Блюдо, Основа, Вихід, 'Номер -', БЛ FROM Меню, Трапези, Вид_блюд, Блюда WHERE Меню.Т = Трапези.Т AND Меню.У = Вид_блюд.В AND Меню.БЛ = Блюда.БЛ AND Трапеза = 'Сніданок';
З'єднання таблиці зі своєю копією. Використання імен кореляції (аліасів, псевдонімів) У ряді додатків виникає необхідність одночасної обробки даних якої-небудь таблиці й однієї чи кількох її копій, створюваних на час виконання запиту. Наприклад, при створенні списків студентів (таблиця Студенти) можливий повторне введення даних про якого-небудь студента з присвоєнням йому другого номера залікової книжки. Для виявлення таких помилок можна з'єднати таблицю Студенти з її тимчасовою копією, установивши в WHERE фразі рівність значень всіх однойменних стовпців цих таблиць крім стовпців з номером залікової книжки (для останніх треба установити умову нерівності значень). Тимчасову копію таблиці можна сформувати, вказавши ім'я псевдоніма за ім'ям таблиці у фразі FROM. Так, за допомогою фрази FROM Блюда X, Блюда Y, Блюда Z будуть сформовані три копії таблиці Блюда з іменами X, Y і Z. Тобто. доводиться виконувати запити, у яких таблиця з'єднується сама із собою, чи одна таблиця з'єднується двічі з іншою таблицею. При цьому використовуються імена кореляції (аліаси, псевдоніми), що дозволяють розрізняти копії таблиць, що з'єднуються. Імена кореляції вводяться в розділі FROM і йдуть через пробіл після імені таблиці. Імена кореляції повинні використовуватися як префікс перед іменем стовпця і відокремлюються від імені стовпця крапкою. Якщо в запиті вказуються ті самі поля з різних екземплярів однієї таблиці, вони повинні бути перейменовані для усунення неоднозначності в іменуваннях стовпчиків результуючої таблиці. Визначення імені кореляції діє тільки під час виконання запиту. Як приклад з'єднання таблиці з нею самої сформуємо запит на вивід таких пар блюд таблиці Блюда, у яких збігається основа, а назва першого блюда пари менше (за алфавітом), чим номер другого блюда пари. Для цього можна створити запит з однією копією таблиці Блюда (Копія): SELECT Блюдо, Копія.Блюдо, Основа FROM Блюда, Блюда Копія WHERE Основа = Копія.Основа AND Блюдо < Копія.Блюдо; чи двома її копіями (Перша і Друга): SELECT Перша.Блюдо, Друга.Блюдо, Основа FROM Блюда Перша, Блюда Друга WHERE Перша.Основа = Друга.Основа AND Перша.Блюдо < Друга.Блюдо; Приклад. Відібрати усі пари постачальників таким чином, щоб перший постачальник у парі мав статус, більша статусу другого постачальника: SELECT P1.PNAME AS PNAME1, P1.PSTATUS AS PSTATUS1, P2.PNAME AS PNAME2, P2.PSTATUS AS PSTATUS2 FROM P P1, P P2 WHERE P1.PSTATUS1 > P2.PSTATUS2; В результаті одержимо наступну таблицю:
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|