Новини високих технологій
» » Left join (SQL) - приклад, докладний опис, помилки використання

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

12-05-2017, 12:37
1 394
В будь-якій реальній реляційній базі даних вся інформація розподіляється за окремими таблицями. Багато з таблиць мають зафіксовані в схемі встановлені зв'язки один з одним. Однак з допомогою запитів 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) – опис

Ліве з'єднання має наступний синтаксис:

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 - типові помилки використання: правильність запиту при завданні умов Відбору

Друга проблема пов'язана з втратою даних, причому не завжди відразу очевидною. Повернемося до запиту, коли ми з допомогою лівого з'єднання отримали дані по всім людям і наявною у них нерухомості. Згадайте наступний із застосуванням 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 простий приклад, пояснення яким одне – перед тим як приступити до складання навіть елементарного запиту, необхідно ретельно розібратися, що саме ми хочемо отримати в результаті. Удачі!
Цікаво по темі
Intel GMA 3600: ідеальний графічний контролер для нетбуків
Intel GMA 3600: ідеальний графічний контролер для нетбуків
Відеоконтролер моделі Intel GMA 3600 має досить скромне швидкодію, і основна його сфера застосування – це низькопродуктивні нетбуки. У подібних
SQL distinct: опис, приклади, властивості
SQL distinct: опис, приклади, властивості
Найчастіше при використанні SQL для вибірки інформації з таблиць, користувач отримує надлишкові дані, які полягають в наявності абсолютно ідентичних
Оператор SQL INNER JOIN: приклади, синтаксис і особливості
Оператор SQL INNER JOIN: приклади, синтаксис і особливості
Розробка будь-якої бази даних передбачає не тільки створення і наповнення таблиць різноманітною інформацією, але і подальшу роботу з даними. Для
MySQL JOIN: опис, приклад використання команди і рекомендації
MySQL JOIN: опис, приклад використання команди і рекомендації
Розробка баз даних інтернет-ресурсів практично ні в чому не відрізняється від стандартних баз даних, розроблених у системі MS SQL SERVER. Як правило,
SQL Where: способи застосування та приклади
SQL Where: способи застосування та приклади
Для вибору даних з бази використовується конструкція Select[набор данних]from[имя таблици]. Як показує досвід, в 80 % випадків використання запитів
MySQL select select from: оператор вибірки
MySQL select select from: оператор вибірки
MySQL - одна з найпопулярніших систем управління базами даних (СУБД). У даній статті ми розглянемо базову функціональність оператора вибірки SELECT,