Программирование >>  Руководство по sql 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 105


Результат:

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

ВОПРОСЫ АДМИНИСТРИРОВАНИЯ БАЗ ДАННЫХ

Следующая глава представляет собой обзор ряда оставшихся вопросов управления базами данных: безопасность, транзакции, производительность и целостность.



1 ... 62 63 64 [ 65 ] 66 67 68 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика