Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Внутренние и внешние объединения




Работа с несколькими таблицами

Условия поиска групп HAVING

Точно также, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING можно применить для отбора групп строк. Его формат соответствует формату предложения WHERE. Предложение HAVING состоит из ключевого слова HAVING, за которым следует условие поиска. Таким образом, данное предложение определяет условие поиска для групп. Основным отличием предложения HAVING от WHERE, что оно применяется уже непосредственно после самого запроса и в условие поиска включается поле с примененной к нему агрегатной функцией.

Вывести те дни месяца, когда оборот превышал 1000 руб.

SELECT ДАТА_ДОК, SUM (КОЛ-ВО*ЦЕНА)

SUM (КОЛ-ВО*ЦЕНА)

FROM ПЕРЕМЕЩЕНИЕ

WHERE ДАТА_ДОК BETWEEN ‘1.01.2000’ AND ’31.01.2000’

GROUP BY ДАТА_ДОК

HAVING SUM (КОЛ-ВО*ЦЕНА)>1000

 

Вывести все идентификаторы городов, если количество клиентов из них больше трех.

SELECT IDN_ГОРОДА

FROM КЛИЕНТ

GROUP BY IDN_ГОРОДА

HAVING COUNT(*) >3

 

6.3.1 Объединение при помощи оператора WHERE

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

Таблица Города

IDN НАЗВАНИЕ
  Москва Санкт-Петербург Пермь Париж

 

 

Таблица Клиент

IDN НАЗВАНИЕ(ИМЯ) IDN_ГОРОДА  
  МММ Хопер Алиса ИВС ПГТУ Рога&Копыта  

 

Вывести всех клиентов с указанием города.

SELECT ГОРОДА.НАЗВАНИЕ, КЛИЕНТ.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА,КЛИЕНТ

WHERE ГОРОДА.IDN=КЛИЕНТ.IDN_ГОРОДА

Результат этого запроса.

Москва Москва Санкт-Петербург Пермь Пермь МММ Хопер Алиса ИВС ПГТУ

 

Если бы нам нужны были клиенты только из Москвы. То этот запрос дополнился бы еще одной строкой.

AND ГОРОДА.НАЗВАНИЕ =’Москва’

 

В качестве упрощенного варианта этот же запрос можно записать следующим образом.

SELECT Г.НАЗВАНИЕ, К.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА Г., КЛИЕНТ К.

WHERE Г.IDN=K.IDN_ГОРОДА AND Г.НАЗВАНИЕ=’Москва’

 

Нас интересует на какую сумму был оборот по каждой группе товаров за какой-то промежуток времени.

SELECT ГР.НАЗВАНИЕ, SUM(П.КОЛ-ВО*П.ЦЕНА)

FROM ГРУППЫ ГР., ПЕРЕМЕЩЕНИЕ П.

WHERE ГР.IDN=П.IDN_ГРУППЫ AND П.ДАТА_ДОК

BETWEEN ‘1.02.2000’ AND ’16.03.2000’

GROUP BY ГР.НАЗВАНИЕ

HAVING SUM(П.КОЛ-ВО*П.ЦЕНА)>1000

ORDER BY SUM(П.КОЛ-ВО*П.ЦЕНА)

Примеры рассмотренные в предыдущем разделе формально относятся к так называемым внутренним объединениям. Внутреннее объединение возвращает строки, только если условия объединения выполнено. Приведем еще раз пример запроса с использованием оператора JOIN (соединять).

 

Вывести всех клиентов с указанием города.

SELECT ГОРОДА.НАЗВАНИЕ, КЛИЕНТ.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА

INNER JOIN КЛИЕНТ ON ГОРОДА.IDN=КЛИЕНТ.IDN_ГОРОДА

Результат этого запроса.

Москва Москва Санкт-Петербург Пермь Пермь МММ Хопер Алиса ИВС ПГТУ

Обратите внимание, что ни город Париж ни клиент Рога&Копыта в результаты запроса не попали.

На то, что мы имеем дело с внутренним объединением, указывает ключевое слово INNER (внутренний). Помимо внутренних объединений часто имеет смысл использовать внешние объединения, которые возвращают строки независимо от того выполнено условия объединение или нет. Когда условия объединения не выполнено для данной строки во внешнем объединении, поля из внутренней таблицы возвращаются как NULL.

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

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

Вывести всех клиентов, если для клиента указан город, показать его.

SELECT ГОРОДА.НАЗВАНИЕ, КЛИЕНТ.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА

LEFT OUTER JOIN КЛИЕНТ ON ГОРОДА.IDN=КЛИЕНТ.IDN_ГОРОДА

Результат этого запроса.

Москва Москва Санкт-Петербург Пермь Пермь МММ Хопер Алиса ИВС ПГТУ Рога&Копыта

Обратите внимание, что был выведен клиент Рога&Копыта, для которого город не указан.

В этом запросе были использованы ключевые слова LEFT (левый) OUTER (внешний).

Правое внешнее объединение:

Вывести все города и клиентов из этих городов.

SELECT ГОРОДА.НАЗВАНИЕ, КЛИЕНТ.НАЗВАНИЕ(ИМЯ)

FROM ГОРОДА

RIGHT OUTER JOIN КЛИЕНТ ON ГОРОДА.IDN=КЛИЕНТ.IDN_ГОРОДА

Результат этого запроса.

Москва Москва Санкт-Петербург Пермь Пермь Париж МММ Хопер Алиса ИВС ПГТУ  

В результате теперь присутствует Париж.




Поделиться с друзьями:


Дата добавления: 2014-12-07; Просмотров: 792; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.