Фев 242010
 

Конструкции INNER JOIN, LEFT JOIN, RIGHT JOIN используются часто, а вопросов вызывают много, особенно у начинающих.
В этой статье попробуем раскрыть особенности применения конструкций Join.
Операторы соединения входят в состав стандарт SQL92. Основные и наиболее употребляемые конструкции объединения поддерживаются всеми серьезными СУБД (типа Oracle, MySQL и т.д.).
Примеры будем рассматривать на 2х таблицах:
tables.png

NOTE: в данном примере для наглядности используются русские названия таблиц и полей. На реальной базе лучше использовать латиницу.

Конструкции Join:

Общий синтаксис:

SELECT FIELD [,... n]
FROM MainTable
{INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN JoinTable ON <conditions>
  1. CROSS JOIN — перекрестное объединение, выводятся все комбинации строк. Данная конструкция, по причине своей не нужности, почти нигде не поддерживается.
    Если нужен cross join, используют SELECT по таблицам.

    Результат аналогичен следующему SQL запросу:

    SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
    FROM Работники, Роли;

    Результат отработки запроса:
    crossjoin.png

  2. INNER JOIN — внутреннее соединение. Объединяет две таблицы, где каждая строка обоих таблиц в точности соответствует условию. Если для строки одной таблицы не найдено соответствия в другой таблице, строка не включается в набор.
    Пример запроса:

    SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
    FROM Работники INNER JOIN Роли ON Работники.КодРолиРаботника=Роли.КодРоли;

    Аналог запроса:

    SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
    FROM Работники, Роли WHERE Работники.КодРолиРаботника=Роли.КодРоли;

    Результата запроса:
    innerjoin.png

  3. OUTER JOIN — внешнее объединение
    1. LEFT OUTER JOIN или LEFT JOIN-левое внешнее объединения. Выбираются все записи первой (левой) таблицы, даже если они не соответствуют записям во второй (правой) таблице.
      Пример запроса:

      SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
      FROM Работники LEFT JOIN Роли ON Работники.КодРолиРаботника=Роли.КодРоли;

      Результат запроса:
      leftjoin.png

    2. RIGHT OUTER JOIN или RIGHT JOIN- правое внешнее объединение. Выбираются все записи второй (правой) таблицы, даже если они не соответствуют записям в первой (левой) таблице.
      Пример запроса:

      SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
      FROM Работники RIGHT JOIN Роли ON Работники.КодРолиРаботника=Роли.КодРоли;



      Результат запроса:
      rightjoin.png


      На практике RIGHT JOIN довольно редко используется, так как его можно заменить на LEFT JOIN, поменяв таблицы местами:

      SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
      FROM Роли LEFT JOIN Работники ON Работники.КодРолиРаботника=Роли.КодРоли;
    3. FULL OUTER JOIN — комбинация правого и левого объединений. Показывает строки из обеих таблиц: при наличии соответствий — объединенные, в противном случае — с NULL значениями в столбцах из другой таблицы. Поддерживается не всеми СУБД.
      Пример запроса:

      SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
      FROM Работники FULL OUTER JOIN Роли ON Работники.КодРолиРаботника=Роли.КодРоли

      Аналог запроса:

      SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
      FROM Работники RIGHT OUTER JOIN Роли ON Работники.КодРолиРаботника=Роли.КодРоли
      UNION
      SELECT Работники.ФамилияРаботника, Роли.НазваниеРоли
      FROM Работники LEFT OUTER JOIN Роли ON Работники.КодРолиРаботника=Роли.КодРоли

      Результат выполнения запроса:
      fulljoin.png

FacebookOdnoklassnikiVKTwitterBlogger PostGoogle BookmarksMail.RuLiveJournalBookmark/FavoritesEmailPrintShare
 Posted by at 16:48  Tagged with:

  4 комментария to “INNER JOIN, LEFT JOIN, RIGHT JOIN и другие”

  1. Спасибо, доступно.

  2. avatar

    «Данная конструкция, по причине своей не нужности, почти нигде не поддерживается.»

    Не верю! В каких конкретно СУБД она не поддерживается? В MySQL она не поддерживается? В MS Jet она не поддерживается? В MS SQL Server не поддерживается?

  3. В Sybase не поддерживается, в MS Access вроде тоже. Но вы правы, я погорячилась насчет «почти нигде не поддерживается». Где-то поддерживается, где-то нет. Большого смысла использовать это конструкцию я лично не вижу, если только в доках по СУБД явно не указано, что есть какие-то особенности при обработке именно CROSS JOIN, которые можно было бы использовать себе на пользу.

 Leave a Reply

Reload Image
Enter Code*:

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>