- •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 **************
142 Понимание sql
______________________________________________________________________
ГЛ. 12
Внутренний запрос здесь - как и в предыдущем варианте, фактически
сообщает, что псевдоним был изменен. Внешний запрос - это обьединение
таблицы Продавцов с таблицей Заказчиков, наподобии того что мы видели
прежде. Новое предложение основного предиката ( AND first.snum =
second.snum ) естественно оценивается на том же самом уровне что и
предложение EXISTS. Это - функциональный предикат самого обьединения,
сравнивающий две таблицы из внешнего запроса в терминах поля snum,
которое являются для них общим. Из-за Булева оператора AND, оба условия
основного предиката должны быть верны в порядке для верного предиката.
Следовательно, результаты подзапроса имеют смысл только в тех случаях
когда вторая часть запроса верна, а обьединение - выполняемо. Таким обра-
зом комбинация объединения и подзапроса может стать очень мощным
способом обработки данных.
ИСПОЛЬЗОВАНИЕ NOT EXISTS
Предыдущий пример дал понять что EXISTS может работать в комбинации
с операторами Буля. Конечно, то что является самым простым способом для
использования и вероятно наиболее часто используется с EXISTS - это
оператор NOT. Один из способов которым мы могли бы найти всех продав-
цов только с одним заказчиком будет состоять в том, чтобы инвертировать
наш предыдущий пример.
( Вывод для этого запроса показывается в Рисунке 12.4:)
SELECT DISTINCT snum
FROM Customers outer
WHERE NOT EXISTS
( SELECT *
FROM Customers inner
WHERE inner.snum = outer.snum
AND inner.cnum < > outer.cnum );
EXISTS И АГРЕГАТЫ
Одна вещь которую EXISTS не может сделать - взять функцию агрегата
в подзапросе. Это имеет значение. Если функция агрегата находит любые
строки для операций с ними, EXISTS верен, не взирая на то, что это - зна-|
чение функции ; если же агрегатная функция не находит никаких строк,
EXISTS неправилен.
ИСПОЛЬЗОВАНИЕ EXISTS ОПЕРАТОРА 143
______________________________________________________________________
=============== SQL Execution Log ============
| |
| SELECT DISTINCT snum |
| FROM Salespeople outer |
| WHERE NOT EXISTS |
| (SELECT * |
| FROM Customers inner |
| WHERE inner.snum = outer.snum |
| AND inner.cnum < > outer.cnum); |
| ============================================= |
| cnum |
| ----- |
| 1003 |
| 1004 |
| 1007 |
=============================================
Рисунок 12.4: Использование EXISTS с NOT
Попытка использовать агрегаты с EXISTS таким способом, вероятно
покажет что проблема неверно решалась от начала до конца.
Конечно, подзапрос в предикате EXISTS может также использовать один
или более из его собственных подзапросов. Они могут иметь любой из
различных типов которые мы видели ( или который мы будем видеть ).
Такие подзапросы, и любые другие в них, позволяют использовать агре-
гаты, если нет другой причины по которой они не могут быть использо-
ваны. Следующий раздел приводит этому пример.
В любом случае, вы можете получить тот же самый результат более легко,
выбрав поле которое вы использовали в агрегатной функции, вместо ис-
пользования самой этой функции. Другими словами, предикат -
EXISTS (SELECT COUNT (DISTINCT sname) FROM Salespeople)
- будет эквивалентен - EXISTS (SELECT sname FROM Salespeople)
который был позволен выше.
БОЛЕЕ УДАЧНЫЙ ПРИМЕР ПОДЗАПРОСА
Возможные прикладные программы подзапросов могут становиться мно-
гократно вкладываемыми.
Вы можете вкладывать их два или более в одиночный запрос, и даже один
внутрь другого. Так как можно рассмотреть небольшой кусок чтобы полу-
чить всю картину работаты этой команды, вы можете воспользоваться
способом в SQL, который может принимать различные команды из боль-
шинства других языков.