Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

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 изменился,

а, с помощью простого изменения имени в подзапросе, вы можете исполь-

зовать его для чего угодно.

ЗНАЧЕНИЯ, КОТОРЫЕ МОГУТ ВЫДАВАТЬ ПОДЗАПРОСЫ

Скорее всего было бы удобнее, чтобы наш подзапрос в предыдущем

примере возвращал одно и только одно значение.

Соседние файлы в папке ПОНИМАНИЕ SQL