КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Многотабличные запросы
Одна из наиболее важных особенностей запросов SQL - это их способность определять связи между многочисленными таблицами и выводить всю информацию из них в терминах этих связей, внутри одной команды. Этот вид операции называется – соединением (JOIN). Чтобы понять, как в SQL реализуются многотабличные запросы, рассмотрим запрос, который соединяет данные из двух различных таблиц. Составить список всех сотрудников, работающих в Минском отделении. SELECT fname, lname, position, S.tel_no FROM branch B, staff S WHERE B.bno = S.bno AND city ='Minsk';
Представленный в примере синтаксис соединения является классическим синтаксисом, который используется в СУБД Oracle. При отработке запроса СУБД должна произвести ряд действий, связанных с соединением таблиц branch и staff. Так сначала просматривается столбец city с целью фильтрации строк со значениями отличными от значения Minsk, далее для отфильтрованных строк таблицы определяются значения столбца bno как идентификаторов Минских отделений. После этого просматривается таблица staff с целью выявления строк со значениями в столбце bno соответствующими идентификатору первого выявленного Минского офиса. В найденных строках оставляются значения столбцов указанных после ключевого слова SELECT. Далее эта же таблица просматривается для выявления строк соответствующих второму Минскому офису и т. д. до последнего. В итоге формируется таблица результатов с запрошенной информацией. Отметим некоторые особенности многотабличных запросов. Как видно из примера, в многотабличном запросе часто используются полные имена столбцов, при этом в предложении FROM через пробел указываются псевдонимы таблиц, чтобы упростить обращение к столбцам по полному имени, а также обеспечить однозначность ссылок на столбцы. Кроме этого особый смысл может иметь выбор всех столбцов (SELECT *), например в Oracle поддерживается следующий синтаксис:
SELECT s. *, city FROM staff s, branch b WHERE b.bno = s.bno;
Помимо соединения двух таблиц SQL допускает также соединение трёх и более таблиц. Ограничений по количеству соединяемых таблиц ни стандарт, ни разработчики СУБД не предусматривают, однако следует иметь в виду, что при их увеличении в запросе снижается его «читабельность» и скорость выполнения в силу значительного увеличения затрат ресурсов и машинного времени при обработке. В приложениях, предназначенных для оперативной обработки транзакций (OLTP), запрос обычно ссылается только на одну или две таблицы. В этих приложениях время ответа является критичной величиной, пользователь, как правило, вводит один или два элемента данных, и ему требуется получить ответ от базы данных в течение одной или двух секунд. В OLAP-приложениях, предназначенных для поддержки, принятия решений, запрос, как правило, обращается ко многим таблицам и использует сложные отношения, существующие в базе данных. В этих приложениях результаты запроса нужны для принятия важных решений, поэтому вполне приемлемыми считаются запросы, которые выполняются несколько минут и более. Кроме того, комбинирование таблиц в запросе можно осуществлять с помощью операторов UNION – объединение, INTERSECT – пересечение, EXCEPT (minus) – разность. При этом на таблицы накладываются определенные ограничения. Объединяемые таблицы должны быть совместимы, т.е. иметь одинаковое количество столбцов, а данные в столбцах должны быть одного типа и длины. Обязанность проверять принадлежность данных к одному домену возлагается на пользователя. Общий синтаксис применения операторов комбинирования:
Operator[all][corresponding[by{ column1 [, …]}]];
Пример. Вывести список городов, в которых либо находится отделение компании, либо располагаются сдаваемые в аренду объекты:
SELECT city FROM branch WHERE city IS NOT NULL UNION SELECT city FROM property_for_rent WHERE city IS NOT NULL;
Отметим, что по умолчанию оператор UNION удаляет все повторяющиеся записи (как DISTINCT) и получить полный набор записей можно используя конструкцию UNION ALL. Пример. Вывести список всех городов, в которых находятся и отделение компании и сдаваемые в аренду объекты:
SELECT city FROM branch INTERSECT SELECT city FROM property_for_rent;
Пример. Вывести список всех городов, в которых находятся отделения компании, но нет сдаваемых в аренду объектов: SELECT city FROM branch MINUS SELECT city FROM property_for_rent;
Все эти примеры можно реализовать и по-другому, без использования операторов комбинирования запросов. Возможность использования нескольких эквивалентных форм запроса – один из самых существенных недостатков языка SQL.
Дата добавления: 2014-01-04; Просмотров: 408; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |