Дополнительные аспекты SQL
Перед тем как завершить это руководство, нужно упомянуть о более «продвинутых» темах из SQL, с которыми вы можете столкнуться.
Представления
Некоторые SQL-серверы позволяют создавать различные представления (views) таблицы, которые похожи на волшебные постоянные запросы SELECT. Когда вы создаете представление при помощи специального запроса SELECT, результаты запроса не исчезают и ведут себя как отдельная таблица. Как ко всякой таблице, к ним можно посылать запросы. Изменения представлений с некоторыми ограничениями передаются оригинальной таблице или таблицам.
Заметьте, я сказал таблицам. Именно тут проявляется волшебство представлений: можно создать представление таблицы, состоящее из объединения этой и другой таблицы. Такое представление ведет себя как одна большая виртуальная таблица. Изменения представления передаются обратно таблицам, участвующим в объединении, создающем представление.
Можно также создать представление, новое поле которого будет состоять из результатов вычислений между другими полями этой таблицы, почти как в электронных таблицах. Представления полезны и для более обычных целей, например, для упрощения запросов (т. е. можно будет выбрать меньшее количество полей) и реструктуризации дан ных (т. е. представление данных остается первоначальным, даже если меняются поля в структуре таблицы).
Вот как создать представление, используемое для упрощения запросов:
USE sysadm
CREATE VIEW ipddr_vie/,- AS SELEC''" nde. loaddr FROM hosts
Теперь можно применить очень простой запрос, чтобы получить только ту информацию, которая нам нужна:
USE sysadm
SELECT FROM maddr view
А вот результат запроса:
name ipaddr
shimmer 192.168.1.11
bendir 192.168,1.3
sander 192.168. 1 55
Sulawesi 192 168,1,12
Как и таблицы, представления можно удалять, используя раоновидность команды DROP:
USE sysadm
DROP VIEW ipaddr_view
Курсоры
До сих пор сервер возвращал все результаты запроса по его завершении. Иногда бывает предпочтительнее получать ответ построчно. Чаще всего это справедливо при встраивании SQL-запросов в другие программы. Если запрос возвращает десятки тысяч строк, очень велика вероятность, что вам захочется обработать результаты построчно, а не хранить все в памяти для дальнейшего использования. Этот метод применяется в большинстве случаев, когда необходимо обращаться к SQL из Perl. Вот маленькая программа на SQL, в которой показано употребление курсоров на сервере Sybase или MS-SQL:
USE sysadm
-- объявляем переменные DECLARE (ahostname character(30) DECLARE @ip character(15)
-- объявляем курсор
DECLARE hosts_curs CURSOR FOR SELECT name,ipaddr FROM hosts
-- открываем курсор OPEN hosts_curs
-- обходим в цикле таблицу, получая по одной строке за один раз -- до тех пор, пока не получим ошибку FETCH hosts_curs INTO shostname,gip WHILE (@@fetch_status = 0) BEGIN
PRINT "----"
PRINT (Briostriame
PRINT @ip
FETCH hosts_curs INTO Shostname.^iD END -- закрываем курсор (это не обязательно если -- далее следует DEALLOCATE) CLOSE hosts._curs
-- снимаем определение (unde'ine) курсора DEALLOCATE hosts_curs
В результате получается следующее:
shimmer 192.163.1.11
bendir 192.168.1.3
sander 192.168.1.55
Sulawesi 192.168.1.12
Хранимые процедуры
Большинство систем баз данных позволяют загружать на сервер SQL код, где он хранится в оптимизированном, проанализированном виде для быстрого выполнения. Такой код называется хранимыми процедурами (stored procedures). Хранимые процедуры часто являются важ
ным компонентом SQL для администраторов, поскольку на них основана большая доля управления сервером. Например, чтобы изменить владельца базы данных sysadm в Sybase, нужно выполнить следующее:
USE sysadm sp_changedbowner "jay"
Примеры вызова хранимых процедур можно найти в главе 7. Теперь, когда вы знакомы с основами SQL, можно браться и за нее.