loading..
Русский    English
20:08
листать

Явные операции соединения стр. 2

Пример 5.6.4

Привести все модели ПК, их производителей и цену:

Консоль
Выполнить
  1. SELECT maker, Product.model AS model_1, pc.model AS model_2, price
  2. FROM Product LEFT JOIN
  3. PC ON PC.model = Product.model
  4. WHERE type = 'pc'
  5. ORDER BY maker, PC.model;

Обратите внимание на то, что по сравнению с предыдущим примером пришлось использовать предложение WHERE для отбора только производителей ПК. В противном случае в результирующий набор попали бы также и модели портативных компьютеров, и принтеров. В рассмотренном ранее примере это условие было бы излишним, так как соединялись только те строки, у которых совпадали номера моделей, и одной из таблиц была таблица PC, содержащая только модели ПК. В результате выполнения запроса получим:

Maker model_1 model_2 price
A 1232 1232 600
A 1232 1232 400
A 1232 1232 350
A 1232 1232 350
A 1233 1233 600
A 1233 1233 950
A 1233 1233 980
B 1121 1121 850
B 1121 1121 850
B 1121 1121 850
E 2111 NULL NULL
E 2112 NULL NULL
E 1260 1260 350

Поскольку моделей 2111 и 2112 из таблицы Product нет в таблице PС, в столбцах из таблицы PС содержится NULL.

Соединение RIGHT JOIN обратно соединению LEFT JOIN, то есть в результирующий набор попадут все строки из второй таблицы, которые будут соединяться только с теми строками из первой таблицы, для которых выполняется условие соединения. В нашем случае левое соединение

  1. Product LEFT JOIN PC ON PC.model = Product.model

будет эквивалентно правому соединению

  1. PC RIGHT JOIN Product ON PC.model = Product.model

Запрос же

Консоль
Выполнить
  1. SELECT maker, Product.model AS model_1, PC.model AS model_2, price
  2. FROM Product RIGHT JOIN
  3. PC ON PC.model = Product.model
  4. ORDER BY maker, PC.model;
даст те же результаты, что и внутреннее соединение, поскольку в правой таблице (PC) нет таких моделей, которые отсутствовали бы в левой таблице (Product), что вполне естественно для типа связи «один ко многим», которая имеется между таблицами PC и Product.

Наконец, при полном соединении (FULL JOIN) в результирующую таблицу попадут не только те строки, которые имеют одинаковые значения в сопоставляемых столбцах, но и все остальные строки исходных таблиц, не имеющие соответствующих значений в другой таблице. В этих строках все столбцы той таблицы, в которой не было найдено соответствия, заполняются NULL-значениями. То есть полное соединение представляет собой комбинацию левого и правого внешних соединений. Так, запрос для таблиц A и B, приведенных в начале главы,

  1. SELECT A.*, B.*
  2. FROM A FULL JOIN
  3.   B ON A.a = B.c;
даст следующий результат:

A b C d
1 2 NULL NULL
2 1 2 4
NULL NULL 3 3

Заметим, что это соединение симметрично, то есть A FULL JOIN B эквивалентно B FULL JOIN A. Обратите также внимание на обозначение A.*, что означает вывести все столбцы таблицы А.

Следующая страница

Рекомендуемые упражнения: 16, 29, 30, 34, 46, 55, 56, 59, 60, 64, 69, 70, 74, 109, 113, 128

Страницы: 1 2 3 4
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.