- •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 **************
162 Понимание sql
______________________________________________________________________
ГЛ. 13
SELECT *
FROM Customers
WHERE NOT rating = ANY
( SELECT rating
FROM Customers
WHERE city = " San Jose' );
Вывод будет одинаков для всех трех условий.
ПРАВИЛЬНОЕ ПОНИМАНИЕ ANY И ALL
В SQL, сказать что - значение больше( или меньше ) чем любое(ANY) из на-
бора значений - тоже самое что сказать, что оно больше( или меньше ) чем
любое одно отдельное из этих значений. И наоборот, сказать что значение
не равно всему(ALL) набору значений, тоже что сказать, что нет такого зна-
чения в наборе которому оно равно.
КАК ANY, ALL, И EXIST ПОСТУПАЮТ
======= С ОТСУТСТВУЮЩИМИ И =======
НЕИЗВЕСТНЫМИ ДАННЫМИ
Как было сказано, имеются некоторые различия между EXISTS и операто-
рами представленными в этой главе относительно того как они обрабатыва-
ют оператор NULL. ANY и ALL также отличаются друг от друга тем как
они реагируют если подзапрос не произвел никаких значений чтобы исполь-
зовать их в сравнении. Эти различия могут привести к непредвиденным ре-
зультатам на Ваши запросы если вы не будете их учитывать.
КОГДА ПОДЗАПРОС ВОЗВРАЩАЕТСЯ ПУСТЫМ
Одно значительное различие между ALL и ANY - способ действия в cитуации
когда подзапрос не возвращает никаких значений. В принципе, всякий раз, ко-
гда допустимый подзапрос не в состоянии сделать вывод, ALL - автоматически
верен, а ANY автоматически неправилен. Это означает, что следующий запрос
SELECT *
FROM Customers
WHERE rating > ANY
( SELECT rating
FROM Customers
WHERE city = Boston );
ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ANY, ALL, И SOME 163
______________________________________________________________________
не произведет никакого вывода, в то время как запрос -
SELECT
FROM Customers
WHERE rating > ALL
( SELECT rating
FROM Customers
WHERE city = 'Boston' );
выведет всю таблицу Заказчиков. Когда нет никаких заказчиков в Boston,
естественно, ни одно из этих сравнений не имеет значення.
ANY И ALL ВМЕСТО EXISTS С
ПУСТЫМ УКАЗАТЕЛЕМ( NULL )
Значения NULL также имеют некоторые проблемы с операторами наподо-
бии этих. Когда SQL сравнивает два значения в предикате, одно из кото-
рых пустое (NULL), то результат неизвестен ( смотрите Главу 5 ).
Неизвестный предикат, подобен неверному и является причиной того что
строка не выбирается, но работать он будет иначе в некоторых похожих
запросах, в зависимости от того, используют они ALL или ANY вместо
EXISTS. Рассмотрим наш предыдущий пример:
SELECT *
FROM Customers
WHERE rating > ANY
( SELECT rating
FROM Customers
WHERE city = 'Rome' );
и еще один пример:
SELECT *
FROM Customers outer
WHERE EXISTS
( SELECT *
FROM Customers inner
WHERE outer.rating > inner.rating
AND inner.city = 'Rome' );
164 ПОНИМАНИЕ SQL
______________________________________________________________________
ГЛ. 13
В общем, эти два запроса будут вести себя одинаково. Но предположим,
что появилось пустое(NULL) значение в столбце rating таблицы Заказчиков:
CNUM CNAME CITY RATING SNUM
2003 Liu SanJose NULL 1002
В варианте с ANY, где оценка Liu выбрана основным запросом, значе-
ние NULL делает предикат неизвестным а строка Liu не выбирается
для вывода. Однако, в варианте с NOT EXISTS когда эта строка выбра-
на основным запросом, значение NULL используется в предикате под-
запроса, делая его неизвестным в каждом случае. Это означает что под-
запрос не будет производить никаких значений, и EXISTS будет непра-
вилен. Это, естественно, делает оператор NOT EXISTS верным. Следова-
тельно, строка Liu будет выбрана для вывода. Это основное расхожде-
ние, в отличие от других типов предикатов, где значение EXISTS незави-
симо от того верно оно или нет - всегда неизвестно.
Все это является аргументом в пользу использования варианта формули-
ровки с ANY.
Мы не считаем что значение NULL является выше чем допустимое значе-
ние. Более того, результат будет тот же, если мы будем проверять для
более низкого значения.