
- •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 **************
118 Понимание sql
______________________________________________________________________
ГЛ. 10
Хороший оптимизатор во всяком случае преобразует вариант обьединения
в подзапрос, но нет достаточно простого способа для вас чтобы выяснить
выполнено это или нет. Лучше сохранить ваши запросы в памяти чем по-
лагаться полностью на оптимизатор.
Конечно вы можете также использовать оператор IN, даже когда вы уве-
рены что подзапрос произведет одиночное значение. В любой ситуации где
вы можете использовать реляционный оператор сравнения (=), вы можете
использовать IN. В отличие от реляционных операторов, IN не может заста-
вить команду потерпеть неудачу если больше чем одно значение выбрано
подзапросом. Это может быть или преимуществом или недостатком.
Вы не увидите непосредственно вывода из подзапросов; если вы полагаете
что подзапрос собирается произвести только одно значение, а он производит
различные. Вы не сможете объяснить различия в выводе основного запроса.
Например, рассмотрим команду, которая похожа на предыдущую:
SELECT onum, amt, odate
FROM Orders
WHERE snum =
( SELECT snum
FROM Orders
WHERE cnum = 2001 );
Вы можете устранить потребность в DISTINCT используя IN вместо (=),
подобно этому:
SELECT onum, amt, odate
FROM Orders
WHERE snum IN
( SELECT snum
FROM Orders
WHERE cnum = 2001 );
Что случится если есть ошибка и один из порядков был акредитован к
различным продавцам? Версия использующая IN будет давать вам все
порядки для обоих продавцов. Нет никакого очевидного способа наблю-
дения за ошибкой, и поэтому сгенерированные отчеты или решения
сделанные на основе этого запроса не будут содержать ошибки. Вариант
использующий ( = ) , просто потерпит неудачу.
РАЗМЕЩЕНИЕ ЗАПРОСОВ ВНУТРИ ДРУГА ДРУГА 119
______________________________________________________________________
Это, по крайней мере, позволило вам узнать что имеется такая проблема.
Вы должны затем выполнять поиск неисправности, выполнив этот подза-
прос отдельно и наблюдая значения которые он производит.
В принципе, если вы знаете что подзапрос должен( по логике) вывести
только одно значение, вы должны использовать = .
In является подходящим, если запрос может ограниченно производить одно
или более значений, независимо от того ожидаете вы их или нет.
Предположим, мы хотим знать комиссионные всех продавцов обслуживаю-
щих заказчиков в Лондоне:
SELECT comm
FROM Salespeople
WHERE snum IN
( SELECT snum
FROM Customers
WHERE city = "London" );
Выводимыми для этого запроса, показанного в Рисунке 10.5, являются
значения комиссионных продавца Peel ( snum = 1001 ), который имеет
обоих заказчиков в Лондоне. Это - только для данного случая.
Нет никакой причины чтобы некоторые заказчики в Лондоне не могли быть
назначеными к кому-то еще. Следовательно, IN - это наиболее логичная
форма чтобы использовать ее в запросе.
=============== SQL Execution Log ==============
| |
| SELECT comm |
| FROM Salespeople |
| WHERE snum IN |
| (SELECT snum |
| FROM Customers |
| WHERE city = 'London'); |
| =============================================== |
| comm |
| ------- |
| 0.12 |
| |
| |
================================================
Рисунок 10.5 Использование IN с подзапросом для вывода одного значения