Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
conspect.pdf
Скачиваний:
374
Добавлен:
17.03.2016
Размер:
27.86 Mб
Скачать

Базы данных

БГУИР, ПОИТ

 

 

6.4.6. Условия объединения и дополнительные условия

Сейчас мы рассмотрим подробнее ON, USING и WHERE (HAVING).

ON и USINNG используются для обозначения условий объединения (т.е. перечисляют поля, который нужно сравнивать между собой, причём в ON можно указывать разноимённые поля, а в USING указываются только поля, имеющие одинаковые имена в обеих таблицах).

WHERE (HAVING) используются для сокращения количества записей, попадающих в финальную выборку.

Ещё раз, графически :

Стр: 195/248

Базы данных

 

 

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

Пример:

показать

все

компьютеры,

стоящие

в

комнате

‘RoomWithTwoComps’.

 

 

 

 

 

Запрос

Результат

С использованием USING ситуация аналогичная, но для применения USING нужно, чтобы в таблицах были одноимённые поля. Это мы увидим чуть позже.

Стр: 196/248

Базы данных

БГУИР, ПОИТ

 

 

6.4.7. Все виды JOIN в примерах

Сейчас мы рассмотрим, как ведут себя все возможные варианты JOIN в MySQL. Для проверки будем использовать уже знакомые нам таблицы `rooms` и `computers`. Только `computers` переименуем в `comps` и сделаем внешний ключ одноимённым первичному родительской таблицы (`r_id`), чтобы можно было использовать USING.

Таблица `rooms`

Таблица `comps`

 

 

Первая группа эквивалентных запросов

Результат: полный набор всех возможных комбинаций записей двух таблиц (фактически, ответ на вопрос «как можно разместить компьютеры по комнатам»).

SELECT * FROM `rooms` JOIN `comps` SELECT * FROM `rooms` FULL JOIN `comps` SELECT * FROM `rooms`, `comps`

SELECT * FROM `rooms` INNER JOIN `comps` SELECT * FROM `rooms` CROSS JOIN `comps`

В руководстве по MySQL 5.x этого нет (было раньше), но (пока?) работает.

Вот, как это выглядит…

Запрос

 

SELECT * FROM `rooms` JOIN `comps`

 

 

 

 

 

Результат

 

 

 

 

 

 

 

Обратите внимание: в результирующей выборке два одноимённых поля (`r_id`). Этого можно избежать, если вместо «SELECT *» указывать конкретные имена полей, и одноимённые «переименовывать» через AS.

Стр: 197/248

Необходимо указывать условие объединения!

Базы данных

БГУИР, ПОИТ

 

 

Лирическое отступление

Запросы вида

SELECT * FROM `table1`, `table2`, … , `tableN`

очень удобно использовать для быстрого получения всех возможных комбинаций множества значений, например, в автоматизированном тестировании.

Достаточно создать под каждый параметр свою таблицу, занести туда все интересующие нас значения, а потом «проджойнить» получившиеся таблицы.

Вторая группа эквивалентных запросов

Результат: список комнат, в которых стоят компьютеры (что можно понимать и как «список компьютеров, которые стоят в комнатах»). Главное – сюда НЕ попадут пустые комнаты и «бесхозные» компьютеры.

SELECT * FROM `rooms` JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` FULL JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` INNER JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` CROSS JOIN `comps` USING (`r_id`)

SELECT * FROM `rooms` , `comps` USING (`r_id`)

USING нельзя использовать с «,»

Вот, как это выглядит…

Запрос

 

SELECT * FROM `rooms` JOIN `comps` USING (`r_id`)

 

 

 

 

 

Результат

 

 

 

 

 

 

 

В этом примере поле `r_id` не дублируется.

Третья группа эквивалентных запросов

Результат: список ВСЕХ комнат: в которых стоят компьютеры (с указанием компьютеров) и пустых (NULL вместо компьютера). Компьютеры, не поставленные в комнату, в этот результат не попадают.

SELECT * FROM `rooms` LEFT JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` LEFT OUTER JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` LEFT JOIN `r_id`

SELECT * FROM `rooms` LEFT OUTER JOIN `r_id`

Стр: 198/248

Необходимо указывать условие объединения!

Базы данных БГУИР, ПОИТ

Вот, как это выглядит…

Запрос

 

SELECT * FROM `rooms` LEFT JOIN `comps` USING (`r_id`)

 

 

 

 

 

Результат

 

 

 

 

 

 

 

Четвёртая группа эквивалентных запросов

Результат: список ВСЕХ компьютеров: которые стоят в комнатах (с указанием комнат) и «бесхозных» (NULL вместо комнаты). Комнаты, в которых нет компьютеров, в этот результат не попадают.

SELECT * FROM `rooms` RIGHT JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` RIGHT OUTER JOIN `comps` USING (`r_id`) SELECT * FROM `rooms` RIGHT JOIN `r_id`

SELECT * FROM `rooms` RIGHT OUTER JOIN `r_id`

Вот, как это выглядит…

Запрос

 

SELECT * FROM `rooms` RIGHT JOIN `comps` USING (`r_id`)

 

 

 

 

 

Результат

 

 

 

 

 

 

 

Стр: 199/248

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]