Блог программатора

Our partner
Главная | Последние правки | Поиcк | Все страницы | Редактор | Админ | Печать

Операторы Inner Join и Outer (left, right, full) Join в SQL (Oracle)

Ключевое слово join в SQL используется при построении select выражений. Инструкция Join позволяет объединить колонки из нескольких таблиц в одну. Объединение происходит временное и целостность таблиц не нарушается. Существует три типа join-выражений:

  • inner join;
  • outer join;
  • cross 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.2007

Full 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


Радио «Анонимус» 
Реклама java
Wed, 30 Jun 2010 13:56:00 -0400
Копипаста: История программных революций от Microsoft
Mon, 14 Jun 2010 04:19:00 -0400
Как восстановить grub2 и mbr
Thu, 10 Jun 2010 17:33:00 -0400
Установить/сменить пароль администратора на свежем postgresql'е
Sun, 23 May 2010 18:18:00 -0400
Президент Виктор Янукович получил по морде венком
Tue, 18 May 2010 09:31:00 -0400
Наконец-то ! Контакт с инопланетянами !
Thu, 18 Mar 2010 08:01:00 -0400
Панкота: группа Флiт
Sat, 13 Mar 2010 08:11:00 -0500

Blog

Add bookmark:
Bookmark and Share



© Komenda Viacheslav
Запрещается перепечатка материалов, без письменного разрешения автора.

Последнее обновление: Thu, 20 Aug 2009 13:34:02 -0400