|
Программирование >> Руководство по sql
Результат: title advance gross sales PC8888 8000.0000~ зГэОО. OOOo PC1035 7000.0000 201501.0000 TC3218 7000.0000 7856.2500 PS1372 7000.0000 8096.2500 Представьте себе, что означало бы обновление столбца gross saIes. Как могла бы система получить значения цены и объема продаж за последний год до текущей даты, исходя из произвольного значения, которое вы могли бы ввести? Таким образом, обновления для этого курсора объявляются недопустимыми. Теперь обратимся к курсору, определение которого включает предложение GROUP BY. Такие курсоры (и любой курсор, полученный из них) называются сгруппированными курсорами (grouped views). На сгруппированные курсоры может налагаться множество офаничений (это зависит от конкретной версии SQL, которой вы пользуетесь). Ниже приведен оператор, определяющий такой курсор: SQL: create view categories (Category, Average Price) as select type, avg(price) from titles group by type A вот как выглядит сам курсор: SQL: select * from categories Результат: Category Average Price UNDECIDED NULL business 13.730 mod cook 11.490 popular comp 21.475 psychology 13.504 trad cook 15.963 Нет никакого смысла вставлять в курсор categories новые сфоки. Какой фуппе должна принадлежать вставляемая сфока? Недопустимо также выполнять какие-либо обновления по отнощению к столбцу Average Pnce, поскольку из любого значения, которое вы могли бы ввести в него, невозможно узнать, как должны измениться исходные цены. Теоретически, конечно, можно допустить обновления в столбце Category и удаления сфок, но такие действия не поддерживаются многими версиями SQL. Некоторые диалекты SQL налагают ограничения не только на обновление Сфуппированных курсоров, но и на запросы к ним. Например, в таких реализациях SQL следующий запрос был бы недопустимым: SQL (возможно, недопустимый): select * from categories where Average Price > $12.00 Проблемы с этим запросом возникают при его интерпретации: результирующий оператор SELECT является недопустимым, поскольку в операторе WHERE не допускается использование афегирующих функций. Вот как мог бы выглядеть такой (недопустимый) оператор; SQL (недопустимый): select type, avg(price) from titles where avg(price) > $12.00 group by type Еще одно ограничение на модификации курсоров запрещает выполнение обновлений и вставок данных в курсор, если соответствующий оператор модифицирует столбцы, получаемые из более чем одного объекта. Это связано с тем, что в одном операторе не допускается выполнение обновления более чем одного объекта. Некоторые системы позволяют модифицировать курсор, если при этом изменяются столбцы только одной из таблиц, на которых он основан. Если, например, курсор содержит три столбца из таблицы titles и два столбца из таблицы publishers, эти системы разрешили бы выполнить операцию обновления для курсора, если бы она изменяла только столбцы из таблицы titles. Но нельзя выполнить оператор UPDATE, который изменял бы один столбец из таблицы titles и один столбец из таблицы publishers. СОЗДАНИЕ КОПИЙ ДАННЫХ Мы обращали ваше внимание в этой главе на то обстоятельство, что курсоры являются не копиями данных, а виртуальными объектами, с которыми не ассоциируются какие-либо физические данные. Если все, что вам требуется, это независимая копия данных, выясните, какие возможности в этом отношении предоставляет ваша система. Transact-SQL реализует эту функцию посредством предложения INTO в операторе SELECT. Он позволяет вам определить таблицу и поместить в нее данные (основываясь на существующих определениях и данных), не проходя при этом через обычный процесс определения данных. Новая таблица (созданная в операторе INTO) основывается на столбцах, указанных вами в списке выбора, таблице (таблицах), имя которой вы указали в предложении FROM, и строках, выбранных вами в предложении WHERE. Однако это использование оператора INTO не является широко распространенным, и следующие примеры относятся только к Transact-SQL. Представим, например, что вам требуется новая таблица, называемая newbooks, которая состоит из двух столбцов, взятых из таблицы titles, и некоторого подмножества ее строк. Вот как можно ее создать; SQL: select title id, type into newbooks from titles where price >$20 A вот как будет выглядеть таблица newbooks: SQL: select * from newbooks Результат: title id type PC1035 popular comp TC3218 trad cook PS1372 psychology Эта новая таблица с реальной (физической) копией данных из родительской таблицы становится частью базы данных. На данные в родительской таблице это никоим образом не влияет. Оператор SELECT INTO может оказаться полезным при создании тестовых таблиц, новых таблиц, которые напоминают уже существующие таблицы, и таблиц, содержащих все или некоторые из столбцов других таблиц. Оператор SELECT INTO можно также использовать для создания таблицы-щаблона, не содержащей никаких данных. Для этого достаточно поместить в предложение WHERE какое-либо ложное условие. Например: SQL: select * into newpubs from publishers where 1=2 SQL: select * from newpubs Результат: pub id pub name address city state ВОПРОСЫ АДМИНИСТРИРОВАНИЯ БАЗ ДАННЫХ Следующая глава представляет собой обзор ряда оставшихся вопросов управления базами данных: безопасность, транзакции, производительность и целостность.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |