- •Iso (международной организацией по
- •2 Понимание sql
- •Что такое - реляционная база данных?
- •Порядок строк произволен
- •4 Понимание sql ___________________________________________________________________
- •Идентификация строк ( первичные ключи )
- •Столбцы именуются и нумеруются
- •8 Понимание sql
- •************** Работа с sql **************
- •Sql : обзор
- •Что делает ansi ?
- •Интерактивный и вложенный sql
- •14 Понимание sql
- •Субподразделения sql
- •16 Понимание sql
- •Sql несогласованности
- •Что такое - пользователь?
- •18 Понимание sql
- •Условия и терминология
- •************** Работа с sql **************
- •24 Понимание sql
- •26 Понимание sql
- •Переупорядочение столбца
- •28 Понимание sql
- •Параметры distinct
- •30 Понимание sql
- •32 Понимание sql
- •************* Работа с sql ***************
- •38 Понимание sql
- •40 Понимание sql
- •42 Понимание sql
- •44 Понимание sql
- •Использование специальных операторов в условиях
- •50 Понимание sql
- •52 Понимание sql
- •54 Понимание sql
- •56 Понимание sql
- •************** Работа с sql **************
- •Обобщение данных с помощью агрегатных функций
- •64 Понимание sql
- •66 Понимание sql
- •Включение дубликатов в агрегатные функции
- •Предложение group by
- •68 Понимание sql
- •Предложение having
- •70 Понимание sql
- •72 Понимание sql
- •************** Работа с sql **************
- •Формирование выводов запросов
- •Помещение текста в вашем выводе запроса
- •78 Понимание sql
- •80 Понимание sql
- •82 Понимание sql
- •Упорядочение вывода по номеру столбца
- •84 Понимание sql
- •************** Работа с sql **************
- •Запрашивание многочисленых таблиц также как одной
- •90 Понимание sql
- •92 Понимание sql
- •94 Понимание sql
- •************** Работа с sql **************
- •Объединение таблицы с собой
- •Псевдонимы
- •100 Понимание sql
- •Устранение избыточности
- •102 Понимание sql
- •Больше псевдонимов
- •104 Понимание sql
- •106 Понимание sql
- •************** Работа с sql **************
- •Вставка одного запроса внутрь другого
- •112 Понимание sql
- •114 Понимание sql
- •116 Понимание sql
- •In определяет набор значений, одно из которых должно совпадать с другим
- •118 Понимание sql
- •In является подходящим, если запрос может ограниченно производить одно
- •120 Понимание sql
- •122 Понимание sql
- •*************** Работа с sql *************
- •Соотнесенные подзапросы
- •130 Понимание sql
- •132 Понимание sql
- •Соотнесенные подзапросы в предложении having
- •134 Понимание sql
- •*************** Работа с sql *************
- •Использование оператора exists
- •140 Понимание sql
- •142 Понимание sql
- •144 Понимание sql
- •146 Понимание sql
- •************** Работа с sql **************
- •Использование оператора exists
- •152 Понимание sql
- •154 Понимание sql _____________________________________________________________________
- •156 Понимание sql
- •158 Понимание sql
- •160 Понимание sql
- •162 Понимание sql
- •Использование count вместо exists
- •166 Понимание sql
- •************** Работа с sql **************
144 Понимание sql
______________________________________________________________________
ГЛ. 12
Имеется запрос который извлекает строки всех продавцов которые имеют
заказчиков с больше чем одним текущим порядком. Это не обязательно са-
мое простое решение этой проблемы, но оно предназначено скорее показать
улучшеную логику SQL. Вывод этой информации связывает все три наши
типовых таблицы:
SELECT *
FROM Salespeople first
WHERE EXISTS
( SELECT *
FROM Customers second
WHERE first.snum = second.snum
AND 1 <
( SELECT COUNT (*)
FROM Orders
WHERE Orders.cnum =
second.cnum ));
Вывод для этого запроса показывается в Рисунке 12.5.
=============== SQL Execution Log ============
| |
| FROM Salespeople first |
| WHERE EXISTS |
| (SELECT * |
| FROM Customers second |
| WHERE first.snum = second.snum |
| AND 1 < |
| (SELECT CONT (*) |
| FROM Orders |
| WHERE Orders.cnum = second.cnum)); |
| ============================================= |
| cnum cname city comm |
| ----- -------- ---- -------- |
| 1001 Peel London 0.17 |
| 1002 Serres San Jose 0.13 |
| 1007 Rifkin Barselona 0.15 |
=============================================
Рисунок 12.5: Использование EXISTS с комплексным подзапросом
ИСПОЛЬЗОВАНИЕ EXISTS ОПЕРАТОРА 145
______________________________________________________________________
Мы могли бы разобрать вышеупомянутый запрос примерно так:
Берем каждую строку таблицы Продавцов как строку-кандидат( внешний
запрос ) и выполняем подзапросы. Для каждой строки-кандидата из вне-
шнего запроса, берем в соответствие каждую строку из таблицы Заказчи-
ков( средний запрос ). Если текущая строка заказчиков не совпадает с те-
кущей строкой продавца( т.е. если first.snum < > second.snum ), предикат
среднего запроса неправилен. Всякий раз, когда мы находим заказчика в
среднем запросе который совдает с продавцом во внешнем запросе, мы
должны рассматривать сам внутренний запрос чтобы определить, будет ли
наш средний предикат запроса верен.
Внутренний запрос считает число порядков текущего заказчика ( из сред-
него запроса ). Если это число больший чем 1, предикат среднего запроса
верен, и строки выбираются.
Это делает EXISTS предикат внешнего запроса верным для текущей строки
продавца, и означает, что по крайней мере один из текущих заказчиков про-
давца имеет более чем один порядок.
Если это не кажется достаточно понятным для вас в этой точке разбора
примера, не волнуйтесь. Сложность этого примера - хороша независимо
от того, как часто будете Вы использовать ее в деловой ситуации.
Основная цель примеров такого типа состоит в том, чтобы показать вам
некоторые возможности которые могут оказаться в дальнейшем полезными.
После работы со сложными ситуациями подобно этой, простые запросы ко-
торые являются наиболее часто используемыми в SQL, покажутся Вам эле-
ментарными.
Кроме того, этот запрос, даже если он кажется удобным, довольно извилис-
тый способ извлечения информации и делает много работы.
Он связывает три разных таблицы чтобы дать вам эту информацию, а если
таблиц больше чем здесь указано, будет трудно получить ее напрямую
(хотя это не единственный способ, и не обязательно лучший способ в SQL).
Возможно вам нужно увидеть эту информацию относительно регулярной
основы - если, например, вы имеете премию в конце недели для продавца
который получил многочисленые порядки от одного заказчика.
В этом случае, он должен был бы вывести команду, и сохранять ее чтобы
использовать снова и снова по мере того как данные будут меняться
( лучше всего сделать это с помощью представления, которое мы будем
проходить в Главе 20 ).