поиск:
Полезные ссылки

  • Форум по MySQL

  • Статьи по MySQL

  • Вопросы по MySQL

  • MySQL.com


  • Базы данных

  • MySQL

  • PostgreSQL


  • PHP конференция 2005
    Подробности!

    6.4.1.1. Синтаксис оператора JOIN

    MySQL поддерживает следующий синтаксис оператора JOIN при использовании в командах SELECT:

    table_reference, table_reference
    table_reference [CROSS] JOIN table_reference
    table_reference INNER JOIN table_reference join_condition
    table_reference STRAIGHT_JOIN table_reference
    table_reference LEFT [OUTER] JOIN table_reference join_condition
    table_reference LEFT [OUTER] JOIN table_reference
    table_reference NATURAL [LEFT [OUTER]] JOIN table_reference
    { OJ table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
    table_reference RIGHT [OUTER] JOIN table_reference join_condition
    table_reference RIGHT [OUTER] JOIN table_reference
    table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference
    

    где table_reference определено, как:

    table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
    

    и join_condition определено, как:

    ON conditional_expr |
    USING (column_list)
    

    В большинстве случаев не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов (из этого правила есть исключения). Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.

    Необходимо учитывать, что в версиях до 3.23.17 оператор INNER JOIN не принимает параметр join_condition!

    Наличие последней из приведенных выше конструкций выражения LEFT OUTER JOIN обусловлено только требованиями совместимости с ODBC:

    • Вместо ссылки на таблицу может использоваться псевдоним, который присваивается при помощи выражений tbl_name AS alias_name или tbl_name alias_name:

      mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
              WHERE t1.name = t2.name;
      
    • Условный оператор ON представляет собой условие в любой форме из числа тех, которые можно использовать в выражении WHERE.

    • Если запись для правой таблицы в частях ON или USING в LEFT JOIN не найдена, то для данной таблицы используется строка, в которой все столбцы установлены в NULL. Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице:

      mysql> SELECT table1.* FROM table1
              LEFT JOIN table2 ON table1.id=table2.id
              WHERE table2.id IS NULL;
      

      Этот пример находит все строки в таблице table1 с величиной id, которая не присутствует в таблице table2 (т.е. все строки в table1, для которых нет соответствующих строк в table2). Конечно, это предполагает, что table2.id объявлен как NOT NULL. See Раздел 5.2.6, «Как MySQL оптимизирует LEFT JOIN и RIGHT JOIN».

    • USING (column_list) служит для указания списка столбцов, которые должны существовать в обеих таблицах. Такое выражение USING, как:

      A LEFT JOIN B USING (C1,C2,C3,...)
      

      семантически идентично выражению ON, например:

      A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
      
    • Выражение NATURAL [LEFT] JOIN для двух таблиц определяется так, чтобы оно являлось семантическим эквивалентом INNER JOIN или LEFT JOIN с выражением USING, в котором указаны все столбцы, имеющиеся в обеих таблицах.

    • INNER JOIN и , (запятая) являются семантическими эквивалентами. Оба осуществляют полное объединение используемых таблиц. Способ связывания таблиц обычно задается в условии WHERE.

    • RIGHT JOIN работает аналогично LEFT JOIN. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN.

    • STRAIGHT_JOIN идентично JOIN, за исключением того, что левая таблица всегда читается раньше правой. Это выражение может использоваться для тех (немногих) случаев, когда оптимизатор объединения располагает таблицы в неправильном порядке.

    • Начиная с версии MySQL 3.23.12, можно давать MySQL указания о том, какой индекс должен использоваться при извлечении информации из таблицы. Эта возможность полезна, если оператор EXPLAIN показывает, что MySQL из всех возможных индексов использует ошибочный. Задавая значение индекса в USE INDEX (key_list), можно заставить MySQL применять для поиска записи только один из возможных индексов. Альтернативное выражение IGNORE INDEX (key_list) запрещает использование в MySQL данного конкретного индекса. Выражения USE/IGNORE KEY являются синонимами для USE/IGNORE INDEX.

      В MySQL 4.0.9 можно также указывать FORCE INDEX. Это работает также, как и USE INDEX (key_list) но в дополнение дает понять серверу что полное сканирование таблицы будет ОЧЕНЬ дорогостоящей операцией. Другими словами, в этом случае сканирование таблицы будет использовано только тогда, когда не будет найдено другого способа использовать один из данных индексов для поиска записей в таблице.

    Несколько примеров:

    mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id;
    mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
    mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id);
    mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
           LEFT JOIN table3 ON table2.id=table3.id;
    mysql> SELECT * FROM table1 USE INDEX (key1,key2)
           WHERE key1=1 AND key2=2 AND key3=3;
    mysql> SELECT * FROM table1 IGNORE INDEX (key3)
           WHERE key1=1 AND key2=2 AND key3=3;
    

    See Раздел 5.2.6, «Как MySQL оптимизирует LEFT JOIN и RIGHT JOIN».

     
    © 1997-2005 PHP Club Team
    Rambler's Top100