DB2 – система управления реляционными базами данных. Заданное число упорядоченных столбцов и неупорядоченные строки, страница 18

Некоторые ключи состоят из нескольких частей. Все столбцы, входящие в ключ, должны быть определены в WHERE секции, иначе вы получите неверный результат.


Примерсоединения

SELECT emp_no, sales_person.dep_no,

fname, lname, manager

FROM sales_person, dept

WHERE sales_person.dept_no = dept.dept_no

AND dept.dept_no BETWEEN 2 AND 15

В этом примере вы можете увидеть две особенности использования WHERE предложения.

Первая часть WHERE-предложения запрашивает соединение двух таблиц. Это соединение выполняется по номеру отдела.

Вторая часть позволяет включить в результирующее множество только те строки, номер отдела у которых от 2 до 15.


Использование подзапросов

Второй шаг


SELECT * FROM

            Sales_Person

WHERE Dept_No IN

                                                                                          Первыйшаг


SELECT dept_no

FROM Dept

                                                      WHERE Dept_Name LIKE ‘Lo%’

  Результат


Предложение SELECT может включать в себя предложение SELECT. Фактически, может быть использовано несколько уровней. Выход одного SELECT-оператора используется как вход для WHERE предыдущего уровня.

В приведенном примере, генерируется список номеров отделов, которые передаются в IN предикат верхнего уровня. Таким образом, сначала генерируется список номеров отделов, начинающихся с ‘Lo’. Затем находим всех сотрудников, которые работают в одном из перечисленных в списке отделов.

Довольно часто, как и в этом случае, мы можем переписать многоуровневый подзапрос используя логическое соединение. Обычно соединение более эффективно, чем многоуровневые подзапросы.

Только для подзапросов EXISTS и IN подзапрос может возвращать более одной строки. Для остальных предикатов подзапрос должен возвращать только одну строку.

SELECT * FROM Sales_Person

WHERE Dept_no IN

(

SELECT Dept_No FROM Dept

WHERE Dept_Name LIKE ‘Lo%’

)


Примервложенногоподзапроса

SELECT sp_no, our_ord_no, order_date, order_value

FROM sale

WHERE sp_no =

(

SELECT emp_no

FROM sales_person

WHERE fname = ‘Sarah’ and

lname = ‘Wallington’

)

Замечание: Требуется получить продажи сделанные только одним человеком по имени Sarah Wallington.

Это пример вложенного подзапроса. Этот запрос выбирает все прдажи сделанные Sarah Wallington.

Для того, чтобы верно выполнить эту работу, подзапрос должен вернуть одну строку. Если будет возвращена не одна строка, то нужно использовать IN предикат.


Коррелированные подзапросы

Шаг 1

SELECT Dept_No, Sp_Name, Sales_Target

FROM Sales_Person X

WHERE sales_target >

Шаг2

                                         (SELECT AVG(sales_target)

                                          FROM Sales_Person Y

                                          WHERE Y.Dept_No = X.Dept_No)

Когда мы выполняем вложенный подзапрос, выполняется подзапрос и результаты передаются на верхний уровень SELECT. В коррелированных подзапросах, и основной запрос и подзапрос выполняются один раз для каждой строки в основном запросе.

В приведенном примере запрашиваем информацию о всех служащих-продавцах, у которых суммарный доход от продаж выше среднего значения по отделу.

Запрос находит служащих-продавцов и извлекает их номера отделов. Затем выполняется второй SELECT  и определяется среднее арифметическое по отделу. Затем сравнивается результат со строкой из первого запроса. Если проходит сравнение, то строка размещается в выходном наборе, иначе она отвергается.

Первый запрос затем передвигается ко второй строке таблицы и процесс повторяется.


Самоссылающиеся соединения (1)

  • Найти всех служащих-продавцов, которые живут

 в некотором городе

Иногда, способ получения верного результата – это использование той же самой таблицы дважды в том же самом SELECT предложении. Таблица соединяется сама с собой.

Как мы можем написать такой запрос?

Нам необходимо использовать самоссылающиеся (рекурсивные) соединения.