Новые книги

Итак, если вы желаете выяснить, чего на самом деле хочет ваш клиент, о чем мечтает, чего опасается и что его мотивирует, то для этого нужно задавать правильные вопросы, – способные его заинтересовать, – и преобразовывать его интерес в действия. Поможет в этом проверенный и надежный инструментарий, который вам предоставит автор этой книги Пол Черри, более 20 лет работающий в области продаж и ежегодно инструктирующий более 5000 специалистов по продажам. Хотя его методы изложены применительно к смоделированным ситуациям в разных отраслях бизнеса, но они пригодны для использования и в других сферах человеческой деятельности.
65 % мирового ВВП сосредоточено всего в 600 городах. Филип Котлер, один из лучших экспертов по маркетингу в мире, и его брат Милтон, международный маркетинговый стратег, предлагают план действий, как лучше выбрать город для дальнейшего расширения бизнеса, подсказывают, на что стоит обратить внимание при открытии филиала, и рассказывают, почему выстраивание долгосрочных отношений с городскими властями принесет вам в будущем значительные преимущества.

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

Запросы с использованием нескольких таблиц

Глава 3. Запросы с использованием нескольких таблиц
3.1. О средствах одновременной работы с множеством таблиц

Затрагивая вопросы проектирования баз данных [2], мы выяснили, что базы данных - это множество взаимосвязанных сущностей или отношений (таблиц) в терминологии реляционных СУБД. При проектировании стремятся создавать таблицы, в каждой из которых содержалась бы информация об одном и только об одном типе сущностей. Это облегчает модификацию базы данных и поддержание ее целостности. Но такой подход тяжело усваивается начинающими проектантами, которые пытаются привязать проект к будущим приложениям и так организовать таблицы, чтобы в каждой из них хранилось все необходимое для реализации возможных запросов. Типичен вопрос: как же получить сведения о том, где купить продукты для приготовления того или иного блюда и определить его калорийность и стоимость, если нужные данные "рассыпаны" по семи различным таблицам? Не лучше ли иметь одну большую таблицу, содержащую все сведения базы данных ПАНСИОН ?

Даже при отсутствии средств одновременного доступа ко многим таблицам нежелателен проект, в котором информация о многих типах сущностей перемешана в одной таблице. SQL же обладает великолепным механизмом для одновременной или последовательной обработки данных из нескольких взаимосвязанных таблиц. В нем реализованы возможности "соединять" или "объединять" несколько таблиц и так называемые "вложенные подзапросы". Например, чтобы получить перечень поставщиков продуктов, необходимых для приготовления Сырников, возможен запрос

SELECT	Продукт, Цена, Название, Статус
FROM	Продукты, Состав, Блюда, Поставки, Поставщики
WHERE	Продукты.ПР = Состав.ПР
AND	Состав.БЛ = Блюда.БЛ
AND	Поставки.ПР = Состав.ПР
AND	Поставки.ПС = Поставщики.ПС
AND	Блюдо = 'Сырники'
AND	Цена IS NOT NULL;
ПродуктЦенаНазваниеСтатус
Яйца1.8ПОРТОСкооператив
Яйца2.КОРЮШКАкооператив
Сметана3.6ПОРТОСкооператив
Сметана2.2ОГУРЕЧИКферма
Творог1.ОГУРЕЧИКферма
Мука0.5УРОЖАЙкоопторг
Сахар0.94ТУЛЬСКИЙуниверсам
Сахар1.УРОЖАЙкоопторг

Он получен следующим образом: СУБД последовательно формирует строки декартова произведения таблиц, перечисленных во фразе FROM, проверяет, удовлетворяют ли данные сформированной строки условиям фразы WHERE, и если удовлетворяют, то включает в ответ на запрос те ее поля, которые перечислены во фразе SELECT.

Следует подчеркнуть, что в SELECT и WHERE (во избежание двусмысленности) ссылки на все (*) или отдельные столбцы могут (а иногда и должны) уточняться именем соответствующей таблицы, например, Поставки.ПС, Поставщики.ПС, Меню.*, Состав.БЛ, Блюда.* и т.п.

Очевидно, что с помощью соединения несложно сформировать запрос на обработку данных из нескольких таблиц. Кроме того, в такой запрос можно включить любые части предложения SELECT, рассмотренные в главе 2 (выражения с использованием функций, группирование с отбором указанных групп и упорядочением полученного результата). Следовательно, соединения позволяют обрабатывать множество взаимосвязанных таблиц как единую таблицу, в которой перемешана информация о многих типах сущностей. Поэтому начинающий проектант базы данных может спокойно создавать маленькие нормализованные таблицы, так как он всегда может получить из них любую "большую" таблицу.

Кроме механизма соединений в SQL есть механизм вложенных подзапросов, позволяющий объединить несколько простых запросов в едином предложении SELECT. Иными словами, вложенный подзапрос - это уже знакомый нам подзапрос (с небольшими огра-ничениями), который вложен в WHERE фразу другого вложенного подзапроса или WHERE фразу основного запроса.

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

SELECT	Продукт, Цена, Название, Статус
FROM	Продукты, Состав, Блюда, Поставки, Поставщики
WHERE	Продукты.ПР = Состав.ПР
AND	Состав.БЛ = Блюда.БЛ
AND	Поставки.ПР = Состав.ПР
AND	Поставки.ПС = Поставщики.ПС
AND	Блюдо = 'Сырники'
AND	Цена = (	SELECT	MIN(Цена)
		FROM	Поставки X
		WHERE	X.ПР = Поставки.ПР );

Результат запроса имеет вид

ПродуктЦенаНазваниеСтатус
Яйца1.8ПОРТОСкооператив
Сахар0.94ТУЛЬСКИЙуниверсам
Мука0.5УРОЖАЙкоопторг
Сметана2.2ОГУРЕЧИКферма
Творог1.ОГУРЕЧИКферма

Здесь с помощью подзапроса, размещенного в трех последних строках запроса, описывается процесс определения минимальной цены каждого продукта для Сырников и поиск поставщика, предлагающего этот продукт за такую цену. Механизм реализации подзапросов будет подробно описан в п.3.3. Там же будет рассмотрено, как и для чего вводится псевдоним X для имени таблицы Поставки.

2.5.4 | Содержание | 3.2.1