Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции для 16 группы.docx
Скачиваний:
46
Добавлен:
13.02.2015
Размер:
293.45 Кб
Скачать

Select p.*, d.* from project p, department d

будет получен следующий результат, представленный на рисунке 20.

Рис. 20. Декартово произведение таблиц project и department

В данном случае среда для выполнения запросов преобразовала наименование колонки department.dept_no в dept_no_1 для исключения дублирования.

Если добавить в запрос условие WHERE p.dept_no = d.dept_no, то из декартова произведения таблиц будут выбраны только те строки, в которых значения колонок project.dept_no и department.dept_no равны, то есть для запроса вида

SELECT p.*, d.* FROM project p, department d

WHERE p.dept_no = d.dept_no

будет получен результат, представленный на рисунке 21.

Рис. 21. Промежуточный результат объединения таблиц project и department

Теперь можно ограничить количество выбираемых колонок и получить заключительный вариант запроса и результат его выполнения (рисунок 22):

SELECT p.proj_no, p.proj_name, d.dept_no,

d.dept_name

FROM project p, department d

WHERE p.dept_no = d.dept_no

Рис. 22. Окончательный результат объединения таблиц project и department.

Такой вариант объединения называется простым (simple join).

Пример 10. Для всех проектов необходимо выбрать следующую информацию: номер проекта, название проекта, номер подразделения и название подразделения.

В данном примере подразумевается, что проекту может быть не поставлено в соответствие подразделение-исполнитель, т.е. в колонке dept_no таблицы project может храниться неопределенное значение (NULL). В этом случае речь идет о внешнем объединении таблиц (outer join). Внешнее объединение в общем случае отбирает больше строк, чем простое объединение. При выполнении операции внешнего объединения отбираются все строки, которые были бы отобраны при выполнении операции простого объединения и дополнительно отбираются строки из одной таблицы, которым не обнаружено соответствия по используемому критерию отбора ни с одной строкой другой таблицы.

Внешнее объединение отображается в конструкции WHERE в одной из двух форм:

[таблица1.]столбец = [таблица2.]столбец (+)

или

[таблица1.]столбец (+) = [таблица2.]столбец

Символы внешнего объединения “(+) должны следовать непосредственно за колонкой, по отношению к которой выполняется внешнее объединение. Для лучшего запоминания того, где необходимо ставить символы “(+), можно использовать следующее правило: знак внешнего объединения ставится после наименования той колонки, на которую будут отсутствовать ссылки из связанной таблицы.

В рассматриваемом примере внешнее объединение выполняется по отношению к колонке dept_no таблицы department, поэтому запрос для решения поставленной задачи будет иметь вид:

SELECT p.proj_no, p.proj_name, d.dept_no,

d.dept_name

FROM project p, department d

WHERE p.dept_no = d.dept_no (+)

Результат выполнения этого запроса представлен на рисунке 23.

Рис. 23. Результат внешнего объединения

таблиц project и department

Если же символ внешнего объединения поставить после указания колонки dept_no таблицы project, то выполнится запрос, который вернет информацию о всех отделах и тех проектах, которые ими выполняются, причем информация об отделе будет присутствовать независимо от того, есть выполняемые этим отделом проекты или нет. То есть в результате выполнения запроса вида:

SELECT p.proj_no, p.proj_name, d.dept_no,

d.dept_name

FROM project p, department d

WHERE p.dept_no (+) = d.dept_no

мы получим следующую выборку, показанную на рисунке 24.

Рис. 24. Альтернативный результат внешнего объединения

таблиц project и department

После выполнения запроса может быть получено некоторое множество строк. Каждая строка имеет в рамках данного множества свой номер, называемый ROWNUM. Вычисление ROWNUM, как показано на рисунке 18, происходит автоматически после выполнения конструкции WHERE. Это позволяет использовать данный номер ROWNUM при организации условия, указываемого после ключевого слова WHERE.

Пример 11. Выбрать информацию о номере и наименовании любого из существующих проектов.

Для получения такой выборки можно использовать запрос вида:

SELECT proj_no, proj_name FROM project WHERE ROWNUM < 2

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