Довідка - по - sql (dml) використання в запиті декількох таблиць

Перейменування також потрібно, якщо в реченні FROM використовується підзапит. Так, перший приклад можна переписати таким чином:

SELECT DISTINCT PC.model, maker
FROM PC,
(SELECT maker, model
FROM Product) AS prod
WHERE PC.model = prod.model AND price <600;

Зверніть увагу, що в цьому випадку в інших пропозиціях оператора SELECT вже не можна використовувати кваліфікатор Product. оскільки таблиця Product вже не використовується. Замість нього використовується псевдонім prod. Крім того, посилатися тепер можна тільки на ті поля таблиці Product. які перераховані в підзапиті.

У реченні FROM може бути вказана явна операція з'єднання двох і більш таблиць. Серед ряду операцій з'єднання, описаних у стандарті мови SQL, багатьма серверами баз даних підтримується лише операція з'єднання по предикату. Синтаксис з'єднання по предикату має вигляд:

З'єднання може бути або внутрішнім (INNER), або одним з зовнішніх (OUTER). Службові слова INNER і OUTER можна опускати, оскільки зовнішнє з'єднання однозначно визначається його типом - LEFT (ліве), RIGHT (праве) або FULL (повне), а просто JOIN означатиме внутрішнє з'єднання.

Предикат визначає умова з'єднання рядків з різних таблиць. При цьому INNER JOIN означає, що в результуючий набір потраплять тільки ті сполуки рядків двох таблиць, для яких значення предиката одно TRUE. Як правило, предикат визначає еквісоедіненія по зовнішньому і первинного ключів з'єднуються таблиць, хоча це не обов'язково.

Приклад. Знайти виробника, номер моделі і ціну кожного комп'ютера, наявного в базі даних:

SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product INNER JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;


В даному прикладі в результуючому наборі будуть з'єднуватися тільки ті рядки з таблиць PC і Product. у яких збігаються номери моделей.
Для контролю в результат включений як номер моделі з таблиці PC. так і з таблиці Product:

Оскільки моделей 2111 і 2112 з таблиці Product немає в таблиці PC. в полях з таблиці PC міститься NULL.
З'єднання RIGHT JOIN назад з'єднанню LEFT JOIN. тобто в результуючий набір потраплять всі рядки з другої таблиці, які будуть з'єднуватися тільки з тими рядками з першої таблиці, для яких виконується умова з'єднання. У нашому випадку ліве з'єднання

Product LEFT JOIN PC ON PC.model = Product.model

буде еквівалентно правому з'єднанню

PC RIGHT JOIN Product ON PC.model = Product.model

SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product RIGHT JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;


дасть ті ж результати, що і внутрішнє з'єднання, оскільки в правій таблиці (PC) немає таких моделей, які були відсутні б в лівій таблиці (Product), що цілком природно для типу зв'язку "один-ко-многим", яка є між таблицями PC і Product. Нарешті, при повному з'єднанні (FULL JOIN) в результуючу таблицю потраплять не тільки ті рядки, які мають однакові значення в зіставляються шпальтах, але і всі інші рядки вихідних таблиць, які не мають відповідних значень в іншій таблиці. У цих рядках всі стовпці тій таблиці, в якій не було знайдено відповідності, заповнюються NULL-значеннями. Повний з'єднання являє собою комбінацію лівого і правого зовнішніх з'єднань.
Так запит для таблиць A і B, наведених на початку глави,

SELECT A. *, B. *
FROM A FULL JOIN B
ON A.a = B.c;


дасть наступний результат:

Схожі статті