Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка SQL(14) (оптимизация).docx
Скачиваний:
62
Добавлен:
17.03.2015
Размер:
452.16 Кб
Скачать

3.4.3. Реальные примеры соединений.

Внутреннее соединение.

Пример 21.

Получить информацию о стоимости и количестве каждого продукта на складе

SELECT Продукты.Продукт, Наличие.Количество, Наличие.Цена

FROM Продукты JOIN Наличие

ON Продукты.ID_Продукта = Наличие.Продукт;

Результат

Продукт

Количество

Цена

Говядина

108

429,84

Судак

0

0,00

Масло

73

274,61

Майонез

39

97,46

Яйца

61

111,83

Сметана

88

206,60

Молоко

214

83,80

Творог

92

82,80

Морковь

0

0,00

Лук

77

46,30

Помидоры

46

51,70

Зелень

13

34,96

Рис

54

51,17

Мука

91

43,77

Яблоки

117

189,92

Сахар

98

96,14

Кофе

37

166,50

Таблица Продукты соединяется с таблицей Наличие с помощью ключевого слова JOIN(INNER по умолчанию). После ON задаётся условие соединения, которое указывает, каким образом строки таблиц должны соответствовать друг другу, чтобы принять участие в соединении.

Между таблицами Продукты и Наличие существует связь «один к одному». Это означает, что для каждой строки из таблицы Продукты, в таблице Наличие будет найдено не более одной соответствующей строки (может не быть ни одной). В результат запроса попадут только те строки из Таблицы продукты, для которых соответствие найдено (продукт есть на складе).

Пример 22.

Более сложный запрос: Рассчитать стоимость блюда

SELECT b.Блюдо, SUM(s.Вес*n.Цена/1000)+b.Труд as Стоимость

FROM (Блюда b JOIN Состав s ON b.ID_блюда =s.Блюдо )

JOIN Наличие n ON s.Продукт=n.Продукт

GROUP BY b.Блюдо, b.Труд;

Результат

Блюдо

Стоимость

Кофе черный

2,332

Сметана

28,2671

Компот

16,2558

Кофе на молоке

12,0205

Молочный напиток

45,4615

Творог

19,9821

Морковь с рисом

14,5298

Для того чтобы определить состав каждого блюда, таблица Блюда соединяется с таблицей Состав. Между таблицами Блюда и Состав существует связь «один ко многим». Что означает, что в состав каждого блюда может входить несколько продуктов. В результате внутреннего соединения получаем промежуточную таблицу. Для расчета стоимости полученную промежуточную таблицу соединяем с таблицей Наличие для определения цены продукта. Группировка по полю Блюдо позволяет каждое блюдо рассматривать как независимый набор строк, к которому применяется формула подсчета стоимости. Группировка по полю Труд позволяет учесть трудозатраты на изготовление одной порции блюда.

Левое внешнее соединение.

Запрос с левым внешним соединением идентичен уже рассмотренному запросу с внутренним соединением (Пример 21), за исключением того, что используются ключевые слова LEFT OUTER JOIN.

SELECT p.Продукт, n.Количество, n.Цена

FROM Продукты p LEFT JOIN Наличие n ON p.ID_Продукта = n.Продукт;

Результат

Продукт

Количество

Цена

Говядина

108

429,84

Судак

0

0,00

Масло

73

274,61

Майонез

39

97,46

Яйца

61

111,83

Сметана

88

206,60

Молоко

214

83,80

Творог

92

82,80

Морковь

0

0,00

Лук

77

46,30

Помидоры

46

51,70

Зелень

13

34,96

Рис

54

51,17

Мука

91

43,77

Яблоки

117

189,92

Сахар

98

96,14

Кофе

37

166,50

Масло растительное

NULL

NULL

Единственное различие между левым внешним объединением и внутренним в наличии лишней строки для продукта масло растительное результате. Этого продукта нет на складе (т.е. не выполняется условие внутреннего соединения). Строка включается потому, что использовано именно левое внешнее объединение, при котором все строки левой таблицы, Продукты, должны попасть в результат.

Если мы хотим узнать, какие продукты отсутствуют на складе, необходимо дополнить запрос условием:

SELECT p.Продукт,