- •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 **************
112 Понимание sql
______________________________________________________________________
ГЛ. 10
Имея выбранным поле snum " WHERE city = "London" вместо
"WHERE sname = 'Motika", можно получить несколько различных
значений. Это может сделать уравнение в предикате основного запроса
невозможным для оценки верности или неверности, и команда выдаст
ошибку.
При использовании подзапросов в предикатах основанных на реляционных
операторах ( уравнениях или неравенствах, как объяснено в Главе 4 ),
вы должны убедиться что использовали подзапрос который будет выдавать
одну и только одну строку вывода. Если вы используете подзапрос
который не выводит никаких значений вообще, команда не потерпит
неудачи; но основной запрос не выведет никаких значений.
Подзапросы которые не производят никакого вывода (или нулевой вывод)
вынуждают рассматривать предикат ни как верный ни как неверный,
а как неизвестный. Однако, неизвестный предикат имеет тот же самый
эффект что и неверный: никакие строки не выбираются основным
запросом ( смотри Главу 5 для подробной информации о неизвестном
предикате ).
Это плохая стратегия, чтобы делать что-нибудь подобное следующему:
SELECT *
FROM Orders
WHERE snum =
( SELECT snum
FROM Salespeople
WHERE city = Barcelona );
Поскольку мы имеем только одного продавца в Barcelona - Rifkin, то
подзапрос будет выбирать одиночное значение snum и следовательно будет
принят. Но это - только в данном случае. Большинство SQL баз данных име-
ют многочисленых пользователей, и если другой пользователь добавит ново-
го продавца из Barcelona в таблицу, подзапрос выберет два значения, и ваша
команда потерпит неудачу.
DISTINCT С ПОДЗАПРОСАМИ
Вы можете, в некоторых случаях, использовать DISTINCT чтобы вынудить
подзапрос генерировать одиночное значение. Предположим что мы хотим
найти все порядки кредитований для тех продавцов которые обслуживают
Hoffmanа ( cnum = 2001 ).
РАЗМЕЩЕНИЕ ЗАПРОСОВ ВНУТРИ ДРУГА ДРУГА 113
______________________________________________________________________
Имеется один способ чтобы сделать это ( вывод показывается в
Рисунке 10.2 ):
SELECT *
FROM Orders
WHERE snum =
( SELECT DISTINCT snum
FROM Orders
WHERE cnum = 2001 );
=============== SQL Execution Log ==============
| |
| SELECT * |
| FROM Orders |
| WHERE snum = |
| (SELECT DISTINCT snum |
| FROM Orders |
| Where cnum = 2001); |
| =============================================== |
| onum amt odate cnum snum |
| ----- --------- --------- ------ ------- |
| 3003 767.19 10/03/1990 2001 1001 |
| 3008 4723.00 10/05/1990 2006 1001 |
| 3011 9891.88 10/06/1990 2006 1001 |
================================================
Рисунок 10.2: Использование DISTINCT чтобы вынудить получение одного
значения из подзапроса
Подзапрос установил что значение поля snum совпало с Hoffman - 1001, и
затем основной запрос выделил все порядки с этим значением snum из таб-
лицы Порядков( не разбирая, относятся они к Hoffman или нет). Так как
каждый заказчик назначен к одному и только этому продавцу, мы знаем что
каждая строка в таблице Порядков с данным значением cnum должна иметь
такое же значение snum. Однако так как там может быть любое число таких
строк, подзапрос мог бы вывести много ( хотя и идентичных ) значений snum
для данного поля cnum. Аргумент DISTINCT предотвращает это.
Если наш подзапрос возвратит более одного значения, это будет указывать на
ошибку в наших данных - хорошая вещь для знающих об этом.