X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> JOIN и UNION, информация.
gaaarfild
gaaarfild
Topic Starter сообщение 8.12.2009, 13:17; Ответить: gaaarfild
Сообщение #1


Хотелось бы получить более доступную информацию по данным конструкциям.
Во всех мануалах написано сухо и очень недоступно.
Хотелось бы получить более доступно данную информацию.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 9.12.2009, 17:04; Ответить: ZiTosS
Сообщение #2


gaaarfild, ну попробуем-с....

JOIN
Оператор JOIN используется для объединения таблиц в запросах по определённому связывающему условию(признаку). В SQL-запросе данный оператор располагается между именами объединяемых таблиц после ключевого слова FROM. Ключевое слово JOIN имеет два синонима: CROSS JOIN и INNER JOIN.

Например у нас есть таблица АВТОМОБИЛИ (auto) с полями
(
id - уникальный номер(дескриптор) автомобиля
id_marka - идентификатор марки в таблице МАРКИ
id_owner - идентификатор владельца в таблице ВЛАДЕЛЬЦЫ
id_type - идентификатор типа автомобиля в таблице ТИПЫ
color - цвет автомобиля
description - описание автомобиля
)

Таблица МАРКИ (marks) с полями
(
id - уникальный номер(дескриптор) марки
marka - название марки
)

Таблица ВЛАДЕЛЬЦЫ (owners) с полями
(
id - уникальный номер(дескриптор) владельца
fio - ФИО владельца
passport - номер паспорта
и т.д. (нам не важно)
)

Таблица ТИПЫ (types) с полями
(
id - уникальный номер(дескриптор) типа
type - название типа
)

И мы хотим получить в запросе сразу все автомобили с ФИО владельца, типом автомобиля и марки автомобиля
Для этого мы будем в запросе использовать объединение таблиц с оператором JOIN
SELECT t1.id, t1.color, t1.description, t2.marka, t3.fio, t4.type FROM auto t1 JOIN marks t2 , owners t3, types t4 ON t1.id_marka=t2.id AND t1.id_owner=t3.id AND t1.id_type=t4.id

И в сформированной нашим запросом представлении(с которой мы работаем как с ресурсом) будут такие поля:

id - уникальный номер(дескриптор) автомобиля в таблице АВТОМОБИЛИ
color - цвет автомобиля в таблице АВТОМОБИЛИ
description - описание автомобиля в таблице АВТОМОБИЛИ
marka - название марки в таблице МАРКИ
fio - ФИО владельца в таблице ВЛАДЕЛЬЦЫ
type - название типа в таблице ТИПЫ

Замечание
Использование в запросах оператора JOIN идентично использования перекрёстных запросов, т.е. пример выше можно было бы переписать так:
SELECT t1.id, t1.color, t1.description, t2.marka, t3.fio, t4.type FROM auto t1, marks t2, owners t3, types t4 WHERE t1.id_marka=t2.id AND t1.id_owner=t3.id AND t1.id_type=t4.id

Мы просто убрали ключевое слово JOIN и заменили ON => WHERE

Тут надо понимать, что оператор JOIN и перекрестные запросы применяют тогда, когда нужно полное соответствие данных главной таблицы и связанных таблиц. То есть к примеру у нас есть связь 1=1(один к одному), что означает наличие 2 таблиц связанных по определённому полю так, что каждой записи "первой таблице" соответствует одна запись в "правой таблице". При запросе вышеуказанными способами из результирующей таблицы будут исключены записи не нашедшие соответствия друг с другом (например в одной номер присутствует, а в другой нет).

На самом деле вся прелесть оператора JOIN раскрывается в применении других вариантов связывания - LEFT JOIN и RIGHT JOIN

LEFT JOIN
Левое объединение (LEFT JOIN) позволяет включить в результирующую таблицу строки "левой" таблицы, которым не нашлось соответствия в "правой" таблице.
Рассмотрим пример:
У нас есть таблица ДАТЫ (dates) - "левая" с полями
(
id - уникальный номер(дескриптор) даты
id_holiday - номер праздника в таблице ПРАЗДНИКИ (если дата не содержит праздника, то данное поле NULL или 0)
date - дата
)

таблица ПРАЗДНИКИ (holidays) - "правая" с полями
(
id - уникальный номер(дескриптор) праздника
name - название праздника
)

И вот нам захотелось посмотреть список всех дат не зависимо есть ли праздник в этот день или нет, но если есть, то хотим вывести его название. Становится понятным что если мы будем использовать оператор JOIN, то в результирующую таблицу не попадут даты, в которых отсутствует праздник, а нам бы этого не хотелось. И тут к нам на помощь приходит оператор LEFT JOIN:
SELECT t1.id, t1.date, t2.name FROM dates t1 LEFT JOIN holidays t2 ON t1.id_holiday=t2.id

В результирующей таблице будут все даты и в каждой записи обязательно будет присутствовать поле name (название праздника), но в тех записях где MySQL не нашла соответствий из "правой таблицы", поле name будет иметь значение NULL

RIGHT JOIN
Правое объединение (RIGHT JOIN) позволяет включить в результирующую таблицу строки "правой" таблицы, которым не нашлось соответствия в "левой" таблице.
То есть обратное соответствие относительно LEFT JOIN. Пример рассматривать не буду. Примерно всё тоже самое.


UNION
Если формат результирующих таблиц (число, порядок следования и тип столбцов) совпадает, то возможно объединение результатов выполнения двух операторов SELECT в одну результирующую таблицу. Это достигается с использованием оператора UNION
Например у нас есть таблица ПОЛЬЗОВАТЕЛИ (users) с полями:
(
id_user - уникальный номер (дескриптор) пользователя
fio - ФИО пользователя
)

И в этой таблице имеются 3 записи:
1 | Пупкин ВВ
2 | Сидоров АС
3 | Петров МА

И нам захотелось удвоить записи в таблице, для этого мы выполним обычный запрос SELECT и добавим к нему в конец запрос SELECT с id_user сдвинутыми на текущее количество пользователей (у нас 3)
SELECT id_user, fio FROM users UNION
SELECT id_user + 3, fio FROM users

И в результирующей таблице мы получим:
1 | Пупкин ВВ
2 | Сидоров АС
3 | Петров МА
4 | Пупкин ВВ
5 | Сидоров АС
6 | Петров МА

Пример 2:
У нас есть 2 таблицы с идентичными по типу и следованию полями, но разные таблицы + разные имена полей. Мы хотим объединить эти 2 таблицы не прибегая к созданию двух результирующих таблиц:
SELECT * FROM table1 UNION
SELECT * FROM table2


Я думаю, стало яснее :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 24.1.2010, 0:50; Ответить: sc2r2bey
Сообщение #3


Визуальное объяснение различных MySQL JOIN
MySQL JOIN — это мощнейший инструмент. Но в силу своей интуитивной непонятности он немного пугает новичков, которые начинают городить трехэтажные запросы, когда все можно сделать намного изящнее. По ссылке приведено визуальное объяснение, как работают INNER JOIN, FULL OUTER JOIN, LEFT OUTER JOIN и т.д.

http://www.codinghorror.com/blog/archives/000976.html
не могу нпайти перевод этой статьи


--------------------
Заметки о разработке и не только
программирую web и для we


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 25.1.2010, 2:34; Ответить: ZiTosS
Сообщение #4


sc2r2bey, А зачем тебе, там же к каждому запросу - картинка. Переводить-то нечего.

P.s.: Дельный урок. Прям как диаграммы Эйлера :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 25.1.2010, 3:00; Ответить: sc2r2bey
Сообщение #5


я ж не себе а автору топика


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 25.1.2010, 3:23; Ответить: ZiTosS
Сообщение #6


sc2r2bey, я не думаю, что ТС будет сложно разобратьсмя с парой картинок и парой запросов. Там всё соотнесено. Причём ТС я знаю :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gaaarfild
gaaarfild
Topic Starter сообщение 25.1.2010, 4:17; Ответить: gaaarfild
Сообщение #7


Как всегда замечательное объяснение. Спасибо! =) Будем практиковать.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Join.Cash – монетизируем финансовый трафик. Бинарные опционы, Forex. СНГ и БУРЖ!
19 JoinCash 7629 22.2.2017, 13:41
автор: JoinCash
Открытая тема (нет новых ответов) Выплаты через Western Union
7 wep 3200 19.7.2010, 22:38
автор: wep


 



RSS Текстовая версия Сейчас: 26.4.2024, 8:19
Дизайн