Статті - наочне пояснення принципу об'єднання таблиць в mysql

При розробці веб-проектів за участю бази даних нам часто необхідно в запитах об'єднувати таблиці бази, щоб отримати необхідні дані.

Попередження: в статті в умови об'єднання таблиць використовується як ON, так і USING, для різноманітності. Нагадую, що якщо стовпці, по яким відбувається об'єднання, мають однакові імена, то необхідно використовувати USING ( `імя_столбца`), в іншому випадку використовується ON` TableA`.`імя_столбца_із_TableA` = `TableB`.`імя_столбца_із_TableB`

Отже, припустимо, що у нас є два столи. Стіл А (TableA) зліва, а стіл Б (TableB) праворуч. Ми заселимо кожен чотирма персонажами, імена яких можуть бути присутніми на обох столах.

Суть цієї конструкції в тому, що база сама вибирає, по яких стовпчиках порівнювати та об'єднувати таблиці. А вибір цей падає на стовпці з однаковими іменами. В цьому криється засада mdash база може вибрати абсолютно не ті стовпчики для об'єднання і запит буде працювати зовсім по-іншому, як ви припускали.

SELECT * FROM `TableA`

NATURAL JOIN `TableB`


В цьому випадку СУБД вибирає для об'єднання таблиць стовпчики id і name, так як вони присутні в обох таблицях і перетворює вихідний запит в запит наступного виду:

SELECT * FROM `TableA`

INNER JOIN `TableB`


Але так як у нас немає записів з однаковим id і name одночасно в обох таблицях, то запит поверне порожній результат.

Якщо ж зробити керуючої ліву таблицю і змінити запит:

SELECT `TableA`. *,` TableB`. * FROM `TableA`

NATURAL LEFT JOIN `TableB`


Такий запит наводиться СУБД до наступного:

SELECT `TableA`. *,` TableB`. * FROM `TableA`

LEFT JOIN `TableB`


Те результат буде таким:

Таким чином, база сама вибирає по яких стовпчиках і яким способом об'єднувати таблиці. З одного боку це дуже зручно, з іншого - несе плутанину: де гарантія того, що стовпці з однаковими іменами в таблицях будуть саме ключовими і призначені для об'єднання? NATURAL JOIN погіршує Новомосковскемость коду, так як розробник не зможе за запитом визначити, як об'єднуються таблиці. Тому, звертаючи увагу на такі фактори, NATURAL JOIN використовувати не рекомендується.

STRAIGHT JOIN виконує ті ж функції, що і звичайний INNER JOIN, за винятком того, що ліва таблиця Новомосковскется раніше правою.

SELECT * FROM `TableA`

STRAIGHT JOIN `TableB` USING (` name`)

SELECT * FROM `TableB`

STRAIGHT JOIN `TableA` USING (` name`)

Якщо при об'єднанні таблиць не вказати умову об'єднання через ON або USING, то база зробить так звану Декартову вибірку, коли значенню однієї таблиці прирівнюється кожне значення іншої. Таким чином, СУБД, в нашому випадку, повертає 4x4 = 16 рядків.

SELECT * FROM `TableA`

P.S. поправочка: ID записів можуть збігатися, тоді.

Схожі статті