- •Раздел 1 sql
- •Раздел 1
- •1 Основные сведения о субд Oracle
- •2. Общие сведения о sql
- •3. Основные правила написания sql-операторов
- •4. Инструкции dml
- •5. Инструкция select
- •6. Предложения select и from
- •7. Отбор строк (предложение where)
- •8. Многотабличные запросы
- •9. Многотабличные запросы на выборку в Oracle
- •10. Предложения group by и having
- •11. Статистические функции
- •12. Подчиненные запросы (подзапросы)
- •13. Добавление данных (инструкция insert)
- •14. Удаление данных (инструкция delete)
- •15. Обновление данных (инструкция update)
- •16. Инструкции ddl
- •17. Стандартные Типы данных sql
- •18. Создание таблиц (инструкция create table)
- •19. Удаление таблицы (инструкция drop table)
- •20. Изменение определения таблицы (инструкция alter table)
- •21. Условия целостности данных
- •22. Создание представлений
- •23. Псевдонимы таблиц (инструкции create / drop synonym)
- •24. Индексы (инструкции create/drop index)
- •25. Последовательности (инструкция create/drop sequence)
- •26. Транзакции
- •27. Журнал транзакций. Проблемы обработки параллельных транзакций
- •28. Блокировки транзакций
- •29. Понятие транзакции и виды блокировок Oracle
- •30. Концепция многоверсионной модели согласованности по чтению
- •31. Управление транзакциями в Oracle
- •32. Принципы защиты данных в стандартном sql (без редакции)
- •33. Разрешение и запрещение ролей
- •34. Способы обеспечения безопасности в Oracle
- •Аутентификация
- •Профили
- •Привилегии
- •Для предоставления системных привилегий или ролей:
- •Для предоставления привилегий доступа к объектам схемы:
- •Для изъятия системных привилегий или ролей:
- •Для изъятия привилегий доступа к объектам:
- •Другие возможности обеспечения безопасности
8. Многотабличные запросы
Одна из наиболее важных особенностей запросов SQL - это их способность определять связи между многочисленными таблицами и выводить всю информацию из них в терминах этих связей, внутри одной команды. Этот вид операции называется – соединением (JOIN).
Чтобы понять, как в SQL реализуются многотабличные запросы, рассмотрим запрос, который соединяет данные из двух различных таблиц.
Составить список всех сотрудников, работающих в Минском отделении.
SELECT fname, lname, position, S.tel_no
FROM branch B, staff S
WHERE B.bno=S.bno AND city=‘Минск’;
При отработке запроса СУБД должна произвести ряд действий, связанных с соединением таблиц branch и staff. Так сначала просматривается столбец city с целью фильтрации строк со значениями отличными от значения ‘Минск’, далее для отфильтрованных строк таблицы определяются значения столбца bno как идентификаторов Минских отделений. После этого просматривается таблица staff F с целью выявления строк со значениями в столбце bno соответствующими идентификатору первого выявленного Минского офиса. В найденных строках оставляются значения столбцов указанных после ключевого слова SELECT . Далее эта же таблица просматривается для выявления строк соответствующих “второму” Минскому офису и т. д. до последнего. В итоге формируется таблица результатов с запрошенной информацией.
Отметим некоторые особенности многотабличных запросов. Как видно из примера, в многотабличном запросе часто используются полные имена столбцов, при этом в предложении FROM указываются псевдонимы таблиц, чтобы упростить обращение к столбцам по полному имени, а также обеспечить однозначность ссылок на столбцы. Кроме этого особый смысл может иметь выбор всех столбцов (SELECT *), например:
SELECT staff.*, area, city
FROM staff s, branch b
WHERE b.bno=s.bno;
Помимо объединения двух таблиц SQL допускает также объединение трёх и более таблиц. Ограничений по количеству объединяемых таблиц ни стандарт, ни разработчики СУБД не предусматривают, однако следует иметь в виду, что при увеличении количества объединяемых таблиц в запросе снижается его “читабельность” и скорость выполнения в силу значительного увеличения затрат ресурсов и машинного времени при его обработке.
В приложениях, предназначенных для оперативной обработки транзакций (OLTP), запрос обычно ссылается только на одну или две таблицы. В этих приложениях время ответа является критичной величиной, пользователь, как правило, вводит один или два элемента данных, и ему требуется получить ответ от базы данных в течение одной или двух секунд.
В OLAP-приложениях, предназначенных для поддержки, принятия решений, запрос, как правило, обращается ко многим таблицам и использует сложные отношения, существующие в базе данных. В этих приложениях результаты запроса нужны для принятия важных решений, поэтому вполне приемлемыми считаются запросы, которые выполняются несколько минут и более.
Кроме того, комбинирование результирующих таблиц можно осуществлять с помощью операторов UNION – объединение, INTERSECT – пересечение, EXCEPT (minus) – разность.
При этом на таблицы накладываются определенные ограничения, т.е. таблицы должны быть совместимы по соединению – иметь одну и ту же структуру: одинаковое количество столбцов, в столбцах размещаются данные одного типа и длины.
Обязанность проверять принадлежность данных к одному домену возлагается на пользователя. Общий синтаксис применения операторов комбинирования:
Operator[all][corresponding[by{column1[, …]}]]
Пример. Вывести список всех регионов, в которых либо находится отделение компании, либо располагаются сдаваемые в аренду объекты:
(SELECT area
FROM branch
WHERE area IS NOT NULL)
UNION
(SELECT area
FROM property_for_rent
WHERE area IS NOT NULL);
Пример. Вывести список всех городов, в которых находятся и отделение компании и сдаваемые в аренду объекты:
(SELECT city
FROM branch)
INTERSECT
(SELECT city
FROM property_for_rent);
Пример. Вывести список всех городов, в которых находятся отделения компании, но нет сдаваемых в аренду объектов:
(SELECT city
FROM branch)
EXCEPT
(SELECT city
FROM property_for_rent);
Все эти примеры можно реализовать и по-другому, без использования операторов комбинирования запросов. Возможность использования нескольких эквивалентных форм – один из самых существенных недостатков языка SQL.