Блог программатора |
||||||||
| Главная | Последние правки | Поиcк | Все страницы | Редактор | Админ | Печать | ||||||||
Операторы Inner Join и Outer (left, right, full) Join в SQL (Oracle)Ключевое слово join в SQL используется при построении select выражений. Инструкция Join позволяет объединить колонки из нескольких таблиц в одну. Объединение происходит временное и целостность таблиц не нарушается. Существует три типа join-выражений:
В свою очередь, outer join может быть left, right и full (слово outer обычно опускается). В качестве примера (DBMS Oracle) создадим две простые таблицы и сконструируем для них SQL-выражения с использованием join. В первой таблице будет хранится ID пользователя и его nick-name, а во второй - ID ресурса, имя ресурса и ID пользователя, который может этот ресурс администрировать. create table t_users ( t_id number(11, 0), t_nick varchar(16), primary key (t_id) ) create table t_resources ( t_id number(11, 0), t_name varchar(16), t_userid number (11, 0), primary key (t_id) ) Содержимое таблиц пусть будет таким: T_ID T_NICK 1 user1 3 user3 4 user4 T_ID T_NAME T_USERID 1 res1 3 2 res2 1 3 res3 2 5 res5 3 Конструкция join выглядит так: ... join_type join table_name on condition … Где join_type - тип join-выражения, table_name - имя таблицы, которая присоединяется к результату, condition - условие объединения таблиц. Кострукция join располагается сразу после select-выражения. Можно использовать несколько таких конструкций подряд для объединения соответствующего кол-ва таблиц. Логичнее всего использовать join в том случае, когда таблица имеет внешний ключ (foreign key). Inner join необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. Пример: select t_resources.t_name, t_users.t_nick from t_resources inner join t_users on t_users.t_id = t_resources.t_userid Результат будет таким: T_NAME T_NICK res2 user1 res1 user3 res5 user3 В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. Пример: select t_resources.t_name, t_users.t_nick from t_resources left join t_users on t_users.t_id = t_resources.t_userid Результат выполнения запроса: T_NAME T_NICK res1 user3 res2 user1 res3 (null) res5 user3 Результат показывает все ресурсы и их администраторов, вне зависимотсти от того есть они или нет. Right join отображает все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице: select t_resources.t_name, t_users.t_nick from t_resources right join t_users on t_users.t_id = t_resources.t_userid А результат будет следующим: T_NAME T_NICK res2 user1 res1 user3 res5 user3 (null) user4 Результирующая таблица показывает ресурсы и их администраторов. Если адмнистратор не задействован, эта запись тоже будет отображена. Такое может случиться, например, если ресурс был удален. Добавлено 08.03.2007Full outer join (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join.select t_resources.t_name, t_users.t_nick from t_resources full join t_users on t_users.t_id = t_resources.t_userid А результат будет таким: T_NAME T_NICK res1 user3 res2 user1 res3 (null) res5 user3 (null) user4 Некоторые СУБД не поддерживают такую функциональность (например, MySQL), в таких случаях обычно используют объединение двух запросов: select t_resources.t_name, t_users.t_nick from t_resources left join t_users on t_users.t_id = t_resources.t_userid union select t_resources.t_name, t_users.t_nick from t_resources right join t_users on t_users.t_id = t_resources.t_userid Наконец, cross join. Этот тип join еще называют декартовым произведением (на английском - cartesian product). Настоятельно рекомендую использовать его с умом, так как время выполнения запроса с увеличением числа таблиц и строк в них растет по экспоненте. Вот пример запроса, который аналогичен cross join: select t_resources.t_name, t_users.t_nick from t_resources, t_users Конструкция Join (в сочетании с другими SQL конструкциями, например, group by) часто встречается при программировании под базы данных. Думаю, эта статья будет вам полезна. Ссылки:КоментарииОтслеживать новые комментарии![]() Прокоментируйте эту статью! |
Главная Софт Хард Политеги SimpleWiki ![]() Почта ![]() Мой номер ICQ 456824974 ![]() Архив: 01.2010 02.2010 03.2010 04.2010 05.2010 06.2010 07.2010 Радио «Анонимус» ![]()
Blog ![]() Add bookmark: |
|||||||
|
© Komenda Viacheslav |
||||||||