Программирование >>  Программный интерфейс приложений 

1 ... 60 61 62 [ 63 ] 64 65 66 ... 264


Тривиальное объединение

Самым простым типом объединения является тривиальное объединение, в котором задействована только одна таблица В этом случае строки выбираются из одной таблицы, указанной в предложении FROM.

SELECT

FROM tl


Некоторые авторы не считают это объединение объединением вообще и применяют это понятие к выборкам из двух и более таблиц. Я считаю это частным случаем.

Полное объединение

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

SELECT tl.*, t2.* FROM tl, t2

1 ll

i cl

1 i2

1 1

1 3

1 2

1 2

1 b

1 2

1 3

1 с

1 2

1 1

1 a

1 3

1 2

1 3

1 3

1 с

1 3

1 1

1 a

1 4

1 2

1 4

1 3

1 с

1 4 -+-

Полное объединение называют еще и перекрестным объединением. Здесь каждая строка одной таблицы объединяется с каждой строкой другой таблицы, создавая тем самым все возможные комбинации строк обеих таблиц. Есть еще одно название - декартово произведение. Такое объединение создает огромное количество строк, потому что результирующее количество строк будет произведением количества строк каждой таблицы, задействованной в объединении. Например, полное объединение трех таблиц, содержащих соответственно 100, 200 и 300 строк, в результате возвращает 100x200x300 = 6 миллионов строк. Несмотря на то, что размеры исходных таблиц невелики, мы получим очень много строк. В таких случаях для уменьщения количества строк до приемлемого количества можно воспользоваться предложением where.



При добавлении условия в предложении where, требующем соответствия определенных значений определенных столбцов из двух таблиц, мы получим объединение типа equi-jom (объединение по равенству).

select tl.*, t2.* from tl, t2 where tl.ll = t2.l2

+-+-+-+-+

I 11 I cl I 12 I c2 I +-+-+-+-+

2 I b I 2 I с I

3 1c I 3 I b I -+-+-+-+

Типы объединений join, CR0SS J0IN и INNER J0IN эквивалентны оператору объединения , .

Объединение STRAIGHT J0IN аналогично полному объединению, но при этом таблицы объединяются в порядке, указанном в предложении from. Оптимизатор СУБД MySQL при объединении таблиц сортирует их в абсолютно произвольном порядке для того, чтобы строки выбирались как можно быстрее. Оптимизатор может ошибиться. Это устранимо с

помощью ключевого слова STRAIGHT J0IN.

Слово STRAIGHT J0IN может быть указано в операторе select в двух местах. Его можно указать между словом select и списком выбираемых столбцов, или в предложении from. Первый способ окажет глобальное воздействие на все объединения в операторе SELECT:

select straight join ... from tablel, table2, table3 ...

select... from tablel straight join table2 stpaight join table3 ...

: Квалификация ссылок на столбцы

i Все ссылки на столбцы в операторе select должны быть однозначно со-<; отнесены с таблицами, указанными в предложении from Когда в предложении from указана одна таблица, неоднозначность исключена Когда в пред-;j ложении from указано несколько таблиц, но рассматриваемый столбец есть Ij только в одной таблице, неоднозначность также невозможна Но когда в пред-ложении from указано несколько таблиц и рассматриваемый столбец присут- ствует сразу в нескольких таблицах, столбец должен быть квалифицирован Щ только полностью с применением синтаксиса tbl name. col name Это одно-Is значно определит, какой таблице принадлежит указанный столбец Пусть таб-J лица my tbll содержит столбцы а и Ь, а таблица my tbl2 - b и с Ссылки ( на столбцы а и с будут однозначными, а ссылки на b должны быть полно-L стью квалифицированы my tbll .Ь или my tbl2 .Ь

SELECT а, my tbll.b, my tbl2.b, с FR0Mmy tbll, my tbl2 ...

L в некоторых ситуациях для удаления неоднозначности квалификатора

имени таблицы будет недостаточно Такая ситуация возникает тогда, когда

таблица используется в запросе несколько раз В таком случае для полной

I квалификации столбца может понадобиться псевдоним Присвоим псевдо-

Р нимы всем экземплярам таблицы, задействованным в данном запросе Те-

к перь ссылка на столбцы таблиц будет иметь вид alias name. col name

W Предлагаю вашему вниманию запрос, объединивший в себе два экземпляра



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

SELECT my tbl.coll, m.col2 FROM my tbl, my tbl AS m WHERRE my tbl.coll > m.coll

Левое объединение

Полное объединение отображает только те строки, значения которых по критерию выборки полностью совпадают. Левое объединение действует аналогичным образом плюс строки в левой таблице, которые не удовлетворяют критерию выборки. Все столбцы из правой таблицы отображаются пустыми значениями. Это объединение работает следующим образом: строки обеих таблиц выбираются в случае, если критерии выборки совпадают, если критерии выборки не совпадают, строка левой таблицы выбирается, а правой присваиваются пустые значения. Другими словами, оператор выборки с левым объединением выбирает все строки левой таблицы, независимо от того, совпадают критерии выборки или нет. Проверка критериев осуществляется в предложениях ON или USING (). Предложение ON используется независимо от того, имеют или нет столбцы, по которым производится объединение, одинаковое имя.

SELECT tl.*, t2.* FROM tl LEFT JOIN t2 ON tl.ll = t2.l2

1 11

-+--

1 l2

1--+

c2 1

1

---1-

1 1

1 NULL

NULL 1

1 2

1 2

С 1

1 3

1 3

b 1 1--+

Предложение USING () аналогично предложению ON, но имена столбцов, по которым производится объединение, должны совпадать полностью:

SELECT ray tbll.*, ray tbl2.* FROM ray tbll LEFT JOIN my tbll2 USING(b)

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

SELECT tl.*, t2.* FROM tl LEFT JOIN t2 ON tl.ll = t2.i2 WHERE t2.l2 IS NULL

1 ll

1 i2

1 1

1 NULL

NULL



1 ... 60 61 62 [ 63 ] 64 65 66 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика