- •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 **************
106 Понимание sql
______________________________________________________________________
ГЛ. 9
Следующим шагом после комбинации многочисленых таблиц или многочис-
леных копий одной таблицы в запросе, будет комбинация многочисленных
запросов, где один запрос будет производить вывод который будет затем уп-
равлять работой другого запроса. Это другое мощное средство SQL, о кото-
ром мы расскажем в Главе 10 и более тщательно в последующих главах.
ОБЪЕДИНЕНИЕ ТАБЛИЦ С СОБОЙ 107
______________________________________________________________________________
************** Работа с sql **************
1. Напишите запрос который бы вывел все пары продавцов живущих в
одном и том же городе. Исключите комбинации продавцов с ними же,
а также дубликаты строк выводимых в обратным порядке.
2. Напишите запрос который вывел бы все пары порядков по данным
заказчикам, именам этих заказчиков, и исключал дубликаты из вывода,
как в предыдущем вопросе.
3. Напишите запрос который вывел бы имена(cname) и города(city) всех
заказчиков с такой же оценкой(rating) как у Hoffmanа. Напишите запрос
использующий поле cnum Hoffmanа а не его оценку, так чтобы оно могло
быть использовано если его оценка вдруг изменится.
( См. Приложение A для ответов. )
10
Вставка одного запроса внутрь другого
110 ПОНИМАНИЕ SQL
______________________________________________________________________
ГЛ.10
В КОНЕЦ ГЛАВЫ 9, МЫ ГОВОРИЛИ ЧТО ЗАПРОСЫ
могут управлять другими запросами. В этой главе, вы узнаете как это
делается ( большей частью ), помещая запрос внутрь предиката другого
запроса, и используя вывод внутреннего запроса в верном или неверном
условии предиката. Вы сможете выяснить какие виды операторов могут
использовать подзапросы и посмотреть как подзапросы работают со
средствами SQL , такими как DISTINCT, с составными функциями и
выводимыми выражения. Вы узнаете как использовать подзапросы с
предложением HAVING и получите некоторые наставления как правильно
использовать подзапросы.
======== КАК РАБОТАЕТ ПОДЗАПРОС? =========
С помощью SQL вы можете вкладывать запросы внутрь друга друга.
Обычно, внутренний запрос генерирует значение которое проверяется в
предикате внешнего запроса, определяющего верно оно или нет.
Например, предположим что мы знаем имя продавца: Motika, но не знаем
значение его поля snum, и хотим извлечь все порядки из таблицы Порядков.
Имеется один способ чтобы сделать это( вывод показывается в Рисунке 10.1 ):
SELECT *
FROM Orders
WHERE snum =
( SELECT snum
FROM Salespeople
WHERE sname = 'Motika');
Чтобы оценить внешний( основной ) запрос, SQL сначала должен оценить
внутренний запрос ( или подзапрос ) внутри предложения WHERE. Он
делает это так как и должен делать запрос имеющий единственную цель
- отыскать через таблицу Продавцов все строки, где поле sname равно
значению Motika, и затем извлечь значения поля snum этих строк.
Единственной найденной строкой естественно будет snum = 1004. Однако
SQL, не просто выдает это значение, а помещает его в предикат основного
запроса вместо самого подзапроса, так чтобы предиката прочитал что
WHERE snum = 1004
РАЗМЕЩЕНИЕ ЗАПРОСОВ ВНУТРИ ДРУГА ДРУГА 111
______________________________________________________________________
=============== SQL Execution Log ==============
| |
| SELECT * |
| FROM Orders |
| WHERE snum = |
| (SELECT snum |
| FROM Salespeople |
| WHERE sname = 'Motika'); |
|=================================================|
| onum amt odate cnum snum |
| ----- ------- ---------- ----- ----- |
| 3002 1900.10 10/03/1990 2007 1004 |
| |
=================================================
Рисунок 10.1: Использование подзапроса
Основной запрос затем выполняется как обычно с вышеупомянутыми
результатами. Конечно же, подзапрос должен выбрать один и только один
столбец, а тип данных этого столбца должен совпадать с тем значением с
которым он будет сравниваться в предикате. Часто, как показано выше,
выбранное поле и его значение будут иметь одинаковые имена( в этом
случае, snum ), но это необязательно.
Конечно, если бы мы уже знали номер продавца Motika, мы могли бы
просто напечатать
WHERE snum = 1004
и выполнять далее с подзапросом в целом, но это было бы не так универ-
сально. Это будет продолжать работать даже если номер Motika изменился,
а, с помощью простого изменения имени в подзапросе, вы можете исполь-
зовать его для чего угодно.
ЗНАЧЕНИЯ, КОТОРЫЕ МОГУТ ВЫДАВАТЬ ПОДЗАПРОСЫ
Скорее всего было бы удобнее, чтобы наш подзапрос в предыдущем
примере возвращал одно и только одно значение.