Left join (SQL) - приклад, докладний опис, помилки використання

126 0 Новини високих технологій

В будь-якій реальній реляційній базі даних вся інформація розподіляється за окремими таблицями. Багато з таблиць мають зафіксовані в схемі встановлені зв'язки один з одним. Однак з допомогою запитів Sql цілком реально прокласти зв'язок між даними, що не закладену в схемі. Це здійснюється шляхом виконання операції з'єднання join, яка дозволяє вибудувати відносини між будь-якою кількістю таблиць і з'єднати навіть, здавалося б, розрізнені дані. В даній статті піде мова конкретно про лівому зовнішньому з'єднанні. Перш ніж приступити до опису даного типу з'єднання, додамо в базу даних, деякі таблиці.

Підготовка необхідних таблиць

Припустимо, у нашій базі даних є інформація про людей і їх нерухоме майно. Основна інформація ґрунтується на трьох таблицях: Peoples (люди), Realty (нерухомість), Realty_peoples (таблиця з відносинами, кому з людей яка нерухомість належить). Припустимо, в таблицях зберігаються наступні дані по людям:




Peoples



id



L_name



F_name



Middle_name



Birthday



1



Іванова



Дарина



Борисівна



16072000



2



Пугін



Владислав



Миколайович



29011986



3



Евгеньин



Олександр



Федорович



30041964



4



Аннина



Любов



Павлівна



31121989



5



Герасимовская



Надія



Павлівна



14031992



6



Герасимовський



Олег



Альбертович



29011985



7



Сухановский



Юрій



Андрійович



25091976



8



Сухановская



Юлія



Юріївна



01102001

По нерухомості:

Realty



id



address



1



р. Архангельськ, вул. Вороніна, д. 7 кв. 6



2



р. Архангельськ, вул. Северодвинск, д. 84 кв. 9 кімн. 5



3



Архангельська область, р. Северодвинск, вул. Леніна, д. 134 кв. 85



4



Архангельська область, р. Новодвинск, вул. Пролетарська, д. 16 кв. 137



5



р. Архангельськ, пл. Терьохіна, д. 89 кв. 13

По відносинам люди - нерухомість:

Realty_peoples



id_peoples



id_realty



type



7



3



Загальна спільна власність



8



3



Загальна спільна власність



3



5



Власність



7



1



Власність



5



4



Спільна часткова власність



6



4



Спільна часткова власність

Left join (Sql) – опис

Left join (SQL) - приклад, докладний опис, помилки використання
Ліве з'єднання має наступний синтаксис:

Table_A LEFT JOIN table_B[{ON предикат} | {USING список_столбцов}]

І схематично виглядає так:
Left join (SQL) - приклад, докладний опис, помилки використання
І перекладається цей вираз як «Вибрати всі без винятку рядка з таблиці, А таблиці В вивести тільки співпадаючі по предикату рядка. Якщо в таблиці не знайшлося пари для рядків таблиці А, то заповнити результуючі стовпці Null - значення».


Найчастіше при виконанні лівого з'єднання вказується ON USING використовують, лише коли назви стовпців, за якими планується виконати з'єднання, збігаються.

Left join - приклади використання

З допомогою лівого з'єднання ми можемо подивитися, чи у всіх людей зі списку Peoples є нерухомість. Для цього виконаємо наступний в left join приклад sql запиту:

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples;

І отримаємо наступний результат:

Запрос1



id



L_name



F_name



Middle_name



Birthday



id_realty



type



1



Іванова



Дарина



Борисівна



16072000











2



Пугін



Владислав



Миколайович



29011986











3



Евгеньин



Олександр



Федорович



30041964



5



Власність



4



Аннина



Любов



Павлівна



31121989











5



Герасимовская



Надія



Павлівна



14031992



4



Спільна часткова власність



6



Герасимовський



Олег



Альбертович



29011985



4



Спільна часткова власність



7



Сухановский



Юрій



Андрійович



25091976



1



Власність



7



Сухановский



Юрій



Андрійович



25091976



3



Загальна спільна власність



8



Сухановская



Юлія



Юріївна



01102001



3



Загальна спільна власність

Як бачимо, у Іванової Дар'ї, Пугина Владислава і Анниній Любові немає зареєстрованих прав на нерухомість. А що б ми отримали, використовуючи внутрішнє з'єднання Inner join? Як відомо, воно виключає неспівпадаючі рядка, тому три людини з нашої підсумкової вибірки просто випали:

Запрос1



id



L_name



F_name



Middle_name



Birthday



id_realty



type



3



Евгеньин



Олександр



Федорович



30041964



5



Власність



5



Герасимовская



Надія



Павлівна



14031992



4



Спільна часткова власність



6



Герасимовський



Олег



Альбертович



29011985



4



Спільна часткова власність



7



Сухановский



Юрій



Андрійович



25091976



1



Власність



7



Сухановский



Юрій



Андрійович



25091976



3



Загальна спільна власність



8



Сухановская



Юлія



Юріївна



01102001



3



Загальна спільна власність

Здавалося б, другий варіант так само відповідає умовам нашої задачі. Однак, якщо ми далі почнемо приєднувати ще і ще таблиці, три людини з результату вже безповоротно зникнуть. Тому на практиці при об'єднанні безлічі таблиць набагато частіше використовуються сполуки Left і Right, ніж Inner join.
Продовжимо розглядати з left join sql приклади. Приєднаємо таблицю з адресами наших об'єктів нерухомості:

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type, Realty.address FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples LEFT JOIN Realty ON Realty.id = Realty_peoples.id_realty

Тепер ми отримаємо не тільки вид права, але і адреси об'єктів нерухомості:

Запрос1



id



L_name



F_name



Middle_name



Birthday



id_realty



type



address



1



Іванова



Дарина



Борисівна



16072000















2



Пугін



Владислав



Миколайович



29011986















3



Евгеньин



Олександр



Федорович



30041964



5



Власність



р. Архангельськ, пл. Терьохіна, д. 89 кв. 13



4



Аннина



Любов



Павлівна



31121989















5



Герасимовская



Надія



Павлівна



14031992



4



Спільна часткова власність



Архангельська область, р. Новодвинск, вул. Пролетарська, д. 16 кв. 137



6



Герасимовський



Олег



Альбертович



29011985



4



Спільна часткова власність



Архангельська область, р. Новодвинск, вул. Пролетарська, д. 16 кв. 137



7



Сухановский



Юрій



Андрійович



25091976



3



Загальна спільна власність



Архангельська область, р. Северодвинск, вул. Леніна, д. 134 кв. 85



7



Сухановский



Юрій



Андрійович



25091976



1



Власність



р. Архангельськ, вул. Вороніна, д. 7 кв. 6



8



Сухановская



Юлія



Юріївна



01102001



3



Загальна спільна власність



Архангельська область, р. Северодвинск, вул. Леніна, д. 134 кв. 85

Left join - типові помилки використання: неправильний порядок таблиць

Основних помилок, що допускаються при лівому зовнішньому з'єднанні таблиць, дві:
  • Невірно обраний порядок таблиць, з-за якого були втрачені дані.
  • Помилки при використанні Where в запиті з об'єднаними таблицями.
  • Розглянемо першу помилку. Перед рішенням завдання варто чітко розуміти, що саме ми хочемо отримати в підсумку. У розглянутому вище прикладі ми вивели всіх до єдиного людей, але абсолютно втратили відомості про об'єкт під номером 2 у якого власника не знайшлося.
    Якщо б ми переставили таблиці в запиті місцями, і почали б з « From Realty left join Peoples» то ні одну нерухомість ми б не втратили, чого не скажеш про людей.
    Left join (SQL) - приклад, докладний опис, помилки використання
    Однак не варто, злякавшись лівого з'єднання, переходити на повне зовнішнє, яке включить в результаті і збігаються, і не збігаються рядки. Адже обсяг вибірок часто дуже великий, і зайві дані реально ні до чого. Головне - розібратися, що ви хочете в результаті отримати: всіх людей зі списком наявних у них нерухомості, або список всієї нерухомості з їх власниками (якщо є).

    Left join - типові помилки використання: правильність запиту при завданні умов Відбору

    Друга проблема пов'язана з втратою даних, причому не завжди відразу очевидною. Повернемося до запиту, коли ми з допомогою лівого з'єднання отримали дані по всім людям і наявною у них нерухомості. Згадайте наступний із застосуванням left join sql приклад:

    FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples;

    Припустимо, ми хочемо уточнити запит і не виводити дані, де тип права – «Власність». Якщо ми просто допишемо, застосовуючи left join sql, приклад наступним умовою:

    Where type <> "Власність"

    то втратимо дані по людям, у яких немає ніякої нерухомості, адже порожнє значення Null не порівнюється таким чином:

    Запрос1



    id



    L_name



    F_name



    Middle_name



    Birthday



    id_realty



    type



    5



    Герасимовская



    Надія



    Павлівна



    14031992



    4



    Спільна часткова власність



    6



    Герасимовський



    Олег



    Альбертович



    29011985



    4



    Спільна часткова власність



    7



    Сухановский



    Юрій



    Андрійович



    25091976



    3



    Загальна спільна власність



    8



    Сухановская



    Юлія



    Юріївна



    01102001



    3



    Загальна спільна власність

    Щоб попередити появу помилок з цієї причини, краще всього задати умову відбору відразу при з'єднанні. Пропонуємо розглянути наступний з left join sql приклад.

    SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type FROM Peoples LEFT JOIN Realty_peoples ON (Peoples.id = Realty_peoples.id_peoples AND type <> "Власність")

    Результат буде наступним:

    Запрос1



    id



    L_name



    F_name



    Middle_name



    Birthday



    id_realty



    type



    1



    Іванова



    Дарина



    Борисівна



    16072000











    2



    Пугін



    Владислав



    Миколайович



    29011986











    3



    Евгеньин



    Олександр



    Федорович



    30041964











    4



    Аннина



    Любов



    Павлівна



    31121989











    5



    Герасимовская



    Надія



    Павлівна



    14031992



    4



    Спільна часткова власність



    6



    Герасимовський



    Олег



    Альбертович



    29011985



    4



    Спільна часткова власність



    7



    Сухановский



    Юрій



    Андрійович



    25091976



    3



    Загальна спільна власність



    8



    Сухановская



    Юлія



    Юріївна



    01102001



    3



    Загальна спільна власність

    Таким чином, виконавши простий з left join sql приклад, ми отримали список всіх людей, вивівши додатково, у кого з них нерухомість в частковій/спільної власності.
    Left join (SQL) - приклад, докладний опис, помилки використання
    В якості висновку хотілося б ще раз підкреслити, що до вибірки інформації з бази даних потрібно поставитися відповідально. Багато нюансів відкрив перед нами із застосуванням left join sql простий приклад, пояснення яким одне – перед тим як приступити до складання навіть елементарного запиту, необхідно ретельно розібратися, що саме ми хочемо отримати в результаті. Удачі!