(SQL) (SQL. Справочник, 3-е издание)
(SQL) (SQL. Справочник, 3-е издание)
СПРАВОЧНИК
3- вает QL и
Ох Post
ва gre
е My SQ
ты S
из SQ L S
да L, O erv
третье издание
Издание представляет собой настольный справочник по языку SQL, исполь-
ни rac er
зуемому в наиболее популярных на сегодняшний день СУБД. Книга содержит
е le,
полный алфавитный перечень операторов SQL с приведением описания реа-
лизации каждого из них.
В этой книге вы найдете:
SQL
• Историю реляционной модели данных, а также текущего и предыдущих стандар-
тов SQL.
• Основные концепции, необходимые для понимания реляционных баз данных
и команд SQL.
• Алфавитный справочник операторов SQL согласно стандарту ANSI SQL2003.
• Описание реализации каждого оператора в MySQL, Oracle, PostgreSQL и SQL Server.
• Алфавитный справочник функций SQL согласно стандарту ANSI SQL2003, с описа-
нием особенностей реализации.
• Описание специфических функций, реализованных в той или иной СУБД.
Справочник подготовлен профессиональными администраторами и опытными раз-
работчиками, использующими различные варианты SQL для поддержки сложных кор-
поративных приложений. Основная задача этого издания – служить кроссплатфор-
менным руководством для людей, не являющихся экспертами, но занимающихся пере-
СПРАВОЧНИК
носом кода (вк лючая пользовательские приложения) меж ду различными СУБД.
Независимо от того, является ли читатель новичком в SQL или имеет значительный
опыт его использования, он найдет много полезных советов и приемов в этой лако-
ничной и удобной в использовании книге.
Кевин Кляйн – директор по решениям для SQL Server в компании Quest Software,
занимающейся разработкой инструментов для управления базами данных и монито-
ринга приложений.
Дэниэл Кляйн – профессор и председатель аспирантуры в университете Анкориджа
штата Аляска.
СПРАВОЧНИК
Брэнд Хант – директор по архитектуре и проектированию в Merril Lynch.
ISBN 978-5-93286-165-3
Third edition
Kevin E. Kline
with Daniel Klien & Brand Hunt
SQL
СПРАВОЧНИК
Третье издание
Кевин Е. Кляйн,
Дэниэл Кляйн и Брэнд Хант
СанктПетербург–Москва
2010
Кевин Кляйн, Дэниэл Кляйн и Брэнд Хант
SQL. Справочник, 3 е издание
Перевод Е. Демьянова, А. Слинкина
Главный редактор А. Галунов
Зав. редакцией Н. Макарова
Выпускающий редактор П. Щеголев
Научный редактор А. Рындин
Редактор Ю. Бочина
Корректор С. Минин
Верстка Д. Орлова
ISBN 9785932861653
ISBN 9780596518844 (англ)
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2. Основные концепции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Рассматриваемые СУБД. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Категории синтаксиса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Идентификаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Литералы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Зарезервированные и ключевые слова . . . . . . . . . . . . . . . . . . . . . . . . . 44
SQL2003 и типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Типы данных MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Типы данных Oracle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Типы данных PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Типы данных SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Ограничения целостности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Область применения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Синтаксис. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Первичные ключи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Внешние ключи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Уникальные ключи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Проверочные ограничения целостности . . . . . . . . . . . . . . . . . . . . . . . . 73
6 Оглавление
С момента появления в 1970х годах развитие языка SQL (structured query lan
guage, структурированный язык запросов) шло в параллели с информационным
бумом, и в результате SQL стал самым широко используемым языком управле
ния базами данных. Множество компаний и отдельных разработчиков, включая
разработчиков ПО с открытым кодом (http://www.opensource.org), создали свои
диалекты SQL в соответствии со своими потребностями. В то же время комите
ты, занимающиеся стандартами, разрабатывали растущий список стандартных
возможностей.
В этом справочнике описываются все операторы SQL согласно последнему стан
дарту ANSI SQL2003(SQL3), а также особенности реализации этих операторов
в различных СУБД. В этой книге вы найдете описание реляционных моделей
данных, объяснение основных концепций реляционных СУБД, полное описание
синтаксиса SQL.
Но самое главное, особенно для программиста или разработчика (проектировщи
ка ПО), это то, что эта книга является справочником по двум самым популярным
коммерческим СУБД (Microsoft SQL Server и Oracle) и двум самым известным
СУБД с открытым кодом (MySQL и PostgreSQL). Внимание, уделяемое в этой
книге системам с открытым кодом, отражает возрастающую важность таких сис
тем для компьютерного сообщества.
Синтаксис SQL, описанный в этой книге, включает следующие варианты реали
зации:
• В соответствии со стандартом ANSI SQL2003 (SQL3)
• MySQL версии 5.1
• Oracle Database 11g
• PostgreSQL версии 8.3
• Microsoft SQL Server 2008
команды в стандарте SQL3. Однако мы верим, что это все же лучше, чем заби
вать книгу сотнями страниц повторяющейся информации.
Ресурсы
На следующих вебсайтах можно найти дополнительную информацию о плат
формах, рассматриваемых в этой книге:
MySQL
Корпоративным ресурсом по MySQL является http://www.mysql.com, еще один
хороший сайт http://dev.mysql.com/doc/refman/5.1/en/. Хорошим ресурсом
для разработчиков с множеством полезных примеров является Devshed.com
Ищите информацию по MySQL по ссылке http://www.devshed.com/c/b/MySQL.
PostgreSQL
Домашняя страница этой СУБД с открытым кодом расположена на http://
www.postgresql.org. Помимо огромного количества информации для скачива
ния на сайте поддерживается рассылка для пользователей PostgreSQL. Дру
гой достойный внимания сайт, предлагающий также поддержку коммерче
ским пользователям, – http://www.pgsql.com.
Oracle
Портал Oracle расположен на http://www.oracle.com. Огромное количество
информации для постоянных пользователей Oracle находится по адресу http://
www.oracle.com/technology/. Вся документация доступна по ссылке http://
www.oracle.com/technology/documentation/index.html. Для полезной инфор
мации об Oracle от независимых источников посетите сайт Independent Oracle
User Group http://www.ioug.org.
SQL Server
Официальный сайт Microsoft SQL Server http://www.microsoft.com/sql/. Дру
гой хороший ресурс расположен на сайте Профессиональной ассоциации
пользователей SQL Server (PASS) http://www.sqlpass.org.
Благодарности
Мы хотели бы поблагодарить нескольких человек из издательства O’Reilly Me
dia. В первую очередь, мы испытываем огромную благодарность к Джулии Стил
(Julie Steel), редактору третьего издания. Джулия не давала нам расслабиться,
и благодаря ей мы закончили то, что начали. Благодаря ее мягкому и предупре
дительному стилю с Джулией было очень приятно работать. Спасибо тебе за все,
что ты для нас сделала!
Также мы благодарим наших замечательных технических рецензентов: Питера
Гулутзана (Peter Gulutzan), который отвечал за стандарт SQL и работал с нами
еще со второго издания; Томаса Локхарта (Thomas Lockhart), специалиста по
PostgreSQL; Рональда Брэдфорда (Ronald Bradford) – Oracle/MySQL и Ричарда
Соннена (Richard Sonnen) – Oracle. Сердечное спасибо! Вы внесли существенный
вклад в точность, удобочитаемость и ценность этой книги. Без вас наши разделы
о расширениях языка были бы неполными. В дополнение снимаем шляпу перед
Питером Гулутзаном и Труди Пельтцер (Trudy Pelzer) за их книгу «SQL99 Com
plete, Really!», которая помогла нам разобраться в стандарте SQL3.
Холл (Jason Hall), Эриэл Вэйл (Ariel Weil) и многие другие мои друзья из Quest
Software, – спасибо, что сделали эти последние шесть лет в Quest Software таки
ми яркими!
Посвящаю эту книгу своим любимым Дилану, Эмили, Анне и Кэти. Вы были мо
ей надеждой, дыханием и светом в моменты, когда казалось, что в мире уже не
оставалось ни надежды, ни дыхания, ни света. Спасибо, что любите меня так
сильно и бескорыстно. И наконец, спасибо моей драгоценнейшей Рэйчел – твоя
любовь сохранила мое сердце и веру.
Каталог – это именованный набор схем. Если вы знакомы с Oracle или Microsoft
Каталоги
SQL Server, то вам, вероятно, привычнее употреблять термин «экземпляр».
Cодержит один
или несколько
Cодержит один
или несколько
Представления (правило 6)
Представление – это виртуальная таблица, не хранящая данные физически,
а создаваемая на лету из SQLзапроса каждый раз, когда происходит обращение
к представлению. Представления позволяют создавать несколько разных обра
зов одних и тех же исходных данных для разных пользователей без необходимо
сти модифицировать способ хранения данных.
Johnson White CA
Marjorie Green CA
Cheryl Carson CA
Michael O'Leary CA
Meander Smith KS
Morningstar Greene TN
Reginald Blotchet Halls OR
Innes del Castillo MI
Реляционная модель и ANSI SQL 23
Meander Smith KS
Morningstar Greene TN
Reginald Blotchet Halls OR
Innes del Castillo MI
Комбинируя операции проекции и выборки в одном запросе, вы можете с помо
щью SQL выбрать только те строки и столбцы, которые вам нужны.
Последняя реляционная операция, которую мы обсудим в этом разделе, – это со
единение. Соединение связывает две таблицы и возвращает результирующее
множество, состоящее из данных из обеих таблиц.
titleauthor AS t
WHERE a.au_id = t.au_id
AND a.state <> 'CA'
Для дополнительной информации о соединениях читайте раздел «Фраза JOIN»
в главе 3.
Новое в SQL2006
Комитет ANSI, отвечающий за SQL, выпустил новую версию стандарта в 2006 го
ду, при этом в нем сохранились и были расширены все основные усовершенство
вания стандарта SQL3. Стандарт SQL2006 можно назвать эволюционным по от
ношению к стандарту SQL3, он не внес существенных изменений в команды
и функции языка. Вместо этого стандарт SQL2006 описал новую функциональ
ную область применения стандарта SQL. Если говорить коротко, то SQL2006
описывает взаимодействие SQL и XML. Например, стандарт SQL2006 описывает,
как в реляционную базу импортировать и хранить XML данные, как манипули
ровать этими данными, и как их представлять в виде XML или обычных SQL
данных в XML обертке. Стандарт SQL2006 предоставляет возможности интегра
ции SQL кода с кодом XQuery, языком запросов к XML, стандартизируемым кон
сорциумом W3C. Так как XML и XQuery являются вполне самостоятельными
дисциплинами, они не входят в рамки этой книги и не рассматриваются в ней.
Постоянно работающим с SQL необходимо быть в курсе как старых (SQL92), так
и новых (SQL3) классов, так как оба варианта еще используются при обращении
к SQLоператорам.
Диалекты SQL
Постоянно эволюционирующий SQL породил множество диалектов, используе
мых на разнообразных платформах. Причиной появления диалектов является
то, что пользователям СУБД необходимы новые функции раньше, чем ANSI вы
пустит новый стандарт. Иногда научное и исследовательское сообщество добав
ляет в стандарт новые возможности под давлением со стороны конкурирующих
на рынке технологий. Например, многие разработчики расширяют возможно
сти программирования в своих СУБД при помощи Java (как в случае с DB2, Ora
cle и Sybase) или VBScript (в случае Microsoft). В будущем разработчики будут
использовать эти языки совместно с SQL для разработки SQLпрограмм.
Многие диалекты содержат условные операторы (такие как IF…THEN), возмож
ности управления потоком выполнения (циклы WHILE), переменные и возмож
ности обработки ошибок. Так как всех этих возможностей не было в стандарте
на момент возникновения потребности в них со стороны пользователей, то раз
работчики предложили свои собственные команды и синтаксис. В реальности,
у некоторых разработчиков из ранних 80х есть различия в синтаксисе даже эле
ментарных команд (например, SELECT), так как их реализации предшествова
ли стандарту. ANSI в данное время уточняет стандарт для устранения этих несо
ответствий.
В некоторых диалектах представлена функциональность, делающая их более
близкими к языкам процедурного программирования. К примеру, процедурные
возможности этих диалектов SQL могут содержать команды обработки ошибок,
команды управления потоком выполнения, условные команды, переменные, мас
сивы и многое другое. В этой книге мы все эти возможности будем называть диа
лектами, хотя они, по сути, являются процедурными расширениями SQL. Пакет
SQL/PSM из стандарта описывает различные возможности, связанные с храни
мыми процедурами, и содержит многие расширения, предлагаемые диалектами.
Вот несколько распространенных диалектов:
PL/SQL
Используется в Oracle. Сокращение обозначает Procedural Language/SQL.
Диалект во многом похож на язык программирования Ada.
Transact0SQL
Используется в Microsoft SQL Server и Sybase Adaptive Server. С тех пор как
в начале 1990х Microsoft и Sybase начали развивать разные платформы, их
реализации TransactSQL также начали отличаться.
PL/pgSQL
Расширение SQL, реализованное в PostgreSQL. Сокращение расшифровыва
ется как Procedural Language/PostgreSQL.
Пользователи, планирующие плотно работать с одной СУБД, должны изучить
все особенности диалекта, используемого этой платформой.
2
Основные концепции
Рассматриваемые СУБД
В этом издании справочника описывается стандарт SQL и его реализация не
сколькими ведущими поставщиками реляционных СУБД:
MySQL
MySQL – популярная СУБД с открытым кодом, которая известна своей мол
ниеносной производительностью. СУБД работает на множестве операционных
систем, включая большинство Linuxсистем. По причине основного акцента
на скорости работы она поддерживает набор возможностей уже, чем у конку
рентов. В этой книге рассматривается MySQL версии 5.1.
Oracle
Oracle является лидирующей СУБД на рынке. Работает практически на лю
бых операционных системах и серверах. Благодаря своей масштабируемой
и надежной архитектуре эта СУБД стала выбором многих пользователей.
В этом издании мы рассматриваем Oracle 11g.
PostgreSQL
PostgreSQL является системой с самыми богатыми возможностями среди
всех СУБД с открытым кодом. В то время как MySQL известен высокой произ
водительностью, PostgreSQL снискал славу за прекрасную поддержку стан
дарта ANSI, надежную работу с транзакциями, богатый набор поддерживае
мых типов данных и объектов. В дополнение к богатым возможностям Post
greSQL также поддерживает широкий список операционных систем и аппа
ратных платформ. В этой книге рассматривается PostgreSQL 8.2.1.
Категории синтаксиса 31
SQL Server
Microsoft SQL Server является популярной СУБД, доступной только под опе
рационную систему Windows. Особенностями СУБД являются простота ис
пользования, широчайший набор возможностей, низкая стоимость и высо
кая производительность. В этой книге мы рассматриваем Microsoft SQL Ser
ver 2008.
Категории синтаксиса
Чтобы начать использовать SQL, необходимо понять, как пишутся операторы.
Синтаксис SQL разбивается на четыре основных категории. Категории перечис
ляются в следующем списке, а затем детально рассматриваются в дальнейших
разделах:
Идентификаторы
Пользовательское или системное имя объекта базы данных, например самой
базы данных, таблицы, ограничения, столбца, представления и т. п.
Литералы
Любое пользовательское или системное значение, не являющееся идентифи
катором или ключевым словом. Литералы могут быть строковыми («при0
вет»), числовыми (1234), датами (1 января 1980), или булевыми (TRUE).
Операторы
Обозначения, описывающие действия, которые необходимо выполнить над
одним или несколькими выражениями. Операторы, как правило, использу
ются в командах INSERT, DELETE, SELECT и UPDATE. Также операторы
часто используются при создании объектов в базе данных.
Зарезервированные и ключевые слова
Имеют особое значение для синтаксического анализатора SQL. Ключевые сло0
ва, такие как SELECT, GRANT, DELETE или CREATE, не могут использо
ваться в СУБД в качестве идентификаторов. Обычно они являются команда
ми или SQLоператорами. Зарезервированные слова – это слова, которые мо
гут в будущем стать ключевыми словами. В дальнейшем при разговоре о лю
бой из этих двух концепций мы будем употреблять только термин ключевое
слово. Вы можете обойти ограничение на запрет использования ключевых
слов в качестве идентификаторов при помощи идентификаторов, взятых в ка
вычки (обсуждаемых далее). Но так поступать не рекомендуется.
Идентификаторы
Помните, что реляционные СУБД построены на базе теории множеств. В терми
нах ANSI кластеры содержат множества каталогов, каталоги содержат множе
ства схем, схемы содержат множества объектов и так далее. Большинство СУБД
используют похожие термины: экземпляры СУБД содержат одну или несколько
баз данных, базы данных содержат одну или несколько схем, схемы содержат
одну или несколько таблиц, представлений, хранимых процедур или привиле
гий доступа к объектам. На каждом уровне этой иерархии элементам требуются
уникальные названия (идентификаторы), чтобы к этим элементам можно было
32 Глава 2. Основные концепции
обращаться из программ или системных процессов. Это значит, что каждый объ
ект (независимо от того, является ли он базой данных, таблицей, представлени
ем, столбцом, индексом, ключом, триггером, хранимой процедурой или ограни
чением) должен быть идентифицирован. При запуске команды на создание объ
екта вы должны указать идентификатор (т. е. имя) этого нового объекта.
Опытные программисты при выборе идентификаторов руководствуются двумя
наборами правил:
Правила именования
Логические правила, используемые проектировщиками баз данных на прак
тике. Постоянное следование этим правилам приводит к более ясной и управ
ляемой структуре базы данных. Это не столько требования SQL, сколько ре
зультат жизненного опыта программистов.
Ограничения на идентификаторы
Ограничения, наложенные стандартом SQL и различными реализациями. На
пример, это могут быть ограничения на допустимую длину идентификатора.
Подробнее ограничения каждой СУБД рассматриваются далее в этом разделе.
Правила именования
Правила именования описывают базовые соображения, которыми необходимо
руководствоваться при выборе идентификатора объекта. В этом разделе мы при
водим правила именования, созданные на базе нашего многолетнего опыта. Стан
дарт SQL не накладывает никаких ограничений, кроме ограничений на уни
кальность и длину идентификатора и на набор допустимых к использованию
символов. Но вам желательно придерживаться также следующих правил:
Выбирайте осмысленные и содержательные названия
Не называйте таблицу XP05; вместо этого используйте название Expen
ces_2005 для указания того, что в таблице хранятся расходы за 2005 год.
Помните, что, возможно, спустя долгое время после вашего ухода другие лю
ди будут пользоваться этой базой данных и этой таблицей, и введенные вами
имена объектов должны быть понятными с первого взгляда. Все СУБД имеют
ограничения на длину идентификатора, но обычно идентификатор можно
сделать достаточно длинным и понятным каждому.
Используйте везде один и тот же регистр символов
Для именования всех объектов используйте либо только верхний регистр
символов, либо только нижний. Некоторые СУБД чувствительны к регистру
символов, и идентификаторы со смешанными регистрами символов могут
впоследствии стать источником проблем.
Будьте последовательны в применении аббревиатур
Однажды выбрав сокращение, используйте его повсеместно. Например, одна
жды употребив сокращение EMP вместо EMPLOYEE, используйте его везде;
не нужно в одном месте употреблять EMP, а в другом EMPLOYEE.
Для лучшей читаемости используйте подчеркивания
Название столбца UPPERCASEWITHUNDERSCORES читается не так легко,
как UPPERCASE_WITH_UNDERSCORES.
Категории синтаксиса 33
Ограничения на идентификаторы
Ограничения на идентификаторы – это ограничения, накладываемые конкрет
ной платформой СУБД. Эти ограничения касаются только обычных идентифи
каторов, а не заключенных в кавычки. Ограничения стандарта SQL2003 отлича
ются от тех, что реализованы разработчиками. В табл. 2.1 проводится сравнение
34 Глава 2. Основные концепции
Литералы
В SQL литералом называется любое явно заданное числовое значение, символь
ная строка, временное значение (дата или время) или булево значение, не яв
ляющееся идентификатором или ключевым словом. Реляционные СУБД допус
кают множество различных литералов в SQL программах. Литералы допустимы
для большинства числовых, символьных, булевых и временных типов данных.
К примеру, в SQL Server числовые типы данных включают (в числе прочих) ти
пы INTEGER, REAL и MONEY. Числовые литералы могут выглядеть следую
щим образом:
30
117
+883.3338
6.66
$70000
2E5
7E 3
Как показывает этот пример, в SQL Server допускается использование знаковых
и беззнаковых чисел в обычной и экспоненциальной записи. А так как в SQL
Server есть тип данных MONEY, то можно даже использовать знак доллара ($).
SQL Server не допускает использования любых других символов в числовых ли
тералах (кроме 0 1 2 3 4 5 6 7 8 9 + – $ . E e), поэтому не пытайтесь использовать
запятую (запятая используется в некоторых европейских странах для отделения
десятичных разрядов от целой части). Большинство СУБД интерпретируют за
пятую в числовых литералах как разделитель списка значений. Таким образом,
литерал вида 3,000 вероятнее всего будет воспринят как два отдельных значе
ния: 3 и 000.
Булевы, символьные и временные литералы могут выглядеть следующим обра
зом:
TRUE
'Hello world!'
'OCT 28 1966 22:14:30:00'
Символьные литералы всегда должны быть заключены в одинарные кавычки (‘ ’).
Это стандартный ограничитель для символьных литералов. В символьных лите
ралах можно использовать не только буквы алфавита. На самом деле, в литерале
можно использовать любой символ из таблицы символов. Все это примеры сим
вольных литералов:
'1998'
'70,000 + 14000'
'There once was a man from Nantucket,'
'Oct 28, 1966'
и все эти значения совместимы с типом данных CHAR. Не путайте символьный
литерал ‘1998’ с числовым литералом 1998. Так как символьные литералы свя
заны с символьным типом данных, то неправильно использовать их в арифмети
ческих выражениях без явного преобразования типов данных. Некоторые (но не
38 Глава 2. Основные концепции
Операторы
Оператором называется символ, указывающий какой действие нужно выпол
нить с одним или несколькими выражениями. Операторы чаще всего использу
ются в командах DELETE, INSERT, SELECT и UPDATE, но часто встречаются
также при создании объектов базы данных, таких как хранимые процедуры,
функции, триггеры и представления.
Обычно операторы делят на следующие категории:
Арифметические операторы
Поддерживаются всеми СУБД.
Операторы присваивания
Поддерживаются всеми СУБД.
Битовые операторы
Поддерживаются MySQL и SQL Server.
Операторы сравнения
Поддерживаются всеми СУБД.
Логические операторы
Поддерживаются всеми СУБД.
Унарные операторы
Поддерживаются MySQL, Oracle и SQL Server.
Арифметические операторы
Арифметические операторы выполняют математические действия над двумя
числовыми выражениями. В табл. 2.2 представлен список арифметических опе
раторов.
Операторы присваивания
За исключением Oracle, использующего :=, оператор присваивания (=) при
сваивает значение переменной или псевдониму столбца. Во всех СУБД, рассмат
риваемых в этой книге, ключевое слово AS используется для присваивания псев
донима таблице или столбцу.
Битовые операторы
И в Microsoft SQL Server, и в MySQL имеются битовые операторы (табл. 2.3) для
битовых манипуляций над целочисленными выражениями. Битовые операторы
работают с типами данных BINARY, BIT, INT, SMALLINT, TINYINT и VAR0
BINARY. PostgreSQL поддерживает типы данных BIT и BIT VARYING; а также
битовые операторы AND, OR, XOR, конкатенацию, NOT и сдвиги влево и вправо.
Таблица 2.3. Битовые операторы
Битовый оператор Значение
& Битовое И (два операнда)
| Битовое ИЛИ (два операнда)
^ Битовое исключающее ИЛИ (два операнда)
Операторы сравнения
С помощью операторов сравнения проверяется равенство или неравенство двух
выражений. Результатом операторов сравнения является булево выражение:
TRUE, FALSE или UNKNOWN. Обратите внимание, что согласно стандарту ANSI
оператор сравнения возвращает NULL, если один из операндов также равен
NULL. К примеру, выражение 23+NULL равно NULL, так же как и выражение
23 февраля 2002 + NULL. В табл. 2.4 приведен список операторов сравнения.
Булевы операторы сравнения используются чаще всего во фразе WHERE для от
бора строк, удовлетворяющих условиям поиска. В следующем примере исполь
зуется оператор «больше или равно»:
SELECT *
FROM Products
WHERE ProductID >= 347
40 Глава 2. Основные концепции
Логические операторы
Логические операторы обычно используются во фразе WHERE для проверки ис
тинности различных условий. Они возвращают либо булево значение TRUE, ли
бо FALSE. В табл. 2.5 приводится список булевых операторов. Следует помнить,
что не все СУБД поддерживают полный перечень этих операторов.
Таблица 2.5. Логические операторы
Логический оператор Значение
ALL TRUE, если истинно каждое условие из множества
AND TRUE, если оба булевых выражения истинны
ANY TRUE, если истинно хотя бы одно условие из множества
BETWEEN TRUE, если операнд попадает в заданный интервал
EXISTS TRUE, если подзапрос возвращает хотя бы одну строку
IN TRUE, если операнд равен хотя бы одному выражению из
списка или строке из результата подзапроса
LIKE TRUE, если операнд удовлетворяет шаблону
NOT Заменяет булево значение на противоположное
OR TRUE, если хотя бы одно из двух булевых выражений ис
тинно
SOME TRUE, если истинны какиелибо условия из множества
Унарные операторы
Унарные операторы используются с одним операндом, являющимся выражени
ем любого числового типа. Исключением является битовый унарный оператор
(~), используемый только с целочисленными выражениями (табл. 2.6).
Категории синтаксиса 41
Приоритет операторов
Иногда выражения, состоящие из операторов, имеют очень сложную структуру.
Если выражение состоит из нескольких операторов, то порядок выполнения
операторов определяется приоритетом операторов. Порядок выполнения дей
ствий может влиять на конечный результат.
Операторы имеют разный приоритет. Оператор с более высоким приоритетом
выполняется раньше, чем оператор с более низким приоритетом. В следующем
списке операторы перечислены в порядке убывания их приоритета:
• () (выражение в скобках)
• +, 0, ~ (унарные операторы)
• *, /, % (арифметические операторы)
• +, 0 (арифметические операторы)
• =, >, <, >=, <= , <>, !=, !>, !< (операторы сравнения)
• ^ (битовое исключающее ИЛИ), & (битовое И), | (битовое ИЛИ)
• NOT
• AND
• ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
• = (присвоение переменной)
Если операторы имеют одинаковый приоритет, то они выполняются слева на
право. Для изменения предопределенного порядка выполнения операторов в вы
ражении можно использовать скобки. Сперва вычисляется выражение в скоб
ках, а затем за скобками.
Например, следующие выражения в Oracle вернут разные результаты:
SELECT 2 * 4 + 5 FROM dual
Вычисляется 8 + 5, в результате получается 13.
SELECT 2 * (4 + 5) FROM dual
Вычисляется 2 * 9, в результате получается 18.
Если в выражении используются вложенные скобки, то сначала вычисляется
выражение в наиболее глубоко вложенных скобках.
В следующем примере используются вложенные скобки, наиболее глубоко вло
жено выражение 5 – 3. Результат этого выражения равен 2. Затем применяется
оператор сложения (+) предыдущего результата и 4, получается 6. Наконец, 6 ум
ножается на 2, получается 12:
SELECT 2 * (4 + (5 3) ) FROM dual
Вычисление вложенных скобок дает результат 2 * (4 + 2),
42 Глава 2. Основные концепции
Не каждая платформа поддерживает все типы данных ANSI SQL. В табл. 2.9
последовательно сравниваются типы данных в пяти реализациях. Внимательно
читайте сноски, потому что иногда платформой поддерживается тип с опреде
ленным именем, но при этом реализация отличается от требований стандарта
или от реализации другими разработчиками.
SQL2003 и типы данных 47
BIGSERIAL
Смотрите описание типов SERIAL.
BIT (SQL2003 тип: BIT)
Хранит битовую строку фиксированной длины.
BIT VARYING(n), VARBIT(n) (SQL2003 тип: BIT VARYING)
Хранит битовую строку переменной длины, максимальная длина задается
параметром n.
BOOL, BOOLEAN (SQL2003 тип: BOOLEAN)
Хранит булевы значения (истина/ложь/неизвестно). Для значений желатель
но использовать ключевые слова TRUE и FALSE, хотя PostgreSQL поддержи
вает следующие литералы для обозначения истины: TRUE, t, true, y, yes и 1.
Для ложного значения используются литералы: FALSE, f, false, n, no и 0.
BOX( (x1, y1), (x2, y2) ) (SQL2003 тип: отсутствует)
Хранит координаты прямоугольника на плоскости. Значение хранится
в 32 байтах в формате ((x1, y1), (x2, y2)), задавая противоположные вершины
прямоугольника (верхнюю правую и нижнюю левую соответственно). Внеш
ние скобки опциональны.
BYTEA (SQL2003 тип: BINARY LARGE OBJECT)
Содержит неструктурированные двоичные данные. Часто используется для
хранения изображений, звуков, документов. При хранении требует про
странства в количестве 4 байта плюс размер самих двоичных данных.
CHAR(n), CHARACTER(n) (SQL2003 тип: CHARACTER(n))
Хранит строки фиксированной длины, дополняемые пробелами до размера n.
При попытке вставки строки большего размера произойдет ошибка (если
только лишние символы не являются пробелами и могут быть отброшены,
так что длина строки станет меньше либо равной n).
CIDR(x.x.x.x/y) (SQL2003 тип: отсутствует)
Используется для хранения сетевого адреса протокола IPv4, занимает 12 байт.
Диапазон значений совпадает с множеством допустимых сетевых адресов
IPv4. Данные типа CIDR хранятся в формате x.x.x.x/y, где иксы представля
ют ipадрес, а y задает количество бит в сетевой маске. CIDR не допускает не
нулевых битов справа от нулевых битов в сетевой маске.
CIRCLE(x, y, r) (SQL2003 тип: отсутствует)
Описывает окружность на плоскости. Значение хранится в 24 байтах и пред
ставляется как (x,y,r): x и y задают координаты центра окружности, r задает
величину радиуса. По желанию можно использовать круглые или угловые
скобки в качестве разделителей значений x, y и r.
DATE (SQL2003 тип: DATE)
Хранит дату (год, месяц, день) без указания времени. Для хранения исполь
зуется 4 байта. Диапазон значений от ‘4714 до н.э.’ до ‘32767 н.э.’ Минималь
ное разрешение типа, естественно, равно одному дню.
60 Глава 2. Основные концепции
1 Этот тип данных относится к новым временным типам данных, которые поддержива
ют расширенный диапазон дат. – Прим. науч. ред.
64 Глава 2. Основные концепции
Ограничения целостности
Ограничения целостности позволяют автоматически контролировать целост
ность данных и фильтровать данные, загружаемые в базу данных. Ограничения
являются правилами, определяющими то, какие данные являются корректны
ми результатами работы INSERT, UPDATE и DELETE. Если в результате рабо
ты команды нарушаются ограничения, то такая команда отменяется.
В стандарте ANSI описываются четыре типа ограничений: CHECK, PRIMARY
KEY, UNIQUE и FOREIGN KEY. (Некоторые СУБД предлагают более широкий
перечень, обратитесь к главе 3 за подробностями).
Область применения
Ограничения целостности могут создаваться на уровне таблицы или на уровне
отдельных столбцов.
Ограничения уровня столбца
Объявляются как часть определения столбца и относятся только к этому кон
кретному столбцу.
Ограничения уровня таблицы
Объявляются независимо от определений столбцов (обычно в конце операто
ра CREATE TABLE) и могут относиться к одному или нескольким столбцам.
Ограничение на уровне таблицы необходимо в том случае, когда оно относит
ся к нескольким столбцам.
Синтаксис
Ограничения объявляются при создании или изменении таблицы. Общий син
таксис для ограничений следующий:
CONSTRAINT [имя_ограничения] тип_ограничения
[(столбец[, ...])]
[предикат] [откладываемость]
[начальная_отложенность]
Ниже рассмотрены синтаксические элементы:
CONSTRAINT [имя_ограничения]
Начало объявления ограничения, в котором опционально указывается имя
ограничения. Если имя ограничения не указано, то оно будет сгенерировано
автоматически. На некоторых платформах ключевое слово CONSTRAINT
также необязательно.
тип_ограничения
Устанавливает один из типов ограничения: CHECK, PRIMARY KEY, UNIQUE
или FOREIGN KEY. Более подробная информация по каждому типу ограниче
ний приводится дальше в этой главе.
[(столбец[, ...])]
Связывает ограничение с одним или несколькими столбцами. Столбцы указы
ваются в круглых скобках через запятую. Список столбцов опускается для
ограничений уровня столбца. Список столбцов используется не в каждом типе
ограничений. Например, ограничения CHECK не используют список столбцов.
предикат
Указывает предикат для ограничения типа CHECK.
откладываемость
Описывает ограничение как откладываемое (DEFERRABLE) или неотклады
ваемое (NOT DEFERRABLE). Если ограничение откладываемое, то можно
сделать так, что проверка ограничения будет осуществляться в конце тран
закции. Если ограничение неоткладываемое, то оно проверяется в конце ка
ждого SQL оператора.
начальная_отложенность
Если ограничение является откладываемым, то оно может быть изначально
отложенным (INITALLY DEFERRED) или изначально немедленным (INITI0
ALLY IMMEDIATE). Если указана опция INITIALLY DEFERRED, то про
верка ограничения будет выполняться в конце транзакции, даже если тран
закция состоит из нескольких операторов. В этом случае ограничение долж
ны быть откладываемым (DEFERRABLE). Если же указана опция INITIAL0
LY IMMEDIATE, то проверка ограничения осуществляется после каждого
оператора. В этом случае ограничение может быть как откладываемым (DE0
FERRABLE), так и неоткладываемым (NOT DEFERRABLE). Опцией по
умолчанию является INITIALLY IMMEDIATE.
Имейте в виду, что синтаксис в разных СУБД может отличаться. Читайте де
тальное описание в главе 3 в секциях, относящихся к конкретным платформам.
Первичные ключи
Первичный ключ (PRIMARY KEY) – это ограничение, указывающее, что значе
ния в одном или нескольких столбцах уникально идентифицируют каждую за
пись в таблице. Первичный ключ считается частным случаем ограничения
UNIQUE. Вот основные правила, касающиеся первичных ключей:
• Таблица может иметь только один первичный ключ
• В состав первичного ключа не могут входить столбцы с типами BLOB, CLOB,
NCLOB и ARRAY
• Первичный ключ может быть указан на уровне столбца или на уровне табли
цы (если состоит из нескольких столбцов)
• Значения столбца первичного ключа должны быть уникальны и не содер
жать NULL
Ограничения целостности 69
Внешние ключи
Внешний ключ (FOREIGN KEY) указывает, что один или несколько столбцов од
ной таблицы ссылаются на столбцы первичного или уникального ключа другой
таблицы. (Внешний ключ может ссылаться на ту же таблицу, в которой создан
он сам, но такие ситуации достаточно редки). Внешние ключи предотвращают
ввод данных в таблицу, не имеющих соответствующих значений в связанной таб
лице. Внешние ключи являются основным способом создания связей между таб
лицами в базе данных. Вот некоторые правила, касающиеся внешних ключей:
• В одной таблице может существовать одновременно несколько внешних клю
чей
• Внешний ключ может ссылаться на первичный или на уникальный ключ
другой таблицы для указания связи между таблицами
70 Глава 2. Основные концепции
Полный синтаксис SQL2003 для создания внешних ключей более сложен, чем
общий синтаксис для ограничений, приведенный ранее, и зависит от того, созда
ется ли ограничение на уровне столбца или на уровне таблицы:
Внешний ключ на уровне таблицы
[CONSTRAINT [имя_ограничения] ]
FOREIGN KEY (локальный_столбец[, ...] )
REFERENCES адресуемая_таблица [(адресуемый_столбец[, ...]) ]
[MATCH {FULL | PARTIAL | SIMPLE} ]
[ON UPDATE {NO ACTION | CASCADE | RESTRICT |
SET NULL | SET DEFAULT} ]
[ON DELETE {NO ACTION | CASCADE | RESTRICT |
SET NULL | SET DEFAULT} ]
[откладываемость] [начальная отложенность]
Внешний ключ на уровне столбца
[CONSTRAINT [имя_ограничения] ]
REFERENCES адресуемая_таблица [(адресуемый_столбец[, ...]) ]
[MATCH {FULL | PARTIAL | SIMPLE} ]
[ON UPDATE {NO ACTION | CASCADE | RESTRICT |
SET NULL | SET DEFAULT} ]
[ON DELETE {NO ACTION | CASCADE | RESTRICT |
SET NULL | SET DEFAULT} ]
[откладываемость] [начальная отложенность]
Ключевые слова, используемые при создании стандартного ограничения, были
описаны ранее в разделе «Синтаксис». Специальные ключевые слова, исполь
зуемые при создании внешних ключей, описываются далее:
FOREIGN KEY (локальный_столбец[, ...] )
Указывает, что один или несколько столбцов создаваемой или изменяемой
таблицы составляет внешний ключ. Этот вариант синтаксиса используется
только при создании ограничений на уровне таблицы и не используется на
уровне столбцов. Мы рекомендуем, чтобы порядок следования и типы списка
локальных столбцов совпадали с порядком следования и типами адресуемых
столбцов.
REFERENCES адресуемая_таблица [(адресуемый_столбец[, ...]) ]
Указывает таблицу и набор столбцов, на которые ссылается внешний ключ.
Адресуемые столбцы должны уже быть перечислены либо в первичном клю
че, либо в уникальном ключе, с опцией NOT DEFERRABLE. Типы таблиц
также должны совпадать: если одна таблица является локальной временной
таблицей, то обе таблицы, указываемые при создании внешнего ключа,
должны быть локальными временными.
MATCH {FULL | PARTIAL | SIMPLE}
Определяет необходимую степень соответствия между локальными и адре
суемыми столбцами внешнего ключа при наличии значений NULL:
FULL
Указывает, что соответствие внешнего ключа не нарушается, если: 1) ни
один из ссылающихся столбцов не равен NULL и значения ссылающихся
и адресуемых столбцов совпадают или 2) все ссылающиеся столбцы имеют
Ограничения целостности 71
SET DEFAULT
Указывает, что при удалении или изменении значений первичного или
уникального ключа столбцам внешнего ключа нужно присвоить значения
по умолчанию.
Как и в примере для первичных ключей, вы можете использовать этот общий
синтаксис для создания внешних ключей как уровня столбца, так и уровня таб
лицы. И те и другие действуют абсолютно одинаково, только описываются в раз
ных частях команды CREATE TABLE. В следующем примере мы создаем внеш
ний ключ, состоящий из столбца sales_rep, ссылающийся на столбец empid таб
лицы employee. Мы создаем ключ двумя разными способами, сначала на уровне
столбца, затем на уровне таблицы:
создание ограничения на уровне столбца
CREATE TABLE distributors
(dist_id CHAR(4) PRIMARY KEY,
dist_name VARCHAR(40),
dist_address1 VARCHAR(40),
dist_address2 VARCHAR(40),
city VARCHAR(20),
state CHAR(2) ,
zip CHAR(5) ,
phone CHAR(12) ,
sales_rep INT NOT NULL
REFERENCES employee(empid));
создание ограничения на уровне таблицы
CREATE TABLE distributors
(dist_id CHAR(4) NOT NULL,
dist_name VARCHAR(40),
dist_address1 VARCHAR(40),
dist_address2 VARCHAR(40),
city VARCHAR(20),
state CHAR(2) ,
zip CHAR(5) ,
phone CHAR(12) ,
sales_rep INT ,
CONSTRAINT pk_dist_id PRIMARY KEY (dist_id),
CONSTRAINT fk_empid
FOREIGN KEY (sales_rep)
REFERENCES employee(empid));
Уникальные ключи
Уникальный ключ (UNIQUE), называемый иногда возможным ключом (candi0
date key) – это ограничение, определяющее, что значения столбца или комбина
ция значений набора столбцов должны быть уникальны. Существуют следую
щие правила для уникальных ключей:
• В уникальных ключах не могут использоваться столбцы с типами BLOB,
CLOB, NCLOB и ARRAY.
• Столбец или набор столбцов одного уникального ключа не может быть таким
же, как и у другого уникального или первичного ключа.
Ограничения целостности 73
условие_проверки
Определяет одно или несколько условий, ограничивающих вставляемые
в таблицу данные, используя одно или несколько выражений и предикатов.
На столбец может быть наложено одно или несколько условий, соединенных
операторами AND и OR (как в операторе WHERE).
Проверочное ограничение считается выполненным, если указанное условие про
верки принимает значение TRUE или UNKNOWN (неизвестно). В проверочных
ограничениях должны использоваться булевы операторы (например =, >=, <=
и <>) и любые предикаты из SQL2003, такие как IN или LIKE. Вот некоторые
правила для проверочных ограничений:
• Столбец или таблица могут иметь одно или несколько проверочных ограниче
ний.
• Проверочное условие не может содержать недетерминированных функций
и подзапросов.
• Проверочное ограничение может ссылаться только на однотипные объекты.
То есть, если ограничение создается для глобальной временной таблицы, оно
не может ссылаться на обычную таблицу.
• Проверочное условие не может использовать следующие функции из стан
дарта ANSI: CURRENT_USER, SESSION_USER, SYSTEM_USER, USER,
CURRENT_PATH, CURRENT_DATE, CURRENT_TIME, CURRENT_TIME
STAMP, LOCALTIME, LOCALTIMESTAMP.
В следующем примере создаются проверочные ограничения для столбцов dist_id
и zip. (В примере используется синтаксис SQL Server.) Поле zip должно попадать
в допустимый набор почтовых индексов, а в поле dist_id допускается либо 4 бук
вы, либо 2 буквы и 2 цифры:
Создание проверочного ограничения на уровне столбца
CREATE TABLE distributors
(dist_id CHAR(4)
CONSTRAINT pk_dist_id PRIMARY KEY
CONSTRAINT ck_dist_id CHECK
(dist_id LIKE '[A Z][A Z][A Z][A Z]' OR
dist_id LIKE '[A Z][A Z][0 9][0 9]'),
dist_name VARCHAR(40),
dist_address1 VARCHAR(40),
dist_address2 VARCHAR(40),
city VARCHAR(20),
state CHAR(2)
CONSTRAINT def_st DEFAULT ("CA"),
zip CHAR(5)
CONSTRAINT unq_dist_zip UNIQUE
CONSTRAINT ck_dist_zip CHECK
(zip LIKE '[0 9][0 9][0 9][0 9][0 9]'),
phone CHAR(12),
sales_rep INT NOT NULL DEFAULT USER
REFERENCES employee(emp_id))
Справочник операторов SQL
3
Эта глава является основной в книге. Она содержит алфавитный перечень всех
команд SQL с детальными объяснениями и примерами. Для каждой команды
в табл. 3.1 указывается степень поддержки этой команды каждой из четырех
рассматриваемых платформ: MySQL 5.1, Oracle Database 11g, PostgreSQL 8.2.1,
Microsoft SQL Server 2008. Степень поддержки оценивается одним из следую
щих значений: «поддерживается», «поддерживается с ограничениями», «под
держивается с вариациями», «не поддерживается». После короткого описания
команды по стандарту SQL2003 приводится подробное описание реализации ко
манды в каждой платформе. Если команда платформой не поддерживается, то
этот факт отмечается в таблице в начале описания команды и эта команда для
соответствующей платформы не рассматривается. Хотя эта книга и не претенду
ет на всестороннее представление стандарта SQL2003, тем не менее, все рассмат
риваемые команды сравниваются со стандартом.
Синтаксис SQL2003
SELECT ...
WHERE выражение сравнение {ALL | ANY | SOME} ( подзапрос )
Ключевые слова
WHERE выражение
Скалярное выражение (например, столбец) сравнивается с каждой строкой под
запроса (при использовании ALL) или с каждой строкой до первого обнару
женного совпадения (при использовании ANY или SOME). При использова
нии ALL оператор возвращает результат TRUE только в том случае, если ус
ловие сравнения выполняется для всех строк подзапроса. При использовании
ANY или SOME оператор возвращает TRUE, если условие выполняется для
одной или более записей подзапроса.
сравнение
Оператор сравнения выражения и подзапроса. Должен использоваться стан
дартный оператор сравнения, такой как =, <>, !=, >, >=, < или <=.
80 Глава 3. Справочник операторов SQL
Общие правила
Оператор ALL возвращает булево значение TRUE в одном из двух случаев: либо
подзапрос возвращает пустой результат (т. е. ни одной строки), либо каждая
строка подзапроса удовлетворяет условию сравнения. Если ни одна строка не
удовлетворяет условию сравнения, то ALL возвращает FALSE. Операторы ANY
и SOME возвращают TRUE, если хотя бы одна строка подзапроса удовлетворяет
условию сравнения. Если же строк, удовлетворяющих условию сравнения, не
найдено либо подзапрос возвращает пустой результат, то возвращается FALSE.
Если хотя бы одно возвращаемое подзапросом значение равно NULL, то опера
тор также возвращает NULL.1
Советы и хитрости
К использованию операторов ALL и ANY/SOME достаточно сложно привык
нуть. Большинство разработчиков считает более простыми и удобными операто
ры IN и EXISTS.
MySQL
MySQL поддерживает ALL и ANY/SOME в соответствии с приведенным описа
нием, за исключением версий младше 4.0. В ранних версиях можно использо
вать оператор IN вместо EXISTS для ANY/SOME.
1 Корректно только для случая ALL; для случая ANY, если есть совпадение, но встре
тился NULL, все равно будет возвращено TRUE. – Прим. науч. ред.
BETWEEN 81
Oracle
Oracle поддерживает ALL и ANY/SOME в соответствии со стандартом ANSI, но
с небольшим дополнением: вместо подзапроса можно указывать список значе
ний. Например, для поиска всех сотрудников со значением job_lvl, равным 9
или 14, можно использовать следующий запрос:
SELECT * FROM employee
WHERE job_lvl = ALL(9, 14);
PostgreSQL
PostgreSQL поддерживает ALL и ANY/SOME в соответствии с приведенным
описанием.
SQL Server
SQL Server поддерживает ALL и ANY/SOME в соответствии со стандартом ANSI.
Также поддерживаются дополнительные операторы сравнения: «не больше чем»
(!>) и «не меньше чем» (!<).
См. также
BETWEEN
EXISTS
SELECT
WHERE
BETWEEN
Оператор BETWEEN проверяет принадлежность значения диапазону. Оператор
возвращает TRUE, если значение попадает в диапазон, и FALSE, если значение
выходит за границы диапазона. Результат равен NULL, если любая из границ
диапазон равна NULL.
Синтаксис SQL2003
SELECT ...
WHERE выражение
[NOT] BETWEEN нижняя_граница AND верхняя_граница
Ключевые слова
WHERE выражение
Скалярное выражение, например, столбец, сравнивается с диапазоном, зада
ваемым нижней_границей и верхней_границей.
82 Глава 3. Справочник операторов SQL
Общие правила
Оператор BETWEEN используется для проверки принадлежности значения
диапазону. Оператор можно использовать с любыми типами данных, кроме
BLOB, CLOB, NCLOB, REF и ARRAY.
Например, следующий запрос возвращает идентификаторы книг, для которых
объем продаж с начала года составляет от 10000 до 20000:
SELECT title_id
FROM titles
WHERE ytd_sales BETWEEN 10000 AND 20000
При сравнении с помощью BETWEEN границы считаются включенными в диа
пазон, поэтому значения 10000 и 20000 также попадают в условие поиска. Если
вы хотите исключить границы диапазона, то вам следует использовать операто
ры «больше» (>) и «меньше» (<):
SELECT title_id
FROM titles
WHERE ytd_sales > 10000
AND ytd_sales < 20000
Оператор NOT BETWEEN позволяет искать значения, не попадающие в диапа
зон. Например, вы можете найти все книги, которые были опубликованы не
в 2003 году:
SELECT title_id
FROM titles
WHERE pub_date NOT BETWEEN '01 JAN 2003'
AND '31 DEC 2003'
Советы и хитрости
Аккуратные программисты полагают, что необходимо очень внимательно отно
ситься к использованию ключевого слова AND во фразе WHERE. Для того чтобы
AND оператора BETWEEN не был случайно спутан с логическим оператором
AND, можно заключить BETWEEN в скобки:
SELECT title_id
FROM titles
WHERE (ytd_sales BETWEEN 10000 AND 20000)
AND pubdate >= '1991 06 12 00:00:00.000'
Отличия в платформах
Во всех платформах оператор BETWEEN поддерживается в соответствии с при
веденным описанием.
См. также
ALL/ANY/SOME
CALL 83
EXISTS
SELECT
WHERE
CALL
Оператор CALL вызывает хранимую процедуру.
Синтаксис SQL2003
CALL процедура([параметр[, ...]])
Ключевые слова
CALL процедура
Указывает хранимую процедуру, которую вы хотите вызвать. Процедура
должна быть предварительно объявлена и доступна в текущем пользователь
ском контексте (экземпляре, базе данных, схеме и т. д.)
([параметр[, …]])
Задает значения входных параметров процедуры. Параметры должны быть
указаны в том же порядке, в котором они указаны в процедуре: например, пя
тый параметр в списке задает значение для пятого параметра процедуры. Па
раметры должны быть заключены в скобки и разделены запятыми. Обратите
внимание, что скобки необходимы даже при отсутствии параметров, то есть,
если процедура не принимает входных параметров, для вызова все равно
нужно писать CALL ...(). Строки необходимо заключать в одинарные кавыч
ки. Если процедура имеет только выходные параметры, то в скобках необхо
димо указывать соответствующие переменные (host variables) или маркеры.
Общие правила
Оператор CALL позволяет вызвать хранимую процедуру. Просто укажите имя
процедуры и в скобках перечислите параметры. В следующем примере для Ora
cle создается и затем вызывается простая процедура:
CREATE PROCEDURE update_employee_salary
(emp_id NUMBER, updated_salary NUMBER)
IS
BEGIN
UPDATE employee SET salary = updated_salary
WHERE employee_id =emp_id;
END;
/
CALL update_employee_salary(1517, 95000);
84 Глава 3. Справочник операторов SQL
Советы и хитрости
Результат работы хранимой процедуры обычно можно получить с помощью опе
ратора GET DIAGNOSTIC. GET DIAGNOSTIC не очень широко поддерживается
различными платформами, поэтому обращайтесь за информацией к документа
ции.
В некоторых платформах поддерживается оператор EXECUTE, имеющий ту же
функциональность. В некоторых случаях вы можете предпочесть EXECUTE,
потому что с помощью этого оператора можно вызывать не только хранимые
процедуры, но любые варианты SQLкода, включая функции, методы и пакеты
операторов.
MySQL
MySQL поддерживает оператор CALL в соответствии со стандартом ANSI.
Oracle
В Oracle оператор CALL используется для вызова как отдельных хранимых про
цедур и функций, так и процедур и функций, содержащихся в пакетах или ти
пах. В Oracle используется следующий синтаксис:
CALL [схема.][{тип | пакет}.]процедура[@dblink]
[(параметр[, ...])]
[INTO :переменная [[INDICATOR] :индикатор]]
где:
CALL [схема.][{тип | пакет}.]процедура[@dblink]
Вызывает именованный объект. Вы можете либо полностью указать имя объ
екта, включая схему, тип и т. д., либо использовать текущую схему и экземп
ляр базы данных. Если процедура или функция находится в другой базе дан
ных, то используйте предварительно созданный указатель на эту базу дан
ных (в синтаксисе обозначен как dblink).
INTO :переменная
Указывает имя предварительно объявленной переменной, в которой будет со
хранено возвращаемое значение при вызове функции. INTO необходим толь
ко при вызове функций.
INDICATOR :индикатор
Указывает состояние переменной (например, равно возвращаемое значение
NULL или нет) для функций, созданных на Pro*C/C++.
В качестве параметров оператора CALL в Oracle не могут использоваться псевдо
столбцы и функции VALUE или REF. Вам следует использовать локальные пере
менные для всех параметров, соответствующих аргументам процедуры или
функции с типами IN или IN OUT.
PostgreSQL
Не поддерживается.
CLOSE CURSORE 85
SQL Server
Не поддерживается. Вместо этого используйте не входящий в стандарт ANSI
оператор EXECUTE.
См. также
CREATE/ALTER PROCEDURE
CLOSE CURSORE
Оператор CLOSE CURSOR закрывает серверный курсор, созданный с помощью
оператора DECLARE CURSOR.
Синтаксис SQL2003
CLOSE курсор
Ключевые слова
курсор
Указывает имя курсора, созданного ранее с помощью оператора DECLARE
CURSOR.
Общие правила
Оператор CLOSE закрывает курсор и удаляет соответствующее курсору резуль
тирующее множество (result set). Все СУБД при этом также освобождают все
блокировки, удерживаемые курсором, хотя в стандарте об этом ничего не сказа
но. Пример:
CLOSE author_names_cursor;
Советы и хитрости
Вы можете также закрыть курсор неявно с помощью оператора COMMIT, а кур
соры, созданные с опцией WITH HOLD, – оператором ROLLBACK.
MySQL
MySQL поддерживает оператор в соответствии со стандартом ANSI.
Oracle
Oracle поддерживает оператор в соответствии со стандартом ANSI.
86 Глава 3. Справочник операторов SQL
PostgreSQL
PostgreSQL поддерживает оператор в соответствии со стандартом ANSI. Postgre
SQL неявно выполняет оператор CLOSE для каждого открытого курсора при за
вершении транзакции с помощью COMMIT или ROLLBACK.
SQL Server
SQL Server поддерживает синтаксис, определенный стандартом ANSI, а также
дополнительное ключевое слово GLOBAL:
CLOSE [GLOBAL] курсор
где:
GLOBAL
Указывает, что ранее созданный курсор является глобальным.
В стандарте ANSI написано, что при закрытии курсора удаляется соответствую
щее ему результирующее множество. Блокировки являются физическими осо
бенностями каждой СУБД, следовательно, не могут являться частью стандарта
ANSI SQL. Тем не менее, все рассматриваемые СУБД при закрытии курсора ос
вобождают все удерживаемые блокировки. Особенностью физической реализа
ции SQL Server является то, что при закрытии курсора освобождаемое простран
ство в памяти не возвращается в пул свободной памяти. Для перемещения осво
бождаемой памяти в пул необходимо выполнить команду DEALLOCATE курсор.
В следующем примере для SQL Server открывается курсор и извлекаются записи
о сотрудниках, фамилии которых начинаются с 'K':
DECLARE employee_cursor CURSOR FOR
SELECT lname, fname
FROM pubs.dbo.employee
WHERE lname LIKE 'K%'
OPEN employee_cursor
FETCH NEXT FROM employee_cursor
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM employee_cursor
END
CLOSE employee_cursor
DEALLOCATE employee_cursor
GO
См. также
DECLARE CURSOR
FETCH
OPEN
COMMIT
Оператор COMMIT явно заканчивает текущую транзакцию и фиксирует все сде
ланные в базе данных изменения. Транзакции неявно начинаются при выполне
нии операторов INSERT, UPDATE и DELETE, а могут быть начаты явно с помо
COMMIT 87
Синтаксис SQL2003
COMMIT [WORK] [AND [NO] CHAIN]
Ключевые слова
COMMIT [WORK]
Завершает текущую открытую транзакцию и фиксирует в базе данных все
сделанные в рамках транзакции изменения. Опциональное ключевое слово
WORK не имеет никакого эффекта.
AND [NO] CHAIN
AND CHAIN указывает СУБД, что следующую транзакцию нужно обрабаты
вать так, как если бы она была частью текущей транзакции. На самом деле,
транзакции являются отдельными элементами работы, но при этом имеют
общее окружение (например, уровень изоляции транзакции). Опциональное
ключевое слово NO явно указывает, что нужно придерживаться поведения по
умолчанию, описанного в ANSI. Само по себе слово COMMIT функционально
эквивалентно оператору COMMIT WORK AND NO CHAIN.
Общие правила
В простых случаях вы будете выполнять транзакции (то есть код SQL, изменяю
щий данные и объекты в базе данных) без их явного объявления. Тем не менее,
лучшим вариантом является явное завершение транзакций при помощи опера
тора COMMIT. Так как на протяжении всей транзакции могут быть заблокиро
ваны отдельные записи или даже целые таблицы, то чрезвычайно важно закан
чивать транзакции как можно раньше. Поэтому явное выполнение COMMIT по
может вам избежать проблем, связанных с блокировками и параллельным вы
полнением.
Советы и хитрости
Самое важное, что нужно иметь в виду, это то, что некоторые СУБД выполняют
автоматически неявные транзакции, в то время как другие требуют использова
ния явных транзакций. Если вы предположите, что СУБД использует какойто
определенный способ, то вы можете ошибиться. Поэтому при переходе от одной
платформы к другой следует придерживаться стандартного способа работы с тран
закциями. Мы рекомендуем всегда явно начинать транзакцию с помощью START
TRAN на платформах, поддерживающих этот оператор, и закачивать транзак
цию, используя COMMIT и ROLLBACK.
88 Глава 3. Справочник операторов SQL
MySQL
MySQL поддерживает COMMIT при использовании транзакционных движков
InnoDB и NDB Cluster, используя следующий синтаксис:
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
Ключевое слово RELEASE указывает, что после завершения текущей транзакции
нужно закрыть клиентское подключение. Ключевое слово NO, как для CHAIN,
так и для RELEASE, заменяет действие на противоположное, запрещая сцепле
ние транзакций или автоматическое закрытие соединения.
Oracle
В Oracle не поддерживается фраза AND [NO] CHAIN, но есть и некоторые расши
рения относительно стандарта:
COMMIT [WORK] [ {COMMENT 'текст' | FORCE 'текст'[,целое]} ];
COMMIT 89
где:
COMMENT 'текст'
Связывает с текущей транзакцией комментарий длиной до 255 символов.
В случае отката транзакции комментарий сохраняется в представлении сло
варя данных с названием DBA_2PC_PENDING.
FORCE 'текст' [, целое]
Позволяет завершить распределенную транзакцию, параметр 'текст' содер
жит ID локальной или глобальной транзакции. Транзакции можно идентифи
цировать, запрашивая данные из представления DBA_2PC_PENDING. В ка
честве опционального параметра можно задать целое число, явно присваи
вающее транзакции системный номер изменения (SCN). Если параметр не
указан, то используется текущее значение SCN.
Выполнение команды COMMIT с фразой FORCE завершает только транзакцию,
указанную в параметрах. На текущую транзакцию никакого действия оказано
не будет (если только ее идентификатор явно не указан в FORCE). Фразу FORCE
нельзя использовать в PL/SQL. В следующем примере заканчивается транзак
ция, и с ней связывается комментарий:
COMMIT WORK COMMENT 'Сомнительная транзакция, позвоните (949) 555 1234';
PostgreSQL
В PostgreSQL реализован следующий синтаксис:
COMMIT [WORK | TRANSACTION];
Ключевые слова WORK и TRANSACTION необязательны. Когда вы выполняете
COMMIT, все изменения, сделанные в транзакции, записываются на диск и ста
новятся доступными другим пользователям. Например:
INSERT INTO sales VALUES('7896','JR3435','Oct 28 1997',25,'Net 60','BU7832');
COMMIT WORK;
SQL Server
SQL Server не поддерживает фразу AND [NO] CHAIN. Поддерживается ключе
вое слово TRANSACTION как синоним WORK, общий синтаксис следующий:
COMMIT { [TRAN[SACTION] [имя_транзакции] ] | [WORK] }
Microsoft SQL Server позволяет создавать именованные транзакции с помощью
оператора START TRAN. Синтаксис COMMIT позволяет явно задать имя закры
ваемой транзакции или сохранить его в переменную. Любопытно, что SQL Ser
ver закрывает только самую последнюю открытую транзакцию, не принимая во
внимание указываемое имя транзакции.
При использовании COMMIT WORK завершаются все открытые транзакции
и фиксируются все сделанные изменения. Имя транзакции в COMMIT WORK
указывать нельзя.
См. также
ROLLBACK
START TRANSACTION
90 Глава 3. Справочник операторов SQL
CONNECT
Оператор CONNECT устанавливает соединение с СУБД и определенной базой
данных внутри СУБД.
Синтаксис SQL2003
CONNECT TO {DEFAULT | {[имя_сервера] [AS имя_подключения]
[USER пользователь]}
Ключевые слова
DEFAULT
Инициирует сессию с сервером и базой данных, подключение к которым ус
танавливается по умолчанию. Стандарт указывает, что, если при создании
сессии явно не выполнен CONNECT, то автоматически выполняется CON0
NECT TO DEFAULT.
имя_сервера
Устанавливает подключение к указанному серверу. Для указания имени сер
вера можно использовать строковой литерал в одинарных кавычках или ло
кальную переменную.
AS имя_подключения
Задает имя подключения. Имя может быть задано строкой в одинарных ка
вычках либо передано через переменную. Опция необязательна только при
первом подключении к серверу, во всех последующих подключениях исполь
зование AS обязательно. Имя подключения позволяет различать между собой
сессии, открытые на одном сервере несколькими (или даже одним) пользова
телями.
USER пользователь
Указывает пользователя, от имени которого создается подключение к серверу.
Общие правила
Используйте оператор CONNECT для создания интерактивного соединения
с СУБД. Период между выполнением команд CONNECT и DISCONNECT обыч
но называется сессией. Как правило, вы выполняете всю работу с СУБД в рамках
явно создаваемых сессий.
Если вы не укажете имя сервера, подключения или пользователя, то СУБД будет
использовать значения по умолчанию. Значения по умолчанию меняются от
платформы к платформе.
CONNECT 91
Советы и хитрости
Если вы выполняете оператор CONNECT до того, как явно закрыли предыдущую
сессию, то старая сессия становится неактивной, а новая – активной. Затем вы мо
жете переключаться между сессиями, используя оператор SET CONNECTION.
MySQL
Не поддерживается.
Oracle
CONNECT позволяет указать конкретное имя пользователя при подключении.
Кроме того, можно создать подключение со специальными привилегиями – AS
SYSOPER или AS SYSDBA. В Oracle используется следующий синтаксис:
CONN[ECT] [[имя_пользователя/пароль] [AS {SYSOPER|SYSDBA}]]
где:
CONN[ECT] [имя_пользователя/пароль]
Устанавливает подключение к экземпляру базы данных.
AS {SYSOPER|SYSDBA}
Устанавливает подключение с одной из двух опциональных системных ролей.
Если уже есть открытое подключение, то CONNECT фиксирует все текущие
транзакции, закрывает текущую сессию и открывает новую.
Оператор CONNECT допустим в программах SQL*Plus и iSQL*Plus.
PostgreSQL
PostgreSQL не поддерживает оператор CONNECT явно. Тем не менее, в про
граммном интерфейсе сервера (Server Programming Interface, SPI) есть оператор
SPI_CONNECT, а в программном пакете PG/TCL есть оператор PG_CONNECT.
92 Глава 3. Справочник операторов SQL
SQL Server
SQL Server поддерживает базовые возможности оператора CONNECT при ис
пользовании из Embedded SQL (из программ, написанных на C++ и Visual Basic)
в соответствии со следующим синтаксисом:
CONNECT TO [имя_сервера.]база_данных [AS имя_подключения]
USER {имя_пользователя[.пароль] | $integrated}
где:
CONNECT TO [имя_сервера.]база_данных
Указывает имя сервера и базы данных, к которым вы хотите подключиться.
Имя сервера можно не указывать – по умолчанию будет выполнено подклю
чение к локальному серверу.
AS имя_подключения
Задает имя подключения. Имя подключения является строкой длиной до
30 символов. Символы могут быть любыми, кроме дефиса, но первый символ
должен обязательно быть буквой. Использование зарезервированных слов
CURRENT и ALL запрещено. Имя подключения является обязательным толь
ко в том случае, если вы создаете больше чем одно подключение.
USER {имя_пользователя[.пароль] | $integrated}
Указывает имя пользователя и пароль, используемые при подключении. Па
роль можно задать явно или использовать встроенные средства безопасности
Windows. При подключении пароль можно не указывать.
К примеру, мы можем подключиться к серверу new_york, используя пользовате
ля Windows с именем pubs_admin:
CONNECT TO new_york.pubs USER pubs_admin
Та же команда может быть выполнена с использованием средств безопасности
SQL Server:
EXEC SQL CONNECT TO new_york.pubs USER pubs_admin
Та же команда, выполненная с использованием средств безопасности Windows:
EXEC SQL CONNECT TO new_york.pubs USER $integrated
Для переключения между сессиями используйте оператор SET CONNECTION.
См. также
SET CONNECTION
CREATE/ALTER DATABASE
Стандарт ANSI не содержит описания оператора CREATE DATABASE. Но так
как работа с базами данных без этого оператора практически невозможна, мы
решили включить сюда описание этого оператора. Практически все платформы
поддерживают оператор в том или ином виде.
CREATE/ALTER DATABASE 93
Общие правила
С помощью этой команды создается новая пустая база данных. В большинстве
платформ для создания базы данных необходимы права администратора. После
того как база данных создана, вы можете наполнить ее объектами (таблицами,
представлениями, триггерами и т. д.) и наполнить таблицы данными.
На некоторых платформах оператор CREATE DATABASE создает соответствую
щие файлы на диске для хранения данных и метаданных базы данных.
Советы и хитрости
Так как CREATE DATABASE не является стандартным оператором, то его син
таксис в зависимости от платформы может меняться кардинально.
MySQL
В MySQL оператор CREATE DATABASE создает новый каталог для хранения
объектов базы данных:
CREATE { DATABASE | SCHEMA } [IF NOT EXISTS] имя_базы
[ [DEFAULT] CHARACTER SET кодовая_страница ]
[ [DEFAULT] COLLATE схема_упорядочения ]
Для оператора ALTER DATABASE используется следующий синтаксис:
ALTER { DATABASE | SCHEMA } имя_базы
{ [ [DEFAULT] CHARACTER SET кодовая_страница]
[ [DEFAULT] COLLATE схема_упорядочения] |
UPGRADE DATA DIRECTORY NAME }
где:
{CREATE | ALTER} { DATABASE | SCHEMA } имя_базы
Создает базу данных и каталог с соответствующими именами. Каталог созда
ется внутри каталога с данными MySQL. Таблицам соответствуют файлы
внутри каталога базы данных. Слово SCHEMA является синонимом слова
DATABASE.
IF NOT EXISTS
Указывает, что оператор не должен вызывать ошибки в случае, если база дан
ных с таким именем уже существует.
[DEFAULT] CHARACTER SET кодовая_страница
Опциональный параметр, задающий кодовую страницу, используемую в базе
данных по умолчанию. За полным перечнем допустимых кодовых страниц
обращайтесь к документации MySQL.
94 Глава 3. Справочник операторов SQL
Oracle
Oracle предоставляет исключительные возможности контроля над файловой
структурой базы данных, намного большие чем просто указание имени базы
и каталога для хранения файлов. CREATE и ALTER DATABASE являются очень
мощными командами, некоторые замысловатые опции которых используются
только опытными администраторами. Также эти команды являются очень слож
ными: например, только команде ALTER DATABASE посвящено около 50 стра
ниц документации.
Новичкам следует знать, что оператор CREATE DATABASE удаляет все данные
в существующих файлах данных. Аналогично, удаляются все данные базы дан
ных.
Для создания новой базы данных в Oracle используется следующий синтаксис:
CREATE DATABASE [имя_базы]
{[USER SYS IDENTIFIED BY пароль
| USER SYSTEM IDENTIFIED BY пароль]}
[CONTROLFILE REUSE]
{[LOGFILE определение[, ...]] [MAXLOGFILES целое_число]
[[MAXLOGMEMBERS] целое_число]
[[MAXLOGHISTORY] целое_число]
[{ARCHIVELOG | NOARCHIVELOG}] [FORCE LOGGING]}
[MAXDATAFILES целое_число]
[MAXINSTANCES целое_число]
[CHARACTER SET кодовая_страница]
[NATIONAL CHARACTER SET кодовая_страница]
[EXTENT MANAGEMENT {DICTIONARY | LOCAL
[ {AUTOALLOCATE | UNIFORM [SIZE int [K | M]]} ]}]
[DATAFILE определение[, ...]]
[SYSAUX DATAFILE определение [, ...]]
[DEFAULT TABLESPACE имя_табличного_пространства
[DATAFILE определение_файла]
EXTENT MANAGEMENT {DICTIONARY |
LOCAL {AUTOALLOCATE|UNIFORM [SIZE целое_число [K|M]]}}]
CREATE/ALTER DATABASE 95
REUSE
Указывает, что необходимо повторно использовать существующие жур
нальные файлы.
MAXLOGFILES целое_число
Устанавливает максимальное число журнальных файлов в создаваемой базе
данных. Минимальное, максимальное и значение по умолчанию зависят от
операционной системы.
MAXLOGMEMBERS целое_число
Устанавливает максимально число членов (копий) группы журнальных фай
лов. Минимальное значение равно 1, максимальное значение и значение по
умолчанию зависят от операционной системы.
MAXLOGHISTORY целое_число
Устанавливает максимальное число архивных журнальных файлов, доступ
ных при использовании Real Application Cluster (RAC). Вы можете использо
вать этот параметр, только если база данных работает в режиме ARCHIVELOG
в кластере. Минимальное значение равно 0, максимальное значение и значе
ние по умолчанию зависят от операционной системы.
ARCHIVELOG | NOARCHIVELOG
Определяет режим работы журнальных файлов. При использовании в опера
торе ALTER DATABASE позволяет менять одно значение на другое. В режи
ме ARCHIVELOG оперативные журнальные файлы сохраняются в архивный
каталог, что позволяет восстанавливать базу данных при сбое носителя. В ре
жиме NOARCHIVELOG журнальные файлы не архивируются. Режим NOAR0
CHIVELOG (по умолчанию) также позволяет восстановить базу данных, но
не при сбое носителя.
FORCE LOGGING
Переводит все экземпляры баз данных в режим FORCE LOGGING, при кото
ром журналируются все изменения в базе данных, за исключением измене
ний во временных сегментах и табличных пространствах. Установка этого
режима имеет более высокий приоритет, чем любые установки на уровне таб
личного пространства или объекта.
MAXDATAFILES целое_число
Устанавливает максимально число файлов данных в создаваемой базе дан
ных. Имейте в виду, что параметр DB_FILES в файле INIT.ORA также огра
ничивает число файлов данных, доступных экземпляру.
MAXINSTANCES целое_число
Устанавливает максимальное число экземпляров, которые могут монтиро
вать и открывать создаваемую базу данных. Минимальное значение равно 1,
максимальное значение и значение по умолчанию зависят от операционной
системы.
CHARACTER SET кодовая_страница
Устанавливает кодировку, в которой хранятся данные. Кодовой страницей
не может быть AL16UTF16. Значение по умолчанию зависит от операцион
ной системы.
CREATE/ALTER DATABASE 99
DICTIONARY
Указывает, что табличное пространство управляется с помощью словаря
данных. Является значением по умолчанию. Параметры AUTOALLOCATE
и UNIFORM в этом случае не используются.
LOCAL
Указывает, что табличное пространство управляется локально. Эта фраза
необязательна, так как все временные табличные пространства управля
ются локально по умолчанию. Использование этой фразы требует таблич
ного пространства по умолчанию. Если вы не создадите его вручную, то
Oracle создаст за вас табличное пространство TEMP размером 10 Мбайт
с выключенной опцией AUTOEXTEND.
AUTOALLOCATE
Указывает, что в локально управляемом табличном пространстве новые
экстенты выделяются автоматически по мере необходимости. Размер экс
тентов выбирается автоматически.
UNIFORM [SIZE целое_число [K | M]]
Указывает, что все экстенты табличного пространства должны быть оди
накового размера. Опция SIZE позволяет указать размер экстента в бай
тах, килобайтах или мегабайтах. Значение по умолчанию – 1Мбайт.
UNDO TABLESPACE имя_табличного_пространства [DATAFILE определение_файла]
Определяет название и расположение табличного пространства для данных
отката, если при этом параметр UNDO_MANAGEMENT в файле INIT.ORA
установлен в значение AUTO. Если вы не используете эту фразу, то Oracle ра
ботает с данными отката в сегментах отката. (Вы можете установить для па
раметра в INIT.ORA значение UNDO_TABLESPACE. В этом случае необхо
димо, чтобы значение параметра совпадало с указанным во фразе UNDO TAB0
LESPACE именем табличного пространства.)
[DATAFILE определение_ файла]
Создает файл данных для табличного пространства отката. Полный син
таксис смотрите в приведенном ранее описании фразы DATAFILE. Фраза
обязательна, если вы не установили в INIT.ORA параметр DB_CREA0
TE_FILE_DEST.
SET TIME_ZONE = '{ {+ | 0} чч:мм | часовой_пояс}'
Устанавливает часовой пояс либо указанием разницы с Гринвичским време
нем (известным также как универсальное глобальное время), либо указанием
названия часового пояса. (Список часовых поясов можно получить, запросив
столбец tzname представления v$timezone_names.) Если вы не укажете часо
вой пояс, то будет использоваться часовой пояс, выбранный в операционной
системе.
SET DEFAULT {BIGFILE | SMALLFILE} TABLESPACE
Указывает, какого типа по умолчанию будут создаваться табличные про
странства (BIGFILE или SMALLFILE). При создании базы данных эта фраза
влияет на табличные пространства SYSTEM и SYSAUX.
102 Глава 3. Справочник операторов SQL
AVAILABILITY
Устанавливает более низкий, чем при PROTECTION, уровень защиты дан
ных, но максимальный уровень доступности. В этом режиме транзакция
фиксируется только после того, как все данные, необходимые для восста
новления, были записаны как минимум в одну физическую или логическую
резервную базу данных, использующую режим передачи журналов SYNC.
PERFOMANCE
Обеспечивает максимальную производительность в ущерб безопасности
и доступности данных. В этом режиме транзакция фиксируется до того,
как в резервную базу данных попадают все данные, необходимые для вос
становления.
REGISTER [OR REPLACE] [PHYSICAL | LOGICAL] LOGFILE ['файл']
Выполняется на резервной базе данных для ручной регистрации журналь
ных файлов с вышедшей из строя основной базы данных. Журнальный файл
может быть по желанию объявлен физическим или логическим. Фраза OR
REPLACE разрешает изменять детали существующих записей об архивных
журналах.
FOR имя_сессии_logminer
Регистрирует журнальный файл в специальной сессии LogMiner при работе
с Oracle Streams.
{COMMIT | PREPARE} TO SWITCHOVER TO {[PHYSICAL | LOGICAL] PRIMA0
RY | STANDBY}
Выполняет переключение между основной и резервной базами данных, пере
водя основную в статус резервной, а резервную в статус основной. (При рабо
те с архитектурой RAC нужно останавливать все экземпляры, за исключени
ем текущего.) Для переключения команду необходимо выполнить дважды.
Первый раз нужно выполнить PREPARE TO SWITHOVER для того, чтобы
с основной базы на резервную были переданы журнальные файлы. Затем
нужно выполнить COMMIT TO SWITCHOVER для окончательного переклю
чения на резервную базу данных. PHYSICAL делает основную базу данных
физической резервной, а LOGICAL – логической резервной. Затем нужно вы
полнить команду ALTER DATABASE START LOGICAL STANDBY APPLY.
[WITH[OUT] SESSION SHUTDOWN] [WAIT | NOWAIT]
WITH SESSION SHUTDOWN закрывает все активные сессии и откатывает
все незафиксированные транзакции для переключения физических резерв
ных баз (но не логических). WITHOUT SESSION SHUTDOWN (значение по
умолчанию) запрещает выполнение COMMIT TO SWITCHOVER при обнару
жении активных сессий приложений. WAIT возвращает контроль консоли
только после завершения команды SWITCHOVER, а NOWAIT возвращает
контроль сразу, не дожидаясь завершения.
START LOGICAL STANDBY APPLY [IMMEDIATE] [NODELAY] [{INITIAL це
лое_число | NEW PRIMARY имя_dblink} | {FINISH | SKIP FAILED TRANSACTION}]
Начинает применение журнальных файлов на логической резервной базе
данных. IMMEDIATE указывает, что Oracle LogMiner должен сразу начать
чтение журнальных файлов. NODELAY игнорирует задержку в применении
104 Глава 3. Справочник операторов SQL
PostgreSQL
В PostgreSQL оператор CREATE DATABASE создает базу данных и определяет
место расположения файлов данных:
CREATE DATABASE имя_базы_данных [ WITH ]
[OWNER [=] владелец]
[TEMPLATE [=] имя_шаблона]
[ENCODING [=] кодировка]
[TABLESPACE [=] имя_табличного_пространства]
[CONNECTION LIMIT [=] целое_число]
Для команды ALTER DATABASE используется следующий синтаксис:
ALTER DATABASE имя_базы_данных [ WITH ]
[CONNECTION LIMIT целое_число]
[OWNER TO новый_владелец]
[RENAME TO новое_имя_базы_данных]
[RESET параметр]
[SET параметр {TO | =} {значение | DEFAULT}]
где:
WITH
Необязательное ключевое слово для дальнейшего описания детальных на
строек базы данных.
OWNER [=] владелец
Указывает имя владельца базы данных, если владельцем должен быть не тот
пользователь, который выполняет оператор.
TEMPLATE [=] имя_шаблона
Указывает шаблон, используемый при создании базы данных. Можно не ис
пользовать эту фразу и принять шаблон, используемый по умолчанию (или
использовать фразу TEMPLATE = DEFAULT). По умолчанию используется
шаблон template1. Вы можете создать базу данных, содержащую только ми
нимально необходимый набор объектов, указав TEMPLATE = template0.
ENCODING [=] кодировка
Указывает многобайтную кодировку, используемую в создаваемой базе дан
ных. В качестве значения указывается либо название кодировки (например,
‘SQL_ASCII’), либо ее номер, либо ключевое слово DEFAULT для использова
ния кодировки по умолчанию.
TABLESPACE [=] имя_табличного_пространства
Указывает имя табличного пространства, связанного с базой данных.
CONNECTION_LIMIT [=] целое_число
Определяет максимальное допустимое число одновременных подключений
к базе данных. Значение 1 означает отсутствие ограничений.
RENAME TO новое_имя_базы_данных
Устанавливает для базы данных новое имя.
CREATE/ALTER DATABASE 113
SQL Server
SQL Server предлагает высокую степень контроля над структурами файловой
системы, в которых хранится база данных и ее объекты. Синтаксис оператора
CREATE DATABASE выглядит в SQL Server следующим образом:
CREATE DATABASE имя_базы_данных
[ ON определение_файла[, ...] ]
[, FILEGROUP имя_файловой_группы определение_файла [, ...] ]
[ LOG ON определение_файла [, ...] ]
[ COLLATE схема_упорядочения]
[ FOR { ATTACH [WITH {ENABLE_BROKER | NEW_BROKER | ERROR_BROKER_
CONVERSATIONS}] |
ATTACH_REBUILD_LOG }
[WITH [DB_CHAINING {ON | OFF}][, TRUSTWORTHY {ON | OFF}]] ]
[ AS SNAPSHOT OF источник]
Синтаксис оператора ALTER DATABASE следующий:
ALTER DATABASE имя_базы_данных
{ADD FILE определение_файла [, ...] [TO FILEGROUP имя_файловой_группы]
| ADD LOG FILE определение_файла [, ...]
| REMOVE FILE имя_файла
| ADD FILEGROUP имя_файловой_группы
| REMOVE FILEGROUP имя_файловой_группы
| MODIFY FILE определение_файла
| MODIFY NAME = новое_имя_базы_данных
| MODIFY FILEGROUP имя_файловой_группы
{NAME = новое_имя_файловой_группы | свойство_файловой_группы
{READONLY | READWRITE | DEFAULT}}
| SET {параметры_состояния | параметры_курсоров
| авто_параметры | параметры_sql | параметры_восстановления}
114 Глава 3. Справочник операторов SQL
COLLATE схема_упорядочения
Устанавливает или изменяет текущую схему упорядочения. Может быть ука
зано имя схемы упорядочения SQL Server или Windows. По умолчанию для но
вых баз данных устанавливается такая же схема упорядочения, как и у экзем
пляра SQL Server. (Вы можете выполнить запрос SELECT * FROM ::fn_help0
collations() для получения списка всех доступных схем упорядочения.) Чтобы
изменить используемую схему упорядочения, нужно быть единственным под
ключенным к базе данных пользователем, не должно быть объектов, привя
занных к схеме (schemabound objects), зависящих от текущей схемы упорядо
чения, и изменение не должно приводить к появлению дубликатов в именах
любых объектов базы данных.
FOR { ATTACH [WITH {ENABLE_BROKER | NEW_BROKER | ERROR_BROK0
ER_CONVERSATIONS}] | ATTACH_REBUILD_LOG }
Переводит базу данных в специальный режим запуска. FOR ATTACH создает
базу данных из набора уже существующих файлов операционной системы
(почти всегда это файлы ранее созданной базы данных). Поэтому новая база
данных должна иметь те же кодовую страницу и схему упорядочения, что
и предыдущая база данных. Требуется указывать определение только перво
го основного файла или тех файлов, путь к которым изменился с момента по
следнего запуска базы данных. Фраза FOR ATTACH_REBUILD_LOG указы
вает, что база данных создается подключением существующих файлов, с пе
рестроением журнальных файлов в случае их отсутствия. В общем случае
вместо оператора CREATE DATABASE FOR ATTACH следует использовать
системную хранимую процедуру sp_attach_db, за исключением случаев, ко
гда вы хотите указать определения более чем 16 файлов.
При использовании FOR ATTACH можно указывать опции компоненты Ser
vice Broker:
ENABLE_BROKER
Указывает, что в базе данных компонента Service Broker активна.
NEW_BROKER
Создает новый service_broker_guid, закрывает и очищает все точки под
ключения.
ERROR_BROKER_CONVERSATIONS
Завершает все диалоги Service Broker с сообщением об ошибке, означаю
щем, что база данных прикрепляется или восстанавливается. Service Bro
ker останавливается на время выполнения операции, а затем опять акти
вируется.
WITH [DB_CHAINING {ON | OFF}][, TRUSTWORTHY {ON | OFF}]
Указывает, что база данных может участвовать в кроссвызовах по цепочке
принадлежностей (значение DB_CHAINING ON). Значение по умолчанию
OFF означает, что база данных не участвует в цепочках принадлежностей.
Опция TRUSTWORTHY ON разрешает объектам базы данных, использую
щим имперсонификацию, работать с внешними по отношению к базе данных
ресурсами. В режиме OFF доступ к внешним ресурсам при имперсонифика
ции запрещен. Опция TRUSTWORTHY имеет значение OFF всегда, когда ба
118 Глава 3. Справочник операторов SQL
ON
PRIMARY
(NAME = sales_arch1,
FILENAME = 'c:\mssql\data\archdata1.mdf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB),
(NAME = sales_arch2,
FILENAME = 'c:\mssql\data\archdata2.ndf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB),
(NAME = sales_arch3,
FILENAME = 'c:\mssql\data\archdat3.ndf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB)
FILEGROUP sale_rpt_grp1
(NAME = sale_rpt_grp1_1_data,
FILENAME = 'c:\mssql\data\SG1Fi1dt.ndf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB),
(NAME = sale_rpt_grp1_1_data,
FILENAME = 'c:\mssql\data\SG1Fi2dt.ndf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB),
FILEGROUP sale_rpt_grp2
(NAME = sale_rpt_grp2_1_data,
FILENAME = 'c:\mssql\data\SRG21dt.ndf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB),
(NAME = sale_rpt_grp2_2_data,
FILENAME = 'c:\mssql\data\SRG22dt.ndf',
SIZE = 100GB, MAXSIZE = 200GB, FILEGROWTH = 20GB),
LOG ON
(NAME = sales_archlog1,
FILENAME = 'd:\mssql\log\archlog1.ldf',
SIZE = 100GB, MAXSIZE = UNLIMITED, FILEGROWTH = 25%),
(NAME = sales_archlog2,
FILENAME = 'd:\ mssql\log\archlog2.ldf',
SIZE = 100GB, MAXSIZE = UNLIMITED, FILEGROWTH = 25%)
GO
Фраза FOR ATTACH обычно используется в ситуациях, когда, к примеру, про
давец путешествует с базой данных, скопированной на компактдиск. Эта фраза
говорит SQL Server о том, что база данных подключается из набора существую
щих файлов, записанных на CDROM, DVDROM или переносной жесткий диск.
При использовании FOR ATTACH новая база данных наследует все объекты
и данные родительской базы данных, а не модельной.
В следующем примере показывается, как сменить имя базы данных, файла или
файловой группы:
Переименовываем базу данных
ALTER DATABASE sales_archive MODIFY NAME = sales_history
GO
Переименовываем файл
ALTER DATABASE sales_archive MODIFY FILE
NAME = sales_arch1,
NEWNAME = sales_hist1
GO
Переименовываем файловую группу
ALTER DATABASE sales_archive MODIFY FILEGROUP
120 Глава 3. Справочник операторов SQL
sale_rpt_grp1
NAME = sales_hist_grp1
GO
Бывают ситуации, когда требуется добавить свободное пространство в базу дан
ных, в частности, если вы не используете автоматическое расширение файлов:
USE master
GO
ALTER DATABASE sales_report ADD FILE
( NAME = sales_rpt_added01, FILENAME = 'c:\mssql\data\salerptadded01.mdf',
SIZE = 50MB, MAXSIZE = 250MB, FILEGROWTH = 25MB )
GO
При изменении базы данных можно настроить различные параметры ее поведе
ния. Параметры состояния контролируют доступ пользователей к базе данных.
Список возможных параметров состояния следующий:
SINGLE_USER | RESTRICTED_USER | MULTI_USER
Устанавливает число и тип пользователей, имеющих доступ к базе данных.
Режим SINGLE_USER позволяет только одно пользовательское подключе
ние в каждый момент времени. Режим RESTRICTED_USER позволяет под
ключаться к базе данных только пользователям с системными ролями
db_owner, dbcreator и sysadmin. Режим MULTI_USER, использующийся по
умолчанию, разрешает одновременную работу с базой данных всех пользова
телей, обладающих достаточными привилегиями.
OFFLINE | ONLINE
Делает базу данных доступной (ONLINE) или недоступной (OFFLINE).
READ_ONLY | READ_WRITE
Делает базу данных доступной только для чтения (READ_ONLY) или для чте
ниязаписи (READ_WRITE). Базы данных в режиме READ_ONLY могут
быть очень быстрыми при выполнении запросов, так как в этом режиме поч
ти не используются блокировки.
Параметры курсоров определяют поведение курсоров. В синтаксисе ALTER DA0
TABASE, приведенном ранее, вы можете заменить параметры_курсоров на любое
из следующих ключевых слов:
CURSOR_CLOSE_ON_COMMIT { ON | OFF }
Если для параметра установлено значение ON, то все открытые курсоры за
крываются при фиксации или откате транзакции. Если установлено значение
OFF, то курсоры остаются открытыми при фиксации транзакции и закрыва
ются при откате, за исключением курсоров типа INSENSITIVE и STATIC.
CURSOR_DEFAULT { LOCAL | GLOBAL }
Устанавливает область видимости по умолчанию для курсоров в значение LO0
CAL или GLOBAL. (Детали приводятся далее в этой главе.)
Во фразе SET авто_параметры контролируют автоматическую работу базы данных
с файлами. Допустимые значения следующие:
CREATE/ALTER DATABASE 121
AUTO_CLOSE { ON | OFF }
Если установлено значение ON, то при отключении последнего пользователя
база данных останавливается и освобождаются все ресурсы. Если установле
но значение OFF, то при отключении последнего пользователя база данных
продолжает работать. OFF является значением по умолчанию.
AUTO_CREATE_STATISTICS { ON | OFF }
Если для параметра установлено значение ON, то SQL Server в процессе опти
мизации запроса автоматически собирает недостающую статистику. При зна
чении OFF статистика автоматически не собирается. ON является значением
по умолчанию.
AUTO_SHRINK { ON | OFF }
Если для параметра установлено значение ON, то файлы базы данных могут
быть автоматически сжаты (SQL Server периодически пытается сжать фай
лы, хотя делает это не всегда в предсказуемые моменты). Если установлено
значение OFF, то файл данных будет сжиматься, только если вы явно выпол
ните соответствующую команду. Значение OFF установлено по умолчанию.
AUTO_UPDATE_STATISTICS { ON | OFF }
При установленном значении ON устаревшая статистика обновляется авто
матически в процессе оптимизации запросов. При значении OFF статистика
обновляется только при явном выполнении команды UPDATE STATISTICS.
Параметры_sql настраивают совместимость базы данных со стандартом ANSI. Для
включения режима максимальной совместимости со стандартом ANSI SQL92 вы
можете использовать команду SET ANSI_DEFAULTS ON, вместо того чтобы на
страивать каждый параметр отдельно. Во фразе SET вы можете заменить пара
метры_sql на любое из следующих значений:
ANSI_NULL_DEFAULT { ON | OFF }
При установленном значении ON все столбцы таблицы, для которых в опера
торе CREATE TABLE не указана допустимость пустых значений, по умолча
нию создаются как NULL (допускаются значения NULL). Если для парамет
ра установлено значение OFF, то по умолчанию для столбцов используется
NOT NULL. OFF является значением по умолчанию.
ANSI_NULLS { ON | OFF }
При установленном значении ON любое сравнение с NULL имеет результат
UNKNOWN. Если для параметра установлено значение OFF, то результатом
сравнения является NULL, только если оба значения равны NULL. OFF явля
ется значением по умолчанию.
ANSI_PADDING { ON | OFF }
При установленном значении ON замыкающие пробелы в строках с типом
VARCHAR и VARBINARY при вставке или сравнении не усекаются. Если для
параметра установлено значение OFF, то замыкающие пробелы (или замы
кающие нули в случае двоичных значений) усекаются. По умолчанию уста
новлено значение ON (и мы крайне не рекомендуем его менять!)
122 Глава 3. Справочник операторов SQL
ANSI_WARNINGS { ON | OFF }
При установленном значении ON база данных выдает предупреждения при
возникновении проблем типа «деление на ноль» или «NULL при группиров
ке». Если для параметра установлено значение OFF, то предупреждения не
создаются. OFF является значением по умолчанию.
ARITHABORT { ON | OFF }
При установленном значении ON ошибки переполнения и деления на ноль
вызывают остановку выполнения запроса или пакета команд. Если для пара
метра установлено значение OFF, то возникают предупреждения об ошибоч
ных операциях, но обработка продолжается. По умолчанию используется ON
(и мы не рекомендуем менять это значение!)
CONCAT_NULL_YIELDS_NULL { ON | OFF }
При установленном значении ON конкатенация строки и значения NULL да
ет NULL. Если для параметра установлено значение OFF, то при конкатена
ции NULL обрабатывается как пустая строка. По умолчанию используется
значение OFF.
NUMERIC_ROUNDABORT { ON | OFF }
При установленном значении ON потеря точности числового значения вызы
вает ошибку. Если для параметра установлено значение OFF, то при потере
точности выполняется округление. По умолчанию используется OFF.
QUOTED_IDENTIFIER { ON | OFF }
При установленном значении ON двойные кавычки используются в качестве
ограничителей идентификаторов, содержащих специальные символы и заре
зервированные слова (например, таблица с названием SELECT). Если для па
раметра установлено значение OFF, то идентификаторы не могут содержать
специальные символы и зарезервированные слова, а двойные кавычки исполь
зуются для строковых литералов. OFF является значением по умолчанию.
RECURSIVE_TRIGGERS { ON | OFF }
Значение ON разрешает рекурсивное срабатывание триггеров. То есть дейст
вия одного триггера могут запускать другой триггер и т. д. Если для парамет
ра установлено значение OFF, то один триггер не может быть запущен дру
гим триггером. OFF является значением по умолчанию.
Параметры_восстановления определяют возможности восстановления базы данных.
Используйте в операторе ALTER DATABASE любое из следующих значений:
RECOVERY { FULL | BULK_LOGGED | SIMPLE }
В режиме FULL резервные копии базы данных и журналы транзакций обес
печивают полное восстановление даже для массовых операций, например
SELECT...INTO, CREATE INDEX. FULL является значением по умолчанию
в редакциях Standard Edition и Enterprise Edition. FULL обеспечивает макси
мальный уровень восстанавливаемости данных, даже после потери дисковых
носителей, но при этом использует больше места. В режиме BULK_LOGGED
используется минимальное журналирование массовых операций. Этот ре
жим обеспечивает экономию дискового пространства и меньшее количество
операций вводавывода, но увеличивается риск потери данных. В режиме
CREATE/ALTER FUNCTION/PROCEDURE 123
См. также
CREATE SCHEMA
DROP
CREATE/ALTER FUNCTION/PROCEDURE
Операторы CREATE FUNCTION и CREATE PROCEDURE очень похожи в син
таксисе и использовании (как и аналогичные операторы ALTER).
Оператор CREATE PROCEDURE используется для создания хранимых проце
дур, принимающих на вход аргументы и выполняющих условную обработку раз
личных объектов базы данных. В соответствии со стандартом ANSI хранимые
процедуры не возвращают значений (хотя могут иметь выходные параметры).
К примеру, вы можете использовать хранимую процедуру для закрытия финан
сового года.
Оператор CREATE FUNCTION создает пользовательские функции (userdefined
function или UDF), принимающие на вход аргументы и возвращающие резуль
тат, как это делают системные функции вроде CAST() или UPPER(). Созданные
функции можно использовать в запросах и в операциях с данными, такими как
INSERT и UPDATE, а также во фразе WHERE оператора DELETE. В главе 4
описаны системные функции и их реализации у разных производителей.
Синтаксис SQL2003
Для создания хранимой процедуры или функции используйте следующий син
таксис:
CREATE {PROCEDURE | FUNCTION} имя_объекта
( [{[IN | OUT | INOUT] [имя_параметра] тип_данных
[AS LOCATOR] [RESULT]} [, ...]] )
[ RETURNS тип_данных [AS LOCATOR]
[CAST FROM тип_данных [AS LOCATOR]] ]
[LANGUAGE {ADA | C | FORTRAN | MUMPS | PASCAL | PLI | SQL}]
[PARAMETER STYLE {SQL | GENERAL}]
[SPECIFIC специальное_имя]
[DETERMINISTIC | NOT DETERMINISTIC]
[NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA]
[RETURN NULL ON NULL INPUT | CALL ON NULL INPUT]
[DYNAMIC RESULT SETS целое_число]
[STATIC DISPATCH] блок_кода
Используйте следующий синтаксис для изменения существующей хранимой
процедуры или функции:
ALTER {PROCEDURE | FUNCTION} имя_объекта
[( {имя_параметра тип_данных }[, ...] )]
[NAME новое_имя_объекта]
[LANGUAGE {ADA | C | FORTRAN | MUMPS | PASCAL | PLI | SQL}]
[PARAMETER STYLE {SQL | GENERAL}]
[NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA]
[RETURN NULL ON NULL INPUT | CALL ON NULL INPUT]
[DYNAMIC RESULT SETS целое_число]
[CASCADE | RESTRICT]
Ключевые слова
CREATE {PROCEDURE | FUNCTION} имя_объекта
Создает новую хранимую процедуру или пользовательскую функцию с за
данным именем. Функция возвращает результат, а процедура (по стандарту
ANSI) – нет.
( [{[IN | OUT | INOUT] [имя_параметра] тип_данных [AS LOCATOR] [RESULT]}
[, ...]] )
Определяет список параметров (в скобках, через запятую), передаваемых в хра
нимую процедуру. Параметры могут быть входными (IN), выходными (OUT)
или быть и входными и выходными одновременно (INOUT).
Для определения параметров используется следующий синтаксис:
[{IN | OUT | INOUT}] имя_параметра_1 тип_данных,
[{IN | OUT | INOUT}] имя_параметра_2 тип_данных,[...]
Если вы указываете имя параметра, то убедитесь, что это имя уникально
в пределах процедуры. Необязательная фраза AS LOCATOR используется для
валидации внешних процедур с выходными параметрами типа BLOB, CLOB,
NCLOB, ARRAY или пользовательского типа. Если вы хотите на лету менять
тип данных выходного параметра, то используйте фразу CAST (описание
CREATE/ALTER FUNCTION/PROCEDURE 125
CONTAINS SQL
Указывает, что в функции используются операторы SQL, которые не чита
ют и не изменяют данные. Это значение по умолчанию.
READS SQL DATA
Указывает, что в функции используются операторы SELECT или FETCH.
MODIFIES SQL DATA
Указывает, что в функции используются операторы INSERT, DELETE
или UPDATE.
RETURN NULL ON NULL INPUT | CALL ON NULL INPUT
Эти опции используются при написании функций на языках, не поддержи
вающих значения NULL. Если вы выбрали параметр RETURN NULL ON
NULL INPUT, то функцию немедленно возвращает NULL, если значение
NULL подается на вход. Если же используется параметр CALL ON NULL IN0
PUT, то функция обрабатывает NULL в соответствии со стандартными прави
лами: к примеру, при сравнении двух значений NULL возвращается UN0
KNOWN. (Эта фраза используется в операторах CREATE/ALTER FUNC0
TION/PROCEDURE.) При использовании фразы в операторе ALTER можно
поменять текущий стиль работы с NULL на другой.
DYNAMIC RESULT SETS целое_число
Определяет число курсоров, которые могут быть открыты в хранимой проце
дуре и останутся видимыми после выхода из процедуры. Значение по умолча
нию равно 0. (Эта фраза не используется в операторах CREATE FUNCTION.)
При использовании в операторе ALTER текущее значение DYNAMIC RE0
SULT SETS меняется на новое.
STATIC DISPATCH
Возвращает статичные значения пользовательских типов данных и типов
ARRAY. Требуется для неSQL функций, использующих параметры пользова
тельских типов или типа ARRAY. (Эта фраза не используется в операторе
CREATE PROCEDURE.) Фраза должна быть последней перед блоком_кода.
блок_кода
Определяет процедурные операторы для выполнения работы внутри проце
дуры или функции. Это самая важная и обычно самая большая часть проце
дуры или функции. Мы предполагаем, что вас в первую очередь интересуют
функции, написанные на SQL, поэтому имейте в виду, что блок_кода не может
содержать операторы управления схемой (SQLSchema), операторы управле
ния транзакциями (SQLTransaction) и операторы управления подключения
ми (SQLConnection).
Хотя мы и предполагаем, что вас интересуют функции и процедуры, напи
санные на SQL (ведь, в конце концов, эта книга об SQL), вы можете указать,
что используется внешний код функции или процедуры. Для внешнего бло
ка_кода используется следующий синтаксис:
EXTERNAL [NAME external_routine_name] [PARAMETER STYLE
{SQL | GENERAL}] [TRANSFORM GROUP group_name]
CREATE/ALTER FUNCTION/PROCEDURE 127
где:
EXTERNAL [NAME имя_внешней_программы]
Определяет внешнюю программу и задает для нее имя. Если фраза опуще
на, то используется неименованная программа.
PARAMETER STYLE {SQL | GENERAL}
То же самое, что и для CREATE PROCEDURE.
TRANSFORM GROUP имя_группы
Трансформирует значения между пользовательскими типами данных
и локальными переменными хранимых процедур и функций. Если фраза
опущена, то по умолчанию используется TRANSFORM GROUP DEFAULT.
NAME новое_имя_объекта
Устанавливает для ранее созданной хранимой процедуры или функции новое
имя. Используется только в операторах ALTER FUNCTION/PROCEDURE.
CASCADE | RESTRICT
Позволяет каскадно распространить (CASCADE) выполняемые изменения
хранимой процедуры или функции на все зависимые процедуры и функции
либо запретить такое распространение (RESTRICT). Мы категорически не
рекомендуем выполнять оператор ALTER для изменения хранимых проце
дур и функций, имеющих зависимые объекты. Эта фраза используется толь
ко в операторах ALTER FUNCTION и ALTER PROCEDURE.
Общие правила
При создании пользовательской функции вы определяете входные параметры
и одно возвращаемое значение. Затем вы можете вызывать пользовательскую
функцию так же, как и любую другую функцию: например, в операторах SE0
LECT, INSERT или во фразе WHERE оператора DELETE.
Советы и хитрости
Ключевым преимуществом хранимых процедур и функций является тот факт,
что они скомпилированы, что означает, что после создания планы запросов со
храняются в базе данных. Скомпилированные процедуры и функции могут со
CREATE/ALTER FUNCTION/PROCEDURE 129
храняться (хотя и не всегда) в кэше базы данных, что также дает прирост произ
водительности. Процедуры и функции позволяют выполнить набор операторов
за одно обращение к серверу базы данных, что снижает сетевой трафик.
Реализация пользовательских функций и хранимых процедур может сильно от
личаться в разных СУБД. В некоторых платформах не поддерживаются внут
ренние блоки_кода; в этих платформах вы можете написать только внешний
блок_кода. В следующих разделах описываются отличия и возможности каждой
платформы.
Если вы выполняете оператор ALTER PROCEDURE или ALTER FUNCTION, то
некоторые объекты могут стать невалидными после изменения объектов, от ко
торых они зависят. Будьте внимательны и проверяйте все зависимости при из
менении процедур и функций.
MySQL
В MySQL поддерживаются как операторы ALTER и CREATE FUNCTION, так
и операторы ALTER и CREATE PROCEDURE.
Для операторов CREATE используется следующий синтаксис:
CREATE
[DEFINER = {пользователь | CURRENT_USER}]
{ FUNCTION | PROCEDURE } [база_данных.]имя_объекта
( [{IN | OUT | INOUT}] [параметр[, ...] )
[RETURNS тип_данных]
[NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA]
[COMMENT 'строка']
тело;
где:
CREATE { FUNCTION | PROCEDURE } [база_данных.]имя_объекта
Создает внешнюю функцию или процедуру с заданным именем длиной не
больше 64 символов. Модуль хранится в таблице proctable в базе данных.
DEFINER
Определяет пользователя, являющегося владельцем процедуры или функ
ции. По умолчанию владельцем становится текущий пользователь.
( [{IN | OUT | INOUT}] параметр[, ...] )
Определяет один или несколько параметров. Все параметры функции долж
ны быть входящими (IN), а параметры хранимых процедур могут быть любо
го из трех типов. В процедуре при неуказанном типе параметра он считается
входящим.
RETURNS тип_данных
Указывает любой из допустимых типов данных MySQL, используемый для
возвращаемого значения. Применяется только в операторах CREATE/AL0
TER FUNCTION.
COMMENT ‘строка’
Добавляет комментарий, который затем можно получить при помощи опера
торов SHOW CREATE PROCEDURE и SHOW CREATE FUNCTION.
130 Глава 3. Справочник операторов SQL
тело
Содержит один или несколько SQLоператоров. При использовании несколь
ких операторов их необходимо заключать в скобки BEGIN и END. В теле так
же могут содержаться такие элементы, как циклы, переменные, условные
операторы.
Процедуры и функции могут содержать DDLоператоры CREATE, ALTER
и DROP. Процедуры, но не функции также могут содержать операторы управле
ния транзакциями, такие как COMMIT или ROLLBACK. В функциях нельзя ис
пользовать любые операторы, которые явно или неявно завершают транзакции,
равно как нельзя использовать запросы без обработки их результатов, как, на
пример, оператор SELECT без фразы INTO. Ни процедуры, ни функции не мо
гут содержать команду LOAD DATA INFILE.
Любая созданная в MySQL функция может вызываться так же, как встроенные
функции, например ABS() или SOUNDEX(). Хранимые процедуры вызывают
ся при помощи оператора CALL.
Реализация оператора CREATE FUNCTION в MySQL давно поддерживает созда
ние пользовательских функций, использующих внешний код на C/C++ в опера
ционных системах, в которых возможна динамическая загрузка. Программа C/
C++ указывается в опции shared_program_library_name. Функция может быть
сразу откомпилирована сервером MySQL и будет доступна постоянно либо мо
жет быть динамически вызываемой программой. В следующем примере создает
ся пользовательская функция в базе данных, работающей на Unixсервере:
CREATE FUNCTION find_radius RETURNS INT SONAME "radius.so";
Oracle
Oracle поддерживает операторы ALTER и CREATE как для процедур, так и для
функций. (Вам может быть интересно познакомиться с пакетами, также исполь
зуемыми для создания хранимых процедур и функций. Читайте документацию
Oracle.) Синтаксис оператора CREATE PROCEDURE следующий:
CREATE [OR REPLACE] {FUNCTION|PROCEDURE}
[схема.]имя_объекта
[(параметр1 [IN | OUT | IN OUT] [NOCOPY] тип_данных[, ...])]
RETURN тип_данных
[DETERMINISTIC] [AUTHID {CURRENT_USER | DEFINER}]
[IS | AS] [EXTERNAL]
[PARALLEL_ENABLE
[( PARTITION имя_секции BY {ANY | {HASH | RANGE}
(столбец [, ...])} ) [{ORDER|CLUSTER} BY (столбец[, ...])]]]
{ {PIPELINED | AGGREGATE} [USING [схема.]тип_реализации] | [PIPELINED] {IS | AS} }
{блок_кода | LANGUAGE {JAVA NAME имя_внешней_программы |
C [NAME имя_внешней_программы]}
LIBRARY имя_библиотеки [AGENT IN (аргумент[, ...])]
[WITH CONTEXT]
[PARAMETERS ( параметры[, ...] )]};
Операторы ALTER FUNCTION/PROCEDURE используются для перекомпиля
ции невалидных хранимых процедур и функций.
CREATE/ALTER FUNCTION/PROCEDURE 131
PostgreSQL
PostgreSQL поддерживает операторы CREATE и ALTER FUNCTION, но не под
держивает CREATE и ALTER PROCEDURE. Так сделано потому, что для проце
дурной обработки можно использовать тот же мощный механизм функций. Для
создания функций используется следующий синтаксис:
CREATE [OR REPLACE] FUNCTION имя_функции
( [ параметр [{IN | OUT | INOUT}][, ...] ] )
[RETURNS тип_данных]
AS {блок_кода | объектный_файд, символьный_файл}
[ LANGUAGE {C | SQL | internal} |
{IMMUTABLE | STABLE | VOLATILE} |
{CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT |
STRICT} | [EXTERNAL] SECURITY INVOKER |
[EXTERNAL] SECURITY DEFINER ]
[WITH {[ISCACHABLE][,] [ISSTRICT]}]
Синтаксис ALTER FUNCTION следующий:
ALTER FUNCTION имя_функции
( [параметр [{IN | OUT | INOUT}][, ...] ] )
[RESTRICT]
[RENAME TO новое_имя_функции]
[OWNER TO новый_владелец]
[SET SCHEMA новая_схема]
Значение параметров следующее:
CREATE [OR REPLACE] FUNCTION имя_функции
Создает новую функцию с заданным именем или изменяет существующую
функцию. OR REPLACE не позволяет менять имя, входные параметры или
тип возвращаемого результата существующей функции; для изменения лю
бого из этих значений нужно удалить функцию и затем создать ее заново.
RETURNS тип_данных
Определяет тип данных результата, возвращаемого функцией. Не использу
ется для процедур.
блок_кода | объектный_файл, символьный_файл
Определяет структуру функции. Блок_кода представляет собой (в зависимости
от параметра LANGUAGE) вызов внутренней функции, путь и имя объектно
го файла, SQLзапрос или набор команд на процедурном языке. Также функ
ция может быть определена через объектный и символьный файл для вызова
функции, написанной на C.
LANGUAGE {C | SQL | internal}
Определяет вызов внешней программы или внутренней SQLпрограммы. Так
как все опции, кроме SQL, подразумевают программы, написанные на других
CREATE/ALTER FUNCTION/PROCEDURE 135
SQL Server
SQL Server поддерживает операторы CREATE и ALTER как для процедур, так
и для функций. По умолчанию хранимые процедуры могут возвращать резуль
тирующие наборы данных, а пользовательские функции могут возвращать набо
ры из одной или множества записей, используя возвращаемое значение типа
TABLE, что не предусмотрено стандартом ANSI. Тем не менее, это делает храни
мые процедуры и функции более гибкими и мощными. Для создания процедуры
или функции используется следующий синтаксис:
CREATE {FUNCTION | PROCEDURE}
[владелец.]имя_объекта[;целое_число]
( [ {@параметр тип_данных [VARYING] [=default] [OUTPUT]}
[READONLY][, ...] ] )
[RETURNS {тип_данных | TABLE]]
[WITH {ENCRYPTION | SCHEMABINDING | RECOMPILE |
RECOMPILE, ENCRYPTION |
RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT |
EXEC[UTE] AS {CALLER | SELF | OWNER |'имя_пользователя'}}]
[FOR REPLICATION]
[AS]
блок_кода
Для изменения процедуры или функции используется следующий синтаксис:
ALTER {FUNCTION | PROCEDURE}
[владелец.]имя_объекта[;целое_число]
([{@параметр тип_данных[VARYING][=default][OUTPUT]}[, ...]])
[RETURNS { тип_данных | TABLE}]
[WITH {ENCRYPTION | SCHEMABINDING | RECOMPILE |
RECOMPILE, ENCRYPTION |
RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT |
EXEC[UTE] AS {CALLER | SELF | OWNER |'имя_пользователя'}}]
[FOR REPLICATION]
[AS]
блок_кода
Значения параметров следующие:
CREATE {FUNCTION | PROCEDURE} [владелец.]имя_объекта [;целое_число]
Создает новую хранимую процедуру или пользовательскую функцию в теку
щей базе данных. Для хранимых процедур вы дополнительно можете указать
номер версии в формате имя_процедуры;1, где 1 – это целочисленный номер вер
CREATE/ALTER FUNCTION/PROCEDURE 137
сии. Этот параметр позволяет иметь в базе данных несколько версий одной
процедуры.
{@параметр тип_данных [VARYING] [=значение по умолчанию] [OUTPUT]} [READ0
ONLY][, ...]
Определяет один или несколько параметров. В SQL Server имена параметров
всегда начинаются с символа @.
VARYING
Используется в хранимых процедурах с параметрами типа CURSOR. Оз
начает, что набор строк создается динамически.
=значение по умолчанию
Устанавливает для параметра значение по умолчанию. Это значение ис
пользуется в тех случаях, когда процедура или функция вызывается без
явного указания значения для параметра.
OUTPUT
Используется в хранимых процедурах, функциональный эквивалент опи
санного в ANSI параметра OUT оператора CREATE FUNCTION. Значения
возвращаемых параметров передаются в вызывающий процесс через пере
менные команды EXEC[UTE]. Выходные параметры могут относиться
к любому типу данных за исключением TEXT и IMAGE.
READONLY
Используется в функциях для указания того, что параметр не модифици
руется внутри функции. Это особенно полезно для пользовательских ти
пов данных TABLE.
RETURNS {тип_данных | TABLE}
Позволяет функции возвращать одно значение указанного типа либо возвра
щать набор значений через тип данных TABLE. Функция называется встроен0
ной (inline), если она определяется одним единственным оператором SELECT
и для нее не приводится перечень столбцов. Если во фразе RETURNS исполь
зуется тип TABLE с определенным перечнем столбцов и их типов, то функ
ция называется многооператорной табличной функцией (multi0statement tab0
le0valued function).
WITH
Позволяет задать дополнительные характеристики пользовательской функ
ции или хранимой процедуры.
ENCRYPTION
Шифрует значение в столбце системной таблицы SQL Server, в которой
хранится текст процедуры или функции, защищая таким образом от неже
лательного просмотра кода. Используется с процедурами и с функциями.
SCHEMABINDING
Указывает, что функция привязывается к определенному объекту базы
данных, такому как таблица или представление. Этот объект базы данных
не может быть изменен или удален, пока существует функция (и пока ус
тановлена опция SCHEMABINDING). Используется только с функциями.
138 Глава 3. Справочник операторов SQL
RECOMPILE
Запрещает серверу кэшировать план хранимой процедуры. Вместо этого
план выполнения создается каждый раз заново. Эта возможность очень
полезна при использовании нетипичных или временных значений в про
цедуре, но может привести к серьезному падению производительности.
Используется только в хранимых процедурах. Обратите внимание, что оп
ции RECOMPLE и ENCRYPTION можно использовать одновременно.
EXEC[UTE] AS {CALLER | SELF| OWNER | 'имя_пользователя'}
Необязательная опция, определяющая, с какими привилегиями выполня
ется процедура или функция. CALLER означает, что при выполнении ис
пользуются привилегии вызывающего пользователя. CALLER является
значением по умолчанию. SELF обозначает, что выполнение производит
ся с привилегиями создателя. OWNER обозначает выполнение с правами
владельца. Наконец, можно явно указать пользователя, с правами которо
го будет выполняться процедура или функция.
FOR REPLICATION
Отключает выполнение хранимой процедуры на сервереподписчике. Эта
фраза в основном используется для создания фильтрующей хранимой проце
дуры, используемой встроенным в SQL Server механизмом репликации. Эта
опция несовместима с опцией WITH RECOMPILE.
Как и в случае с таблицами (смотрите CREATE TABLE), в SQL Server можно соз
давать локальные и глобальные временные хранимые процедуры, их названия
должны, соответственно, начинаться с одного или двух символов #. Временные
процедуры существуют только в рамках создавшей их сессии. Когда сессия за
вершается, все ее временные процедуры автоматически удаляются.
В SQL Server хранимая процедура или пользовательская функция может иметь
до 1024 параметров, обозначаемых символами @. Параметры должны иметь
стандартный тип данных SQL Server. (Параметры типа CURSOR должны быть
объявлены с опциями VARYING и OUTPUT.) Пользователь или вызывающий
процесс должны предоставить значения параметров. Для параметров можно ис
пользовать и значения по умолчанию. Значение по умолчанию должно быть
константой или NULL и может содержать обобщающие символы (wildcard).
В SQL Server требуется, чтобы функция имела один или более параметров, зада
ваемых пользователем. Для параметров можно использовать любой тип данных,
за исключением TIMESTAMP. Значение, возвращаемое функцией, может иметь
любой тип данных, за исключением TIMESTAMP, TEXT, NTEXT и IMAGE.
Для встроенных функций список столбцов возвращаемого типа TABLE указы
вать не нужно.
FROM sales AS s
JOIN titles AS t ON t.title_id = s.title_id
WHERE s.stor_id = @storeid )
Теперь давайте изменим тип параметра функции и добавим условие в WHERE
(изменения выделены жирным):
ALTER FUNCTION stores_titles(@stor_id VARCHAR(4))
RETURNS TABLE
AS
RETURN (SELECT title, qty
FROM sales AS s
JOIN titles AS t ON t.title_id = s.title_id
WHERE s.stor_id = @storeid
AND s.city = 'New York')
Пользовательские функции, возвращающие набор строк через тип данных TABLE,
часто используются во фразе FROM оператора SELECT точно так же, как и обыч
ные таблицы. Многооператорные табличные функции могут быть достаточно за
мысловатыми, так как состоят из набора операторов, заполняющих возвращае
мую переменную типа TABLE.
Вот пример использования табличной функции во фразе FROM. Обратите внима
ние, что вызываемой функции присваивается псевдоним, как и обычной таблице:
SELECT co.order_id, co.order_price
FROM construction_orders AS co,
fn_construction_projects('Cancelled') AS fcp
WHERE co.construction_id = fcp.construction_id
ORDER BY co.order_id
GO
В хранимых процедурах блок_кода может состоять из одного или нескольких
операторов TransactSQL, заключенных в BEGIN…END и занимающих объем до
128 Мбайт. Вот некоторые правила для хранимых процедур:
• В хранимых процедурах можно использовать большинство операторов Trans
actSQL за исключением операторов SET SHOWPLAN_TEXT и SET SHOW0
PLAN_ALL.
• Некоторые операторы при использовании из хранимых процедур имеют огра
ниченную функциональность. Это такие операторы, как ALTER TABLE,
CREATE INDEX, CREATE TABLE, все операторы DBCC, DROP TABLE,
DROP INDEX, TRUNCATE TABLE и UPDATE STATISTICS.
• В SQL Server используется отложенное разрешение имен, то есть хранимая
процедура может быть откомпилирована, даже если в ней есть ссылки на еще
не существующие объекты. SQL Server создает план выполнения, и процеду
ра завершается с ошибкой, только если в момент вызова объект все еще не су
ществует.
• Допускаются вложенные вызовы хранимых процедур. Если одна хранимая
процедура вызывает другую, то значение системной переменной @@NEST0
LEVEL увеличивается на 1. Значение уменьшается на 1 при завершении вы
званной процедуры. Для получения текущей глубины вложенности можно
из хранимой процедуры использовать команду SELECT @@NESTLEVEL.
CREATE/ALTER INDEX 141
См. также
CALL
RETURN
CREATE/ALTER INDEX
Индексы – это специальные объекты, созданные поверх таблиц, позволяющие
значительно ускорить такие операции манипуляции данными, как SELECT,
UPDATE и DELETE. Селективность фразы WHERE и набор планов выполне
ния, доступный оптимизатору, обычно зависят от качества индексов, построен
ных над конкретной таблицей базы данных.
Оператор CREATE INDEX не является частью стандарта ANSI, и поэтому реали
зация оператора значительно отличается на разных платформах.
142 Глава 3. Справочник операторов SQL
Общий синтаксис
CREATE [UNIQUE] INDEX имя_индекса ON имя_таблицы
(имя_столбца[, ...])
Ключевые слова
CREATE [UNIQUE] INDEX имя_индекса
Создает новый индекс с заданным именем в текущей базе данных и схеме.
Так как индексы связаны с конкретными таблицами (или иногда с представ
лениями), то имя индекса должно быть уникально в пределах таблицы, по
которой он построен. Ключевое слово UNIQUE указывает, что индекс являет
ся уникальным ограничением таблицы и запрещает повторяющиеся значе
ния в столбце или наборе столбцов, на которых он построен.
имя_таблицы
Указывает существующую таблицу, по которой строится индекс. Индекс зави
сит от таблицы: если удаляется таблица, то автоматически удаляется и индекс.
имя_столбца[, ...]
Определяет список индексируемых столбцов таблицы. Указатели на данные,
построенные по индексируемым столбцам, позволяют оптимизатору запро
сов значительно увеличить скорость выполнения таких операций, как SE0
LECT и DELETE. Большинство баз данных поддерживают составные индек0
сы, также называемые конкатенированными индексами, построенные по
двум или более столбцам, которые в поиске обычно используются вместе (на
пример, фамилия и имя).
Общие правила
Индексы строятся над таблицами для ускорения операций, использующих эти
таблицы, в частности, при использовании фраз WHERE и JOIN. Индексы могут
также ускорять некоторые другие операции:
• Нахождение минимального или максимального значения в индексирован
ном столбце.
• Сортировку или группировку столбца таблицы.
• Поиск по условиям IS NULL или IS NOT NULL.
• Быструю выборку данных из индексированных столбцов в случаях, когда все
необходимые для выполнения запроса данные находятся в индексе. Оператор
SELECT, извлекающий данные только из столбцов индекса и не затрагиваю
щий другие столбцы таблицы, называется покрывающим запросом. Соответ
ствующий индекс называется покрывающим индексом.
CREATE/ALTER INDEX 143
Советы и хитрости
Составные индексы наиболее полезны, если запросы чаще всего запрашивают
столбцы из левой части списка столбцов, по которым построен индекс. Если в за
просе не используются столбцы из левой части индекса, то запрос может не отра
ботать лучшим образом. Предположим, что у нас имеется индекс по столбцам
с фамилией и именем. Если в запросе мы используем только имя, то индекс, на
чинающийся с фамилии, вряд ли окажется нам полезным. Хотя механизмы за
просов в некоторых СУБД уже усовершенствованы таким образом, что подобная
ситуация не является проблемой.
Следует знать, что бывают ситуации, когда слишком большое количество индек
сов только ухудшит производительность системы. В целом индексы ускоряют
операции поиска в таблицах, например оператор SELECT. Однако каждый
индекс – это дополнительные накладные расходы при выполнении операций
UPDATE, DELETE и INSERT, потому что при изменении таблицы следует об
новить соответствующие индексы. Как правило, по одной таблице требуется не
более 6–12 индексов.
Также индексы требуют дополнительного места для хранения. Чем больше
столбцов в индексе, тем больше места он требует. Обычно это не представляет
большой проблемы, но иногда застает врасплох новичков.
В большинстве СУБД индексы используются для создания статистических вы
борок (называемых просто статистиками), позволяющих оптимизатору запро
сов определять, какой индекс или комбинация индексов лучше всего подходят
для выполнения запроса. Эти статистики после создания индекса всегда акту
альны, но могут устаревать по мере вставки и удаления записей в таблице. По
144 Глава 3. Справочник операторов SQL
этому и индексы по мере старения могут быть уже не столь полезными. Вам сле
дует внимательно следить за поддержкой статистик в актуальном состоянии.
MySQL
MySQL поддерживает оператор CREATE INDEX, но не поддерживает ALTER
INDEX. В зависимости от используемого механизма хранения данных (engine)
вы можете создавать разные типы индексов, не обязательно это будет индекс,
хранящийся в виде Bдерева в файле. У строк, используемых в индексах, авто
матически убираются пробелы в начале и конце. Синтаксис оператора CREATE
INDEX следующий:
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT] INDEX имя_индекса
[USING {BTREE | HASH | RTREE}]
ON таблица(столбец(длина)[, ...])
[KEY BLOCK SIZE целое_число]
[WITH PARSER имя_парсера]
где:
FULLTEXT
Создает по столбцу индекс для полнотекстового поиска. Этот тип индекса
поддерживается только механизмом MyISAM для типов данных CHAR, VAR0
CHAR и TEXT. Опция (длина) при этом не используется.
ONLINE | OFFLINE
ONLINE означает, что для создания индекса не требуется предварительно
копировать таблицу. OFFLINE копирует таблицу перед созданием индекса.
USING {BTREE | HASH | RTREE}
Определяет тип создаваемого индекса. Индексы типа RTREE используются
только для пространственных (SPATIAL) индексов. Используйте эту опцию
аккуратно, так как в разных механизмах хранения используются разные ти
пы индексов: в MyISAM поддерживаются BTREE и RTREE, InnoDB поддер
живает только BTREE, NDB поддерживает только HASH (а фразу USING
только для уникальных и первичных ключей), MEMORY/HEAP поддержи
вает HASH и BTREE. Этот параметр замещает использовавшийся в версиях
MySQL до 5.1.10 устаревший параметр TYPE.
KEY BLOCK SIZE целое_число
Рекомендует СУБД использовать указанный размер блока индекса. Значение
задается в килобайтах. Значение 0 применяется, когда следует использовать
размер блока по умолчанию для данного механизма хранения.
WITH PARSER имя_парсера
Используется только для индексов типа FULLTEXT для указания модуля
парсера, используемого с индексом. Модули подробно описаны в документа
ции MySQL.
MySQL поддерживает общепринятый синтаксис оператора CREATE INDEX.
Интересной особенностью является возможность построить индекс по несколь
ким первым символам столбца типа CHAR или VARCHAR (для столбцов типа
BLOB и TEXT указание количества индексируемых символов обязательно). Это
возможность очень полезна, когда первые несколько символов значения уже
CREATE/ALTER INDEX 145
Oracle
В Oracle оператор CREATE INDEX используется для создания индексов по табли
цам, секционированным таблицам, кластерам, индексноорганизованным табли
цам, скалярным атрибутам объектных типов, используемых в таблицах, и столб
цам типа «вложенная таблица». В Oracle используются разные типы индексов,
включая обычные индексы в виде Bдеревьев, BITMAPиндексы (индексы на ос
нове битовых карт, полезные в ситуациях, когда каждое значение столбца по
вторяется 100 и более раз), секционированные индексы, индексы на базе функ
ций (построенные не по значению столбца, а по выражению) и предметные (do
main) индексы.
| перестроение |
[DEALLOCATE UNUSED [KEEP целое_число [K | M | G | T]]]
[ALLOCATE EXTENT ( [SIZE целое_число [K | M | G | T]]
[DATAFILE 'имя_файла'] [INSTANCE целое_число] )]
[SHRINK SPACE [COMPACT] [CASCADE]]
[{PARALLEL [целое_число] | NOPARALLEL}]
[{LOGGING | NOLOGGING}]
[физические_атрибуты] }
Значения параметров следующие:
BITMAP
Вместо индексирования каждой отдельной записи таблицы создается бито
вая карта для каждого индексируемого значения. Битовые карты лучше ис
пользовать для таблиц, где данные редко изменяются несколькими парал
лельно работающими сеансами (например, для таблиц, которые в основном
читаются). BITMAPиндексы несовместимы с глобальными секционирован
ными индексами, фразой INDEXTYPE и «индекс»таблицами (indexorgani
zed tables) без таблицы соответствия логических и физических идентифика
торов строк.
ASC | DESC
Определяет порядок хранения значений в индексе по возрастанию (ASC) или
по убыванию (DESC). ASC используется как значение по умолчанию. Имейте
в виду, что в Oracle индексы DESC используются как индексы на базе функ
ций, поэтому есть определенная разница в работе ASC и DESC индексов. При
использовании INDEXTYPE указание ASC и DESC запрещено. DESC игно
рируется для индексов на основе битовых карт.
INDEXTYPE IS индексируемый_тип [PARAMETERS ('параметры')]
Строит индекс по пользовательскому типу данных. Для создания предметно
го индекса требуется, чтобы пользовательский тип уже существовал. Если
пользовательский тип требует параметров, то передавайте их с помощью фра
зы PARAMETERS. Также вы можете распараллелить построение индекса
при помощи фразы PARALLEL (рассматривается далее).
CLUSTER имя_кластера
Объявляет кластерный индекс на основе указанного кластера. В Oracle кла
стерный индекс физически хранит рядом две таблицы, обращение к которым
в запросах идет по одинаковым столбцам, обычно по первичному и внешнему
ключу. (Кластеры создаются при помощи специального оператора CREATE
CLUSTER.) При создании кластерного индекса не требуется указание табли
цы или индексируемых столбцов, потому что они указываются в операторе
CREATE CLUSTER.
GLOBAL секционирование
Полный синтаксис следующий:
GLOBAL PARTITION BY
{RANGE (список_столбцов) ( PARTITION [имя_секции]
VALUE LESS THAN (список_значений)
[физические_атрибуты]
[TABLESPACE табличное_пространство]
CREATE/ALTER INDEX 147
[TABLESPACE табличное_пространство]
[LOGGING | NOLOGGING] |
[COMPRESS | NOCOMPRESS] }[, ...]) ]
Значение всех параметров то же самое, что и для GLOBAL PARTITION
(смотрите ранее), за исключением того, что индекс локальный.
Секционирование по хеш0значениям
Применяются с таблицами, секционированными по хешзначениям. В этом
случае вы можете использовать синтаксис, приведенный ранее, либо для
хранения секций индекса в определенных табличных пространствах ис
пользовать следующий синтаксис:
LOCAL {STORE IN (табличное_пространство [, ...]) |
(PARTITION [имя_секции]
[TABLESPACE табличное_пространство])}
Если вы укажете больше табличных пространств, чем секций индекса, то
Oracle при секционировании будет циклически переходить между таблич
ными пространствами.
Составное секционирование индексов
Применяется с таблицами с составным (composite) секционированием. Ис
пользуется следующий синтаксис:
LOCAL [STORE IN (табличное_пространство [, ...])]
PARTITION [имя_секции]
{[ физические_атрибуты]
[TABLESPACE табличное_пространство]
[LOGGING | NOLOGGING] |
[COMPRESS | NOCOMPRESS]}
[ {STORE IN (табличное_пространство [, ...]) |
(SUBPARTITION [имя_подсекции]
[TABLESPACE табличное_пространство])} ]
Вы можете использовать фразу LOCAL STORE, используемую при секцио
нировании по хешзначениям, или фразу LOCAL, используемую при сек
ционировании по диапазону или списку значений. (При использовании
фразы LOCAL замените ключевое слово SUBPARTITION на PARTITION.)
физические_атрибуты
Устанавливает значения для параметров PCTFREE, PCTUSED и INITRANS.
По умолчанию используются значения PCTFREE 10, PCTUSED 40, INI0
TRANS 2.
PCTFREE целое_число
Устанавливает процент свободного пространства, оставляемого в каждом
блоке при создании индекса. Это ускоряет добавление и изменение запи
сей в таблице. Однако параметр PCTFREE учитывается только при созда
нии индекса. Поэтому свободное пространство может уменьшаться по ме
ре вставки, обновления и удаления записей.
PCTUSED целое_число
Говорит о том, когда блок следует помещать в список свободных блоков.
Если использованное пространство блока становится меньше указанного
CREATE/ALTER INDEX 149
LOGGING | NOLOGGING
Включает (LOGGING) или выключает (NOLOGGING) режим журналирова
ния при создании индекса. Эта фраза также определяет поведение по умолча
нию при массовых вставках с использованием утилиты SQL*Loader. В случае
секционированных индексов эта фраза устанавливает значение по умолча
нию для всех секций и соответствующих сегментов, а также для всех секций
и подсекций, добавляемых позднее оператором ALTER TABLE...ADD PARTI0
TION. (При работе в режиме NOLOGGING мы рекомендуем делать полную
резервную копию после построения индексов, чтобы не пришлось перестраи
вать индексы в случае сбоев.)
ONLINE
Разрешает манипуляции с данными таблицы в процессе создания индекса.
Даже в режиме ONLINE в конце процесса создания индекса таблица будет на
очень короткое время заблокирована. Все изменения в таблице, выполнен
ные в момент построения индекса, будут отражены в созданном индексе. Ре
жим ONLINE несовместим с битовыми и кластерными индексами, а также
с параллельным созданием индекса. Также его нельзя использовать с индек
сами по столбцам UROWID и индексноорганизованными таблицами с пер
вичным ключом из более чем 32 полей.
COMPUTE [STATISTICS]
Собирает статистику в момент создания индекса, когда это можно сделать
с минимальными затратами. Иначе статистику придется собирать после соз
дания индекса.
TABLESPACE {табличное_пространство | DEFAULT}
Определяет табличное пространство, в котором хранится индекс. Если таб
личное пространство не указано или явно выбрана опция DEFAULT, то ин
декс хранится в табличном пространстве, используемом по умолчанию. (Ло
кальные секционированные индексы, для которых указано TABLESPACE
DEFAULT, хранятся в тех же табличных пространствах, в которых хранятся
соответствующие секции таблицы.)
150 Глава 3. Справочник операторов SQL
COALESCE
Соединяет содержимое блоков индекса, используемых для поддержки ин
дексноорганизованных таблиц, с целью повторного использования блоков.
Опция COALESCE похожа на SHRINK, но COALESCE менее плотно сжимает
блоки и не освобождает неиспользуемое пространство.
[NO]MONITORING USAGE
Начинает мониторинг использования индекса, предварительно очищая преды
дущие результаты. Информация об использовании индекса отражается в сис
темном представлении V$OBJECT_USAGE. Для завершения мониторинга
необходимо явно выполнить оператор ALTER INDEX…NOMONITORING
USAGE.
UPDATE BLOCK REFERENCES
Обновляет все устаревшие указатели (guess data blocks) на блоки данных таб
лицы в обычных и предметных индексах, созданных для индексноорганизо
ванных таблиц. Эта фраза не может использоваться одновременно с любыми
другими фразами ALTER INDEX.
PARAMETERS ('параметры ODCI')
Определяет строку параметров, передаваемую без изменений в подпрограм
му ODCI предметного индекса. Строка параметров может иметь длину до
1000 символов. За дополнительной информацией обращайтесь к документа
ции производителя.
изменение_секционирования
Детальную информацию об этой опции читайте в разделе «Секционирован
ные и подсекционированные таблицы», приведенном в описании оператора
CREATE/ALTER TABLE для Oracle.
перестроение
Перестраивает индекс или отдельную секцию или подсекцию индекса. После
успешного перестроения индекс из состояния UNUSABLE переводится в со
стояние USABLE. Для перестроения используется следующий синтаксис:
REBUILD {[NO]REVERSE | [SUB]PARTITION имя_секции}
[{PARALLEL [int] | NOPARALLEL}]
[TABLESPACE tablespace_name]
[PARAMETERS ('ODCI_params')] [ONLINE]
[COMPUTE STATISTICS]
[COMPRESS int | NOCOMPRESS] [[NO]LOGGING]
[physical_attributes_clause]
где:
[NO]REVERSE
Хранит байты индексного блока за исключением ROWID в обратном по
рядке при перестроении индекса (REVERSE), либо хранит байты индекс
ного блока в обычном порядке (NOREVERSE).
DEALLOCATE UNUSED [KEEP целое_число [K | M | G | T]]
Освобождает неиспользуемое пространство в конце индекса (или каждой сек
ции секционированного индекса) и делает это пространство доступным для
152 Глава 3. Справочник операторов SQL
PostgreSQL
В PostgreSQL можно создавать индексы, отсортированные оп возрастанию, а так
же уникальные индексы. Также реализованы некоторые возможности для по
вышения производительности, настраиваемые фразой USING. Оператор CREA0
TE INDEX имеет следующий синтаксис:
CREATE [UNIQUE] INDEX [CONCURRENTLY] имя_индекса
ON имя_таблицы
[USING {BTREE | RTREE | HASH | GIST}]
{имя_функции | (столбец [, ...])}
[WITH FILLFACTOR = целое_число]
[TABLESPACE табличное_пространство]
[WHERE условие]
Синтаксис ALTER INDEX следующий:
ALTER INDEX имя_индекса
[RENAME TO новое_имя_индекса]
[SET TABLESPACE табличное_пространство]
[SET FILLFACTOR = целое_число]
[RESET FILLFACTOR = целое_число]
где:
CONCURRENTLY
Строит индекс без установки блокировок, предотвращающих вставку, обнов
ление и удаление записей таблицы. В обычном режиме PostgreSQL блокирует
запись в таблицу (но не чтение) до окончания операции. Построение индекса
с опцией CONCURRENTLY не рекомендуется в том случае, если вы не увере
ны, что таблица не будет модифицироваться.
USING {BTREE | RTREE | HASH | GIST}
Определяет один из трех (RTREE устарело) динамических методов доступа
для улучшения производительности. Особенно важно, что индексы являются
полностью динамическими и не требуют периодического обновления стати
стики.1 USING имеет следующие опции:
BTREE
Используется алгоритм Bдеревьев ЛеманаЯо с высокой степенью парал
лельности (high concurrency). Этот алгоритм используется по умолчанию.
Индексы на основе Bдеревьев могут быть использованы для операций
сравнения, таких как =, <, <=, >, >=. Индексы на основе Bдеревьев могут
быть построены по нескольким столбцам.
RTREE
Используется алгоритм Rдеревьев Гутмана. Индексы на основе Rдеревь
ев могут быть использованы для операций сравнения <<, &<, &>, >>, @,
~= и &&. Эти индексы должны быть одностолбцовыми. На текущий мо
мент это ключевое слово устарело и убрано из последней версии докумен
тации PostgreSQL, а в случае использования заменяется на USING GIST.
HASH
Используется алгоритм линейного хеширования Литвина. Хешиндексы
используются только при операциях = и должны быть одностолбцовыми.
GIST
Используется алгоритм GIST (Generalized Index Search Trees). GISTин
дексы могут быть многостолбцовыми.
имя_функции
Указывает имя функции, используемой в качестве значений для построения
индекса. Индекс по функции и обычный индекс по столбцам взаимно исклю
чают друг друга.
WITH FILLFACTOR = целое_число
Определяет процент заполнения каждой страницы индекса при его создании.
Для индексов на основе Bдеревьев этот параметр используется как при соз
дании индекса, так и при его расширении. По умолчанию используется зна
чение 90. PostgreSQL не поддерживает заполнение блоков на указанном
уровне в процессе работы, поэтому во избежание излишней фрагментации
и расщепления страниц рекомендуется периодически перестраивать индекс.
TABLESPACE табличное_пространство
Указывает, в каком табличном пространстве создается индекс.
WHERE условие
Определяет условие отбора для построения частичного индекса. Частичный
индекс содержит записи не для всех строк таблицы, а только для определен
ного множества. Используя эту фразу, можно получить интересные эффекты.
Комбинацией UNIQUE и WHERE можно обеспечить уникальность значений
на некотором множестве записей таблицы, а не на всей таблице. При исполь
зовании WHERE необходимо:
• Ссылаться на столбцы таблицы (не обязательно только на те, по которым
построен индекс).
• Не использовать агрегатные функции.
• Не использовать подзапросы.
[RENAME TO новое_имя_индекса] [SET TABLESPACE табличное_пространство]
[SET FILLFACTOR = целое_число] [RESET FILLFACTOR]
Позволяет изменить свойства существующего индекса, например переимено
вать его, использовать другое табличное пространство, установить новое зна
чение для процента заполнения блоков. Мы рекомендуем вместо опций SET
FILLFACTOR и RESET FILLFACTOR перестраивать индекс целиком коман
дой REINDEX для немедленного вступления изменений в силу.
156 Глава 3. Справочник операторов SQL
SQL Server
В SQL Server для оператора CREATE INDEX используется следующий синтаксис:
CREATE [UNIQUE] [[NON]CLUSTERED] INDEX имя_индекса
ON {таблица | представление} (столбец [ASC | DESC][, ...])
[INCLUDE (столбец [ASC | DESC][, ...])]
[WITH [PAD_INDEX = {ON | OFF}] [FILLFACTOR =целое_число] [IGNORE_DUP_KEY = {ON | OFF}]
[STATISTICS_NORECOMPUTE = {ON | OFF}]
[DROP_EXISTING = {ON | OFF}]
[ONLINE = {ON | OFF}] [SORT_IN_TEMPDB = {ON | OFF}]
[ALLOW_ROW_LOCKS = {ON | OFF}]
[ALLOW_PAGE_LOCKS = {ON | OFF}]
[MAXDOP = целое_число][, ...]]
[ON {файловая_группа | секция (столбец) | DEFAULT}]
[FILESTREAM_ON { имя_файлового_потока | секция | "NULL"}]
Синтаксис оператора ALTER INDEX следующий:
ALTER INDEX {имя_индекса | ALL} ON {имя_объекта}
{ DISABLE |
REBUILD [PARTITION = номер_секции] [WITH
( [ SORT_IN_TEMPDB = {ON | OFF} ]
[MAXDOP = целое_число][, ...] )]
[WITH [PAD_INDEX = {ON | OFF}][FILLFACTOR = целое_число]
[IGNORE_DUP_KEY = {ON | OFF}]
[STATISTICS_NORECOMPUTE = {ON | OFF}]
[SORT_IN_TEMPDB = {ON | OFF}]
[ALLOW_ROW_LOCKS = {ON | OFF}]
[ALLOW_PAGE_LOCKS = {ON | OFF}]
[MAXDOP = целое_число][, ...]] |
REORGANIZE [PARTITION = номер_секции]
[WITH (LOB_COMPACTION = {ON | OFF})] |
SET [ALLOW_ROW_LOCKS = {ON | OFF}]
[ALLOW_PAGE_LOCKS = {ON | OFF}]
[IGNORE_DUP_KEY = {ON | OFF}]
[STATISTICS_NORECOMPUTE = {ON | OFF}][, ...] }
где:
[NON]CLUSTERED
Индекс типа CLUSTERED определяет физическое упорядочивание записей
при хранении на диске. Столбцы кластерного (CLUSTERED) индекса исполь
CREATE/ALTER INDEX 157
зуются для сортировки записей таблицы. То есть, если в таблице Foo создан
возрастающий CLUSTEREDиндекс по столбцу A, то записи таблицы буду за
писываться на диск в алфавитном порядке. Опция NONCLUSTERED исполь
зуется для создания вторичного индекса, содержащего только указатели на
данные и не определяющего физический порядок строк на диске.
ASC | DESC
Указывает, что значения в индексе хранятся по возрастанию (ASC) или по
убыванию (DESC). Если не указано ни то ни другое, используется возрастаю
щий порядок.
WITH
Используется для определения дополнительных атрибутов индекса.
PAD_INDEX = {ON | OFF}
Указывает, что в конце каждой 8килобайтной страницы индекса следует
оставлять неиспользуемое пространство в соответствии со значением па
раметра FILLFACTOR.
FILLFACTOR = целое_число
Определяет процент заполнения каждой 8килобайтной страницы индек
са при его создании. Это полезно для уменьшения конкуренции за страни
цы и расщепления страниц при их заполнении. Создание кластерного ин
декса с явно указанным значением FILLFACTOR увеличивает размер ин
декса, но ускоряет работу с ним в определенных ситуациях.
IGNORE_DUP_KEY = {ON | OFF}
Определяет, что происходит, когда операция вставки пытается вставить
в уникальный индекс повторяющиеся значения ключа. Параметр IGNO0
RE_DUP_KEY применяется только к операциям вставки, производимым
после создания или перестроения индекса. Параметр не работает во время
выполнения инструкции CREATE INDEX, ALTER INDEX или UPDATE.
Значение по умолчанию – OFF.
Если установлено ON, то выводится предупреждающее сообщение. С ошиб
кой завершаются только строки, нарушающие ограничение уникальности.
Если установлено OFF, то выводится сообщение об ошибке. Будет выпол
нен откат всей операции INSERT.
DROP_EXISTING = {ON | OFF}
Указывает, что названный существующий кластеризованный или некла
стеризованный индекс удаляется и перестраивается.
STATISTICS_NORECOMPUTE = {ON | OFF}
Позволяет не собирать статистику при создании индекса. Это дает воз
можность ускорить выполнение CREATE INDEX, но может сделать рабо
ту оптимизатора менее эффективной.
ONLINE = {ON | OFF}
Определяет возможность использования таблицы для запросов и измене
ния данных в момент создания индекса. По умолчанию установлено зна
чение OFF. В режиме ON создаются не долговременные блокировки на за
пись, а только разделяемые блокировки.
158 Глава 3. Справочник операторов SQL
См. также
CREATE/ALTER TABLE
DROP
CREATE/ALTER METHOD
Операторы CREATE/ALTER METHOD создают и изменяют методы в базе дан
ных. Если попытаться объяснить просто (но не очень точно), то метод – это поль
зовательская функция, связанная с пользовательским типом данных.
160 Глава 3. Справочник операторов SQL
Например, метод getBonus типа Emp мог бы принимать входной параметр с про
центной ставкой и возвращать для сотрудника его бонус по формуле salary*rate
(пример для DB2):
CREATE METHOD getBonus (rate DOUBLE)
FOR Emp
RETURN SELF..salary * rate
Неявный метод создается для каждого пользовательского типа. С помощью ком
бинации операторов CREATE TYPE и CREATE METHOD создаются пользова
тельские методы.
Синтаксис SQL2003
{CREATE | ALTER} [INSTANT | STATIC] METHOD имя_метода
( [{IN | OUT | INOUT}] параметр тип_данных
[AS LOCATOR] [RESULT][, ...] )
RETURNS тип_данных
FOR пользовательский_тип_данных
[SPECIFIC специальное_имя] блок_кода
Ключевые слова
{CREATE | ALTER} [INSTANT | STATIC] имя_метода
Создает новый метод или изменяет существующий. Для метода можно ука
зать опции INSTANT и STATIC.
([{IN | OUT | INOUT}] параметр тип_данных[, ...])
Определяет один или несколько (через запятую, в скобках) параметров, пере
даваемых в метод. Параметры могут быть входными (IN), выходными (OUT)
или двунаправленными (INOUT). Синтаксис для объявления параметров
следующий:
[{IN | OUT | INOUT}] параметр1 тип_данных,
[{IN | OUT | INOUT}] параметр2 тип_данных,[...]
Имя параметра должно быть уникально в пределах метода. С помощью опе
ратора ALTER можно добавить новые параметры. Информация о типах дан
ных приводится в главе 2.
AS LOCATOR
Используется для валидации внешних подпрограмм, возвращающих пара
метры типов BLOB, CLOB, NCLOB, ARRAY и пользовательских типов. Дру
гими словами, возвращается указатель на большой объект, а не сам объект.
CREATE/ALTER METHOD 161
RESULT
Обозначает пользовательский тип данных, не используется для стандартных
типов.
RETURNS тип_данных
Определяет тип данных результата, возвращаемого методом. Основным на
значением пользовательского метода является возврат результата. Если нуж
но на лету менять тип возвращаемого результата, то используйте фразу CAST
(обратитесь к описанию функции CAST), например RETURNS VARCHAR(12)
CAST FROM DATE.
FOR пользовательский_тип_данных
Связывает метод с уже существующим пользовательским типом данных, соз
данным с помощью оператора CREATE TYPE.
SPECIFIC специальное_имя
Уникально идентифицирует функцию, обычно используется с пользователь
скими типами данных.
Общие правила
Методы – это просто другой подход для получения того же результата, что и при
применении пользовательских функций. Например, рассмотрим два следую
щих фрагмента кода:
CREATE FUNCTION my_fcn (order_udt)
RETURNS INT;
CREATE METHOD my_mthd ( )
RETURNS INT
FOR order_udt;
Хотя код функции и метода отличается, они делают одно и то же. Правила ис
пользования и вызова методов такие же, как для функций.
Советы и хитрости
Основной сложностью операторов CREATE METHOD является то, что они ис
пользуют объектноориентированный подход для той же функциональности, что
и обычные пользовательские функции. При наличии двух различных подходов
бывает сложно выбрать, какой из них использовать.
MySQL
Не поддерживается.
Oracle
Не поддерживается.
PostgreSQL
Не поддерживается.
SQL Server
Не поддерживается.
162 Глава 3. Справочник операторов SQL
См. также
CREATE/ALTER TYPE
CREATE ROLE
Оператор CREATE ROLE позволяет создавать именованный набор привилегий,
которые затем выдаются пользователям базы данных. Если пользователю назна
чена роль, то он получает все привилегии и разрешения этой роли. Роли являют
ся общепринятым механизмом для поддержки безопасности и контроля приви
легий в базе данных.
Синтаксис SQL2003
CREATE ROLE имя_роли[WITH ADMIN {CURRENT_USER|CURRENT_ROLE}]
Ключевые слова
CREATE ROLE имя_роли
Создает новую роль. Привилегии можно выдавать непосредственно пользова
телю, а можно того же результата добиться, выдавая привилегии роли, а уже
роль – пользователю. Важное ротличие состоит в том, что роль можно назна
чить одному или нескольким пользователям, и каждый из них получит все
привилегии этой роли.
WITH ADMIN {CURRENT_USER | CURRENT_ROLE}
Немедленно назначает роль текущему пользователю или текущей активной
роли с возможностью назначать роль другим пользователям. По умолчанию
используется WITH ADMIN CURRENT_USER.
Общие правила
Управление безопасностью с помощью ролей сильно упрощает администрирова
ние и поддержку пользователей. Для использования ролей необходимо выпол
нить следующие шаги:
1. Определите необходимые роли и выберите для них названия (например, ad0
ministrator, manager, data_entry, report_writer и т. д.).
2. Используя оператор GRANT, выдайте каждой роли необходимые привиле
гии, как если бы это был обычный пользователь. Например, роли manager
могли бы быть предоставлены права на чтение и запись любой таблицы в базе
данных, а роли report_writer – права на чтение таблиц, используемых для по
строения отчетов.
CREATE ROLE 163
Советы и хитрости
Иногда администратор базы данных может одновременно выдать привилегию
пользователю напрямую и через роль. Это может быть проблемой, так как если
вам понадобиться забрать эту привилегию у пользователя, то это придется де
лать дважды: сперва отключить у пользователя роль, а затем отключить приви
легию, выданную пользователю напрямую.
MySQL
Не поддерживается.
Oracle
В Oracle поддерживается оператор ALTER ROLE, не описанный в стандарте ANSI.
Oracle поддерживает концепцию ролей, хотя реализация соответствующих опе
раторов значительно отличается от ANSI:
{CREATE | ALTER} ROLE имя_роли
[NOT IDENTIFIED |
IDENTIFIED {BY пароль| EXTERNALLY | GLOBALLY |
USING имя_пакета}]
где:
{CREATE | ALTER} ROLE имя_роли
Указывает имя создаваемой или изменяемой роли.
NOT IDENTIFIED
Указывает, что авторизация роли осуществляется базой данных и для ее
включения не требуется пароль. Является настройкой по умолчанию.
IDENTIFIED
Указывает, что перед активацией роли оператором SET ROLE пользователь
должен быть аутентифицирован указанным способом:
BY пароль
Указывает пароль, используемый для аутентификации. В качестве паро
ля используется строка однобайтных символов, даже если в базе данных
используется многобайтная кодировка.
EXTERNALLY
Создает роль с аутентификацией, выполняемой операционной системой
или сторонним программным обеспечением. В любом случае внешняя
аутентификация вероятнее всего также потребует пароль.
GLOBALLY
Создает глобальную роль, аутентифицируемую с помощью корпоративной
службы каталогов, например LDAPкаталогом.
164 Глава 3. Справочник операторов SQL
USING имя_пакета
Создает роль, активируемую через указанный PL/SQL пакет. Если схема
не указана, то подразумевается, что пакет находится в текущей схеме.
В Oracle роль сперва создается, затем с помощью оператора GRANT роли, как
и обычному пользователю, выдаются необходимые разрешения и привилегии.
Если пользователь хочет воспользоваться разрешениями роли, защищенной па
ролем, он должен выполнить команду SET ROLE, в которой необходимо указать
пароль.
Oracle поставляется с несколькими предварительно сконфигурированными роля
ми. Роли CONNECT, DBA и RESOURCE имеются во всех версиях Oracle. EXP_
FULL_DATABASE и IMP_FULL_DATABASE – новые роли, используемые для
операций экспорта и импорта данных. Детальная информация о стандартных
ролях Oracle приводится в описании оператора GRANT.
В следующем примере при помощи оператора CREATE создается новая роль, за
тем этой роли выдаются привилегии, далее оператором ALTER ROLE устанавли
вается пароль и, наконец, роль назначается нескольким пользователям:
CREATE ROLE boss;
GRANT ALL ON employee TO boss;
GRANT CREATE SESSION, CREATE DATABASE LINK TO boss;
ALTER ROLE boss IDENTIFIED BY le_grand_fromage;
GRANT boss TO emily, jake;
PostgreSQL
PostgreSQL поддерживает операторы ALTER и CREATE ROLE, а также предла
гает практически идентичные операторы ALTER/CREATE GROUP. Синтаксис
CREATE ROLE следующий:
{CREATE | ALTER} ROLE имя_роли
[ [WITH] [[NO]SUPERUSER] [[NO]CREATEDB] [[NO]CREATEUSER] [[NO]INHERIT]
[[NO]LOGIN]
[CONNECTION LIMIT целое_число]
[ {ENCRYPTED | UNENCRYPTED} PASSWORD 'пароль' ]
[VALID UNTIL 'дата и время'] [IN ROLE имя_роли[, ...]]
[IN GROUP имя_группы[, ...]] [ROLE имя_роли [, ...]]
[ADMIN имя_роли [, ...]] [USER имя_роли [, ...]]
[SYSID целое_число][...] ]
[RENAME TO новое_имя]
[SET параметр {TO | =} {значение | DEFAULT}]
[RESET параметр]
где:
{CREATE | ALTER} ROLE имя_роли
Указывает имя создаваемой или изменяемой роли.
[NO]SUPERUSER
Определяет, является роль привилегированной или нет. Привилегированная
роль имеет приоритет над любыми ограничениями доступа в базе данных. По
умолчанию используется NOSUPERUSER.
CREATE ROLE 165
[NO]CREATEDB
Определяет, имеет ли роль права на создание баз данных. По умолчанию ис
пользуется NOCREATEDB.
[NO]CREATEROLE
Определяет, имеет ли роль права на создание, модификацию и удаление дру
гих ролей. По умолчанию используется NOCREATEROLE.
[NO]CREATEUSER
Определяет, имеет ли роль права на создание пользователей. Это ключевое
слово устарело, вместо него нужно использовать [NO]SUPERUSER.
[NO]INHERIT
Определяет, наследует ли роль привилегии тех ролей, членом которых она
является. Если установлено значение INHERIT, то роль автоматически по
лучает привилегии ролей, членом которых она является (напрямую или опо
средованно). По умолчанию используется NOINHERIT.
[NO]LOGIN
Определяет, может ли роль подключаться к базе данных. Роль с опцией LOGIN
является просто пользователем. Роль с NOLOGIN является набором привиле
гий в базе данных. По умолчанию используется NOLOGIN.
CONNECTION LIMIT целое_число
Определяет максимальное допустимое число одновременных подключений
для роли с опцией LOGIN. По умолчанию используется значение –1, что озна
чает отсутствие ограничения.
{ENCRYPTED | UNENCRYPTED} PASSWORD 'пароль'
Устанавливает пароль для роли с опцией LOGIN. Пароль может храниться
как обычный текст (UNENCRYPTED) или зашифрованный по алгоритму
MD5 (ENCRYPTED). Старые клиенты могут не поддерживать аутентифика
цию посредством MD5, так что будьте осторожны.
VALID UNTIL 'дата и время'
Для роли с опцией LOGIN устанавливает дату и время, когда истекает срок ее
действия. По умолчанию срок действия роли не ограничен.
IN ROLE, IN GROUP
Указывает роли и группы (хотя группы устарели), членом которых является
данная роль.
ROLE, GROUP
Указывает роли и группы (хотя группы устарели), автоматически становя
щиеся членами данной роли.
ADMIN имя_роли
Делает то же, что и опция ROLE, только роли добавляются с параметром
WITH ADMIN OPTION, что позволяет им предоставлять членство в роли
другим ролям.
166 Глава 3. Справочник операторов SQL
SQL Server
SQL Server поддерживает операторы CREATE и ALTER ROLE, а также анало
гичную функциональность через системную хранимую процедуру sp_add_role.
Используется следующий синтаксис:
CREATE ROLE имя_роли [AUTHORIZATION имя_владельца]
[WITH NAME = новое_имя]
где:
AUTHORIZATION имя_владельца
Указывает для роли имя владельца. По умолчанию владельцем роли стано
вится тот пользователь, который ее создает. Используется только в CREATE
ROLE.
WITH NAME = новое_имя
Устанавливает для роли новое имя. Используется только в ALTER ROLE.
См. также
GRANT
REVOKE
CREATE SCHEMA
Этот оператор создает схему, то есть именованную группу связанных объектов.
Схема – это набор таблиц, представлений и разрешений, выданных пользовате
лям и ролям. В соответствии со стандартом ANSI разрешения на объекты не явля
ются объектами сами по себе, и поэтому не принадлежат конкретной схеме. Одна
ко роли являются наборами привилегий и принадлежат конкретным схемам.
Синтаксис SQL2003
CREATE SCHEMA [имя_схемы] [AUTHORIZATION имя_владельца]
[DEFAULT CHARACTER SET кодировка]
[PATH имя_схемы[, ...]]
[ ANSI CREATE операторы [...] ]
[ ANSI GRANT операторы [...] ]
Ключевые слова
CREATE SCHEMA [имя_схемы]
Создает схему с заданным именем. Если имя не указано, то создается схема
с именем пользователя, создавшего схему.
AUTHORIZATION имя_владельца
Указывает имя владельца схемы. По умолчанию владельцем схемы становит
ся ее создатель. Стандарт ANSI позволяет не указывать либо имя схемы, либо
фразу AUTHORIZATION, но можно указать оба параметра одновременно.
DEFAULT CHARACTER SET кодировка
Устанавливает кодировку, используемую по умолчанию для всех создавае
мых в схеме объектов.
PATH имя_схемы[, ...]
Устанавливает список схем, в которых будет осуществляться поиск подпро
грамм, если явно не задать схему (то есть хранимых процедур, пользователь
ских функций и методов).
ANSI CREATE операторы
Содержит один или несколько операторов CREATE. Между операторами за
пятые не ставятся.
ANSI GRANT операторы
Содержит операторы GRANT, применяющиеся к существующим объектам.
Обычно это объекты, создаваемые в этом же операторе CREATE SCHEMA, но
также это могут быть любые другие объекты. Между операторами не исполь
зуются запятые.
Общие правила
Оператор CREATE SCHEMA является контейнером, который может содержать
другие операторы CREATE и GRANT. Проще всего представлять схему как набор
всех объектов, принадлежащих определенному пользователю. Например, поль
зователь jake может быть владельцем нескольких таблиц и представлений в сво
ей схеме, включая таблицу publishers. В то же время пользователь dylan также
может быть владельцем нескольких таблиц и представлений в своей схеме
и также может иметь свою собственную таблицу publishers.
Стандарт ANSI требует, чтобы в операторе CREATE SHEMA можно было исполь
зовать любые другие операторы CREATE. Однако на практике большинство реа
лизаций допускают применение только трех подчиненных операторов: CREATE
TABLE, CREATE VIEW и GRANT. Порядок команд не важен, то есть вы можете
написать операторы выдачи привилегий раньше операторов создания объектов,
на которые выдаются привилегии (хотя такой подход не рекомендуется).
168 Глава 3. Справочник операторов SQL
Советы и хитрости
Хорошей практикой является написание операторов CREATE и GRANT внутри
CREATE SCHEMA в порядке их действительного выполнения. Другими словами,
оператор CREATE VIEW должен идти после оператора CREATE TABLE, от кото
рого он зависит, а соответствующий оператор GRANT должен идти последним.
Если в вашей базе данных используются схемы, то мы рекомендуем всегда ука
зывать полные имена объектов с указанием схемы (например, jake.publishers).
Если вы не укажете схему явно, то в большинстве случаев будет подразумевать
ся текущая схема.
Некоторые платформы не поддерживают явно оператор CREATE SCHEMA. Од
нако они неявно создают схему при создании пользователем объектов. Напри
мер, Oracle создает схему для каждого пользователя. Оператор CREATE SCHE0
MA – это просто возможность одним шагом создать таблицы, представления
и другие объекты вместе с соответствующими привилегиями.
MySQL
В MySQL оператор CREATE SCHEMA поддерживается как синоним оператора
CREATE DATABASE. За информацией обращайтесь к соответствующему разделу.
Oracle
В Oracle оператор CREATE SCHEMA на самом деле не создает схему, схема соз
дается оператором CREATE USER. Что делает CREATE SCHEMA, так это вы
полняет в ранее созданной схеме набор операторов CREATE и GRANT одной ко
мандой:
CREATE SCHEMA AUTHORIZATION имя_схемы
[ ANSI CREATE операторы [...] ]
[ ANSI GRANT операторы [...] ]
Имейте в виду, что в операторе CREATE SCHEMA можно применить только
CREATE TABLE, CREATE VIEW и GRANT, причем в этом случае нельзя исполь
зовать ни одно из нестандартных расширений указанных команд.
В следующем примере выдача привилегий на объекты указывается раньше, чем
создаются сами объекты:
CREATE SCHEMA AUTHORIZATION emily
GRANT SELECT, INSERT ON view_1 TO sarah
GRANT ALL ON table_1 TO sarah
CREATE VIEW view_1 AS
SELECT column_1, column_2
FROM table_1
ORDER BY column_2
CREATE TABLE table_1(column_1 INT, column_2 CHAR(20));
Этот пример показывает, что порядок операторов внутри CREATE SCHEMA не
важен: Oracle фиксирует CREATE SCHEMA только в том случае, если успешно
выполняются все вложенные операторы.
CREATE SCHEMA 169
PostgreSQL
В PostgreSQL поддерживаются и CREATE, и ALTER SCHEMA, но не поддержива
ются фразы PATH и DEFAULT CHARACTER SET. Синтаксис CREATE SCHEMA
следующий:
CREATE SCHEMA { имя_схемы [AUTHORIZATION имя_пользователя] |
AUTHORIZATION имя_пользователя }
[ ANSI CREATE операторы [...] ]
[ ANSI GRANT операторы [...] ]
Если не указать имя схемы, то в качестве имени схемы будет использовано имя
пользователявладельца схемы. Внутри оператора CREATE SCHEMA поддер
живаются только следующие операторы CREATE: CREATE TABLE, CREATE
VIEW, CREATE INDEX, CREATE SEQUENCE и CREATE TRIGGER. Другие
операторы CREATE нужно выполнять отдельно.
Синтаксис ALTER SCHEMA следующий:
ALTER SCHEMA имя_схемы [RENAME TO новое_имя_схемы ]
[OWNER TO новое_имя_пользователя]
Оператор ALTER SCHEMA позволяет переименовывать схему или присваивать
ее новому владельцу.
SQL Server
SQL Server поддерживает базовую функциональность оператора CREATE SCHE0
MA, без фраз PATH и DEFAULT CHARACTER SET:
CREATE SCHEMA AUTHORIZATION имя_пользователя
[ ANSI CREATE операторы [...] ]
[ ANSI GRANT операторы [...] ]
Если возникает ошибка в любом из вложенных операторов, то оператор CREATE
STATEMENT завершается с ошибкой.
В SQL Server не требуется, чтобы вложенные операторы CREATE и GRANT шли
в какомто определенном порядке, за исключением того, что в логическом поряд
ке должны создаваться представления. То есть, если представление view_100
ссылается на представление view_10, то создание view_10 должно появиться
в CREATE SCHEMA раньше, чем создание view_100.
Например:
CREATE SCHEMA AUTHORIZATION katie
GRANT SELECT ON view_10 TO public
CREATE VIEW view_10(col1) AS SELECT col1 FROM foo
CREATE TABLE foo(col1 INT)
CREATE TABLE foo
(col1 INT PRIMARY KEY,
col2 INT REFERENCES foo2(col1))
CREATE TABLE foo2
(col1 INT PRIMARY KEY,
col2 INT REFERENCES foo(col1));
170 Глава 3. Справочник операторов SQL
См. также
CREATE/ALTER TABLE
CREATE/ALTER VIEW
GRANT
CREATE/ALTER TABLE
Управление таблицами является самой распространенной задачей, выполняе
мой администраторами и разработчиками при работе с объектами базы данных.
В этом разделе рассказывается, как создавать и изменять таблицы.
Стандарт ANSI представляет в некотором роде наименьший общий знаменатель
среди всех реализаций. Хотя не все производители полностью поддерживают
стандартные версии операторов CREATE TABLE и ALTER TABLE, стандарт ANSI
предлагает базовый формат, который можно использовать на всех платформах.
Производители же наоборот предлагают множество расширений и дополнений
к операторам CREATE и ALTER TABLE.
Синтаксис SQL2003
Согласно SQL2003 оператор CREATE TABLE используется для создания в базе
данных постоянных или временных таблиц. Используется следующий синтаксис:
CREATE [{LOCAL TEMPORARY| GLOBAL TEMPORARY}] TABLE
имя_таблицы
(имя_столбца тип_данных атрибуты[, ...]) |
[имя_столбца WITH OPTIONS опции] |
[LIKE имя_столбца] |
[REF IS имя_столбца
CREATE/ALTER TABLE 171
Ключевые слова
CREATE [{LOCAL TEMPORARY | GLOBAL TEMPORARY}] TABLE
Создает постоянную или временную (TEMPORARY) таблицу. Временная таб
лица может быть локальной (LOCAL) или глобальной (GLOBAL). Локальные
временные таблицы доступны только создавшей их сессии и автоматически
удаляются после завершения этой сессии. Глобальные временные таблицы
доступны всем активным сессиям, но также удаляются после завершения
сессии, создавшей временную таблицу. Не добавляйте к имени глобальной
временной таблицы имя схемы.
имя_столбца тип_данных атрибуты[, ...]
Один или несколько столбцов (в списке через запятую) с указанием их типов
данных и дополнительных атрибутов. Для создания таблицы необходимо
объявить как минимум один столбец, указав следующие параметры:
имя_столбца
Определяет имя столбца. Имя должно являться допустимым идентифика
тором. Убедитесь, что имя столбца осмысленно и понятно.
тип_данных
Определяет тип данных столбца. Для некоторых типов можно также до
полнительно определить длину значения, например VARCHAR(25). Тип
данных должен быть допустим в используемой СУБД. Полное описание
допустимых типов данных и их реализаций приводится в главе 2.
атрибуты
Определяет для столбца дополнительные атрибуты. При указании не
скольких атрибутов запятые между ними не нужны. В ANSI описаны сле
дующие основные атрибуты:
NOT NULL
Указывает, что столбец не допускает значения NULL (или допускает, если
атрибут не указан). Любой оператор INSERT или UPDATE, который по
172 Глава 3. Справочник операторов SQL
Общие правила
Типичный оператор CREATE TABLE очень прост. Обычно он просто именует
таблицу и столбцы таблицы. Часто определения таблицы также содержат огра
ничения на пустые значения, как в следующем примере для SQL Server:
CREATE TABLE housing_construction
(project_number INT NOT NULL,
project_date DATE NOT NULL,
project_name VARCHAR(50) NOT NULL,
construction_color NCHAR(20) ,
construction_height DECIMAL(4,1),
construction_length DECIMAL(4,1),
construction_width DECIMAL(4,1),
construction_volume INT )
В этом примере демонстрируется создание внешнего ключа:
Создаем ограничение на уровне столбца
CREATE TABLE favorite_books
(isbn CHAR(100) PRIMARY KEY,
book_name VARCHAR(40) UNIQUE,
category VARCHAR(40) ,
subcategory VARCHAR(40) ,
pub_date DATETIME NOT NULL,
purchase_date DATETIME NOT NULL,
CONSTRAINT fk_categories FOREIGN KEY (category)
REFERENCES category(cat_name));
Внешний ключ по столбцу categories ссылается на столбец cat_name таблицы ca
tegory. Все рассматриваемые в книге платформы поддерживают этот синтаксис.
Советы и хитрости
Для выполнения команды CREATE TABLE пользователь должен иметь соответ
ствующие привилегии. Аналогично, любой пользователь, который хочет изме
нить или удалить таблицу, может сделать это либо при наличии соответствую
щих привилегий, либо, если таблица содержится в его собственной схеме. Так
как стандарт ANSI не определяет точный набор привилегий, то существуют не
которые отличия среди производителей.
Операторы CREATE TABLE и ALTER TABLE можно инкапсулировать в тран
закцию, используя операторы COMMIT или ROLLBACK для явного завершения
транзакции. Мы рекомендуем, чтобы CREATE/ALTER TABLE был единствен
ным оператором в транзакции.
Расширения стандарта ANSI позволяют вам контролировать физический поря
док строк на диске. В SQL Server для этого используются кластерные индексы.
В Oracle есть функционально аналогичная структура под названием индексно0
организованная таблица.
В некоторых СУБД модифицируемая оператором ALTER TABLE таблица блоки
руется. Поэтому можно выполнять этот оператор только для тех таблиц, кото
рые не используются в данный момент. Более того, некоторые СУБД при выпол
нении оператора CREATE TABLE … LIKE блокируют и создаваемую таблицу,
и таблицуисточник.
MySQL
В MySQL оператор CREATE TABLE создает обычную или временную таблицу
в той базе данных, в которой он выполняется:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] имя_таблицы
{( имя_столбца тип_данных атрибуты
тип_ограничения имя_ограничения [, ...])
[тип_ограничения [имя_ограничения][, ...]]
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL |
NO ACTION}]
LIKE имя_таблицы }
{[TABLESPACE имя_табличного_пространства STORAGE DISK] |
[ENGINE = {ISAM | MyISAM | HEAP | BDB | InnoDB
| MERGE | MRG_MyISAM}] |
[AUTO_INCREMENT = целое_число] |
CREATE/ALTER TABLE 177
[AVG_ROW_LENGTH = целое_число] |
[ [DEFAULT] CHARACTER SET кодовая_страница ] |
[CHECKSUM = {0 | 1}] |
[ [DEFAULT] COLLATE схема_упорядочения ] |
[COMMENT = "строка"] |
[CONNECTIOIN = 'строка_подключения'] |
[DATA DIRECTORY = "путь_к_каталогу"] |
[DELAY_KEY_WRITE = {0 | 1}] |
[INDEX DIRECTORY = " путь_к_каталогу "] |
[INSERT_METHOD = {NO | FIRST | LAST}] |
[KEY_BLOCK_SIZE = целое_число] |
[MAX_ROWS = целое_число] |
[MIN_ROWS = целое_число] |
[PACK_KEYS = {0 | 1}] |
[PASSWORD = "строка"] |
[ROW_FORMAT= { DEFAULT | DYNAMIC | FIXED
| COMPRESSED | REDUNDANT | COMPACT }] [...]}
[определение_секций[, ...]]
[ [IGNORE | REPLACE] оператор_select ]
Обычно MySQL для изменения таблицы делает временную копию, работает с ней,
удаляет исходную таблицу и переименовывает копию. Синтаксис ALTER TABLE
позволяет модифицировать или переименовывать таблицу:
ALTER [IGNORE] TABLE имя_таблицы
{ [ADD [COLUMN] (имя_столбца тип_данных атрибуты)
[FIRST | AFTER имя_столбца][, ...]]
| [ADD [CONSTRAINT] [UNIQUE | FOREIGN KEY | FULLTEXT |
PRIMARY KEY | SPATIAL] [INDEX | KEY] [имя_индекса]
( имя_столбца_индекса [, ...])]
| [ALTER [COLUMN] имя_столбца
{SET DEFAULT литерал | DROP DEFAULT}]
| [CHANGE | MODIFY] [COLUMN] старое_имя_столбца
новое_имя_столбца определение_столбца [FIRST | AFTER
имя_столбца]
| [DROP [COLUMN | FOREIGN KEY | PRIMARY KEY | INDEX | KEY]
[имя_объекта]]
| [{ENABLE | DISABLE} KEYS]
| [RENAME [TO] новое_имя_таблицы]
| [ORDER BY имя_столбца [, ...]]
| [CONVERT TO CHARACTER SET кодовая_страница
[COLLATE схема_упорядочения]]
| [{DISCARD | IMPORT} TABLESPACE]
| [{ADD | DROP | COALESCE целоу_число | ANALYZE | CHECK |
OPTIMIZE | REBUILD | REPAIR} PARTITION]
| [REORGANIZE PARTITION имя_секции INTO(определение_секции)]
| [REMOVE PARTITIONING]
| [опции_таблицы] }[, ...]
Параметры и ключевые слова имеют следующие значения:
TEMPORARY
Создает таблицу, существующую только в течение сессии, в которой создает
ся таблица. После закрытия сессии таблица автоматически удаляется.
178 Глава 3. Справочник операторов SQL
IF NOT EXISTS
Предотвращает появление сообщения об ошибке, если таблица уже сущест
вует. Указание схемы не требуется.
тип_ограничения
Позволяет создавать стандартные ANSI SQLограничения на уровне столбца
или таблицы. MySQL полностью поддерживает следующие ограничения: пер
вичный ключ, уникальный ключ и значение по умолчанию (должно быть
константой). MySQL поддерживает на уровне синтаксиса проверочные огра
ничения и внешние ключи, но функционально они работают только на табли
цах InnoDB. MySQL также поддерживает 6 специальных ограничений:
FULLTEXT [ {INDEX | KEY} ]
Создает полнотекстовый индекс для быстрого поиска по большим объемам
текстовых данных. Помните, что этот тип индекса поддерживается только
для таблиц MyISAM и для столбцов типа CHAR, VARCHAR и TEXT.
SPATIAL [ {INDEX | KEY} ]
Создает пространственный индекс на столбец. Поддерживается только таб
лицами MyISAM.
AUTO_INCREMENT
Настраивает столбец таким образом, что его значения автоматически уве
личиваются на 1 (начальное значения также 1). MySQL допускает по одно
му столбцу AUTO_INCREMENT на таблицу. При удалении из таблицы
всех записей (DELETE или TRUNCATE) значение автоинкремента может
быть сброшено. Опция поддерживается таблицами MyISAM, MEMORY,
ARCHIVE и InnoDB.
[UNIQUE] INDEX
При использовании для столбца ключевого слова INDEX можно по жела
нию указать также имя индекса. (В MySQL слово KEY используется как
синоним INDEX.) Если для первичного ключа название не указано, то
MySQL автоматически создает имя из названию столбца и числового суф
фикса (_2, _3,…). Все типы таблиц, кроме ISAM, поддерживают индексы
по столбцам со значениями NULL и по столбцам типов BLOB и TEXT. Об
ратите внимание, что UNIQUE без INDEX также является допустимым
синтаксисом в MySQL.
COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}
Определяет формат хранения столбцов в таблицах NDB. FIXED устанав
ливает хранение с фиксированной шириной; DYNAMIC – с переменной
шириной; DEFAULT означает, что формат хранения будет выбран в соот
ветствии с типом данных столбца. Эта фраза недоступна в версиях младше
5.1.19ndb.
STORAGE {DISK | MEMORY}
Определяет, где хранится столбец таблицы NDB – на диске (DISK) или, по
умолчанию, в памяти (MEMORY). Эта фраза недоступна в версиях млад
ше 5.1.19ndb.
CREATE/ALTER TABLE 179
ENGINE
Определяет механизм (engine), используемый для хранения данных. Вы мо
жете менять способ хранения с помощью оператора ALTER TABLE. Только
таблицы типа InnoDB и BDB восстанавливаемы при сбоях и поддерживают
COMMIT и ROLLBACK. Таблицы других типов при сбоях подвержены поте
рям данных, но при этом работают значительно быстрее и занимают меньше
места. По умолчанию используется MyISAM. Список возможных типов таб
лиц следующий:
ARCHIVE
Использует механизм хранения ARCHIVE, подходящий для хранения
больших объемов данных, без индексов, с минимальным занимаемым дис
ковым пространством. Для таблицы типа ARCHIVE создается файл с на
званием, совпадающим с названием таблицы, и расширением .FRM. Дан
ные и метаданные хранятся в одноименных файлах, но с расширениями
.ARX и .ARM соответственно. Иногда в процессе оптимизации может по
являться файл с расширением .ARN.
CSV
Хранит данные таблицы в текстовом виде, значения в файле разделяются
запятыми (commaseparated values). Для таблицы типа CSV создается файл
с названием, совпадающим с названием таблицы, и расширением .FRM.
Данные хранятся в файле с таким же именем, но расширением .CSV. Дан
ные хранятся в текстовом виде, поэтому следует обратить внимание на во
прос безопасности данных.
EXAMPLE
Механизм хранения EXAMPLE является просто заглушкой, которая ни
чего не делает. В таблицах EXAMPLE данные хранить нельзя.
FEDERATED
Хранит данные таким образом, чтобы они были доступны для удаленного
доступа из других баз MySQL без использования механизмов кластериза
ции и репликации. В локальных таблицах при этом данные не хранятся.
HEAP
Создает таблицу, постоянно хранящуюся в памяти и использующую ин
декс по хешзначению. Синоним для MEMORY. Так как таблица хранится
в памяти, то все ее данные теряются в случае сбоя сервера. Рассматривайте
таблицы HEAP как альтернативу временным таблицам. При использова
нии таблиц HEAP устанавливайте для них свойство MAX_ROWS, чтобы
они не использовали всю свободную память. Такие таблицы не поддержи
вают столбцы типа BLOB и TEXT, опцию AUTO_INCREMENT, фразу OR0
DER BY и переменную длину записи.
InnoDB
Создает транзакционную таблицу с блокировками на уровне строк. Также
поддерживает управление независимыми табличными пространствами,
контрольные точки, неблокирующее чтение и быстрое чтение из больших
файлов данных для повышенного параллелизма и производительности.
Требует установки параметр innodb_data_file_path. InnoDB поддерживает
все ограничения, описанные в ANSI, включая CHECK и FOREIGN KEY.
180 Глава 3. Справочник операторов SQL
TABLESPACE…STORAGE DISK
При использовании кластеризованных NDB таблиц перемещает таблицу в ука
занное табличное пространство Cluster Disk Data. Табличное пространство
должно быть предварительно создано с помощью CREATE TABLESPACE.
AUTO_INCREMENT = целое_число
Устанавливает для таблицы автоинкрементное значение (только для MyISAM).
AVG_ROW_LENGTH = целое_число
Устанавливает приблизительный средний размер строки для таблиц с пере
менной длиной строки. MySQL использует формулу AVG_ROW_LENGTH *
MAX_ROWS для определения того, насколько большой может стать таблица.
[DEFAULT] CHARACTER SET
Устанавливает кодовую страницу, используемую для данных таблицы или
отдельного столбца.
CHECKSUM = {0 | 1}
Если установлено значение 1, то для всех строк таблицы вычисляется кон
трольная сумма (только в MyISAM). Работа при этом замедляется, но данные
становятся менее подверженными повреждению.
[DEFAULT] COLLATE
Устанавливает схему упорядочения для данных таблицы или отдельного
столбца.
COMMENT = "строка"
Устанавливает комментарий длиной до 60 символов.
CONNECTION = 'строка_подключения'
Строка подключения требуется для таблиц FEDERATED, в прочих случаях
она игнорируется. В старых версиях MySQL строка подключения указыва
лась в опции COMMENT.
DATA DIRECTORY = "путь_к_каталогу"
Устанавливает путь к каталогу для хранения таблиц MyISAM, который необ
ходимо использовать вместо каталога по умолчанию.
DELAY_KEY_WRITE = {0 | 1}
Если установлено значение 1, то обновление ключей таблицы откладывается
до закрытия таблицы (только MyISAM).
INDEX DIRECTORY = " путь_к_каталогу "
Устанавливает путь к каталогу для хранения индексов MyISAM, который не
обходимо использовать вместо каталога по умолчанию.
INSERT_METHOD = {NO | FIRST | LAST}
Используется для таблиц MERGE. Если никакое значение не установлено
или установлено значение NO, то вставки в таблицу запрещены. Если уста
новлено FIRST, то вставка производится в первую таблицу коллекции, при
LAST вставка производится в последнюю таблицу коллекции.
182 Глава 3. Справочник операторов SQL
KEY_BLOCK_SIZE = целое_число
Позволяет изменить размер блока индекса. 0 означает использование значе
ния по умолчанию.
MAX_ROWS = целое_число
Устанавливает максимальное количество строк в таблице. По умолчанию ис
пользуется значение, соответствующее 4 гигабайтам занимаемого места.
MIN_ROWS = целое_число
Устанавливает минимальное число строк в таблице.
PACK_KEYS = {0 | 1}
Если установлено значение 1, то выполняется сжатие индексов. При этом
чтения становятся быстрее, а обновления – медленнее (только для ISAM
и MyISAM). По умолчанию сжимаются только строковые значения. Если ус
тановлено значение 1, то сжимаются и строковые, и числовые значения.
PASSWORD = "строка"
Шифрует файл .FRM (но не саму таблицу) с использованием указанного па
роля.
ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUN0
DANT | COMPACT }
Определяет, как в таблице будут храниться строки. DEFAULT имеет разное
значение в зависимости от механизма хранения. DYNAMIC используется для
строк переменного размера (например, использующих VARCHAR), а FIXED –
для строк фиксированной длины (CHAR, INT и т. д.). REDUNDANT исполь
зуется только с таблицами InnoDB и улучшает работу индексов за счет избы
точного хранении информации. Таблицы COMPRESSED используются толь
ко для чтения и занимают примерно на 20% меньше места по сравнению
с REDUNDANT. COMPRESSED также допустим только для таблиц InnoDB.
определение_секции
Определяет секции и подсекции таблицы в MySQL. Описание секционирова
ния в MySQL приводится в следующем разделе. Все описываемые опции ис
пользуются и для подсекций, за исключением VALUE.
[IGNORE | REPLACE] оператор_select
Создает таблицу с набором столбцов, определяемым оператором SELECT. Ес
ли оператор возвращает строки, то они вставляются в создаваемую таблицу.
ALTER [IGNORE]
Изменяемая таблица будет включать все дубликаты, если только не указать
ключевое слово IGNORE. Если ключевое слово не используется, то выполне
ние оператора завершится с ошибкой, если в существующем первичном или
уникальном ключе будут обнаружены дубликаты.
{ADD | COLUMN} [ FIRST | AFTER имя_столбца]
Добавляет или перемещает столбец, индекс или ключ. При добавлении столб
ца он становится последним по порядку, если только не задана его позиция
с помощью ключевого слова AFTER.
CREATE/ALTER TABLE 183
ALTER COLUMN
Позволяет изменить определение столбца или его значение по умолчанию.
CHANGE
Переименовывает столбец или меняет его тип.
MODIFY
Меняет тип данных столбца или его атрибуты, например NOT NULL. Суще
ствующие данные автоматически конвертируются в новый тип данных.
DROP
Удаляет столбец, индекс, ключ или табличное пространство. Удаляемый
столбец также удаляется из всех индексов, в которых он участвует. Если при
удалении первичного ключа оказывается, что первичного ключа в таблице
нет, то будет удален первый уникальный ключ.
{ENABLE | DISABLE} KEYS
Одновременно включает или выключает все неуникальные ключи таблицы
MyISAM. Это может быть полезно для массовых загрузок, когда вы хотите
временно отключить ограничения до окончания загрузки. Также это увели
чивает производительность, так как все блоки индекса сбрасываются на диск
в конце операции.
RENAME [TO] новое_имя_таблицы
Переименовывает таблицу.
ORDER BY имя_столбца[,…]
Сортирует строки в указанном порядке.
CONVERT TO CHARACTER SET кодовая_страница [COLLATE схема_упорядо
чения]
Конвертирует данные таблицы в новую кодировку и схему упорядочения.
DISCARD | IMPORT TABLESPACE
Удаляет текущий файл .IDB (DISCARD) или делает табличное пространство
доступным после восстановления из резервной копии (IMPORT).
{ADD | DROP | COALESCE целое_число | ANALYZE | CHECK | OPTIMIZE | REBUILD
| REPAIR} PARTITION
Создает или удаляет секцию таблицы. Другие опции используются для об
служивания секций и аналогичны соответствующим опциям для таблиц (на
пример, CHECK TABLE или REPAIR TABLE). Только COALESCE PARTI0
TION имеет уникальное поведение и используется для уменьшения числа
KEY или HASH секций до заданного значения.
REORGANIZE PARTITION имя_секции INTO (определение_секции)
Изменяет определение указанной секции.
REMOVE PARTITIONING
Отключает секционирование таблицы без влияния на другие настройки таб
лицы и на данные.
184 Глава 3. Справочник операторов SQL
Например:
CREATE TABLE test_example
(column_a INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(column_a),
INDEX(column_b))
TYPE=HEAP
IGNORE
SELECT column_b,column_c FROM samples;
Секционированные таблицы
В MySQL для лучшего контроля над операциями вводавывода и дисковым про
странством поддерживается секционирование таблиц. Для секционирования ис
пользуется следующий синтаксис:
PARTITION BY функция
[ [SUB]PARTITION имя_секции
[VALUES {LESS THAN {(выражение) | MAXVALUE} |
IN (список_значений)}]
[[STORAGE] ENGINE [=] механизм_хранения]
CREATE/ALTER TABLE 185
emp_fname VARCHAR(30),
emp_lname VARCHAR(50),
hire_date DATE)
PARTITION BY RANGE(hire_date)
(PARTITION prtn1 VALUES LESS THAN ('01 JAN 2004'),
PARTITION prtn2 VALUES LESS THAN ('01 JAN 2006'),
PARTITION prtn3 VALUES LESS THAN ('01 JAN 2008'),
PARTITION prtn4 VALUES LESS THAN MAXVALUE);
CREATE TABLE inventory (
prod_id INT,
prod_name VARCHAR(30),
location_code CHAR(5))
PARTITION BY LIST(prod_id)
(PARTITION prtn0 VALUES IN (10, 50, 90, 130, 170, 210),
PARTITION prtn1 VALUES IN (20, 60, 100, 140, 180, 220),
PARTITION prtn2 VALUES IN (30, 70, 110, 150, 190, 230),
PARTITION prtn3 VALUES IN (40, 80, 120, 160, 200, 240));
В следующем примере переименовывается таблица и отдельный столбец:
ALTER TABLE employee RENAME AS emp;
ALTER TABLE employee CHANGE employee_ssn emp_ssn INTEGER;
Так как в MySQL существует возможность построения индекса по части столбца
(например, по первым 10 символам строки), вы можете строить короткие индек
сы по большим столбцам.
MySQL поддерживает изменение типа данных столбца. Но чтобы не потерять
данные, новый тип должен быть совместим со старым типом. Например, столбец
с датами можно преобразовать в символьный тип данных, но символьный тип
нельзя преобразовать в целочисленный. Вот пример изменения типа данных:
ALTER TABLE mytable MODIFY mycolumn LONGTEXT
MySQL обеспечивает некоторую гибкость оператора ALTER TABLE, позволяя
указывать через запятую несколько фраз ADD, ALTER, DROP и CHANGE. Одна
ко имейте в виду, что CHANGE имя_столбца и DROP INDEX являются расшире
ниями MySQL и не описаны в SQL2003. MySQL поддерживает фразу MODIFY,
подражая аналогичной функциональности в Oracle.
Oracle
Оператор CREATE TABLE в Oracle создает реляционную таблицу по заданному
описанию либо по существующей таблице. После создания таблицы ее можно
модифицировать с помощью оператора ALTER TABLE. В Oracle также можно
создавать таблицы со столбцами, использующими пользовательские типы дан
ных, объектные таблицы, явно создаваемые для хранения объектов определен
ного пользовательского типа (обычно VARRAY или NESTED TABLE), и таблицы
типа XMLType.
В Oracle поддерживается стандартный оператор в стиле ANSI, но также добавле
но много сложных расширений. Например, можно в значительной степени кон
тролировать способ хранения и производительность таблицы. В CREATE TAB0
LE и ALTER TABLE используется много вложенных и повторно используемых
CREATE/ALTER TABLE 187
[ACCESS PARAMETERS
{USING CLOB подзапрос | (непрозрачный_формат)}]
LOCATION ( [имя_каталога:]'спецификация'[, ...] )
[ADD (имя_столбца...)][DROP имя_столбца...]
[MODIFY (имя_столбца...)]
[PARALLEL целое_число | NOPARALLEL]
[REJECT LIMIT { целое_число | UNLIMITED}]
[PROJECT COLUMN {ALL | REFERENCED}]
Перемещение таблицы
[MOVE [ONLINE] [физические_атрибуты]
[TABLESPACE табличное_пространство]
[[NO]LOGGING] [PCTTHRESHOLD целое_число]
[COMPRESS целое_число | NOCOMPRESS]
[MAPPING TABLE | NOMAPPING]
[[INCLUDING столбец] OVERFLOW
[физические_атрибуты]
[TABLESPACE табличное_пространство]
[[NO]LOGGING]]
[LOB ...] [VARRAY ...]
[PARALLEL целое_число | NOPARALLEL]]
Включение/выключение атрибутов и ограничений
[{ {ENABLE | DISABLE} [[NO]VALIDATE]
{UNIQUE (столбец [, ...]) | PRIMARY KEY |
CONSTRAINT имя_ограничения}
[USING INDEX {имя_индекса | CREATE_INDEX_оператор |
[TABLESPACE табличное_пространство]
[физические_атрибуты] [параметры_хранения]
[NOSORT] [[NO]LOGGING] [ONLINE] [COMPUTE STATISTICS]
[COMPRESS | NOCOMPRESS] [REVERSE]
[{LOCAL | GLOBAL} секционирование]
[EXCEPTIONS INTO имя_таблицы] [CASCADE]
[{KEEP | DROP} INDEX]]} |
[{ENABLE | DISABLE}] [{TABLE LOCK | ALL TRIGGERS}] }]
Параметры имеют следующие значения:
виртуальный_столбец
Позволяет создавать виртуальные столбцы (то есть столбцы, не хранящиеся
физически, а вычисляемые динамически). Например, виртуальный столбец in
come может вычисляться суммированием столбцов salary, bonus и commission.
ограничение_столбца
Создает ограничение на уровне столбца, синтаксис приводится позднее.
GROUP журнальная_группа (столбец [NO LOG][, ...]) [ALWAYS] | DATA (ограниче
ния [, ...]) COLUMNS
Указывает для таблицы журнальную группу вместо одиночного журнального
файла.
ON COMMIT {DELETE | PRESERVE} ROWS
Для временной таблицы определяет период хранения записей – в течение
всей сессии (PRESERVE) или в течение одной транзакции (DELETE).
CREATE/ALTER TABLE 191
ограничение_таблицы
Создает ограничение на уровне таблицы, синтаксис приводится позднее.
физические_атрибуты
Определяет физические атрибуты таблицы, синтаксис приводится позднее.
TABLESPACE табличное_пространство
Указывает табличное пространство, в котором будет храниться создаваемая
таблица. Если эта фраза опущена, то используется табличное пространство
по умолчанию для схемы, в которой создается таблица. Детали приводятся
ниже. Информацию о табличных пространствах и работе с ними вы можете
найти в документации в разделе Oracle Concepts.
параметры_хранения
Определяет физические параметры хранения таблицы, синтаксис приводит
ся позднее.
[NO]LOGGING
Определяет, генерируется при создании (а также при дальнейшей работе с дан
ными) таблицы журнальная информация (LOGGING) или нет (NOLOGGING).
LOGGING используется по умолчанию. NOLOGGING позволяет ускорить
процесс создания таблицы. Но в случае сбоя в базе данных операция, выпол
ненная в режиме NOLOGGING, не будет восстановлена в процессе примене
ния журнальных файлов и таблицу нужно будет создавать заново. LOGGING
используется вместо устаревшего ключевого слова RECOVERABLE.
CLUSTER(столбец [, ...])
Указывает, что таблица является частью кластера. Список столбцов должен со
ответствовать столбцам в ранее созданном кластерном индексе. Так как в этом
случае используются механизмы хранения кластерного индекса, то фраза
CLUSTER несовместима с физическими_атрибутами, параметрами хранения и фразой
TABLESPACE. Таблицы со столбцами типа LOB несовместимы с фразой
CLUSTER.
ORGANIZATION HEAP
Определяет, каким образом данные записываются на диск. HEAP использу
ется по умолчанию и не накладывает никаких ограничений на физический
порядок записи строк на диск. С ORGANIZATION HEAP можно использо
вать несколько необязательных фраз, описанных в этом разделе, для опреде
ления параметров хранения, журналирования и сжатия.
ORGANIZATION INDEX
Определяет, каким образом данные записываются на диск. INDEX указыва
ет, что строки таблицы должны записываться на диск в порядке сортировки
по первичному ключу таблицы. Такой способ хранения называется индексно0
организованной таблицей. Первичный ключ в такой таблице обязателен.
При создании индексноорганизованной таблицы вы можете указывать физи
ческие_атрибуты и параметры_хранения, фразу TABLESPACE и ключевое слово
NOLOGGING. Также в дополнение вы можете использовать следующие под
фразы:
192 Глава 3. Справочник операторов SQL
PCTTHRESHOLD целое_число
Определяет процент пространства блока индекса, оставляемого под хране
ние данных. Данные, превышающие заданный объем, хранятся в сегмен
те переполнения.
INCLUDING столбец
Определяет точку, в которой запись делится на части, хранящиеся в бло
ках индекса и в сегменте переполнения. Все столбцы после указанного
хранятся в сегменте переполнения. Указанный столбец не может быть ча
стью первичного ключа.
MAPPING TABLE | NOMAPPING
Создает таблицу соответствия локальных и физических идентификаторов
строк (ROWID), что необходимо для построения по индекстаблицам до
полнительных индексов на основе битовых карт. При секционировании
основной таблицы таблица соответствия секционируется аналогичным об
разом. NOMAPPING указывает, что таблица соответствия идентификато
ров строк не нужна.
[INCLUDING столбец] OVERFLOW
Определяет сегмент, в котором сохраняются строки, не помещающиеся
в свободное пространство блока индекса, задаваемое параметром PCTTH0
RESHOLD. Для определяемого сегмента переполнения можно указывать
физические_атрибуты и параметры_хранения, фразы TABLESPACE и ключевое
слово NOLOGGING. С помощью фразы INCLUDING столбец можно ука
зать точку деления записи на часть, хранящуюся в блоке индекса, и часть,
хранящуюся в сегменте переполнения. Столбцы первичного ключа всегда
хранятся в индексе. Все столбцы, не входящие в первичный ключ и сле
дующие за указанным столбцом, хранятся в сегменте переполнения.
ORGANIZATION EXTERNAL
EXTERNAL указывает, что данные таблицы хранятся вне базы данных и как
правило доступны только для чтения (но метаданные таблицы хранятся
внутри базы данных). Существуют некоторые ограничения на внешние таб
лицы: они не могут быть временными, иметь ограничения целостности, для
них может указываться только столбец, тип столбца и параметры столбца,
типы данных LOB и LONG запрещены. Также в дополнение вы можете ис
пользовать следующие подфразы:
TYPE тип_драйвера
Определяет драйвер доступа к внешней таблице. По умолчанию использу
ется ORACLE_LOADER.
DEFAULT DIRECTORY имя_каталога
Указывает каталог файловой системы, в котором хранится внешняя таб
лица.
ACCESS PARAMETERS {USING CLOB подзапрос | ( непрозрачный формат )}
Устанавливает и передает драйверу доступа дополнительные параметры.
Oracle не интерпретирует эту информацию. USING CLOB указывает под
запрос для генерации параметров и их значений, подзапрос должен воз
вращать одну строку и один столбец типа CLOB. Подзапрос не должен со
CREATE/ALTER TABLE 193
OF объектный_тип
Указывает, что таблица создается на базе существующего объектного типа.
[NOT] SUBSTITUTABLE AT ALL LEVELS
Указывает допустимость вставки в таблицу строк, соответствующих подти
пам основного типа таблицы. По умолчанию используется SUBSTITUTABLE
AT ALL LEVELS.
ссылочное_ограничение_столбца и ссылочное_ограничение_таблицы
Объявляет ссылочное ограничение целостности для объектной таблицы или
таблицы типа XMLType. Эти фразы детально рассматриваются позднее в этом
разделе.
OBJECT IDENTIFIER IS {SYSTEM GENERATED | PRIMARY KEY}
Указывает, что идентификатор объекта (OID) в объектной таблице создается
системой (SYSTEM GENERATED) или базируется на первичном ключе (PRI0
MARY KEY). По умолчанию используется SYSTEM GENERATED.
OIDINDEX [имя_индекса]
Объявляет индекс и, возможно, имя индекса для генерируемого системой
идентификатора объекта. При необходимости можно также указать физиче
ские_атрибуты и параметры_хранения. Если OID базируется на первичном ключе,
то эта фраза необязательна.
OF XMLTYPE
Указывает, что таблица создается на базе типа данных XMLTYPE.
XMLTYPE {OBJECT RELATIONAL [атрибуты_хранения_xml] | [ {SECUREFILE |
BASICFILE} ] [{CLOB | BINARY XML} [имя_lob_сегмента] [параметры_lob]]
Определяет способ хранения XML данных: в LOBобъекте, объектнореляци
онным способом или в двоичном формате XML. OBJECT RELATIONAL хра
нит данные в объектнореляционных столбцах и позволяет индексировать
столбцы для лучшей производительности. При этом необходимо указывать
спецификацию_xml_схемы и предварительно регистрировать схему с помощью
пакета DBMS_XMLSCHEMA. CLOB указывает, что данные XMLTYPE хра
нятся в LOBстолбце для быстрого извлечения. Вы дополнительно можете
указать имя сегмента и параметры хранения LOB, но вы не можете указать
детали LOB и спецификацию схемы XML в том же операторе. BINARY XML
хранит данные в компактном двоичном формате, и для соответствующего
столбца BLOB указываются любые дополнительные параметры.
спецификация_xml_схемы
Позволяет указать URL одной или нескольких зарегистрированных XML
схем, а также имя XMLэлемента. Имя элемента обязательно, а URL опцио
нален. Несколько схем можно указывать только при хранении данных в фор
мате BINARY XML. Также вы можете указать ALLOW ANYCHEMA для хра
нения в столбце XMLTYPE любого документа, базирующегося на схеме, AL0
LOW NONSCHEMA для хранения документов, не базирующихся на схеме,
и DISALLOW NONSCHEMA для запрещения хранения документов, не бази
рующихся на схеме.
196 Глава 3. Справочник операторов SQL
В этом примере таблица orders разбивается на три секции: одна для заказов, полу
ченных до 2000 года (pre_yr_2000), одна для заказов до 2004 года (pre_yr_2004)
и одна для заказов после 2004 года (post_yr_2004). Секции основываются на
диапазонах значений в поле order_date.
Фраза INTERVAL расширяет функциональность секционирования по диапазо
нам значений путем автоматического создания новых секций при появлении
данных, не попадающих в существующие секции. Вместо явного создания сек
ций вы лишь указываете интервал значений для каждой следующей секции. Ис
пользуйте STORE IN для указания табличного пространства, в котором будут
храниться интервальные секции. Интервальное секционирование нельзя приме
нять к индексноорганизованным таблицам, таблицам с предметными индекса
ми, а также нельзя создавать интервальные подсекции.
В следующем примере создается таблица orders, секционированная по хешзна
чениям столбца cust_shp_id:
CREATE TABLE orders
(order_number NUMBER,
order_date DATE,
cust_nbr NUMBER,
price NUMBER,
qty NUMBER,
cust_shp_id NUMBER)
PARTITION BY HASH (cust_shp_id)
(PARTITION shp_id1 TABLESPACE tblspc01,
PARTITION shp_id2 TABLESPACE tblspc02,
PARTITION shp_id3 TABLESPACE tblspc03)
ENABLE ROW MOVEMENT;
Основным отличием секционирования по диапазону значений и по хешзначе
ниям является то, что в первом случае явно определяется, по какому критерию
для каждой строки выбирается секция, а во втором случае Oracle применяет
к значениям полей строки хешфункцию и по результату хешфункции опреде
ляется секция, в которую попадает строка. (Обратите внимание, что для табли
цы мы также включили возможность перемещения строк.)
В дополнение к разбиению таблицы на секции (для упрощения резервного копи
рования, восстановления и повышения производительности) вы можете разбить
секции на подсекции. Синтаксис фразы подсекционирование_по_списку_значений
выглядит следующим образом:
SUBPARTITION BY LIST (столбец)
[SUBPARTITION TEMPLATE
{ (SUBPARTITION имя_подсекции
[VALUES {DEFAULT | {значение | NULL}[, ...]}]
[атрибуты_хранения]) |
число_хехешш_подсекций } ]
В качестве примера мы создадим таблицу order еще раз, но применим составное
секционирование: секции создадим по диапазонам значений, а подсекции созда
дим по спискам значений. Так как при подсекционировании нам потребуется
перечислять все значения, попадающие в каждую подсекцию, то лучше исполь
CREATE/ALTER TABLE 205
где:
MODIFY DEFAULT ATTRIBUTES [FOR PARTITION имя_секции]
Изменяет параметры текущей или указанной секции. Описание параметров
секций приводится в предыдущем разделе.
SET SUBPARTITION TEMPLATE {число_хеш_подсекций | (SUBPARTITION
имя_подсекции [список_значений] [атрибуты_хранения])}
Устанавливает для таблицы новый шаблон подсекционирования.
SET INTERVAL (выражение) | SET STORE IN (табличное_пространство[, ...])
Преобразует таблицу, секционированную по диапазону значений, в таблицу,
секционированную по интервалам. Либо с помощью фразы SET STORE IN
меняет табличное пространство для интервальносекционированной табли
цы. Вы можете преобразовать интервальносекционированную таблицу об
ратно в таблицу, секционированную по диапазонам с помощью синтаксиса
SET INTERVAL().
MODIFY PARTITION имя_секции
Меняет для указанной секции набор физических атрибутов и атрибутов хра
нения, включая атрибуты хранения столбцов LOB и ARRAY. Для MODIFY
PARTITION используется следующий дополнительный синтаксис:
{ [описание_секции] | [[REBUILD] UNUSABLE LOCAL INDEXES]
| [ADD [спецификация_подсекции]] |
[COALESCE SUBPARTITION [[NO]PARALLEL]
[обновление_индексов]
{ [{UPDATE | INVALIDATE} GLOBAL INDEXES] |
UPDATE INDEXES [ (имя_индекса (
{секция_индекса | подсекция_индекса} ))[, ...] ] } ] |
[{ADD | DROP} VALUES (значение_секции[, ...])] |
[MAPPING TABLE
{ALLOCATE EXTENT ... | DEALLOCATE UNUSED ...}] }
где:
описание_секции
Приводится в предыдущем разделе «Секционирование таблиц в Oracle».
Эта фраза может использоваться с любыми секционированными таблица
ми.
[REBUILD] UNUSABLE LOCAL INDEXES
Помечает локальную секцию индекса как неиспользуемую (UNUSABLE).
При добавлении слова REBUILD выполняется перестроение неиспользуе
мых секций локальных индексов. Эту фразу нельзя использовать одновре
менно с любой другой подфразой оператора MODIFY PARTITION, равно
как и нельзя использовать ее для таблиц с подсекциями, но можно ис
пользовать для любых секционированных таблиц.
ADD [спецификация_подсекции]
Добавляет к таблице, секционированной по диапазонам значений, подсек
цию на основе хешзначений или списков значений. Синтаксис описан
в предыдущем разделе. Эта фраза используется только для составного сек
ционирования. Oracle заполняет новую подсекцию строками из других
210 Глава 3. Справочник операторов SQL
payment DEC(9,3),
office_ref REF building_type
CONSTRAINT offc_in_bld REFERENCES offices_object_table);
В этом примере SCOPE IS создает ограничение на уровне столбца, а CONSTRA0
INT – на уровне таблицы.
Оператор ALTER TABLE в Oracle
При использовании оператора ALTER TABLE вы можете добавить (ADD), уда
лить (DROP) или модифицировать (MODIFY) любой элемент таблицы. Напри
мер, на синтаксической диаграмме показано, что при добавлении или измене
нии столбца указываются его атрибуты, причем это все возможные атрибуты,
включая нестандартные расширения Oracle. Таким образом, ANSI позволяет мо
дифицировать только такие атрибуты, как DEFAULT и NOT NULL (и ограниче
ния на уровне столбца), а в Oracle можно изменять любые существующие пара
метры таблицы, включая настройки LOB, VARRAY, NESTED TABLE, CLUS0
TER и PARTITION, а также настройки индексноорганизованных таблиц.
Например, следующий код добавляет в таблицу новый столбец и уникальное
ограничение целостности:
ALTER TABLE titles
ADD subtitle VARCHAR2(32) NULL
CONSTRAINT unq_subtitle UNIQUE;
При добавлении ограничения СУБД проверяет все строки на соответствие зада
ваемым правилам; если обнаруживаются строки, не удовлетворяющие добав
ляемому ограничению, то оператор ALTER TABLE завершается с ошибкой.
PostgreSQL
PostgreSQL поддерживает стандарт ANSI для операторов CREATE и ALTER TAB0
LE, а также некоторые расширения, позволяющие быстро создавать новую таб
лицу из существующей. Синтаксис оператора CREATE TABLE следующий:
CREATE [LOCAL] [[TEMP]ORARY] TABLE имя_таблицы
(имя_столбца тип_данных атрибуты[, ...]) |
CONSTRAINT имя_ограничения [{NULL | NOT NULL}]
220 Глава 3. Справочник операторов SQL
ONLY
Указывает, что оператор ALTER должен модифицировать только указанную
таблицу и не должен затрагивать какиелибо родительские таблицы или таб
лицыпотомки.
OWNER TO новый_владелец
Устанавливает для таблицы нового владельца.
В PostgreSQL таблица может иметь до 1600 столбцов. Но на практике число
столбцов должно быть сильно меньше 1600 по причинам производительности.
Вот пример создания таблицы:
CREATE TABLE distributors
(name VARCHAR(40) DEFAULT 'Thomas Nash Distributors',
dist_id INTEGER DEFAULT NEXTVAL('dist_serial'),
modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
SQL Server
SQL Server поддерживает широкий набор опций при объявлении и изменении
таблицы, ее столбцов и ограничений. Синтаксис оператора CREATE TABLE сле
дующий:
CREATE TABLE имя_таблицы
(имя_столбца тип_данных { [DEFAULT значение]
| [IDENTITY [(начало,шаг) [NOT FOR REPLICATION]]]
[ROWGUIDCOL] [NULL | NOT NULL]
| [{PRIMARY KEY | UNIQUE}
[CLUSTERED | NONCLUSTERED]
[WITH FILLFACTOR = целое_число]
[ON {файловая_граппа | DEFAULT}]]
| [[FOREIGN KEY]
REFERENCES таблица [(столбец[, ...])]
[ON {DELETE | UPDATE} {CASCADE | NO ACTION}]
[NOT FOR REPLICATION]]
| [CHECK [NOT FOR REPLICATION] (выражение)]
| [COLLATE схема_упорядочения]
| имя_столбца AS вычисляемое_выражение }
[, ...]
CREATE/ALTER TABLE 223
| [ограничение_на_уровне_таблицы][, ...])
[ON {файловая_группа | DEFAULT}]
[TEXTIMAGE_ON { файловая_группа | DEFAULT}]
Синтаксис оператора ALTER TABLE следующий:
ALTER TABLE имя_таблицы
[ALTER COLUMN имя_столбца тип_данных атрибуты
{ADD | DROP} ROWGUIDCOL]
| [ADD [COLUMN] имя_столбца тип_данных атрибуты][, ...]]
| [WITH CHECK | WITH NOCHECK] ADD
ограничение_на_уровне_таблицы][, ...]
| [DROP { [CONSTRAINT] имя_ограничения
| COLUMN имя_столбца }][, ...]
| [{CHECK | NOCHECK} CONSTRAINT { ALL | имя_ограничения[, ...] }]
| [{ENABLE | DISABLE} TRIGGER { ALL | имя_триггера[, ...] }]
Параметры имеют следующие значения:
DEFAULT значение
Устанавливает значение по умолчанию для столбцов любого типа, кроме
TIMESTAMP и IDENTITY. Значение по умолчанию должно быть либо кон
стантой, либо системной функцией, например GETDATE(), либо NULL.
IDENTITY [(начало,шаг)]
Создает и заполняет целочисленный столбец монотонно возрастающими зна
чениями. По желанию можно указать начальное значение и шаг увеличения.
По умолчанию оба значения равны 1.
NOT FOR REPLICATION
Указывает, что значения столбцов IDENTITY и FOREIGN KEY не реплици
руются на подписанные серверы. Эта возможность используется в ситуаци
ях, когда несколько серверов используют одну и ту же структуру таблиц, но
не в точности одинаковые данные.
ROWGUIDCOL
Идентифицирует столбец, содержащий глобальные уникальные идентифи
каторы (GUID), никогда не повторяющиеся на других серверах. В таблице
может быть не более одного такого столбца. Идентификаторы не создаются
автоматически, а должны генерироваться вызовами функции NEWID.
{PRIMARY KEY | UNIQUE}
Создает в таблице первичный или уникальный ключ. Создание первичного
ключа отличается от стандарта ANSI тем, что можно указывать, является ин
декс первичного ключа кластерным или некластерным, а также можно уста
навливать начальный процент заполнения страниц индексов. (Информация
о первичных ключах приводится в главе 2.) Атрибуты уникальных и первич
ных ключей следующие:
CLUSTERED | NONCLUSTERED
CLUSTERED указывает, что порядок сортировки первичного ключа опре
деляет физический порядок хранения записей. NONCLUSTERED указы
вает, что индекс не является кластерным и содержит только указатели на
строки таблицы. По умолчанию используется CLUSTERED.
224 Глава 3. Справочник операторов SQL
создавшим его, и удаляется, после того как пользователь отключается или за
вершается процесс. Имя глобальной временной таблицы должно начинаться
с символов ##. Глобальная временная таблица может использоваться любым
пользователем, подключенным к базе данных на момент существования этой
таблицы. Удаляется глобальная временная таблица также в момент отключения
пользователя или процесса, создавшего ее.
SQL Server позволяет создавать таблицы с вычисляемыми столбцами. Такие
столбцы фактически не хранятся, а всего лишь содержат выражение, вычисляе
мое на базе других столбцов таблицы. Например, вычисляемый столбец может
содержать выражение order_cost AS (price*qty). Вычисляемые столбцы могут
содержать константы, функции, переменные, обычные столбцы, а также любые
комбинации этих элементов с использованием операторов.
Любое из показанных ранее ограничений на уровне столбца может быть создано
и на уровне таблицы. То есть ограничения PRIMARY KEY, FOREIGN KEY,
CHECK могут быть указаны в конце оператора CREATE TABLE после списка
столбцов. Это используется для ограничений, использующих несколько столб
цов. Например, ограничение UNIQUE на уровне столбца применяется только
к этому столбцу, а ограничение UNIQUE на уровне таблицы может охватывать
несколько столбцов. Вот пример обоих типов ограничений:
Создание ограничения на уровне столбца
CREATE TABLE favorite_books
(isbn CHAR(100) PRIMARY KEY NONCLUSTERED,
book_name VARCHAR(40) UNIQUE,
category VARCHAR(40) NULL,
subcategory VARCHAR(40) NULL,
pub_date DATETIME NOT NULL,
purchase_date DATETIME NOT NULL)
GO
Создание ограничения на уровне таблицы
CREATE TABLE favorite_books
(isbn CHAR(100) NOT NULL,
book_name VARCHAR(40) NOT NULL,
category VARCHAR(40) NULL,
subcategory VARCHAR(40) NULL,
pub_date DATETIME NOT NULL,
purchase_date DATETIME NOT NULL,
CONSTRAINT pk_book_id PRIMARY KEY NONCLUSTERED (isbn)
WITH FILLFACTOR=70,
CONSTRAINT unq_book UNIQUE CLUSTERED
(book_name,pub_date))
GO
Две эти команды дают похожий результат, только ограничение UNIQUE на
уровне таблицы содержит два столбца, а на уровне столбца – один.
Следующий оператор добавляет в таблицу ограничение CHECK, но не проверяет
существующие строки таблицы на соответствие этому ограничению:
ALTER TABLE favorite_book WITH NOCHECK
ADD CONSTRAINT extra_check CHECK (ISBN > 1)
GO
CREATE/ALTER TRIGGER 227
См. также
CREATE SCHEMA
DROP
CREATE/ALTER TRIGGER
Триггер – это хранимая процедура специального типа, которая выполняется ав
томатически при выполнении определенных манипуляций с таблицей. Триггер
явно связан с таблицей и является зависимым объектом. Например, вы могли
бы захотеть, чтобы столбец part_numbers таблицы sales обновлялся автоматиче
ски при изменении столбца part_number таблицы products. Это можно сделать
с помощью триггера.
Синтаксис SQL2003
CREATE TRIGGER имя_триггера
{BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF столбец[, ...]]}
ON имя_таблицы
[REFERENCING {OLD {[ROW] | TABLE} [AS] старое_имя | NEW
{ROW | TABLE} [AS] новое_имя}] [FOR EACH { ROW | STATEMENT }]
[WHEN (условия)]
[BEGIN ATOMIC]блок_кода
[END]
Ключевые слова
CREATE TRIGGER имя_триггера
Создает триггер с заданным именем и связывает его с определенной таблицей.
228 Глава 3. Справочник операторов SQL
BEFORE | AFTER
Указывает, что действия триггера выполняются либо до (BEFORE), либо по
сле (AFTER) DMLоперации, вызывающей выполнение триггера. Триггер ти
па BEFORE выполняется до операторов INSERT, UPDATE и DELETE и по
зволяет выполнить любые действия, вплоть до полной подмены DMLопера
ции. Триггер типа AFTER выполняется после завершения вызывающей его
операции и позволяет постфактум выполнить полезные действия, например
пересчет нарастающего итога.
DELETE | INSERT | UPDATE [OF столбец[, ...]]
Определяет тип операции, вызывающей выполнение триггера: операторы
DELETE, операторы INSERT или операторы UPDATE. Также вы можете
указать список столбцов для оператора UPDATE, обновление значений кото
рых вызывает триггер. Если обновляется столбец не из указанного списка, то
триггер не выполняется.
ON имя_таблицы
Указывает таблицу, для которой создается триггер.
REFERENCING {OLD{[ROW] | TABLE} [AS] старое_имя | NEW {ROW | TABLE}
[AS] новое_имя}
Используется для создания псевдонимов для старых (OLD) и новых (NEW)
версий строки (ROW) или таблицы (TABLE). Хотя в синтаксисе триггера эти
опции показаны как взаимоисключающие, на самом деле вы можете указать
до четырех псевдонимов: для старой строки, новой строки, старой таблицы
и новой таблицы. Псевдонимы OLD относятся к данным, которые содержа
лись в строке или таблице до DMLоперации, вызвавшей триггер, а NEW от
носится к данным, которые будут в строке или таблице после выполнения
DMLоперации. Обратите внимание, что слово ROW опционально, а TABLE –
обязательно. (То есть OLD ROW AS – это тоже самое, что OLD AS, а для TAB0
LE единственным допустимым вариантом является OLD TABLE AS.) Тригге
ры INSERT не имеют контекста OLD, а триггеры DELETE не имеют контек
ста NEW. Ключевое слово AS необязательно. Если во фразе REFERENCING
используется OLD ROW или NEW ROW, то обязательно должна использо
ваться фраза FOR EACH ROW.
FOR EACH {ROW | STATEMENT}
Определяет способ вызова триггера: либо один раз для каждой измененной
записи (ROW), либо один раз для каждого оператора. Представьте оператор
UPDATE, который изменяет зарплаты 100 сотрудников. Триггер FOR EACH
ROW в таком случае будет выполнен 100 раз, а триггер FOR EACH STATE0
MENT будет выполнен один раз.
WHEN (условия)
Позволяет указать дополнительное условие на запуск триггера. Предполо
жим, у вас есть триггер DELETE employee, который вызывается для каждого
удаления из таблицы сотрудников. Если при вызове триггера дополнитель
ное условие при вычислении возвращает TRUE, то выполнение триггера про
должается. В противном случае триггер не запускается.
CREATE/ALTER TRIGGER 229
Общие правила
Триггеры по умолчанию запускаются один раз для одного оператора. То есть
оператор INSERT может вставить 500 записей, но INSERTтриггер этой табли
цы выполнится один раз. Однако в некоторых платформах поддерживаются
триггеры, запускающиеся один раз для каждой строки, затрагиваемой DML
операцией. Оператор, вставляющий 500 строк, вызовет такой триггер 500 раз,
по разу для каждой строки.
Кроме типа оператора, вызывающего срабатывание триггера, нужно также ука
зывать момент срабатывания. Триггер может срабатывать до (BEFORE) выпол
нения оператора, после (AFTER) выполнения оператора, а иногда и вместо (IN0
STEAD OF), если это поддерживается платформой. Триггеры, выполняющиеся
до или вместо DMLоперации, не видят изменений, выполняемых оператором,
а триггеры AFTER работают уже с измененными данными.
Триггеры могут использовать две псевдотаблицы. (Псевдотаблицами они назы
ваются, так как не создаются явно с помощью оператора CREATE TABLE, но
тем не менее, логически существуют в базе данных.) Эти псевдотаблицы могут
называть в разных платформах поразному, здесь мы их будем именовать Before
и After. Они имеют в точности такую же структуру, что и таблица, с которой
связан триггер, но содержат моментальные копии содержимого таблицы: Before
содержит копию всех строк таблицы, какими они были до выполнения операто
ра, вызвавшего триггер, After содержит копию всех строк таблицы после выпол
нения оператора. Вы можете использовать данные этих псевдотаблиц в триггере
для определения того, что вы хотите сделать.
Вот пример BEFOREтриггера для Oracle, использующего таблицы OLD и NEW.
(В SQL Server таким же образом используются таблицы INSERTED и DELE0
TED.) Триггер создает запись в таблице аудита перед изменением зарплаты со
трудника:
CREATE TRIGGER if_emp_changes
BEFORE DELETE OR UPDATE ON employee
FOR EACH ROW
WHEN (new.emp_salary <> old.emp_salary)
BEGIN
INSERT INTO employee_audit
VALUES ('old',
:old.emp_id,
:old.emp_salary,
:old.emp_ssn);
END;
Для того чтобы писать более эффективные и понятные триггеры, вы можете ис
пользовать дополнительные возможности, предоставляемые некоторыми плат
формами. Например, в Oracle есть специальная фраза IF…THEN, используемая
только в триггерах. Фраза имеет вид IF {DELETING | INSERTING | UPDATING}
230 Глава 3. Справочник операторов SQL
Советы и хитрости
Одной из основных проблем при использовании триггеров является неправиль
ное и неконтролируемое применение вложенных и рекурсивных триггеров. Вло0
женный триггер – это триггер, выполняющий DMLоперацию, вызывающую
другой триггер. Предположим, например, что у нас есть таблицы T1, T2 и T3.
Для таблицы T1 создан триггер BEFORE INSERT, вставляющий строки в табли
цу T2. Для таблицы T2 также создан триггер BEFORE INSERT, вставляющий
строки в таблицу T3. Само по себе это не всегда плохо, если логика операций хо
CREATE/ALTER TRIGGER 231
MySQL
Реализация оператора CREATE TRIGGER в MySQL выглядит следующим обра
зом:
CREATE [DEFINER = {имя_пользователя | CURRENT_USER}]
TRIGGER имя_триггера {BEFORE | AFTER}
{INSERT | UPDATE | DELETE}
ON имя_таблицы FOR EACH ROW блок_кода
где:
DEFINER = {имя_пользователя | CURRENT_USER}
Указывает учетную запись, которая используется при проверке привилегий.
Вы можете либо указать какоголибо существующего пользователя, либо ука
зать текущего пользователя (CURRENT_USER). CURRENT_USER использу
ется по умолчанию.
В MySQL нельзя создавать триггеры для временных таблиц. Триггеры на встав
ку будут срабатывать при вставке строк в таблицу любым способом, а не только
оператором INSERT. То есть триггеры на вставку будут также срабатывать при
выполнении операторов LOAD DATA и REPLACE. Аналогично, триггер на уда
ление также будет срабатывать при операторе REPLACE. Однако триггеры не за
пускаются при каскадных изменениях по внешним ключам.
MySQL допускает не более одного триггера каждого типа на таблицу. То есть таб
лица может иметь триггер BEFORE INSERT и триггер AFTER INSERT, но не
два триггера AFTER INSERT одновременно. Для выполнения в триггере не
скольких операторов заключите их в BEGIN…END.
MySQL не поддерживает оператор ALTER TRIGGER.
Oracle
Oracle поддерживает определенный стандартом ANSI вариант оператора CREA0
TE TRIGGER с небольшими дополнениями и изменениями:
CREATE [OR REPLACE] TRIGGER имя_триггера
{BEFORE | AFTER | INSTEAD OF}
{ {[объектное_событие] [событие_бд] [...]
ON {DATABASE |схема.SCHEMA}} |
232 Глава 3. Справочник операторов SQL
GRANT
Триггер срабатывает при выдаче привилегий или ролей другим пользова
телям или ролям.
NOAUDIT
Триггер срабатывает, когда оператором NOAUDIT отключается отслежи
вание SQLоператоров и действий с объектами базы данных.
RENAME
Триггер срабатывает при переименовании объекта базы данных.
REVOKE
Триггер срабатывает, когда пользователь отзывает привилегию или роль
у другого пользователя или роли.
TRUNCATE
Триггер срабатывает, когда таблица или кластер очищается с помощью
оператора TRUNCATE.
событие_бд
Помимо обычных DMLоператоров триггеры в Oracle могут вызываться и опре
деленными событиями уровня базы данных. Фраза событие_бд также сопрово
ждается ключевыми словами BEFORE или AFTER. Список событий базы
данных следующий:
LOGON
Триггер срабатывает при подключении пользователя к базе данных. До
пустимы только триггеры типа AFTER.
LOGOFF
Триггер срабатывает при отключении пользователя от базы данных. До
пустимы только триггеры типа BEFORE.
SERVERERROR
Триггер срабатывает при возникновении серверной ошибки. Допустимы
только триггеры типа AFTER.
SHUTDOWN
Триггер срабатывает при остановке экземпляра СУБД. Допустимы только
триггеры BEFORE с фразой ON DATABASE.
STARTUP
Триггер срабатывает при открытии экземпляра СУБД. Допустимы только
триггеры AFTER с фразой ON DATABASE.
SUSPEND
Триггер срабатывает, когда изза ошибки базы данных приостанавливает
ся транзакция. Допустимы только триггеры типа AFTER.
ON {DATABASE |схема.SCHEMA}
Если используется ON DATABASE, то триггер срабатывает для событий, воз
никающих с объектами в любых схемах базы данных. А ON схема.SCHEMA
позволяет указать конкретную схему, события с объектами которой будут
вызывать запуск триггера.
234 Глава 3. Справочник операторов SQL
DDLтриггеры
Oracle поддерживает триггеры на DDLоперации, то есть вы, например, можете
создать триггер, который будет срабатывать при создании таблицы или удале
нии представления. DDLтриггеры могут быть созданы либо для всей базы дан
ных либо для отдельной схемы для событий типа CREATE, ALTER или DROP.
Например:
CREATE TRIGGER audit_object_changes AFTER CREATE ON SCHEMA
code_body;
Полный список событий, вызывающих срабатывание DDLтриггера, следующий:
ALTER, ANALYZE, ASSOCIATE STATISTICS, AUDIT, COMMENT, CREATE,
DISASSOCIATE STATISTICS, DROP, GRANT, NOAUDIT, RENAME, REVOKE,
TRUNCATE или DDL (запускает триггер при выполнении любого оператора из
списка). Также вы можете создать триггер, который срабатывает при определен
ном состоянии базы данных, а не при выполнении оператора. Вы можете исполь
зовать следующие состояния: AFTER STARTUP, BEFORE SHUTDOWN, AFTER
236 Глава 3. Справочник операторов SQL
PostgreSQL
Реализация оператора CREATE TRIGGER в PostgreSQL поддерживает подмно
жество возможностей, описанных в стандарте ANSI. В PostgreSQL триггер вы
полняется либо до выполнения DMLоперации и проверки ограничений, либо
после выполнения операции и проверки всех ограничений, когда сделанные из
менения уже видны триггеру. Также можно создавать INSTEAD OF триггеры
для подмены операторов вставки, обновления и удаления записей. Синтаксис
оператора CREATE TRIGGER следующий:
CREATE TRIGGER имя_триггера
{ BEFORE | AFTER }
{ {[DELETE] [OR | ,] [INSERT] [OR | ,] [UPDATE]} [OR ...] }
ON имя_таблицы
FOR EACH { ROW | STATEMENT }
EXECUTE PROCEDURE имя_функции (параметры)
Оператора ALTER TRIGGER в PostgreSQL позволяет лишь переименовать триг
гер:
ALTER TRIGGER имя_триггера ON имя_таблицы
RENAME TO новое_имя_триггера
Параметры оператора CREATE TRIGGER следующие:
OR
Используется для указания дополнительных действий, вызывающих сраба
тывание триггера. Вместо OR можно использовать запятую.
FOR EACH ROW
Явно указывает, что триггер срабатывает для каждой записи. Это является
поведением по умолчанию. Слово STATEMENT просто поддерживается на
уровне синтаксиса, но триггер при этом не становится триггером уровня опе
ратора.
EXECUTE PROCEDURE имя_функции(параметры)
Вызывает функцию, предварительно созданную оператором CREATE FUNC0
TION. В PostgreSQL нет своего встроенного процедурного языка.
В следующем примере создается BEFOREтриггер, срабатывающий для каждой
вставленной или обновленной записи таблицы sales и проверяющий, что код ди
стрибьютора присутствует в таблице distributors:
CREATE TRIGGER if_dist_exists
BEFORE INSERT OR UPDATE ON sales
FOR EACH ROW
EXECUTE PROCEDURE check_primary_key
('dist_id', 'distributors', 'dist_id');
Триггеры BEFORE и AFTER поддерживаются стандартом ANSI. Триггеры IN0
STEAD OF в PostgreSQL позволяют подменить операцию, вызвавшую срабаты
вание триггера, своей функцией.
CREATE/ALTER TRIGGER 237
SQL Server
Триггеры в SQL Server поддерживают базовую функциональность, описанную
в ANSI, а также расширения в виде триггеров INSTEAD OF и отслеживания из
менений столбцов. Фразы REFERENCING и WHEN не поддерживаются. Син
таксис следующий:
{CREATE | ALTER} TRIGGER имя_триггера ON имя_таблицы
[WITH [ENCRYPTION] [EXEC[UTE] AS {CALLER | SELF |
'имя_пользователя'}]]
{FOR | AFTER | INSTEAD OF}
{ dml_события | ddl_события }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
[IF UPDATE(столбец) [{AND | OR} UPDATE(столбец)][...]]
блок_кода
где:
{CREATE | ALTER} TRIGGER имя_триггера
Создает новый триггер с указанным именем или изменяет существующий
триггер, добавляя или модифицируя параметры и тело триггера. При измене
нии триггера сохраняются все его разрешения и зависимости.
ON имя_таблицы
Указывает имя таблицы или представления, для которого создается триггер.
Для представлений можно создавать триггер INSTEAD OF, в том случае, если
представление обновляемое и не использует фразу WITH CHECK OPTION.
WITH ENCRYPTION
Шифрует текст оператора CREATE TRIGGER, что отражается в таблице sys
comments. Шифрование полезно для защиты интеллектуальной собственно
сти. Зашифрованный триггер нельзя использовать при репликации.
EXEC[UTE] AS {CALLER | SELF | OWNER | ‘имя_пользователя’}
Определяет привилегии, с которыми выполняется триггер. CALLER (значе
ние по умолчанию) указывает, что необходимо использовать привилегии
пользователя, чьи действия вызвали срабатывание триггера. SELF указыва
ет, что триггер выполняется с привилегиями создателя. OWNER указывает,
что триггер выполняется с привилегиями текущего владельца. И, наконец,
можно явно указать имя пользователя, привилегии которого будут использо
ваться при выполнении триггера.
FOR | AFTER | INSTEAD OF
Определяет момент выполнения триггера. FOR и AFTER являются синони
мами и указывают, что триггер запускается только после успешного завер
шения DMLоператора, всех каскадных изменений и проверки ограничений.
Триггер INSTEAD OF похож на триггер BEFORE, описанный в ANSI, но при
этом может полностью подменить DMLоперацию. Триггеры INSTEAD OF
DELETE не могут быть использованы в ситуациях, когда удаление вызывает
каскадные изменения. Только триггерам INSTEAD OF доступны столбцы ти
пов TEXT, NTEXT и IMAGE.
238 Глава 3. Справочник операторов SQL
dml_события
Указывает стандартные операторы DML, вызывающие срабатывание тригге
ра: INSERT, DELETE и/или UPDATE. В одном операторе можно использо
вать одно или несколько событий.
ddl_события
Указывает операторы DDL, вызывающие срабатывание триггера: CREATE,
ALTER, DROP, GRANT, DENY, REVOKE, BIND, UNBIND, RENAME или
UPDATE STATISTICS. DDLтриггер может срабатывать до или после собы
тия. Также вы можете указать триггер, срабатывающий при подключении
пользователя (FOR или AFTER LOGON). В SQL Server также есть предопреде
ленные наборы групп, в которых собраны DDLсобытия для объектов одного
типа: например, группа DDL_TABLE_EVENTS включает события CREATE,
ALTER и DROP TABLE. Полный список таких групп приводится в докумен
тации по SQL Server.
WITH APPEND
Добавляет еще один триггер уже существующего типа. Это фраза поддержи
вается для обратной совместимости с более ранними версиями и использует
ся только для триггеров типа FOR. Эту фразу нельзя использовать для триг
геров INSTEAD OF или AFTER, а также с триггерами, написанными на CLR.
NOT FOR REPLICATION
Указывает, что триггер не вызывается операциями, выполненными при реп
ликации.
IF UPDATE(столбец) [{AND | OR} UPDATE(столбец)][...]
Позволяет выбрать определенные столбцы, изменение которых запускает
триггер. Триггеры по набору столбцов создаются только для операции IN0
SERT и UPDATE, но не для DELETE. Если вставляются или обновляются зна
чения столбца, не входящего в указанный список, то триггер не запускается.
SQL Server позволяет создавать несколько триггеров одного типа для таблицы
или представления. Поэтому одна таблица может иметь три триггера UPDATE
и несколько триггеров AFTER. Порядок их выполнения недетерминирован, хо
тя первый и последний триггеры можно выбрать при помощи системной храни
мой процедуры sp_settriggerorder. На каждую из операций INSERT, UPDATE
и DELETE может быть создано по одному триггеру INSTEAD OF.
В SQL Server допустимы любые комбинации событий, вызывающих триггер,
достаточно перечислить их через запятую при создании триггера. При этом для
каждого оператора будет выполняться одинаковый код.
SQL Server выполняет триггеры в режиме FOR EACH STATEMENT – один раз
для одного оператора, как это описано в стандарте ANSI.
Внутри триггера в SQL Server доступны псевдотаблицы deleted и inserted. Они
аналогичны описанным ранее в разделе SQL2003 псевдотаблицам before и after.
Эти псевдотаблицы идентичны по структуре основной таблице, но содержат ко
пии данных до выполнения DMLоперации (deleted) и после выполнения DML
операции (inserted).
CREATE/ALTER TRIGGER 239
GO
CREATE TABLE people_reroute
(reroute_log_id UNIQUEIDENTIFIER DEFAULT NEWID( ),
reroute_log_type CHAR (3) NOT NULL,
reroute_people_id CHAR(4),
reroute_people_name VARCHAR(40),
reroute_people_addr VARCHAR(40),
reroute_city VARCHAR(20),
reroute_state CHAR(2),
reroute_zip CHAR(5),
reroute_phone CHAR(12),
reroute_sales_rep empid NOT NULL,
reroute_user sysname DEFAULT SUSER_SNAME( ),
reroute_changed datetime DEFAULT GETDATE( ) )
GO
CREATE TRIGGER update_person_data
ON people
FOR update AS
IF (COLUMNS_UPDATED(people_name)
OR COLUMNS_UPDATEE(people_addr)
OR COLUMNS_UPDATED(city) )
BEGIN
Audit OLD record
INSERT INTO people_reroute (reroute_log_type,
reroute_people_id, reroute_people_name,
reroute_people_addr, reroute_city)
SELECT 'old', d.people_id, d.people_name,
d.people_addr, d.city
FROM deleted AS d
Audit NEW record
INSERT INTO people_reroute (reroute_log_type,
reroute_people_id, reroute_people_name,
reroute_people_addr, reroute_city)
SELECT 'new', n.people_id, n.people_name,
n.people_addr, n.city
FROM inserted AS n
END
GO
Помните, что в SQL Server используется отложенное связывание имен, то есть
операторы CREATE могут ссылаться на объекты, которые еще не созданы.
В SQL Server поддерживаются триггеры, написанные на языках, исполняемых
в CLR (Common Language Runtime) Microsoft .NET Framework. Синтаксис объ
явления таких триггеров похож на синтаксис, используемый для обычных триг
геров, но вместо кода используются внешние сборки. Если вы хотите узнать
о программировании для SQL Server с использованием CLR, то обратитесь к до
кументации.
См. также
CREATE/ALTER FUNCTION/PROCEDURE
DELETE
DROP
CREATE/ALTER TYPE 241
INSERT
UPDATE
CREATE/ALTER TYPE
Оператор CREATE TYPE позволяет создавать пользовательские типы данных
(userdefined types, UDT), что эквивалентно понятию классов из объектноори
ентированного программирования. Пользовательские типы данных расширяют
возможности SQL в области объектноориентированного программирования,
поддерживают наследование типов и другие объектноориентированные воз
можности. Также на базе пользовательских типов данных вы можете создавать
так называемые объектные таблицы с помощью фразы CREATE TABLE. Поня
тие объектной таблицы эквивалентно понятию «экземпляров классов» из объ
ектноориентированного программирования.
Синтаксис SQL2003
CREATE TYPE имя_типа
[UNDER имя_супертипа]
[AS [новое_имя_типа] тип_данных [атрибут][, ...]
{[REFERENCES ARE [NOT] CHECKED
[ON DELETE {NO ACTION | CASCADE | RESTRICT
| SET NULL | SET DEFAULT}]] |
[DEFAULT значение] |
[COLLATE схема_упорядочения]}]
[[NOT] INSTANTIABLE]
[[NOT] FINAL]
[REF IS SYTEM GENERATED |
REF USING тип_данных
[CAST {(SOURCE AS REF) | (REF AS SOURCE)}
WITH идентификатор] |
REF новое_имя_типа[, ...] ]
[CAST {(SOURCE AS DISTINCT) | (DISTINCT AS SOURCE)}
WITH идентификатор]
[определение_метода [, ...]]
Для изменения типа данных используется следующий синтаксис:
ALTER TYPE имя_типа {ADD ATTRIBUTE опеределение_типа|
DROP ATTRIBUTE имя_типа}
Ключевые слова
{CREATE | ALTER} TYPE имя_типа
Создает новый или меняет существующий тип данных.
242 Глава 3. Справочник операторов SQL
UNDER супертип
Указывает существующий пользовательский тип данных, подтипом которо
го является создаваемый тип. (Пользовательский тип данных может высту
пать супертипом, если он объявлен с параметром NOT FINAL.)
AS [новое_имя_типа] тип_данных [атрибут][, ...]
Описывает атрибуты типа в том же виде, как описываются столбцы таблицы
в операторе CREATE TABLE, но без ограничений целостности. Атрибут соз
дается либо на основании обычного скалярного типа данных, как VAR0
CHAR(10), либо на основании другого, ранее созданного пользовательского
типа данных, либо на основании определенного пользователем домена. Объ
явление пользовательского типа на базе стандартного скалярного типа дан
ных (например, CREATE TYPE my_type AS INT) создает отдельный (dis0
tinct) тип, а объявление пользовательского типа, содержащего набор атрибу
тов, создает структурный (structured) тип. Допустимы следующие атрибуты
структурного типа:
ON DELETE NO ACTION
Вызывает ошибку при нарушении внешнего ключа (поведение по умолча
нию).
ON DELETE RESTRICT
Синоним для NO ACTION.
ON DELETE CASCADE
В ссылающемся столбце проставляется значение столбца, на который ссы
лаются.
ON DELETE SET NULL
Ссылающемуся столбцу присваивается значение NULL.
ON DELETE SET DEFAULT значение
Определяет для пользовательского типа значение по умолчанию.
COLLATE схема_упорядочения
Определяет схему упорядочения (то есть порядок сортировки) для пользо
вательского типа данных. По умолчанию используется схема упорядоче
ния базы данных.
[NOT] INSTANTIABLE
Определяет, можно (INSTANTIABLE) или нет (NOT INSTANTIABLE) созда
вать экземпляры данного типа. Для создания объектных таблиц тип должен
иметь параметр INSTANTIABLE.
[NOT] FINAL
FINAL означает, что тип не может иметь подтипов. NOT FINAL означает, что
тип может иметь подтипы.
REF
Определяет генерируемую системой или пользователем спецификацию ссыл
ки, т. е. некоего уникального идентификатора, являющегося указателем, на
который может ссылаться другой тип. Ссылаясь на существующий тип с ис
пользованием его ссылочной спецификации, вы можете наследовать в созда
CREATE/ALTER TYPE 243
ваемом типе все атрибуты существующего типа. Существует три способа ге
нерации значений ссылочного столбца объектной таблицы:
новое_имя_udt
Объявляет, что ссылочная спецификация обеспечивается другим указан
ным пользовательским типом данных.
IS SYSTEM GENERATED
Указывает, что ссылочная спецификация генерируется автоматически
(как при автоматическом инкременте столбца). Этот вариант использует
ся по умолчанию.
USING тип_данных [CAST {(SOURCE AS REF) | (REF AS SOURCE)} WITH
идентификатор]
Указывает, что пользователь определяет ссылочную спецификацию. Это
делается с использованием существующего типа данных и, при необходи
мости, с приведением типа данных к новому типу. Вы можете использо
вать CAST (SOURCE AS REF) WITH для преобразования значения стан
дартного типа в ссылочный тип структурного типа, либо использовать
CAST (REF AS SOURCE) WITH для преобразования значения структур
ного типа к типу_данных. Фраза WITH позволяет объявить дополнитель
ный идентификатор для преобразуемого типа.
CAST {(SOURCE AS DISTINCT) | (DISTINCT AS SOURCE)} WITH идентифика
тор определения_метода[, ...]
Объявляет один или несколько методов пользовательского типа данных. Ме0
тод – это специальная пользовательская функция, создаваемая оператором
CREATE METHOD (смотрите описание CREATE FUNCTION). Фраза опреде
ление_метода не нужна для структурных типов, так как их методы создаются
неявно. По умолчанию для методов используются настройки LANGUAGE
SQL, PARAMETER STYLE SQL, NOT DETERMINISTIC, CONTAINS SQL
и RETURN NULL ON NULL INPUT.
ADD ATTRIBUTE определение_типа
Добавляет атрибут в существующий тип данных, используется такой же син
таксис, как в описанной выше фразе AS. Используется в операторе ALTER
TYPE.
DROP ATTRIBUTE имя_типа
Удаляет атрибут существующего пользовательского типа данных. Использу
ется в операторе ALTER TYPE.
Общие правила
Вы можете применять пользовательские типы данных для улучшенного контро
ля целостности данных и для упрощения этого контроля. Важной концепцией
пользовательских типов данных является механизм создания подтипов, то есть
типов, созданных на базе других типов. Тип, на базе которого создается другой
тип, называется родительским типом или супертипом. Подтипы наследуют ха
рактеристики своих супертипов.
Представьте, что вы создали пользовательский тип phone_nbr для хранения те
лефонных номеров. На базе этого типа можно создать подтипы home_phone,
244 Глава 3. Справочник операторов SQL
Советы и хитрости
Пользовательские типы данных редко используются и слабо знакомы большин
ству разработчиков и администраторов баз данных. Поэтому часто проблемы
возникают изза обычного незнания. Тем не менее, пользовательские типы дан
ных являются хорошим средством для представления повторно используемых
сущностей базы данных, таких как адреса (т. е. улица1, улица2, город, область,
индекс).
MySQL
Не поддерживается.
Oracle
В Oracle поддерживаются операторы CREATE TYPE и ALTER TYPE, но они не
соответствуют стандарту ANSI. Вместо одного оператора CREATE TYPE исполь
зуются два оператора: CREATE TYPE для спецификации атрибутов типа и CREA0
TE TYPE BODY для объявления программного кода типа. Синтаксис CREATE
TYPE следующий:
CREATE [OR REPLACE] TYPE имя_типа
{ [OID 'идентификатор_объекта']
[AUTHID {DEFINER | CURRENT_USER}]
{ {AS | IS} OBJECT | [UNDER имя_супертипа] |
{OBJECT | TABLE OF тип_данных
| VARRAY ( лимит ) OF тип_данных} }
EXTERNAL NAME внешнее_имя_java
LANGUAGE JAVA USING определение_данных
{ [ (атрибут тип_данных[, ...]) [EXTERNAL NAME 'имя'] |
[[NOT] OVERRIDING] [[NOT] FINAL] [[NOT] INSTANTIABLE]
[{ {MEMBER | STATIC}
{ функция | процедура } |
конструктор | сортировка } [...]]
[фраза_pragma] ] } }
После того как тип объявлен, вся его логика инкапсулируется в теле типа. Имя
типа, указанное в операторах CREATE TYPE и CREATE TYPE BODY, должно
быть одинаковым. Синтаксис оператора CREATE TYPE BODY следующий:
CREATE [OR REPLACE] TYPE BODY имя_типа
{AS | IS}
CREATE/ALTER TYPE 245
{{MEMBER | STATIC}
{ функция | процедура | конструктор}}[...]
[сортировка]
Оператор ALTER TYPE в Oracle позволяет добавить или удалить атрибуты или
методы типа:
ALTER TYPE имя_типа
{COMPILE [DEBUG] [{SPECIFICATION | BODY}]
[директивы_компилятора] [REUSE SETTINGS] |
REPLACE [AUTHID {DEFINER | CURRENT_USER}] AS OBJECT
(атрибут тип_данных[, ...] [определение_элемента[, ...]]) |
[[NOT] OVERRIDING] [[NOT] FINAL] [[NOT] INSTANTIABLE]
{ {ADD | DROP} { {MAP | ORDER} MEMBER FUNCTION имя_функции
(параметр тия_данных[, ...]) } |
{ {MEMBER | STATIC} {функция | процедура} |
конструктор | сортировка [фраза_pragma] } [...] |
{ADD | DROP | MODIFY} ATTRIBUTE (атрибут [тип_данных][, ...]) |
MODIFY {LIMIT целое_число | ELEMENT TYPE тип_данных} }
[ {INVALIDATE |
CASCADE [{ [NOT] INCLUDING TABLE DATA | CONVERT TO SUBSTITUTABLE }]
[FORCE] [EXCEPTIONS INTO имя_таблицы]} ]}
Параметры трех этих операторов имеют следующие значения:
OR REPLACE
Пересоздает тип, если тип с таким именем уже существует. Все зависящие от
типа объекты помечаются как DISABLED.
AUTHID {DEFINER | CURRENT_USER}
Определяет, с какими привилегиями выполняются членыфункции типа и как
производится разрешение имен. (Имейте в виду, что подтипы наследуют спо
соб определения привилегий от родительских типов.) Эта фраза используется
только с объектными типами, но не с типами VARRAY и вложенными табли
цами.
DEFINER
Выполняет членыфункции с привилегиями создателя типа. Также объек
ты, для которых не указана схема, будут искаться из схемы, в которой
хранятся функции и процедуры.
CURRENT_USER
Выполняет членыфункции с привилегиями пользователя, использующе
го тип. Объекты, для которых не указана схема, будут искаться в схеме
этого пользователя.
UNDER имя_супертипа
Указывает супертип для создаваемого типа. Супертип должен быть создан
с фразой AS OBJECT. Подтип наследует все свойства супертипа, хотя некото
рые из них нужно переопределить, а некоторые добавить, чтобы новый тип
отличался от супертипа.
OID ‘идентификатор_объекта’
Объявляет эквивалентный идентичный объект в более чем одной базе дан
ных. Эта фраза используется в основном разработчиками, использующими
246 Глава 3. Справочник операторов SQL
объект_java
Определяет формат возвращаемого значения пользовательского типа Java с ис
пользованием следующего синтаксиса:
RETURN { тип_данных | SELF AS RESULT} EXTERNAL [VARIABLE] NAME 'имя_java'
Если вы используете фразу EXTERNAL, то значение публичного метода Java
должно быть совместимым со значением, возвращаемым в SQL.
фраза_pragma
Определяет для типа директивы прекомпилятора с использованием следую
щего синтаксиса:
PRAGMA RESTRICT REFERENCES ( {DEFAULT | имя_метода},
{RNDS | WNDS |RNPS | WNPS | TRUST}[, ...] )
Эта фраза устарела и ее использования следует избегать. С ее помощью опи
сывается, каким образом пользовательский тип читает и изменяет данные
в таблицах и переменных базы данных.
DEFAULT
Устанавливает настройки прекомпилятора, используемые по умолчанию
для всех методов пользовательского типа.
имя_метода
Указывает, к какому методу применять директиву
RNDS
Не читает из базы данных – чтения из базы данных запрещены.
WNDS
Не пишет в базу данных – запись в базу данных запрещена.
RNPS
Не читает пакеты – чтение пакетов запрещено.
WNPS
Не пишет в пакеты – запись в пакеты запрещена.
TRUST
Указывает, что корректность используемых директив не проверяется.
спецификация_вызова_java
Указывает реализацию метода на Java в формате JAVA NAME ‘имя_java’. Это
позволяет вам определять тело типа на Java без использования оператора
CREATE TYPE BODY.
спецификация_вызова_C
Определяет спецификацию вызова языка C с использованием следующего
синтаксиса:
C [NAME имя] LIBRARY имя_библиотеки [AGENT IN (аргумент)]
[WITH CONTEXT] [PARAMETERS (параметр[, ...])]
Эта фраза позволяет вам определять тело типа на C без использования опера
тора CREATE TYPE BODY.
CREATE/ALTER TYPE 249
COMPILE
Компилирует спецификацию и тело объектного типа. Это является поведени
ем по умолчанию, если не используется ни фраза SPECIFICATION, ни фраза
BODY.
DEBUG
Генерирует и добавляет к телу типа дополнительный код для PL/SQL отлад
чика. Не используйте одновременно DEBUG и директиву прекомпилятора
PLSQL_DEBUG.
SPECIFICATION | BODY
Указывает, что необходимо перекомпилировать либо спецификацию (SPECI0
FICATION) объектного типа (созданную оператором CREATE TYPE) либо те
ло типа (BODY, создаваемое оператором CREATE TYPE BODY).
директивы_компилятора
Задает значения для директив компилятора в формате директива='значение'.
Директивы компилятора следующие: PLSQL_OPTIMIZE_LEVEL, PLSQL_
CODE_TYPE, PLSQL_DEBUG, PLSQL_WARNINGS и NLS_LENGTH_SE0
MANTICS. Для каждой директивы можно указать только одно значение.
Значение директивы действует только для компилируемого объекта.
REUSE SETTINGS
Сохраняет исходные значения директив компилятора.
REPLACE AS OBJECT
Добавляет в спецификацию новый подтип. Эта фраза используется только
с объектными типами.
[NOT] OVERRIDING
Указывает, что метод переопределяет или не переопределяет (NOT) метод су
пертипа. Эта фраза применяется только с методами и требуется для методов,
переопределяющих методы супертипа. NOT OVERRIDING является значе
нием по умолчанию.
ADD
Добавляет в пользовательский тип новый метод (подпрограмму, основанную
на процедуре или функции) или атрибут.
DROP
Удаляет из пользовательского типа метод (подпрограмму, основанную на
процедуре или функции) или атрибут.
MODIFY
Изменяет свойства существующего атрибута пользовательского типа данных.
MODIFY LIMIT целое_число
Увеличивает число элементов в коллекции VARRAY до указанного значе
ния, при условии, что новое значение больше текущего. Не используется для
вложенных таблиц.
250 Глава 3. Справочник операторов SQL
PostgreSQL
В PostgreSQL поддерживаются оба оператора – CREATE TYPE и ALTER TYPE.
Реализация ALTER TYPE не соответствует стандарту:
CREATE TYPE имя_типа
( INPUT = функция_ввода,
OUTPUT = функция_вывода
[, INTERNALLENGTH = { целое_число | VARIABLE } ]
[, DEFAULT = значение ]
[, ELEMENT = тип_элемента_массива ]
[, DELIMITER = разделитель ]
[, PASSEDBYVALUE ]
[, ALIGNMENT = {CHAR | INT2 | INT4 | DOUBLE} ]
[, STORAGE = {PLAIN | EXTERNAL | EXTENDED | MAIN} ]
252 Глава 3. Справочник операторов SQL
[, SEND = функция_посылки ]
[, RECEIVE = функция_получения ]
[, ANALYZE = функция_анализа ] )
С помощью оператора ALTER TYPE можно поменять владельца и схему сущест
вующего типа:
ALTER TYPE имя_типа [OWNER TO новый_владелец]
[SET SCHEMA новая_схема]
Параметры следующие:
CREATE TYPE имя_типа
Создает новый пользовательский тип с указанным именем. Название не мо
жет быть длиннее 30 символов в длину, а также не может начинаться с под
черкивания.
INPUT = функция_ввода
Определяет имя существующей функции, конвертирующей значения аргу
ментов во внутренний формат представления типа.
OUTPUT = функция_вывода
Определяет имя существующей функции, конвертирующей внутренний фор
мат представления типа в формат отображения.
INTERNALLENGTH = { целое_число| VARIABLE }
Определяет длину внутреннего представления типа для типов с фиксирован
ной длиной. Ключевое слово VARIABLE (значение по умолчанию) указывает,
что тип имеет переменную длину.
DEFAULT = значение
Определяет для типа значение по умолчанию.
ELEMENT = тип_элемента_массива
Указывает, что пользовательский тип данных представляет собой массив из
элементов указанного типа. Например, массив целочисленных значений сле
дует объявлять как ELEMENT=INT4. Как правило, вы должны использо
вать для элементов массива значения по умолчанию. Единственный случай,
когда вам потребуется переопределить значения по умолчанию, это создание
пользовательского типа фиксированной длины, состоящего из массива иден
тичных элементов, пригодных для индексации.
DELIMITER = разделитель
Определяет символ, являющийся разделителем элементов массива в отобра
жаемом формате. Используется только вместе с фразой ELEMENT. По умол
чанию используется запятая.
PASSEDBYVALUE
Указывает, что значения типа передаются по значению, а не ссылке. Эта фра
за опциональна и не может использоваться для типов, имеющих длину боль
ше, чем у типа DATUM (4 байта в большинстве операционных систем, 8 байт
в остальных).
CREATE/ALTER TYPE 253
При создании в PostgreSQL нового типа он доступен только в текущей базе дан
ных. Владельцем типа становится пользователь, который его создал. Большин
ство параметров при создании типа могут идти в любом порядке и являются не
обязательными (кроме функций ввода и вывода).
Перед созданием типа вам нужно создать как минимум две функции. Вы долж
ны создать функцию ввода (INPUT), заполняющую тип внешними значениями,
а также функцию вывода (OUTPUT), создающую пригодное к использованию
254 Глава 3. Справочник операторов SQL
SQL Server
SQL Server поддерживает оператор CREATE TYPE, но не ALTER TYPE. Новые
типы данных можно создавать также, используя системную хранимую процеду
ру sp_addtype. Синтаксис реализации оператора CREATE TYPE следующий:
CREATE TYPE имя_типа
{ FROM базовый_тип [ ( точность [, масштаб])] [[NOT] NULL] |
AS TABLE определение_таблицы |
CLR_определение }
где:
FROM базовый_тип
Указывает тип, на базе которого создается новый тип. Базовым типом может
быть любой из следующих типов: BIGINT, BINARY, BIT, CHAR, DATE, DA0
TETIME, DATETIME2, DATETIMEOFFSET, DECIMAL, FLOAT, IMAGE,
INT, MONEY, NCHAR, NTEXT, NUMERIC, NVARCHAR, REAL, SMALLDA0
TETIME, SMALLINT, SMALLMONEY, SQL_VARIANT, TEXT, TIME, TI0
NYINT, UNIQUEIDENTIFIER, VARBINARY и VARCHAR. Можно указывать
точность и масштаб для тех типов, где это применимо.
[NOT] NULL
Указывает, допустимы ли для типа значения NULL. По умолчанию пустые
значения допустимы.
CREATE/ALTER VIEW 255
AS TABLE определение_таблицы
Определяет пользовательский табличный тип с описаниями столбцов, типов
данных, ключей, ограничений (CHECK, UNIQUE и PRIMARY KEY) и свойств
(таких как CLUSTERED и NONCLUSTERED), как для обычной таблицы.
SQL Server поддерживает создание типов, написанных на Microsoft .NET Frame
work CLR. Эти типы создаются и изменяются так же, как и обычные типы SQL,
однако телами таких типов являются внешние сборки. Информацию по созда
нию пользовательских типов на CLR ищите в документации.
Типам, созданным с помощью процедуры sp_addtype, доступны роли PUBLIC.
Права на использование пользовательских типов, созданных оператором CREA0
TE TYPE, необходимо выдавать явно.
См. также
CREATE/ALTER FUNCTION/PROCEDURE
DROP
CREATE/ALTER VIEW
С помощью этих операторов создаются и модифицируются представления (иногда
называемые также виртуальными таблицами). Представление используется в за
просах как обычная таблица, но создается как запрос. Когда представление ис
пользуется в операторе, то результат выполнения этого запроса становится содер
жимым представления на время выполнения этого оператора. Практически лю
бой корректный оператор SELECT можно использовать для создания представле
ния, хотя в некоторых платформах существуют определенные ограничения.
В некоторых случаях представления могут быть обновляемыми, при этом опера
тор UPDATE для представления транслируется в операторы UPDATE для тех
таблиц, на базе которых создано представление. Некоторые платформы поддер
живают материализованные представления, которые физически являются таб
лицами, определяемыми с помощью запроса.
Синтаксис SQL2003
CREATE [RECURSIVE] VIEW имя_представления
{[(столбец[, ...])] |
256 Глава 3. Справочник операторов SQL
Ключевые слова
CREATE VIEW имя_представления
Создает новое представление с заданным именем.
RECURSIVE
Указывает, что представление является рекурсивным, то есть извлекает дан
ные из самого себя. В рекурсивном представлении должны содержаться опре
деления столбцов и нельзя использовать фразу WITH.
[(столбец [, ...])]
Именует столбцы представления. Количество имен столбцов должно совпа
дать с количеством столбцов в операторе SELECT представления. Если имена
не указаны, то они формируются из оператора SELECT. Указание имен обя
зательно, если некоторые столбцы представления вычисляются при помощи
выражений, а не напрямую извлекаются из таблицы.
OF имя_udt [UNDER имя_супертипа]
Создает представление на базе пользовательского типа данных. Для каждого
атрибута типа создается столбец в представлении. Для создания представле
ния по подтипу используйте фразу UNDER.
REF IS имя_столбца {SYSTEM GENERATED | USER GENERATED | DERIVED}
Определяет столбец представления, являющийся объектным идентификато
ром.
имя_столбца WITH OPTIONS SCOPE имя_таблицы
Определяет область действия ссылочного столбца представления. (Так как
столбцы представления формируются из атрибутов типа, то список столбцов
не указывается. Поэтому для указания параметров столбцов используется
фраза имя_столбца WITH OPTIONS.)
AS оператор_select
Определяет оператор SELECT, используемый для формирования данных пред
ставления.
WITH [CASCADED | LOCAL] CHECK OPTION
Используется только с обновляемыми представлениями. Проверяет, что че
рез представление могут быть вставлены, изменены или удалены только те
данные, которые доступны представлению. Например, если представление
employees показывает зарплаты только сотрудников, работающих за фикси
рованный оклад, то через это представление нельзя добавить, обновить или
удалить записи о сотрудниках с почасовой оплатой труда. Опции CASCADED
и LOCAL используются для вложенных представлений. CASCADED выпол
няет проверку CHECK OPTION для текущего представления и для всех пред
ставлений, на которых текущее представление построено. LOCAL выполняет
проверку только для текущего представления.
CREATE/ALTER VIEW 257
Общие правила
Представления эффективны настолько, насколько эффективны запросы, исполь
зуемые в представлениях. Вот почему важно в представлениях использовать
корректно написанные, быстрые запросы. Самое простое представление выводит
полностью содержимое одной таблицы:
CREATE VIEW employees
AS
SELECT *
FROM employee_tbl;
После имени представления можно указать список столбцов. Этот список содер
жит псевдонимы для столбцов результирующего набора оператора SELECT. Ес
ли вы используете список столбцов, то вы должны указать псевдоним для каж
дого столбца оператора SELECT. Если вы не используете список столбцов, то
имена столбцов представления будут такими же, как имена столбцов в операто
ре SELECT. Иногда вы можете видеть в представлениях операторы SELECT, ис
пользующие фразу AS: это позволяет разработчику представления дать столбцу
осмысленное имя без указания в представлении полного списка столбцов.
Стандарт ANSI требует либо использовать список столбцов, либо фразу AS. Од
нако некоторые платформы предоставляют большую гибкость, поэтому приме
няйте AS в следующих случаях:
• Когда оператор SELECT содержит вычисляемый столбец, например (sala0
ry*1.04).
• Когда оператор SELECT содержит столбцы с указанием полного имени, на
пример pubs.scott.employee.
• Когда оператор SELECT содержит несколько столбцов с одинаковыми имена
ми (но из разных схем или баз данных).
Например, следующие два оператора дают в итоге идентичные представления:
Используется список столбцов
CREATE VIEW title_and_authors
(title, author_order, author, price, avg_monthly_sales,
publisher)
AS
SELECT t.title, ta.au_ord, a.au_lname, t.price,
(t.ytd_sales / 12),t.pub_id
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id = ta.au_id
JOIN titles AS t ON t.title_id = ta.title_id
WHERE t.advance > 0;
Используется AS для каждого столбца
CREATE VIEW title_and_authors
AS
SELECT t.title AS title, ta.au_ord AS author_order,
a.au_lname AS author, t.price AS price,
(t.ytd_sales / 12) AS avg_monthly_sales,
t.pub_id AS publisher
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id = ta.au_id
258 Глава 3. Справочник операторов SQL
Советы и хитрости
Представления можно создавать на основе других представлений, хотя такой
подход не рекомендуется и считается плохой практикой. В зависимости от плат
формы такие представления могут дольше компилироваться, но производитель
ность таких представлений будет такой же, как и при операциях над базовыми
таблицами. В других платформах, где представления создаются динамически
при вызовах, запросы к вложенным представлениям могут очень долго возвра
щать результат, так как каждый уровень вложенности означает полное выполне
ние отдельного запроса. В самом худшем случае запрос к представлению с треть
им, к примеру, уровнем вложенности может потребовать выполнения трех кор
релированных подзапросов.
Материализованные представления, хоть и объявляются как обычные представ
ления, после создания занимают место для хранения данных как обычные таб
лицы. Перед созданием материализованного представления убедитесь, что име
ется достаточно свободного пространства.
MySQL
В MySQL поддерживаются операторы CREATE VIEW и ALTER VIEW. Но MySQL
не поддерживает рекурсивных представлений, представлений с пользовательски
ми типами данных и столбцами REF. Синтаксис обоих операторов следующий:
{ALTER | CREATE [OR REPLACE]}
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = {имя_пользователя | CURRENT_USER}]
[SQL SECURITY {DEFINER | INVOKER}]
VIEW имя_представления [(столбец[, ...])]
AS оператор_select
[WITH [CASCADED | LOCAL] CHECK OPTION]
где:
ALTER | CREATE [OR REPLACE]
Изменяет существующее или создает новое представление. Если указано OR
REPLACE, то если уже существует представление с указанным именем, оно
заменяется на новое.
ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}
Определяет, каким образом MySQL будет работать с представлением. MERGE
объединяет запрос представления с запросом, использующим это представле
ние, а затем генерирует оптимальный план выполнения получившегося запро
са. TEMPTABLE означает, что результат выполнения запроса помещается во
временную таблицу, а затем запрос к представлению использует получившую
ся временную таблицу. При UNDEFINED (значение по умолчанию) MySQL
самостоятельно выбирает оптимальный вариант работы с представлением.
DEFINER = {имя_пользователя | CURRENT_USER}
Указывает учетную запись, используемую для проверки привилегий. Вы мо
жете либо явно указывать существующего пользователя, либо указать теку
щего пользователя (CURRENT_USER), выполняющего CREATE VIEW. Если
вы не укажете ничего, то по умолчанию будет подразумеваться CURRENT_
USER.
260 Глава 3. Справочник операторов SQL
Oracle
В Oracle поддерживаются расширения стандарта ANSI, позволяющие создавать
объектноориентированные представления, представления типа XMLType, пред
ставления с поддержкой LOB и объектных типов:
CREATE [OR REPLACE] [[NO] FORCE] VIEW имя_представления
{[ (столбец[, ...]) [ограничения] ] |
[OF имя_типа {UNDER родительское_представление |
WITH OBJECT IDENTIFIER {DEFAULT | (атрибут[, ...])}
[(ограничения)]}] |
[OF XMLTYPE [ [XMLSCHEMA url_xml_схема] ELEMENT
{элемент | url_xml_схема # элемент } ]
WITH OBJECT IDENTIFIER {DEFAULT | (атрибут[, ...])}] ]}
AS
(оператор_select)
[WITH [READ ONLY | CHECK OPTION
[CONSTRAINT имя_ограничения]]]
Оператор ALTER VIEW поддерживает дополнительные возможности, такие как
добавление, изменение и удаление ограничений, связанных с представлением.
Также с помощью этого оператора можно явно перекомпилировать представле
ние, что позволяет обнаружить ошибки компиляции до использования пред
ставления в запросах. Явная перекомпиляция позволяет определить, будет ли
изменение базовых таблиц влиять на представление:
ALTER VIEW имя_представления
{ADD ограничения |
MODIFY CONSTRAINT ограничения [NO]RELY]] |
DROP {PRIMARY KEY | CONSTRAINT ограничения | UNIQUE (столбец[, ...])}}
COMPILE
Параметры имеют следующие значения:
OR REPLACE
Заменяет существующее представление новым.
[NO] FORCE
FORCE позволяет создать представление вне зависимости от того, существуют
ли таблицы и функции, используемые в представлении, и достаточно ли при
вилегий на чтение и запись в эти таблицы. Также FORCE позволяет создавать
представление при наличии ошибок компиляции. При использовании NO
FORCE представление создается, только если все используемые в представле
нии объекты существуют и достаточно привилегий для их использований.
CREATE/ALTER VIEW 261
ограничения
Дает возможность создавать ограничения для представлений (в операторе
CREATE VIEW) или изменять именованные ограничения (в операторе ALTER
VIEW). Вы можете создавать ограничения как на уровне представления, так
и на уровне отдельных столбцов представления. Имейте в виду, что хотя Ora
cle и позволяет создавать ограничения для представления, выполнение этих
ограничений не проверяется. Ограничения представлений создаются в режи
мах DISABLE и NOVALIDATE.
OF имя_типа
Позволяет создать представление объектного типа. Столбцы представления
однозначно соответствуют атрибутам типа. Имена столбцов для объектных
представлений и представлений XMLType указывать не нужно.
UNDER родительское_представление
Указывает, что создаваемое представление является потомком указанного
родительского представления. Представление должно находиться в той же
схеме, что и родительское, а имя_типа (по которому создается представление)
должно быть непосредственным потомком типа данных родительского_пред
ставления. У представления может быть только один потомок.
WITH OBJECT IDENTIFIER {DEFAULT | (атрибут [, ...])}
Определяет корневое объектное представление, а также атрибуты объектного
типа, идентифицирующие каждую строку в объектном представлении. Эти
атрибуты обычно соответствуют столбцам первичного ключа базовой табли
цы и должны уникально идентифицировать каждую строку в представлении.
Эта фраза несовместима с вложенными представлениями и с разыменованны
ми и закрепленными (dereferenced or pinned) объектными ссылками. Ключе
вое слово DEFAULT обозначает использование существующего идентифика
тора базовой объектной таблицы или представления.
OF XMLTYPE [ [XMLSCHEMA url_xml_схемы] ELEMENT {элемент | url_xml_схе
мы # элемент} ] WITH OBJECT IDENTIFIER {DEFAULT | (атрибут[, ...])}
Объявляет, что представление возвращает экземпляры типа XMLType. Ука
зание опционального url_xml_схемы и названия элемента дополнительно огра
ничивает возвращаемый XML как элемент в этой XMLсхеме. Фраза WITH
OBJECT IDENTIFIER определяет уникальный идентификатор XMLType
представления, который может состоять из одного или нескольких атрибутов
и неагрегатных функций, например EXTRACTVALUE.
WITH READ ONLY
Создает представление, используемое только для чтения, но не для модифи
кации данных.
WITH CHECK OPTION [CONSTRAINT имя_ограничения]
Гарантирует, что через представление можно будет вставить или изменить
только те данные, которые будут возвращаться оператором SELECT пред
ставления. При желании вы можете указать имя этого ограничения. Если вы
не укажете имя, то Oracle сгенерирует имя SYS_Cn, где n – целое число.
262 Глава 3. Справочник операторов SQL
ADD ограничение
Добавляет новое ограничение для представления. Ограничения представле
ний создаются только в режимах DISABLE и NOVALIDATE.
MODIFY CONSTRAINT ограничение [NO]RELY
Изменяет параметр RELY или NORELY существующего ограничения пред
ставления. (RELY/NORELY описывается в разделе, посвященном оператору
CREATE TABLE.)
DROP {PRIMARY KEY | CONSTRAINT ограничение | UNIQUE (столбец[, ...])}
Удаляет существующее ограничение представления.
COMPILE
Перекомпилирует представление.
Любые указатели (dblinks) на базы данных, используемые в представлении,
должны быть предварительно созданы оператором CREATE DATABASE LINK…
CONNECT TO. Если представление содержит ретроспективный (flashback) за
прос, то фраза AS OF будет вычисляться при каждом вызове представления, а не
при каждой его компиляции.
В этом примере мы создадим представление с ограничением:
CREATE VIEW california_authors (last_name, first_name,
author_ID UNIQUE RELY DISABLE NOVALIDATE,
CONSTAINT id_pk PRIMARY KEY (au_id)
RELY DISABLE NOVALIDATE)
AS
SELECT au_lname, au_fname, au_id
FROM authors
WHERE state = 'CA';
В следующем примере создается пользовательский тип данных и объектное
представление:
CREATE TYPE inventory_type AS OBJECT
( title_id NUM(6),
warehouse wrhs_typ,
qty NUM(8) );
CREATE VIEW inventories OF inventory_type
WITH OBJECT IDENTIFIER (title_id)
AS
SELECT i.title_id, wrhs_typ(w.wrhs_id, w.wrhs_name,
w.location_id), i.qty
FROM inventories i
JOIN warehouses w ON i.wrhs_id = w.wrhs_id;
Мы могли бы перекомпилировать представление следующим образом:
ALTER VIEW inventories COMPILE:
Обновляемые представления в Oracle не могут содержать следующие элементы:
• Фразу DISTINCT.
• Фразы UNION, INTERSECT, MINUS.
CREATE/ALTER VIEW 263
PostgreSQL
В PostgreSQL поддерживается только минимальный набор функций оператора
CREATE VIEW:
CREATE [OR REPLACE] [TEMP[ORARY]]
VIEW имя_представления [ (столбец[, ...]) ]
AS оператор_select
[WITH [CASCADED | LOCAL] CHECK OPTION]
PostgreSQL не поддерживает оператор ALTER VIEW, но вы можете заменить оп
ределение старого представления новым определением, используя CREATE OR
REPLACE. В дополнение PostgreSQL позволяет создавать временные представ
ления, что расширяет стандарт SQL3.
CREATE VIEW в PostgreSQL не поддерживает множество возможностей, поддер
живаемых в других платформах, но поддерживает создание представлений на
базе таблиц и других объектов классов. Представления всегда создаются только
для чтения и не позволяют модифицировать данные в базовых таблицах.
SQL Server
SQL Server предлагает некоторые расширения стандарта ANSI, но не поддержи
вает объектных представлений и представленийпотомков:
CREATE VIEW имя_представления [(столбец[, ...])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA}[, ...]]
AS оператор_select
[WITH CHECK OPTION]
1 Авторы противоречат себе. Имя базы данных указывать не следует. Более того, все фи
гурирующие в выражении объекты должны относиться к одной базе данных. – Прим.
науч. ред.
CREATE/ALTER VIEW 265
AS
SELECT au_lname, au_fname, au_id
FROM authors
WHERE state = 'CA'
WITH CHECK OPTION
GO
В представлении можно использовать несколько операторов SELECT, если они
объединены при помощи UNION или UNION ALL. Также оператор SELECT
представления может содержать вызовы функций и подсказки оптимизатору.
Представление в SQL Server будет обновляемым, если выполнены все следую
щие условия:
• Не используются агрегатные функции
• Не используются фразы TOP, GROUP BY, DISTINCT и UNION
• Не создаются производные столбцы (смотрите SUBQUERY)
• Во фразе FROM используется хотя бы одна таблица1
В SQL Server можно создавать индексы по представлениям. Если вы создадите
уникальный кластерный индекс по представлению, то SQL Server сохранит фи
зическую копию данных представления. Изменения базовых таблиц автомати
чески вызывают обновление представления. Индексированные представления
занимают дополнительное пространство, но дают огромный прирост в произво
дительности. Такие представления должны создаваться с опцией SCHEMABIN0
DING.
SQL Server позволяет создавать локальные и распределенные секционированные
представления. Секционированное представление соединяет горизонтально
секционированные данные из группы таблиц, находящихся на одном или не
скольких серверах, представляя данные так, как будто они содержатся в единой
таблице. В локальном секционированном представлении все участвующие в нем
таблицы и само представление находятся на одном и том же экземпляре SQL
Server. Распределенное секционированное представление может использовать
данные, находящиеся на удаленных серверах.2
Секционированные представления явно выбирают данные из нескольких раз
личных источников, и каждый источник объединяется с другими при помощи
оператора UNION ALL. Оператор SELECT должен выбирать все столбцы из
представлений, и наборы столбцов должны быть идентичными.3 (Идея заключа
ется в том, что через пользовательское приложение вы логически разделяете
данные, а SQL Server затем распределяет их через секционированные представ
ления.) Следующий пример показывает, как создается представление с данны
ми из трех различных источников:
1 Вероятно, авторы имели в виду следующее правило: любые изменения, включая ис
пользование инструкций UPDATE, INSERT и DELETE, должны касаться столбцов
только из одной базовой таблицы. – Прим. науч. ред.
2 В распределенном секционированном представлении хотя бы одна из участвующих
таблиц находится на другом (удаленном) сервере. – Прим. науч. ред.
3 Вероятно, авторы имели в виду, что список столбцов в базовых таблицах должен сов
падать, и выбираться должны все столбцы. – Прим. науч. ред.
266 Глава 3. Справочник операторов SQL
См. также
CREATE/ALTER TABLE
DROP
SELECT
SUBQUERY
DECLARE CURSOR
Оператор DECLARE является одной из четырех (наряду с FETCH, OPEN и CLO0
SE) команд для работы с курсорами. Курсоры позволяют вместо одновременной
обработки множества строк обрабатывать каждую строку отдельно. Команда
DECLARE CURSOR определяет, какие строки извлекаются из таблицы или
представления для обработки.
Другими словами, курсоры особенно важны при работе с реляционными базами
данных, так как базы данных работают с множествами строк, а клиентские при
ложения работают с данными построчно. Курсоры, вопервых, позволяют про
граммистам использовать методологию их любимого языка программирования.
Вовторых, так как механизм работы курсоров в некоторых СУБД кардинально
отличается от обычного механизма работы с наборами строк, то курсоры в этих
СУБД могут работать существенно медленнее, чем обычные пакетные операции.
DECLARE CURSOR 267
Синтаксис SQL2003
DECLARE имя_курсора [{SENSITIVE | INSENSITIVE | ASENSITIVE}]
[[NO] SCROLL] CURSOR [{WITH | WITHOUT} HOLD]
[{WITH | WITHOUT} RETURN]
FOR оператор_select
[FOR {READ ONLY | UPDATE [OF столбец[, ...]]}]
Ключевые слова
DECLARE имя_курсора
Определяет имя курсора, уникальное в контексте, в котором объявляется
курсор (например, в базе данных или отдельной схеме). Не может быть созда
но другого курсора с таким же именем, как у уже существующего.
SENSITIVE | INSENSITIVE | ASENSITIVE
Определяет режим взаимодействия курсора с таблицамиисточниками и спо
соб формирования результирующего множества, возвращаемого курсором.
SENSITIVE
В этом режиме курсор работает напрямую с данными таблицы, и все изме
нения таблицы видны через курсор.
INSENSITIVE
В этом режиме для курсора создается временная копия таблицыисточни
ка, и поэтому все изменения таблицы, выполненные другими оператора
ми, невидимы во время работы курсора.
ASENSITIVE
Оставляет выбор режима работы курсора на усмотрение СУБД. Является
режимом по умолчанию в SQL2003.
[NO] SCROLL
В режиме NOSCROLL требуется обработка каждой строки курсора и переход
между строками осуществляется только оператором FETCH NEXT. SCROLL
позволяет обрабатывать строки в произвольном порядке и для перехода меж
ду строками использовать любые формы оператора FETCH.
{WITH | WITHOUT} HOLD
Курсор, объявленный с параметром WITH HOLD, остается открытым при
фиксации транзакции. При использовании WITHOUT HOLD курсор закры
вается при выполнении COMMIT. (Курсор WITH HOLD закрывается либо
при выполнении ROLLBACK, либо оператором CLOSE CURSORE.)
268 Глава 3. Справочник операторов SQL
Общие правила
Команда DECLARE CURSOR дает возможность извлекать из таблицы и обраба
тывать строки по одной. Это позволяет реализовать построчную обработку дан
ных вместо традиционной обработки наборов строк.
Схематично работа с курсорами представляет собой следующую последователь
ность:
1. Курсор объявляется командой DECLARE.
2. Курсор открывается командой OPEN.
3. Осуществляется работа с курсором с помощью команды FETCH.
4. Курсор закрывается командой CLOSE.
В команде DECLARE CURSOR объявляется оператор SELECT. Каждую строку,
возвращаемую этим оператором, можно отдельно извлечь и обработать. В сле
дующем примере для Oracle курсор объявляется вместе с некоторыми другими
переменными в инициализационном блоке. Затем курсор открывается, с ним
выполняются определенные манипуляции, и затем курсор закрывается:
DECLARE CURSOR title_price_cursor IS
SELECT title, price
FROM titles
WHERE price IS NOT NULL;
title_price_val title_price_cursor%ROWTYPE;
new_price NUMBER(10,2);
BEGIN
OPEN title_price_cursor;
FETCH title_price_cursor INTO title_price_val;
new_price := "title_price_val.price" * 1.25
INSERT INTO new_title_price
VALUES (title_price_val.title, new_price)
CLOSE title_price_cursor;
END;
DECLARE CURSOR 269
Так как в этом примере используется PL/SQL, то большая часть кода выходит за
рамки рассматриваемого в этой книге. Тем не менее, легко видеть объявление
курсора оператором DECLARE.1 Затем в выполняемой части блока PL/SQL кур
сор инициализируется оператором OPEN, затем извлекаются значения операто
ром FETCH, и в конце курсор закрывается оператором CLOSE.
Оператор SELECT является сердцем вашего курсора, поэтому перед использова
нием его в DECLARE CURSOR следует внимательно его проверить. Оператор SE0
LECT может обращаться к таблице или к представлению. Если курсор использу
ется только для чтения, то он также может обращаться к необновляемым пред
ставлениям. Также оператор SELECT необновляемого курсора может содержать
подфразы ORDER BY, GROUP BY и HAVING. Если же курсор объявлен с пара
метром FOR UPDATE, то желательно исключить указанные подфразы из опера
тора SELECT.
Локальные курсоры иногда используются как выходные параметры хранимых
процедур. То есть хранимая процедура может объявить и инициализировать
курсор, а затем вернуть его вызывающему процессу или процедуре.
В следующем примере для SQL Server объявляется и открывается курсор на базе
таблицы publishers. Из курсора извлекается первая строка и вставляется в дру
гую таблицу, затем следующая строка, и т. д., пока не будут обработаны все
строки. Наконец, курсор закрывается и освобождается (DEALLOCATE исполь
зуется для освобождения ресурсов курсора только в SQL Server):
DECLARE @publisher_name VARCHAR(20)
DECLARE pub_cursor CURSOR
FOR SELECT pub_name FROM publishers
WHERE country <> 'USA'
OPEN pub_cursor
FETCH NEXT FROM pub_cursor INTO @publisher_name
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO foreign_publishers VALUES(@publisher_name)
END
CLOSE pub_cursor
DEALLOCATE pub_cursor
В этом примере показано, как происходит перемещение по строкам курсора.
(Этот пример только демонстрирует работу с курсорами, а для выполнения опи
санной задачи лучше подходит оператор INSERT…SELECT.)
Советы и хитрости
В большинстве платформ не поддерживаются динамические выполняемые кур
соры. Наоборот, курсоры встраиваются в приложения, хранимые процедуры,
пользовательские функции и т. д. Другими словами, различные операторы для
создания и использования курсоров используются только в контексте хранимых
процедур либо других программных объектов, но не в обычных SQLскриптах.
MySQL
MySQL поддерживает подмножество синтаксиса SQL3:
DECLARE имя_курсора
FOR оператор_select
Курсоры можно использовать только в хранимых процедурах, функциях и триг
герах. Курсоры в MySQL всегда необновляемые, непрокручиваемые (переме
щаться по курсору можно только на одну строку вперед, и строки нельзя пропус
кать) и всегда работают в режиме ASENSITIVE (СУБД сама выбирает, создавать
ли для курсора временную копию данных или работать напрямую с таблицами
источниками). Внутри одного блока нельзя создавать несколько курсоров с оди
наковыми именами. Курсоры объявляются после переменных и условий, но пе
ред обработчиками.
Oracle
Oracle имеет весьма интересную реализацию курсоров. В реальности, любой опе
ратор работы с данными (INSERT, UPDATE, DELETE и SELECT) неявно от
крывает курсор. Например, в программе на языке C для построчной обработки
не требуется объявлять курсор, так как построчная обработка и так является по
ведением по умолчанию в Oracle. Поэтому вам потребуется объявлять курсоры
с помощью DECLARE CURSOR только из PL/SQL блоков, таких как хранимые
процедуры, но не из скриптов на чистом SQL.
PostgreSQL
В PostgreSQL не поддерживаются фразы WITH, зато есть возможность возвра
щать результирующее множество строк в двоичном, а не текстовом формате. Хо
тя компилятор воспринимает многие ключевые слова из синтаксиса оператора
по ANSI, в реальности оператор DECLARE CURSOR в PostgreSQL более ограни
чен, чем может показаться на первый взгляд:
DECLARE имя_курсора [BINARY] [INSENSITIVE] [[NO] SCROLL] CURSOR [{WITH | WITHOUT} HOLD]
FOR оператор_select
[FOR {READ ONLY | UPDATE [OF столбец[, ...]]}]
где:
BINARY
Возвращает данные из курсора в двоичном, а не текстовом формате.
INSENSITIVE
Указывает, что обновления таблицисточников из других процессов не влия
ют на данные курсора. Это поведение реализовано в PostgreSQL по умолча
нию, поэтому ключевое слово является необязательным.
[NO]SCROLL
SCROLL позволяет за одну операцию FETCH извлекать несколько строк,
причем можно двигаться в любом направлении курсора. Будьте осторожны
с использованием SCROLL, так как это может сильно замедлить работу с кур
сором. NOSCROLL позволяет извлекать из курсора только по одной строке
и не позволяет перескакивать через строки.
{WITH | WITHOUT} HOLD
WITH HOLD указывает, что курсор можно продолжать использовать после
фиксации транзакции, в которой он был создан. WITHOUT HOLD, значение
по умолчанию, указывает, что курсор нельзя использовать вне транзакции,
в которой он был создан.
272 Глава 3. Справочник операторов SQL
SQL Server
SQL Server поддерживает стандарт ANSI, а также некоторые расширения, при
дающие особую гибкость в возможности навигации по курсору и его обработке:
DECLARE имя_курсора CURSOR
[LOCAL | GLOBAL] [INSENSITIVE | FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR оператор_select
[FOR {READ ONLY | UPDATE [OF столбец[, ...] ]} ]
где:
LOCAL | GLOBAL
Определяет область действия курсора, ограничивая ее текущим блоком
TransactSQL (LOCAL) или всеми блоками текущей сессии. Глобальный кур
сор может использоваться любой процедурой, функцией или блоком TSQL,
запущенным в текущей сессии. Глобальные курсоры неявно закрываются
при завершении сессии, а локальные курсоры требуется закрывать вручную.
Ключевые слова LOCAL и GLOBAL являются необязательными, а значение
по умолчанию определяется параметром базы данных default_to_local.
INSENSITIVE | FORWARD_ONLY | SCROLL
Определяет способ перемещения курсора по результирующему набору строк:
INSENSITIVE
Результирующий набор создается в базе TEMPDB. Изменения в базовых
таблицах не отражаются на результате курсора. Эта опция несовместима
с такими расширениями, как LOCAL, GLOBAL, STATIC, KEYSET, DY0
NAMIC, FAST_FORWARD и т. п. Может использоваться только в операто
DECLARE CURSOR 273
READ_ONLY
Запрещает обновление курсора, а также его использование в операторах
UPDATE и DELETE, содержащих WHERE CURRENT OF.
SCROLL_LOCKS
Гарантирует успешные позиционные обновления и удаления при помощи
блокировок, накладываемых на данные по мере чтения курсора. Блоки
ровки удерживаются до момента закрытия курсора и освобождения ресур
сов. SCROLL_LOCKS и FAST_FORWARD взаимоисключаемы.
OPTIMISTIC
Допускает позиционные обновления и удаления строк, если они не изме
нялись с момента прочтения их курсором. Для этого SQL Server выполня
ет проверки времени последнего обновления или контрольных сумм, при
этом данные не блокируются. OPTIMISTIC и FAST_FORWARD взаимо
исключаемы.
TYPE_WARNING
Предупреждает пользователя в случае неявного преобразования типа курсо
ра (например, из SCROLL в FORWARD_ONLY).
FOR {READ ONLY | UPDATE [OF столбец[, ...]]}
FOR READ ONLY является стандартным синтаксисом определения курсоров,
используемых только для чтения. Эта фраза несовместима с другими пара
метрами курсоров, только что обсуждавшимися, и может быть использована
только с INSENSITIVE, FORWARD_ONLY и SCROLL. FOR UPDATE позво
ляет обновлять столбцы курсора, используя операторы UPDATE и DELETE
с фразой WHERE CURRENT OF. Если FOR UPDATE используется без списка
столбцов, то можно обновлять любой столбец курсора. В противном случае
можно обновлять только перечисленные столбцы.
См. также
CLOSE CURSOR
FETCH
OPEN
276 Глава 3. Справочник операторов SQL
DELETE
Оператор DELETE удаляет строки из одной или нескольких таблиц. Операторы
DELETE, применяемые к таблицам, называются иногда поисковыми удаления0
ми (search deletes). Оператор DELETE также можно использовать совместно
с курсорами, тогда он называется позиционным удалением.
СУБД Уровень поддержки
MySQL Поддерживается с вариациями
Oracle Поддерживается с вариациями
PostgreSQL Поддерживается
SQL Server Поддерживается с ограничениями
Синтаксис SQL2003
DELETE FROM { имя_таблицы | ONLY (имя_таблицы) }
[{ WHERE условие_поиска | WHERE CURRENT OF имя_курсора }]
Ключевые слова
FROM { имя_таблицы | ONLY (имя_таблицы) }
Указывает таблицу, из которой удаляются строки. Если явно не указано имя
схемы, то подразумевается, что таблица находится в текущей схеме. Можно
указать также имя представления. Ключевое слово FROM обязательно, если
только не используется DELETE…WHERE CURRENT OF. Если вы не исполь
зуете ключевое слово ONLY, то имя таблицы не заключается в скобки. ONLY
используется только для объектных таблиц и представлений и ограничивает
каскадное удаление записей в таблицахпотомках целевой таблицы. Если ис
пользовать слово ONLY для обычных таблиц, то оно будет проигнорировано
и не вызовет ошибки.
WHERE условие_поиска
Определяет условие поиска удаляемых записей. В WHERE допускаются лю
бые корректные выражения. Обычно условие поиска оценивается для каж
дой записи таблицы перед началом удаления.
WHERE CURRENT OF имя_курсора
Удаляет текущую запись указанного открытого курсора.
Общие правила
Оператор DELETE удаляет строки из таблицы или представления. Освобожден
ное при удалении строк пространство возвращается в базу данных, но не всегда
это происходит сразу.
В простейшем виде оператор DELETE не содержит фразы WHERE и удаляет все
записи из таблицы:
DELETE FROM sales;
Вы можете использовать фразу WHERE для определения тех записей, которые
следует удалить. В следующем примере все три оператора DELETE являются до
DELETE 277
пустимыми, и во всех используется фраза FROM, так как они являются поиско
выми удалениями:
DELETE FROM sales
WHERE qty IS NULL;
DELETE FROM suppliers
WHERE supplierid = 17
OR companyname = 'Tokyo Traders';
DELETE FROM distributors
WHERE postalcode IN
(SELECT territorydescription FROM territories);
Помните, что в позиционных удалениях фраза FROM не используется.
В некоторых случаях вам может требоваться удалять записи из открытого кур
сора:
DELETE titles WHERE CURRENT OF title_cursor;
В этом операторе подразумевается, что вы объявили и открыли курсор с назва
нием title_cursor. При выполнении оператора DELETE удаляется та запись кур
сора, на которой он находится в этот момент.
Советы и хитрости
Оператор DELETE достаточно редко выполняется без фразы WHERE, так как
в этом случае удаляются все строки таблицы. Перед удалением выполните опе
ратор SELECT с тем же фильтром в WHERE, это позволит вам убедиться, что вы
удаляете те записи, которые нужно.
Если вам требуется удалить все записи из таблицы, то используйте не описан
ный в ANSI, но весьма распространенный оператор TRUNCATE TABLE. В тех
базах данных, в которых он поддерживается, оператор TRUNCATE TABLE
обычно работает быстрее, чем DELETE, так как при его выполнении не журна
лируется удаление каждой записи. При удалении большого числа записей отказ
от журналирования значительно экономит время, но при этом делает невозмож
ным откат удаления. Более того, в некоторых базах данных перед выполнением
TRUNCATE TABLE требуется удалить все внешние ключи.
MySQL
В MySQL есть несколько расширений стандарта ANSI, но не поддерживается
фраза WHERE CURRENT OF. Синтаксис оператора следующий:
DELETE [LOW_PRIORITY] [QUICK] [имя_таблицы[.*][,...]]
{FROM имя_таблицы [.*][,...]|[USING имя_таблицы[.*][,...]]}
[WHERE условие_поиска]
[ORDER BY фраза]
[LIMIT число_строк]
Параметры имеют следующие значения:
LOW PRIORITY
Откладывает удаление до того момента, когда другие клиенты закончат чте
ние таблицы.
278 Глава 3. Справочник операторов SQL
QUICK
Предотвращает слияние листьев индекса в процессе удаления.
DELETE имя_таблицы[,…]
Позволяет за один раз удалить строки из нескольких таблиц. Таблицы, пере
численные перед фразой FROM, при наличии списка таблиц после FROM яв
ляются целевыми таблицами: из всех этих таблиц будут удалены все требуе
мые записи.
FROM имя_таблицы [.*]
Указывает одну или несколько таблиц, из которых удаляются записи. (.* ис
пользуется для улучшенной совместимости с MS Access.) Если перед FROM
указан список таблиц, то таблицы после FROM используются в операциях со
единения и поиска по справочникам.
USING имя_таблицы [.*][,…]
Заменяет одну или несколько таблиц, указанных перед фразой FROM, табли
цами после фразы FROM.
ORDER BY фраза
Определяет порядок, в котором будут удаляться строки. Имеет смысл только
при использовании вместе с фразой LIMIT.
LIMIT число_строк
LIMIT позволяет ограничить число строк, после удаления которых управле
ние возвращается пользователю.
MySQL позволяет одной командой удалить данные из нескольких таблиц. В сле
дующем примере два оператора DELETE функционально эквивалентны:
DELETE orders FROM customers, orders
WHERE customers.customerid = orders.customerid
AND orders.orderdate BETWEEN '19950101' AND '19951231'
DELETE FROM orders USING customers, orders
WHERE customers.customerid = orders.customerid
AND orders.orderdate BETWEEN '19950101' AND '19951231'
В этих примерах мы удаляем все заказы из таблицы orders, сделанные клиента
ми из таблицы customers в течение 1995 года. Обратите внимание, что в мульти
табличных удалениях нельзя использовать фразы LIMIT и ORDER BY.
Используя LIMIT и ORDER BY вы можете удалять записи упорядоченными на
борами:
DELETE FROM sales
WHERE customerid = 'TORTU’
ORDER BY customerid
LIMIT 5
MySQL в некоторых случаях позволяет ускорить операции удаления. Например,
обычно после завершения удаления возвращается число удаленных записей. Но
если удаляются все записи таблицы, то MySQL не будет считать удаленные запи
си и вернет 0, так как это быстрее. В режиме AUTOCOMMIT оператор DELETE
без фразы WHERE будет заменен на более быструю операцию TRUNCATE.
DELETE 279
Oracle
Oracle позволяет удалять строки из таблиц, представлений, материализованных
представлений, вложенных подзапросов и секционированных таблиц и представ
лений:
DELETE [FROM]
{имя_таблицы | ONLY (имя_таблицы)} [псевдоним]
[{PARTITION (имя_секции) |
SUBPARTITION (имя_подсекции)}] |
(подзапрос [WITH {READ ONLY |
CHECK OPTION [CONSTRAINT имя_ограничения]}]) |
TABLE (выражение_коллекция) [ (+) ]}
[подсказка]
[WHERE условие_поиска]
[RETURNING выражение[, ...] INTO переменная[, ...]]
[LOG ERRORS [INTO [схема.]имя_таблицы] [(простое_выражение)]
[REJECT LIMIT {UNLIMITED |целое_число }]]
Параметры имеют следующие значения:
имя_таблицы [псевдоним]
Указывает таблицу, материализованное представление, секционированную
таблицу или представление, из которого удаляются строки. Вы можете при
необходимости указать имя схемы или связь с другой базой данных. По умол
чанию Oracle будет использовать таблицу в текущей схеме локального серве
ра. Также можно указать псевдоним для таблицы. Псевдоним необходим, ес
ли целевая таблица использует атрибут или метод объектного типа.
PARTITION имя_секции
Применяет операцию удаления только к указанной секции. Использование
PARTITION не является обязательным при удалении из секционированной
таблицы, но позволяет уменьшить сложность фразы WHERE.
SUBPARTITION имя_секции
Применяет операцию удаления только к указанной подсекции вместо всей
таблицы.
(подзапрос [WITH {READ ONLY | CHECK OPTION [CONSTRAINT имя_ограниче
ния]}])
Указывает, что строки удаляются из подзапроса, а не из таблицы или пред
ставления. Для этой фразы используются следующие параметры:
подзапрос
Определяет SELECTоператор подзапроса. В качестве подзапроса можно
использовать любой корректный подзапрос, но без фразы ORDER BY.
280 Глава 3. Справочник операторов SQL
(простое_выражение)
Указывает выражение, которым помечаются записи в таблице ошибок.
Это позволяет различать ошибки, вызванные разными DMLоперациями.
REJECT LIMIT {UNLIMITED |целое_число}
Указывает предельное значение числа ошибок, при достижении которого
операция DELETE прерывается и транзакция откатывается. По умолча
нию используется значение 0. Ключевое слово UNLIMITED используется
при неограниченном числе ошибок.
При выполнении DELETE Oracle освобождает место и возвращает его таблице
или индексу, в котором хранились данные.
Для удаления из представления требуется, чтобы представление не содержало
операторов работы с множествами, ключевого слова DISTINCT, соединений, аг
регатных функций, аналитических функций, подзапросов или коллекций в спи
ске SELECT, фраз GROUP BY, ORDER BY, CONNECT BY и START WITH.
Вот пример удаления записей из таблицы удаленного сервера:
DELETE FROM scott.sales@chicago;
Следующий оператор удаляет данные из производной таблицы, то есть из кол
лекции:
DELETE TABLE(SELECT contactname FROM customers с
WHERE c.customerid = 'BOTTM') s
WHERE s.region IS NULL OR s.country = 'MEXICO';
Вот пример удаления данных из определенной секции:
DELETE FROM sales PARTITION (sales_q3_1997)
WHERE qty > 10000;
В последнем примере мы возвращаем удаленные значения в переменные с помо
щью фразы RETURNING:
DELETE FROM employee
WHERE job_id = 13
AND hire_date + TO_YMINTERVAL('01 06') =< SYSDATE;
RETURNING job_lvl
INTO :int01;
В этом примере удаляются записи из таблицы employee, и значения job_lvl со
храняются в заранее объявленной переменной int01.
PostgreSQL
В PostgreSQL команда DELETE используется для удаления строк и любых под
классов из таблицы. В остальном реализация соответствует стандарту ANSI.
Синтаксис следующий:
DELETE [FROM] [ONLY] [схема.]имя_таблицы
[ USING список_использования ]
[ WHERE условие_поиска | WHERE CURRENT OF имя_курсора ]
[ RETURNING { * | выражение [AS псевдоним][, ...] } ]
282 Глава 3. Справочник операторов SQL
SQL Server
В SQL Server можно удалять строки как из таблиц, так и из представлений, по
строенных по одной таблице. В SQL Server можно использовать вторую фразу
FROM для соединений. Синтаксис оператора следующий:
[WITH табличное_выражение[, ...]]
DELETE [TOP ( число ) [PERCENT]]
[FROM] имя_таблицы [[AS] псевдоним]
DELETE 283
COUNT часто использовался для пакетной обработки большого числа строк не
большими пачками, что позволяло избежать переполнения журнала транзак
ций и эскалации блокировок строк в табличную блокировку.)
В операторах SELECT, INSERT, UPDATE, DELETE и CREATE VIEW можно
использовать табличные выражения. Эти выражения используются для объяв
ления временных результирующих наборов строк, задаваемых оператором SE0
LECT. При объявлении табличных выражений нельзя использовать фразы
COMPUTE, COMPUTE BY, FOR XML, FOR BROWSE, INTO, OPTION и OR0
DER BY. В табличном выражении можно использовать несколько операторов
SELECT, если они объединены при помощи операторов UNION, UNION ALL,
EXCEPT или INTERSECT. Вот пример простого оператора DELETE, исполь
зующего табличное выражение:
WITH direct_reports (Manager_ID, DirectReports) AS
( SELECT manager_ID, COUNT(*)
FROM hr.employee AS e
WHERE manager_id IS NOT NULL
GROUP BY manager_id )
DELETE FROM direct_reports
WHERE DirectReports <= 1;
Фраза OUTPUT позволяет увидеть все удаленные строки:
DELETE TOP 10 error_log WITH (READPAST)
OUTPUT deleted.*
WHERE error_log_id = '28 OCT 2008';
См. также
INSERT
SELECT
TRUNCATE TABLE
UPDATE
DISCONNECT
Оператор DISCONNECT используется для разрыва одного или нескольких со
единений между текущим SQLпроцессом и сервером базы данных.
Синтаксис SQL2003
DISCONNECT {CURRENT | ALL | имя_подключения | DEFAULT}
286 Глава 3. Справочник операторов SQL
Ключевые слова
CURRENT
Используется для закрытия активного соединения.
ALL
Закрывает все активные соединения текущего пользователя.
Общие правила
DISCONNECT может быть использована для закрытия именованной SQLсессии
(имя_подключения), текущего соединения (CURRENT), соединения, используе
мого по умолчанию (DEFAULT), или всех соединений пользователя (ALL). На
пример, для закрытия соединения с названием new_york можно выполнить сле
дующую команду:
DISCONNECT new_york
А для закрытия всех сессий, открытых для текущего пользовательского процес
са, используйте:
DISCONNECT ALL
Советы и хитрости
DISCONNECT не является универсальным оператором, поддерживаемым всеми
платформами. Не используйте DISCONNECT в кроссплатформенных приложе
ниях. Вместо этого используйте способы закрытия соединений, являющиеся
предпочтительными для каждой конкретной платформы.
MySQL
Не поддерживается.
Oracle
В Oracle оператор DISCONNECT поддерживается только в SQL*Plus, инстру
менте выполнения запросов. Используется следующий синтаксис:
DISC[ONNECT]
Этот оператор закрывает текущую сессию с сервером базы данных, но при этом
можно продолжать работу в SQL*Plus. Например, программист может продол
жить редактировать буфер, сохранять файлы и т. д., но для выполнения любых
команд SQL потребуется установить новое подключение. Для выхода из SQL*Plus
используются команды EXIT или QUIT. Для закрытия текущего подключения
к Oracle выполните:
DISCONNECT;
Аналогичный результат вы можете получить используя оператор ALTER SYS0
TEM DISCONNECT SESSION.
PostgreSQL
Не поддерживается. Вместо этого в каждом программном интерфейсе имеются
отдельные команды для закрытия соединений. В Server Programming Interface
это SPI_FINISH, а в PL/TCL это PG_DISCONNECT.
DROP 287
SQL Server
SQL Server поддерживает стандартный оператор DISCONNECT только во встраи
ваемом SQL (Embedded SQL, ESQL), но не в инструменте выполнения запросов
SQL Server Management Studio. Для «аккуратного» отключения от SQL Server из
ESQLприложения используйте оператор DISCONNECT ALL.
См. также
CONNECT
DROP
Любые объекты базы данных, создаваемые операторами CREATE, могут быть
удалены соответствующими операторами DROP. В некоторых платформах ROLL0
BACK позволяет восстановить удаленный объект. В других платформах оператор
DROP не подлежит отмене, так что его стоит использовать с осторожностью.
Синтаксис SQL2003
На текущий момент стандарт SQL2003 поддерживает возможность удаления
большого числа разных типов объектов, многие из которых не поддерживаются
производителями. Синтаксис оператора согласно ANSI следующий:
DROP [тип_объекта] имя_объекта {RESTRICT | CASCADE}
Ключевые слова
DROP [тип_объекта] имя_объекта
Безвозвратно удаляет объект указанного типа с указанным именем. Если не
указана схема, в которой находится объект, то подразумевается текущая схе
ма. ANSI SQL2003 поддерживает длинный список типов объектов, каждый
из которых создается соответствующим оператором CREATE. Операторы
CREATE, рассматриваемые в этой книге и имеющие парный оператор DROP,
используются с фразами:
• DOMAIN
• FUNCTION
• METHOD
• PROCEDURE
• ROLE
• SCHEMA
• TABLE
288 Глава 3. Справочник операторов SQL
• TRIGGER
• TYPE
• VIEW
RESTRICT | CASCADE
Позволяет предотвратить выполнение оператора DROP при наличии зависи
мых объектов (RESTRICT), либо позволяет одновременно удалить как сам
объект, так и все зависимые объекты (CASCADE). Эта опция недопустима для
некоторых типов объектов, например для DROP TRIGGER, а в некоторых
случаях она обязательна, например для DROP SCHEMA. В частности, DROP
SCHEMA RESTRICT удалит только пустую схему, а если в схеме есть объек
ты, то оператор будет прерван. А DROP SCHEMA CASCADE удалит и схему,
и все содержащиеся в ней объекты.
Общие правила
Правила создания и модификации объектов различных типов приводятся в раз
делах, посвященных соответствующим операторам CREATE/ALTER.
Оператор DROP удаляет существующий объект. Объект удаляется безвозвратно,
и все пользователи, имевшие ранее доступ к этому объекту, мгновенно теряют
возможность использовать объект.
Вы можете указывать полное имя объекта вместе со схемой, в которой находит
ся объект, например:
DROP TABLE scott.sales_2008 CASCADE;
Этот оператор удалит не только таблицу scott.sales_2008, но и все представле
ния, триггеры и ограничения, созданные на базе этой таблицы. С другой сторо
ны, можно не указывать имя схемы, если подразумевается текущая схема. На
пример:
DROP TRIGGER before_ins_emp;
DROP ROLE sales_mgr;
Хотя это и не оговорено стандартом, в большинстве реализаций оператор DROP
завершается с ошибкой, если удаляемый объект используется другим пользова
телем.
Советы и хитрости
Оператор DROP отработает корректно, только если выполнен для существующе
го объекта правильного типа пользователем, имеющим соответствующие приви
легии (обычно требуется привилегия DROP TABLE, подробности приводятся
в описании оператора GRANT). Стандарт SQL требует, чтобы объект мог удалить
только создатель этого объекта, но в большинстве платформ есть некоторые от
ступления от этого правила. Например, суперпользователь или администратор
базы данных обычно может удалить любой объект сервера баз данных.
В некоторых платформах оператор DROP не удалит объекты, имеющие какие
либо расширенные свойства. Например, в SQL Server нельзя удалить реплици
руемую таблицу, пока она не будет исключена из репликации.
DROP 289
MySQL
MySQL поддерживает сравнительно небольшое число типов объектов, соответст
венно синтаксис оператора DROP тоже ограничен:
DROP { {DATABASE | SCHEMA} | FUNCTION |
INDEX [ONLINE | OFFLINE] | PROCEDURE |
[TEMPORARY] TABLE | TRIGGER | VIEW }
[IF EXISTS] имя_объекта[, ...]
[RESTRICT |CASCADE]
Элементы синтаксиса имеют следующие значения:
{DATABASE | SCHEMA} имя_базы_данных
Удаляет указанную базу данных, а также все объекты внутри базы данных.
В MySQL операторы DROP SCHEMA и DROP DATABASE являются синони
мами. DROP DATABASE удаляет все файлы и каталоги, используемые базой
данных. MySQL возвращает сообщение о числе удаленных файлов из каталога
базы данных. (Удаляются файлы со следующими расширениями: .BAK, .DAT,
.FRM, .HSH, .ISD, .ISM, .MRG, .MYD, .MYI, .DM и .FM) Вы можете уда
лить одним оператором только одну базу данных. Опции RESTRICT и CAS0
CADE в операторе DROP DATABASE не используются.
FUNCTION имя_функции
В версиях MySQL 5.1 и старше используется для удаления пользовательских
функций. Вы также можете использовать IF EXISTS.
INDEX [ONLINE | OFFLINE] имя_индекса ON имя_таблицы
В версиях MySQL 3.22 и старше используется для удаления индексов таблиц.
В версиях младше 3.22 этот оператор ничего не делает, а в 3.22 он фактически
заменяется на ALTER TABLE … DROP INDEX. Начиная с версии 5.1.22ndb
6.2.5 вы можете удалять индексы в оперативном режиме, используя ключе
вое слово ONLINE. При оперативном удалении индекса не создается проме
жуточная временная копия таблицы. В DROP INDEX нельзя использовать
опции RESTRICT, CASCADE и IF EXISTS.
290 Глава 3. Справочник операторов SQL
PROCEDURE имя_процедуры
В версиях MySQL 5.1 и старше используется для удаления хранимых проце
дур. Вы также можете использовать IF EXISTS.
[TEMPORARY] TABLE имя_таблицы[, ...]
Удаляет одну или несколько таблиц (имена таблиц разделяются запятыми).
MySQL удаляет описание таблицы, а также соответствующие файлы с расши
рениями .FRM, .MYD и .MYI. При выполнении этого оператора фиксируют
ся все активные транзакции. Слово TEMPORARY позволяет удалить времен
ную таблицу, при этом не фиксируются транзакции и не проверяются права
доступа.
TRIGGER [имя_схемы.]имя_триггера
Используется в MySQL версий 5.0.2 и старше для удаления триггеров. Вы мо
жете использовать IF EXISTS для удаления триггера только в том случае, ес
ли он реально существует.
VIEW имя_представления
Используется для удаления представления с указанным именем. Вы также
можете использовать IF EXISTS.
IF EXISTS
Подавляет сообщение об ошибке в случае попытки удаления реально не суще
ствующего объекта. Поддерживается начиная с версии MySQL 3.22.
RESTRICT | CASCADE
Слова используются как синтаксические заглушки, не вызывают сообщений
об ошибках и не имеют никакого другого эффекта.
MySQL поддерживает только удаление базы данных, таблицы или индекса из
таблицы. Хотя в операторе DROP можно использовать ключевые слова RE0
STRICT и CASCADE, они не имеют реального эффекта. Вы можете использовать
IF EXISTS для того, чтобы при попытке удаления несуществующего объекта не
возникали сообщения об ошибках.
MySQL позволяет удалять и другие типы объектов с использованием аналогич
ного синтаксиса:
DROP { EVENT | FOREIGN KEY | LOGFILE GROUP | PREPARE |
PRIMARY KEY | SERVER | TABLESPACE | USER }
имя_объекта
Эти варианты оператора DROP выходят за рамки этой книги. Более подробную
информацию о них ищите в документации.
Oracle
В Oracle поддерживается большая часть вариантов оператора DROP, описанных
в ANSI, а также некоторые другие варианты, соответствующие типам объектов,
поддерживаемым только в Oracle. Oracle поддерживает удаление следующих ти
пов объектов из SQL3:
DROP { DATABASE | FUNCTION | INDEX | PROCEDURE | ROLE |
TABLE | TRIGGER | TYPE [BODY] | VIEW }
имя_объекта
DROP 291
Операторы DROP для разных объектов могут иметь различный вид, поэтому для
каждого варианта оператора приводится его полный синтаксис:
DATABASE имя_базы_данных
Удаляет указанную базу данных.
FUNCTION имя_функции
Удаляет функции, не входящие в состав пакетов. (Если вы хотите удалить
функцию из пакета, то используйте оператор CREATE PACKAGE…OR REPLA0
CE для объявления пересоздания пакета без этой функции.) Любые локаль
ные объекты, использующие удаленную функцию, становятся невалидными,
а любые статистические типы, связанные с функцией, отвязываются от нее.
INDEX имя_индекса [FORCE]
Удаляет обычный или предметный индекс. Удаление индекса делает нева
лидными все объекты (представления, пакеты, функции, хранимые процеду
ры), зависящие от таблицы, по которой был создан индекс. Также удаление
индекса делает невалидными курсоры и планы выполнения запросов, исполь
зовавшие индекс, что приводит к полным разборам при следующих выполне
ниях соответствующих операторов SQL.
Обычные индексы являются вторичными объектами и могут удаляться и пе
ресоздаваться без потери пользовательских данных. Индексноорганизован
ные таблицы комбинируют в себе и данные, и индекс, поэтому их нельзя уда
лять и пересоздавать таким же образом, как и обычные индексы. Индексно
организованные таблицы удаляются оператором DROP TABLE.
При удалении секционированного индекса удаляются все его секции, а при
удалении индекса с составным секционированием удаляются все секции
и подсекции. При удалении предметного индекса удаляются все связанные
с ним статистики, и удаляется связь со всеми статистическими типами. Клю
чевое слово FORCE используется только при удалении предметного индекса.
FORCE позволяет удалить предметный индекс, находящийся в состоянии IN
PROGRESS, или для которого процедура indextype возвращает ошибку. На
пример:
DROP INDEX ndx_sales_salesperson_quota;
PROCEDURE имя_процедуры
Удаляет указанную хранимую процедуру. Любые зависимые объекты стано
вятся невалидными, а попытки их использования завершаются с ошибками,
пока вы не пересоздадите процедуру. Если вы пересоздали хранимую проце
дуру, а затем используете зависимый объект, то зависимый объект переком
пилируется.
ROLE имя_роли
Удаляет роль и отзывает ее у всех пользователей и других ролей. Вновь созда
ваемые сессии не могут использовать удаленную роль, но те сессии, которые
использовали роль в момент ее удаления, не затрагиваются. Вот пример уда
ления роли:
DROP ROLE sales_mgr;
292 Глава 3. Справочник операторов SQL
PostgreSQL
В PostgreSQL не поддерживаются ключевые слова RESTRICT и CASCADE, опи
санные в стандарте. Поддерживает широкий набор вариантов DROP в соответст
вии со следующим синтаксисом:
DROP { DATABASE | DOMAIN | FUNCTION | INDEX | ROLE |
SCHEMA | TABLE | TRIGGER | TYPE | VIEW }
[IF EXISTS]
имя_объекта
[ CASCADE | RESTRICT ]
Синтаксис для каждого оператора DROP из стандарта следующий:
DATABASE имя_базы_данных
Удаляет указанную базу данных и очищает все каталоги с данными удален
ной базы. Этот оператор может быть выполнен только владельцем базы дан
ных, причем пользователь должен быть подключен не к удаляемой базе. На
пример, мы можем удалить базу данных sales_archive:
DROP DATABASE sales_archive;
DOMAIN имя_домена [, ...] [ CASCADE | RESTRICT ]
Удаляет один или несколько указанных доменов, принадлежащих текущему
пользователю. CASCADE позволяет автоматически удалить все объекты, за
294 Глава 3. Справочник операторов SQL
SQL Server
В SQL Server поддерживается несколько описанных в SQL3 вариантов оператора
DROP:
DROP { DATABASE | FUNCTION | INDEX | PROCEDURE | ROLE |
SCHEMA | TABLE | TRIGGER | TYPE | VIEW } имя_объекта
Вот полный синтаксис каждого варианта:
DATABASE имя_базы_данных[, ...]
Удаляет указанную базу данных и стирает с диска все ее файлы. Оператор мо
жет быть выполнен только из базы master. Реплицируемые базы данных пе
ред удалением должны быть удалены из своих цепочек репликации. Вы не
можете удалить используемую базу данных и любую из системных базы дан
ных (master, model, msdb, temp). Например, мы можем удалить базы north
wind и pubs одной командой:
DROP DATABASE northwind, pubs
GO
FUNCTION [схема.]имя_функции[, ...]
Удаляет из текущей базы данных одну или несколько пользовательских
функций.
296 Глава 3. Справочник операторов SQL
1 Вероятно, авторы имели в виду: «MOVE TO определяет место, куда будут перемещать
ся строки данных, находящиеся на конечном уровне кластеризованного индекса». –
Прим. науч. ред.
2 Вероятно, авторы имели в виду: «данные перемещаются уже в форме кучи». – Прим.
науч. ред.
DROP 297
См. также
CALL
CONSTRAINTS
CREATE/ALTER FUNCTION/PROCEDURE/METHOD
CREATE SCHEMA
CREATE/ALTER TABLE
298 Глава 3. Справочник операторов SQL
CREATE/ALTER VIEW
DELETE
DROP
GRANT
INSERT
RETURN
SELECT
SUBQUERY
UPDATE
EXCEPT
Оператор EXCEPT формирует из результата двух или более операторов SELECT
множество строк, включающее все строки из результата первого запроса, кото
рые отсутствуют в результатах последующих запросов. В то время как фраза
JOIN возвращает соответствующие друг другу строки из двух или более запро
сов, EXCEPT фильтрует строки, оставляя те, которые есть только в одной из не
скольких однотипных таблиц.
Синтаксис SQL2003
Формально нет ограничений на число запросов, которое можно комбинировать
посредством оператора EXCEPT. Общий синтаксис следующий:
{SELECT запрос1 | VALUES (выражение1[, ...])}
EXCEPT [ALL | DISTINCT]
[CORRESPONDING [BY (столбец1, столбец2, ...)]]
{SELECT запрос2 | VALUES (выражение2[, ...])}
EXCEPT [ALL | DISTINCT]
[CORRESPONDING [BY (столбец1, столбец2, ...)]]
...
Ключевые слова
VALUES (выражение1[, ...])
Создает множество строк с явно указанными значениями. По сути это множе
ство можно рассматривать как результат оператора SELECT, но без исполь
зования синтаксиса SELECT … FROM. Это называется конструктором строк,
так как строки явным образом конструируются вручную. В соответствии со
стандартом ANSI несколько конструкторов строк должны быть заключены
в скобки и разделены запятыми.
EXCEPT 299
EXCEPT
Определяет, какие строки исключаются из результирующего множества.
ALL | DISTINCT
ALL учитывает повторяющиеся строки во всех результирующих наборах.
DISTINCT удаляет дубликаты из всех результирующих наборов до операто
ра EXCEPT. Столбцы со значениями NULL считаются одинаковыми. (DIS0
TINCT используется по умолчанию, если явно не указана ни одна опция.)
CORRESPONDING [BY (столбец1, столбец 2, ...)]
Указывает, что возвращаются только значения перечисленных столбцов, да
же если в запросах используется звездочка.
Общие правила
Нужно помнить только одно важное правило, касающееся оператора EXCEPT:
количество и порядок столбцов во всех запросах должны быть одинаковыми, а ти
пы столбцов должны быть из одинаковых категорий.
Типы данных не должны быть идентичными, но должны быть совместимыми.
Например, типы CHAR и VARCHAR совместимы. По умолчанию для каждого
столбца будет использоваться наибольший (с точки зрения размерности) из ти
пов столбца в каждом запросе. Например, если в запросах для столбца использу
ются типы VARCHAR(10) и VARCHAR(15), то в результирующем наборе стол
бец будет иметь типа VARCHAR(15).
Советы и хитрости
Ни в одной из платформ не поддерживается фраза CORRESPONDING BY.
MySQL
EXCEPT не поддерживается в MySQL. Однако, как сказано в предыдущем разде
ле, вы можете в качестве альтернативы использовать NOT IN или NOT EXISTS.
Oracle
Oracle не поддерживает оператор EXCEPT. Однако он поддерживает оператор
MINUS с аналогичной функциональностью:
<SELECT оператор1>
MINUS
<SELECT оператора2>
MINUS
...
MINUS DISTINCT и MINUS ALL не поддерживаются. MINUS является функ
циональным эквивалентом MINUS DISTINCT. Oracle не поддерживает MINUS
для следующих запросов:
• Запросов со столбцами типов LONG, BLOB, CLOB, BFILE, VARRAY.
• Запросов с фразой FOR UPDATE.
• Запросов с коллекциями TABLE.
EXCEPT 301
Если первый запрос содержит выражения в списке столбцов, то для этих выра
жений при помощи AS должны быть заданы псевдонимы. Только последний за
прос может содержать фразу ORDER BY.
Например, получим список идентификаторов всех магазинов, для которых нет
записей в таблице sales:
SELECT stor_id FROM stores
MINUS
SELECT stor_id FROM sales
Оператор MINUS функционально эквивалентен подзапросу с NOT IN. Следую
щий запрос получает тот же самый результат:
SELECT stor_id FROM stores
WHERE stor_id NOT IN
(SELECT stor_id FROM sales)
PostgreSQL
PostgreSQL поддерживает операторы EXCEPT и EXCEPT ALL в соответствии
с базовым синтаксисом ANSI:
<SELECT оператор1>
EXCEPT [ALL]
<SELECT оператор2>
EXCEPT [ALL]
...
PostgreSQL не поддерживает EXCEPT и EXCEPT ALL для запросов с фразой
FOR UPDATE. EXEPT DISTINCT не поддерживается, но EXCEPT функцио
нально ему эквивалентен. Также не поддерживается фраза CORRESPONDING.
Первый запрос не может содержать фразы ORDER BY и LIMIT, но последую
щие подзапросы могут содержать эти фразы, при этом эти подзапросы должны
быть заключены в скобки. В противном случае самые правые вхождения ORDER
BY и LIMIT будут применены к конечному результату.
PostgreSQL выполняет операторы SELECT сверху вниз, если только иной поря
док явно не определен скобками.
Обычно повторяющиеся строки исключаются из результатов обоих запросов, ес
ли только вы не используете EXCEPT ALL. Например, вы можете получить спи
сок всех заголовков из таблицы authors, не имеющих вхождений в таблицу sales:
SELECT title_id
FROM authors
EXCEPT ALL
SELECT title_id
FROM sales;
SQL Server
EXCEPT поддерживается в SQL Server, но не поддерживаются подфразы CORRE0
SPONDING, ALL и DISTINCT. При сравнении наборов строк SQL Server счита
ет, что NULL равно NULL. При использовании SELECT…INTO фраза INTO мо
жет встречаться только в первом запросе. ORDER BY допускается только в конце
302 Глава 3. Справочник операторов SQL
См. также
INTERSECT
SELECT
UNION
EXISTS
Оператор EXISTS тестирует подзапрос на наличие строк.
Синтаксис SQL2003
SELECT ...
WHERE [NOT] EXISTS (подзапрос)
Ключевые слова и параметры следующие:
WHERE [NOT] EXISTS
Тестирует подзапрос на наличие строк. Если подзапрос содержит хотя бы од
ну строку, то оператор возвращает булево значение TRUE. Если используется
NOT, то оператор возвращает TRUE в случае, когда подзапрос возвращает
пустой результат.
подзапрос
Определяет подзапрос, который тестируется на наличие строк.
Общие правила
Оператор EXISTS проверяет для каждой строки запроса наличие строк в подза
просе.
Например, если мы хотим узнать, существуют ли названия должностей, на кото
рых не работает ни один сотрудник, то мы можем выполнить следующий запрос:
SELECT *
FROM jobs
WHERE NOT EXISTS
(SELECT * FROM employee
WHERE jobs.job_id = employee.job_id)
В этом примере проверяется отсутствие строк в подзапросе при помощи допол
нительного ключевого слова NOT. В следующем примере запрос возвращает
строки, для которых найдены строки в подзапросе:
FETCH 303
SELECT au_lname
FROM authors
WHERE EXISTS
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)
Советы и хитрости
EXISTS в большинстве запросов работает так же, как ANY (фактически, опера
торы EXISTS и ANY эквивалентны). EXISTS обычно наиболее эффективен при
использовании коррелированных подзапросов.
Есть два варианта написания подзапроса при использовании EXISTS. Первый
вариант – использовать звездочку (т. е. SELECT * FROM…) и не указывать ка
който конкретный столбец. В этом случае звездочка означает «любой столбец».
Второй вариант – указать только один столбец в подзапросе (т. е. SELECT au_id
FROM…). В некоторых СУБД возможны подзапросы, извлекающие более одного
столбца (т. е. SELECT au_id, au_lname FROM …). Тем не менее, такая возмож
ность встречается достаточно редко, и следует избегать ее использования, если
код должен быть переносимым между платформами.
Платформенные особенности
Все СУБД поддерживают оператор EXISTS в описанном виде.
См. также
ALL/ANY/SOME
SELECT
WHERE
FETCH
Оператор FETCH – это одна из четырех команд (наравне с DECLARE, OPEN
и CLOSE), используемых при работе с курсорами. Курсоры позволяют обрабаты
вать результаты запроса не одним массивом, а построчно. FETCH позиционирует
курсор на конкретной строке и извлекает строку из результирующего множества.
Использование курсоров очень полезно, так как реляционные СУБД оперируют
множествами строк, а большинство клиентских приложений работают с данны
ми построчно. Курсоры дают возможность обрабатывать в каждый момент вре
мени только одну запись, что и требуется для клиентских программ.
Синтаксис SQL2003
FETCH [ {NEXT | PRIOR | FIRST | LAST |
{ ABSOLUTE целое число | RELATIVE целое число }}
FROM ] имя курсора
[INTO переменная1[,…]]
Ключевые слова
NEXT
Используется для перехода к строке, которая следует сразу за текущей стро
кой курсора. FETCH NEXT является командой по умолчанию для FETCH.
Если FETCH выполняется для курсора первый раз, то возвращается первая
строка.
PRIOR
Используется для перехода к предыдущей строке относительно текущей
строки курсора. FETCH PRIOR не извлекает строку, если это первая команда
FETCH, выполненная для этого курсора.
FIRST
Используется для перехода к первой строке курсора.
LAST
Используется для перехода к последней строке курсора.
ABSOLUTE n
Используется для перехода к nй строке курсора (отсчет ведется от начала
при положительном n или от конца – при отрицательном). Если n равно нулю,
то строка из курсора не извлекается. Если n больше числа записей в курсоре,
то курсор позиционируется за последней записью (при положительном n) или
перед первой записью (при отрицательном n).
RELATIVE n
Используется для перехода к записи, являющейся nй по счету после теку
щей записи (при положительном n) или перед текущей записью (при отрица
тельном n). Если n выводит курсор за границы результирующего множества,
то курсор позиционируется за последней записью (при положительном n) или
перед первой записью (при отрицательном n).
[FROM] имя курсора
Указывает имя курсора, из которого нужно извлечь запись. Курсор должен
быть предварительно создан и открыт с помощью команд DECLARE и OPEN.
Слово FROM необязательно для использования, но желательно.
[INTO] переменная1[,…]
Используется для сохранения значений столбцов извлекаемой из курсора за
писи в локальных переменных. Для каждого столбца курсора в INTO должна
быть указана переменная соответствующего типа, столбцы и переменные со
относятся по порядку следования.
FETCH 305
Общие правила
Основными шагами работы с курсором являются:
1. Создание курсора (команда DECLARE).
2. Открытие курсора с помощью (команда OPEN).
3. Работа с курсором (команда FETCH).
4. Закрытие курсора (команда CLOSE).
Выполняя эти шаги, можно создать результат, аналогичный команде SELECT,
и при этом работать с каждой строкой результата отдельно.
Курсор может быть позиционирован либо на строке, либо в позиции перед пер
вой строкой, либо после последней строки. Когда курсор позиционирован на
строке, эта строка называется текущей. Можно выполнить UPDATE или DELE0
TE текущей строки, используя конструкцию WHERE CURRENT OF.
Важно помнить, что в курсоре нельзя перемещаться по кругу. Например, если
в курсоре 10 строк и выполняется переход на 12 строк вперед, то курсор не прой
дется до конца, а потом еще раз с начала на 2 записи. Вместо этого курсор оста
новится после последней записи при движении вперед либо перед первой запи
сью при движении назад. К примеру, на SQL Server:
FETCH RELATIVE 12 FROM employee_cursor
INTO @emp_last_name, @emp_first_name, @emp_id
При извлечении значений из курсора в переменные проверьте, что количество
столбцов в курсоре и количество переменных совпадают и также совпадают их
типы. В противном случае вы получите ошибку. Например, следующая команда
выполнится с ошибкой, т. к. в курсоре три столбца, а в команде FETCH исполь
зуется только две переменных.
FETCH PRIOR FROM employee_cursor
INTO @emp_last_name, @emp_id
Советы и хитрости
Наиболее частой ошибкой при работе с курсором с помощью оператора FETCH
является несоответствие в количестве, типах или порядке между переменными
и столбцами курсора. Так что при написании FETCH проверьте, что вам извест
ны количество и типы всех столбцов курсора.
Обычно база данных блокирует как минимум текущую строку курсора, но ино
гда и все строки. В соответствии с ANSIстандартом блокировки не сохраняются
при выполнении ROLLBACK или COMMIT, хотя в поведении в каждой СУБД
может иметь свои особенности.
306 Глава 3. Справочник операторов SQL
MySQL
MySQL поддерживает только минимальные возможности оператора FETCH, опи
санные в SQL3:
FETCH имя_курсора INTO переменная1[, ...]
MySQL извлекает из открытого курсора текущую строку (если она имеется) и пе
ремещает указатель курсора на следующую строку. Если в курсоре больше нет
строк, то MySQL устанавливает SQLSTATE в значение ‘02000’ и порождает со
бытие NO DATA, что позволяет вам корректно обработать такую ситуацию.
Oracle
Курсоры в Oracle являются однонаправленными и позволяют передвигаться за
один шаг только на одну запись. Поэтому с точки зрения стандарта ANSI курсо
ры в Oracle поддерживают только FETCH NEXT 1. Данные из курсора можно из
влекать либо построчно в локальные переменные, либо с помощью фразы BULK
COLLECT извлекать сразу набор записей в массив. Ключевые слова PRIOR,
ABSOUTE и RELATIVE не поддерживаются. Однако и однонаправленные, и про
кручиваемые курсоры поддерживаются через программный интерфейс Oracle
Call Interface (OCI). В OCI поддерживаются слова PRIOR, ABSOLUTE и RELA0
TIVE для необновляемых курсоров, чьи наборы данных представляют собой
мгновенные снимки для согласованного чтения.
Синтаксис FETCH в Oracle следующий:
FETCH имя_курсора
{ INTO переменная1[, ...] | BULK COLLECT INTO
коллекция[, ...] [LIMIT целое_число] }
где:
BULK COLLECT INTO коллекция
Извлекает из курсора весь набор данных или определенное число записей
(LIMIT) в указанный массив или переменнуюколлекцию на стороне клиента.
FETCH 307
LIMIT целое_число
Ограничивает число записей (значение должно быть неотрицательной целой
константой или переменной), извлекаемое при использовании BULK COL0
LECT.
Oracle поддерживает динамические курсоры, чей текст можно определять во
время выполнения. Имя курсора может передаваться через переменные или па
раметры. Также вы можете либо сами определять тип переменных для сохране
ния записей курсора, либо использовать %ROWTYPE. Все это позволяет созда
вать гибкие динамические курсоры, работающие как шаблоны. Например:
DECLARE
TYPE namelist IS TABLE OF employee.lname%TYPE;
names namelist;
CURSOR employee_cursor IS SELECT lname FROM employee;
BEGIN
OPEN employee_cursor;
FETCH employee_cursor BULK COLLECT INTO names;
...
CLOSE employee_cursor;
END;
Оператор FETCH часто используется в паре с оператором цикла FOR (или с ка
кимлибо другим оператором цикла) для итерации по всем записям курсора. Для
обнаружения конца курсора следует использовать атрибуты %FOUND и %NOT0
FOUND. Например:
DECLARE
TYPE employee_cursor IS REF CURSOR
RETURN employee%ROWTYPE;
employee_cursor EmpCurTyp;
employee_rec employee%ROWTYPE;
BEGIN
LOOP
FETCH employee _cursor INTO employee_rec;
EXIT WHEN employee _cursor%NOTFOUND;
...
END LOOP;
CLOSE employee_cursor;
END;
В этом примере используется стандартный цикл PL/SQL, а когда в курсоре за
канчиваются записи, для выхода из цикла используется оператор EXIT.
PostgreSQL
В PostgreSQL поддерживаются курсоры, по которым можно перемещаться в лю
бом направлении, а также расширенный по сравнению с SQL3 набор режимов
работы. Синтаксис оператора FETCH в PostgreSQL следующий:
FETCH { FORWARD [ {ALL | целое_число} ] |
BACKWARD [ {ALL | целое_число } ] | ABSOLUTE целое_число
| RELATIVE целое_число | целое_число | ALL |
308 Глава 3. Справочник операторов SQL
SQL Server
Поддержка оператора FETCH в SQL Server очень близка к стандарту ANSI:
FETCH [ { NEXT | PRIOR | FIRST | LAST |
{ ABSOLUTE целое_число| RELATIVE целое_число } } ]
[FROM] [GLOBAL] имя_курсора
[INTO @переменная1[, ...]]
Отличия между реализацией SQL Server и стандартом ANSI состоят в следую
щем. Вопервых, SQL Server позволяет вместо имени курсора и конкретных зна
чений для перехода использовать переменные. Вовторых, SQL Server позволяет
создавать глобальные курсоры, которые могут быть использованы любой сесси
ей или пользователем, а не только создателем.
Есть некоторые правила использования оператора FETCH, зависящие от того,
какие параметры курсора вы использовали в DECLARE CURSOR:
• Если вы объявили курсор типа SCROLL и использовали синтаксис стандарта
SQL92, то поддерживаются все варианты FETCH. Для других курсоров
в формате SQL92 поддерживается только FETCH NEXT (также поддержива0
ется альтернативный стиль объявления курсора с помощью фразы DECLA0
RE CURSOR).
• Курсоры DYNAMIC SCROLL поддерживают все варианты FETCH, за исклю
чением ABSOLUTE.
• Курсоры FORWARD_ONLY и FAST_FORWARD поддерживают только
FETCH NEXT.
• Курсоры KEYSET и STATIC поддерживают все варианты FETCH.
См. также
CLOSE
DECLARE CURSOR
OPEN
GRANT
Оператор GRANT предоставляет привилегии пользователям и ролям, позволяя
им получить доступ и использовать объекты базы данных. Также в большинстве
платформ оператор GRANT используется для предоставления прав на создание
объектов, выполнение хранимых процедур, функций и т. д. Другими словами,
в большинстве платформ GRANT используется как для объектных привилегий,
так и для разрешений на использование.
Синтаксис SQL2003
Согласно стандарту SQL2003 с помощью оператора GRANT пользователю пре
доставляются объектные привилегии и роли:
GRANT { {объектная_привилегия[, ...] | роль[, ...]} }
[ON объект_базы_данных]
[TO получатель[, ...]]
[WITH HIERARCHY OPTION] [WITH GRANT OPTION]
[WITH ADMIN OPTION] [FROM {CURRENT_USER | CURRENT_ROLE}]
Ключевые слова
GRANT объектная_привилегия
Предоставляет привилегию на выполнение различных SQL операторов. Мож
но выдать одним оператором несколько привилегий, разделив их запятыми.
ALL PRIVILEGES нельзя совмещать с другими привилегиями, но остальные
привилегии можно комбинировать любым образом. Возможны следующие
привилегии:
ALL PRIVILEGES
Предоставляет пользователю все привилегии на определенные объекты
базы данных, которые есть у пользователя, выполняющего GRANT. Этот
вариант использовать не рекомендуется, так как он способствует небреж
ности при работе с привилегиями.
EXECUTE
Предоставляет привилегию на вызов хранимой процедуры, пользователь
ской функции или метода.
SELECT | INSERT | UPDATE | DELETE
Предоставляет привилегию на выполнение соответствующего оператора
для таблицы или представления. Вы можете также указать в скобках спи
сок столбцов, на которые распространяется привилегия (кроме привиле
гии на DELETE).
REFERENCES
Позволяет использовать столбцы таблицы в любых ограничениях целост
ности. Во фразе REFERENCES также можно указывать список столбцов,
на которые выдается привилегия. Наконец, REFERENCES дает привиле
гию на создание внешних ключей, ссылающихся на указанный объект
как родительский.
TRIGGER
Дает привилегию на создание триггера для указанной таблицы.
UNDER
Дает привилегию на создание подтипов и типизированных таблиц.
USAGE
Дает привилегию на использование домена, пользовательского типа, ко
дировки, схемы упорядочения, последовательности или перевода.
312 Глава 3. Справочник операторов SQL
GRANT роль[,…]
Выдает пользователю указанную роль. Эта роль должна быть доступна поль
зователю или роли, указанной во FROM. Например, администратор базы
данных мог бы создать роль Reporter, имеющую доступ на чтение нескольких
таблиц. Последующая выдача пользователю этой роли дает ему привилегии,
которые есть у роли.
ON объект_базы_данных
Указывает объект, на который выдается привилегия. Фраза объект_базы_дан
ных имеет следующий синтаксис:
{[TABLE] имя_объекта | DOMAIN имя_объекта |
COLLATION имя_объекта | CHARACTER SET имя_объекта |
TRANSLATION имя_объекта | SPECIFIC ROUTINE имя_объекта }
TO получатель
Определяет пользователя или роль, получающих привилегию. Вы можете
выдать привилегию нескольким пользователям или ролям, перечислив их
через запятую. Привилегию можно выдать роли PUBLIC, тогда выбранные
привилегии будут выданы всем пользователям базы данным, как существую
щим, так и будущим.
WITH HIERARCHY OPTION
Позволяет выполнять SELECT не только для указанной таблицы, но и для
всех ее подтаблиц. Используется только при выдаче привилегий.
WITH GRANT OPTION
Позволяет пользователю передавать дальше полученные привилегии. Исполь
зуется только при выдаче привилегий.
WITH ADMIN OPTION
Дает пользователю возможность назначать полученную роль другим пользо
вателям.
FROM {CURRENT_USER | CURRENT_ROLE}
Указывает, что привилегии выдаются либо от имени текущего пользователя
(CURRENT_USER), либо от имени текущей роли (CURRENT_ROLE). Эта
фраза опциональна и предполагает использование текущего пользователь
ского контекста.
Общие правила
Вы можете одним оператором выдать несколько привилегий, но не следует в од
ном операторе GRANT одновременно использовать ALL PRIVILEGES вместе
с другими ключевыми словами. Вы можете выдать отдельную привилегию на
отдельный объект базы данных отдельному пользователю, используя следую
щий синтаксис:
GRANT привилегия ON объект TO пользователь
Например:
GRANT SELECT ON employee TO Dylan;
GRANT 313
Советы и хитрости
В зависимости от платформы привилегии представлений могут быть зависимы
ми или независимыми от привилегий базовых таблиц.
Все необязательные фразы WITH относятся к привилегиям, выдаваемым в том
же операторе. Например, этот оператор выдает пользователю привилегию на
чтение таблицы employee:
GRANT SELECT ON employee TO Dylan;
А следующий оператор выдает привилегию на чтение таблицы плюс возмож
ность выдать эту привилегию другому пользователю:
GRANT SELECT ON employee TO Dylan
WITH GRANT OPTION;
Аналогичным образом вы можете использовать оператор REVOKE для отзыва
только опции WITH GRANT OPTION, отдельной привилегии SELECT или и то
го и другого.
В большинстве платформ различаются привилегии, выданные пользователю на
прямую и через роли. Например, если пользователь является членом двух ролей,
то отдельная объектная привилегия может быть выдана ему четырежды: один
раз напрямую, один раз через PUBLIC и отдельно через каждую роль. В этой си
туации будьте внимательны: для полного отзыва у пользователя привилегий на
объект потребуется исключить пользователя из роли PUBLIC1, а также отозвать
привилегию у самого пользователя и у всех его ролей.
1 Возможно, авторы имели в виду отозвать привилегию у роли PUBLIC. – Прим. науч.
ред.
314 Глава 3. Справочник операторов SQL
MySQL
MySQL предоставляет широкий набор привилегий, в основном относящихся
к работе с объектами базы данных. Оператор GRANT поддерживается, начиная
с версии 3.22.11. Синтаксис следующий:
GRANT [ { ALL [PRIVILEGES] |
{SELECT | INSERT | UPDATE} [ (столбец[, ...]) ] | DELETE |
REFERENCES [ (столбец[, ...]) ] } |
{[{ALTER | CREATE | DROP} [опция_dml]] | [EVENT] |
[EXECUTE] | [FILE] | [INDEX] | [LOCK TABLES] | [PROCESS] |
[RELOAD] | [REPLICATION {CLIENT | SLAVE}] |
[SHOW DATABASES] | [SHOW VIEW] | [SHUTDOWN] |
[SUPER] | [TRIGGER] | [USAGE]}[, ...]
ON [ {TABLE | FUNCTION | PROCEDURE} ]
{ [база_данных.]имя_таблицы | * | *.* | база_данных.* }
TO получатель [IDENTIFIED BY [PASSWORD] 'пароль'][, ...]
[REQUIRE параметры_безопасности]
[WITH опции_with[...]]
где:
ALL [PRIVILEGES]
Дает пользователю все привилегии (кроме WITH GRANT OPTION), приме
нимые для одного или нескольких указанных объектов базы данных. Напри
мер, GRANT ALL ON *.* глобально дает все привилегии кроме WITH GRANT
OPTION.
SELECT | INSERT | UPDATE | DELETE | REFERENCES
Дает разрешение соответственно на чтение, вставку, модификацию и удале
ние данных из таблицы (подфраза REFERENCES не реализована). Разреше
ния на уровне столбцов можно выдавать на SELECT, INSERT и UPDATE, но
не на DELETE. Использование разрешений на уровне столбцов может немно
го замедлить работу MySQL, так как при этом требуется проверять большее
число привилегий.
{ALTER | CREATE | DROP} [опция_dml]
Дает возможность создавать, модифицировать и удалять таблицы и другие
объекты базы данных. Если используется CREATE, то ключевое слово ON
для указания имения таблицы не обязательно. Используйте ALTER, CREA0
TE или DROP и имя объекта (в этом случае под объектом подразумевается
таблица). Вы можете детализировать эту подфразу следующим образом:
{CREATE | ALTER | DROP} ROUTINE
Дает разрешение на создание, модификацию и удаление хранимых проце
дур и функций.
CREATE TEMPORARY TABLE
Дает разрешение на выполнение оператора CREATE TEMPORARY TABLE.
CREATE USER
Дает привилегии на создание, переименование и удаление пользователей,
а также на выполнение оператора REVOKE ALL PRIVILEGES.
GRANT 315
CREATE VIEW
Дает разрешение на выполнение оператора CREATE VIEW.
EVENT
Дает привилегии на создание событий для планировщика событий.
EXECUTE
Дает разрешения на вызов хранимых процедур и функций.
FILE
Дает возможность читать данные из файлов и писать в файлы, используя опе
раторы SELECT INTO и LOAD DATA.
INDEX
Дает привилегии на создание и удаление индексов.
LOCK TABLES
Дает возможность блокировать оператором LOCK TABLES те таблицы, на ко
торые пользователь имеет привилегию SELECT.
PROCESS
Дает права на просмотр исполняющихся процессов с помощью оператора
SHOW PROCESSLIST.
RELOAD
Дает разрешение на исполнение команд FLUSH и RESET.
REPLICATION {CLIENT | SLAVE}
Дает пользователю возможность читать метаданные о репликационных про
цессах (REPLICATION CLIENT) или дает подчиненному процессу читать
журналы из репликационного мастерпроцесса (REPLICATION SLAVE).
SHOW DATABASES
Дает пользователю привилегию на выполнение команды SHOW DATABASES.
SHOW VIEW
Дает разрешение на выполнение SHOW CREATE VIEW.
SHUTDOWN
Дает права на использование команды MYSQLADMIN SHUTDOWN для
принудительного завершения серверных процессов.
SUPER
Дает пользователю возможность подключаться к серверу, даже если число
сессий пользователя превысило MAX_CONNECTIONS. Пользователи с при
вилегией SUPER также могут выполнять такие важные команды, как CHAN0
GE MASTER, KILL, MYSQLADMIN DEBUG, PURGE [MASTER] LOGS
и SET GLOBAL.
TRIGGER
Дает возможность создавать и удалять триггеры на конкретных таблицах.
(До версии 5.1.6 для создания и удаления триггеров требовалась привилегия
SUPER.)
316 Глава 3. Справочник операторов SQL
USAGE
Создает пользовательскую учетную запись без каких бы то ни было привиле
гий.
ON {[база_данных.]имя_таблицы | * | *.* | база_данных.*}
Выдает привилегии либо на указанную таблицу, либо на все таблицы в теку
щей базе данных(*), либо на все таблицы во всех базах данных (*.*), либо на
все таблицы в указанной базе данных (база_данных.*).
TO получатель [IDENTIFIED BY [PASSWORD] 'пароль'][, ...]
Указывает одного или нескольких пользователей, получающих привилегии.
Слово PASSWORD необязательно. Можно указать несколько пользователей
через запятую. Если привилегии выдаются новому пользователю, то с помо
щью IDENTIFIED BY этому новому пользователю можно сразу назначить
пароль.
REQUIRE параметры_безопасности = { NONE | {SSL | X509} [CIPHER 'имя_шифра'
[AND]] [ISSUER 'имя_издателя' [AND]] [SUBJECT 'тема'] }
Указывает, должен ли пользователь подключаться с определенными пара
метрами безопасности:
REQUIRE NONE
Учетная запись не имеет специальных требований по использованию SSL
и X509. Это является поведением по умолчанию, если фраза REQUIRE не
используется.
REQUIRE SSL
Допускает только подключения, защищенные с помощью SSL.
REQUIRE X509
Указывает, что клиент должен иметь действующий сертификат, хотя из
датель сертификата и его предмет не имеют значения. При использовании
X509 вы можете дополнительно наложить ограничения на издателя сер
тификата, предмет сертификата и на используемый шифр. Слово AND
можно использовать между параметрами безопасности.
REQUIRE CIPHER 'имя_шифра'
Гарантирует, что при подключении используется конкретный шифр с оп
ределенной длиной ключа.
REQUIRE ISSUER 'имя_издателя'
Разрешает использование сертификатов X509 только с определенным из
дателем.
REQUIRE SUBJECT 'предмет'
Разрешает подключения только с сертификатами с указанной темой.
WITH опции_with
Позволяет выдать одну или несколько дополнительных привилегий:
GRANT OPTION
Дает получателю привилегии право на передачу полученной привилегии
(а точнее, любой имеющейся у пользователя привилегии) другому пользо
вателю.
GRANT 317
MAX_QUERIES_PER_HOUR целое_число
Ограничивает число запросов пользователя, выполняемых сервером за
один час. (Считаются только запросы, результат которых не берется из кэ
ша.) Значение 0 означает отсутствие ограничения на число выполняемых
запросов.
MAX_UPDATES_PER_HOUR целое_число
Ограничивает число операторов UPDATE, выполняемых сервером за один
час. Значение 0 означает отсутствие ограничения на число выполняемых
обновлений.
MAX_CONNECTIONS_PER_HOUR целое_число
Ограничивает число соединений, которые пользователь может открыть за
один час. Значение 0 означает, что максимальное число одновременных
соединений ограничивается системной переменной MAX_USER_CON0
NECTION.
Так как в MySQL значительное внимание уделяется скорости, то вы можете ис
пользовать функции сервера, предназначенные для достижения максимальной
производительности. Например, вы можете активировать опцию SKIP_GRANT_
TABLES для отключения проверки привилегий. Это может ускорить выполне
ние запросов, однако при этом каждый пользователь имеет полный доступ ко
всем ресурсам базы данных.
Для таблиц можно использовать следующие привилегии доступа: SELECT, IN0
SERT, UPDATE, DELETE, CREATE, DROP, GRANT, WITH GRANT OPTION,
CREATE VIEW, SHOW VIEW, INDEX, TRIGGER и ALTER. Привилегии IN0
SERT, SELECT и UPDATE можно выдавать и отзывать на уровне отдельных
столбцов. Например, вы можете выдать разрешение на SELECT определенного
столбца определенной таблицы.
На уровне хранимых процедур и функций используются привилегии ALTER
ROUTINE, EXECUTE и WITH GRANT OPTION. Привилегия CREATE ROU0
TINE не является привилегией уровня отдельной процедуры, потому что эта
привилегия нужна для предоставления пользователю принципиальной возмож
ности создавать процедуры и функции.
Некоторые привилегии выдаются только глобально (т. е. с использованием син
таксиса ON *.*): FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICA0
TION SLAVE, SHOW DATABASES, SHUTDOWN, SUPER и CREATE USER.
Имя таблицы, базы данных и столбца может каждое иметь длину до 64 симво
лов, а имя хоста может быть до 60 символов в длину. Пользователь (получатель
привилегии) может иметь имя до 16 символов.
MySQL поддерживает также возможность выдачи привилегий для конкретного
пользователя определенного хоста, при этом имя пользователя нужно указать
в формате USER@HOST. Можно использовать групповые символы, чтобы пре
доставлять привилегии сразу нескольким пользователям. Отсутствующее имя
хоста считается равносильным применению символа «%». Рассмотрим следую
щий пример оператора GRANT:
GRANT SELECT ON employee TO katie@% IDENTIFIED BY 'audi',
annalynn IDENTIFIED BY 'cadillac',
cody@us% IDENTIFIED BY 'bmw';
318 Глава 3. Справочник операторов SQL
Oracle
В Oracle оператор GRANT поддерживает огромное число вариаций и сочетаний.
Синтаксис оператора следующий:
GRANT { [объектная_привилегия][, ...] |
[системная_привилегия][, ...] | [роль][, ...]}
[ ON { [схема.][объект][, ...] |
[DIRECTORY каталог] |
[JAVA [ { SOURCE | RESOURCE } ] [схема.][объект]] } ]
TO {получатель[, ...] | роль[, ...] | PUBLIC}
[WITH { GRANT | HIERARCHY } OPTION]
[IDENTIFIED BY пароль] [WITH ADMIN OPTION];
Одним оператором вы можете выдать несколько привилегий, но все они должны
быть одного типа (объектной, системной привилегией или ролью).
320 Глава 3. Справочник операторов SQL
RECOVERY_CATALOG_OWNER
Дает привилегию на создание пользователей со своими собственными ка
талогами восстановления.
HS_ADMIN_ROLE
Дает доступ к областям словаря данных, используемым для поддержки ге
терогенных сервисов Oracle.
ON имя_схемы
Дает пользователю или роли привилегии на объект схемы. Объекты базы
данных включают таблицы, представления, последовательности, хранимые
процедуры, пользовательские функции, пакеты, материализованные пред
ставления, пользовательские типы, пакеты, индексные типы, пользователь
ские операторы и синонимы для всех этих объектов. Если вы не указываете
имя схемы, то Oracle использует текущую схему пользователя. Поддержива
ются два дополнительных ключевых слова для специальных случаев:
DIRECTORY
Предоставляет привилегии на каталог, являющийся специальным объек
том базы данных, соответствующим каталогу файловой системы.
JAVA
Дает привилегии на Javaобъекты SOURCE и RESOURCE, являющиеся
частью схемы пользователя.
TO {получатель | роль | PUBLIC} [ WITH { GRANT|HIERARCHY } OPTION ]
Указывает пользователя или роль, получающую указанную привилегию. Клю
чевое слово PUBLIC можно использовать для выдачи и отзыва привилегий
у роли PUBLIC. Через запятую можно перечислить несколько получателей.
WITH GRANT OPTION
Позволяет получателю объектных привилегий передавать их другим
пользователям или роли PUBLIC, но не любым другим ролям.1
WITH HIERARCHY OPTION
При получении привилегий на объект с помощью этой опции выдаются
также привилегии на все подчиненные объекты, включая все объекты, ко
торые будут созданы в будущем. Вы можете использовать эту опцию толь
ко при выдаче привилегии SELECT.
IDENTIFIED BY пароль
Устанавливает или меняет пароль, который используется для активации по
лученной пользователем роли.2
команды (такие как CREATE ANY TABLE), но и на объекты схемы (такие как
DIRECTORY, JAVA SOURCE и RESOURCE). Ключевое слово ANY (например,
CREATE ANY TABLE) означает, что привилегия относится к объектам указан
ного типа, которыми владеют любые пользователи схемы. Без ANY (например,
CREATE TABLE) привилегия относится только к объектам, которыми владеет
сам пользователь.
Таблица 3.2. Системные привилегии Oracle
Привилегия Описание
CREATE | ALTER | DROP
CREATE CLUSTER Позволяет пользователю создавать кластеры в его соб
ственной схеме.
{CREATE | ALTER | DROP} Позволяет создавать, изменять или удалять, соответ
ANY CLUSTER ственно, кластеры в любой схеме.
{CREATE | DROP} ANY CON0 Позволяет создавать или удалять, соответственно, лю
TEXT бой контекст.
CREATE DIMENSION Позволяет пользователю создавать измерения в своей
схеме.
{CREATE | ALTER | DROP} Позволяет пользователю создавать, изменять или уда
ANY DIMENSION лять измерения в любой схеме.
{CREATE | DROP} ANY DI0 Позволяет создавать и удалять объектыкаталоги.
RECTORY
{CREATE | ALTER | DROP | Позволяет пользователю создавать, изменять, уда
EXECUTEa} [ANY] INDEX лять или использовать индекс в своей или любой
(ANY) схеме.
CREATE INDEXTYPE Позволяет пользователю создавать индексный тип
в своей схеме.
{CREATE | DROP | EXECU0 Позволяет создавать, удалять или использовать ин
TE} ANY INDEXTYPE дексный тип в любой схеме.
CREATE DATABASE LINK Позволяет создавать указатели на базы данных в схе
ме пользователя.
CREATE EXTERNAL JOB Позволяет создавать в своей схеме задачи, исполняе
мые по расписанию в операционной системе.b
CREATE [ANY] JOB Позволяет создавать, изменять или удалять задачи,
расписания и программы в своей схеме или в любой
схеме (ANY). Выдавайте эту привилегию с осторожно
стью, так как она позволяет выполнять любой код,
как если бы это делала внешняя программа.
{CREATE | DROP} [ANY] Позволяет создавать или удалять внешние библиотеки
LIBRARY процедур и функций в своей или любой (ANY) схеме.
Привилегия Описание
{CREATE | ALTER | DROP} Дает привилегии на создание, изменение или удале
[ANY] MATERIALIZED ние материализованных представлений в своей или
VIEW любой (ANY) схеме.
CREATE OPERATOR Дает привилегии на создание оператора и его привя
зок в схеме пользователя.
{CREATE | DROP | ALTER | EX0 Дает привилегии на создание оператора и его привя
ECUTE} ANY OPERATOR зок в любой схеме.
CREATE PUBLIC DATABASE Дает права на создание публичных указателей на ба
LINK зу данных.
{CREATE | ALTER | DROP} Дает привилегии на создание (не используйте ANY
[ANY] ROLE вместе с CREATE), изменение и удаление ролей.
{CREATE | DROP | ALTER} Дает привилегии на создание, удаление и изменение
ANY OUTLINE любого хранимого плана выполнения запроса, кото
рый может быть использован в любой схеме, исполь
зующей хранимые планы выполнения запросов.
SELECT ANY OUTLINE Дает привилегии на создание приватных хранимых
планов выполнения запросов копированием публич
ных.
{CREATE | ALTER | DROP | Дает привилегии на создание, изменение, удаление
EXECUTE} [ANY] PROCE0 и выполнение хранимых процедур и функций в лю
DURE бой схеме (ANY) либо в схеме пользователя.
{CREATE | ALTER | DROP} Дает привилегии на создание, изменение и удаление
PROFILE профилей пользователей.
ALTER RESOURCE COST Позволяет устанавливать стоимости ресурсов сессии.
{CREATE | ALTER | DROP | Дает привилегии на создание, изменение, удаление
GRANT} ANY ROLE и назначение ролей в базе данных.
{CREATE | ALTER | DROP} Дает привилегии на создание, изменение и удаление
ROLLBACK SEGMENT сегментов отката.
{CREATE | ALTER | DROP | SE0 Дает привилегии на создание, изменение, удаление
LECT} [ANY] SEQUENCE и использование последовательностей.
CREATE SNAPSHOT Дает привилегии на создание моментальных сним
ков (материализованных представлений) в схеме
пользователя.
{CREATE | ALTER | DROP} Дает привилегии на создание, изменение и удаление
ANY SNAPSHOT мгновенных снимков в любой схеме.
CREATE SYNONYM Дает привилегии на создание синонимов в схеме
пользователя.
{CREATE | DROP} ANY SY0 Дает привилегии на создание и удаление синонимов
NONYM в любой схеме.
{CREATE | DROP} PUBLIC Дает привилегии на создание и удаление публичных
SYNONYM синонимов.
326 Глава 3. Справочник операторов SQL
Привилегия Описание
BACKUP ANY TABLE Дает привилегии на использование утилиты экспорта для
инкрементального экспорта любого объекта в любой схеме.
DELETE ANY TABLE Дает привилегии на удаление строк из таблиц, секций таб
лиц и представлений в любой схеме.
DROP ANY TABLE Дает привилегии на удаление и очистку таблиц или секций
таблиц в любой схеме.
INSERT ANY TABLE Дает привилегии на вставку строк в таблицы и представле
ния в любой схеме.
LOCK ANY TABLE Дает привилегии на блокирование таблиц и представлений
в любой схеме.
UPDATE ANY TABLE Дает привилегии на обновление строк в таблицах и пред
ставлениях в любой схеме.
SELECT ANY TABLE Дает привилегии на выполнение запросов к таблицам,
представлениям и материализованным представлениям
в любой схеме.
{CREATE | ALTER | Дает привилегии на создание, изменение и удаление таб
DROP} TABLESPACE личных пространств.
MANAGE TABLE0 Дает привилегии на перевод табличных пространств в ак
SPACE тивный или неактивный режим, а также на запуск и завер
шение процессов резервного копирования табличных про
странств.
UNLIMITED TA0 Дает неограниченные привилегии на использование места
BLESPACE в любых табличных пространствах. Эта привилегия отменя
ет любые квоты на отдельные табличные пространства. Если
вы отзываете эту привилегию у пользователя, то все объек
ты пользователя сохраняются, но дальнейшее использова
ние табличных пространств определяется квотами. Вы не
можете выдавать эту системную привилегию ролям.
Триггеры
ADMINISTER DATA0 Дает привилегии на создание триггеров на уровне базы дан
BASE TRIGGER ных. (Пользователь также должен иметь привилегию CRE0
ATE TRIGGER или CREATE ANY TRIGGER.)
{CREATE | ALTER | Дает привилегии на создание, изменение и удаление триг
DROP} [ANY] TRIG0 геров в своей или в любой (ANY) схеме.
GER
Типы
{CREATE | ALTER | Дает привилегии на создание, изменение и удаление объ
DROP} [ANY] TYPE ектных типов и их тел в своей или любой (ANY) схеме.
EXECUTE ANY TYPE Если привилегия выдана пользователю, то ему разрешается
использовать объектные типы и типыколлекции, а также
вызывать методы объектных типов в любой схеме. Если
привилегия выдана роли, то отдельные участники этой роли
не смогут вызывать методы объектных типов в любой схеме.
328 Глава 3. Справочник операторов SQL
Привилегия Описание
CHANGE NOTI0 Дает привилегии на регистрацию и получение уведомлений о за
FICATION просах и изменениях в базе данных.
COMMENT ANY Дает привилегии на создание комментариев к таблицам, столб
TABLE цам и представлениям в любой схеме.
EXEMPT AC0 Позволяет обходить детальный контроль доступа (finegrained
CESS POLICY audit). Использовать эту привилегию следует аккуратно, так как
она позволяет обходить политики безопасности, определенные
для приложений.
FORCE ANY Позволяет принудительно зафиксировать или откатить любую
TRANSACTION сомнительную (indoubt) распределенную транзакцию в локаль
ной базе данных и завершить распределенную транзакцию.
FORCE TRANS0 Позволяет принудительно зафиксировать или откатить собствен
ACTION ную сомнительную (indoubt) распределенную транзакцию
в локальной базе данных.
{EXP | IMP} Дает привилегии на использование утилит импорта (IMP) и экс
FULL_DATABASE порта (EXP).a
GRANT ANY PRI0 Дает привилегии на выдачу любых системных привилегий.
VILEGE
GRANT ANY OBJ0 Дает привилегии на выдачу любых объектных привилегий.
ECT PRIVILEGE
RECOVERY_CA0 Дает привилегии на создание каталога восстановления.
TALOG_OWNER
RESUMABLE Дает возможность использовать функцию Resumable Space Allo
cation.
SELECT ANY Дает привилегии на чтение любого объекта словаря данных
DICTIONARY в схеме SYS.
SELECT ANY Дает привилегии на доступ к представлению FLASHBACK_TRAN0
TRANSACTION SACTION_QUERY. (Выдавайте эту привилегию с осторожно
стью, так как она позволяет читать любые данные в базе данных.)
SYSDBA Дает пользователю привилегию RESTRICTED SESSION и по
зволяет выполнять операции STARTUP и SHUTDOWN, CREA0
TE и ALTER DATABASE, OPEN/MOUNT/BACKUP, ARCHIVE0
LOG и RECOVERY, менять кодировку базы данных.
SYSOPER Дает пользователю привилегию RESTRICTED SESSION и позво
ляет выполнять операции STARTUP и SHUTDOWN, ALTER DA0
TABASE, OPEN/MOUNT/BACKUP, ARCHIVELOG и RECOVERY.
QUERY REWRI0 Разрешает переписывание запросов с использованием материа
TE лизованных представлений и создание для таблиц индексов, ос
нованных на функциях, если эти материализованные представ
ления и таблицы принадлежат пользователю.
GLOBAL QUERY Разрешает переписывание запросов и создание индексов, осно
REWRITE ванных на функциях.
PostgreSQL
В PostgreSQL поддерживается подмножество возможностей оператора GRANT
по сравнению со стандартом ANSI, включая поддержку объектных привилегий
для таблиц, последовательностей, функций и т. д. Синтаксис оператора GRANT
в PostgreSQL следующий:
GRANT { роль | { ALL [PRIVILEGES] | SELECT | INSERT |
DELETE | UPDATE | RULE | REFERENCES| TRIGGERS | CREATE |
USAGE }[, ...] }
ON { [TABLE | SEQUENCE | DATABASE | FUNCTION | LANGUAGE |
SCHEMA | TABLESPACE]
объект[, ...] }
[WITH GRANT OPTION]
TO {получатель | GROUP группа | PUBLIC}[, ...]
[WITH ADMIN OPTION]
где:
GRANT роль
Назначает пользователю предварительно созданную роль. Используется син
таксис GRANT роль TO получатель [WITH ADMIN OPTION]. Пользователь
получает все привилегии, выданные роли. Через роли нельзя выдавать при
вилегии роли PUBLIC.
ALL [PRIVILEGES]
Выдает все привилегии, которые имеет право выдать пользователь, выпол
няющий оператор GRANT. Использование ALL – нерекомендуемый подход,
так как он провоцирует небрежное отношение к вопросам безопасности.
CREATE
Дает пользователю привилегии на создание объекта определенного типа.
Можно использовать совместно с ON DATABASE, ON SCHEMA и ON TABLE0
SPACE. ON DATABASE позволяет создавать новые схемы в базе данных. ON
SCHEMA позволяет создавать и переименовывать объекты в схеме. ON TAB0
LESPACE позволяет создавать таблицы и индексы в указанном табличном
пространстве.
CONNECT | TEMP[ORARY]
Позволяет подключать к указанной базе данных или создавать в ней времен
ные таблицы.
SELECT | INSERT | DELETE | UPDATE
Дает привилегии на выполнение соответствующего оператора для определен
ного объекта базы данных, такого как таблица или представление. При жела
нии вы можете в скобках указать список столбцов, к которым относятся ука
занные привилегии.
GRANT 331
RULE
Дает привилегии на создание и удаление правил на таблицах и представле
ниях.
REFERENCES
Дает привилегии на создание и удаление внешних ключей, ссылающихся на
указанную таблицу.
TRIGGERS
Дает привилегии на создание триггеров на определенные таблицы и их столб
цы.
USAGE
Дает привилегии на использование следующих объектов: CHARACTER SET,
COLLATION, TRANSLATION и DOMAIN (пользовательский тип данных).
Также вы можете выдать привилегию USAGE на последовательности, языки
и схемы.
ON { [TABLE] | SEQUENCE | DATABASE | FUNCTION | LANGUAGE | SCHEMA |
TABLESPACE имя_объекта[, ...] }
Указывает объект, на который выдаются привилегии. Ключевое слово TAB0
LE является значением по умолчанию. Вы можете выдать привилегии на не
сколько объектов одного типа, перечислив их через запятую.
WITH GRANT OPTION
Позволяет пользователю передавать полученные привилегии другим пользо
вателям.
TO {получатель | GROUP группа | PUBLIC}[, ...]
Указывает пользователя, получающего привилегии. В PostgreSQL PUBLIC
является синонимом для всех пользователей. Привилегии можно выдавать
группе (то же, что и роль), указав ее имя.
WITH ADMIN OPTION
Дает участнику роли возможность назначать и отзывать эту роль у других
пользователей.
Одним оператором можно выдать несколько привилегий, перечислив их через
запятую. Но при этом требуется, чтобы все привилегии были одного типа. Нель
зя сочетать ALL PRIVILEGES с другими привилегиями, но большинство осталь
ных привилегий можно комбинировать произвольным образом.
В PostgreSQL не поддерживается фраза WITH и разрешения на уровне столбцов.
Создатель объекта имеет все права на него. У создателя объекта можно отозвать
практически все привилегии на объект, кроме права на раздачу привилегий.
Аналогично, у создателя объекта нельзя отозвать привилегию на удаление этого
объекта. Другие пользователи не имеют никаких привилегий на объект, пока
эти привилегии не будут им явно выданы.
В зависимости от типа объекта, на объект могут быть выданы различные приви
легии:
332 Глава 3. Справочник операторов SQL
TABLE
Могут быть выданы привилегии SELECT, INSERT, UPDATE, DELETE,
REFERENCES, TRIGGER и ALL [PRIVILEGES].
SEQUENCE
Могут быть выданы привилегии USAGE, SELECT и ALL [PRIVILEGES].
DATABASE
Могут быть выданы привилегии CONNECT, CREATE, TEMP[ORARY] и ALL
[PRIVILEGES].
FUNCTION
Могут быть выданы привилегии EXECUTE и ALL [PRIVILEGES].
LANGUAGE
Могут быть выданы привилегии USAGE и ALL [PRIVILEGES].
SCHEMA
Могут быть выданы привилегии CREATE, USAGE и ALL [PRIVILEGES].
TABLESPACE
Могут быть выданы привилегии CREATE и ALL [PRIVILEGES].
Поддержка оператора GRANT в PostgreSQL достаточно слабая. В следующем
примере привилегия INSERT на таблицу publishers выдается роли PUBLIC,
а привилегии SELECT и UPDATE на таблицу sales выдаются пользователям
Emily и Dylan:
GRANT INSERT ON TABLE publishers TO PUBLIC;
GRANT SELECT, UPDATE ON sales TO emily, dylan;
В следующем примере пользователю Katie предоставляется привилегия управ
ления базой данных, а затем Katie и Anna добавляются в новую группу:
GRANT ALL ON DATABASE publishing TO katie;
GRANT manager_role ON katie, anna WITH ADMIN OPTION;
SQL Server
Реализация оператора GRANT в SQL Server несколько отличается от стандарта
ANSI. SQL Server не поддерживает фразу FROM и опции HIERARCHY и AD0
MIN, однако поддерживает выдачу специальных системных привилегий и вы
дачу привилегий изпод контекста безопасности другого пользователя. Синтак
сис оператора следующий:
GRANT {[объектная_привилегия][,...]|[системная_привилегия] }
[ON { [область_определения::[[схема.]объект]
[(столбец[, ...])] }]
TO { получатель[, ...] | роль[, ...] | PUBLIC | GUEST }
[WITH GRANT OPTION]
[AS {группа | роль}]
где:
GRANT объектная_привилегия
Выдает на объекты различные привилегии, которые можно комбинировать
произвольным образом (за исключением привилегии ALL PRIVILEGE). Объ
GRANT 333
Привилегия Описание
IMPERSONATE Дает пользователю привилегии на действие от имени дру
гого пользователя, например: GRANT IMPERSONATE
ON USER::katie TO manager123
RECEIVE Дает пользователю привилегии на получение сообщений
из указанной очереди брокера сервисов, например: GRANT
RECEIVE ON query_notification_errorqueue TO emily;.
SEND Дает привилегии на посылку уведомлений очереди из оче
реди сервиса сообщений указанному пользователю, на
пример: GRANT SEND ON SERVICE:://mysvc TO dylan;.
SHOWPLAN Дает привилегии на просмотр планов выполнения запро
сов.
SHUTDOWN Дает привилегии на остановку сервера.
SUBSCRIBE QUERY Дает привилегии на получение уведомлений из очереди
NOTIFICATIONS уведомлений запроса, например: GRANT SUBSCRIBE
QUERY NOTIFICATIONS TO sam;
TAKE OWNERSHIP Дает привилегии на изменение владельца коллекции
XMLсхем с одного пользователя на другого.
VIEW {DATABASE Дает привилегии на просмотр метаданных всей базы дан
STATE | DEFINITION} ных, вне зависимости от того, является ли пользователь
владельцем базы данных (для DATABASE STATE) или
метаданных сервера, базы данных, схемы или конкретно
го объекта (для DEFINITION).
DISKADMIN
Может администрировать диски и файлы.
BULKADMIN
Может использовать утилиту BCP (Bulk Copy Program) и выполнять операто
ры BULK INSERT (а также обычные операторы INSERT) для таблиц базы
данных.
Роль SYSADMIN позволяет выдавать любые привилегии в любой базе данных
сервера. Члены ролей DB_OWNER и DB_SECURITYADMIN могут выдавать
любые привилегии на оператор или объект в базе данных, которыми они владе
ют. Члены ролей DB_DDLADMIN, SYSADMIN и владельцы баз данных могут
выдавать системные привилегии.
Члены системных ролей могут добавлять других пользователей в члены этих ро
лей. Но для этого нужно использовать не оператор GRANT, а системную храни
мую процедуру sp_addsrvrolemember.
В дополнение к серверным системным ролям в SQL Server есть также набор ро
лей уровня баз данных. То есть серверные системные роли дают привилегии на
все базы данных в сервере, а системные роли из следующего списка дают приви
легии только в пределах той базы данных, в которой они выданы:
DB_OWNER
Включает привилегии всех основных ролей и разрешение на выполнение дей
ствий по конфигурации и администрированию базы данных.
DB_ACCESSADMIN
Дает привилегии на добавление и удаление из базы данных пользователей
и групп SQL Server и Windows.
DB_DATAREADER
Дает привилегии на чтение любой таблицы в базе данных.
DB_DATAWRITER
Дает привилегии на чтение, вставку, модификацию и удаление данных лю
бой таблицы в базе данных.
DB_DDLADMIN
Дает привилегии на создание, изменение и удаление объектов в базе данных,
а также на выполнение любых операторов DDL.
DB_SECURITYADMIN
Дает разрешение на администрирование пользователей и ролей, а также объ
ектных и системных привилегий.
DB_BACKUPOPERATOR
Дает привилегии на резервное копирование базы данных.
DB_DENYDATAREADER
Запрещает чтение данных.
IN 339
DB_DENYDATAWRITER
Запрещает модификацию данных.
Как и в случае с серверными системными ролями, системные роли уровня базы
данных выдаются не с помощью оператора GRANT, а с помощью хранимой про
цедуры sp_addrolemember.
В следующем примере мы выдаем пользователям Emily и Sarah системные при
вилегии CREATE DATABASE и CREATE TABLE. Затем несколько привилегий
на таблицу titles выдаются группе editors с возможностью передавать эти приви
легии дальше:
GRANT CREATE DATABASE, CREATE TABLE TO emily, sarah
GO
GRANT SELECT, INSERT, UPDATE, DELETE ON titles
TO editors
WITH GRANT OPTION
GO
В следующем примере привилегии выдаются пользователю базы данных sam
и пользователю Windows jacob:
GRANT CREATE TABLE TO sam, [corporate\jacob]
GO
В последнем примере показано, как выдаются привилегии с использованием
ключевого слова AS. В этом примере пользователь emily владеет таблицей sales_
detail, и она выдает привилегию SELECT на эту таблицу роли sales_manager.
Пользователь kelly, являющийся членом роли sales_manager, хочет передать
привилегию SELECT пользователю sam, но он не может этого сделать, так как
привилегия была выдана не ему лично, а группе. Для решения этой проблемы
можно использовать слово AS:
Первоначальная выдача привилегии
GRANT SELECT ON sales_detail TO sales_manager
WITH GRANT OPTION
GO
kelly выдает привилегию пользователю sam от имени роли sales_manager
GRANT SELECT ON sales_detail TO sam AS sales_manager
GO
См. также
REVOKE
IN
Оператор IN позволяет сформировать список значений (либо явным перечисле
нием значений, либо по результату подзапроса), а затем проверить конкретное
значение на вхождение в этот список во фразе WHERE или HAVING. Другими
словами, этот оператор позволяет отвечать на вопросы вида «Входит ли значе
ние А в указанный список значений?».
340 Глава 3. Справочник операторов SQL
Синтаксис SQL2003
{WHERE | HAVING | {AND | OR}} значение
[NOT] IN ({значение1, значение2[, ...] | подзапрос})
Ключевые слова
{WHERE | HAVING | {AND | OR}} значение
IN можно использовать во фразах WHERE и HAVING. Также оператор IN
можно комбинировать с другими условиями с помощью AND и OR. Прове
ряемое значение может иметь любой тип данных: обычно это столбец табли
цы, используемой в транзакции, или переменная.
NOT
Указывает, что нужно возвращать те значения, которые не содержатся в спи
ске.
IN ({значение1, значение2[, ...] | подзапрос})
Указывает список значений, по которому проверяется исходное значение.
Тип значений списка должен быть совместим с типом исходного значения.
При перечислении значений используются обычные правила: строковые зна
чения должны быть указаны в кавычках, а для числовых значений раздели
тели (кавычки) не требуются. Вместо перечисления значений вы можете ис
пользовать подзапрос, возвращающий одно или несколько значений подхо
дящего типа.
В следующем примере для SQL Server мы извлекаем из таблицы employee базы
hr записи о сотрудниках, живущих в штатах Джорджия, Теннеси, Алабама или
Кентукки:
SELECT *
FROM hr..employee
WHERE home_state IN ('AL','GA','TN','KY')
Аналогичным образом мы можем найти в таблице employee всех сотрудников,
являющихся авторами согласно базе pubs:
SELECT *
FROM hr..employee
WHERE emp_id IN (SELECT au_id FROM pubs..authors)
Мы можем использовать ключевое слово NOT для формирования выборки на ос
новании элементов, отсутствующих в списке. В следующем примере штабквар
тира компании находится в НьюЙорке и многие сотрудники ездят на работу из
соседних штатов. Мы хотим отфильтровать всех таких сотрудников:
INSERT 341
SELECT *
FROM hr..employee
WHERE home_state
NOT IN ('NY','NJ','MA','CT','RI','DE','NH')
Обратите внимание, что Oracle полностью поддерживает функциональность ANSI
и при этом расширяет оператор IN возможностью использования составных зна
чений. Например, в Oracle можно использовать следующий оператор:
SELECT *
FROM hr..employee e
WHERE (e.emp_id, e.emp_dept) IN
( (242, 'sales'), (442, 'mfg'), (747, 'mkt) )
См. также
ALL/ANY/SOME
BETWEEN
EXISTS
LIKE
SELECT
SOME/ANY
INSERT
Оператор INSERT вставляет строки в таблицу или представление.
Синтаксис SQL2003
INSERT INTO [ONLY] {имя_таблицы | имя_представления}
[(столбец1[, ...])]
[OVERRIDE {SYSTEM | USER} VALUES]
{DEFAULT VALUES|VALUES (значение1[, ...])|оператор_select}
342 Глава 3. Справочник операторов SQL
Ключевые слова
ONLY
Используется только с типизированными таблицами для того, чтобы строки
вставлялись только в целевую таблицу, но не в подтаблицы.
{имя_таблицы | имя_представления} [(столбец1[, ...])]
Указывает таблицу или представление, в которое вставляются строки. Вы
должны иметь привилегию INSERT на таблицу или хотя бы на столбцы, для
которых вы указываете значения. Если не задана схема, то используется схе
ма по умолчанию. При необходимости вы можете указать список столбцов,
в которые записываются значения.
OVERRIDE {SYSTEM | USER} VALUES
Ключевое слово SYSTEM позволяет вставить значение в столбец, который
в обычном случае заполняется сервером, например в столбец с автоматически
генерируемой последовательностью идентификаторов. OVERRIDE USER
VALUES делает ровно противоположное: вставляет сгенерированное систе
мой значение, даже если пользователь явно указал свое значение.
DEFAULT VALUES
Вставляет во все столбцы значения по умолчанию, там где они определены
с помощью DEFAULT, и пустые значения в столбцы, для которых не опреде
лены значения по умолчанию. (Конечно, значением по умолчанию можно
сделать и пустое значение.) Этот оператор вставляет единственную запись.
В зависимости от ограничений PRIMARY KEY и UNIQUE на целевой табли
це, этот оператор может привести к ошибке.
VALUES (значение1[, ...])
Указывает значения, вставляемые в целевую таблицу. Значения из списка
должны полностью соответствовать по числу, типу и размеру столбцам, пере
численным в INSERT INTO. То есть в первый столбец вставляется первое
значение из списка, во второй столбец – второе значение и т. д. При необходи
мости вы можете использовать ключевые слова DEFAULT (для вставки
в столбец значения по умолчанию) и NULL (для вставки в столбец пустого
значения).
оператор_select
Вставляет в таблицу или представление строки, сформированные оператором
SELECT. Список столбцов в операторе SELECT должен полностью соответст
вовать списку столбцов в операторе INSERT. Целевая таблица или представ
ление не могут использоваться в операторе SELECT во фразах FROM и JOIN.
Общие правила
Вы можете вставлять строки в таблицы, а также в представления, построенные
на базе одной таблицы. Оператор в формате INSERT…VALUES вставляет одну
строку из явно заданных значений. В следующем примере мы вставляем инфор
мацию об авторе Jessica Rabbit в таблицу authors:
INSERT INTO authors (au_id, au_lname, au_fname, phone,
address, city, state, zip, contract )
INSERT 343
Советы и хитрости
Оператор INSERT вызывает ошибку в следующих ситуациях:
• При несоответствии типов данных столбца и вставляемого в столбец значения.
• Когда в столбец с ограничением NOT NULL вставляется пустое значение.
• Когда в столбцы с ограничениями UNIQUE и PRIMARY KEY вставляются
повторяющиеся значения.
• Когда вставляемые значения не удовлетворяют ограничениям CHECK.
• Когда значение, вставляемое в столбец с ограничением FOREIGN KEY, не
найдено в первичном ключе соответствующей таблицы.
Наиболее частой ошибкой при выполнении оператора INSERT является несоот
ветствие между числом столбцов таблицы и числом вставляемых значений. Ес
ли вы случайно пропустите значение, соответствующее определенному столбцу,
то весьма вероятно, что вы получите сообщение об ошибке.
Оператор INSERT также завершается с ошибкой, если вставляемое значение не
соответствует по типу столбцу таблицы. Например, попытка вставки строки ти
па «Hello, world!» в столбец целого типа приведет к ошибке. С другой стороны,
иногда базы данных могут неявно конвертировать значения между некоторыми
типами. Например, SQL Server автоматически сконвертирует дату в строку при
вставке в столбец типа VARCHAR.
Еще одна типичная проблема при использовании INSERT – несоответствие дли
ны вставляемого значения и длины столбца таблицы. Например, вставка длин
ной строки в столбец типа CHAR(5) или вставка большого числа в столбец типа
TINYINT может привести к проблемам. В зависимости от платформы это может
быть либо фатальная ошибка с откатом транзакции, либо просто отбрасывание
части данных. Ни то ни другое не желательно. Аналогичная проблема может
возникнуть при попытке вставки значения NULL в столбец, объявленный как
NOT NULL.
MySQL
MySQL поддерживает для оператора INSERT несколько опций, подтверждаю
щих репутацию MySQL как высокопроизводительной платформы:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] [[база_данных.]владелец.]таблица [(столбец1[, ...])]
{VALUES ( {значение1 | DEFAULT}[, ...] ) | оператор_select |
SET [ON DUPLICATE KEY UPDATE] столбец1=значение1[, ...]}
где:
LOW_PRIORITY | DELAYED | HIGH_PRIORITY
LOW_PRIORITY откладывает выполнении INSERT до того момента, когда
все пользователи закончат чтение таблицы. Эта опция может привести к дос
таточно долгому ожиданию. Ее не следует использовать с таблицами My
ISAM, так как при этом невозможны параллельные вставки. Ключевое слово
DELAYED позволяет пользователю продолжить работу, даже если оператор
INSERT еще не завершился. DELAYED игнорируется при использовании
в формате INSERT…SELECT и INSERT…ON DUPLICATE. HIGH_PRIORITY
просто восстанавливает приоритет оператора до нормального уровня при ис
пользовании в серверах с низким приоритетом, в остальном приоритет и ско
рость работы оператора не повышается.
IGNORE
Позволяет игнорировать и не пытаться вставлять строки, приводящие к дуб
ликатам в уникальных и первичных ключах. Без IGNORE такие строки при
попытке вставки приводят к завершению всего оператора с ошибкой. Если
при использовании фразы IGNORE встретились дублирующие строки, то они
игнорируются, а все остальные вставляются как обычно.
SET столбец = значение
Альтернативный синтаксис, позволяющий указать значения для столбцов по
имени.
ON DUPLICATE KEY UPDATE
Позволяет обновить текущую запись, если она приводит к дубликатам в уни
кальных и первичных ключах.
MySQL обрезает данные при вставке значений, не подходящих по типу или раз
меру. Например, при вставке значения ’10.23 X’ в числовой столбец часть ‘X’
будет отброшена. Если вы попытаетесь вставить в числовой столбец значение,
выходящее за границы диапазона типа, то значение будет обрезано. Вставка не
корректной даты или времени приведет к нулевому значению в столбце табли
цы. При вставке строки «Hello, World!» в столбец типа CHAR(5) строка будет
урезана до первых пяти символов. Урезание строк применяется к типам CHAR,
VARCHAR, TEXT и BLOB.
346 Глава 3. Справочник операторов SQL
Oracle
Реализованный в Oracle оператор INSERT позволяет вставлять данные в табли
цы, представления, секции, подсекции и объектные таблицы. Также поддержи
ваются расширения, позволяющие вставку строк сразу в несколько таблиц и ус
ловную вставку. Синтаксис оператора следующий:
Стандартный оператор INSERT
INSERT [INTO] {таблица
[ [SUB]PARTITION { (секция) | (значение_ключа) } ] |
(подзапрос) [WITH {READ ONLY | CHECK OPTION
[CONSTRAINT имя_ограничения]}] |
TABLE (коллекция) [ (+) ] } [псевдоним]
[(столбец1[, ...])]
{VALUES (значение1[, ...]) [RETURNING выражение1[, ...]
INTO переменная1[, ...]] |
оператор_select [WITH {READ ONLY |
CHECK OPTION [CONSTRAINT имя_ограничения]}]}
Условный оператор INSERT
INSERT {[ALL | FIRST]} WHEN условие
THEN стандартный_оператор_insert
ELSE стандартный_оператор_insert
[LOG ERRORS [INTO [схема.]таблица] [( выражение )]
[REJECT LIMIT {целое_число | UNLIMITED}]]
где:
INSERT [INTO]
Вставляет строку или строки в таблицу, представление, материализованное
представление или подзапрос. Ключевое слово INTO1 необязательно. Оди
ночные записи вставляются с помощью фразы VALUES, а наборы записей
вставляются с помощью подзапросов.
таблица [ [SUB]PARTITION { (секция) | (значение_ключа) } ]
Указывает целевую таблицу, в которую вставляются строки. Вы можете пол
ностью квалифицировать имя таблицы, указав схему и связь с другой базой
данных; по умолчанию подразумеваются текущая схема и база данных. Если
вы вставляете строки не в объектную таблицу или объектное представление,
то вы можете вставлять данные в определенную секцию или подсекцию, ука
зав либо название секции, либо значение ключа секционирования.
подзапрос
Позволяет вставить в таблицу сразу целый набор строк, возвращаемый стан
дартным оператором SELECT. Фактически вы с помощью подзапроса на лету
создаете представление, так же как и при вставке в представление. Это основ
ной механизм вставки сразу в несколько таблиц. Все значения, возвращае
мые подзапросом, должны соответствовать столбцам, в которые производит
ALL
Выполняет вставку в несколько таблиц и используется только совместно с под
запросами. Если не указано условие WHEN, то выполняется вставка во все
перечисленные таблицы. Если же указано условие WHEN, то оно проверяется
для каждой таблицы, и в зависимости от результата проверки записи вставля
ются в каждую таблицу независимо от других. Каждый раз, когда условие
оценивается как TRUE, Oracle выполняет соответствующую фразу INTO.
Вставки в несколько таблиц не могут выполняться параллельно для индекс
ноорганизованных таблиц и для таблиц с битовыми индексами, а также за
прещены в следующих случаях:
• При вставках в представления и материализованные представления.
• При вставках в удаленные таблицы.
• При использовании коллекций с помощью выражения TABLE.
• При вставке в более чем 999 столбцов.
• При использовании последовательностей в подзапросе.
FIRST
Указывает, что условия WHEN должны проверяться по порядку, и как толь
ко встретится условие, которое имеет результат TRUE, то выполняется соот
ветствующая фраза INTO, а остальные фразы WHEN пропускаются.
WHEN условие THEN стандартный_оператор_insert
Определяет условие, при истинности которого выполняется оператор IN0
SERT. Условие оценивается для каждой строки, возвращаемой подзапросом.
Разрешается использовать до 127 фраз WHEN.
ELSE стандартный_оператор_insert
Выполняется в случае, когда ни одно условие WHEN не было выполнено.
LOG ERRORS [INTO [схема.]таблица] [(выражение)] [REJECT LIMIT {целое_чис
ло | UNLIMITED}]
Журналирует значения столбцов в случае возникновения ошибок DML. INTO
указывает таблицу, в которую записывается информация об ошибках. Если
имя таблицы не указано, то Oracle использует таблицы с названием ERR$_
плюс 25 первых символов названия таблицы, в которую выполняется встав
ка. Вы можете указать любое выражение (например, TO_CHAR(SYSDATE)),
которое вы хотите вставлять в таблицу ошибок. REJECT LIMIT позволяет
задать порог числа ошибок, при достижении которого выполнение оператора
INSERT будет остановлено. (Обратите внимание, что вы не сможете журна
лировать значения столбцов типов LONG, LOB и объектных типов.)
В Oracle поддерживаются стандартные варианты оператора INSERT, описанные
в ANSI, такие как INSERT…SELECT и INSERT…VALUES. Однако поддержива
ются также некоторые дополнительные варианты.
При вставке в таблицы, для которых используются последовательности, выби
райте следующее значение из последовательности с помощью синтаксиса <имя_
последовательности>.NEXTVAL. Например, представьте, что вы хотите исполь
зовать последовательность authors_seq для установки значения столбца au_id
таблицы authors:
INSERT 349
INTO jobs_cancelled
VALUES(job_id, job_desc, min_lvl, max_lvl)
WHEN job_status = 'Terminated'
INTO jobs_outsourced
VALUES(job_id, job_desc, min_lvl, max_lvl)
ELSE INTO jobs
VALUES(job_id, job_desc, min_lvl, max_lvl)
SELECT job_identifier, job_title, base_pay, max_pay
FROM job_descriptions;
Обратите внимание, что, так как в примере используется ключевое слово FIRST,
то из двух условий job_status=’Terminated’ всегда будет отрабатываться только
первое (вставка в jobs_cancelled), а следующее будет пропускаться.
Oracle позволяет вставлять данные либо в обычном режиме, либо в режиме пря
мой вставки. При обычной вставке Oracle проверяет ссылочную целостность
и повторно использует свободное пространство. В режиме прямой вставки Oracle
пишет данные в конец целевой таблицы, не заполняя пустое пространство внут
ри таблицы. Также в режиме прямой вставки данные пишутся сразу в файлы
данных, минуя буферный кэш.
PostgreSQL
PostgreSQL поддерживает оператор INSERT в соответствии со стандартом ANSI,
за исключением отсутствия фразы OVERRIDE SYSTEM GENERATED VALUES
и наличия расширенной поддержки фразы RETURNING:
INSERT INTO таблица [(столбец1[, ...])]
{[DEFAULT] VALUES | VALUES {(значение1[, ...]) | DEFAULT}
| оператор_SELECT}
[RETURNING { * | столбец [AS выходное_имя][, ...] }]
где:
(столбец1[, ...])
Указывает один или несколько столбцов целевой таблицы. Список должен
быть заключен в скобки, а столбцы должны быть разделены запятыми.
DEFAULT
Позволяет вставить одну строку, полностью состоящую из значений по умол
чанию.
RETURNING { * | столбец [AS выходное_имя][, ...] }
Возвращает значения, вставленные в результате выполнения оператора. Вы
можете использовать звездочку для возврата значений всех столбцов либо яв
но перечислить столбцы с указанием их выходных имен. Вы можете исполь
зовать RETURNING, к примеру, для возврата значения автоматически гене
рируемого первичного ключа.
PostgreSQL пытается автоматически приводить типы значений, указанных в VA0
LUES или получаемых в SELECT, если они не соответствуют типам столбцов
в целевой таблице.
SQL Server
SQL Server имеет расширенную поддержку оператора INSERT по сравнению со
стандартом ANSI. В частности, поддерживаются некоторые специальные функ
ции для работы с наборами строк, а также возможность вставлять результаты
работы хранимых процедур сразу в целевую таблицу. Синтаксис оператора сле
дующий:
[WITH табличное_выражение[, ...]]
INSERT [TOP ( число ) [PERCENT]]
[INTO] таблица [(столбец1[, ...])]
[OUTPUT выражение INTO {@табличная_переменная | таблица}
[ (список_столбцов[, ...]) ]]
{[DEFAULT] VALUES | VALUES (значение1[, ...]) |
оператор_select | EXEC[UTE] процедура [[@параметр =]
значение] [OUTPUT] [, ...]]}
где:
352 Глава 3. Справочник операторов SQL
WITH табличное_выражение
Объявляет именованный временный набор строк, определяемый оператором
SELECT.
INSERT [INTO] таблица
Определяет в качестве целевого объекта для вставки таблицу, представление
или функцию, работающую с набором строк (rowset function). При вставке
строк в представление должна затрагиваться только одна базовая таблица
представления. Функции, работающие с наборами строк, позволяют полу
чать данные из специфических или внешних источников данных, таких как
потоки XML, файловые структуры для полнотекстового поиска (специальные
структуры для хранения внутри базы данных документов типа MS Word или
слайдов MS PowerPoint) и внешних источников данных, таких как таблицы
Excel. Примеры приводятся позднее в этом разделе. В SQL Server для опера
тора INSERT поддерживаются две функции, работающие с наборами строк.
OPENQUERY
Выполняет указанный передаваемый запрос на связанном сервере. Позво
ляет эффективно выполнить оператором INSERT вставку записей в источ
ник, внешний по отношению к SQL Server. Источник данных должен быть
объявлен как связанный сервер.
OPENROWSET
Выполняет указанный передаваемый запрос на внешнем источнике дан
ных. Эта функция похожа на OPENDATASOURCE, за исключением того,
что OPENDATASOURCE лишь открывает источник данных, но не переда
ет данные оператору INSERT. Функция OPENROWSET предназначена
для эпизодического нерегламентированного использования.
TOP ( число ) [PERCENT]
Указывает точное число строк или процент от общего числа строк, которые
должны быть вставлены. Если число указано не литералом, а выражением, то
оно должно быть заключено в скобки. Если используется ключевое слово PER0
CENT, то выражение должно иметь тип FLOAT и иметь значение от 0 до 100.
Если PERCENT не используется, то выражение должно иметь тип BIGINT.
(столбец1[, ...])
Определяет один или несколько столбцов таблицы, в которые вставляются
значения. Столбцы должны быть разделены запятыми, сам список должен
быть в скобках. SQL Server автоматически заполняет столбцы с типами
IDENTITY и TIMESTAMP, а также имеющие значения по умолчанию.
OUTPUT выражение INTO {@табличная_переменная | таблица} [ (список_столбцов[, ...]) ]
Возвращает строки, вставленные командой (по умолчанию INSERT возвра
щает лишь число вставленных строк), и сохраняет их либо в табличную пе
ременную, либо в таблицу. Таблица, в которую возвращаются вставленные
сроки, не должна иметь триггеров, внешних ключей и ограничений CHECK.
Столбцы в этой таблице должны соответствовать указанному во фразе спи
ску столбцов либо, если список столбцов не указан, всем столбцам целевой
таблицы.
INSERT 353
DEFAULT
Позволяет вставить одну строку, полностью состоящую из значений по умол
чанию.
EXEC[UTE] процедура [[@параметр =] значение] [OUTPUT][, ...]]
Дает команду на выполнение динамического оператора TransactSQL, храни
мой процедуры, удаленной процедуры (RPC) или расширенной хранимой
процедуры и сохранение результата выполнения в локальной таблице. Вы
можете задать значения параметров процедуры, а также пометить необходи
мые параметры как выходные (OUTPUT). Поля возвращаемого набора строк
должны соответствовать столбцам целевой таблицы.
SQL Server автоматически генерирует значения для столбцов типа IDENTITY
и TIMESTAMP, поэтому при вставке их можно опускать. Однако значения для
столбцов типа UNIQUEIDENTIFIER автоматически не генерируются, и при
вставке строк эти значения нужно генерировать при помощи функции NEWID():
INSERT INTO guid_sample (global_ID, sample_text, sample_int)
VALUES (NEWID( ), 'insert first record','10000')
GO
При переносе кода с платформы на платформу имейте в виду, что в SQL Server
вставка в столбец типа TEXT или VARCHAR пустой строки (‘’) приводит к со
хранению строки нулевой длины. Это не то же самое, что значение NULL, как на
некоторых других платформах. При вставке строк оператором в форме IN0
SERT…SELECT можно определять подзапрос при помощи WITH, но при этом
нельзя использовать READPAST, NOLOCK и READUNCOMMITED.
Следующий пример иллюстрирует применение INSERT…EXEC. Сначала в при
мере создается временная таблица #ins_exec_container, а потом в эту таблицу
вставляется список содержимого каталога c:\temp. Вторая команда INSERT
вставляет в таблицу sales результат динамического оператора SELECT:
CREATE TABLE #ins_exec_container (result_text
VARCHAR(300) NULL)
GO
INSERT INTO #ins_exec_container
EXEC master..xp_cmdshell "dir c:\temp"
GO
INSERT INTO sales
EXECUTE ('SELECT * FROM sales_2002_Q4')
GO
Эта функциональность может быть очень полезна при построении бизнеслогики
на базе хранимых процедур TransactSQL, например для определения состояния
объектов внутри или вне базы данных и обработки этих результатов в TSQL.
См. также
DELETE
MERGE
SELECT
UPDATE
INTERSECT
Оператор INTERSECT возвращает из двух или более запросов строки, которые
есть в каждом из запросов. В некотором роде оператор INTERSECT похож на
INNER JOIN (см. секцию с описание JOIN).
Оператор INTERSECT относится к классу операторов работы с множествами,
куда также входят операторы EXCEPT и UNION. Все эти операторы использу
ются одинаковым образом для работы с множествами строк, отсюда название
класса операторов.
Синтаксис SQL2003
Теоретически вы можете объединять с помощью оператора INTERSECT произ
вольное число запросов. Синтаксис оператора следующий:
<SELECT_оператор1>
INTERSECT [ALL | DISTINCT]
[CORRESPONDING [BY (столбец1, столбец2, ...)]]
<SELECT_оператор2>
INTERSECT [ALL | DISTINCT]
[CORRESPONDING [BY (столбец 1, столбец2, ...)]]
...
Ключевые слова
ALL
Включает повторяющиеся во всех запросах строки.
DISTINCT
Удаляет повторяющиеся строки из всех результирующих множеств, предше
ствовавших выполнению оператора INTERSECT. Столбцы со значениями
NULL считаются совпадающими. (Если не указано ни ALL, ни DISTINCT, то
используется DISTINCT)
CORRESPONDING
Указывает, что из запросов используются только столбцы с одинаковыми име
нами, даже если в запросах вместо списка столбцов используются звездочки.
BY
Указывает, что из запросов используются только указанные столбцы, даже
если в запросах есть другие столбцы с совпадающими именами. Эту фразу
нужно использовать совместно с CORRESPONDING.
Общие правила
При использовании INTERSECT необходимо помнить только одно: количество
и порядок столбцов в запросах должны быть одинаковыми. Типы столбцов не
обязательно должны совпадать, но должны быть совместимы (например, как
CHAR и VARCHAR). Как правило, в результирующем наборе для каждого столб
ца будет использоваться самый большой (по размерности) тип, соответствующий
этому столбцу в отдельных запросах.
Советы и хитрости
Ни в одной из платформ не поддерживается фраза CORREPONDING BY.
MySQL
Не поддерживается.
Oracle
Oracle поддерживает базовую функциональность операторов INTERSECT и IN0
TERSECT ALL в соответствии со следующим синтаксисом:
<SELECT_оператор1>
INTERSECT
<SELECT_оператор2>
INTERSECT
...
Фраза CORRESPONDING не поддерживается. Вместо INTERSECT DISTINCT
следует использовать функционально эквивалентный INTERSECT. Нельзя ис
пользовать оператор INTERSECT в следующих случаях:
• Если запросы содержат столбцы типов LONG, BLOB, CLOB, BFILE и VARRAY.
• Если запросы содержат фразы FOR UPDATE и выражения TABLE.
Если первый запрос содержит выражения в списке столбцов, то для этих выра
жений при помощи AS должны быть заданы псевдонимы. Также только послед
ний запрос может содержать фразу ORDER BY.
Например, мы можем найти идентификаторы магазинов, в которых были прода
жи, с помощью следующего запроса:
SELECT stor_id FROM stores
INTERSECT
SELECT stor_id FROM sales
INTERSECT 357
PostgreSQL
PostgreSQL поддерживает операторы INTERSECT и INTERSECT ALL в соответ
ствии со следующим синтаксисом:
<SELECT_оператор1>
INTERSECT [ALL]
<SELECT_оператор2>
INTERSECT [ALL]
...
PostgreSQL не поддерживает оператор INTERSECT для запросов, содержащих
фразу FOR UPDATE, и не поддерживает фразу CORRESPONDING. Вместо IN0
TERSECT DISTINCT следует использовать функционально эквивалентный IN0
TERSECT.
Самый первый запрос не может содержать фразы LIMIT и ORDER BY. После
дующие запросы могут содержать эти фразы, но такие запросы должны быть за
ключены в скобки. Иначе самое последнее вхождение LIMIT и ORDER BY будет
применено к конечному результату. Например, вы могли бы получить список
авторов, являющихся сотрудниками и фамилии которых начинаются на ‘P’,
следующим запросом:
SELECT a.au_lname
FROM authors AS a
WHERE a.au_lname LIKE 'P%'
INTERSECT
SELECT e.lname
FROM employee AS e
WHERE e.lname LIKE 'P%';
SQL Server
SQL Server поддерживает оператор INTERSECT, используя базовый синтаксис
ANSI:
<SELECT_оператор1>
INTERSECT [ALL]
<SELECT_оператор2>
INTERSECT [ALL]
...
В качестве названий столбцов результирующего множества используются назва
ния столбцов из первого запроса. Любые имена или псевдонимы столбцов, ис
пользуемые в ORDER BY, должны быть указаны в первом запросе. При
иcпользовании операторов INTERSECT (или EXCEPT) для нескольких запро
сов выполнение происходит следующим образом: сначала выполняется множе
ственный оператор для первой пары запросов, потом промежуточный результат
соединяется со следующим запросом и т. д. Порядок выполнения определяется
в первую очередь скобками, затем выполняется INTERSECT, а самый низкий
приоритет – у операторов EXCEPT и UNION.
Также обратите внимание, что в качестве альтернативы вы можете использовать
операторы NOT IN и NOT EXISTS вместе с коррелированными подзапросами.
Пример приводится в описаниях операторов IN и EXISTS.
358 Глава 3. Справочник операторов SQL
См. также
EXCEPT
SELECT
UNION
IS
Оператор IS используется для проверки значения на NULL.
Синтаксис SQL2003
{WHERE | {AND | OR}} выражение IS [NOT] NULL
Ключевые слова
{WHERE | {AND | OR}} выражение IS NULL
Возвращает булево значение TRUE, если выражение имеет значение NULL,
и FALSE в противном случае. Проверку на NULL можно использовать во
фразе WHERE или сочетать с другими выражениями с помощью AND и OR.
NOT
Инвертирует предикат: оператор возвращает TRUE, если выражение не рав
но NULL, и FALSE в противном случае.
Общие правила
Так как NULL соответствует неизвестному значению, то для проверки на NULL
вы не можете использовать обычные операторы сравнения. Например, ни выра
жение X=NULL, ни X<>NULL не могут быть истинными, так как неизвестно,
равно X или не равно неизвестному значению.
Вместо обычных операторов сравнения следует использовать оператор IS NULL.
Будьте внимательны: не пишите слово NULL в кавычках, так как при этом оно
будет воспринято как литерал «NULL», а не как специальное значение NULL.
Советы и хитрости
В некоторых платформах для проверки на пустое значение можно использовать
обычные операторы сравнения. Но в любом случае, стандартный оператор IS
[NOT] NULL поддерживается всеми платформами.
Иногда проверка на NULL может усложнить фразу WHERE. Например, вместо
простого предиката, проверяющего поле stor_id:
JOIN 359
См. также
SELECT
WHERE
JOIN
Подфраза JOIN позволяет извлечь строки из двух или более логически связан
ных таблиц. Вы можете использовать различные условия соединения таблиц
и типы соединений, при этом типы поддерживаемых соединений могут значи
тельно варьироваться между платформами.
Синтаксис SQL2003
FROM таблица [AS псевдоним] {CROSS JOIN |
[NATURAL] [тип_соединения] JOIN
соединяемая_таблица [[AS] псевдоним]
{ ON условие1 [{AND | OR} условие2] [...] |
USING (столбец1[, ...]) }}
[...]
Ключевые слова
FROM таблица
Указывает первую таблицу или представление, участвующую в соединении.
NATURAL
Указывает, что соединение (неважно, внешнее или внутреннее) выполняется
по равенству значений во всех столбцах с одинаковыми названиями. При
этом вам не нужно использовать фразы ON и USING. Запрос с натуральным
соединением будет выполнен с ошибкой, если в соединяемых таблицах не
окажется столбцов с одинаковыми именами.
360 Глава 3. Справочник операторов SQL
Общие правила
Соединения позволяют получать в результирующем множестве строки, состав
ленные из логически связанных строк двух или более таблиц. Вы можете ис
пользовать либо ANSIсинтаксис соединений, либо тэтасоединения. Тэтасоеди
нения являются старым способом соединений, при котором условия соединения
пишутся во фразе WHERE.
К примеру, у вас может быть таблица employee с информацией о всех сотрудни
ках компании. Однако в этой таблице нет полной информации о должности со
трудника, а есть только идентификатор должности job_id. Описание должности
(поля description и title) хранится в таблице job. Используя соединение, вы лег
ко можете получить результат, содержащий столбцы из обеих таблиц. Следую
щие примеры иллюстрируют тэтасоединения и соединения в синтаксисе стан
дарта ANSI:
/* Тэта соединение */
SELECT emp_lname, emp_fname, job_title
FROM employee, jobs
WHERE employee.job_id = jobs.job_id;
/* ANSI соединение */
SELECT emp_lname, emp_fname, job_title
FROM employee
JOIN jobs ON employee.job_id = jobs.job_id;
Если вы используете в одном запросе несколько столбцов, то вы должны избе
гать неоднозначности. Другими словами, либо имена столбцов должны быть
362 Глава 3. Справочник операторов SQL
Советы и хитрости
Если вы не указываете явно тип соединения, то по умолчанию используется IN0
NER JOIN. Имейте в виду, что существует много типов соединения, каждый со
своими правилами и особенностями поведения, описанными в предыдущем раз
деле.
В общем случае желательно описывать условия соединения во фразе JOIN, а не
в WHERE. Это не только делает ваш код чище, позволяя отделять условия со
единения от условий поиска, но и позволяет избежать некоторых ошибок, встре
чающихся в некоторых платформах в реализации внешних соединений через ус
ловия в WHERE.
В целом мы не рекомендуем в целях ускорения разработки применять ключевые
слова типа NATURAL, так как при этом подфраза с соединением не будет обнов
лена автоматически при изменении структуры таблиц. При изменениях таблиц
без соответствующих изменений запросов запросы могут перестать работать кор
ректно.
Не во всех платформах поддерживаются все типы соединений, поэтому деталь
ная информация по каждой платформе приводится далее.
MySQL
MySQL поддерживает большую часть типов соединений, определенных стандар
том ANSI, кроме натуральных внутренних соединений (натуральные соединения
в MySQL бывают только внешние). Синтаксис соединений в MySQL следующий:
FROM таблица [AS псевдоним]
{[STRAIGHT_JOIN соединяемая_таблица] |
{ {[INNER] | [CROSS] |
[NATURAL] [ {LEFT | RIGHT | FULL} [OUTER] ]}
JOIN соединяемая_таблица [AS псевдоним]
{ ON условие1 [{AND|OR} условие2] [...] } |
USING (столбец1[, ...]) }}
[...]
где:
STRAIGHT_JOIN
Заставляет оптимизатор соединять таблицы в порядке их перечисления во
фразе FROM, в остальном это ключевое слово эквивалентно обычному JOIN.
Эта возможность была введена изза того, что иногда MySQL выбирает невер
ный порядок соединения.
Примеры приводятся в предыдущем разделе «Общие правила».
Oracle
Oracle полностью поддерживает стандарт ANSI в плане соединений. Однако под
держка стандартного синтаксиса соединений появилась лишь начиная с 9й вер
сии, поэтому старый код использует только соединения при помощи условий
в WHERE. Старый синтаксис Oracle для внешних соединений состоял в добавле
нии (+) к столбцам с противоположной стороны направления соединения. При
чиной этого является тот факт, что к таблице, из которой выбирались только
присоединившиеся строки, добавлялась строка из значений NULL.
Например, в следующем запросе выполняется RIGHT OUTER JOIN таблиц
authors и publishers. Запрос в старом синтаксисе соединений выглядит следую
щим образом:
SELECT a.au_lname AS 'first name',
a.au_fname AS 'last name',
p.pub_name AS 'publisher'
FROM authors a, publishers p
WHERE a.city(+) = p.city
ORDER BY a.au_lname DESC
А тот же запрос в стандартом синтаксисе ANSI имеет следующий вид:
SELECT a.au_lname AS 'first name',
a.au_fname AS 'last name',
p.pub_name AS 'publisher'
FROM authors AS a
RIGHT OUTER JOIN publishers AS p ON a.city = p.city
ORDER BY a.au_lname DESC
JOIN 367
01 OCT 05 101 10
02 OCT 05 101
03 OCT 05 101
04 OCT 05 101 17
05 OCT 05 101 23
06 OCT 05 101
01 OCT 05 102
02 OCT 05 102
03 OCT 05 102 43
04 OCT 05 102 99
05 OCT 05 102
06 OCT 05 102 87
Получение того же результата без использования секционированных соедине
ний было бы более сложным и менее эффективным.
PostgreSQL
PostgreSQL полностью поддерживает стандарт ANSI. Примеры различных ти
пов соединений приводятся в предыдущем разделе «Общие правила».
368 Глава 3. Справочник операторов SQL
SQL Server
SQL Server поддерживает соединения типов INNER, OUTER и CROSS с исполь
зованием фразы IN. Синтаксис NATURAL и USING не поддерживается. Синтак
сис соединений в SQL Server следующий:
FROM таблица [AS псевдоним]
{ {[INNER] | [CROSS] | [ {LEFT | RIGHT | FULL} [OUTER] ]}
JOIN соединяемая_таблица [AS псевдоним]
{ ON условие1 [{AND|OR} условие2] [...] } }
[...]
Примеры различных типов соединений приводятся в предыдущем разделе «Об
щие правила».
См. также
SELECT
WHERE
LIKE
Оператор LIKE позволяет проверять строки на соответствие различным шабло
нам. Преимущественно это используется во фразе WHERE операторов SELECT,
INSERT, UPDATE и DELETE. Шаблоны строк могут содержать групповые сим
волы, набор поддерживаемых групповых символов зависит от платформы.
Синтаксис SQL2003
WHERE выражение [NOT] LIKE шаблон
[ESCAPE управляющий_символ]
Ключевые слова
WHERE выражение LIKE
Возвращает булево значение TRUE, если выражение соответствует шаблону.
Выражение может быть столбцом, константой, переменной, скалярной функ
цией или любой комбинацией перечисленного. Но выражение не может быть
пользовательского типа и типа LOB.
NOT
Инвертирует предикат: оператор возвращает TRUE, если выражение не соот
ветствует шаблону, и FALSE в противном случае.
LIKE 369
ESCAPE управляющий_символ
Позволяет искать в строке символы, которые в шаблоне обычно трактуются
как групповые.
Общие правила
Проверка строк по шаблонам выполняется оператором LIKE очень просто, но
нужно помнить о нескольких правилах:
• Имеют значение все символы, включая пробелы в начале и конце строк.
• С помощью LIKE можно сравнивать различные типы данных, но разные типы
данных поразному хранят шаблоны. В частности, будьте внимательны с от
личиями между типами CHAR, VARCHAR и DATE.
• LIKE может помешать использованию индексов или привести к менее опти
мальному использованию индекса, нежели простое сравнение.
Стандарт ANSI содержит два групповых символа, поддерживаемых всеми плат
формами:
%
Соответствует любой строке.
_ (подчеркивание)
Соответствует любому одиночному символу.
Первый запрос в следующем примере возвращает список городов, в названии ко
торых есть слово «ville». Второй запрос возвращает авторов, имена которых не
Sheryl или Cheryl (или Aheryl, Bheryl, Dheryl и т. д):
SELECT * FROM authors
WHERE city LIKE '%ville%';
SELECT * FROM authors
WHERE au_fname NOT LIKE '_heryl';
На некоторых платформах поддерживаются дополнительные групповые симво
лы. Они описываются в дальнейших разделах, посвященных отдельным плат
формам.
Фраза ESCAPE позволяет вам искать в строках групповые символы. С помощью
ESCAPE вы можете выбрать управляющий символ – символ, который не ис
пользуется в шаблоне строки. Любой групповой символ, которому предшествует
управляющий символ, будет трактоваться как обычный символ. Например, мы
можем с помощью следующего запроса просмотреть столбец comments таблицы
sales_detail, чтобы узнать, упоминал ли ктолибо из клиентов недавно введен
ные скидки:
SELECT ord_id, comment
FROM sales_detail
WHERE comment LIKE '%~%%' ESCAPE '~'
В этом примере первый символ % является групповым, но второй символ % рас
сматривается просто как символ процента, так как перед ним идет управляю
щий символ.
370 Глава 3. Справочник операторов SQL
Советы и хитрости
Основная польза оператора LIKE заключается в возможности использования
групповых символов. Оператор LIKE возвращает булево значение TRUE, если
при сравнении найдены одно или несколько совпадений.
При использовании LIKE важна чувствительность платформы к регистру сим
волов. Например, SQL Server по умолчанию не чувствителен к регистру симво
лов (хотя можно настроить и противоположное поведение), поэтому строки DAD
и dad при сравнении будут считаться одинаковыми. Oracle чувствителен к реги
стру символов, поэтому строки DAD и dad считаются разными.1 Вот пример, ил
люстрирующий этот момент:
SELECT *
FROM authors
WHERE lname LIKE 'LARS%'
Этот запрос, будучи выполненным на SQL Server, вернет фамилии типа larson
и lars, хотя шаблон для поиска задан в верхнем регистре. Oracle, однако, не вер
нет ни larson, ни lars, так как он выполняет сравнение с точностью до регистра
символов.
MySQL
MySQL поддерживает оператор LIKE в соответствии со стандартом ANSI. В нем
поддерживаются как оба групповых символа (% и _), так и фраза ESCAPE.
Также в MySQL есть специальные функции REGEXP, RLIKE, NOT REGEXP
и NOT RLIKE для работы с регулярными выражениями. Начиная с версии 3.23.4
MySQL по умолчанию не чувствителен к регистру символов.
Oracle
Oracle поддерживает оператор LIKE в соответствии со стандартом ANSI. В нем
поддерживаются как оба групповых символа (% и _), так и фраза ESCAPE. Син
таксис оператора LIKE в Oracle следующий:
WHERE выражение [NOT] {LIKE | LIKEC | LIKE2 |
LIKE4} шаблон
[ESCAPE управляющий_символ]
Специфические элементы синтаксиса Oracle имеют следующие значения:
LIKEC
Использует полный набор символов UNICODE.
LIKE2
Использует UNICODE USC2.
LIKE4
Использует UNICODE UCS4.
PostgreSQL
PostgreSQL поддерживает оператор LIKE в соответствии со стандартом ANSI.
В нем поддерживаются как оба групповых символа (% и _), так и фраза ESCAPE.
По умолчанию PostgreSQL чувствителен к регистру символов, однако в нем под
держивается функция ILIKE для регистронезависимого сравнения с шаблона
ми. Также вы можете использовать ~~ вместо LIKE, ~~* вместо ILIKE и !~~
и !~~* вместо NOT LIKE и NOT ILIKE соответственно. Эти операторы являются
расширениями стандарта ANSI.
Например, следующие запросы функционально эквивалентны:
SELECT * FROM authors
WHERE city LIKE '%ville';
SELECT * FROM authors
WHERE city ~~ '%ville';
Так как шаблоны этих запросов написаны в нижнем регистре, то вы можете
столкнуться с проблемами, – запросы не будут возвращать значения, хранимые
в верхнем регистре, такие как ‘BROWNSVILLE’, ‘NASHVILLE’ и ‘HUNTS0
VILLE’. Вы можете обойти эту проблему следующими способами:
Преобразуем значения в верхний регистр
SELECT * FROM authors
WHERE city LIKE UPPER('%ville');1
Используем регистронезависимый оператор
SELECT * FROM authors
WHERE city ~~* '%ville';
SELECT * FROM authors
WHERE city ILIKE '%ville';
В PostgreSQL также поддерживаются регулярные выражения по стандарту
POSIX. Их рассмотрение выходит за рамки этой книги, поэтому за подробной
информацией обращайтесь к документации.
SQL Server
SQL Server поддерживает оператор LIKE в соответствии со стандартом ANSI.
В нем поддерживаются как оба групповых символа (% и _), так и фраза ES0
CAPE. Также дополнительно поддерживаются следующие групповые символы:
[]
Соответствует любому значению из указанного множества (например, [abc])
или диапазона (например, [k0n]).
[^ ]
Соответствует любому значению не из указанного множества или диапазона.
См. также
SELECT
UPDATE
DELETE
WHERE
MERGE
Оператор MERGE является в некотором роде оператором CASE для DML.
MERGE комбинирует INSERT и UPDATE в один оператор, включающий функ
циональность обоих.
По сути оператор MERGE сравнивает записи исходной и целевой таблицы. Если
запись есть и в той и в другой таблице, то при заданных условиях запись целевой
таблицы обновляется значениями записи исходной таблицы. Если же в целевой
таблице нет записи из исходной таблицы, то такая запись вставляется в целевую
таблицу. Оператор MERGE впервые появился в стандарте SQL2003.
Синтаксис SQL2003
MERGE INTO {имя_объекта | подзапрос} [ [AS] псевдоним ]
USING источник [ [AS] псевдоним ]
ON условие_поиска
WHEN MATCHED
THEN UPDATE SET столбец = { выражение | DEFAULT }[, ...]
WHEN NOT MATCHED
THEN INSERT [( столбец[, ...] )] VALUES ( выражение[, ...] )
MERGE 373
Ключевые слова
MERGE INTO {имя_объекта | подзапрос}
Указывает для оператора MERGE целевой объект, которым может являться
таблица, обновляемое представление или вложенная таблица.
[AS] псевдоним
Указывает необязательный псевдоним для целевой таблицы.
USING источник
Указывает источник, которым может являться таблица, представление или
подзапрос.
ON условие_поиска
Указывает условие, по которому сопоставляются строки из таблицыисточни
ка и целевой таблицы. Здесь используется такой же синтаксис, как и во фразе
ON оператора JOIN. Например, при работе с таблицами new_hire_emp и emp,
фраза ON могла бы выглядеть как ON emp.emp_id = new_hire_emp.emp_id.
WHEN MATCHED THEN UPDATE SET столбец= { выражение | DEFAULT }[, ...]
Указывает правила обновления столбцов целевой таблицы в том случае, если
найдена строка целевой таблицы, соответствующая строке таблицыисточ
ника.
WHEN NOT MATCHED THEN INSERT [( столбец[, ...] )] VALUES ( выраже
ние[, ...]
Определяет значения строки, вставляемой в целевую таблицу, если для стро
ки исходной таблицы не найдено соответствующей строки в целевой таблице.
Общие правила
Правила использования оператора MERGE достаточно просты:
• Фразы WHEN MATCHED и WHEN NOT MATCHED обязательны, но каж
дая из них в операторе может быть указана не более одного раза.
• В качестве целевого объекта оператора MERGE может выступать таблица,
обновляемое представление или обновляемый подзапрос.
• Если источником оператора MERGE является подзапрос, то его необходимо
заключить в скобки.
• Условие поиска во фразе ON не может содержать ссылки на хранимые проце
дуры и пользовательские функции.
• Условие поиска во фразе ON может содержать несколько элементов, соеди
ненных операторами AND и OR.
• Если во фразе WHEN NOT MATCHED не указан список столбцов, то подра
зумевается использование всех столбцов целевой таблицы в порядке их сле
дования в таблице.
Все остальные правила оператора MERGE очевидны. Например, столбцы, ука
занные во фразе WHEN MATCHED, должны быть обновляемыми.
374 Глава 3. Справочник операторов SQL
Советы и хитрости
Оператор MERGE иногда называют оператором «upsert», так как он позволяет
обновить существующие записи (UPDATE) и вставить отсутствующие (INSERT)
одной командой.
Самое сложное в использовании оператора MERGE – это осознать и привыкнуть
к идее условного выполнения либо INSERT, либо DELETE.
Представим себе, что у нас есть две таблицы – EMP и NEW_HIRE. Таблица EMP
содержит информацию обо всех сотрудниках компании, успешно прошедших
90дневный испытательный срок при начале работы. Записи в таблице EMP мо
гут также иметь различные статусы: активная, неактивная, завершенная. Наем
каждого нового сотрудника записывается в таблицу NEW_HIRE, а через 90 дней
запись переносится в таблицу EMP. Однако компания каждое лето нанимает
стажеров из колледжей, поэтому возможна ситуация, что нанятые сотрудники
уже есть в таблице EMP с прошлого года. На псевдокоде бизнесзадачу можно
описать следующим образом:
Цикл по каждой записи таблицы NEW_HIRE
Найти соответствующую запись в таблице EMP
Если запись в таблице EMP найдена
Обновить запись в таблице EMP
Иначе
Вставить запись в таблицу EMP
Конец
Конец цикла
Мы могли бы написать достаточно сложную хранимую процедуру, проверяю
щую все записи таблицы NEW_HIRE и выполняющую UPDATE для бывших
стажеров и INSERT для полностью новых сотрудников. Однако оператор MER0
GE решает эту задачу намного проще:
MERGE INTO emp AS e
USING (SELECT * FROM new_hire) AS n
ON e.empno = n.empno
WHEN MATCHED THEN
UPDATE SET
e.ename = n.ename,
e.sal = n.sal,
e.mgr = n.mgr,
e.deptno = n.deptno
WHEN NOT MATCHED THEN
INSERT ( e.empno, e.ename, e.sal, e.mgr, e.deptno )
VALUES ( n.empno, n.ename, n.sal, n.mgr, n.deptno );
Как видите, оператор MERGE очень полезен для загрузки данных.
MySQL
MySQL не поддерживает оператор MERGE. Однако вы можете использовать функ
ционально и синтаксически похожий оператор REPLACE для тех же целей.
MERGE 375
Oracle
Oracle поддерживает оператор MERGE с небольшими расширениями, которые
становятся очевидны при простом сравнении синтаксиса оператора в Oracle
и в стандарте ANSI:
MERGE INTO [схема.]{имя_объекта | подзапрос} [псевдоним]
USING [схема.]источник [псевдоним]
ON ( условие_поиска )
WHEN MATCHED THEN
UPDATE SET столбец = { выражение | DEFAULT }[, ...]
WHEN NOT MATCHED THEN
INSERT ( столбец[, ...] ) VALUES ( выражение[, ...]
[LOG ERRORS [INTO [схема.]таблица] [( выражение )]
[REJECT LIMIT { целое_число | UNLIMITED}]]
Отличия между стандартом ANSI и реализацией Oracle включают:
• В Oracle при указании псевдонимов для таблиц не используется ключевое
слово AS.
• Условие поиска в ON должно быть взято в скобки.
• В Oracle во фразе WHEN NOT MATCHED необходимо использовать список
столбцов, необязательный по стандарту ANSI.
Oracle поддерживает журналирование ошибок оператора MERGE с помощью
фразы LOG ERRORS [INTO [схема.]таблица] [( выражение )] [REJECT LIMIT { це
лое_число | UNLIMITED}]. INTO указывает таблицу, в которую записывается ин
формация об ошибках. Если имя таблицы не указано, то Oracle использует таб
лицы с названием ERR$_ плюс 25 первых символов названия таблицы, в кото
рую выполняется вставка. Вы можете указать любое выражение (например,
TO_CHAR(SYSDATE)), которое вы хотите вставлять в таблицу ошибок. REJECT
LIMIT позволяет задать порог числа ошибок, при достижении которого выполне
ние оператора INSERT будет остановлено. (Обратите внимание, что вы не сможе
те журналировать значения столбцов типов LONG, LOB и объектных типов.)
Примеры MERGE приводятся в предыдущих разделах «Общие правила» и «Со
веты и хитрости».
PostgreSQL
Не поддерживается.
SQL Server
SQL Serevr поддерживает свой вариант оператора MERGE начиная с версии SQL
Server 2008. В значительной степени реализация соответствует стандарту ANSI.
Синтаксис оператора следующий:
[WITH табличное_выражение[, ...]]
MERGE [TOP ( число ) [PERCENT]]
[INTO] {имя_объекта | подзапрос} [ [AS] псевдоним ]
USING ( источник ) [ [AS] псевдоним ]
ON условие_поиска
WHEN MATCHED
THEN { UPDATE SET столбец = { выражение | DEFAULT }[, ...]
376 Глава 3. Справочник операторов SQL
| DELETE }
WHEN [{[TARGET] | SOURCE}] NOT MATCHED
THEN INSERT [( столбец[, ...] )] [DEFAULT] VALUES
(выражение[, ...] )
[OUTPUT выражение [INTO {@табличная_переменная | таблица}
[( список_столбцов[, ...] )]]]
где:
WITH табличное_выражение
Объявляет именованный временный набор строк, определяемый оператором
SELECT.
TOP ( число ) [PERCENT]
Указывает точное число строк или процент от общего числа строк, которые
должны быть вставлены. Если число указано не литералом, а выражением, то
оно должно быть заключено в скобки. Если используется ключевое слово PER0
CENT, то выражение должно иметь тип FLOAT и иметь значение от 0 до 100.
Если PERCENT не используется, то выражение должно иметь тип BIGINT.
WHEN {[TARGET] | SOURCE} NOT MATCHED
Определяет поведение оператора для строк, не найденных либо в таблицеис
точнике (SOURCE), либо в целевой таблице (TARGET). Если не указано ни
SOURCE, ни TARGET, то по умолчанию подразумевается TARGET, то есть
фраза WHEN NOT MATCHED эквивалентна WHEN TARGET NOT MAT0
CHED. Фразу WHEN SOURCE NOT MATCHED следует использовать с до
полнительными условиями поиска, все из которых должны быть удовлетво
рены. В противном случае следует использовать WHEN TARGET NOT MAT0
CHED. Вы можете использовать две фразы WHEN SOURCE NOT MAT0
CHED, определяющих разные условия для операций DELETE и UPDATE.
OUTPUT выражение INTO {@табличная_переменная | таблица} [ (список_столбцов[, ...]) ]
Возвращает строки, вставленные командой (по умолчанию MERGE возвра
щает лишь число вставленных или обновленных строк), и сохраняет их либо
в табличную переменную, либо в таблицу. Таблица, в которую возвращаются
вставленные сроки, не должна иметь триггеров, внешних ключей и ограниче
ний CHECK. Столбцы в этой таблице должны соответствовать указанному во
фразе списку столбцов, либо, если список столбцов не указан, всем столбцам
целевой таблицы.
Оператор MERGE не только позволяет указать список столбцов для обновления
или вставки. Для столбца может использоваться следующий синтаксис {DELE0
TED | INSERTED | таблица_источник}.{* | столбец}, либо можно использовать ключе
вое слово $ACTION ($ACTION автоматически заменяется на INSERT, UPDATE
или DELETE в зависимости от реально выполненной команды). SQL Server также
поддерживает псевдотаблицы inserted и deleted, которые используются в триг
герах для поддержки целостности при выполнения MERGE. Значения столбца
для фразы OUTPUT можно брать из псевдотаблиц inserted и deleted. Также, ес
ли на целевой таблице созданы триггеры типа AFTER на действия INSERT, UP0
DATE и DELETE, то они будут запускаться соответствующими действиями опе
ратора MERGE.
OPEN 377
См. также
INSERT
JOIN
SELECT
SUBQUERY
UPDATE
OPEN
Оператор OPEN является одним из четырех операторов (наряду с FETCH, DE0
CLARE и CLOSE) для работы с курсорами. Курсоры позволяют вместо одновре
менной обработки множества строк обрабатывать каждую строку отдельно.
OPEN открывает курсор, объявленный ранее при помощи оператора DECLARE
CURSOR.
Использование курсоров очень полезно, так как реляционные СУБД оперируют
множествами строк, а большинство клиентских приложений работают с данны
ми построчно. Курсоры дают возможность обрабатывать в каждый момент вре
мени только одну запись, что и требуется для клиентских программ.
Синтаксис SQL2003
OPEN имя_курсора
Ключевые слова
OPEN имя_курсора
Открывает указанный курсор, предварительно объявленный оператором DE0
CLARE CURSOR.
Общие правила
Основными шагами работы с курсором являются:
1. Создание курсора (команда DECLARE).
2. Открытие курсора (команда OPEN).
3. Работа с курсором (команда FETCH).
4. Закрытие курсора (команда CLOSE).
Выполняя эти шаги, можно создать результат, аналогичный команде SELECT,
и при этом работать с каждой строкой результата отдельно.
В следующем примере мы открываем курсор для получения имен всех авторов
из таблицы authors:
378 Глава 3. Справочник операторов SQL
Советы и хитрости
Наиболее распространенной ошибкой, связанной с оператором OPEN, являются
незакрытые курсоры. Хотя в этом разделе мы рассматриваем оператор OPEN от
дельно, он всегда должен использоваться совместно с DECLARE, FETCH и CLO0
SE. Если вы забыли закрыть курсор, то вы не получите сообщения об ошибке, но
открытый курсор будет продолжать удерживать блокировки и использовать
оперативную память и другие ресурсы сервера. Незакрытые курсоры могут при
вести к проблемам, аналогичным утечке памяти. Если вы больше не используете
курсор, он все равно занимает память, которой сервер базы данных мог бы найти
лучшее применение. Стоит потратить немного дополнительного времени и удо
стовериться, что все открытые курсоры корректно закрываются.
Курсоры часто используются в хранимых процедурах для пакетной обработки
данных. Причиной является необходимость выполнять какието действия над ка
ждой строкой в отдельности, а не над всем множеством сразу. Но изза того, что
курсоры работают с отдельными записями, а не с множествами записей, они час
то оказываются медленнее, чем другие способы доступа к данным. Важно крити
чески анализировать необходимость курсоров в каждой ситуации. Многие зада
чи, такие как заковыристые DELETE или сложные UPDATE, можно решать с по
мощью грамотного использования JOIN и WHERE, а не с помощью курсоров.
MySQL
MySQL поддерживает оператор OPEN полностью в соответствии со стандартом.
Oracle
Oracle полностью поддерживает стандарт ANSI, а также позволяет при откры
тии курсора передавать в него параметры:
OPEN имя_курсора [ параметр1[, ...]]
PostgreSQL
PostgreSQL не поддерживает оператор OPEN CURSOR. В PostgreSQL курсоры
неявно открываются при их объявлении.
SQL Server
В дополнение к стандартному оператору OPEN, в SQL Server можно открывать
«глобальные» курсоры, используя следующий синтаксис:
OPEN [GLOBAL] имя_курсора
ORDER BY 379
где:
имя_курсора
Указывает имя курсора (или строковую переменную, содержащую это имя),
предварительно объявленного оператором DECLARE CURSOR.
GLOBAL
Позволяет нескольким пользователям обращаться к курсору, даже если им
явно не было выдано разрешение на этот курсор. Если ключевое слово GLO0
BAL не используется, то подразумевается создание локального курсора.
В SQL Server можно создавать курсоры разного типа. Если курсор объявлен с па
раметрами INSENSITIVE и STATIC, то при его открытии создается временная
таблица, в которой хранится результирующее множество строк курсора. Анало
гично, если при объявлении курсора используется KEYSET, то при открытии
создается временная таблица для хранения множества ключей.
См. также
CLOSE
DECLARE
FETCH
SELECT
ORDER BY
Фраза ORDER BY используется для определения порядка сортировки результа
та, возвращаемого оператором SELECT.
Синтаксис SQL2003
ORDER BY {выражение [COLLATE схема_упорядочения]
[ASC | DESC]}[, ...]
Ключевые слова
ORDER BY
Указывает порядок, в котором должны возвращаться строки результата за
проса. Без ORDER BY вам не следует ожидать вывода строк в определенном
порядке, даже если вы используете GROUP BY и результат выглядит отсор
тированным.
выражение
Указывает элемент запроса, определяющий порядок сортировки результи
рующего множества. Вы можете указать несколько выражений для сортиров
380 Глава 3. Справочник операторов SQL
ки. Обычно выражение содержит имя или псевдоним столбца запроса, однако
возможны и более сложные выражения, например salary*1.02. Стандарт
SQL92 позволял указывать порядковые номера столбцов, но в SQL2003 эта
функциональность была запрещена и ее не следует использовать в запросах.
COLLATE схема_упорядочения
Позволяет использовать в ORDER BY схему упорядочения, отличную от ис
пользуемой по умолчанию.
ASC | DESC
Указывает, что сортировка результирующего множества должна произво
диться по возрастанию (ASC) или убыванию (DESC) выражения.
Общие правила
Во фразе ORDER BY можно ссылаться на столбцы, перечисленные во фразе SE0
LECT, причем желательно использовать псевдонимы:
SELECT au_fname AS first_name, au_lname AS last_name
FROM authors
ORDER BY first_name, last_name
ORDER BY сортирует данные поочередно по каждому выражению слева напра
во. То есть результирующее множество сначала сортируется по первому указан
ному столбцу; строки, имеющие одинаковые значения в первом столбце, сорти
руются по второму столбцу; строки, имеющие одинаковые значения в первом
и втором столбцах, сортируются по третьему и т. д.
Атрибуты ASC/DESC и схема упорядочения определяются индивидуально для
каждого столбца и не зависят от других столбцов. Поэтому вы можете отсорти
ровать результат по возрастанию значений одного столбца, а затем по убыванию
значений другого столбца:
SELECT au_fname AS first_name, au_lname AS last_name
FROM authors
ORDER BY au_lname ASC, au_fname DESC
Значения NULL при сортировке всегда идут подряд (то есть считаются равны
ми). В зависимости от платформы пустые значения могут оказаться в начале от
сортированного списка или в конце. Данный запрос на SQL Server:
SELECT title, price
FROM titles
ORDER BY price, title
вернет следующий результат (результат отредактирован для краткости):
title price
Советы и хитрости
При использовании операторов работы с множествами (UNION, EXCEPT, IN0
TERSECT) только последний оператор SELECT может содержать ORDER BY.
Нельзя использовать ORDER BY в подзапросах любого типа.
Некоторые особенности ORDER BY из стандарта SQL92 были отменены
в SQL2003. Вам следует избегать следующего:
Использование псевдонимов таблиц
Например, ORDER BY e.emp_id следует заменить ORDER BY emp_id. При не
однозначности имен столбцов используйте псевдонимы столбцов.
Использование номеров столбцов
Используйте псевдонимы столбцов.
Вы можете сортировать результат не только по значениям столбцов, но и по вы
ражениям на базе столбцов, и даже по литералам:
SELECT SUBSTRING(title,1,55) AS title, (price * 1.15) as price
FROM titles
WHERE price BETWEEN 2 and 19
ORDER BY price, title
При сортировке по выражениям из списка SELECT вам следует использовать
псевдонимы выражений, чтобы упростить ORDER BY.
MySQL
MySQL поддерживает стандарт ANSI за исключением опции COLLATE.
Не следует сортировать по столбцам типа BLOB, так как при этом в сортировке
будет участвовать только некоторое количество первых байт значений, опреде
ленное MAX_SORT_LENGTH. При сортировке по возрастанию значения NULL
идут первыми, при сортировке по убыванию – последними.
382 Глава 3. Справочник операторов SQL
Oracle
Oracle поддерживает стандарт ANSI за исключением фразы COLLATE, а также
предлагает дополнительные опции SIBLINGS и NULLS {FIRST|LAST}. Синтак
сис ORDER BY в Oracle следующий:
ORDER [SIBLINGS] BY
{выражение [ASC | DESC] [NULLS {FIRST | LAST}]}[, ...]
где:
ORDER [SIBLINGS] BY выражение
Сортирует результирующее множество по указанному выражению. Выраже
ние может быть именем столбца, псевдонимом, номером столбца или любым
другим выражением. Фраза ORDER SIBLINGS BY используется в иерархи
ческих запросах и указывает порядок сортировки узловбратьев.
NULLS {FIRST | LAST}
Позволяет явно указать расположение пустых значений в отсортированном
множестве – либо в начале (NULLS FIRST), либо в конце (NULLS LAST). По
умолчанию пустые значения идут в конце при возрастающей сортировке и в на
чале – при убывающей сортировке.
Вы можете эмулировать опцию COLLATE в сессии, используя функцию NLS0
SORT или параметр NLS_SORT. Для того чтобы эмулировать COLLATE для
всех сессий, установите соответствующее значение инициализационного пара
метра NLS_SORT или NLS_LANGUAGE.
Oracle продолжает поддерживать некоторые отмененные функции стандарта
SQL92, например указание номеров столбцов в ORDER BY. Однако не следует вы
полнять сортировку по столбцам типов LOB, VARRAY и вложенным таблицам.
PostgreSQL
PostgreSQL поддерживает стандарт ANSI за исключением фразы COLLATE.
В ORDER BY можно также использовать расширение USING:
ORDER BY {выражение [ASC | DESC | USING оператор]}[, ...]
где:
USING оператор
Указывает используемый при сортировке оператор сравнения. Вы можете ис
пользовать операторы >, <, =, >=, <= и т. д. Сортировку по возрастанию мож
но выполнить, указав USING <, а сортировку по убыванию при помощи US0
ING >.
NULL при сортировке считается наибольшим значением. Поэтому значения
NULL будут идти в конце при сортировке по возрастанию, и в начале – при сор
тировке по убыванию.
SQL Server
SQL Server полностью поддерживает стандарт ANSI, включая опцию COLLATE.
Например, следующий запрос возвращает имена авторов из таблицы authors
в порядке, задаваемом схемой упорядочения SQL_Latin1:
RELEASE SAVEPOINT 383
SELECT au_fname
FROM authors
ORDER BY au_fname
COLLATE SQL_Latin1_general_cp1_ci_as
SQL Server продолжает поддерживать некоторые отмененные функции стандар
та SQL92, например указание номеров столбцов в ORDER BY. NULL при сорти
ровке считается наибольшим значением. Не следует выполнять сортировку по
значениям типа TEXT, NTEXT и IMAGE.
См. также
SELECT
RELEASE SAVEPOINT
Оператор RELEASE SAVEPOINT удаляет точку сохранения, объявленную ра
нее в текущей транзакции.
Синтаксис SQL2003
RELEASE SAVEPOINT имя_контрольной_точки
Ключевые слова
имя_контрольной_точки
Указывает контрольную точку, созданную ранее в этой же транзакции при
помощи оператора SAVEPOINT. Имя контрольной точки должно быть уни
кально в пределах транзакции.
Общие правила
Используйте оператор RELEASE SAVEPOINT для удаления контрольной точки
транзакции. Все контрольные точки, созданные после указанной, также удаля
ются.
Для иллюстрации контрольных точек мы вставим в таблицу несколько строк,
создадим контрольную точку, а затем удалим ее:
INSERT authors (au_id, au_lname, au_fname, contract )
VALUES ('111 11 1111', 'Rabbit', 'Jessica', 1);
SAVEPOINT first_savepoint;
INSERT authors (au_id, au_lname, au_fname, contract )
VALUES ('277 27 2777', 'Fudd', 'E.P.', 1);
INSERT authors (au_id, au_lname, au_fname, contract )
VALUES ('366 36 3636', 'Duck', 'P.J.', 1);
384 Глава 3. Справочник операторов SQL
Советы и хитрости
Операторы COMMIT и ROLLBACK вызывают удаление всех созданных в тран
закции контрольных точек. Оператор ROLLBACK TO SAVEPOINT возвращает
транзакцию в состояние указанной контрольной точки; все контрольные точки,
созданные после указанной, аннулируются.
MySQL
Поддерживает стандартный синтаксис SQL3.
Oracle
Не поддерживается.
PostgreSQL
Поддерживает стандартный синтаксис SQL3, хотя слово SAVEPOINT необяза
тельно:
RELEASE [SAVEPOINT] имя_контрольной_точки
SQL Server
Не поддерживается.
См. также
ROLLBACK
SAVEPOINT
RETURN 385
RETURN
Оператор RETURN завершает выполнение вызванной из SQL функции или хра
нимой процедуры и возвращает результат работы.
Синтаксис SQL2003
RETURN возвращаемое_значение| NULL
Ключевые слова
возвращаемое_значение
Указывает возвращаемое процедурой или функцией значение. Допустимо ис
пользование различного типа значений.
NULL
Завершает функцию, не возвращая результирующее значение.
Общие правила
Используйте оператор RETURN в процедурном коде для завершения работы.
Например, вы могли бы создать функцию, в которой входной параметр исполь
зуется в сложном выражении CASE и из функции возвращается одиночное лег
ко читаемое значение.
Советы и хитрости
Хотя RETURN является отдельным оператором в SQL, он очень тесно переплета
ется с операторами CREATE FUNCTION/PROCEDURE и почти всегда использу
ется в них. Посмотрите разделы, посвященные реализации каждого из этих
двух операторов в различных платформах, чтобы найти информацию о RETURN
в контексте этих операторов.
MySQL
MySQL поддерживает стандартный синтаксис оператора RETURN, за исключе
нием опции NULL:
RETURN возвращаемое_значение
386 Глава 3. Справочник операторов SQL
Oracle
Oracle поддерживает для оператора RETURN стандартный синтаксис ANSI, за
исключением ключевого слова NULL. (Oracle поддерживает возврат пустых зна
чений, но не по синтаксису ANSI.) Oracle поддерживает RETURN только в поль
зовательских функциях и операторах. Возвращаемое значение в CREATE OPE0
RATOR не может иметь тип LONG, LONG RAW и REF. Пользовательские функ
ции поддерживают внутри PL/SQL булев тип данных, но вы не можете вернуть
булево значение в вызывающий sqlоператор. Для хранения булевых значений
используйте тип INT (для значений 0 и 1) либо VARCHAR2 (для значений
‘TRUE’ и ‘FALSE’).
В следующем примере мы создаем функцию, возвращающую значение перемен
ной proj_rev вызывающему процессу:
CREATE FUNCTION project_revenue (project IN varchar2)
RETURN NUMBER
AS
proj_rev NUMBER(10,2);
BEGIN
SELECT SUM(DECODE(action,'COMPLETED',amount,0)
SUM(DECODE(action,'STARTED',amount,0) +
SUM(DECODE(action,'PAYMENT',amount,0)
INTO proj_rev
FROM construction_actions
WHERE project_name = project;
RETURN (proj_rev);
END;
PostgreSQL
PostgreSQL поддерживает для оператора RETURN стандартный синтаксис ANSI,
за исключением ключевого слова NULL:
RETURNS возвращаемое_значение
PostgreSQL позволяет создавать пользовательские функции либо на SQL, либо
на C/C++. Хранимые процедуры в PostgreSQL не поддерживаются, но вы може
те эмулировать их с помощью функции. В этом обсуждении нас интересуют ис
ключительно функции, написанные на SQL.
Возвращаемое значение может иметь базовый тип, сложный тип, тип SETOF,
тип OPAQUE либо тип существующего столбца таблицы. Модификатор SETOF
используется в RETURNS для возврата не одного значения, а множества значе
ний одного типа. Модификатор OPAQUE означает, что RETURNS на самом деле
не возвращает значение. OPAQUE используется только в триггерах.
SQL Server
SQL Server поддерживает RETURN в соответствии со следующим синтаксисом:
RETURN [целочисленное_значение]
Оператор RETURN обычно используется в хранимых процедурах и пользова
тельских функциях. Он позволяет незамедлительно и полностью прервать вы
REVOKE 387
См. также
CREATE/ALTER FUNCTION/PROCEDURE
CREATE/ALTER TRIGGER
REVOKE
Оператор REVOKE существует в двух видах. Первый вид оператора REVOKE
предназначен для отзыва у пользователя или роли привилегий на выполнение
определенных операторов. Второй вид оператора REVOKE предназначен для от
зыва привилегий на объекты и ресурсы базы данных.
Синтаксис SQL2003
Общий синтаксис оператора REVOKE имеет следующий вид:
REVOKE { [специальные_опции] |
{привилегия[, ...] | роль[, ...]} }
ON имя_объекта_базы_данных
FROM владелец_привилегии[, ...]
[GRANTED BY {CURRENT_USER | CURRENT_ROLE}]
{CASCADE | RESTRICT}
388 Глава 3. Справочник операторов SQL
Ключевые слова
специальные_опции
Можно указывать одну из трех следующих опций:
GRANT OPTION FOR
Отзывает у пользователя опцию WITH GRANT OPTION, то есть пользова
тель больше не может передавать привилегии другим пользователям. Са
ми привилегии остаются в силе. (Эта опция применяется только к приви
легиям, но не к ролям.)
HIERARCHY OPTION FOR
Отзывает у пользователя опцию WITH HIERARCHY OPTION, которая по
зволяет выполнять оператор SELECT не только для таблицы, но и для ее
подтаблиц. (Эта опция применяется только к привилегиям, но не к ролям.)
ADMIN OPTION FOR
Отзывает опцию, которая позволяет пользователю назначать роль другим
пользователям. (Эта опция применяется только к привилегиям, но не к ро
лям.)
привилегия
Отзывает привилегии на различные операторы. Привилегии можно комби
нировать произвольным образом.
ALL PRIVILEGES
Отзывает все привилегии, выданные указанному пользователю на указан
ный объект. Применение этой опции не рекомендуется, так как провоци
рует небрежность при работе с привилегиями.
EXECUTE
Отзывает привилегии на выполнение хранимой процедуры, пользователь
ской функции или метода.
SELECT | INSERT | UPDATE | DELETE
Отзывает привилегии на выполнение соответствующего оператора на ука
занный объект базы данных, такой как таблица или представление. Для
привилегий UPDATE, INSERT и SELECT вы можете указать список
столбцов таблицы, которыми будет ограничено выполняемое действие.
REFERENCES
Отзывает у пользователя привилегии на создание любых ограничений,
ссылающихся на указанный объект базы данных как на родительский. Вы
можете указать список столбцов, привилегии на которые будут отозваны.
TRIGGER
Отзывает у пользователя привилегии на создание триггеров на указанные
таблицы. Побочным эффектом такого оператора REVOKE служит удале
ние уже существующих триггеров, зависящих от этой привилегии.
UNDER
Отзывает привилегии на создание подтипов и типизированных таблиц.
REVOKE 389
USAGE
Отзывает привилегии на использование доменов, пользовательских ти
пов, кодировок, схем упорядочения и переводов.
роль
Отзывает определенную роль у пользователя или роли, указанных во FROM.
Например, администратор базы данных мог бы создать роль Reporter, имею
щую доступ на чтение к нескольким таблицам. Когда эта роль назначается
пользователю, пользователь получает доступ к соответствующим таблицам.
Детальная информация приводится в разделе, посвященном оператору
GRANT.
ON имя_объекта_базы_данных
Отзывает привилегии на указанный объект базы данных. SQL2003 не поддер
живает системные привилегии, но такая поддержка есть во многих реализаци
ях. (Подфраза ON не используется при отзыве системных привилегий и ролей.)
В качестве имени_объекта_базы_данных могут использоваться следующие фразы:
{ [TABLE] имя_объекта | DOMAIN имя_объекта |
COLLATION имя_объекта |
CHARACTER SET имя_объекта | TRANSLATION имя_объекта |
TYPE имя_объекта | [SPECIFIC] {ROUTINE | FUNCTION |
PROCEDURE | METHOD}
имя_объекта }
FROM владелец_привилегии
Указывает пользователя или роль, которые теряют отзываемые привилегии.
Слово PUBLIC используется для отзыва привилегий у роли PUBLIC (гло
бального списка пользователей.) Можно перечислить через запятую несколь
ко пользователей или ролей.
GRANTED BY { CURRENT_USER | CURRENT_ROLE }
Опционально используется для указания того, кем была изначально выдана
привилегия. Например, при использовании GRANTED BY CURRENT_USER
привилегия отзывается, только если она была выдана текущим пользовате
лем. В противном случае оператор завершается с ошибкой. Если фраза не ис
пользуется, то по умолчанию подразумевается CURRENT_USER.
RESTRICT | CASCADE
Ограничивает оператор REVOKE только указанной привилегией (RESTRICT)
либо выполняет REVOKE и для всех зависимых привилегий (CASCADE), что
также может привести к удалению объектов, зависящих от привилегий. За
метьте, что REVOKE…RESTRICT завершится с ошибкой при наличии зави
симых привилегий. Зависимые привилегии должны быть отозваны в первую
очередь.
Общие правила
Конкретную привилегию можно отозвать у определенного пользователя, ис
пользуя REVOKE имя_привилегии ON объект_базы_данных FROM имя_пользователя
RESTRICT. Объектную привилегию можно отозвать у всех пользователей, ис
пользуя глобальный список пользователей PUBLIC.
390 Глава 3. Справочник операторов SQL
Советы и хитрости
Большинство платформ разделяют привилегии, выданные на уровне роли, и при
вилегии, выданные на уровне пользователя. (Помните, что роль – это группа
привилегий.) Поэтому возможна ситуация, что пользователю, являющемуся
членом двух ролей, трижды выдана одна и та же привилегия – один раз напря
мую и два раза посредством ролей. В этом случае для лишения пользователя
привилегии нужно отозвать у него эту привилегию напрямую, а также исклю
чить пользователя из обеих ролей.
Важным аспектом оператора REVOKE (а равно и парного оператора GRANT) яв
ляется то, что одни элементы оператора предназначены для работы с объектны
ми привилегиями, а другие – для работы с ролями и административными приви
легиями. Обычно эти элементы не используются одновременно. (Отличия между
объектными привилегиями и административными привилегиями подробно объ
ясняются в разделах, посвященных конкретным платформам.) Например, вы
могли бы отозвать объектные привилегии у роли salespeople или у конкретных
пользователей e_fudd и prince_edward:
REVOKE SELECT ON TABLE authors FROM salespeople RESTRICT;
REVOKE ALL PRIVILEGES ON TABLE sales FROM e_fudd,
prince_edward CASCADE;
Многие табличные привилегии могут выдаваться на уровне столбцов. Отзывают
ся эти привилегии следующим образом:
REVOKE INSERT(au_id, au_fname, au_lname)
ON authors FROM e_fudd;
Фразы со специальными опциями (GRANT OPTION, ADMIN OPTION и HIER0
ARCHY OPTION) используются для запрещения пользователям возможности
передавать свои привилегии и роли другим пользователям. Однако отключение
этих опций не запрещает пользователям продолжать использовать сами роли
и привилегии. Например, мы можем запретить всем членам роли manager пере
давать привилегии на UPDATE определенной таблицы другим пользователям:
REVOKE GRANT OPTION FOR UPDATE ON sales FROM manager CASCADE;
Также с помощью REVOKE вы можете исключить пользователя из роли:
REVOKE manager FROM e_fudd CASCADE;
Хорошей практикой считается писать самодостаточные и логичные операторы
GRANT и REVOKE. В частности, нужно избегать использования CASCADE и ALL
REVOKE 391
PRIVILEGES, так как их действие может быть не очевидно при рассмотрении од
ного оператора.
MySQL
MySQL поддерживает большинство ключевых слов из ANSI, за исключением
TRIGGER, EXECUTE и UNDER. Также в MySQL есть полезная возможность, об
легчающая глобальную выдачу и отзыв привилегий. Описание ключевых слов,
не указанных далее, ищите выше – в разделе, посвященном стандарту ANSI:
REVOKE [ { ALL [PRIVILEGES] |
{SELECT | INSERT | UPDATE} [ (столбец[, ...]) ] | DELETE |
REFERENCES [ (столбец[, ...]) ] } |
{ [ USAGE ] | [{ALTER | CREATE | DROP}] | [FILE] | [INDEX] |
[PROCESS] | [RELOAD] | [SHUTDOWN] |
[CREATE TEMPORARY TABLES] | [LOCK TABLES] |
[REPLICATION CLIENT] | [REPLICATION SLAVE] |
[SHOW DATABASES] | [SUPER] }[, ...]
ON [тип_объекта] {имя_таблицы | * | *.* |имя_базы_данных.*}
FROM пользователь[, ...]
где:
ALL [PRIVILEGES]
Синоним для ALL PRIVILEGES. В MySQL включает все привилегии, приме
нимые к типу объекта, указанному в ON, за исключением GRANT OPTION
(то есть включает привилегии SELECT, INSERT, UPDATE, DELETE и т. д.)
SELECT | INSERT | UPDATE | DELETE
Отзывает, соответственно, привилегии на чтение, вставку, обновление и уда
ление данных из таблиц (или из определенных столбцов таблицы).
REFERENCES
Не реализовано.
USAGE
Отзывает все привилегии пользователя.
{ALTER | CREATE | DROP}
Отзывает привилегии на изменение, создание и удаление таблиц и других
объектов базы данных.
FILE
Отзывает привилегии на чтение и запись файлов при помощи команд SE0
LECT INTO и LOAD DATA.
INDEX
Отзывает привилегии на создание и удаление индексов.
PROCESS
Отзывает привилегии на просмотр выполняющихся процессов при помощи
SHOW FULL PROCESSLIST.
RELOAD
Отзывает привилегии на выполнение команды FLUSH.
392 Глава 3. Справочник операторов SQL
SHUTDOWN
Отзывает привилегии на использование команды MYSQLADMIN SHUT0
DOWN для завершения серверного процесса.
CREATE TEMPORARY TABLES
Отзывает привилегии на создание временных таблиц.
LOCK TABLES
Отзывает привилегии на блокировку с помощью оператора LOCK TABLE таб
лиц, на которые у пользователя есть привилегия SELECT.
REPLICATION CLIENT
Отзывает привилегии на просмотр метаданных о репликации.
REPLICATION SLAVE
Отзывает привилегии на чтение при репликации журналов мастерсервера
подчиненным сервером.
SHOW DATABASES
Отзывает привилегии на выполнение команды SHOW DATABASES.
SUPER
Отзывает у пользователя привилегии на выполнение команд: CHANGE MAS0
TER, KILL, MYSQLADMIN DEBUG, PURGE [MASTER] LOGS и SET GLO0
BAL, а также на открытие новых соединений даже при достижении числом
соединений значения MAX_CONNECTIONS.
ON [тип_объекта] {имя_таблицы | * | *.* | имя_базы_данных.*}
Отзывает привилегии либо на указанную таблицу, либо на все таблицы в те
кущей базе данных (*), либо на все таблицы во всех базах данных (*.*), либо
на все таблицы в указанной базе данных. Можно дополнительно указать тип
объекта (TABLE, FUNCTION или PROCEDURE), привилегии на который от
зываются.
FROM
Отзывает привилегии у одного или нескольких пользователей, перечислен
ных через запятую. Имена пользователей также могут включать суффикс
@host, если вы хотите ограничить отзыв привилегий указанным хостом.
REVOKE имеет некоторые ограничения по размерам: имена пользователей не
могут быть длиннее 16 символов, а имена хостов, баз данных и объектов не мо
гут быть длиннее 60 символов. Имена пользователей могут быть привязаны к оп
ределенным хостам. Более детальная информация приводится в разделе, посвя
щенном оператору GRANT.
Oracle
Оператор REVOKE может использоваться не только для отзыва объектных и сис
темных привилегий, но и для отключения пользователя от роли (или роли от
другой роли). Информация об объектных и системных привилегиях, поддержи
ваемых оператором REVOKE, приводится в разделе, описывающем оператор
GRANT.
[ON { [схема.][объект] |
[DIRECTORY имя_объекта_каталога] |
[JAVA [ { SOURCE | RESOURCE } ] [схема.][объект]] } ]
FROM {пользователь [, ...] | роль[, ...] | PUBLIC}
[CASCADE [CONSTRAINTS]] [FORCE];
где:
объектная_привилегия
Отзывает у пользователя или роли (или нескольких пользователей и ролей)
одну или несколько указанных привилегий на один или несколько объектов
базы данных:
ALL [PRIVILEGES]
Отзывает все выданные на объект привилегии. Так как ALL включает так
же REFERENCES, то при этом необходимо использовать фразу CASCA0
DE. (Смотрите описание REFERENCES ниже.)
ALTER
Отзывает привилегии на изменение существующей таблицы1 оператором
ALTER TABLE.
EXECUTE
Отзывает привилегии на вызов хранимой процедуры, пользовательской
функции или пакета.
INDEX
Отзывает привилегии на создание индексов по таблице.
REFERENCES
Отзывает привилегии на создание ограничений ссылочной целостности.
Требует использования фразы CASCADE CONSTRAINTS.
SELECT | INSERT | DELETE | UPDATE
Отзывает привилегии на выполнение каждого типа операторов для объек
та базы данных. Помните, что привилегия DELETE зависит от привиле
гии SELECT.
системная_привилегия
Отзывает одну или несколько указанных системных привилегий (таких как
CREATE TRIGGER или ALTER USER) у пользователя или роли. Не исполь
зуйте при отзыве системных привилегий фразу ON. Так как системных при
вилегий огромное множество, то мы не будем перечислять их еще раз. Список
системных привилегий Oracle приводится в описании оператора GRANT.
роль
Исключает пользователя или роль из членов указанной роли.
ON
Указывает объект, привилегии на который отзываются. Объектом может быть
таблица, представление, последовательность, хранимая процедура, пользова
тельская функция, пакет, материализованное представление, пользователь
FROM dylan
CASCADE CONSTRAINTS;
Наконец, в следующем примере на определенную таблицу выдаются все приви
легии, а затем часть из них отзывается:
GRANT ALL PRIVILEGES ON emp TO dylan;
REVOKE DELETE, UPDATE ON emp FROM dylan;
PostgreSQL
PostgreSQL поддерживает базовые возможности оператора REVOKE, касающие
ся, в основном, отзыва привилегий на таблицы, представления и последователь
ности. Опции HIERARCHY OPTION FOR и ADMIN OPTION FOR не поддержи
ваются. Синтаксис оператора следующий:
REVOKE [GRANT OPTION FOR]
{ привилегии | { ALL [PRIVILEGES] | {SELECT | INSERT |
DELETE | UPDATE} | RULE | REFERENCES| TRIGGERS | CREATE |
USAGE }[, ...] }
ON { [TABLE] | SEQUENCE | DATABASE | FUNCTION | LANGUAGE |
SCHEMA | TABLESPACE]
имя_объекта[, ...] }
FROM {пользователь | GROUP группа | PUBLIC}[, ...]
[ {CASCADE | RESTRICT} ]
где:
REVOKE [GRANT OPTION FOR] привилегии
Отзывает привилегии на различные операторы, которые можно комбиниро
вать любым образом. GRANT OPTION FOR отзывает привилегию на передачу
пользователем своих привилегий другим пользователям.
ALL [PRIVILEGES]
Отзывает все привилегии, выданные пользователю или роли на указан
ный объект. Эту опцию использовать не рекомендуется, так как она про
воцирует небрежность в работе с привилегиями.
SELECT | INSERT | DELETE | UPDATE
Отзывает привилегии на выполнение соответствующих операторов. Вы
можете указать после таблицы в скобках список столбцов, привилегии на
которые отзываются.
RULE
Отзывает привилегии на создание правил для таблицы или представления.
REFERENCES
Отзывает привилегии на создание и удаление внешних ключей, ссылаю
щихся на указанный объект.
TRIGGERS
Отзывает привилегии на создание и удаление триггеров на таблице.
CREATE
Отзывает привилегии на создание объектов.
REVOKE 397
USAGE
Отзывает привилегии на использование доменов1, пользовательских ти
пов и кодировок.
FROM пользователь[, ...] | PUBLIC | GROUP группа
Указывает пользователя или роль, у которых отзываются привилегии. Клю
чевое слово PUBLIC позволяет отозвать привилегию у роли PUBLIC (роли,
неявно включающей всех пользователей). Несколько пользователей или
групп могут быть перечислены через запятую.
CASCADE | RESTRICT
RESTRICT ограничивает операцию указанной привилегией. CASCADE авто
матически отзывает все зависимые привилегии. Используется только вместе
с GRANT OPTION FOR. По умолчанию используется RESTRICT.
В описании оператора GRANT приводится полный список привилегий, приме
нимых к каждому типу объекта. Вы можете, соответственно, отозвать у пользо
вателя или роли любую имеющуюся у них привилегию.
Реализация оператора REVOKE в PostgreSQL достаточно проста. Единственное,
на что стоит обратит внимание, это то, что группы (GROUP) являются тем же са
мым, что и роли (ROLE). В следующем примере отзываются привилегии у групп
PUBLIC и READ0ONLY:
REVOKE ALL PRIVILEGES ON employee FROM public;
REVOKE SELECT ON jobs FROM read only;
PostgreSQL не поддерживает выдачу привилегий на отдельные столбцы табли
цы или представления.
При отзыве опции GRANT OPTION FOR следует особое внимание обратить на
зависимости. Если вы отзовете у одного пользователя эту опцию с параметром
RESTRICT, то оператор завершится с ошибкой при наличии других пользовате
лей, зависящих от первого. Если же вы отзовете у пользователя опцию GRANT
OPTION FOR с параметром CASCADE, то у других пользователей, зависящих от
первого, будут отозваны сами привилегии, выданные первым пользователем.
SQL Server
В SQL Server оператор REVOKE используется для отмены любых настроек при
вилегий пользователей. Этот момент очень важен, потому что в SQL Server под
держивается оператор DENY, предназначенный для явного запрещения пользо
вателю доступа к определенным ресурсам. REVOKE можно использовать для от
зыва привилегий, выданных оператором GRANT. Для явного запрещения поль
зователю определенных действий используйте DENY.
SQL Server не поддерживает описанные в ANSI опции HIERARCHY OPTION
и ADMIN OPTION. Хотя ADMIN OPTION и отсутствует, поддерживаются не
сколько административных привилегий (CREATE и BACKUP). Оператор имеет
следующий синтаксис:
1 Для процедурных языков отзывает право использовать данный язык для создания
функций. Для схем отзывает право просматривать список объектов в схеме. – Прим.
науч. ред.
398 Глава 3. Справочник операторов SQL
См. также
GRANT
ROLLBACK
Оператор ROLLBACK отменяет действия, выполненные с начала транзакции
или с момента определенной точки сохранения. ROLLBACK также закрывает
открытые курсоры.
400 Глава 3. Справочник операторов SQL
Синтаксис SQL2003
ROLLBACK [WORK]
[AND [NO] CHAIN]
[TO SAVEPOINT точка_сохранения]
Ключевые слова
WORK
Необязательно ключевое слово, не несет смысловой нагрузки.
AND [NO] CHAIN
AND CHAIN завершает текущую транзакцию, но среда выполнения транзак
ции (например, настройка уровня изоляции транзакции) сохраняется для
следующей транзакции. AND NO CHAIN просто завершает транзакцию (этот
вариант используется по умолчанию).
TO SAVEPOINT точка_сохранения
Позволяет откатить не всю транзакцию, а только до указанной точки сохра
нения (выполнить частичный откат). Точка_сохранения может быть литералом
или переменной. Если точки сохранения с указанным именем не существует,
то оператор завершается с ошибкой. Если фраза TO SAVEPOINT опущена, то
все курсоры закрываются. Если фраза TO SAVEPOINT используется, то за
крываются все курсоры, открытые после точки сохранения.
Помимо отката операторов DML (таких как INSERT, UPDATE и DELETE)
ROLLBACK откатывает транзакцию до последнего выполненного оператора
START TRANSACTION, SET TRANSACTION или SAVEPOINT.
Общие правила
ROLLBACK используется для отмены действий транзакции. Этот оператор мож
но использовать как для транзакций, начатых явно с помощью START TRAN
или другого оператора, так и для неявно начинаемых транзакций. ROLLBACK
взаимно исключает COMMIT.
Многие пользователи считают операторы INSERT, UPDATE и DELETE «тран
закциями». Однако транзакции могут состоять из большого числа различных
операторов. Список этих операторов зависит от платформы, но обычно включает
все команды, меняющие данные или объекты базы данных и журналируемые
средствами СУБД. В соответствии со стандартом ANSI любой оператор SQL мо
жет быть откачен с помощью ROLLBACK.
ROLLBACK 401
Советы и хитрости
Важно помнить, что в определенных ситуациях некоторые СУБД используют ав
томатические неявные транзакции, в то время как другие требуют явных тран
закций. Поэтому при переносе кода с одной платформы на другую следует ис
пользовать стандартный, предопределенный способ работы с транзакциями. Мы
рекомендуем всегда явно использовать операторы START TRAN или SET TRAN
для начала транзакций и COMMIT или ROLLBACK для их завершения.
MySQL
MySQL поддерживает простой и понятный механизм транзакций, а также клю
чевое слово CHAIN:
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] TO [SAVEPOINT] точка_сохранения
Опциональное ключевое слово RELEASE позволяет автоматически закрыть поль
зовательское подключение при завершении текущей транзакции.
При создании таблиц в MySQL имейте в виду, что для того, чтобы использовать
ROLLBACK с этой таблицей, она должна быть транзакционнозащищенной.
(Транзакционнозащищенными являются таблицы InnoDB и NDB Cluster. За до
полнительной информацией обращайтесь к описанию оператора CREATE TAB0
LE.) MySQL позволяет выполнять операторы COMMIT и ROLLBACK при ис
пользовании транзакционнонезащищенных таблиц, но в таком случае эти опе
раторы просто игнорируются и выполняются автоматические фиксации после
каждого оператора. Например, если вы вставите данные в транзакционнонеза
щищенную таблицу, а затем выполните ROLLBACK, то вставленные данные не
удалятся.
MySQL по умолчанию работает в режиме AUTOCOMMIT, поэтому любые изме
нения данных автоматически записываются на диск. Вы можете выключить ре
жим AUTOCOMMIT, выполнив команду SET AUTOCOMMIT=0. Вы также мо
жете также контролировать режим автоматической фиксации транзакций на
уровне отдельных операторов, используя BEGIN или BEGIN WORK:
BEGIN;
SELECT @A:=SUM(salary) FROM employee WHERE job_type=1;
BEGIN WORK;
UPDATE jobs SET summmary=@A WHERE job_type=1;
COMMIT;
MySQL автоматически выполняет COMMIT при завершении любого из следую
щих операторов: ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE,
DROP TABLE, RENAME TABLE и TRUNCATE.
MySQL поддерживает откат до точек сохранения, начиная с версии 4.0.14.
Oracle
Oracle поддерживает оператор ROLLBACK по стандарту ANSI с небольшим рас
ширением в виде фразы FORCE:
ROLLBACK [WORK] {[TO [SAVEPOINT] точка_сохранения] |
[FORCE 'идентификатор_транзакции']};
402 Глава 3. Справочник операторов SQL
PostgreSQL
PostgreSQL поддерживает базовый вариант оператора ROLLBACK и точки со
хранения:
ROLLBACK { [WORK] | [TRANSACTION] | PREPARED }
[TO [SAVEPOINT] точка_сохранения ]
где:
WORK | TRANSACTION
Необязательные слова.
PREPARED
Откатывает транзакцию, подготовленную для двухфазной фиксации. Только
суперпользователь или владелец транзакции может откатить ее. Для подго
товки транзакции к двухфазной фиксации используйте не входящий в SQL3
оператор PREPARE TRANSACTION, а для фиксации подготовленной тран
закции используйте COMMIT PREPARED.
TO [SAVEPOINT] точка_сохранения
Откатывает все команды, выполненные после указанной точки сохранения.
Точка сохранения остается активной и может быть использована повторно.
ROLLBACK отменяет все изменения данных, выполненные в текущей транзак
ции. Если на текущий момент транзакция не начата, то оператор вернет ошиб
ку. Например, для отката всех сделанных изменений выполните:
ROLLBACK 403
ROLLBACK;
Будьте внимательны с курсорами при откате к точкам сохранения. Например,
курсоры, открытые после точки сохранения, до которой производится откат, за
крываются. Если в процессе извлечения строк курсора оператором FETCH была
создана точка сохранения, то при откате к этой точке позиция курсора остается
без изменений. Курсор остается в закрытом состоянии, даже если вы откатывае
тесь до момента, предшествующего закрытию курсора. Как правило, смешива
ние курсоров и контрольных точек – не самая лучшая идея.
Помните, что только RELEASE SAVEPOINT полностью удаляет точку сохране
ния. В противном случае точка сохранения остается активной и готовой к ис
пользованию.
PostgreSQL поддерживает оператор ABORT, являющийся синонимом ROLL0
BACK. Можно использовать ABORT [WORK] или ABORT [TRANSACTION].
SQL Server
SQL Server поддерживает ключевые слова WORK и TRAN. Отличие между ними
состоит в том, что ROLLBACK WORK не позволяет выполнять откат указанной
транзакции или до указанной точки сохранения:
ROLLBACK { [WORK] | [TRANSACTION] }
{имя_транзакции | точка_сохранения};
Если ROLLBACK выполняется просто с ключевыми словами WORK или TRAN,
то откатываются все текущие открытые транзакции. ROLLBACK освобождает все
блокировки, хотя при откате до точки сохранения блокировки не освобождаются.
SQL Server позволяет указать имя транзакции или точку сохранения. Они могут
быть указаны либо в виде литералов, либо через переменные.
SQL Server не позволяет откатываться к точкам сохранения при двухфазных
фиксациях (т. е. при распределенных транзакциях).
Если оператор ROLLBACK TRANSACTION выполняется из триггера, то он отме
няет все изменения данных, включая выполненные триггером до момента вы
полнения отката. Вложенные триггеры, следующие за ROLLBACK, не выполня
ются, однако последующие операторы триггера оператором ROLLBACK не за
трагиваются. ROLLBACK действует аналогично COMMIT в плане вложенности,
сбрасывая в ноль переменную @@TRANSCOUNT. (Обратитесь к описанию опе
ратора COMMIT за информацией о работе с транзакциями в вложенных тригге
рах в SQL Server.)
Вот пример использования операторов COMMIT и ROLLBACK в TransactSQL.
В этом примере в таблицу вставляется несколько записей. Если при вставке про
исходит ошибка, то транзакция откатывается, а при успешной вставке транзак
ция фиксируется:
BEGIN TRAN – Инициализируем транзакцию
Сама транзакция
INSERT INTO sales
VALUES('7896','JR3435','Oct 28 1997',25,'Net 60','BU7832')
Обработка ошибок
IF @@ERROR <> 0
404 Глава 3. Справочник операторов SQL
BEGIN
Делаем запись об ошибке в журнал событий
и переходим к концу
RAISERROR 50000 'Insert of sales record failed'
ROLLBACK WORK
GOTO end_of_batch
END
Фиксируем транзакцию, если не возникло ошибок
COMMIT TRAN
Метка для использования оператором GOTO
end_of_batch:
GO
SAVEPOINT sales1
См. также
COMMIT
RELEASE SAVEPOINT
SAVEPOINT
SAVEPOINT
Оператор SAVEPOINT используется для разделения транзакции на логические
части с помощью точек сохранения. В одной транзакции может быть создано не
сколько точек сохранения. С помощью оператора ROLLBACK можно частично
откатывать транзакцию до определенной точки сохранения.
Синтаксис SQL2003
SAVEPOINT имя_точки_сохранения
Ключевые слова
SAVEPOINT имя_точки_сохранения
Создает в транзакции точку сохранения с указанным именем.
В некоторых платформах допускается создание в одной транзакции нескольких
точек сохранения с одинаковыми именами, но это не рекомендуется стандартом
ANSI. SQL2003 поддерживает оператор RELEASE SAVEPOINT для удаления
созданных контрольных точек, описанный в соответствующем разделе.
Общие правила
Точки сохранения создаются и существуют в рамках транзакции, и их имена не
должны повторяться в пределах транзакции. Всегда давайте точкам сохранения
SAVEPOINT 405
Советы и хитрости
Как правило, повторяющиеся имена точек сохранения не приводят к ошибкам,
но новая точка сохранения делает бесполезной предыдущую одноименную точку
сохранения. Поэтому будьте аккуратны при именовании точек сохранения.
При инициализации транзакций для обеспечения целостности используются
различные ресурсы (а конкретно – блокировки). Старайтесь делать так, чтобы
ваши транзакции завершались как можно быстрее, чтобы удерживаемые блоки
ровки освобождались и могли быть использованы другими пользователями.
В следующем примере выполняется несколько модификаций данных, а затем
выполняется откат к точке сохранения:
INSERT INTO sales
VALUES('7896','JR3435','Oct 28 1997',25,'Net 60','BU7832');
SAVEPOINT after_insert;
UPDATE sales SET terms = 'Net 90'
WHERE sales_id = '7896';
SAVEPOINT after_update;
DELETE sales;
ROLLBACK TO after_insert;
MySQL
MySQL полностью поддерживает стандарт ANSI.
Oracle
Oracle полностью поддерживает стандарт ANSI.
PostgreSQL
PostgreSQL полностью поддерживает стандарт ANSI.
SQL Server
SQL Server не поддерживает оператор SAVEPOINT. Вместо него используется
оператор SAVE
SAVE TRAN[SACTION] имя_точки_сохранения;
Вместо указания имени точки сохранения литералом вы можете использовать пе
ременные. При этом переменные должны иметь тип CHAR, VARCHAR, NCHAR
или NVARCHAR.
SQL Server позволяет в рамках одной транзакции создать несколько точек со
хранения с разными именами. Может показаться, что SQL Server полностью
поддерживает вложенные точки сохранения, однако это не так. Каждый раз при
выполнении фиксации или отката до точки сохранения выполняется фиксация
или откат до последней созданной точки сохранения.
406 Глава 3. Справочник операторов SQL
См. также
COMMIT
RELEASE SAVEPOINT
ROLLBACK
SELECT
Оператор SELECT извлекает строки, столбцы и производные значения из одной
или нескольких таблиц базы данных.
Синтаксис SQL2003
Полный синтаксис оператора SELECT очень сложный и мощный, но его можно
разбить на следующие основные фразы:
SELECT [{ALL | DISTINCT}] извлекаемый_элемент
[AS псевдоним][, ...]
FROM [ONLY | OUTER]
{таблица [[AS] псевдоним] | представление
[[AS] псевдоним]}[, ...]
[ [тип_соединения] JOIN условие_соединения ]
[WHERE условие_поиска] [ {AND | OR | NOT} условие_поиска [...] ]
[GROUP BY выражение_группировки { столбцы_группировки |
ROLLUP столбцы_группировки |
CUBE столбцы_группировки |
GROUPING SETS (список_наборов_группировок) |
( ) | набор_группировок, список_наборов_группировок }
[HAVING условие_поиска]]
[ORDER BY {выражение_сортировки [ASC | DESC]}[, ...]]
Ключевые слова
Каждое из ключевых слов, рассмотренное ниже (за исключением SELECT извле
каемый_элемент), более детально описывается в разделе «Общие правила»:
[{ALL | DISTINCT}] извлекаемый элемент
Извлекает значения, составляющие результирующее множество. Каждый
извлекаемый элемент может быть литералом, агрегатной или скалярной
функцией, математическим выражением, параметром или переменной, под
SELECT 407
1 Вероятно, авторы в данном случае имеют в виду таблицы. Это можно видеть из приме
ра, приводимого ниже. – Прим. науч. ред.
408 Глава 3. Справочник операторов SQL
OUTER
Указывает, что запрос возвращает как данные из указанных таблиц и пред
ставлений, так и данные из дочерних таблиц и представлений. Столбцы до
черних таблиц и представлений добавляются в результирующий набор спра
ва в порядке иерархии объектов. В расширенных иерархиях подтаблицы с об
щими родителями добавляются в порядке создания их типов. При использо
вании OUTER заключите имена таблиц и представлений в скобки. OUTER
игнорируется, если таблица или представление не имеет наследников.
JOIN условие_соединения
Соединяет строки таблицы, указанной во FROM, со строками другой табли
цы на основании связи между двумя таблицами по наборам общих значений.
Эти значения обычно хранятся в столбцах с одинаковыми именами и типами
данных. Такие столбцы называются ключом соединения. Часто, но не всегда
ключ соединения является первичным ключом одной таблицы и внешним
ключом другой таблицы. Если данные в двух таблицах соответствуют, то таб
лицы можно соединить. (Обратите внимание, что соединение может быть вы
полнено при помощи фразы WHERE. Этот способ называется тэтасоедине
нием.)
условие_соединения чаще всего имеет следующий вид:
JOIN таблица2 ON таблица1.столбец1 <оператор_сравнения>
таблица2.столбец1
JOIN таблица3 ON таблица1.столбецA <оператор_сравнения>
таблица3.столбецA
[...]
Если в качестве оператора сравнения используется =, то соединение называ
ется эквисоединением. Однако можно использовать любой оператор: <, >, <=,
>= и даже <>.
Используйте оператор AND, чтобы выполнить соединение по нескольким ус
ловиям. Также вы можете указывать альтернативные условия соединения
при помощи OR.
Если тип соединения не указан явно, то используется внутреннее соединение.
Помните, что существует много разных типов соединений, каждый со своими
правилами и особенностями (они рассматриваются в разделе «Общие прави
ла»). Также имейте в виду, что есть альтернативный вариант описания усло
вий соединений с помощью фразы USING:
USING (столбец[, ...])
Является альтернативой соединения с помощью ON. Вместо описания ус
ловий соединения вы можете перечислить столбцы, существующие в обе
их таблицах. Соединение выполняется по равенству значений в этих
столбцах. Следующие два запроса имеют одинаковый результат:
SELECT emp_id
FROM employee
LEFT JOIN sales USING (emp_id, region_id);
SELECT emp_id
FROM employee AS e
SELECT 409
Общие правила
Каждая фраза оператора SELECT имеет определенное назначение. Поэтому мож
но отдельно обсуждать фразу FROM, отдельно WHERE, отдельно GROUP BY
и т. д. Вы можете получить больше информации и увидеть больше примеров опе
раторов SELECT, просмотрев отдельные описания каждой фразы оператора. Од
нако не в каждом запросе необходимы все фразы. Как минимум в запросе долж
ны быть использованы SELECT и FROM. Так как оператор SELECT очень ва
жен и имеет много опций, то мы решили разбить раздел «Общие правила» на
следующие подразделы:
• Псевдонимы и соединения в WHERE
• Фраза JOIN
• Фраза WHERE
• Фраза GROUP BY
• Фраза HAVING
• Фраза ORDER BY
Фраза WHERE
Плохо написанная фраза WHERE может похоронить прекрасный в остальном
оператор SELECT, поэтому стоит внимательно изучить все нюансы фразы WHE0
RE. Вот пример типичного подзапроса с составным условием в WHERE:
SELECT a.au_lname,
a.au_fname,
t2.title,
t2.pubdate
FROM authors a
JOIN titleauthor t1 ON a.au_id = t1.au_id
JOIN titles t2 ON t1.title_id = t2.title_id
WHERE (t2.type = 'business' OR t2.type = 'popular_comp')
AND t2.advance > 5500
ORDER BY t2.title
Обратите внимание, что в этом запросе скобки влияют на порядок вычисления
условия поиска. Вы можете использовать скобки для изменения приоритета ус
ловий поиска так же, как это делается в алгебраических выражениях.
IN
Проверяет вхождение значения в определенный список. Список может зада
ваться как литералом (например, WHERE state IN (‘or’, ‘il’, ‘tn’, ‘ak’) ), так
и подзапросом:
WHERE state IN (SELECT state_abbr FROM territories).
SOME | ANY
Работает так же, как оператор EXISTS, но использует немного другой син
таксис. Следующий запрос возвращает авторов, являющихся также сотруд
никами:
SELECT au_lname FROM authors WHERE au_lname =
SOME(SELECT last_name FROM employees)
ALL
Проверяет, что все строки, возвращаемые подзапросом, удовлетворяют опре
деленному условию. Если запрос не возвращает ни одной строки, то резуль
тат ALL будет TRUE. Например:
WHERE city =
ALL (SELECT city FROM employees WHERE emp_id = 54123)
Фраза GROUP BY
Фраза GROUP BY (как и HAVING) используется в запросах, содержащих агре
гатные функции.
GROUP BY позволяет получать агрегированные значения для одной или не
скольких строк, получаемых при разбиения всего множества строк на группы по
значениям указанных столбцов группировки. Например, следующим запросом
мы подсчитываем число сотрудников, нанятых за каждый год с 1999 по 2004:
SELECT hire_year, COUNT(emp_id) AS nbr_emps
FROM employee
WHERE status = 'ACTIVE'
AND hire_year BETWEEN 1999 AND 2004
GROUP BY hire_year;
Результат:
hire_year nbr_emps
1999 27
2000 17
2001 13
2002 19
2003 20
2004 32
Агрегатные функции используются в запросах для получения суммарных значе
ний. Основные агрегатные функции следующие:
AVG
Возвращает среднее по всем непустым (не NULL) значениям указанного
столбца.
SELECT 415
AVG DISTINCT
Возвращает среднее по всем уникальным непустым значениям указанного
столбца.
COUNT
Возвращает число непустых значений в столбце.
COUNT DISTINCT
Возвращает число уникальных непустых значений в столбце.
COUNT(*)
Считает число строк в таблице.
MAX
Возвращает максимальное непустое значение в столбце.
MIN
Возвращает минимальное непустое значение в столбце.
SUM
Возвращает сумму всех непустых значений в столбце.
SUM DISTINCT
Возвращает сумму всех уникальных непустых значений в столбце.
Некоторые запросы, использующие агрегаты, возвращают одиночное значение.
Такие запросы называются скалярными агрегатами. В скалярных агрегатах не
требуется фраза GROUP BY. Например:
Запрос
SELECT AVG(price)
FROM titles
Результат
14.77
Запросы, возвращающие и агрегированные значения, и обычные столбцы, назы
ваются векторными агрегатами. Векторные агрегаты используют GROUP BY
и возвращают одну или несколько строк. Есть несколько правил, касающихся
использования GROUP BY:
• Фраза GROUP BY должна находиться в правильном месте – после WHERE,
но до ORDER BY.
• Все столбцы, которые присутствуют во фразе SELECT, но по которым не вы
полняется агрегация, должны быть указаны в GROUP BY.
• Не используйте в GROUP BY псевдонимы столбцов (хотя псевдонимы таблиц
допустимы).
Предположим, вы хотите получить общую сумму по нескольким покупкам. Таб
лица Order_Details выглядит следующим образом:
OrderID ProductID UnitPrice Quantity
10248 11 14.0000 12
10248 42 9.8000 10
10248 72 34.8000 5
416 Глава 3. Справочник операторов SQL
10249 14 18.6000 9
10249 51 42.4000 40
10250 41 7.7000 10
10250 51 42.4000 35
10250 65 16.8000 15
...
Следующий запрос получает требуемый результат:
SELECT OrderID, SUM(UnitPrice * Quantity) AS 'Order Amt'
FROM order_details
WHERE orderid IN (10248, 10249, 10250)
GROUP BY orderid
Результат:
OrderID Order Amt
10248 440.0000
10249 1863.4000
10250 1813.0000
Мы можем детализировать агрегаты, добавив еще один столбец группировки.
Следующий запрос возвращает среднюю цену продуктов в разбивке по имени
и размеру:
SELECT name, size, AVG(unit_price) AS 'avg'
FROM product
GROUP BY name, size
Результат:
Name Size avg
CUBE
Формирует итоги для каждой комбинации столбцов группировки. По су
ти, CUBE позволяет быстро получить многомерный набор данных из
обычной таблицы без особого программирования. Как и ROLLUP, CUBE
формирует итоги для всех столбцов группировки, но делает это для всех
комбинаций столбцов.
GROUP BY GROUPING SETS [ {ROLLUP | CUBE} ] ( [ столбец_группировки[, ...] ] )
[, список_наборов_группировок]
Позволяет в одном запросе формировать агрегаты по нескольким наборам
столбцов группировки. Это особенно полезно в случаях, когда вы хотите по
лучить только часть агрегированных результатов. Фраза GROUPING SETS
позволяет выбрать определенные комбинации столбцов группировок, в то
время как CUBE использует все комбинации столбцов (получается 2n групп,
где n – количество столбцов в CUBE), а ROLLUP – иерархическое подмноже
ство всех комбинаций. Как видно из описания синтаксиса, GROUPING SETS
можно использовать совместно с CUBE и ROLLUP.
В табл. 3.4 приводятся примеры фраз GROUP BY и соответствующие им наборы
столбцов группировок.
Таблица 3.4. Варианты синтаксиса GROUP BY
Acquisitions Manager 4
Managing Editor 4
Marketing Manager 4
Operations Manager 4
Productions Manager 4
Public Relations Manager 4
Publisher 7
Заметьте, что по стандарту ANSI фраза GROUP BY не является обязательной
при использовании HAVING. Например, следующий запрос к таблице employee
корректен, так как GROUP BY в нем подразумевается:
SELECT COUNT(dept_nbr)
FROM employee
HAVING COUNT(dept_nbr) > 30;
Хотя такое использование HAVING корректно, оно используется достаточно
редко.
Фраза ORDER BY
Результирующее множество может быть отсортировано с помощью фразы OR0
DER BY в соответствии с определенной в базе данных схемой упорядочения. Ка
ждый столбец может использоваться для сортировки по возрастанию (ASC) или
убыванию (DESC). (По умолчанию выполняется сортировка по возрастанию.)
Если ORDER BY не используется, то большинство платформ возвращают дан
ные либо в порядке их физического хранения, либо в порядке, определяемом ис
пользуемым в запросе индексом. Однако при отсутствии ORDER BY какойлибо
определенный порядок строк не гарантируется. Вот пример использования OR0
DER BY в запросе для SQL Server:
SELECT e.emp_id "Emp ID",
e.fname "First",
e.lname "Last",
j.job_desc "Job Desc"
FROM employee e,
jobs j
WHERE e.job_id = j.job_id
AND j.job_desc = 'Acquisitions Manager'
ORDER BY e.fname DESC,
e.lname ASC
Результат:
Emp ID First Last Job Desc
Советы и хитрости
Если вы объявили во фразе FROM псевдоним для таблицы или представления,
то используйте этот псевдоним при всех ссылках на таблицу или представление
в запросе (например, во фразе WHERE). Не смешивайте обращение к таблице по
имени и с помощью псевдонима. Этому есть две причины. Вопервых, это делает
код менее согласованным и усложняет его поддержку. Вовторых, на некоторых
платформах запросы, содержащие смешанные ссылки на таблицы, возвращают
ошибки. (Обратитесь к разделу, описывающему подзапросы, за информацией об
использовании псевдонимов с подзапросами.)
MySQL, PostgreSQL и SQL Server поддерживают определенный тип запросов, не
требующий фразы FROM. Используйте такие запросы осторожно, так как по
стандарту ANSI фраза FROM является обязательной. Запросы без FROM при
миграции может потребоваться приводить к стандарту ANSI либо к формату, ра
ботающему на целевой платформе. Некоторые платформы не поддерживают со
единения в стиле ANSI. За информацией о степени поддержки стандарта ANSI
для различных частей оператора SELECT обращайтесь к документации по плат
формам.
MySQL
Реализация оператора SLECT в MySQL включает частичную поддержку JOIN,
фразы INTO, LIMIT и PROCEDURE. MySQL до версии 4.0 не поддерживает под
запросы. Синтаксис следующий:
SELECT [DISTINCT | DISTINCTROW | ALL]
[STRAIGHT_JOIN] [ {SQL_SMALL_RESULT | SQL_BIG_RESULT} ]
[SQL_BUFFER_RESULT]
[ {SQL_CACHE | SQL_NO_CACHE} ] [SQL_CALC_FOUND_ROWS]
[HIGH_PRIORITY] извлекаемый_элемент AS псевдоним[, ...]
[INTO {OUTFILE | DUMPFILE | переменная[, ...]}
'файл' опции]
[FROM имя_таблицы AS псевдоним[, ...]
[ { USE INDEX (индекс1[, ...]) |
IGNORE INDEX (индекс1[, ...]) } ]
[тип_соединения] [JOIN таблица2] [ON условие_соединения]
[WHERE условие_поиска]
[GROUP BY {целое_число | имя_столбца | формула}
[ASC | DESC][, ...] [WITH ROLLUP]]
[HAVING условие_поиска]
[ORDER BY { целое_число | имя_столбца | формула } [ASC | DESC][, ...]]
SELECT 423
Oracle
В Oracle есть большое число расширений оператора SELECT по сравнению с ANSI.
Например, так как в Oracle поддерживаются вложенные (nested) и секциониро
ванные таблицы (смотрите описание оператора CREATE TABLE), то оператор
SELECT поддерживает запросы к следующим типам структур:
[WITH имя_запроса AS (подзапрос)[, ...]]
SELECT { {[ALL | DISTINCT]} | [UNIQUE] }
[подсказки_оптимизатору] извлекаемый_элемент
[AS псевдоним][, ...]
[INTO {переменная[, ...] | запись}]
FROM {[ONLY] {[схема.][таблица | представление |
материализованное_представление]}[@связь_базы_данных]
[AS [OF] {SCN | TIMESTAMP} выражение] |
подзапрос [WITH {READ ONLY | CHECK OPTION
[CONSTRAINT имя_ограничения]}] |
[[VERSIONS BETWEEN {SCN | TIMESTAMP}
{выражение | MINVALUE} AND
{выражение | MAXVALUE}] AS OF {SCN | TIMESTAMP}
выражение] |
TABLE (столбец_вложенной_таблицы) [(+)]
{[PARTITION (имя_секции) | SUBPARTITION (имя_подсекции)]}
[SAMPLE [BLOCK] [процент_выборки] [SEED
SELECT 427
FROM [ONLY]
Указывает таблицу, представление, материализованное представление, сек
цию или подзапрос, из которых извлекаются строки. Ключевое слово ONLY
используется только для представлений, входящих в иерархии, и позволяет
выбрать записи только из указанного представления, но не его дочерних
представлений.
AS [OF] {SCN | TIMESTAMP} выражение
Позволяет выполнять ретроспективные запросы с указанием системного но
мера изменения (SCN) или значения типа TIMESTAMP. Запрос извлекает
записи в том виде, в котором они были на указанный момент времени или
к указанному системному изменению. (Эта функциональность также может
быть использована на уровне сессии с помощью пакета DBMS_FLASH0
BACK.) Значение SCN должно быть целым числом, а TIMESTAMP должно
быть временной меткой. Ретроспективные запросы нельзя использовать для
присоединенных серверов.
подзапрос [WITH {READ ONLY | CHECK OPTION [CONSTRAINT имя_ограниче
ния]}]
Рассматривается отдельно, так как Oracle позволяет дополнительно управ
лять использованием подзапроса. WITH READONLY указывает, что целевой
подзапрос нельзя обновлять. WITH CHECK OPTION указывает, что при об
новлениях подзапроса строки должны оставаться в результирующем множе
стве подзапроса. WITH CONSTRAINT создает для таблицы ограничение
CHECK OPTION с указанным именем. Обратите внимание, что WITH
CHECK OPTION и WITH CONSTRAINT обычно используются в операторах
INSERT…SELECT.
[[VERSIONS BETWEEN {SCN | TIMESTAMP} {выражение | MINVALUE} AND{
выражение | MAXVALUE}] AS OF {SCN | TIMESTAMP} выражение]
Позволяет использовать ретроспективные запросы для получения истории
изменений, выполненных в таблице, представлении или материализованном
представлении. Псевдостолбец VERSIONS_XID показывает идентификатор
транзакции, выполнившей изменение. Для ретроспективных запросов требу
ется указывать либо системный номер изменения (SCN), либо временную
метку (TIMESTAMP). (Ретроспективные запросы на уровне сессии можно
выполнять с помощью пакета DBMS_FLASHBACK.)
Опциональная подфраза VERSIONS BETWEEN используется для получения
нескольких версий данных в интервале, задаваемом значениями SCN или вре
менными метками либо ключевыми словами MINVALUE и MAXVALUE. Без
этой фразы возвращается только одна предыдущая версия данных. (В Oracle
поддерживаются псевдостолбцы с дополнительной информацией о версиях.)
Фраза AS OF, описанная ранее в этом списке, определяет SCN или момент
времени, на который выполняется запрос с фразой VERSIONS.
Вы не можете использовать ретроспективные запросы с фразой VERSIONS
для временных таблиц, внешних таблиц, кластерных таблиц и представлений.
TABLE
Используется при обращениях к вложенным таблицам в иерархии.
SELECT 429
PARTITION
Ограничивает запрос определенной секцией таблицы. То есть строки извле
каются только из указанной секции, но не всей таблицы.
SUBPARTITION
Ограничивает запрос определенной подсекцией таблицы. Это уменьшает
ввод/вывод, так как строки извлекаются только из указанной секции, но не
всей таблицы.
SAMPLE [BLOCK] [процент_выборки] [SEED (начальное_значение)]
Позволяет выбрать не все строки таблицы, а лишь определенный процент
строк, либо блоков таблицы. BLOCK указывает, что используется случайная
выборка блоков. Процент выборки может иметь любое значение в диапазоне
от 0.000001 до 99. Опциональная фраза SEED позволяет сделать результат
более стабильным и повторимым. Если вы будете использовать одинаковое
начальное значение (может быть от 0 до 4294967295), то Oracle будет по воз
можности возвращать одинаковый результат. Без использования SEED ре
зультат выборки будет варьироваться от запроса к запросу. SAMPLE можно
использовать только в запросах, обращающихся к одной таблице.
JOIN
Соединяет результирующие наборы из двух таблиц в одном запросе. Деталь
но описывается далее.
PARTITION BY выражение[, ...]
Используется для выполнения специального типа запроса с так называемым
секционированным внешним соединением, расширяющим обычный синтак
сис соединений выполнением внешнего соединения к секции из одного или
нескольких столбцов, указанных в выражении. Этот тип запросов использу
ется для получения разреженных данных по определенным измерениям, ко
торые при обычных запросах исключались бы из выборки. Примеры приво
дятся в следующем разделе «Секционированные внешние соединения». Фра
за PARTITION BY может быть использована в любой части внешнего соеди
нения, что приводит к объединению внешних соединений с каждой секцией
секционированной выборки и таблицы, находящейся с другой стороны усло
вия соединения. (Если эта фраза опущена, то Oracle обрабатывает весь ре
зультирующий набор как одну секцию.) PARTITION BY нельзя использо
вать совместно с FULL OUTER JOIN.
WHERE... [[START WITH значение] CONNECT BY [PRIOR] условие]
Отфильтровывает строки в результирующем множестве. Oracle позволяет
с помощью фразы START WITH использовать хранящуюся в таблице инфор
мацию об иерархиях. START WITH идентифицирует строки, являющиеся
корневыми. CONNECT BY определяет взаимосвязь между записямиродите
лями и потомками. Ключевое слово PRIOR позволяет ссылаться на родитель
скую запись.
В иерархических запросах можно использовать псевдостолбец LEVEL для оп
ределения корневых записей (1), детей (2), внуков (3) и т. д. Также можно ис
пользовать псевдостолбцы CONNECT_BY_ISCYCLE и CONNECT_BY_ISLE0
AF. В иерархических запросах недопустимы фразы ORDER BY и GROUP BY.
430 Глава 3. Справочник операторов SQL
3800
SELECT 435
4000
Наконец, выполним ретроспективный запрос, чтобы получить значение, кото
рое было в прошлом:
SELECT salary FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP INTERVAL '1' DAY)
WHERE last_name = 'McCreary';
Результат:
SALARY
3800
Для более скрупулезного изучения мы можем запросить все значения данных,
которые существовали в указанный период, предположим, за последние два дня:
SELECT salary FROM employees
VERSIONS BETWEEN TIMESTAMP
SYSTIMESTAMP INTERVAL '1' MINUTE AND
SYSTIMESTAMP INTERVAL '2' DAY
WHERE last_name = 'McCreary';
Результат:
SALARY
4000
3800
Фраза MODEL
В Oracle 10g появилась мощная опция оператора SELECT – фраза MODEL, по
зволяющая выполнять с набором данных манипуляции, похожие на те, что обыч
но делают в электронных таблицах. Фактически эта фраза призвана снять необ
ходимость в извлечении данных в электронные таблицы (например, в MS Excel)
для ручной обработки. Эта фраза создает многомерный массив, в котором ячей
ки адресуются значениям измерений. Например, вы могли бы создать массив по
продукту и времени, адресуя значения массива по комбинации значений этих
двух измерений. Вы можете создавать правила, аналогичные формулам Excel,
выполняемым для изменения текущих значений, создания новых значений или
даже строк в вашей модели.
Фраза MODEL должна находиться после GROUP BY и HAVING, но перед OR0
DER BY. Предыдущее описание синтаксиса оператора SELECT для Oracle пока
зывает только положение фразы в операторе, а детали приводятся далее:
436 Глава 3. Справочник операторов SQL
MODEL
[{IGNORE | KEEP} NAV]
[UNIQUE {DIMENSION | SINGLE REFERENCE}]
[ RETURN {UPDATED | ALL} ]
[ REFERENCE имя_справочной_модели ON (подзапрос)
[PARTITION BY (столбец [AS псевдоним][, ...])]
DIMENSION BY (столбец [AS псевдоним][, ...])
MEASURES (столбец [AS псевдоним][, ...])
[{IGNORE | KEEP} NAV]
[UNIQUE {DIMENSION | SINGLE REFERENCE}] ]
[MAIN имя_модели]
[PARTITION BY (столбец [AS псевдоним][, ...])]
DIMENSION BY (столбец [AS псевдоним][, ...])
MEASURES (столбец [AS псевдоним][, ...])
[{IGNORE | KEEP} NAV]
[UNIQUE {DIMENSION | SINGLE REFERENCE}]]
правила
[RULES [UPSERT [ALL] | UPDATE]
[{AUTOMATIC | SEQUENTIAL} ORDER]]
[ITERATE (целое_число) [UNTIL (условие)]]
( [ {UPSERT [ALL] | UPDATE } ]
мера [...]
[FOR { измерение | ( измерение[, ...] ) }
{ [IN ({подзапрос | литерал[, ...]})] |
[LIKE шаблон] FROM начало TO конец
{INCREMENT | DECREMENT} шаг }[, ...]
[ORDER [SIBLINGS] BY (столбец_сортировки [ASC | DESC]
[NULLS FIRST | NULLS_LAST][, ...])]]
= выражение[, ...] )
Параметры фразы MODEL следующие:
{IGNORE | KEEP} NAV
Указывает режим работы с неопределенными и отсутствующими значениями
(NAV). Либо они выводятся как NULL (опция KEEP), либо заменяются на зна
чения по умолчанию (опция IGNORE): 0 для числовых типов, 010Января02000
для временных типов, пустую строку для символьных типов и NULL для всех
остальных типов.
UNIQUE {DIMENSION | SINGLE REFERENCE}
Указывает область, для которой проверяется, что ссылки на ячейки соответ
ствуют одиночным значениям. DIMENSION требует, чтобы любая ссылка на
ячейку (неважно, в левой или в правой части правила) соответствовала оди
ночному значению. SINGLE REFERENCE проверяет только ссылки на ячей
ки в правых частях правил.
RETURN {UPDATED | ALL} ROWS
Указывает, возвращаются ли из модели все строки (ALL) или только обнов
ленные (UPDATED).
имя_справочной_модели
Определяет модель, в которой вы не можете выполнять вычисления, но мо
жете использовать ее значения в основном запросе.
SELECT 437
имя_справочной_модели ON (подзапрос)
Указывает имя и источник строк для справочной модели.
псевдоним
Указывает псевдоним для секции.
DIMENSION BY (столбец [,столбец...])
Указывает измерения модели. Значения этих столбцов используются для ин
дексации значений, являющихся ячейками многомерного пространства.
MEASURES (столбец [,столбец...])
Указывает значения, связанные с каждой уникальной комбинацией измере
ний (то есть ячейки модели).
PARTITION BY [( ] столбец [,столбец...][ )]
Разбивает модель на независимые секции по указанным столбцам. Вы може
те не разбивать на секции справочные модели.
имя_главной_модели
Указывает модель, в которой выполняется работа. Строки из соответствую
щего оператора SELECT наполняют модель, затем применяются правила
и возвращается результат.
MAIN имя_модели
Начинает описание главной модели и присваивает ей имя.
RULES [UPSERT | UPDATE]
Указывает, могут ли правила создавать новые ячейки и обновлять сущест
вующие (UPSERT) либо только обновлять существующие ячейки (UPDATE).
Если вы хотите создавать в модели новые строки, то используйте UPSERT.
(UPSERT является значением по умолчанию.) Вы также можете задавать
этот параметр на уровне правил (смотрите описание синтаксиса правил).
{AUTOMATIC | SEQUENTIAL} ORDER
AUTOMATIC указывает, что оптимизатор сам определяет порядок выполне
ния правил. При SEQUENTAL (значение по умолчанию) правила выполня
ются в порядке их следования.
ITERATE (целое_число)
Указывает, сколько раз должен быть выполнен весь набор правил. По умол
чанию правила выполняются только один раз.
UNTIL (условие)
Указывает условие, при выполнении которого прекращаются итерации выпол
нения правил. Тем не менее, вы все равно должны указать максимальное число
итераций, чтобы защититься от бесконечного цикла.
мера[...]
Ссылка на одну из мер, перечисленных во фразе MEASURE. При ссылке на
меру необходимо использовать квадратные скобки как часть синтаксиса. Вы
должны указать значения всех измерений (либо явно указав значение, либо
через подзапрос), чтобы получить соответствующее значение меры.
438 Глава 3. Справочник операторов SQL
FOR ...
Цикл FOR для итераций по одному или нескольким измерениям. Цикл FOR
похож на подзапрос, в котором каждая строка результата соответствует опре
деленной комбинации значений измерений.
значения_измерений
Список значений, полученных из столбцов или выражений, идентифицирую
щих уникальную ячейку модели.
IN ({подзапрос| литерал[, литерал...]})
Источником значений для цикла FOR может быть подзапрос или список ли
тералов.
LIKE шаблон
Позволяет вставлять значения измерений в шаблон. Используйте знак % для
указания места, в которое вставляется значение. Например, используйте
FOR x LIKE 'A%B' FROM 1 TO 3 INCREMENT 1 для генерации значений
'A1B', 'A2B', 'A3B'.
FROM начало TO конец {INCREMENT | DECREMENT} шаг
Указывает начальное и конечное значение для цикла FOR, а также шаг цикла.
ORDER BY (столбец_сортировки[, ...])
Определяет порядок выполнения правила по отношению к ячейкам, указан
ным в левой части правила. Если вы не используете эту фразу, то порядок
применения правила к ячейкам не определен.
Следующие функции предназначены специально для использования во фразе
MODEL:
CV( ) или CV(столбец_измерения)
Возвращает текущее значение столбца измерения. Может использоваться
только в правой части выражения правила. При использовании записи CV( )
столбец измерения определяется автоматически в соответствии с позицией
вызова функции в списке значений измерений.
PRESENTNNV(мера [измерение, измерение...], значение_не_null, значение_null)
В зависимости от того, равнялось ли значение указанной меры NULL на мо
мент начала обработки модели, возвращает соответствующее значение значе
ние_не_null или значение_null. Эту функцию можно использовать только в пра
вой части выражения правила.
PRESENTV(мера [измерение, измерение...], существовало, не_существовало)
В зависимости от того, существовала ли указанная мера на момент начала об
работки модели, возвращает соответствующее значение. Эту функцию можно
использовать только в правой части выражения правила. Имейте в виду, что
существование меры – это вопрос, совершенно отличный от того, имеет ли ме
ра значение NULL.
ITERATION_NUMBER
Возвращает 0 для первой итерации правил, 1 – для второй и т. д. Эта функция
используется, если вы хотите, чтобы правила зависели от номера итерации.
SELECT 439
2004 7014.54
2005 9745.12
440 Глава 3. Справочник операторов SQL
PostgreSQL
PostgreSQL поддерживает стандартный вариант оператора SELECT с JOIN и под
запросами. PostgreSQL также позволяет создавать новые временные и постоян
ные таблицы с помощью синтаксиса SELECT…INTO:
SELECT [ALL | DISTINCT [ON (извлекаемый_элемент[, ...])]]
[AS псевдоним [(список_псевдонимов)]][, ...]
[INTO [[TEMP]ORARY] [TABLE] имя_новой_таблицы]
[FROM [ONLY] таблица1[.*] [AS псевдоним][, ...] ]
[ [тип_соединения] JOIN table2 {[ON условие_соединения] |
[USING (список_столбцов)]}
[WHERE условие_поиска]
[GROUP BY выражение_группировки]
[HAVING условие_поиска]
[ORDER BY выражение_сортировки
[{ASC | DESC | USING оператор][, ...] }]
[FOR UPDATE [OF столбец[, ...]]
[LIMIT {число_записей | ALL} ][OFFSET [число_записей]] ]
где:
ALL | DISTINCT [ON (извлекаемый_элемент[, ...]]
ALL и DISTINCT работают так, как это описано в стандарте: ALL (использу
ется по умолчанию) возвращает все строки, включая повторяющиеся, а DIS0
TINCT удаляет повторяющиеся строки. DISTINCT ON удаляет повторяю
щиеся строки, имеющие одинаковые значения не во всех столбцах, а только
в указанных (пример будет дальше).
извлекаемый_элемент
Может быть любым стандартным элементом, описанным в ANSI. Кроме
обычной звездочки (*) вы можете использовать формат таблица.* для получе
ния всех столбцов определенной таблицы.
AS псевдоним [(список_псевдонимов)]
Объявляет псевдоним или список псевдонимов для одного или нескольких
столбцов (или таблиц во фразе FROM). AS требуется для псевдонимов элемен
тов SELECT, но во FROM слово AS необязательно. (На некоторых платфор
мах слово AS полностью необязательно.)
INTO [[TEMP]ORARY] [TABLE] имя_новой_таблицы
Создает новую временную или постоянную таблицу. Для создания времен
ных таблиц, удаляемых при закрытии сессии, можно использовать как
TEMP, так и TEMPORARY. В противном случае создаются постоянные таб
лицы. Постоянные таблицы должны иметь новые, уникальные имена. Вре
менная таблица может иметь такое же имя, как существующая постоянная
таблица. В этом случае по этому имени в текущей сессии будет использовать
ся временная таблица, а во всех остальных сессиях – постоянная таблица.
SELECT 441
SQL Server
SQL Server поддерживает основную функциональность оператора SELECT со
гласно стандарту ANSI, включая различные типы соединений. Также поддер
живаются некоторые расширения SELECT: подсказки оптимизатору, фразы IN0
TO и TOP, расширения GROUP BY, COMPUTE и WITH OPTIONS:
[WITH табличное_выражение[, ...]]
SELECT {[ALL | DISTINCT] | [TOP число [PERCENT]
[WITH TIES]]} извлекаемый_элемент [AS псевдоним]
[INTO имя_новой_таблицы]
[FROM {[функция_наборов_строк | таблица1[, ...]]}
[AS псевдоним]]
[ [тип_соединения] JOIN таблица2[ON условие_соединения] ]
[WHERE условие_поиска]
[GROUP BY [GROUPING SETS]
{столбец_группировки[, ...] | ALL}]
[WITH { CUBE | ROLLUP }]
[HAVING условие_поиска]
[ORDER BY выражение_сортировки [ ASC | DESC ]]
[COMPUTE {агрегация (выражение)}[, ...]
[BY выражение[, ...]]]
[FOR {BROWSE | XML {RAW | AUTO | EXPLICIT}
[, XMLDATA][, ELEMENTS][, BINARY base64]}]
[OPTION (подсказка_оптимизатору[, ...])]
444 Глава 3. Справочник операторов SQL
где:
WITH табличное_выражение
Объявляет временный именованный набор строк, построенный из результата
оператора SELECT.
TOP число [PERCENT] [WITH TIES]
Указывает, что запрос должен вернуть только указанное число строк (или
процент от общего числа строк, если используется PERCENT). Фраза WITH
TIES используется только с ORDER BY. WITH TIES указывает, что помимо
строк, указанных в TOP, возвращаются дополнительно стоки из основной
выборки, имеющие те же значения в столбцах, перечисленных в ORDER BY,
что и последняя строка из TOP.
INTO имя_новой_таблицы
Создает из результата запроса новую таблицу. Вы можете с помощью этой оп
ции создавать как временные, так и постоянные таблицы. (Ознакомьтесь
с правилами, касающимися создания постоянных и временных таблиц в SQL
Server, приведенными в этом разделе.) Выполнение оператора SELECT…IN0
TO не журналируется, поэтому оператор выполняется быстро, но на него не
влияют COMMIT и ROLLBACK.
FROM {[функция_наборов_строк | таблица1[, ... ]]}
Поддерживает стандартную функциональность, описанную в ANSI, включая
вложенные табличные подзапросы. SQL Server также поддерживает так на
зываемые функции наборов строк. Эти функции позволяют извлекать дан
ные из нестандартных источников, таких как XML потоки, файловые струк
туры полнотекстового поиска (в которых SQL Server хранит, например, доку
менты MS Word и презентации MS PowerPoint) и внешних источников (таких
как файлы MS Excel).
(За полным перечнем поддерживаемых функций наборов строк обращайтесь
к документации.) В числе множества других поддерживаются следующие
функции:
CONTAINSTABLE
Возвращает таблицу, построенную на базе другой таблицы, содержащей
как минимум один полнотекстовый индекс по столбцу типа TEXT или
NTEXT. Могут быть использованы различные алгоритмы поиска: точное
сравнение, нечеткий поиск, взвешенное совпадение (weightedmatch), сов
падение с заданным расстоянием между словами (proximitymatch). По
строенная таблица может быть использована как любая другая обычная
таблица.
FREETEXTTABLE
Работает аналогично CONTAINSTABLE, за исключением того, что записи
строятся на базе поиска произвольной строки. Функция FREETEXTTAB0
LE очень полезна для нерегламентированных запросов к полнотекстовым
таблицам, но менее точна, чем CONTAINSTABLE.
OPENDATASOURCE
Позволяет получать доступ к внешним данным (например, таблицам MS
Excel или Sybase Adaptive Server) через OLE DB без создания присоединен
SELECT 445
NULL NULL 0
10 57000.0000 0
12 2275.0000 0
14 4000.0000 0
16 7000.0000 0
24 25125.0000 0
NULL 95400.0000 1
ORDER BY
Работает в соответствии с требованиями стандарта ANSI. Однако следует пом
нить, что в SQL Server различные схемы упорядочения могут сильно влиять
на получаемый результат. Например, при использовании определенных схем
упорядочения значения «SMITH» и «smith» могут считаться различными.
Нельзя использовать в ORDER BY столбцы типов TEXT, NTEXT и IMAGE.
COMPUTE {агрегация(выражение)}[, ...] [BY выражение[, ...]]
Создает дополнительные агрегация (обычно итоги), выводимые в конце ре
зультирующего набора. BY добавляет в данные промежуточные итоги. В од
ном запросе одновременно можно использовать COMPUTE и COMPUTE BY.
COMPUTE BY следует использовать только в паре с ORDER BY, хотя выра
жение в ORDER BY может быть частью выражения сортировки. В качестве
агрегации можно использовать любую из следующих функций: AVG, CO0
UNT, MAX, MIN, STDEV, STDEVP, VAR, VARP и SUM. Примеры приводят
ся далее в этом разделе. COMPUTE ни в каком виде не работает с DISTINCT
и столбцами типов TEXT, NTEXT и IMAGE.
FOR {BROWSE | XML {RAW | AUTO | EXPLICIT}[, XMLDATA][, ELE0
MENTS][,BINARY BASE64]}
FOR BROWSE используется при необходимости обновления данных, полу
ченных через курсоры, работающие в режиме DBLibrary. (DBLibrary – это
исходный метод доступа к SQL Server, вытесненный позднее почти из всех
приложений интерфейсом OLEDB.) FOR BROWSE можно использовать толь
ко с таблицами, имеющими уникальный индекс и поле типа TIMESTAMP.
FOR BROWSE нельзя использовать в операторах с UNION и с включенным
параметром HOLDLOCK.
FOR XML
Используется клиентом SQL Server для получения результирующего мно
жества в формате XML. Вы можете определить формат XML документа
с помощью опций RAW, AUTO или EXPLICIT. RAW преобразует каждую
строку результата в XML элемент общего вида с тэгом <row/>. AUTO пре
образует результирующий набор в простое XMLдерево. Наконец, EXPLI0
CIT преобразует результирующий набор в XMLдерево заданного форма
та. Однако при этом запрос должен быть написан так, что требуемая ин
SELECT 447
FROM titles
WHERE royalty <= 10
GROUP BY type
ORDER BY type
Результат
type price
business 17.3100
mod_cook 19.9900
popular_comp 20.0000
psychology 13.5040
trad_cook 17.9700
Фраза GROUP BY ALL
SELECT type, AVG(price) AS price
FROM titles
WHERE royalty = 10
GROUP BY ALL type
ORDER BY type
Результат
type price
business 17.3100
mod_cook 19.9900
popular_comp 20.0000
psychology 13.5040
trad_cook 17.9700
UNDECIDED NULL
COMPUTE имеет несколько вариантов использования, сильно влияющих на ре
зультат запроса. В следующем примере суммируются цены на книги в разбивке
по типу книги и с сортировкой по типу книги и по цене:
Запрос
SELECT type, price
FROM titles
WHERE type IN ('business','psychology')
AND price > 10
ORDER BY type, price
COMPUTE SUM(price) BY type
Результат
type price
business 11.9500
business 19.9900
business 19.9900
sum
=====================
51.9300
type price
psychology 10.9500
psychology 19.9900
psychology 21.5900
SELECT 449
sum
=====================
52.5300
COMPUTE без BY используется совершенно иным образом. В следующем при
мере подсчитывается общий итог по всем ценам и всем авансам для книг с ценой
больше $16:
Запрос
SELECT type, price, advance
FROM titles
WHERE price > $16
COMPUTE SUM(price), SUM(advance)
Результат
Type price advance
См. также
JOIN
WHERE
SET
Оператор SET используется для присвоения значений пользовательским и сис
темным переменным.
Синтаксис SQL2003
SET переменная = значение
Ключевые слова
переменная
Указывает системную или пользовательскую переменную.
значение
Указывает текстовое или числовое значение, устанавливаемое для пользова
тельской или системной переменной.
Общие правила
Значения переменных устанавливаются на время сессии. Тип присваиваемого
значения должен совпадать с типом переменной. Например, вы не можете при
своить текстовое значение числовой переменной. Команды, используемые для
создания переменных, зависят от платформы: в Oracle и SQL Server переменные
объявляются оператором DECLARE, но в других платформах могут использо
ваться другие способы.
452 Глава 3. Справочник операторов SQL
Советы и хитрости
Оператор SET хорошо переносится между платформами. Только Oracle исполь
зует другой способ присвоения значений переменным. В следующем примере для
SQL Server мы объявляем переменную emp_id_var и присваиваем ей значение:
DECLARE emp_id_var CHAR(5)
SET emp_id_var = '67888'
То же действие на Oracle выполняется следующим образом:
DECLARE emp_id_var CHAR(5);
emp_id_var := '67888';
Дополнительная информация об этих отличиях приводится в следующих разде
лах.
MySQL
Ключевое слово SET имеет несколько значений. Вопервых, SET – это тип дан
ных, хранящий несколько значений, разделенных запятыми. Вовторых, SET
используется для присваивания значения пользовательской переменной. В этой
главе описывается второй вариант, его синтаксис следующий:
SET @переменная = значение[, ...]
Одним оператором вы можете установить значения нескольких переменных, пе
речислив их через запятую:
SET @new_var.order_qty = 125, @new_var.discount = 4;
MySQL позволяет использовать для присвоения значений переменным оператор
SELECT таким же образом, как это описано в стандарте ANSI для оператора
SET. Однако этот способ имеет определенный недостаток. Проблема заключает
ся в том, что значения внутри оператора SELECT не присваиваются немедленно.
Рассмотрим следующий пример:
SELECT (@new_var := row_id) AS a,
(@new_var + 3) AS b
FROM table_name;
Переменная @new_var не будет иметь значение row_id+3, а сохранит значение,
установленное в первой части оператора. По этой причине рекомендуется уста
навливать значения переменных по одной.
SET 453
Oracle
Оператор SET как способ присвоения значений переменных в Oracle не поддер
живается. Для присвоения используется оператор :=, имеющий следующий син
таксис:
переменная := значение
PostgreSQL
В PostgreSQL оператор SET используется для присвоения переменных среды
выполнения:
SET [SESSION | LOCAL] переменная { TO | = }
{ значение | DEFAULT }
Для переменной можно указать определенное значение, задаваемое литералом,
либо установить значение по умолчанию с помощью ключевого слова DEFAULT.
Ключевое слово SESSION указывает, что команда влияет только на текущую
сессию (это поведению по умолчанию, если не указано ни SESSION, ни LOCAL).
Ключевое слово LOCAL указывает, что команда влияет только на текущую тран
закцию. После окончания транзакции устанавливается значение по умолчанию,
определенное на уровне сессии.
Некоторые клиентские настройки также могут быть сконфигурированы при по
мощи оператора SET (хотя для этих же целей можно использовать SET_CON0
FIG). PostgreSQL поддерживает следующие дополнительные настройки:
[CLIENT_ENCODING] NAMES
Определяет используемую клиентом многобайтную кодировку для серверов
PostgreSQL, поддерживающих многобайтные кодировки.
DATESTYLE
Устанавливает стиль отображения времени и даты. Поддерживаемые стили
включают:
ISO
Отображает дату и время в формате YYYY0MM0DD HH:MM:SS (формат
по умолчанию по стандарту ISO 8601).
SQL
Отображает дату и время в формате Oracle/Ingres, а не в формате, опреде
ляемом ANSI SQL.
Postgresql
Отображает дату и время в формате PostgreSQL (это больше не является
значением по умолчанию).
German
Отображает дату и время в формате DD.MM.YYYY.
Вы можете детализировать стили SQL и PostgreSQL, используя ключевые
слова European, US и NonEuropean, отображающие данные в формате DD/
MM/YYYY, MM/DD/YYYY и MM/DD/YYYY, соответственно (например,
SET DATESTYLE = SQL, European;).
454 Глава 3. Справочник операторов SQL
SEED
Инициализирует встроенный генератор псевдослучайных чисел. Значение
может быть любым числом от 0 до 1, умноженным на 231–1. Для этих же це
лей можно воспользоваться функцией setseed, например:
SELECT setseed(значение);
SERVER_ENCODING
Активирует поддержку многобайтных кодировок на серверах, имеющих та
кую возможность.
TIME ZONE {часовой пояс | LOCAL | DEFAULT}
Позволяет выбрать указанный часовой пояс либо (если указано LOCAL или
DEFAULT) использовать часовой пояс операционной системы. Полный спи
сок допустимых часовых поясов ищите в документации.
SQL Server
SQL Server поддерживает оператор SET для присвоения значений переменным,
объявленным оператором DECLARE, а также курсорным переменным. (SET ис
пользуется и для других целей, таких как включение и отключение настроек
сессии, например SET NOCOUNT ON.) Синтаксис оператора следующий:
SET { { @переменная = значение }
| { @курсорная_переменная =
{ @курсорная_переменная | имя_курсора
| { CURSOR [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR оператор_select
[ FOR { READ ONLY | UPDATE [ OF столбец[, ...] ] }
] } } } }
Оператор не поддерживает ключевое слово DEFAULT, но в остальном синтаксис
ANSI поддерживается.
SET CONNECTION
Оператор SET CONNECTION позволяет пользователю переключаться между не
сколькими открытыми соединениями с одной или несколькими базам данных.
Синтаксис SQL2003
SET CONNECTION {DEFAULT | имя_соединения}
SET CONNECTION 455
Ключевые слова
имя_соединения
Указывает соединение текущей сессии. Если указано соединение, отличное
от используемого в текущий момент, то текущим соединением становится
указанное в операторе.
DEFAULT
Переключается на соединение, используемое по умолчанию. Эта опция позво
ляет использовать соединение по умолчанию, даже если его имя неизвестно.
Описание
Этот оператор не закрывает соединение. Он переключается с текущего соедине
ния на указанное соединение (делая его текущим) либо с текущего соединения
на соединение по умолчанию. При переключении между соединениями преды
дущее соединение переходит в спящее состояние (без фиксации или отката тран
закции), а новое соединение становится активным.
Общие правила
Оператор SET CONNECTION не создает соединения, он просто переключает
контекст соединения. Для создания новых соединений используйте оператор
CONNECT, а для закрытия соединений – DISCONNECT.
Советы и хитрости
Оператор SET CONNECTION используется нечасто, так как пользователи обыч
но подключаются программно через ODBC, JDBC или иным способом. Однако на
тех платформах, где SET CONNECTION поддерживается, он может быть очень
удобен для частого изменения настроек соединения без закрытия текущих со
единений.
MySQL
Не поддерживается.
Oracle
Не поддерживается.
PostgreSQL
Не поддерживается.
SQL Server
SQL Server поддерживает оператор SET CONNECTION, но только во встроен
ном SQL, но не в инструменте выполнения запросов SQL Query Analyzer. Хотя
оператор и поддерживается в соответствии со стандартом SQL2003, в различных
программах (например, на C++) он используется нечасто. Большинство предпо
читает использовать оператор USE. Синтаксис SET CONNECTION следующий:
SET CONNECTION имя_соединения
Ключевое слово DEFAULT не поддерживается, в остальном оператор соответст
вует стандарту ANSI. Имя соединения должно соответствовать соединению, от
456 Глава 3. Справочник операторов SQL
См. также
CONNECT
DISCONNECT
SET CONSTRAINT
Оператор SET CONSTRAINT устанавливает в текущей транзакции момент про
верки ограничений целостности с откладываемой проверкой: ограничения цело
стности проверяются либо после каждого оператора DML либо при фиксации
транзакции. Если в текущей сессии транзакция не начата, то оператор действует
на следующую транзакцию.
Синтаксис SQL2003
SET CONSTRAINT {имя_ограничения[, ...] | ALL}
{DEFERRED | IMMEDIATE}
Ключевые слова
имя_ограничения [, ...] | ALL
Указывает одно или несколько ограничений, для которых устанавливается
режим проверки. Ключевое слово ALL устанавливает режим проверки для
всех ограничений с возможностью отложенной проверки.
SET PATH 457
DEFERRED
Проверяет выполнение ограничений целостности в момент фиксации тран
закции, а не после каждого оператора DML.
IMMEDIATE
Проверяет выполнение ограничений целостности после каждого оператора
DML, а не при фиксации транзакции.
Общие правила
SET CONSTRAINT определяет режим работы откладываемых ограничений це
лостности в текущей транзакции. Если в текущей сессии транзакция не начата,
то оператор действует на следующую транзакцию.
В следующем примере для всех ограничений целостности устанавливается ре
жим проверки после каждого оператора DML:
SET CONSTRAINT ALL IMMEDIATE;
В следующем примере для двух ограничений устанавливается отложенный ре
жим проверки в конце транзакции:
SET CONSTRAINT scott.hr_job_title, scott.emp_bonus DEFERRED;
Советы и хитрости
В момент создания ограничения вы определяете, допускает ли ограничение от
ложенную проверку (DEFERRABLE) или не допускает (NOT DEFERRABLE).
Оператор SET CONSTRAINT, выполненный для ограничения типа NOT DE0
FERRABLE, завершится с ошибкой.
MySQL
Не поддерживается.
Oracle
Oracle полностью поддерживает оператор, как того требует стандарт ANSI, а так
же позволяет использовать SET CONSTRAINTS как синоним SET CONSTRA0
INT.
PostgreSQL
PostgreSQL поддерживает оператор в соответствии со стандартом ANSI. Однако
в PostgreSQL можно откладывать проверку только ограничений ссылочной це
лостности, а ограничения CHECK и UNIQUE всегда имеют тип IMMEDIATE.
SQL Server
Не поддерживается.
SET PATH
Оператор SET PATH меняет значение настройки CURRENT PATH на одну или
несколько схем.
458 Глава 3. Справочник операторов SQL
Синтаксис SQL2003
SET PATH имя_схемы[, ...]
Ключевые слова
имя_схемы [, ...]
Определяет одну или несколько схем в качестве текущего пути.
Общие правила
SET PATH определяет одну или несколько схем, используемых для неуточнен
ных имен функций, процедур и методов.
В следующем примере в качестве текущего пути (т. е. текущей схемы) использу
ется scott:
SET PATH scott;
Если в текущей схеме будет вызываться процедура без указания схемы, то будет
подразумеваться, что процедура находится в схеме scott.
Советы и хитрости
При указании нескольких схем все они должны находиться в текущей базе дан
ных. (Нельзя использовать схемы удаленного сервера.)
SET PATH не задает схему для неуточненных имен таблиц и представлений,
а только для подпрограмм (процедур, функций и методов).
SET PATH не поддерживается ни одной платформой из числа рассматриваемых
в этой книге.
См. также
SET SCHEMA
SET ROLE
Оператор SET ROLE включает и выключает определенные роли в текущей сессии.
Синтаксис SQL2003
SET ROLE {NONE | имя_роли}
Ключевые слова
NONE
Присваивает текущей сессии роль CURRENT ROLE.
имя_роли
Связывает с текущей сессией набор привилегий указанной роли.
Общие правила
Если пользователь с помощью оператора CONNECT открыл сессию, то SET RO0
LE позволяет связать с текущей сессией набор привилегий определенной роли.
Оператор SET ROLE можно выполнять только вне транзакций.
Имя роли, указываемое в SET ROLE, должно соответствовать существующей
в базе данных роли. Задавать имя роли можно как литералом, так и через пере
менную.
Советы и хитрости
Сессии создаются оператором CONNECT, а роли – оператором CREATE ROLE.
Большинство платформ предлагает те или иные способы установки или измене
ния роли, используемой пользовательской сессией. Стандарт ANSI предписыва
ет использовать для этих целей оператор SET ROLE, но он не очень широко под
держивается различными платформами. В следующих примерах рассматрива
ются аналогичные команды для каждой платформы, дополнительную информа
цию ищите в документации.
MySQL
Оператор SET ROLE не поддерживается. Управлять настройками подключения
в MySQL можно с помощью секции [client] конфигурационного файла .my.cnf,
находящегося в домашнем каталоге. Например:
[client]
host=server_name
user=user_name
password=client_password
Для быстрого переключения ролей вы можете изменять свойства host, user и pass0
word, присваивая новые значения переменным MYSQL_HOST, USER (только
под Windows) и MYSQL_PWD (хотя использование MYSQL_PWD небезопасно,
так как значение может быть просмотрено другими пользователями).
Oracle
Когда пользователь создает сессию, Oracle явно присваивает этому пользователю
роли. Роли, изпод которых работает сессия, можно поменять оператором SET
ROLE, при условии, что пользователь является членом включаемой роли. В фай
ле параметров INIT.ORA имеется настройка MAX_ENABLED_ROLES, ограни
чивающая максимальное число ролей, которые могут быть включены одновре
менно. Синтаксис оператора SET ROLE в Oracle следующий:
460 Глава 3. Справочник операторов SQL
PostgreSQL
PostgreSQL поддерживает синтаксис ANSI с дополнениями.
SET [ SESSION | LOCAL ] ROLE rolename| NONE
Эта команда устанавливает идентификатор текущей сессии в значение rolename.
Все последующие SQL команды будут выполняться от имени указанной.
SESSION | LOCAL
Фраза SESSION позволяет распространить настройки к текущей сессии (рабо
тает по умолчанию). Фраза LOCAL применяет изменения, производимые ко
мандой, только для текущей транзакции. После окончания текущей транзак
ции возвращаются настройки, действующие для сессии. Фразу SET LOCAL
SET SCHEMA 461
SQL Server
Не поддерживается.
См. также
CONNECT
CREATE ROLE
DISCONNECT
SET SESSION AUTHORIZATION
SET SCHEMA
Оператор SET SCHEMA меняет значения параметра CURRENT SCHEMA на
схему, указанную пользователем.
Синтаксис SQL2003
SET SCHEMA имя_схемы[, ...]
Ключевые слова
имя_схемы [, ...]
Указывает одну или несколько схем, используемых в качестве текущих.
Общие правила
Оператор SET SCHEMA указывает схему, используемую по умолчанию для не
уточненных имен объектов, таких как таблицы и представления.
В следующем примере в качестве текущей схемы выбирается схема scott:
SET SCHEMA scott;
Теперь, если в текущей сессии используется объект с неуточненной (неуказан
ной) схемой, то будет использоваться схема scott.
Советы и хитрости
Оператор SET SCHEMA не позволяет в качестве текущей схемы установить схе
му из удаленного сервера.
462 Глава 3. Справочник операторов SQL
SET SCHEMA не задает схему для неуточненных имен подпрограмм, таких как
процедуры, методы и функции, а только для таких объектов, как таблицы
и представления.
Этот оператор не поддерживается ни в одной платформе из числа рассматривае
мых в этой книге.
См. также
SET PATH
Синтаксис SQL2003
SET SESSION AUTHORIZATION имя_пользователя
Ключевые слова
имя_пользователя
Делает указанного пользователя текущим пользователем сессии. Имя поль
зователя можно задавать литералом, через параметр или переменную.
Общие правила
Этот оператор позволяет переключаться между пользователями и работать с их
привилегиями.
Советы и хитрости
В некоторых платформах вы можете использовать специальные ключевые сло
ва, такие как SESSION USER или CURRENT USER. Обычно они делают одно
и то же: возвращают имя пользователя текущей активной сессии. Однако ино
гда они могут возвращать и различные значения, например при использовании
функции SETUID или других похожих механизмов.
Для выполнения SET SESSION AUTHORIZATON требуются права суперполь
зователя, но обратное переключение на исходного пользователя вы сможете сде
лать, даже если текущий пользователь не имеет привилегий на выполнение SET
SESSION AUTHORIZATION.
С помощью следующего запроса вы могли бы получить результат функций
SESSION_USER и CURRENT_USER:
SET TIME ZONE 463
MySQL
Не поддерживается. Для использования привилегий другого пользователя необ
ходимо отключиться от MySQL, а затем подключиться заново.
Oracle
Не поддерживается. Для достижения аналогичного эффекта необходимо отклю
читься от сервера, а затем заново подключиться с помощью оператора CON0
NECT.
PostgreSQL
PostgreSQL поддерживает оператор в соответствии со стандартом ANSI. Единст
венным небольшим отличием является то, что по стандарту этот оператор нель
зя выполнять в рамках транзакции, а в PostgreSQL это не имеет значения.
SQL Server
Не поддерживается. Для достижения аналогичного эффекта необходимо отклю
читься от сервера, а затем заново подключиться с помощью оператора CON0
NECT.
См. также
CONNECT
GRANT
SESSION_USER
Синтаксис SQL2003
SET TIME ZONE {LOCAL | INTERVAL {+ | }'00:00'
[HOUR TO MINUTE]}
464 Глава 3. Справочник операторов SQL
Ключевые слова
LOCAL
Устанавливает для текущей сессии часовой пояс, используемый сервером.1
INTERVAL
Указывает смещение часового пояса от универсального координированного
времени (Coordinated Universal Time, UTC) в терминах часов и минут. Смеще
ние может быть как в сторону увеличения (+), так и уменьшения (–).
HOUR TO MINUTE
Указывает тип данных значения TIME ZONE.
Общие правила
Этот относительно простой оператор устанавливает в сессии пользователя либо
часовой пояс сервера (LOCAL), либо часовой пояс с заданным смещением относи
тельно универсального координированного времени (известного также как сред
нее время по Гринвичу, GMT). Например, INTERVAL 2 соответствует часовому
поясу с временем на 2 часа больше, чем UTC, а INTERVAL –6 соответствует часо
вому поясу с временем на 6 часов меньше, чем UTC.
Советы и хитрости
Как и большинство операторов SET, этот оператор может быть выполнен только
вне рамок транзакции. Другими словами, не следует окружать SET TIME
ZONE операторами START/BEGIN TRAN и COMMIT.
MySQL
Не поддерживается.
Oracle
Начиная с Oracle 9i, вы можете использовать для выбора часового пояса опера
тор ALTER SESSION следующего вида:
ALTER SESSION
SET TIME_ZONE = {'[+ | ] чч:мм'
| LOCAL
| DBTIMEZONE
| 'регион'}
Для установки в сессии часового пояса по умолчанию используйте LOCAL, а для
использования часового пояса базы данных используйте DBTIMEZONE. Вы мо
жете указывать название региона часового пояса, например ‘EST’ или ‘PST’, ли
бо указать смещение часового пояса в часах и минутах относительно UTC. На
пример, значение ‘5:00’ означает, что время отстает от UTC на 5 часов (т. е., ес
ли время UTC 10:00, то в указанном часовом поясе оно составляет 5:00).
PostgreSQL
PostgreSQL позволяет установить для сессии часовой пояс, используемый серве
ром по умолчанию, с помощью LOCAL или DEFAULT:
SET TIME ZONE {'часовой_пояс' | LOCAL | DEFAULT };
Существуют некоторые отклонения от стандарта ANSI:
'часовой_пояс'
Указывает название часового пояса. Набор допустимых значений зависит от
операционной системы. Например, каталог /usr/share/zoneinfo содержит
список часовых поясов на Linuxсерверах.
LOCAL | DEFAULT
Устанавливает часовой пояс, используемый по умолчанию в операционной
системе сервера.1
Например, ‘PST8PDT’ соответствует часовому поясу Калифорнии на Linuxсис
темах, а ‘Europe/Rome’ соответствует часовому поясу Италии как на Linux, так
и на других системах. Если вы указываете некорректный часовой пояс, то ис
пользуемым часовым поясом становится UTC.
В следующем примере в качестве часового пояса выбирается стандартное тихо
океанское время:
SET TIME ZONE 'PST8PDT';
А теперь возвращается часовой пояс, используемый по умолчанию:
SET TIME ZONE LOCAL;
SQL Server
Не поддерживается.
SET TRANSACTION
Оператор SET TRANSACTION определяет для транзакции такие параметры,
как возможность модификации данных, уровень изоляции и некоторые другие.
Синтаксис SQL2003
SET [LOCAL] TRANSACTION [READ ONLY | READ WRITE]
[ISOLATION LEVEL {READ COMMITTED | READ UNCOMMITTED |
REPEATABLE READ | SERIALIZABLE}]
[DIAGNOSTIC SIZE целое_число]
Ключевые слова
LOCAL
Меняет настройки транзакции текущей сессии только на локальном сервере.
Если ключевое слово LOCAL не указано, то меняются настройки для следую
щей транзакции, даже если она выполняется на удаленном сервере.
READ ONLY
Устанавливает для следующей транзакции режим «только чтение». После
окончания транзакции восстанавливается настройка по умолчанию.
READ WRITE
Позволяет следующей транзакции и чтение и запись данных.
ISOLATION LEVEL
Устанавливает уровень изоляции следующей транзакции в сессии.
READ COMMITTED
Позволяет транзакции читать строки, записанные другими транзакциями,
только после их фиксации.
READ UNCOMMITTED
Позволяет транзакции читать строки, записанные другими транзакциями,
но еще не зафиксированные.
REPEATABLE READ
Всем сессиям доступны данные, зафиксированные до начала первых транзак
ций в сессиях. Другие открытые сессии могут читать и изменять только дан
ные, зафиксированные в текущих сессиях. Следовательно, поздние транзак
ции могут добавить строки, которые видны транзакциям в более ранних сес
сиях, но для получения этих записей необходимо повторно выполнить запрос.
SET TRANSACTION 467
SERIALIZABLE
Все сессии могут видеть записи, зафиксированные до момента начала первых
транзакций этих сессий. До этого момента сессии могут видеть записи других
сессий, но не могут вставлять или обновлять данные до окончания тех тран
закций. Это наиболее строгий уровень изоляции и используется в SQL2003 по
умолчанию.
DIAGNOSTIC SIZE целое_число
Указывает число сообщений об ошибках, фиксируемых при выполнении тран
закции. Оператор GET DIAGNOSTICS позволяет получить эти сообщения.
Общие правила
Оператор SET TRANSACTION устанавливает параметры для следующей тран
закции. Поэтому этот оператор должен быть выполнен после окончания одной
транзакции, но до начала следующей. (Для начала новой транзакции с одновре
менным указанием ее характеристик используется оператор START TRANSAC0
TION.) Одним оператором можно установить несколько параметров транзак
ции, но при этом должен быть указан только один метод доступа, один уровень
изоляции и один параметр диагностики.
Уровень изоляции транзакции определяет степень изоляции транзакции от дей
ствий других параллельно выполняющихся транзакций. Уровень изоляции оп
ределяет следующее:
• Будут ли строки, прочитанные и обновленные в текущей сессии, доступны
другим одновременно выполняющимся сессиям базы данных.
• Будут ли обновления и записи строк другими транзакциями влиять на теку
щую транзакцию.
Если вы не знакомы с уровнями изоляции транзакций, то внимательно прочи
тайте документацию по платформе.
Советы и хитрости
Фраза ISOLATION LEVEL определяет параметры поведения и допустимые ано
малии, касающиеся одновременного выполнения транзакций. Существуют сле
дующие аномалии:
Грязное чтение
Возникает, когда в транзакции читаются данные, измененные, но не зафик
сированные другой транзакцией. В этом случае могут быть внесены измене
ния в записи, которые не были (а возможно и не будут) зафиксированы.
Неповторяющееся чтение
Возникает, когда в транзакции читается запись, модифицируемая из другой
транзакции. Если первая транзакция попытается вновь прочитать запись, то
запись в первоначальном виде не будет найдена.
Фантомные записи
Возникают в том случае, когда одна транзакция пытается прочитать строку,
которая еще не существует в начале данной транзакции, но вставляется вто
рой транзакцией, прежде чем закончится первая транзакция. Если первая
468 Глава 3. Справочник операторов SQL
MySQL
MySQL позволяет установить уровень изоляции следующей транзакции, всех
транзакций в сессии либо глобально во всех сессиях сервера:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED |READ COMMITTED | REPEATABLE READ
| SERIALIZABLE]
По умолчанию уровень изоляции определяется только для следующей транзак
ции. Ключевые слова следующие:
GLOBAL
Определяет уровень изоляции транзакций для всех последующих транзак
ций во всех пользовательских сессиях и системных потоках.
SESSION
Определяет уровень изоляции транзакций для всех последующих транзак
ций в текущей сессии.
TRANSACTION ISOLATION LEVEL
Устанавливает один из описанных в предыдущем разделе уровней изоляции
транзакций. По умолчанию в MySQL используется уровень REPEATABLE
READ.
Для установки уровня изоляции транзакций для всех сессий (GLOBAL) требует
ся привилегия SUPER. Также вы можете определить используемый по умолча
нию уровень изоляции при запуске MySQL из командной строки ключом –trans0
action0isolation=. Следующий оператор устанавливает для всех транзакций всех
сессий уровень изоляции SERIALIZABLE:
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Oracle
Oracle позволяет выбирать для транзакции режим «только чтение» или «чтение
запись», устанавливать уровень изоляции, а также использовать определенный
сегмент отката:
SET TRANSACTION 469
PostgreSQL
SET TRANSACTION в PostgreSQL влияет только на новую начинаемую тран
закцию. Поэтому вам может потребоваться начинать каждую транзакцию этим
оператором. Синтаксис следующий:
SET TRANSACTION ISOLATION LEVEL
{READ COMMITTED | SERIALIZABLE};
где:
READ COMMITTED
Устанавливает определенный стандартом ANSI уровень изоляции READ
COMMITTED. (Этот уровень изоляции используется по умолчанию.)
SERIALIZABLE
Устанавливает для транзакции уровень изоляции SERIALIZABLE.
По умолчанию в PostgreSQL используется уровень изоляции READ COMMIT0
TED. Поменять используемый по умолчанию уровень изоляции можно одним из
следующих операторов:
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL
{ READ COMMITTED | SERIALIZABLE }
SET default_transaction_isolation =
{ 'read committed' | 'serializable' }
Конечно, впоследствии вы опять можете изменить уровень изоляции отдельной
транзакции с помощью SET TRANSACTION.
Например, вы можете установить для следующей транзакции режим изоляции
SERIALIZABLE:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Также вы можете установить уровень изоляции SERIALIZABLE для всех тран
закций текущей сессии:
SET SESSION CHARACTERISTICS AS TRANSACTION
ISOLATION LEVEL SERIALIZABLE;
SQL Server
SET TRANSACTION в SQL Server устанавливает уровень изоляции транзакций
для всей сессии. Все операторы, следующие за SET TRANSACTION, выполня
ются с указанным уровнем изоляции, если только явно не выбран другой уро
вень. Синтаксис оператора следующий:
START TRANSACTION 471
См. также
COMMIT
ROLLBACK
START TRANSACTION
Оператор START TRANSACTION позволяет выполнить все функции оператора
SET TRANSACTION с одновременным началом новой транзакции.
Синтаксис SQL2003
START TRANSACTION [READ ONLY | READ WRITE]
[ISOLATION LEVEL {READ COMMITTED | READ UNCOMMITTED |
REPEATABLE READ | SERIALIZABLE}]
[DIAGNOSTIC SIZE целое_число]
472 Глава 3. Справочник операторов SQL
Ключевые слова
READ ONLY
Устанавливает для следующей транзакции режим «только чтение». После
окончания транзакции восстанавливается настройка по умолчанию.
READ WRITE
Позволяет следующей транзакции и чтение и запись данных.
ISOLATION LEVEL
Устанавливает уровень изоляции следующей транзакции в сессии.
READ COMMITTED
Позволяет транзакции читать строки, записанные другими транзакциями
только после их фиксации.
READ UNCOMMITTED
Позволяет транзакции читать строки, записанные другими транзакциями,
но еще не зафиксированные.
REPEATABLE READ
Всем сессиям доступны данные, зафиксированные до начала первых транзак
ций в сессиях. Другие открытые сессии могут читать и изменять только дан
ные, зафиксированные в текущих сессиях. Следовательно, поздние транзак
ции могут добавить строки, которые видны транзакциям в более ранних сес
сиях, но для получения этих записей необходимо повторно выполнить запрос.
SERIALIZABLE
Все сессии могут видеть записи, зафиксированные до момента начала первых
транзакций этих сессий. До этого момента сессии могут видеть записи других
сессий, но не могут вставлять или обновлять данные до окончания тех тран
закций. Это наиболее строгий уровень изоляции и используется в SQL2003 по
умолчанию.
DIAGNOSTIC SIZE целое_число
Указывает число сообщений об ошибках, фиксируемых при выполнении тран
закции. Оператор GET DIAGNOSTICS позволяет получить эти сообщения.
Общие правила
Согласно стандарту ANSI, единственным отличием START и SET является то,
что SET выполняется вне текущей транзакции, а START начинает новую тран
закцию. Таким образом, SET TRANSACTION влияет на настройки следующей
транзакции, а START TRANSACTION – текущей.
Хотя только MySQL поддерживает START TRANSACTION, три платформы (My
SQL, PostgreSQL, SQL Server) поддерживают аналогичный оператор BEGIN
[TRAN[SACTION]] и синоним BEGIN [WORK]. BEGIN TRANSACTION явно
начинает новую транзакцию, но не определяет ее уровень изоляции. Относи
тельно START TRANSACTION нужно помнить лишь то, что этот оператор опре
деляет режим доступа транзакции к данным, уровень изоляции и глубину диаг
ностики только для текущей транзакции. Если начинается новая транзакция,
то либо нужно заново устанавливать все эти свойства, либо использовать значе
ния по умолчанию.
START TRANSACTION 473
Советы и хитрости
Многие из рассматриваемых здесь платформ по умолчанию работают в режиме
автоматической фиксации транзакций. Поэтому желательно использовать яв
ные транзакции только в том случае, если все транзакции текущей сессии будут
явными. Другими словами, не смешивайте в одной сессии явные и автоматиче
ские транзакции. Каждая явно начатая транзакция может быть зафиксирована
только оператором COMMIT, а в случае возникновения ошибок и необходимо
сти отката нужно использовать ROLLBACK.
MySQL
MySQL по умолчанию работает в режиме автоматической фиксации транзакций,
что означает, что все успешные изменения данных записываются на диск сразу же
после выполнения, а в случае возникновения ошибки – сразу же откатываются.
MySQL поддерживает оператор START TRANSACTION и его синоним BEGIN.
Вы можете отложить автоматическую фиксацию для одного или нескольких
операторов, используя следующий синтаксис:
START TRANSACTION [WITH CONSISTENT SNAPSHOT]
BEGIN [WORK]
474 Глава 3. Справочник операторов SQL
где:
WITH CONSISTENT SNAPSHOT
Начинает согласованное чтение данных при использовании механизмов хра
нения, поддерживающих согласованные чтения (на текущий момент только
InnoDB) при работе на уровнях изоляции SERIALIZABLE и REPEATABLE
READ.
BEGIN [WORK]
Объявляет начало одной или нескольких транзакций. Слово WORK необяза
тельно и не несет функциональной нагрузки.
Следующий оператор отключает режим автоматической фиксации транзакций
для всех сессий и потоков:
SET AUTOCOMMIT=0
После отключения режима автоматической фиксации транзакции требуется
фиксировать все сделанные изменения с помощью COMMIT и откатывать все
изменения с помощью ROLLBACK. Отключение автоматической фиксации тран
закций имеет смысл только для транзакционнобезопасных таблиц, таких как
таблицы InnoDB и BDB. Отключение автоматической фиксации транзакций для
транзакционнонебезопасных таблиц не имеет никакого эффекта – автоматиче
ская фиксация все равно будет выполняться.
Oracle
Не поддерживается. Транзакции в Oracle начинаются неявно. Обратитесь к опи
санию оператора SET TRANSACTION для Oracle за информацией об управлении
отдельными транзакциями.
PostgreSQL
PostgreSQL не поддерживает START TRANSACTION. Вместо этого использует
ся следующий синтаксис:
BEGIN [ WORK | TRANSACTION ]
START TRANSACTION 475
где:
BEGIN
Объявляет начало одной или нескольких транзакций.
WORK
Необязательное слово, не имеющее никакого эффекта.
TRANSACTION
Необязательное слово, не имеющее никакого эффекта.
PostgreSQL по умолчанию работает в режиме автоматической фиксации тран
закций, т. е. каждый оператор DML выполняется в отдельной транзакции. Если
оператор выполняется без ошибок, то PostgreSQL автоматически выполняет
COMMIT, а в случае возникновения ошибок – ROLLBACK. Оператор BEGIN по
зволяет явно выполнить COMMIT или ROLLBACK по окончании транзакции,
состоящей из нескольких операторов.
Транзакции, управляемые вручную, работают значительно быстрее автоматиче
ских транзакций. Для максимальной изоляции транзакций следует использовать
уровень SERIALIZABLE. PostgreSQL позволяет использовать различные опера
торы DML (INSERT, UPDATE, DELETE) внутри блока BEGIN...COMMIT. Од
нако при выполнении COMMIT либо фиксируются все изменения, либо не фик
сируются никакие, в зависимости от успешности выполнения COMMIT.
SQL Server
SQL Server поддерживает оператор BEGIN TRANSACTION вместо предписанно
го стандартом ANSI оператора START TRANSACTION. Также поддерживаются
небольшие расширения, упрощающие резервное копирование и восстановление.
Синтаксис оператора следующий:
BEGIN TRAN[SACTION] [дескриптор_транзакции
[WITH MARK [ 'дескриптор_журнала' ]]]
где:
TRAN[SACTION]
Объявляет начало транзакции. Вместо TRANSACTION можно использовать
сокращение TRAN.
476 Глава 3. Справочник операторов SQL
дескриптор_транзакции
Литерал или переменная символьного типа (CHAR, NCHAR, VARCHAR или
NVARCHAR) до 32 символов в длину, задающие имя, используемое для иден
тификации транзакции. При работе с вложенными транзакциями именует
только самую внешнюю транзакцию.
WITH MARK дескриптор_журнала
Указывает текстовую метку, записываемую в журнал транзакций. Это позво
ляет восстанавливать базу данных, находящуюся в режиме полного восстанов
ления, до определенного момента времени, зафиксированного этой меткой.
WITH MARK необходимо использовать совместно с именованной транзакцией.
При использовании вложенных транзакций имя транзакции может быть указа
но только в самой внешней паре операторов BEGIN...COMMIT или BEGIN...
ROLLBACK. В целом мы рекомендуем избегать вложенных транзакций.
Вот пример для SQL Server, в котором несколько операторов INSERT выполня
ются в рамках одной транзакции:
BEGIN TRANSACTION
INSERT INTO sales VALUES('7896','JR3435','Oct 28 2003',25,
'Net 60','BU7832')
INSERT INTO sales VALUES('7901','JR3435','Oct 28 2003',17,
'Net 30','BU7832')
INSERT INTO sales VALUES('7907','JR3435','Oct 28 2003',6,
'Net 15','BU7832')
COMMIT
GO
Если по какимто причинам задерживается выполнение одного из операторов
INSERT, задерживаются все операторы, так как они выполняются в одной тран
закции.
См. также
COMMIT
ROLLBACK
Subquery (подзапросы)
Подзапросы – это вложенные запросы. Подзапросы могут быть использованы
в разных частях оператора SQL.
Синтаксис SQL2003
Скалярные, табличные и вложенные табличные подзапросы представлены в сле
дующем обобщенном виде:
SELECT столбец1, столбец2, ... (скалярный_подзапрос)
FROM таблица1, ... (вложенный_табличный_подзапрос)
AS имя_табличного_подзапроса]
WHERE foo = (скалярный_подзапрос)
OR foo IN (табличный_подзапрос)
Коррелированные подзапросы более сложны, так как они зависят от значений,
получаемых внешним запросом. Например:
SELECT столбец1
FROM таблица1 AS t1
WHERE foo IN
(SELECT значение1
FROM таблица2 AS t2
WHERE t2.pk_identifier = t1.fk_identifier)
IN использован только для демонстрации. Вместо IN можно использовать лю
бой оператор сравнения.
Ключевые слова
скалярный_подзапрос
Включает скалярный подзапрос в список элементов SELECT или во фразы
WHERE и HAVING.
вложенный_табличный_подзапрос
Включает вложенный табличный подзапрос во фразу FROM в сочетании с AS.
табличный_подзапрос
Включает табличный подзапрос во фразу WHERE в сочетании с такими опе
раторами, как IN, ANY, SOME, EXISTS или ALL, для работы с множествами
значений. Табличные подзапросы возвращают одну или несколько строк, ка
ждая из которых содержит одиночное значение.
Общие правила
Подзапросы позволяют получить одно или несколько значений и использовать
их в операторах SELECT, INSERT, UPDATE или DELETE либо внутри другого
подзапроса. Подзапросы можно использовать везде, где допустимы выражения.
Часто подзапрос можно заменить эквивалентным соединением. В некоторых
платформах подзапросы могут работать менее эффективно, чем соединения.
Советы и хитрости
На большинстве платформ подзапросы не должны использовать большие объек
ты (например, BLOB и CLOB на Oracle и IMAGE и TEXT на SQL Server), а также
типы данныхколлекции (такие как TABLE и CURSOR на SQL Server).
Все платформы поддерживают подзапросы, но не все платформы поддерживают
все виды подзапросов. Таблица 3.7 показывает, какие подзапросы поддержива
ются каждой платформой.
В настоящий момент все платформы поддерживают все виды подзапросов.
Таблица 3.7. Поддержка подзапросов платформами
Платформа MySQL Oracle PostgreSQL SQL Server
Скалярный подзапрос в списке + + – +
элементов SELECT
Скалярный подзапрос во фразах + + + +
WHERE/HAVING
Векторный подзапрос во фра + + + +
зах WHERE/HAVING
Вложенный табличный подза + + + +
прос во фразе FROM
Коррелированный подзапрос во + + + +
фразах WHERE/HAVING
480 Глава 3. Справочник операторов SQL
Примеры
В этом разделе приводятся примеры подзапросов, работающие одинаково кор
ректно на MySQL, Oracle, PostgreSQL и SQL Server.
В первом примере показан простой скалярный подзапрос в списке элементов SE0
LECT:
SELECT job, (SELECT AVG(salary) FROM employee) AS "Avg Sal"
FROM employee
Вложенные табличные подзапросы используются так же, как и представления.
В следующем примере мы в подзапросе получаем зарплату и уровень образова
ния, а затем во внешнем запросе агрегируем полученные значения:
SELECT AVG(edlevel), AVG(salary)
FROM (SELECT edlevel, salary
FROM employee) AS emprand
GROUP BY edlevel
MySQL
MySQL поддерживет вложенные табличные подзапросы в качестве элементов
списка SELECT и во фразе WHERE.
482 Глава 3. Справочник операторов SQL
Oracle
Oracle поддерживает подзапросы, описанные в стандарте ANSI, но называются
они иначе. Вложенный табличный подзапрос, используемый во фразе FROM,
называется вложенным представлением (inline view). Это выглядит разумно,
так как вложенные табличные подзапросы фактически являются представле
ниями, создаваемыми на лету. Подзапросы, используемые во фразах WHERE
и HAVING, называются вложенными подзапросами. Oracle также поддерживает
коррелированные подзапросы в списке элементов SELECT и во фразах WHERE
и HAVING.
PostgreSQL
PostgreSQL поддерживает подзапросы во фразах FROM, WHERE и HAVING.
Однако подзапросы во фразе HAVING не могут содержать ORDER BY, FOR UP0
DATE и LIMIT. На текущий момент PostgreSQL также поддерживает подзапро
сы в списке элементов SELECT.
SQL Server
SQL Server поддерживает подзапросы, описанные в стандарте ANSI. Скалярные
подзапросы могут использоваться практически везде, где допустимы обычные
выражения. Подзапросы не могут содержать фразы COMPUTE и FOR BROWSE
и могут содержать ORDER BY, если также используется TOP.
См. также
DELETE
INSERT
SELECT
UPDATE
WHERE
TRUNCATE TABLE
Оператор TRUNCATE TABLE, не описанный в стандарте ANSI, безвозвратно,
без журналирования удаляет данные из таблицы. Этот оператор быстро удаляет
все строки из таблицы, не изменяя структуру самой таблицы и не записывая ни
каких (или записывая небольшое количество) данных в журналы транзакций.
Однако так как TRUNCATE TABLE не журналируется, то он не может быть от
качен после выполнения.
Ключевые слова
имя_таблицы
Указывает любую таблицу в текущей базе данных или схеме.
Общие правила
Оператор TRUNCATE TABLE действует так же, как и оператор DELETE без
фразы WHERE, – удаляет все строки таблицы. Однако есть существенный ню
анс: оператор TRUNCAET TABLE не журналируется, поэтому работает быстрее,
но не может быть откачен в случае ошибочного запуска, а кроме того, TRNCATE
TABLE не вызывает срабатывания триггеров, которые запускаются оператором
DELETE.
Этот оператор следует выполнять вручную. Мы очень не рекомендуем использо
вать этот оператор в автоматизированных скриптах или промышленно эксплуа
тирующихся системах, содержащих ценные данные. TRUNCATE TABLE не
комбинируется с операторами управления транзакциями, такими как BEGIN
TRAN или COMMIT.
Советы и хитрости
Так как оператор TRUNCATE TABLE не журналируется, то обычно он использу
ется только при базах данных разработчиков. В промышленных базах данных
используйте его очень осторожно.
MySQL
MySQL версий 3.23 и старше поддерживает базовый вариант оператора:
TRUNCATE TABLE имя_таблицы
Для выполнения TRUNCATE TABLE MySQL удаляет таблицу, а затем создает ее
заново. Так как MySQL хранит каждую таблицу в файле <имя_таблицы>.frm,
то этот файл должен присутствовать в каталоге базы данных для корректной ра
боты оператора.
Например, для удаления всех строк из таблицы publishers можно выполнить:
TRUNCATE TABLE publishers
484 Глава 3. Справочник операторов SQL
Oracle
Oracle позволяет очищать таблицы и индексные кластеры (но не хешкластеры).
Используется следующий синтаксис:
TRUNCATE { CLUSTER [владелец.]кластер
| TABLE [владелец.]таблица [{PRESERVE | PURGE} MATERIALIZED VIEW LOG] }
[{DROP | REUSE} STORAGE]
Oracle был первой платформой, поддерживающей TRUNCATE TABLE, осталь
ные платформы начали поддерживать этот оператор позднее. TRUNCATE TAB0
LE в Oracle имеет больше возможностей, чем обычно реализуется в других плат
формах.
CLUSTER | TABLE
Указывает, очищается ли кластер или таблица. Индексный кластер – это фи
зическая структура, в которой связанные записи таблицы хранятся на диске
рядом, что уменьшает необходимое для соединений число операций ввода
вывода. Опции MATERIALIZED VIEW LOG и STORAGE при очистке класте
ров не используются.
{PRESERVE | PURGE} MATERIALIZED VIEW LOG
Сохраняет (PRESERVE) или очищает (PURGE) журнал материализованных
представлений при очистке таблицы.
{DROP | REUSE} STORAGE
Позволяет освободить пространство, ранее занимавшееся очищенной табли
цей (DROP), либо оставить его выделенным таблице, хотя и пустым (REUSE).
Например:
TRUNCATE TABLE scott.authors
PRESERVE MATERIALIZED VIEW LOG REUSE STORAGE
Этот оператор удаляет все записи из таблицы scott.authors. При этом сохраняет
ся журнал материализованных представлений, а занятое этой таблицей про
странство не освобождается.
PostgreSQL
Реализация оператора в PostgreSQL отличается от общепринятого стандарта
тем, что ключевое слово TABLE является необязательным:
TRUNCATE TABLE имя_таблицы
Следующий оператор удаляет все записи из таблицы authors:
TRUNCATE TABLE authors
SQL Server
SQL Server поддерживает оператор в общепринятом стандартном виде.
См. также
DELETE
UNION 485
UNION
Оператор UNION объединяет результаты двух запросов в одно множество.
UNION относится к операторам работы с множествами. Другие операторы ра
боты с множествами включают INTERSECT и EXCEPT/MINUS. (EXCEPT
и MINUS функционально эквивалентны, но EXCEPT является стандартом по
ANSI.) Все эти операторы предназначены для одновременной работы с результи
рующими множествами нескольких запросов, отсюда и название – операторы
работы с множествами.
Синтаксис SQL2003
На число запросов, которые можно объединять с помощью UNION, никаких
ограничений не накладывается. Общий синтаксис оператора следующий:
<оператор_select1>
UNION [ALL | DISTINCT]
<оператор_select2>
UNION [ALL | DISTINCT]
...
Ключевые слова
UNION
Объединяет результирующие наборы операторов в один набор. Повторяю
щиеся строки по умолчанию исключаются.
ALL | DISTINCT
Позволяет исключить повторяющиеся строки из конечного результата (DIS0
TINCT) либо оставить повторяющиеся строки (ALL). Столбцы с пустыми зна
чениями считаются одинаковыми. Если не указано ни ALL, ни DISTINCT, то
по умолчанию дубликаты удаляются.
Общие правила
При использовании UNION следует помнить только об одном существенном пра
виле: порядок, число и типы данных во всех объединяемых запросах должны
совпадать.
Типы данных не должны быть идентичными, но они должны быть совместимы
ми. Например, совместимыми являются типы данных CHAR и VARCHAR. Как
правило, в результирующем множестве будет использован самый длинный тип
данных. Например, если объединяются три запроса, в которых столбцы имеют
486 Глава 3. Справочник операторов SQL
Советы и хитрости
Хотя согласно стандарту ANSI оператор INTERSECT имеет наибольший при
оритет среди всех операторов работы с множествами, большинство платформ
выполняют все операторы работы с множествами с равным приоритетом. Вы мо
жете явно определять порядок выполнения операторов с помощью скобок.
В противном случае с большой вероятностью операторы будут выполняться в по
рядке следования, сверху вниз.
На некоторых платформах использование DISTINCT может приводить к боль
шим затратам на выполнение запроса, так как при этом требуется дополнитель
ный проход по данным для удаления дубликатов. Поэтому если вы уверены, что
в данных дубликатов нет (либо их не требуется удалять), то используйте ALL для
более быстрого выполнения запроса.
В соответствии со стандартом ANSI можно использовать только одну фразу OR0
DER BY для всего оператора. Используйте ее в конце последнего оператора SE0
LECT. Для исключения неоднозначности в столбцах и таблицах вы можете снаб
дить все столбцы соответствующими одинаковыми псевдонимами. Однако для
именования столбцов конечного результата используются только псевдонимы
из первого запроса в SELECT…UNION. Например:
SELECT au_lname AS "lastname", au_fname AS "firstname"
FROM authors
UNION
SELECT emp_lname AS "lastname", emp_fname AS "firstname"
FROM employees
ORDER BY lastname, firstname
Хотя наборы столбцов запросов могут иметь совместимые типы данных, в неко
торых платформах могут быть различия в обработке длин столбцов. Например,
если столбец au_lname из первого запроса имеет значительно большую длину,
чем столбец emp_name из второго запроса, то правила выбора длины столбца
для конечного результата могут быть различными в разных платформах. Хотя
обычно просто выбирается тип с наибольшей длиной (наименее ограниченный).
Каждая СУБД может иметь свои правила именования столбцов в случае, когда
столбцы в запросах имеют разные названия. Обычно используются названия
столбцов из первого запроса.
MySQL
Не поддерживается.
Oracle
Oracle поддерживает базовую функциональность операторов UNION и UNION
ALL в соответствии со следующим синтаксисом:
<оператор_select1>
UNION [ALL]
<оператор_select2>
UNION 487
UNION [ALL]
...
Вместо UNION DISTINCT следует использовать функционально эквивалент
ный UNION. Нельзя использовать оператор UNION в следующих случаях:
• Если запросы содержат столбцы типов LONG, BLOB, CLOB, BFILE и VARRAY.
• Если запросы содержат фразы FOR UPDATE и выражения TABLE.
Если первый запрос содержит выражения в списке столбцов, то для этих выра
жений при помощи AS должны быть заданы псевдонимы. Также только послед
ний запрос может содержать фразу ORDER BY. Например, мы можем получить
все идентификаторы магазинов, без дубликатов, с помощью следующего запроса:
SELECT stor_id FROM stores
UNION
SELECT stor_id FROM sales
PostgreSQL
PostgreSQL поддерживает базовую функциональность операторов UNION и UNI0
ON ALL в соответствии со следующим синтаксисом:
<оператор_select1>
UNION [ALL]
<оператор_select2>
UNION [ALL]
...
PostgreSQL не поддерживает оператор UNION и UNION ALL для запросов, со
держащих фразу FOR UPDATE. Вместо UNION DISTINCT следует использо
вать функционально эквивалентный UNION.
Самый первый запрос не может содержать фразы LIMIT и ORDER BY. После
дующие запросы могут содержать эти фразы, но такие запросы должны быть за
ключены в скобки. Иначе самое последнее вхождение LIMIT и ORDER BY будет
применено к конечному результату.
Например, вы могли бы получить список авторов и всех сотрудников, фамилии
которых начинаются на ‘P’, следующим запросом:
SELECT a.au_lname
FROM authors AS a
WHERE a.au_lname LIKE 'P%'
UNION
SELECT e.lname
FROM employee AS e
WHERE e.lname LIKE 'W%';
SQL Server
SQL Server поддерживает базовую функциональность операторов UNION и UNI0
ON ALL в соответствии со следующим синтаксисом:
<оператор_select1>
UNION [ALL]
<оператор_select2>
488 Глава 3. Справочник операторов SQL
UNION [ALL]
...
Вместо UNION DISTINCT следует использовать функционально эквивалент
ный UNION.
Вы можете использовать SELECT…INTO вместе с UNION и UNION ALL, но IN0
TO может быть использовано только в самом первом запросе объединения. Спе
циальные ключевые слова, такие как SELECT TOP или GROUP BY…WITH
CUBE, можно использовать во всех запросах объединения при условии, что если
они используются в одном запросе, то они должны быть использованы и во всех
остальных запросах. Если вы используете SELECT TOP или GROUP BY…WITH
CUBE только в одном запросе, то оператор завершится с ошибкой.
Все объединяемые запросы должны иметь одинаковое число столбцов. Типы со
ответствующих столбцов не должны быть строго одинаковыми, но должны быть
совместимыми. Например, одновременное использование CHAR и VARCHAR до
пустимо. SQL Server использует для результирующего набора наибольший из
двух типов. Например, если SELECT…UNION содержит столбцы типов CHAR(5)
и CHAR(10), то в результирующем наборе будет использован тип CHAR(10).
Числовые значения конвертируются и возвращаются с наиболее точным типом
данных.
В следующем примере объединяются результаты двух запросов, использующих
GROUP BY…WITH CUBE:
SELECT ta.au_id, COUNT(ta.au_id)
FROM pubs..titleauthor AS ta
JOIN pubs..authors AS a ON a.au_id = ta.au_id
WHERE ta.au_id >= '722 51 5454'
GROUP BY ta.au_id WITH CUBE
UNION
SELECT ta.au_id, COUNT(ta.au_id)
FROM pubs..titleauthor AS ta
JOIN pubs..authors AS a ON a.au_id = ta.au_id
WHERE ta.au_id < '722 51 5454'
GROUP BY ta.au_id WITH CUBE
См. также
EXCEPT
INTERSECT
MINUS
SELECT
UPDATE
Оператор UPDATE изменяет существующие в таблице данные. С большой осто
рожностью используйте оператор UPDATE без фразы WHERE, так как в этом
случае изменяются все строки таблицы.
UPDATE 489
Синтаксис SQL2003
UPDATE [ONLY] { имя_таблицы | имя_представления}
SET {{имя_столбца = { ARRAY [элемент_массива[, ...]] |
DEFAULT | NULL | скалярное_выражение },
имя_столбца = { ARRAY | DEFAULT |
NULL | скалярное_выражение }
[, ...]}
| ROW = выражение_список}
[ WHERE условие_поиска | WHERE CURRENT OF имя_курсора ]
Ключевые слова
ONLY
Используется только с объектными таблицами и представлениями для ука
зания того, что не требуется обновлять подтаблицы целевой таблицы. По
пытка использования этой опции для обновления обычных таблиц приведет
к ошибке.
имя_таблицы | имя_представления
Указывает целевую таблицу или представление, обновляемые оператором
UPDATE. Вы должны иметь соответствующие привилегии для обновления
таблицы. Обновление представлений имеет свои особенности. В целом реко
мендуется выполнять UPDATE только для представлений, построенных на
базе одной таблицы.
SET
Присваивает определенное значение столбцу или строке.
имя_столбца
Используется совместно с SET в формате SET столбец1 = ‘foo’. Позволяет
присвоить столбцу новое значение. Вы можете обновить любое количество
столбцов, но нельзя обновлять один столбец несколько раз в рамках одного
оператора.
ARRAY [элемент_массива[, ...]]
Записывает в столбец массив значений или пустой массив (при помощи AR0
RAY[]). Эта опция не очень широко поддерживается различными платфор
мами.
NULL
Присваивает столбцу значение NULL.
490 Глава 3. Справочник операторов SQL
DEFAULT
Присваивает столбцу значение, используемое по умолчанию, заданное при
помощи DEFAULT.
скалярное_выражение
Присваивает столбцу любое одиночное значение, будь то строковый или чи
словой литерал, скалярная функция или скалярный подзапрос.
ROW
Используется совместно с SET в формате SET ROW = ROW(‘foo’,’bar’) вместо
присвоения значений отдельным столбцам в виде SET столбец=значение.
Эта опция не очень широко поддерживается различными платформами.
выражение_список
Устанавливает значение для каждого столбца таблицы.
WHERE условие_поиска
Определяет условие отбора строк, обновляемых оператором. Можно исполь
зовать любое допустимое условие WHERE. Как правило, это условие прове
ряется отдельно для каждой строки перед выполнением оператора. Если ус
ловие поиска является подзапросом, то подзапрос выполняется для каждой
строки, что может занять очень много времени.
WHERE CURRENT OF имя_курсора
Ограничивает действие оператор UPDATE текущей записью указанного кур
сора.
Общие правила
Оператор UPDATE используется для изменения значений в одном или несколь
ких столбцах строк таблицы или представления. Как правило, вы одним опера
тором будете обновлять одну или несколько строк. Новые значения должны быть
скалярами (за исключением выраженийсписков и массивов). То есть каждый
столбец должен получать одиночное значение, постоянное на момент выполне
ния транзакции, неважно, является оно литералом или формируется функцией
или подзапросом.
Простейший оператор UPDATE без фразы WHERE выглядит так:
UPDATE authors
SET contract = 0
В этом примере обнуляются статусы контрактов всех авторов (т. е. контракты
с авторами разрываются). Аналогичным образом в UPDATE можно использо
вать арифметические выражения:
UPDATE titles
SET price = price * 1.1
Этот оператор UPDATE увеличивает цену всех книг на 10%.
Вы можете в одном операторе обновлять несколько столбцов. В следующем при
мере мы приводим имена и фамилии авторов к верхнему регистру:
UPDATE authors SET au_lname = UPPER(au_lname),
au_fname = UPPER(au_fname);
UPDATE 491
Советы и хитрости
Оператор UPDATE изменяет значения в существующих записях таблицы. Если
вы хотите обновлять представление, то такое представление должно содержать
все обязательные (NOT NULL) столбцы, в противном случае оно не будет обнов
ляемым. Столбцы, имеющие значения по умолчанию, можно опускать.
Фраза SET ROW не поддерживается большинством платформ, и следует избе
гать ее использования. Фраза WHERE CURRENT OF поддерживается достаточ
но широко, но она предназначена для использования с курсорами: ознакомьтесь
с предназначением и функциональностью курсоров, прежде чем использовать
WHERE CURRENT OF.
При интерактивной работе с базой данных рекомендуется перед выполнением
UPDATE выполнять SELECT с аналогичной фразой WHERE. Это позволяет
просмотреть записи, которые будут обновлены, и убедиться, что вы не измените
чеголибо, что не собирались.
492 Глава 3. Справочник операторов SQL
MySQL
MySQL поддерживает стандарт ANSI с небольшими вариациями, включающими
фразы LOW PRIORITY, IGNORE и LIMIT:
UPDATE [LOW PRIORITY] [IGNORE] имя_таблицы
SET имя_столбца = {скалярное_выражение}
[, ...]
WHERE условие_поиска
[ORDER BY столбец1 [{ASC | DESC}][, ...]]
[LIMIT целое_число]
где:
LOW PRIORITY
Предписывает отложить выполнение UPDATE до того момента, как все кли
енты завершат чтение из таблицы.
IGNORE
Указывает, что можно игнорировать сообщения об ошибках, генерируемые
ограничениями PRIMARY KEY и UNIQUE. Тем не менее обновляются толь
ко те строки, при обновлении которых ошибки не возникают.
ORDER BY
Указывает порядок, в котором следует обновлять строки.
LIMIT целое_число
Ограничивает UPDATE указанным числом обновленных строк.
MySQL поддерживает присваивание значения по умолчанию с помощью DEFA0
ULT в операторе INSERT, но в UPDATE такая возможность на текущий момент
отсутствует.
Следующий оператор UPDATE увеличивает все цены в таблице titile на 1:
UPDATE titles SET price = price + 1;
Следующий оператор UPDATE увеличивает цены только для первых 10 записей
в таблице titles (по возрастанию поля title_id). Цена увеличивается дважды, вы
ражения выполняются слева направо: сперва цена удваивается, затем прибавля
ется 1:
UPDATE titles
SET price = price * 2,
price = price + 1
ORDER BY title_id
LIMIT 10;
Oracle
Оператор UPDATE в Oracle позволяет обновлять таблицы, представления, мате
риализованные представления и подзапросы:
UPDATE [ONLY]
{ [схема.]{представление | материализованное представление |
таблица}
[@связь_с_базой_данных] [псевдоним]
{[PARTITION (секция)] |
UPDATE 493
[SUBPARTITION (подсекция)]}
| подзапрос [WITH { [READ ONLY] |
[CHECK OPTION [CONSTRAINT ограничение]] }]
| [TABLE (выражение_коллекция) [ ( + ) ] ] }
SET {столбец1[, ...]} = {выражение[, ...] | подзапрос} |
VALUE [(псевдоним)] = {значение | (подзапрос)},
{столбец2[, ...]} = {выражение[, ...] | подзапрос } |
VALUE [(псевдоним)] = {значение | (подзапрос)},
[, ...]
{WHERE условие_поиска | CURRENT OF имя_курсора}
[RETURNING выражение[, ...] INTO переменная[, ...]];
Синтаксические элементы оператора UPDATE следующие:
ONLY
Обновляет только записи указанного представления, но не представлений
потомков, образующих иерархию.
материализованное_представление
Применяет UPDATE к указанному материализованному представлению.
@связь_с_базой_данных
Позволяет применить UPDATE к объекту на удаленном сервере с помощью
указанной связи с базой данных.
псевдоним
Указывает псевдоним для обновляемой таблицы. Oracle позволяет в операто
ре UPDATE указывать псевдонимы для таблиц, но не с помощью AS. Псевдо
нимы могут быть также использованы во фразе VALUE.
PARTITION
Применяет UPDATE к указанной секции, а не ко всей таблице. При обновле
нии секционированной таблицы имя секции указывать необязательно. Но
это во многих случаях может уменьшить сложность фразы WHERE.
SUBPARTITION
Применяет оператор UPDATE к указанной подсекции, а не ко всей таблице.
WITH READ ONLY
Указывает, что подзапрос нельзя обновлять. В некоторых случаях UPDATE
может модифицировать записи, используемые в подзапросе, а WITH READ
ONLY предотвращает это.
WITH CHECK OPTION
Запрещает выполнять любые изменения в обновляемой таблице, если изме
ненные данные не будут попадать в результирующее множество подзапроса.
CONSTRAINT
Указывает Oracle на допустимость выполнения только изменений, удовле
творяющих указанному ограничению целостности.
SET VALUE
Позволяет установить значения сразу для целой строки для любого типа TAB0
LE. Фраза SET VALUE аналогична описанной в стандарте ANSI фразе SET
494 Глава 3. Справочник операторов SQL
PostgreSQL
PostgreSQL поддерживает стандартный синтаксис UPDATE с небольшими отли
чиями: поддерживается фраза FROM, а также работа с массивами, но без фразы
ARRAY. Синтаксис следующий:
UPDATE [ONLY] {таблица | представление}
SET столбец1 = {DEFAULT | NULL | скалярное_выражение},
столбец2 = {DEFAULT | NULL | скалярное_выражение}
[, ...]
[FROM {таблица1 [AS псевдоним], таблица2 [AS псевдоним]
[, ...]}]
[ WHERE условие_поиска | WHERE CURRENT OF имя_курсора ]
Большинство элементов синтаксиса соответствуют ANSI. Единственный нестан
дартный элемент следующий:
FROM
Позволяет построить условие поиска обновляемых строк на базе соединения.
FROM не используется, когда для поиска обновляемых строк достаточно од
ной (обновляемой) таблицы.
В следующем примере мы хотим обновить поле job_lvl для сотрудников, имею
щих в job_id значение 12 и в min_lvl значение 25. Мы могли бы сделать это с помо
щью большого сложного подзапроса либо построив соединение с помощью FROM:
UPDATE employee
SET job_lvl = 80
FROM employee AS e, jobs AS j
WHERE e.job_id = j.job_id
AND j.job_id = 12
AND j.min_lvl = 25;
Все остальные возможности оператора, описанные в ANSI, полностью поддер
живаются.
SQL Server
SQL Server поддерживает большую часть возможностей UPDATE, описанных
в ANSI, за исключением ключевых слов ONLY и ARRAY и работы с массивами.
Однако в SQL Server в оператор UPDATE добавлена возможность использовать
фразу WITH, подсказки оптимизатору во фразе OPTION, а также работа с пере
менными.
UPDATE {таблица | представление | набор_строк}
[WITH (подсказка1, подсказка2[, ...])]
SET {столбец = {DEFAULT | NULL | скалярное_выражение}
| переменная = скалярное_выражение
| переменная = столбец = скалярное_выражение }[, ...]
[FROM {таблица1 | представление1 |
вложенное_представление1 | набор_строк1}[, ...]]
[AS псевдоним]
[JOIN {таблица2[, ...]}]
496 Глава 3. Справочник операторов SQL
См. также
DECLARE
SELECT
WHERE
WHERE
Фраза WHERE определяет условия поиска для таких операторов, как SELECT,
UPDATE и DELETE. Любые строки, не удовлетворяющие указанному условию,
не затрагиваются оператором. Условие поиска может включать вычисления, бу
левы операторы и предикаты SQL (например, LIKE или BETWEEN).
498 Глава 3. Справочник операторов SQL
Синтаксис SQL2003
{ WHERE условие_поиска | WHERE CURRENT OF имя_курсора }
Ключевые слова
WHERE условие_поиска
Определяет условие отбора строк, затрагиваемых оператором.
WHERE CURRENT OF имя_курсора
Ограничивает действие оператора текущей строкой указанного курсора.
Общие правила
Фраза WHERE используется в операторах SELECT, DELETE, INSERT…SE0
LECT, UPDATE и в любых операторах, содержащих запросы и подзапросы (та
ких как DECLARE, CREATE TABLE, CREATE VIEW и т. д.).
Условия поиска, каждое из которых уже обсуждалось в книге отдельно, вклю
чают:
Сравнение с множеством строк (=ALL, >ALL, <= ALL, SOME/ANY)
Для получения списка издателей, живущих в тех же городах, что и их авто
ры, можно использовать следующий запрос:
SELECT pub_name
FROM publishers
WHERE city = SOME (SELECT city FROM authors);
Комбинирование условий (AND, OR и NOT)
Например, для получения списка авторов с продажами не менее 75 единиц,
либо с гонораром не менее 60, можно использовать следующий запрос:
SELECT a.au_id
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id = ta.au_id
WHERE ta.title_id IN (SELECT title_id FROM sales
WHERE qty >= 75)
OR (a.au_id IN (SELECT au_id FROM titleauthor
WHERE royaltyper >= 60)
AND a.au_id IN (SELECT au_id FROM titleauthor
WHERE au_ord = 2));
Операторы сравнения (такие как =, < >, <, >, <= и >=)
Следующий запрос извлекает имена и фамилии авторов, не имеющих на те
кущий момент контракта (поле contract равно 0):
SELECT au_lname, au_fname
WHERE 499
FROM authors
WHERE contract = 0;
Операторы работы со списками (IN и NOT IN)
Получить список всех авторов, для которых нет записей в таблице title
author, можно так:
SELECT au_fname, au_lname
FROM authors
WHERE au_id NOT IN (SELECT au_id FROM titleauthor);
Операторы сравнения с NULL (IS NULL и IS NOT NULL)
Для получения списка наименований, для которых с начала года не было ни
одной продажи, можно использовать такой запрос:
SELECT title_id, SUBSTRING(title, 1, 25) AS title
FROM titles
WHERE ytd_sales IS NULL;
Советы и хитрости
При использовании во фразе WHERE некоторых типов данных (таких как LOB)
или определенных кодировок (включая UNICODE) могут потребоваться специ
альные конструкции.
Скобки используются для определения порядка вычисления фразы WHERE.
Выражение, заключенное в скобки, вычисляется раньше других. Вложенные
скобки задают иерархию вычислений. Скобки, вложенные глубже всего, вычис
ляются самими первыми. Существуют две причины, по которым использовать
скобки следует осторожно:
• Всегда должно быть одинаковое число открывающих и закрывающих ско
бок. Нарушение этого баланса приводит к ошибке.
• Всегда нужно внимательно следить за расположением скобок, так как распо
ложение скобки не в том месте может значительно менять результат запроса.
500 Глава 3. Справочник операторов SQL
213 46 8915
724 80 9391
899 46 2035
998 72 3567
Изменение всего лишь одной пары скобок приводит к другому результату:
SELECT DISTINCT a.au_id
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id = ta.au_id
WHERE (ta.title_id IN (SELECT title_id FROM sales
WHERE qty >= 75)
OR a.au_id IN (SELECT au_id FROM titleauthor
WHERE royaltyper >= 60))
AND a.au_id IN (SELECT au_id FROM titleauthor
WHERE au_ord = 2)
На этот раз результат будет следующим:
au_id
213 46 8915
724 80 9391
899 46 2035
Все платформы, рассматриваемые в этой книге, поддерживают стандарт ANSI.
См. также
ALL/ANY/SOME
BETWEEN
DECLARE CURSOR
DELETE
EXISTS
IN
LIKE
SELECT
UPDATE
Функции SQL
4
В SQL функция – это частный случай команды. В каждом диалекте SQL реализо
ван свой набор таких команд. По существу, функция представляет собой команду,
название которой состоит из одного слова и которая возвращает единственное зна
чение. Значение функции зависит от входных параметров. Например, функция
может вычислять среднее арифметическое для списка значений, выбранных из
базы данных. Однако у многих функций входных параметров нет вообще. Приме
ром может служить функция CURRENT_TIME, возвращающая текущее время.
В стандарте ANSI описан целый ряд полезных функций. В этой главе мы рас
смотрим их все и приведем подробные описания и примеры для каждой плат
формы. Дополнительно любая СУБД поддерживает множество собственных
функций, не вошедших в стандарт. Мы опишем назначение и параметры таких
функций тоже.
Классификация функций
Существует несколько способов разбиения функций на группы. В следующих раз
делах описаны отличия, важные для понимания механизмов работы функций.
Оконные функции
Оконные функции похожи на агрегатные в том смысле, что применяются сразу
к нескольким строкам. Разница в том, как эти строки задаются. Агрегатная
функция применяется к набору строк, определяемому указанной в запросе фра
зой GROUP BY. В случае же оконных функций набор строк задается при каждом
вызове, поэтому разные вызовы некоторой функции в одном и том же запросе
могут работать с разными наборами строк.
Функция Назначение
CUME_DIST(value_list) WITHIN Вычисляет относительный ранг гипотетической
GROUP (ORDER BY sort_list) строки в группе строк, где рангом называется ко
личество строк, меньших или равных гипотетиче
ской строке, поделенное на количество строк
в данной группе
DENSE_RANK(value_list) WITHIN Вычисляет плотный ранг (ни один ранг не пропус
GROUP (ORDER BY sort_list) кается) для гипотетической строки (value_list)
в группе строк, описываемой фразой GROUP BY
MIN(expression) Находит минимальное значение в столбце, опреде
ляемом выражением expression
MAX(expression) Находит максимальное значение в столбце, опре
деляемом выражением expression
PERCENT_RANK(value_list) WITHIN Вычисляет относительный ранг гипотетической
GROUP (ORDER BY sort_list) строки путем деления ранга этой строки минус 1
на количество строк в группе
PERCENTILE_CONT(percentile) Вычисляет интерполированное значение, кото
WITHIN GROUP (ORDER BY sort_list) рое, будучи прибавлено к группе, даст указанный
процентиль percentile
PERCENTILE_DISC(percentile) Возвращает значение, для которого наименьшая
WITHIN GROUP (ORDER BY sort_list) величина функции кумулятивного распределения
больше или равна percentile
RANK(value_list) WITHIN GROUP Вычисляет ранг гипотетической строки (value_list)
(ORDER BY sort_list) в группе строк, определяемой фразой GROUP BY
REGR_AVGX(dependent, indepen Вычисляет среднее значение независимой пере
dent) менной
REGR_AVGY(dependent, indepen Вычисляет среднее значение зависимой перемен
dent) ной
REGR_COUNT(dependent, indepen Вычисляет количество пар, остающееся в группе
dent) после удаления всех пар, в которых хотя бы одно
значение равно NULL
REGR_INTERCEPT(dependent, inde Находит точку пересечения с осью y линии регрес
pendent) сии, вычисленной методом наименьших квадратов
REGR_R2(dependent, independent) Возвращает квадрат коэффициента корреляции
REGR_SLOPE(dependent, indepen Возвращает наклон линии регрессии, вычислен
dent) ной методом наименьших квадратов
REGR_SXX(dependent, independent) Вычисляет сумму квадратов независимых пере
менных
REGR_SXY(dependent, independent) Вычисляет сумму попарных произведений пере
менных
REGR_SYY(dependent, independent) Вычисляет сумму квадратов зависимых перемен
ных
504 Глава 4. Функции SQL
Строго говоря, функции ALL, ANY и SOME также считаются агрегатными функ
циями. Однако мы рассматривали их в контексте критериев поиска по диапазо
ну, поскольку именно так они чаще всего и используются. Подробнее об этих
функциях см. главу 3.
Количество значений, обрабатываемых агрегатной функцией, зависит от того,
сколько строк вернул запрос. Этим агрегатные функции отличаются от скаляр
ных, которые применяются только к одной строке за один вызов.
Общий синтаксис вызова агрегатной функции таков:
aggregate_function_name( [ALL | DISTINCT] expression )
Здесь aggregate_function_name может быть AVG, COUNT, MAX, MIN или SUM
(см. табл. 4.1). Ключевое слово ALL, подразумеваемое по умолчанию, означает,
что в процессе агрегирования учитываются все строки. Если же задано ключевое
слово DISTINCT, то учитываются только отличающиеся значения.
AVG и SUM
Функция AVG вычисляет среднее арифметическое значений по столбцу или вы
ражению, а функция SUM – сумму значений. Обе работают только с числовыми
значениями и игнорируют NULL. Чтобы вычислить среднее или сумму различ
ных значений столбца или выражения, укажите ключевое слово DISTINCT.
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
AVG( [ALL | DISTINCT] expression ) OVER (window_clause)
SUM( [ALL | DISTINCT] expression ) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
Примеры
В следующем запросе для каждого типа книг вычисляется средний объем про
даж с начала года:
SELECT type, AVG( ytd_sales ) AS "average_ytd_sales" FROM titles GROUP BY type;
А в этом запросе для каждого типа книг вычисляется общий объем продаж с на
чала года:
SELECT type, SUM( ytd_sales ) FROM titles GROUP BY type;
CORR
Функция CORR возвращает коэффициент корреляции между наборами зависи
мых и независимых переменных.
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
CORR(dependent, independent) OVER (window_ clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
PostgreSQL
PostgreSQL поддерживает синтаксис ANSI SQL.
506 Глава 4. Функции SQL
Пример
В следующем примере функция CORR применяется к данным, которые отбирает
первый SELECT:
SELECT * FROM test2;
Y X
1 3
2 2
3 1
SELECT CORR(y,x) FROM test2;
CORR(Y,X)
COUNT
Функция COUNT вычисляет количество строк, определяемых выражением.
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
COUNT ({* | [DISTINCT] expression}) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
Агрегатные функции в ANSI SQL 507
Примеры
Следующий запрос подсчитывает, сколько всего строк в таблице:
SELECT COUNT(*) FROM publishers;
А ниже мы находим количество различных стран, в которых есть издательства:
SELECT COUNT(DISTINCT country) "Count of Countries"
FROM publishers
COVAR_POP
Функция COVAR_POP вычисляет ковариацию генеральной совокупности, со
стоящей из набора зависимых и независимых переменных.
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
COVAR_POP(dependent, independent) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
PostgreSQL
PostgreSQL поддерживает синтаксис ANSI SQL.
Пример
В следующем примере функция COVAR_POP применяется к данным, которые
отбирает первый SELECT:
SELECT * FROM test2;
Y X
1 3
2 2
3 1
SELECT COVAR_POP(y,x) FROM test2;
COVAR_POP(Y,X)
.66666667
508 Глава 4. Функции SQL
COVAR_SAMP
Функция COVAR_SAMP вычисляет выборочную ковариацию зависимой и неза
висимой переменных.
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
COVAR_SAMP(dependent, independent) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
PostgreSQL
PostgreSQL поддерживает синтаксис ANSI SQL.
Пример
В следующем примере функция COVAR_SAMP применяется к данным, которые
отбирает первый SELECT:
SELECT * FROM test2;
Y X
1 3
2 2
3 1
SELECT COVAR_SAMP(y,x) FROM test2;
COVAR_SAMP(Y,X)
CUME_DIST
Вычисляет относительный ранг гипотетической строки в группе строк по сле
дующей формуле:
(строки,_предшествующие_гипотетической, + строки,_равные_гипотетической) /
количество_строк_в_группе
Агрегатные функции в ANSI SQL 509
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
CUME_DIST( ) OVER ([partitioning] ordering)
О том, что означают параметры partitioning и ordering, см. раздел «Оконные
функции в ANSI SQL» ниже.
Пример
В следующем примере вычисляется относительный ранг гипотетической новой
строки (num=4, odd=1) внутри каждой группы строк из таблицы test4 в предполо
жении, что группы отличаются значением в столбце odd:
SELECT * FROM test4;
NUM ODD
0 0
1 1
2 0
3 1
3 1
4 0
5 1
SELECT odd, CUME_DIST(4,1) WITHIN GROUP (ORDER BY num, odd)
FROM test4 GROUP BY odd;
ODD CUME_DIST(4,1)WITHINGROUP(ORDERBYNUM,ODD)
0 1
1 .8
В группе odd=0 новая строка располагается после строк (0,0), (2,0) и (4,0). Она сов
падает сама с собой. Общее количество строк в группе с учетом гипотетической
равно четырем. Поэтому относительный ранг вычисляется по формуле:
(3 предшествующих строки + 1 совпадающая) / (3 в группе + 1 гипотетическая)= 4 / 4 = 1
В группе odd=1 новая строка располагается после строк (1,1), (3,1) и еще одной
(3,1). Как и в предыдущем случае, совпадающая строка только одна – сама гипо
510 Глава 4. Функции SQL
DENSE_RANK
Вычисляет ранг указанной вами гипотетической строки в группе. Имеется в виду
плотный ранг, то есть значения рангов не содержат пропусков, даже если в груп
пе имеются строки с одинаковым рангом.
MySQL и PostgreSQL
На этих платформах функция DENSE_RANK не реализована.
Пример
В следующем примере вычисляется плотный ранг гипотетической новой строки
(num=4, odd=1) внутри каждой группы строк из таблицы test4 в предположении,
что группы отличаются значением в столбце odd:
SELECT * FROM test4;
NUM ODD
0 0
1 1
2 0
3 1
3 1
4 0
5 1
SELECT odd, DENSE_RANK(4,1) WITHIN GROUP (ORDER BY num, odd)
FROM test4 GROUP BY odd;
ODD DENSE_RANK(4,1)WITHINGROUP(ORDERBYNUM,ODD)
0 4
1 3
Агрегатные функции в ANSI SQL 511
В группе odd=0 новая строка располагается после строк (0,0), (2,0) и (4,0) и, следо
вательно, находится в позиции 4. В группе odd=1 новая строка располагается по
сле строк (1,1), (3,1) и второй строки (3,1). В данном случае ранг обеих строк
дубликатов равен #2, поэтому ранг новой строки равен #3. Сравните с функци
ей RANK, которая возвращает иной результат.
MIN и MAX
Функции MIN(expression) и MAX(expression) находят соответственно мини
мальное и максимальное значения выражения expression (оно может быть стро
кой, датой/временем или числом) в наборе строк. Разрешается указывать клю
чевое слово DISTINCT или ALL, но на результат это не влияет.
MySQL
MySQL поддерживает синтаксис ANSI SQL для функций MIN и MAX, а также
эквивалентные им функции LEAST и GREATEST.
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
MIN({ALL|[DISTINCT] expression}) OVER (window_clause)
MAX({ALL|[DISTINCT] expression}) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
Примеры
Следующий запрос возвращает самую лучшую и самую худшую сумму продаж
с начала года для всех хранящихся в базе книг:
SELECT MIN(ytd_sales), MAX(ytd_sales)
FROM titles;
Агрегатные функции также часто используются во фразе HAVING запросов с фра
зой GROUP BY. Следующий запрос отбирает все категории (типы) книг, для ко
торых средняя по категории цена больше $15.00:
SELECT type 'Category', AVG( price ) 'Average Price'
FROM titles
GROUP BY type
HAVING AVG(price) > 15
512 Глава 4. Функции SQL
PERCENT_RANK
Вычисляет относительный ранг гипотетической строки путем деления ранга
этой строки минус 1 на количество строк в группе (не включая гипотетическую
строку).
Oracle
Oracle поддерживает синтаксис ANSI SQL, а также следующую форму для ана
литических приложений:
PERCENT_RANK( ) OVER ([partitioning] ordering)
О том, что означают параметры partitioning и ordering, см. раздел «Оконные
функции в ANSI SQL» ниже.
Пример
В следующем примере вычисляется процентный ранг гипотетической новой
строки (num=4, odd=1) внутри каждой группы строк из таблицы test4 в предполо
жении, что группы отличаются значением в столбце odd:
SELECT * FROM test4;
NUM ODD
0 0
1 1
2 0
3 1
3 1
4 0
5 1
SELECT odd, PERCENT_RANK(4,1) WITHIN GROUP (ORDER BY num, odd)
FROM test4 GROUP BY odd;
ODD PERCENT_RANK(4,1)WITHINGROUP(ORDERBYNUM,ODD)
0 1
1 .75
В группе odd=0 новая строка располагается после строк (0,0), (2,0) и (4,0) и, следова
тельно, находится в позиции 4. Ее ранг равен (ранг 4й строки – 1) / 3 строки =
100%. В группе odd=1 новая строка располагается после строк (1,1), (3,1) и второй
Агрегатные функции в ANSI SQL 513
PERCENTILE_CONT
Вычисляет интерполированное значение, соответствующее заданному вами про
центилю.
Oracle
Oracle допускает только одно выражение во фразе ORDER BY:
PERCENTILE_CONT(percentile) WITHIN GROUP (ORDER BY expression)
Кроме того, в Oracle синтаксис расширен для использования в аналитических
приложениях:
PERCENTILE_CONT(percentile) WITHIN GROUP
(ORDER BY sort_list) OVER (partitioning)
О том, что означает параметр partitioning, см. раздел «Оконные функции в ANSI
SQL» ниже.
Пример
В следующем примере данные из таблицы test4 сгруппированы по столбцу odd,
и функция PERCENTILE_CONT возвращает 50процентный процентиль для ка
ждой группы:
SELECT * FROM test4;
NUM ODD
0 0
1 1
2 0
3 1
3 1
4 0
5 1
SELECT odd, PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY NUM)
FROM test4 GROUP BY odd;
ODD PERCENTILE_CONT(0.50)WITHINGROUP(ORDERBYNUM)
0 2
1 3
514 Глава 4. Функции SQL
PERCENTILE_DISC
Находит в группе значение, для которого наименьшая величина функции куму
лятивного распределения больше или равна заданному процентилю.
Oracle
Oracle допускает только одно выражение во фразе ORDER BY:
PERCENTILE_DISC(percentile) WITHIN GROUP (ORDER BY expression)
Кроме того, в Oracle синтаксис расширен для использования в аналитических
приложениях:
PERCENTILE_DISC(percentile) WITHIN GROUP
(ORDER BY sort_list) OVER (partitioning)
О том, что означает параметр partitioning, см. раздел «Оконные функции в ANSI
SQL» ниже.
Пример
Следующий пример аналогичен примеру для функции PERCENTILE_CONT, но
для каждой группы возвращает значение, наиболее близкое, но не превосходя
щее процентиля 60%:
SELECT * FROM test4;
NUM ODD
0 0
1 1
2 0
3 1
3 1
4 0
5 1
SELECT odd, PERCENTILE_DISC(0.60) WITHIN GROUP (ORDER BY NUM)
FROM test4 GROUP BY odd;
PERCENTILE_CONT(0.60)WITHIN GROUP(ORDERBYNUM)
2
3
Агрегатные функции в ANSI SQL 515
RANK
Вычисляет ранг заданной вами гипотетической строки в группе. Ранг не являет
ся плотным. Если в группе есть строки с одинаковым рангом, то некоторые ран
ги могут быть пропущены. Если вам нужен плотный ранг, пользуйтесь функци
ей DENSE_RANK.
MySQL и PostgreSQL
На этих платформах функция RANK не реализована.
Пример
В следующем примере вычисляется ранг гипотетической новой строки (num=4,
odd=1) внутри каждой группы строк из таблицы test4 в предположении, что
группы отличаются значением в столбце odd:
SELECT * FROM test4;
NUM ODD
0 0
1 1
2 0
3 1
3 1
4 0
5 1
SELECT odd, RANK(4,1) WITHIN GROUP (ORDER BY num, odd)
FROM test4 GROUP BY odd;
ODD RANK(4,1)WITHINGROUP(ORDERBYNUM,ODD)
0 4
1 4
В обоих случаях ранг гипотетической новой строки равен 4. В группе odd=0 новая
строка располагается после строк (0,0), (2,0) и (4,0), т.е. в позиции 4. В группе
516 Глава 4. Функции SQL
odd=1 новая строка оказывается после строк (1,1), (3,1) и второй строки (3,1). Хо
тя две последних строки одинаковы и, значит, имеют один и тот же ранг, новой
строке все равно приписывается ранг 4, поскольку ей предшествуют три строки.
Сравните с поведением функции DENSE_RANK.
Oracle и PostgreSQL
Oracle и PostgreSQL поддерживают синтаксис ANSI SQL для всех функций
REGR_. Oracle поддерживает также следующую форму для аналитических при
ложений:
REGR_function(dependent, independent) OVER (window_clause)
Агрегатные функции в ANSI SQL 517
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
Пример
В следующем примере демонстрируется, что функция REGR_COUNT игнориру
ет пары, в которых хотя бы одно значение равно NULL. Таблица test3 содержит
три пары, в которых оба элемента отличны от NULL, и три пары, в которых хотя
бы один элемент равен NULL.
SELECT * FROM test3;
Y X
1 3
2 2
3 1
4 NULL
NULL 4
NULL NULL
Функция REGR_COUNT игнорирует пары, в которых есть NULL, и подсчитыва
ет лишь пары, где оба элемента отличны от NULL.
SELECT REGR_COUNT(y,x) FROM test3;
REGR_COUNT(Y,X)
3
Все остальные функции REGR_ также отбрасывают пары, содержащие хотя бы
один NULL, а лишь потом производят вычисления.
STDDEV_POP
Функция STDDEV_POP вычисляет стандартное отклонение генеральной со
вокупности для набора числовых значений.
SQL Server
Пользуйтесь функцией STDEVP.
518 Глава 4. Функции SQL
Пример
В следующем примере вычисляется стандартное отклонение генеральной сово
купности для значений 1, 2 и 3:
SELECT * FROM test;
X
1
2
3
SELECT STDDEV_POP(x) FROM test;
STDDEV_POP(X)
.816496581
STDDEV_SAMP
Вычисляет выборочное стандартное отклонение для набора числовых значений.
MySQL и PostgreSQL
MySQL и PostgreSQL поддерживают синтаксис ANSI SQL.
Oracle
Oracle поддерживает стандартный синтаксис, а также предлагает функцию
STDDEV, которая работает аналогично STDDEV_SAMP, но возвращает 0 (а не
NULL) в случае, когда набор содержит только одно значение.
Oracle поддерживает также следующую форму для аналитических приложений:
STDDEV_SAMP(numeric_expression) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
SQL Server
Пользуйтесь функцией STDEV (с одной буквой D!).
Пример
В следующем примере вычисляется выборочное стандартное отклонение для
значений 1, 2 и 3:
SELECT * FROM test;
X
1
2
3
Агрегатные функции в ANSI SQL 519
VAR_POP
Вычисляет дисперсию генеральной совокупности для набора числовых значений.
MySQL и PostgreSQL
MySQL и PostgreSQL поддерживают синтаксис ANSI SQL.
Oracle
Oracle поддерживает стандартный синтаксис, а также следующую форму для
аналитических приложений:
VAR_POP(numeric_expression) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
SQL Server
Пользуйтесь функцией VARP.
Пример
В следующем примере вычисляется дисперсия генеральной совокупности для
значений 1, 2 и 3:
SELECT * FROM test;
X
1
2
3
SELECT VAR_POP(x) FROM test;
VAR_POP(X)
.666666667
VAR_SAMP
Вычисляет выборочную дисперсию для набора числовых значений.
MySQL и PostgreSQL
MySQL и PostgreSQL поддерживают синтаксис ANSI SQL.
Oracle
Oracle поддерживает стандартный синтаксис, а также предлагает функцию VA0
RIANCE, которая работает аналогично VAR_SAMP, но возвращает 0 (а не NULL)
в случае, когда набор содержит только одно значение:
Oracle поддерживает также следующую форму для аналитических приложений:
VAR_SAMP(numeric_expression) OVER (window_clause)
О том, что означает фраза window_clause, см. раздел «Оконные функции в ANSI
SQL» ниже.
SQL Server
Пользуйтесь функцией VAR.
Пример
В следующем примере вычисляется выборочная дисперсия для значений 1, 2 и 3:
SELECT * FROM test;
X
1
2
3
SELECT VAR_SAMP(x) FROM test;
VAR_SAMP(X)
Разбиение (partitioning)
Разбиение строк, к которым применяется фраза partitioning, – это аналог выра
жения GROUP BY в стандартной команде SELECT. Фраза partitioning принима
ет список выражений, с помощью которых результирующий набор разбивается
на группы. Далее в примерах мы будем работать со следующей таблицей:
SELECT * FROM odd_nums;
NUM ODD
0 0
1 1
2 0
3 1
Ниже показан результат разбиения по столбцу ODD. Сумма четных чисел равна
2 (0+2), а сумма нечетных – 4 (1+3). Во втором столбце результирующего набора
представлена сумма всех значений в той секции, которой принадлежит данная
строка, но при этом возвращаются все строки таблицы (детальные строки). Сле
дующий запрос генерирует суммарные результаты в контексте детальных строк:
SELECT NUM, SUM(NUM) OVER (PARTITION BY ODD) S FROM ODD_NUMS;
NUM S
0 2
2 2
1 4
3 4
Если вообще опустить фразу partitioning, то будут суммироваться все числа
в столбце NUM. Таким образом, весь результирующий набор трактуется как од
на большая секция:
SELECT NUM, SUM(NUM) OVER ( ) S FROM ODD_NUMS;
NUM S
0 6
1 6
2 6
3 6
Упорядочение (ordering)
Порядок следования строк, к которым применяется аналитическая функция,
задается с помощью фразы ordering. Однако эта фраза никоим образом не опре
деляет упорядочение строк в результирующем наборе; для этого предназначена
фраза ORDER BY в конце всего запроса. В следующем примере использования
функции FIRST_VALUE (Oracle) иллюстрируется эффект различных способов
упорядочивания строк в секциях:
SELECT NUM,
SUM(NUM) OVER (PARTITION BY ODD) S,
FIRST_VALUE(NUM) OVER (PARTITION BY ODD ORDER BY NUM ASC) first_asc,
FIRST_VALUE(NUM) OVER (PARTITION BY ODD ORDER BY NUM DESC) first_desc
FROM ODD_NUMS;
Оконные функции в ANSI SQL 523
0 2 0 2
2 2 0 2
1 4 1 3
3 4 1 3
Как видите, фраза ORDER BY внутри оконной функции влияет на порядок
строк в соответствующих секциях на этапе вычисления функции. Фраза ORDER
BY NUM ASC сортирует секции в порядке возрастания, поэтому первым значе
нием в секции четных чисел оказывается 0, а первым значением в секции нечет
ных чисел – 1. Фраза ORDER BY NUM DESC дает противоположный эффект.
0 0
1 1
2 3
3 6
В этом примере результирующий набор упорядочен так же, как последователь
ность промежуточных сумм. Но это вовсе не обязательно. В следующем примере
порождаются те же самые результаты, но в другом порядке. Как видите, проме
жуточные суммы вычислены правильно, однако строки упорядочены подруго
му. Упорядоченность результирующего набора совершенно не зависит от поряд
ка, заданного внутри оконной функции:
SELECT NUM, SUM(NUM) OVER (ORDER BY NUM ROWS
BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) S FROM ODD_NUMS
524 Глава 4. Функции SQL
3 6
2 3
1 1
0 0
0 0
1 1
2 0
3 1
3 1
4 0
5 1
Оконные функции, реализованные только в Oracle (не имеющие аналогов в SQL
Server), перечислены в разделе «Платформозависимые расширения» ниже
в этой главе.
CUME_DIST
Вычисляет кумулятивное распределение или ранг текущей строки относительно
других строк в той же секции. Вычисление производится по формуле:
количество предшествующих или равных строк / общее количество строк в секции
Поскольку результат для данной строки зависит от количества предществую
щих ей строк в той же секции, при вызове этой функции следует всегда вклю
чать фразу ORDER BY.
Oracle
Oracle не разрешает использовать в этой функции фразу framing, но требует на
личия фразы ordering:
CUME_DIST( ) OVER ([partitioning] ordering)
Оконные функции в ANSI SQL 525
SQL Server
В SQL Server функция CUME_DIST не реализована.
Пример
В следующем примере (для Oracle) функция CUME_DIST используется для вы
числения относительного ранга каждой строки при условии разбиения на сек
ции по столбцу ODD и сортировки по столбцу NUM:
SELECT NUM, ODD, CUME_DIST( ) OVER
(PARTITION BY ODD ORDER BY NUM) cumedist
FROM test4;
NUM ODD CUMEDIST
0 0 .333333333
2 0 .666666667
4 0 1
1 1 .25
3 1 .75
3 1 .75
5 1 1
Ниже объясняется, как вычисляется ранг строки, для которой NUM=0:
1. Изза наличия фразы ORDER BY строки в секции располагаются в следую
щем порядке:
NUM=0
NUM=2
NUM=4
2. Строк, предшествующих той, для которой NUM=0, не существует.
3. Существует одна строка, равная той, для которой NUM=0, – она сама. Следо
вательно, делимое равно 1.
4. Всего в секции три строки, то есть делитель равен 3.
5. Результат равен 1/3 или 0.33 в периоде, что и показано в примере.
DENSE_RANK
Присваивает ранг каждой строке в секции в предположении, что строки каким
то образом упорядочены. Ранг строки вычисляется путем подсчета количества
предшествующих ей строк и прибавления к результату 1. Строкидубликаты
(в смысле упорядочения, заданного фразой ORDER BY) имеют одинаковый ранг.
В отличие от функции RANK, наличие строк с одинаковым рангом не приводит
к пропускам в последовательности вычисленных рангов.
Синтаксис в стандарте ANSI SQL
DENSE_RANK( ) OVER {window_name | (window_specification)}
Пример
Сравните результаты применения функции DENSE_RANK (для Oracle) с теми,
что были приведены в разделе, посвященном функции RANK:
SELECT NUM, DENSE_RANK( ) OVER (ORDER BY NUM) rank
FROM test4;
NUM RANK
0 1
1 2
2 3
3 4
3 4
4 5
5 6
Обе строки, в которых NUM=3, имеют ранг 4, а следующая за ними строка –
ранг 5. Никаких пропусков в последовательности рангов не образуется, отсюда
и название «плотный».
PERCENT_RANK
Вычисляет относительный ранг строки, для чего делит ее ранг минус 1 на коли
чество строк в секции минус 1:
(rank 1) / (rows 1)
Сравните эту формулу с формулой для вычисления CUME_DIST.
Oracle
Oracle требует наличия фразы ordering и не допускает фразы framing:
PERCENT_RANK( ) OVER ([partitioning] ordering)
SQL Server
В SQL Server функция PERCENT_RANK не реализована.
Пример
В следующем примере (для Oracle) вычисляются относительные ранги значений
в столбце NUM при условии разбиения на секции по столбцу ODD:
SELECT NUM, ODD, PERCENT_RANK( ) OVER
(PARTITION BY ODD ORDER BY NUM) cumedist
FROM test4;
NUM ODD CUMEDIST
0 0 0
2 0 .5
Оконные функции в ANSI SQL 527
4 0 1
1 1 0
3 1 333333333
3 1 .333333333
5 1 1
Ниже объясняется, как вычисляется ранг строки, для которой NUM=2:
1. Строка с NUM=2 является второй в секции, следовательно, ее ранг равен 2.
2. Вычитаем 1 из 2 и получаем делимое 1.
3. Общее количество строк в секции равно 3.
4. Вычитаем 1 из 3 и получаем делитель 2.
5. Результат равен 1/2 или 0.5, что и показано в примере.
RANK
Присваивает ранг каждой строке в секции в предположении, что строки какимто
образом упорядочены. Ранг строки вычисляется путем подсчета количества пред
шествующих ей строк и прибавления к результату 1. Строкидубликаты (в смыс
ле упорядочения, заданного фразой ORDER BY) имеют одинаковый ранг, что
приводит к появлению пропусков в последовательности вычисленных рангов.
Пример
В следующем примере (для Oracle) вычисляются ранги значений в столбце NUM
из таблицы test4:
SELECT NUM, RANK( ) OVER (ORDER BY NUM) rank
FROM test4;
NUM RANK
0 1
1 2
2 3
3 4
3 4
4 6
5 7
Поскольку обе строки с NUM=3 имеют один и тот же ранг (4), то следующая по
порядку строка получает ранг 6. Ранг 5 пропускается.
528 Глава 4. Функции SQL
ROW_NUMBER
Присваивает уникальные номера строкам в секции.
Пример
SELECT NUM, ODD, ROW_NUMBER( ) OVER
(PARTITION BY ODD ORDER BY NUM) cumedist
FROM test4;
NUM ODD CUMEDIST
0 0 1
2 0 2
4 0 3
1 1 1
3 1 2
3 1 3
5 1 4
Категория Назначение
Дата и время Выполняют операции над темпоральными (время и/или дата)
типами данных или возвращают значения темпорального типа.
В стандарте SQL2003 нет функций, которые принимают на входе
темпоральные данные и возвращают результат темпорального ти
па. Наиболее близка к этому функция EXTRACT (рассматривает
ся в разделе «Числовые скалярные функции»), которая принима
ет на входе темпоральные значения, а возвращает число. Функ
ции, которые возвращают темпоральные значения, но не прини
мают никаких аргументов, рассматриваются в разделе «Встроен
ные скалярные функции».
Числовые Выполняют операции над числовыми данными и возвращают чи
словые значения.
Строковые Выполняют операции над символьными данными (например, ти
па CHAR, VARCHAR, NCHAR, NVARCHAR или CLOB) и возвра
щают значения строкового или числового типа.
MySQL
MySQL поддерживает все встроенные скалярные функции ANSI SQL. Дополни
тельно MySQL предлагает функцию NOW, являющуюся синонимом CURRENT_
TIMESTAMP.
530 Глава 4. Функции SQL
Oracle
Oracle поддерживает функции USER, CURRENT_DATE и CURRENT_TIME0
STAMP.
PostgreSQL и SQL Server
PostgreSQL и SQL Server поддерживают все встроенные скалярные функции.
Дополнительно PostgreSQL предлагает функцию NOW, являющуюся синони
мом CURRENT_TIMESTAMP.
Примеры
В следующих примерах демонстрируется получение значений, возвращаемых
встроенными функциями. Отметим, что разные СУБД возвращают даты в раз
личных форматах:
/* MySQL */
SELECT CURRENT_TIMESTAMP;
'2001 12 15 23:50:26'
/* Microsoft SQL Server */
SELECT CURRENT_TIMESTAMP
GO
'Dec 15,2001 23:50:26'
/* Oracle */
SELECT USER FROM dual;
dylan
CASE
Функция CASE позволяет использовать аналог конструкции IF/THEN/ELSE
в командах SELECT и UPDATE. Она вычисляет указанные условия и возвраща
ет одно из списка возможных значений.
Функция CASE имеет две формы: простую и поисковую. В простом выражении
CASE одно входное значение input_value сравнивается с несколькими другими
значениями и возвращается результат, ассоциированный с первым совпадени
ем. Поисковое выражение CASE позволяет проанализировать несколько логиче
ских условий и возвращает результат, ассоциированный с первым логическим
условием, вычисление которого дало истину.
В любой СУБД поддерживается синтаксис функции CASE, определенный в ANSI
SQL.
Синтаксис в стандарте ANSI SQL
Простая операция сравнения
CASE input_value
Скалярные функции в стандарте ANSI SQL 531
Примеры
Ниже приведен пример простой операции сравнения, в которой функция CASE
применяется для представления столбца contract в понятном человеку виде:
SELECT au_fname,
au_lname,
CASE contract
WHEN 1 THEN 'Yes'
ELSE 'No'
END 'contract'
FROM authors
WHERE state = 'CA'
В следующем более сложном примере поисковая функция CASE используется
в команде SELECT для вычисления того, сколько различных изданий попадают
в различные диапазоны суммарного объема продаж с начала года:
SELECT CASE
WHEN ytd_sales IS NULL THEN 'Неизвестно'
WHEN ytd_sales <= 200 THEN 'Не более 200'
WHEN ytd_sales <= 1000 THEN 'От 201 до 1000'
WHEN ytd_sales <= 5000 THEN 'От 1001 до 5000'
WHEN ytd_sales <= 10000 THEN 'От 5001 до 10000'
ELSE 'Свыше 10000'
END 'Продажи с начала года',
COUNT(*) 'Количество изданий'
FROM titles
GROUP BY CASE
WHEN ytd_sales IS NULL THEN 'Неизвестно'
WHEN ytd_sales <= 200 THEN 'Не более 200'
WHEN ytd_sales <= 1000 THEN 'От 201 до 1000'
532 Глава 4. Функции SQL
Неизвестно 2
Не более 200 1
От 201 до 1000 2
От 1001 до 5000 9
От 5001 до 10000 1
Свыше 10000 3
Далее приведен пример команды UPDATE, которая применяет скидки ко всем
книгам. К книгам на тему персональных компьютеров применяется скидка
25%, ко всем остальным – 10%, за исключением тех, для которых с начала года
продано более 10000 экземпляров; на последние дается скидка всего 5%. В этом
запросе для корректировки цены используется поисковое выражение CASE:
UPDATE titles
SET price = price *
CASE
WHEN ytd_sales > 10000 THEN 0.95 скидка 5%
WHEN type = 'popular_comp' THEN 0.75 скидка 25%
ELSE 0.9 скидка 10%
END
WHERE pub_date IS NOT NULL
На этом примере демонстрируется выполнение трех разных операций UPDATE
в одной команде.
CAST
Функция CAST применяется для явного преобразования типа данных выраже
ния. Ее синтаксис, описанный в стандарте ANSI SQL, поддерживают все произ
водители.
Пример
В этом примере числовое значение объема продаж с начала года преобразуется
к типу CHAR и конкатенируется со строковым литералом и частью названия кни
ги. Столбец ytd_sales преобразуется в CHAR(5), а строка в столбце title усекает
ся до 30 знаков, чтобы результат оказался более удобен для восприятия:
SELECT CAST(ytd_sales AS CHAR(5)) + ' экземпляров ' +
CAST(title AS VARCHAR(30))
FROM titles
WHERE ytd_sales IS NOT NULL
AND ytd_sales > 10000
ORDER BY ytd_sales DESC
Этот запрос возвращает такие результаты:
ABS
Стандартная функция ABS поддерживается на всех платформах.
Пример
В следующем примере демонстрируется применение функции ABS:
/* SQL2003 */
SELECT ABS( 1) FROM NUMBERS
1
MySQL и PostgreSQL
И MySQL, и PostgreSQL поддерживают функции BIT_LENGTH, CHAR_
LENGTH, OCTET_LENGTH, а также определенный в ANSI SQL синоним CHA0
RACTER_LENGTH.
Скалярные функции в стандарте ANSI SQL 535
Oracle
Oracle поддерживает функцию LENGTHB, которая возвращает целое число,
равное количеству байтов в выражении. Для определения длины выражения
в символах Oracle предлагает функцию LENGTH, являющуюся синонимом
CHAR_LENGTH.
SQL Server
В SQL Server имеется функция LEN, которая реализует все три варианта.
Пример
В следующем примере показано, как в разных СУБД вычисляется длина строки
и значения, хранящегося в столбце:
/* MySQL и PostgreSQL */
SELECT CHAR_LENGTH('hello');
SELECT OCTET_LENGTH(book_title) FROM titles;
/* Microsoft SQL Server */
SELECT DATALENGTH(title) FROM titles
WHERE type = 'popular_comp'
GO
/* Oracle */
SELECT LENGTH('HORATIO') "Length of characters"
FROM dual;
CEIL
Функция CEIL возвращает наименьшее целое число, большее или равное значе
нию входного параметра.
Синтаксис в стандарте ANSI SQL
ANSI SQL поддерживает следующие два варианта:
CEIL( expression )
CEILING( expression )
MySQL и PostgreSQL
MySQL и PostgreSQL поддерживают как CEIL, так и CEILING.
Oracle
Oracle поддерживает только CEIL.
SQL Server
SQL Server поддерживает только CEILING.
Примеры
Если на вход подается положительное, не целое число, то CEIL округляет его до
ближайшего большего целого:
SELECT CEIL(100.1) FROM dual;
CEIL(100.1)
536 Глава 4. Функции SQL
101
Если же параметр отрицателен, то такое округление «вверх» дает число, которое
по абсолютной величине меньше параметра:
SELECT CEIL( 100.1) FROM dual;
CEIL( 100.1)
100
Функция FLOOR ведет себя противоположно CEIL.
EXP
Функция EXP возвращает значение числа e (приблизительно 2.718281), возве
денное в указанную степень.
Пример
В следующем примере функция EXP применяется для получения приближения
к e:
SELECT EXP(1) FROM dual;
EXP(1)
2.71828183
Обратная к EXP функция называется LN.
EXTRACT
Эта скалярная функция служит для выделения различных компонентов даты.
MySQL
В MySQL реализовано несколько больше, чем требуется стандартом. Стандарт
ANSI не предусматривает возврата нескольких полей в результате одного обраще
ния к EXTRACT (например, DAY_HOUR). MySQL же стремится достичь того, что
в PostgreSQL реализуется парой функций DATE_TRUNC и DATE_PART. В My
SQL параметр date_part может принимать значения, перечисленные в табл. 4.5.
Скалярные функции в стандарте ANSI SQL 537
Oracle
Oracle поддерживает синтаксис ANSI SQL, допустимые компоненты даты пере
числены в табл. 4.6.
Таблица 4.6. Компоненты даты в Oracle
Компонент Назначение
DAY День месяца (1–31)
HOUR Час (0–23)
MINUTE Минуты (0–59)
MONTH Месяц (1–12)
SECOND Секунды (0–59)
TIMEZONE_HOUR Час в смещении часового пояса
TIMEZONE_MINUTE Минуты в смещении часового пояса
538 Глава 4. Функции SQL
PostgreSQL
PostgreSQL поддерживает синтаксис ANSI SQL и добавляет еще несколько ком
понентов даты (см. табл. 4.7).
Таблица 4.7. Компоненты даты в PostgreSQL
Компонент Назначение
CENTURY До версии 8.0 возвращалось значение YEAR, поделенное на
100. Начиная с версии 8.0 возвращается правильный год по
григорианскому календарю, согласно которому первый год
имеет номер 0001, а столетия с номером 0 не существует (с –1
вы переходите сразу на 1 столетие).
DAY День месяца (1–31).
DECADE Поле YEAR, поделенное на 10.
DOW День недели (0–6, причем воскресенью сопоставляется 0). Ра
ботает только для значений типа TIMESTAMP.
DOY Порядковый номер дня в году (1–366). Для годов, не являю
щихся високосными, максимальное значение равно 365. Рабо
тает только для значений типа TIMESTAMP.
EPOCH Количество секунд между началом «эпохи» (19700101
00:00:0000) и заданным значением. Если переданная в каче
стве параметра дата предшествует началу эпохи, возвращает
ся отрицательное число.
HOUR Час (0–23).
MICROSECONDS Поле SECONDS (включая дробную часть), умноженное на
1 000 000.
MILLENNIUM До версии 8.0 возвращалось значение YEAR, поделенное на
1000. Начиная с версии 8.0 возвращается правильное значе
ние по григорианскому календарю, согласно которому первое
тысячелетие начинается в 0001 году, а столетия с номером 0 не
существует. Второе тысячелетие начинается с года 1001,
третье – с года 2001.
MILLISECONDS Поле SECONDS (включая дробную часть), умноженное на 1 000.
MINUTE Минуты (0–59).
MONTH Месяц (1–12).
QUARTER Квартал года (1–4), в который попадает заданное значение.
Можно использовать только для значений типа TIMESTAMP.
Скалярные функции в стандарте ANSI SQL 539
Компонент Назначение
SECOND Секунды (0–59).
TIMEZONE Смещение часового пояса в секундах.
TIMEZONE_HOUR Час в смещении часового пояса.
TIMEZONE_MINUTE Минута в смещении часового пояса.
WEEK Номер недели в году, в которую попадает заданное значение.
YEAR Год.
SQL Server
SQL Server предоставляет функцию DATEPART(date_part, expression) в качестве
синонима функции EXTRACT(date_part FROM expression), определенной в ANSI
SQL. Поддерживаемые SQL Server компоненты даты перечислены в табл. 4.8.
Таблица 4.8. Компоненты даты в SQL Server
Компонент Назначение
Day День месяца в выражении типа DATETIME. Допустимы также со
кращения d и dd.
dayofyear Порядковый номер дня в году. Допустимы также сокращения y и dy.
Hour Час. Допустимо также сокращение hh.
ISO_WEEK Номер недели согласно стандарту ISO 8601 (1–53). Допустимы также
сокращения isowk и isoww.
microsecond Микросекунды (0–999999). Допустимо также сокращение mcs.
millisecond Миллисекунды. Допустимо также сокращение ms.
minute Минуты (0–60). Допустимы также сокращения n и mi.
month Месяц (1–12). Допустимы также сокращения m и mm.
nanosecond Наносекунды (0–999999999). Допустимо также сокращение ns.
quarter Квартал года, в который попадает заданное значение типа DATE0
TIME. Допустимы также сокращения q и qq.
second Секунды (0–59). Также возможны сокращения s и ss.
TZoffset Часовой пояс. Допустимо также сокращение tz.
week Номер недели в году. Допустимы также сокращения wk и ww.
weekday День недели. Допустимо также сокращение dw.
year Год. Допустимы также сокращения yy и yyyy, возвращающие дву
значное и четырехзначное значение года соответственно.
Пример
В следующем примере извлекаются различные компоненты даты:
/* MySQL */
SELECT EXTRACT(YEAR FROM "2013 07 02");
540 Глава 4. Функции SQL
2013
SELECT EXTRACT(YEAR_MONTH FROM "2013 07 02 01:02:03");
201307
SELECT EXTRACT(DAY_MINUTE FROM "2013 07 02 01:02:03");
20102
/* PostgreSQL */
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001 02 16 20:38:40');
20
FLOOR
Функция FLOOR возвращает наибольшее целое число, меньшее или равное зна
чению входного параметра.
Примеры
Если на вход подается положительное число, то FLOOR просто отбрасывает все
цифры после запятой:
SELECT FLOOR(100.1) FROM dual;
FLOOR(100.1)
100
Если же параметр отрицателен, то такое округление «вниз» дает число, которое
по абсолютной величине больше параметра:
SELECT FLOOR( 100.1) FROM dual;
FLOOR( 100.1)
101
Функция CEIL ведет себя противоположно FLOOR.
LN
Функция LN возвращает натуральный логарифм числа, то есть степень, в кото
рую нужно возвести число e (математическая постоянная, приблизительно рав
ная 2.718281), чтобы получить заданное значение.
SQL Server
В SQL Server натуральный логарифм называется LOG:
LOG( expression )
Пример
В следующем примере (для Oracle) показан результат вычисления натурального
логарифма числа, близкого к значению e:
SELECT LN(2.718281) FROM dual;
LN(2.718281)
.999999695
Обратная к LN функция называется EXP.
MOD
Функция MOD возвращает остаток от деления одного числа на другое. На всех
платформах поддерживается синтаксис, определенный в стандарте ANSI SQL.
Пример
В следующем примере иллюстрируется применение функции MOD в команде
SELECT:
SELECT MOD(12, 5) FROM NUMBERS
2
POSITION
Функция POSITION возвращает номер начальной позиции подстроки в строке.
MySQL и PostgreSQL
MySQL и PostgreSQL поддерживают синтаксис ANSI SQL для функции POSITI0
ON.
Oracle
В Oracle эквивалентная функция называется INSTR.
542 Глава 4. Функции SQL
SQL Server
Вместо POSITION SQL Server поддерживает функции CHARINDEX и PATIN0
DEX. Отличаются они лишь тем, что PATINDEX допускает использование ме
тасимволов в критерии поиска.
Примеры
/* MySQL */
SELECT LOCATE('bar', 'foobar');
4
/* MySQL и PostgreSQL */
SELECT POSITION('fu' IN 'snafhu');
0
/* Microsoft SQL Server */
SELECT CHARINDEX( 'de', 'abcdefg' )
GO
4
SELECT PATINDEX( '%fg', 'abcdefg' )
GO
6
POWER
Функция POWER применяется для возведения числа в степень.
Примеры
Возведение в степень положительного числа не вызывает сложностей:
SELECT POWER(10,3) FROM dual;
POWER(10,3)
1000
Результат возведения любого числа в степень 0 равен 1:
SELECT POWER(0,0) FROM dual;
POWER(0,0)
1
При возведении в отрицательную степень десятичная запятая сдвигается влево:
SELECT POWER(10, 3) FROM dual;
POWER(10, 3)
.001
Скалярные функции в стандарте ANSI SQL 543
SQRT
Функция SQRT возвращает квадратный корень из числа.
Пример
SELECT SQRT(100) FROM dual;
SQRT(100)
10
WIDTH_BUCKET
Функция WIDTH_BUCKET распределяет значения по интервалам (buckets)
гистограмы с одинаковой шириной интервалов.
Oracle и PostgreSQL
И Oracle, и PostgreSQL поддерживают синтаксис WIDTH_BUCKET, определен
ный в ANSI SQL.
Примеры
В следующем примере диапазон целочисленных значений от 1 до 10 разбит на
два интервала:
SELECT x, WIDTH_BUCKET(x,1,10,2)
FROM pivot;
X WIDTH_BUCKET(X,1,10,2)
1 1
2 1
3 1
544 Глава 4. Функции SQL
4 1
5 1
6 2
7 2
8 2
9 2
10 3
А вот более интересный пример. Здесь 11 значений (от 1 до 10) делятся на три
интервала и демонстрируется, что левая граница включается в интервал, а пра
вая – нет:
SELECT x, WIDTH_BUCKET(x,1,10,3)
FROM pivot;
X WIDTH_BUCKET(X,1,10,3)
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3
9.9 3
10 4
Особое внимание обратите на строки, где X=1, X=9.9 и X=10. Значение, равное
min (в данном примере 1), попадает в первый интервал, поскольку левая грани
ца первого интервала определена как x >= min. Напротив, значение, равное
max, оказывается вне самого правого интервала. В данном примере 10 попадает
в интервал переполнения с номером buckets + 1. C другой стороны, значение 9.9
попадает в интервал 3, подтверждая, что правая граница этого интервала опре
делена как x < max.
Оператор конкатенации
В стандарте ANSI SQL определен оператор конкатенации (||), который сцепляет
две строки в одну.
MySQL
В MySQL имеется функция CONCAT, которая делает то же самое, что оператор
конкатенации в ANSI SQL, а оператор || означает логическое ИЛИ.
Oracle и PostgreSQL
И Oracle, и PostgreSQL поддерживают определенную в ANSI SQL нотацию опера
тора конкатенации (||). В Oracle также имеется функция CONCAT, являющаяся
синонимом этого оператора.
SQL Server
В SQL Server для конкатенации строки используется знак плюс (+). Кроме того,
в SQL Server имеется системный параметр CONCAT_NULL_YIELDS_NULL, ко
торый управляет тем, что происходит, когда одной из конкатенируемых строк
является NULL.
Примеры
/* Синтаксис ANSI SQL */
'string1' || 'string2' || 'string3'
'string1string2string3'
/* MySQL */
CONCAT('string1', 'string2')
'string1string2'
Если хотя бы одно из конкатенируемых значений равно NULL, то и результат
равен NULL. Если конкатенируется числовое значение, то оно неявно преобра
зуется в строку символов.
SELECT CONCAT('My ', 'bologna ', 'has ', 'a ', 'first ', 'name...');
'My bologna has a first name...'
SELECT CONCAT('My ', NULL, 'has ', 'first ', 'name...');
NULL
546 Глава 4. Функции SQL
CONVERT и TRANSLATE
Функция CONVERT изменяет представление символьной строки, не затрагивая
текущую кодировку и схему упорядочения (collation). Например, с помощью
CONVERT можно изменить количество битов на один символ.
Функция TRANSLATE изменяет кодировку строки. Так, с помощью TRANSLATE
можно перевести строку из английской кодировки в кодировку Kanji (японскую)
или Cyrillic (русскую). Трансляция должна быть предварительно определена: либо
по умолчанию, либо в результате выполнения команды CREATE TRANSLATION.
MySQL
MySQL поддерживает синтаксис ANSI SQL для функции CONVERT, но не под
держивает функцию TRANSLATE.
Oracle
Oracle поддерживает функции CONVERT и TRANSLATE с той же семантикой,
что в стандарте ANSI SQL. Синтаксис Oracle выглядит следующим образом:
CONVERT(char_value, target_char_set, source_char_set)
TRANSLATE(char_value USING {CHAR_CS | NCHAR_CS})
В реализации Oracle функция CONVERT возвращает текст char_value в целевой
кодировке. char_value – это подлежащая преобразованию строка, target_char_set –
имя кодировки, в которую следует преобразовать строку, а source_char_set – имя
кодировки, в которой хранится исходная строка.
Функция TRANSLATE в Oracle следует синтаксису ANSI, но поддерживает
только два значения кодировки: вы можете выбрать либо кодировку СУБД
(CHAR_CS), либо национальную кодировку (NCHAR_CS).
PostgreSQL
PostgreSQL поддерживает стандартную функцию CONVERT, а преобразование
можно определить с помощью команды CREATE CONVERSION. Функция TRAN0
SLATE в PostgreSQL заменяет все вхождения подстроки в строку:
TRANSLATE(character_string, from_text, to_text)
Вот несколько примеров:
SELECT TRANSLATE('12345abcde', '5a', 'XX');
'1234XXbcde'
SELECT TRANSLATE(title, 'computer', 'PC')
FROM titles
WHERE type = 'Personal_computer'
SELECT CONVERT('PostgreSQL' USING iso_8859_1_to_utf_8)
'PostgreSQL'
SQL Server
В SQL Server функция TRANSLATE не реализована. Функция CONVERT в SQL
Server – весьма мощное средство, позволяющее изменять тип данных выраже
ния, но в остальном не имеет ничего общего с определением CONVERT в стан
дарте ANSI. Функционально она эквивалентна функции CAST:
CONVERT (data_type[(length) | (precision, scale)], expression[, style])
Параметр style служит для определения формата преобразования даты. Допол
нительную информацию см. в документации по SQL Server. Пример:
SELECT title, CONVERT(char(7), ytd_sales)
FROM titles
ORDER BY title
GO
LOWER и UPPER
Функции LOWER и UPPER позволяют изменить регистр всех символов в стро
ке. Они поддерживаются всеми СУБД, рассматриваемыми в настоящей книге.
На отдельных платформах реализованы также дополнительные функции фор
матирования текста.
MySQL
MySQL поддерживает стандартные функции UPPER и LOWER, а также их сино
нимы UCASE и LCASE.
548 Глава 4. Функции SQL
Пример
SELECT LOWER('You Talkin To ME?'), UPPER('you talking to me?!');
you talkin to me?, YOU TALKING TO ME?!
OVERLAY
Функция OVERLAY замещает часть исходной строки новой строкой.
PostgreSQL
PostgreSQL поддерживает функцию OVERLAY в том виде, в котором она опреде
лена в стандарте ANSI.
Примеры
Вот пример использования функции OVERLAY:
/* ANSI SQL и PostgreSQL */
SELECT OVERLAY('DONALD DUCK' PLACING 'TRUMP' FROM 8) FROM NAMES;
'DONALD TRUMP'
SUBSTRING
Функция SUBSTRING возвращает указанную подстроку строки.
MySQL
MySQL в основном поддерживает стандарт ANSI, но не позволяет задавать фразу
COLLATE. Синтаксис выглядит следующим образом:
SUBSTRING(extraction_string [FROM starting_position] [FOR length])
Oracle
В Oracle функция SUBSTR очень близка к стандартной функции SUBSTRING,
но не поддерживает фразу COLLATE. Если значение starting_position отрица
тельно, то Oracle отсчитывает позицию от конца строки extraction_string. Если
аргумент length опущен, то возвращается подстрока от начальной позиции до
конца строки. Синтаксис выглядит следующим образом:
SUBSTR(extraction_string, starting_position[, length])
PostgreSQL
PostgreSQL в основном следует стандарту ANSI, но не поддерживает фразу COL0
LATE. Синтаксис выглядит следующим образом:
SUBSTRING(extraction_string [FROM starting_position] [FOR length])
SQL Server
В SQL Server реализация близка к стандарту ANSI, но фраза COLLATE не под
держивается. SQL Server позволяет применять эту функцию к тексту, а также
к данным типа image и binary, однако параметры starting_position и length обо
значают количество байтов, а не символов. Синтаксис выглядит следующим об
разом:
SUBSTRING(extraction_string [FROM starting_position] [FOR length])
Примеры
Приведенные ниже примеры относятся ко всем четырем рассматриваемым плат
формам. Лишь второй пример, в котором начальная позиция отрицательна, ра
ботает только в Oracle (напомним, что в этой СУБД функция SUBSTRING назы
вается SUBSTR), а на всех остальных платформах завершается с ошибкой.
/* Oracle, позиция отсчитывается слева */
SELECT SUBSTR('ABCDEFG',3,4) FROM DUAL;
'CDEF'
/* Oracle, позиция отсчитывается справа */
SELECT SUBSTR('ABCDEFG', 5,4) FROM DUAL;
'CDEF'
/* MySQL */
SELECT SUBSTRING('Be vewy, vewy quiet' FROM 5);
'wy, vewy quiet'
/* PostgreSQL и SQL Server */
SELECT au_lname, SUBSTRING(au_fname, 1, 1)
550 Глава 4. Функции SQL
FROM authors
WHERE au_lname = 'Carson'
Carson C
TRIM
Функция TRIM удаляет символы в начале, конце или с обеих сторон символь
ной строки или BLOBзначения. По умолчанию удаляются все вхождения ука
занного символа с обеих сторон строки. Если удаляемый символ не указан, то
TRIM удаляет пробелы.
SQL Server
В SQL Server имеются функции LTRIM и RTRIM, которые удаляют начальные
и конечные пробелы соответственно. Никакие другие символы, кроме пробелов,
эти функции удалить не позволяют.
Примеры
SELECT TRIM(' wamalamadingdong ');
'wamalamadingdong'
SELECT LTRIM( RTRIM(' wamalamadingdong ') );
'wamalamadingdong'
SELECT TRIM(LEADING '19' FROM '1976 AMC GREMLIN');
'76 AMC GREMLIN'
SELECT TRIM(BOTH 'x' FROM 'xxxWHISKEYxxx');
'WHISKEY'
SELECT TRIM(TRAILING 'snack' FROM 'scooby snack');
'scooby '
Платформозависимые расширения
В следующих разделах приводится полный перечень функций, поддерживае
мых в каждой СУБД. Эти функции платформозависимы. Так, не гарантирует
ся, что функция, реализованная на платформе MySQL, будет поддержана други
ми производителями.
Платформо5зависимые расширения 551
BENCHMARK(count, expr)
Вычисляет выражение expr count раз. Результат всегда равен 0. Например:
BENCHMARK(1000000,ATAN2(3.1415, 1)) > 0
BIN(number)
Возвращает строку, содержащую двоичное значение числа number типа BIG0
INT.
BINARY(string)
Преобразует string в двоичную строку.
BIT_AND(expr)
Агрегатная функция, возвращающая результат применения поразрядной опе
рации И ко всем битам в expr. Вычисление выполняется с 64битовой (BIGINT)
точностью. Если подходящих строк не найдено, возвращается –1. Например:
BIT_AND(mycolumn) > 0
BIT_COUNT(number)
Возвращает количество единичных битов в числе number. Например:
BIT_COUNT(5) > 2
BIT_OR(expr)
Агрегатная функция, возвращающая результат применения поразрядной
операции ИЛИ ко всем битам в expr. Вычисление выполняется с 64битовой
(BIGINT) точностью. Если подходящих строк не найдено, возвращается 0.
Например:
BIT_OR(mycolumn) > 1
BIT_XOR(expr)
Агрегатная функция, возвращающая результат применения поразрядной
операции ИСКЛЮЧАЮЩЕЕ ИЛИ ко всем битам в expr. Вычисление выпол
няется с 64битовой (BIGINT) точностью. Если подходящих строк не найде
но, возвращается 0. Например:
BIT_XOR(mycolumn) > 1
CHAR(number[, ...])
Возвращает строку, состоящую из символов, заданных своими ASCIIкода
ми. Аргументы со значением NULL игнорируются. Например:
CHAR(120,121,122) > 'xyz'
CHARSET(str)
Возвращает кодировку строки str. Например:
CHARSET('oolong') > 'latin1'
COALESCE(list)
Возвращает первый отличный от NULL элемент списка. Например:
COALESCE( NULL, 1, 2 ) > 1
Платформо5зависимые расширения 553
COERCIBILITY(expr)
Возвращает показатель приводимости схемы упорядочения значения expr.
Результатом является целое число от 0 до 5; чем меньше значение, тем выше
его приоритет. Например:
COERCIBILITY( 'darjeeling' ) > 4
COLLATION(str)
Возвращает схему упорядочения строки str. Например:
COLLATION( _utf8'assam' ) > 'utf8_general_ci'
COMPRESS(string)
Возвращает результат упаковки строки string.
CONCAT_WS(separator, str1, str2[, ...])
Специальная форма функции CONCAT, которая вставляет разделитель sepa
rator между соседними конкатенируемыми строками. Если аргумент separa
tor равен NULL, то функция возвращает NULL. Например:
CONCAT_WS(', ', au_lname, au_fname ) > 'Jefferson, Thomas'
CONNECTION_ID( )
Возвращает идентификатор соединения. У каждого соединения имеется уни
кальный идентификатор. Например:
CONNECTION_ID( ) > 305102
CONV(number, from_base, to_base)
Возвращает строковое представление числа number после перевода из системы
счисления с основанием from_base в систему с основанием to_base. Если хотя
бы один аргумент равен NULL, функция возвращает NULL. Например:
CONV(12,10,2) > 1100
COS(number)
Возвращает косинус числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT COS(0) > 1.000000
COT(number)
Возвращает котангенс числа number, представляющего собой угол, выражен
ный в радианах. Например:
SELECT COT(0) > NULL
CRC32(expr)
Возвращает контрольную сумму CRC32 выражения expr. Например:
SELECT CRC32('mysql') > 2501908538
554 Глава 4. Функции SQL
CURDATE( )
Возвращает текущую дату в формате YYYYMMDD или YYYYMMDD, в за
висимости от того, вызвана функция в строковом или числовом контексте.
Например:
CURDATE( ) > '2003 06 24'
CURTIME( )
Возвращает текущее время в формате HH:MM:SS или HHMMSS, в зависимо
сти от того, вызвана функция в строковом или числовом контексте. Напри
мер:
CURTIME( ) > '20:40:20'
DATABASE( )
Возвращает имя текущей базы данных. Например:
DATABASE( ) > 'PUBS'
DATE_ADD(date, INTERVAL expr type)
DATE_SUB(date, INTERVAL expr type)
ADDDATE(date, INTERVAL expr type)
SUBDATE(date, INTERVAL expr type)
Эти функции производят арифметические вычисления с датами. ADDATE
и SUBDATE – синонимы соответственно DATE_ADD и DATE_SUB. Функция
DATE_ADD возвращает результат сложения даты date с интервалом INTER0
VAL, а DATE_SUB – результат вычитания интервала INTERVAL из даты
date. Например:
DATE_ADD('1999 04 15', INTERVAL 1 DAY) > '1999 04 16'
DATE_SUB('1999 04 15', INTERVAL 1 DAY) > '1999 04 14'
DATE_ FORMAT(date, format)
Форматирует дату в соответствии с форматной строкой format. Например:
DATE_FORMAT('2008 04 15', '%M %D %Y') > 'April 15th 2008'
В табл. 4.10 описаны допустимые спецификаторы формата.
Таблица 4.10. Спецификаторы формата в MySQL
Спецификатор формата Назначение
%a Сокращенное название дня (Sun–Sat)
%b Сокращенное название месяца (Jan–Dec)
%c Номер месяца (1–12)
%D День месяца с окончанием (1st, 2nd, 3rd...)
%d День месяца, записанный двумя цифрами (01, 02, ...)
%e День месяца (1, 2, ...)
%H Час (00–23)
%h Час (01–12)
Платформо5зависимые расширения 555
DAYNAME(date)
Возвращает название дня недели, приходящегося на дату date. Например:
DAYNAME('1999 04 15') > 'Thursday'
DAYOFMONTH(date)
Возвращает порядковый номер дня в месяце (число от 1 до 31) для даты date.
Например:
DAYOFMONTH('1999 04 15') > 15
556 Глава 4. Функции SQL
DAYOFWEEK(date)
Возвращает номер дня недели для даты date (1 = воскресенье, 2 = понедель
ник, ... 7 = суббота). Например:
DAYOFWEEK('1999 04 15') > 5
DAYOFYEAR(date)
Возвращает номер дня в году для даты date (число от 1 до 366). Например:
DAYOFYEAR('1999 04 15') > 105
DECODE(crypt_str, pass_str)
Дешифрирует строку crypt_str, используя pass_str в качестве пароля; строка
crypt_str должна быть получена от функции ENCODE. Например:
DECODE(ENCODE('foo','bar'),'bar') > 'foo'
DEFAULT(column_name)
Возвращает значение по умолчанию для столбца column_name. Например:
SELECT DEFAULT(a_column) FROM a_table > 0
DEGREES(number)
Возвращает результат преобразования аргумента number из радианов в граду
сы. Например:
DEGREES(3.1415926) > 179.99999692953
DES_DECRYPT(crypt_str, key_str)
Возвращает результат дешифрирования строки crypt_str, зашифрованной
шифром DES с ключом key_str.
DES_ENCRYPT(str, key_str)
Возвращает результат шифрования строки str шифром DES с ключом key_str.
Например:
SELECT DES_DECRYPT(DES_ENCRYPT('secret sauce', 'password'), 'password') > 'secret
sauce'
ELT(n, str1, str2, str3[, ... n])
Возвращает str1, если n = 1, str2, если n = 2, и т. д. Если n меньше 1 или боль
ше количества аргументов, то функция возвращает NULL. Функция ELT
служит дополнением к функции FIELD. Например:
ELT(1, 'Hi', 'There') > 'Hi'ELT(2, 'Hi', 'There') > 'There'
ENCODE(str, pass_str)
Шифрует строку str, используя в качестве пароля строку pass_str. Для де
шифрирования результата используется функция DECODE. Результат пред
ставляет собой двоичную строку той же длины, что исходная. Например:
DECODE(ENCODE('foo','bar'),'bar') > 'foo'
Платформо5зависимые расширения 557
ENCRYPT(str[, salt])
Шифрует строку str, применяя системный вызов UNIX crypt. В качестве ар
гумента salt должна быть передана строка из двух символов. Например:
ENCRYPT('password') > 'ZB7yqPUHvNnmo'
EXPORT_SET(bits, on, off,[ separator,[ number_of_bits]])
Возвращает строку str, в которой вместо каждого единичного бита в числе
bits подставляется строка on, а вместо каждого нулевого бита – строка off.
Строки отделяются друг от друга разделителем separator (по умолчанию запя
тая (,)). Параметр number_of_bits (количество битов) необязателен; если он
опущен, подразумевается значение 64. Например:
EXPORT_SET(4,'T','F')
F,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F
EXTRACTVALUE(xml, xpath)
Извлекает текст из фрагмента XML, заданного параметром xml, соответст
вующий XPathпути xpath. Например:
EXPORT_SET('<catalog><tea>oolong</tea><tea>darjleeing</tea></catalog>',
'/catalog/tea')
'oolong darjeeling'
FIELD(str, str1, str2, str3[, ...])
Возвращает индекс строки str в заданном наборе аргументов или 0, если стро
ка str не встречается. Функция FIELD служит дополнением к функции ELT.
Например:
FIELD('GOOSE','DUCK','DUCK','GOOSE','DUCK') > 3
FIND_IN_SET(str, strlist)
Возвращает индекс строки str в списке строк strlist, разделенных запяты
ми. Эта функция эквивалентна обращению FIELD(str, CONCAT_WS(',',
str1, str2, str3[, ...])). Например:
FIND_IN_SET('b','a,b,c,d') > 2
FORMAT(number, decimals)
Представляет число number в формате #,###,###.## после округления до
decimals знаков после запятой. Если decimals равно 0, то в результате не будет
ни десятичной точки, ни дробной части. Например:
FORMAT(12345.2132,2) > 12,345.21
FORMAT(12345.2132,0) > 12,345
FOUND_ROWS( )
Возвращает количество строк, которое вернул бы ранее выполненный запрос,
содержащий фразу LIMIT. Обращаться к функции FOUND_ROWS( ) следу
ет сразу же после выполнения запроса с ограничением на число возвращае
мых строк. Например:
SELECT FOUND_ROWS( ) > 31415926
558 Глава 4. Функции SQL
FROM_DAYS(number)
Зная номер дня (начало отсчета – первый год нашей эры) number, возвращает
значение типа DATE. Эту функцию не следует использовать для дат, предше
ствующих принятию григорианского календаря (1582 год), изза того, что
в результате перехода на него несколько дней было потеряно. Например:
FROM_DAYS(888888) > 2433 09 10
FROM_UNIXTIME(unix_timestamp)
Возвращает представление аргумента unix_timestamp (количество секунд, про
шедших с 1 января 1970 года) в формате YYYYMMDD HH:MM:SS или
YYYYMMDDHHMMSS в зависимости от того, вызывается функция в строко
вом или числовом контексте. Например:
FROM_UNIXTIME(888123892) > 1998 02 21 21:04:52
FROM_UNIXTIME(unix_timestamp, format)
Возвращает представление аргумента unix_timestamp (количество секунд, про
шедших с 1 января 1970 года) в формате, определяемом форматной строкой
format. Форматная строка может содержать те же символы, что перечислены
в описании функции DATE_FORMAT. Например:
FROM_UNIXTIME(888123892,'%Y %D %M') > '1998 21st February'
GET_LOCK(str, timeout)
Пытается получить блокировку с именем str, ожидая не более timeout секунд.
Возвращает 1, если блокировку удалось получить, и NULL – в случае ошибки
или таймаута. Например:
GET_LOCK('lochness',10) > 1
GREATEST(x, y[, ...])
Возвращает максимум из значений аргументов. Например:
GREATEST(8,2,4) > 8
GROUP_CONCAT([DISTINCT] expr [ORDER BY order [ASC | DESC]] [SEPA0
RATOR sep])
Возвращает результат конкатенации отличных от NULL значений в группе,
определяемой выражением expr. Параметр order задает сортировку внутри
группы, а sep – разделитель, вставляемый между конкатенированными зна
чениями. Например:
SELECT estate, GROUP_CONCAT(tea SEPARATOR ';') FROM catalog GROUP BY estate
HEX(number)
Возвращает строковое представление шестнадцатеричного значения number.
Эквивалентно вызову CONV(number, 10, 16). Например:
HEX(255) > FF
Платформо5зависимые расширения 559
HOUR(time)
Возвращает число, представляющее час указанного времени time (от 0 до 23).
Например:
HOUR('08:20:15') > 8
IF(expr1, expr2, expr3)
Если expr1 равно TRUE, то возвращает expr2, иначе expr3. Например:
IF(1,'yes','no') > 'yes'
IF(0,'yes','no') > 'no'
IFNULL(expr1, expr2)
Если expr1 отлично от NULL, то возвращает expr1, иначе expr2. Например:
IFNULL(0,'NULL') > 0
IFNULL(NULL,'NULL') > 'NULL'
INET_ATON(expr)
Возвращает числовое представление сетевого IPадреса expr. Например:
INET_ATON('127.0.0.1') > 2130706433
INET_NTOA(num)
Возвращает строковое представление сетевого IPадреса, записанного в виде
числа num. Например:
INET_NTOA(2130706433) > '127.0.0.1'
INSERT(str, pos, len, newstr)
Возвращает строку str, в которой len символов, начиная с позиции pos, заме
нены строкой newstr. Например:
INSERT('paper',2,3,'ea') > 'pear'
INSTR(str, substr)
Возвращает позицию первого вхождения подстроки substr в строкe str. На
пример:
INSTR('ducks','c') > 3
INTERVAL(num1, num2, num3, num4[, ... n])
Возвращает 0, если num1 < num2; 1, если num1 < num3 и т. д. Требуется, чтобы вы
полнялось условие num2 < num3 < num4 < ... < numN. Например:
INTERVAL(5,1,6) > 1
INTERVAL(5,2,3,7,9) > 2
IS_FREE_LOCK(lock)
Возвращает 1, если блокировка lock свободна, и 0, если она занята. В случае
ошибки функция может возвращать NULL. Например:
IS_FREE_LOCK('lochness') > 0
560 Глава 4. Функции SQL
IS_USED_LOCK(lock)
Возвращает идентификатор соединения, в котором захвачена блокировка
с идентификатором lock, и NULL, если эта блокировка свободна. Например:
IS_USED_LOCK('lochness') > 0
ISNULL(expr)
Если expr равно NULL, то возвращает 1, иначе 0. Например:
ISNULL(1) > 0
ISNULL(NULL) > 1
LAST_DAY(expr)
Возвращает дату последнего дня в месяце, которому принадлежит дата expr.
Например:
LAST_DAY('2012 01 01') > '2012 01 31'
LAST_INSERT_ID([expr])
Возвращает последнее автоматически сгенерированное значение, которое бы
ло вставлено в столбец с атрибутом AUTO_INCREMENT. Например:
LAST_INSERT_ID( ) > 0
LCASE(str)
Синоним lower(str). Например:
LCASE('DUCK') > 'duck'
LEAST(X, Y[, ... n])
Возвращает минимум из значений аргументов. Например:
LEAST(10,5,3,7) > 3
LEFT(str, len)
Возвращает len самых левых символов из строки str. Например:
LEFT('Ducks', 4) > 'Duck'
LENGTH(str)
Возвращает длину строки str. Например:
LENGTH('DUCK') > 4
LOAD_FILE(file_name)
Читает файл с именем file_name и возвращает его содержимое в виде строки.
Файл должен находиться на сервере, а пользователь должен задать полное
имя к файлу и иметь права доступа к нему.
LOCATE(substr, str), POSITION(substr IN str)
Возвращает позицию первого вхождения подстроки substr в строку str или 0,
если substr не встречается в str. LOCATE является синонимом стандартной
функции POSITION(substr IN str). Например:
LOCATE('al','Donald') > 4
POSITION('al' IN 'Donald') > 4
Платформо5зависимые расширения 561
OCT(n)
Возвращает число n, записанное в восьмеричном виде. Эквивалентно обраще
нию CONV(N,10,8). Если n равно NULL, возвращает NULL. Например:
OCT(255) > 377
OLD_PASSWORD(str)
Вычисляет свертку пароля, зная открытый пароль str. Эта функция исполь
зуется для шифрования паролей доступа к MySQL. Префикс «OLD_» был до
бавлен в версии 4.1, когда схема хеширования паролей изменилась в целях
повышения безопасности. Например:
OLD_PASSWORD('password') > '5d2e19393cc5ef67'
ORD(str)
Возвращает ординальное число многобайтного символа, представленного
строкой str. Вычисление производится по формуле: (ASCIIкод первого бай
та) * 256 + (ASCIIкод второго байта) * 256 * 256) + (ASCIIкод третьего бай
та) * 256 * 256 * 256[,…]. Если str – не многобайтный символ, то эта функция
возвращает то же значение, что и функция ASCII. Например:
ORD('29') > 50
PASSWORD(str)
Вычисляет свертку пароля, зная открытый пароль str. Эта функция исполь
зуется для шифрования паролей доступа к MySQL. Например:
PASSWORD('password') > '5d2e19393cc5ef67'
PERIOD_ADD(period, months)
Прибавляет months месяцев к периоду period (заданному в формате YYMM или
YYYYMM). Возвращает значение в формате YYYYMM. Например:
PERIOD_ADD(9902,3) > 199905
PERIOD_DIFF(period1, period2)
Возвращает количество месяцев между двумя периодами: period1 и period2
(оба должны быть представлены в формате YYMM или YYYYMM). Например:
PERIOD_DIFF(9902,9905) > 3
PI( )
Возвращает значение числа π. Например:
PI( ) > 3.141593
POW(X, Y), POWER(X, Y)
Возвращает значение X, возведенное в степень Y. Например:
POW(2, 8) > 256.000000
QUARTER(date)
Возвращает квартал, соответствующий дате date (число от 1 до 4). Например:
QUARTER('1999 04 15') > 2
564 Глава 4. Функции SQL
QUOTE(str)
Возвращает строку str, в которой специальные символы экранированы так,
чтобы значение можно было безопасно использовать в командах SQL. Напри
мер:
QUOTE('\'start and end with quote\'') > '\'start and end with quote\''
RADIANS(X)
Возвращает результат преобразования аргумента X из градусов в радианы.
Например:
RADIANS(180) > 3.1415926535898
RAND( ), RAND(N)
Возвращает случайное число с плавающей точкой в диапазоне от 0 до 1.0. Ес
ли задан целочисленный аргумент N, то он используется для инициализации
генератора псевдослучайных чисел. Например:
RAND( ) > 0.29588872501244
expr REGEXP pat, expr RLIKE pat
Возвращает 1, если expr сопоставляется с регулярным выражением pat, в про
тивном случае 0 (REGEXP и RLIKE синонимы). Например:
SELECT 'oolong' REGEXP '^[a z]' > 1
RELEASE_LOCK(str)
Освобождает блокировку с именем str, захваченную при вызове функции
GET_LOCK. Возвращает 1, если блокировка освобождена, или NULL, если
блокировки в таким именем не существует либо она захвачена в другом пото
ке (в последнем случае блокировка не освобождается). Например:
RELEASE_LOCK('lochness') > 1
REPEAT(str, count)
Возвращает строку str, повторенную count раз. Например:
REPEAT('Duck', 3) > 'DuckDuckDuck'
REPLACE(str, from_str, to_str)
Возвращает строку str, в которой все вхождения подстроки from_str замене
ны строкой to_str. Например:
REPLACE('change', 'e', 'ing') > 'changing'
REVERSE(str)
Возвращает обращенную строку str. Например:
REVERSE('STOP') > 'POTS'
RIGHT(str, len)
Возвращает len самых правых символов из строки str. Например:
RIGHT('Hello, World!', 6) > 'World!'
Платформо5зависимые расширения 565
ROUND(X[, D])
Возвращает аргумент X, округленный до D десятичных знаков после запятой.
Если D равно 0, то результат не содержит ни десятичной точки, ни дробной
части. Например:
ROUND(12345.6789, 2) > 12345.68
ROW_COUNT()
Возвращает количество строк, обновленных предыдущей командой. Напри
мер:
SELECT ROW_COUNT( ) > 4
RPAD(str, len, padstr)
Возвращает строку str, дополненную справа строкой padstr до длины len сим
волов. Например:
RPAD('duck',6,'s') > 'duckss'
RTRIM(str)
Возвращает строку str, из которой удалены конечные пробелы. Например:
RTRIM(' welcome ') > ' welcome'
SCHEMA( )
Синоним функции DATABASE.
SEC_TO_TIME(seconds)
Возвращает аргумент seconds, представленный в формате HH:MM:SS или
HHMMSS, в зависимости от того, вызвана функция в строковом или число
вом контексте. Например:
SEC_TO_TIME(256) > 00:04:16
SECOND(time)
Возвращает число, представляющее секунды указанного времени time (от 0
до 59). Например:
SECOND('08:20:15') > 15
SESSION_USER( )
Синоним функции USER.
SHA(X) или SHA1(X)
Возвращает 160битовую контрольную сумму аргумента X, вычисленную по
алгоритму SHA1. Например:
SHA('abc') > 'a9993e364706816aba3e25717850c26c9cd0d89d'
SIGN(X)
Возвращает знак аргумента: –1, 0 или 1 в зависимости от того, является X от
рицательным, нулевым или положительным числом. Например:
SIGN( 3.1415926) > 1
566 Глава 4. Функции SQL
SIN(number)
Возвращает синус числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT SIN( 0 ) > 0.000000
SLEEP(s)
Вызывает приостановку выполнения на s секунд. Например:
SLEEP( 60 ) > 0
SOUNDEX(str)
Возвращает soundexстроку, соответствующую str (для сравнения по звуча
нию). Например:
SOUNDEX('thimble') > 'T514'
expr1 SOUNDS LIKE expr2
То же самое, что выражение
SOUNDEX(expr1) = SOUNDEX(expr2)
SPACE(n)
Возвращает строку, состоящую из n пробелов. Например:
SPACE(5) > ' '
STD(expr), STDDEV(expr)
Возвращает стандартное отклонение expr. Для совместимости с Oracle имеет
ся также вариант этой функции с именем STDDEV. Например:
STD(5) > NULL
STR_TO_DATE(str, format)
Возвращает дату, полученную в результате разбора строки str в соответствии
с форматной строкой format. Эта функция противоположна DATE_FORMAT;
полный перечень допустимых спецификаторов формата см. в описании
DATE_FORMAT. Например:
STR_TO_DATE('28/08/1976', '%d/%m/%Y') > '1976 08 28'
STRCMP(expr1, expr2)
Возвращает 0, если аргументы равны; –1, если первый аргумент меньше вто
рого согласно текущему порядку сортировки; 1 в противном случае. Напри
мер:
STRCMP('DUCKY', 'DUCK') > 1
STRCMP('DUCK', 'DUCK') > 0
SUBSTRING(str, pos), SUBSTRING(str FROM pos)
Возвращают подстроку строки str, начинающуюся в позиции pos. Например:
SUBSTRING('Hello, World!', 8) > 'World!'
SUBSTRING('Hello, World!' FROM 8) > 'World!'
Платформо5зависимые расширения 567
WEEKOFYEAR(date)
Возвращает номер календарной недели, соответствующей дате date (число от
1 до 53 включительно). Например:
WEEKOFYEAR('2008 01 01') > 1
op1 XOR op2
Возвращает результат применения операции ИСКЛЮЧАЮЩЕЕ ИЛИ к опе
рандам op1 и op2. Например:
SELECT 1 XOR 1, 1 XOR 0 > 0, 1
YEAR(date)
Возвращает год, соответствующий дате date (число от 1000 до 9999). Напри
мер:
YEAR('1999 04 15') > 1999
YEARWEEK(date), YEARWEEK(date, first)
Возвращает год и номер недели в году, соответствующие дате date. Второй ар
гумент интерпретируется точно так же, как второй аргумент функции
WEEK. Отметим, что для первой и последней недели года возвращенный год
может отличаться от года, указанного в дате date. Например:
YEARWEEK('1999 04 15') > 199915
ASCII(text)
Возвращает ASCIIкод первого символа строки text. Например:
SELECT ASCII('x') FROM DUAL > 120
ASCIISTR(text)
Преобразует строку text из произвольной кодировки в кодировку ASCII. Те
символы text, которым нет эквивалента в кодировке ASCII, заменяются стро
кой \XXXX, где XXXX – шестнадцатеричная кодовая позиция в кодировке
UTF16. Например:
SELECT ASCIISTR('Привет Peter') FROM DUAL > '\040F\0430\0401\045E\0490\0432 Peter'
ASIN(number)
Возвращает арксинус числа number, находящегося в диапазоне от –1 до 1. Ре
зультат принимает значения от –π/2 до π/2 и выражен в радианах. Например:
SELECT ASIN( 0 ) FROM DUAL > 0.000000
ATAN(number)
Возвращает арктангенс произвольного числа number. Результат принимает
значения от –π/2 до π/2 и выражен в радианах. Например:
SELECT ATAN( 3.1415 ) FROM DUAL > 1.262619
ATAN2(number, nbr)
Возвращает арктангенс числа. Функция ATAN2(x, y) аналогична ATAN(y/x)
с тем отличием, что для определения квадранта, в котором находится резуль
тат, используются знаки аргументов x и y. Например:
SELECT ATAN2(3.1415, 1) FROM DUAL > 1.26261873
BFILENAME(directory, filename)
Возвращает указатель BFILE, ассоциированный с физическим двоичным
LOBфайлом, хранящимся в каталоге directory файловой системы сервера
под именем filename.
BIN_TO_NUM(expr[, ... n])
Возвращает десятичное число, эквивалентное битовому вектору, представ
ленному списком параметров expr. Например:
SELECT BIN_TO_NUM(1,0,1) FROM DUAL > 5
BITAND(integer1, integer2)
Возвращает результат применения поразрядной операции И к двум целочис
ленным аргументам. Например:
SELECT BITAND(101, 2) FROM DUAL > 0
CARDINALITY(nested_table)
Возвращает количество элементов (кардинальное число) во вложенной таб
лице nested_table. Если таблица nested_table пуста, возвращает NULL. На
пример:
SELECT CARDINALITY(mytable) FROM DUAL > 6
572 Глава 4. Функции SQL
CHARTOROWID(char)
Преобразует значение символьного типа (CHAR или VARCHAR2) в тип ROWID.
CHR(number [USING NCHAR_CS])
Возвращает символ с двоичным кодом number в кодировке базы данных (если
фраза USING NCHAR_CS опущена) или в национальной кодировке (если
фраза USING NCHAR_CS включена).
CLUSTER_ID( ), CLUSTER_PROBABILITY( ), CLUSTER_SET( )
Поддержка технологии добычи данных (Data Mining). Дополнительную ин
формацию об этих функциях см. в документации по Oracle Data Mining Java
API или по пакету DBMS_DATA_MINING.
COALESCE(list)
Возвращает первый отличный от NULL элемент списка. Например:
SELECT COALESCE( NULL, 1, 2 ) FROM DUAL > 1
COLLECT(column)
Для каждой группы создает вложенную таблицу, содержащую все значения
в столбце column. Это агрегатная функция.
COMPOSE(string)
Возвращает результат преобразования string в полностью нормализованную
строку UNICODE.
CONCAT(string1, string2)
Возвращает результат конкатенации строк string1 и string2. Функция CON0
CAT эквивалентна оператору конкатенации ||. Например:
SELECT CONCAT( au_lname, au_fname ) FROM AUTHORS > 'JeffersonThomas'
CONVERT(char_value, target_char_set, source_char_set)
Преобразует символьную строку из одной кодировки в другую. Возвращает
результат преобразования строки char_value, заданной в кодировке source_
char_set, в кодировку target_char_set.
CORR_K(expr1, expr2[, return_type])
CORR_S(expr1, expr2[, return_type])
Функция CORR_K возвращает коэффициент корреляции Кендалла (taub),
а CORR_S – коэффициент корреляции Спирмена между двумя наборами про
нумерованных пар (expr1 и expr2). Аргумент return_type типа VARCHAR2 может
быть опущен или принимать одно из следующих значений: ‘COEFFICIENT’,
‘ONE_SIDED_SIG’, ‘TWO_SIDED_SIG’. Значение ‘COEFFICIENT’ (подразу
меваемое по умолчанию, если аргумент отсутствует) означает, что нужно вер
нуть коэффициент корреляции. Значения ‘ONE_SIDED_SIG’ и ‘TWO_SID0
ED_SIG’ означают, что нужно вернуть одностороннюю или двустороннюю зна
чимость корреляции соответственно.
COS(number)
Возвращает косинус числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT COS(0) FROM DUAL > 1.000000
Платформо5зависимые расширения 573
COSH(number)
Возвращает гиперболический косинус числа number. Например:
SELECT COSH(180) FROM DUAL > 7.4469E+77
CUBE_TABLE('expr')
Извлекает двумерное реляционное представление из OLAPкуба (одно изме
рение). Дополнительную информацию см. в документации по Oracle OLAP.
CV([dimension_column])
Имеет смысл только в контексте межстроковых вычислений, выполняемых
внутри фразы MODEL команды SELECT. Эта функция возвращает текущее
значение столбца dimension_column. Она может встречаться только в правой
части правила, так как возвращает значение столбца dimension_column из ле
вой части того же правила.
DATAOBJ_TO_PARTITION(table, partition_id )
Возвращает идентификатор секции для секционированной таблицы, задан
ной аргументами. Дополнительную информацию см. в документации Oracle
по этой функции.
DBTIMEZONE
Возвращает смещение часового пояса сервера базы данных от UTC. Например:
SELECT DBTIMEZONE FROM DUAL > +00:00
DECODE(expr, search, result[, search, result[, ... n]][, default])
Сравнивает выражение expr по очереди с каждым значением search. При пер
вом совпадении возвращает следующее за ним выражение result. Например:
DECODE ('B','A',1,'B',2,...'Z',26,'?') > 2
Если совпадение не найдено, то DECODE возвращает значение default или
NULL, если параметр default опущен. Дополнительную информацию см. в до
кументации по Oracle. Предпочтительнее пользоваться конструкцией CASE,
поскольку она является частью стандарта ANSI SQL.
DECOMPOSE(string [{CANONICAL | COMPATIBILITY}])
Возвращает результат декомпозиции строки string в кодовые позции UNI
CODE. Второй аргумент определяет тип декомпозиции. Подразумеваемое по
умолчанию значение CANONICAL позволяет восстановить исходную UNI
CODEстроку.
DELETEXML(xml_fragment, xpath[, namespace])
Удаляет из фрагмента XML xml_fragment узлы, соответствующие XPathвыра
жению xpath, и возвращает результат. Необязательный параметр namespace за
дает пространство имен для XPathвыражения. Например:
SELECT DELETEXML(XMLTYPE('<a><b>Sifl</b><c>Olly</c></a>'), '/a/c') FROM DUAL
'<a><b>Sifl</b></a>'
DEPTH(number)
Возвращает глубину пути, заданную в условии UNDER_PATH в XMLзапро
се. Дополнительную информацию см. в документации по Oracle.
574 Глава 4. Функции SQL
DEREF(expression)
Возвращает объект, на который ссылается выражение expression, которое
должно быть ссылкой (REF) на объект.
DUMP(expression[, return_format[, starting_at3 length]]])
Возвращает строку типа VARCHAR2, содержащую характеристики выраже
ния expression: код типа данных, длину в байтах и внутреннее представление.
Значение возвращается в формате return_format. Например:
SELECT DUMP('abc', 1016) FROM DUAL
Typ=96 Len=3 CharacterSet=AL32UTF8: 61,62,63
EMPTY_BLOB( ), EMPTY_CLOB( )
Возвращает указатель на пустой LOBобъект, который можно использовать
для инициализации переменной типа LOB, а также для стирания колонки
или атрибута типа LOB в команде INSERT или UPDATE.
EXISTSNODE(instance, xpath[, namespace])
Возвращает 1, если XPathзапрос, заданный параметром xpath, вернет хотя
бы один узел из фрагмента instance; иначе возвращает 0. Необязательный па
раметр namespace задает пространство имен XML в запросе. Дополнительную
информацию об XMLзапросах см. в документе Oracle SQL Reference.
EXTRACT(instance, xpath[, namespace])
Возвращает узлы фрагмента XML instance, возвращаемые XPathзапросом
xpath. Необязательный параметр namespace задает пространство имен XML
в запросе. Дополнительную информацию об XMLзапросах см. в документе
Oracle SQL Reference. (В Oracle есть также функция EXTRACT, относящаяся
к работе с датами, она была рассмотрена выше в этой главе.) Например:
SELECT EXTRACT(XMLTYPE('<foo><bar>Hello, World!</bar></foo>'),
'/foo/bar') from DUAL
<bar>Hello, World!</bar>
EXTRACTVALUE(instance, xpath[, namespace])
Возвращает значение, хранящееся в узле XMLдокумента, который возвра
щает XPathзапрос xpath. Необязательный параметр namespace задает про
странство имен XML в запросе. Дополнительную информацию об XMLзапро
сах см. в документе Oracle SQL Reference. Например:
SELECTEXTRACTVALUE(XMLTYPE('<foo><bar>Hello,World!</bar></foo>'),
'/foo/bar') from DUAL
Hello, World!
FEATURE _ID( ), FEATURE _SET( ), FEATURE_VALUE( )
Поддержка технологии добычи данных. Дополнительную информацию об этих
функциях см. в документации по Oracle Data Mining Java API или по пакету
DBMS_DATA_MINING.
FIRST
Агрегатная функция, которая возвращает заданное значение из строки с пер
вым рангом в смысле порядка, определяемого фразой ORDER BY. Синтаксис
выглядит следующим образом:
Платформо5зависимые расширения 575
NULL NULL 0
10 57000.0000 0
12 2275.0000 0
14 4000.0000 0
16 7000.0000 0
24 25125.0000 0
NULL 95400.0000 1
GROUPING_ID(column_name1[, column_name2, ...])
Возвращает десятичное число, равное двоичной величине, построенной путем
конкатенации значений GROUPING для каждого параметра. Функция полез
на, когда запрос возвращает результат, содержащий несколько уровней агреги
рования, созданных выражениями GROUP BY. Предпочтительнее использо
вать ее вместо нескольких функций GROUPING в одном запросе. Эта функция
является сокращенной записью следующей конструкции:
BIN_TO_NUM( GROUPING(column_name1)[, GROUPING(column_name2), ...] )
HEXTORAW(string)
Преобразует строку string, состоящую из шестнадцатеричных цифр, в двоич
ное значение. Например:
SELECT HEXTORAW('0FE') FROM DUAL > '00FE'
INITCAP(string)
Возвращает строку string, в которой первая буква каждого слова переведена
в верхний регистр, а остальные – в нижний. Например:
SELECT INITCAP('thomas jefferson') FROM DUAL > 'Thomas Jefferson'
INSERTCHILDXML(xml_fragment, xpath, child_expr, value_expr[, namespace])
Вставляет узлы, определяемые выражением child_expr, из фрагмента XML
value_expr в фрагмент xml_fragment в точке, определяемой XPathзапросом
xpath, и возвращает результат. Необязательный параметр namespace задает
пространство имен XML в запросе. Например:
SELECT INSERTCHILDXML(XMLTYPE('<a></a>'), '/a', 'b', XMLTYPE('<b>B1</b>')) FROM DUAL
'<a><b>B1</b></a>'
INSERTXMLBEFORE(xml_fragment, xpath, value_expr[, namespace])
Вставляет value_expr в фрагмент xml_fragment в точке, определяемой XPath
запросом xpath, и возвращает результат. Необязательный параметр namespace
задает пространство имен XML в запросе. Например:
SELECT INSERTXMLBEFORE(XMLTYPE('<a><b>B2</b></a>'), '/a/b', XMLTYPE('<b>B1</b>'))
FROM DUAL
'<a><b>B1</b><b>B2</b></a>'
INSTR(string1, string2[, start_at[, occurrence]])
Возвращает позицию строки string2 в строке string1. Функция просматрива
ет строку string1, начиная с позиции start_at (целое число), и ищет вхожде
ние строки string2 с указанным номером occurrence. Например:
Платформо5зависимые расширения 577
FROM DUAL
15 APR 2099 04:22:31
time_zone1 и time_zone2 могут принимать следующие значения:
‘AST’, ‘ADT’
Атлантическое стандартное или летнее время
‘BST’, ‘BDT’
Берингово стандартное или летнее время
‘CST’, ‘CDT’
Центральное стандартное или летнее время
‘EST’, ‘EDT’
Восточное стандартное или летнее время
‘GMT’
Гринвичское время
‘HST’, ‘HDT’
Аляскинскоегавайское стандартное или летнее время
‘MST’, ‘MDT’
Стандартное или летнее горное время
‘NST’
Ньюфаундлендское стандартное время
‘PST’, ‘PDT’
Тихоокеанское стандартное или летнее время
‘YST’, ‘YDT’
Юконское стандартное или летнее время
NEXT_DAY(date, string)
Возвращает дату первого дня недели с названием string, следующего за датой
date. Аргумент string должен быть полным или сокращенным названием дня
на языке текущего сеанса. Например:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD MON YYYY'
SELECT NEXT_DAY('15 APR 1999', 'SUNDAY') FROM DUAL
18 APR 1999
NLS_CHARSET_DECL_LEN(bytecnt, csid)
Возвращает количество символов в столбце типа NCHAR шириной bytecnt
в кодировке с идентификатором csid.
NLS_CHARSET_ID(text)
Возвращает идентификатор NLSкодировки по ее имени, заданном в пара
метре text.
NLS_CHARSET_NAME(number)
Возвращает имя NLSкодировки с идентификатором number в виде строки ти
па VARCHAR2.
Платформо5зависимые расширения 581
NLS_INITCAP(string[, nlsparameter])
Возвращает строку string, в которой первая буква каждого слова переведена
в верхний регистр, а остальные – в нижний. Параметр nlsparameter позволяет
указать языковые особенности сортировки.
NLS_LOWER(string[, nlsparameter])
Возвращает строку string, в которой все буквы переведены в нижний регистр.
Параметр nlsparameter позволяет указать языковые особенности сортировки.
NLS_UPPER(string[, nlsparameter])
Возвращает строку string, в которой все буквы переведены в верхний регистр.
Параметр nlsparameter позволяет указать языковые особенности сортировки.
NLSSORT(string[, nlsparameter])
Возвращает строку байтов, используемых для сортировки строки string. Па
раметр nlsparameter позволяет указать языковые особенности сортировки.
NTILE(expression) OVER ([partitioning] ordering)
Разбивает упорядоченный набор данных на группы, пронумерованные от 1 до
expression, и назначает каждой строке номер содержащей ее группы. Строки
распределяются по группам, так что количество строк в разных группах отли
чается не более чем на 1. О том, что означают параметры partitioning и order
ing, см. раздел «Оконные функции в ANSI SQL» выше в этой главе. Например:
SELECT c1, NTILE(4) OVER (ORDER BY c1) FROM FIVE_NUMS
1 1
2 1
3 2
4 3
5 4
NULLIF(expr1, expr2)
Возвращает NULL, если expr1 равно expr2, иначе возвращает expr1. Из двух
аргументов только второй может быть равен NULL. Например:
SELECT c1, c2, NULLIF(c1, c2) FROM NUMS
1 2 1
2 2
3 2 3
NUMTODSINTERVAL(number, string)
Преобразует number в литерал INTERVAL DAY TO SECOND, где number – число
или выражение, принимающее числовое значение, например столбец одного
из числовых типов. Второй аргумент, string, определяет способ интерпрета
ции number; он может принимать значения ‘DAY’, ‘HOUR’, ‘MINUTE’, ‘SE0
COND’. Например:
SELECT NUMTODSINTERVAL(100, 'DAY') FROM DUAL
+000000100 00:00:00.000000000
NUMTOYMINTERVAL(number, string)
Преобразует number в литерал INTERVAL DAY TO MONTH, где number – число
или выражение, принимающее числовое значение, например столбец одного
582 Глава 4. Функции SQL
REFTOHEX(expression)
Преобразует выражение expression в символьное значение, содержащее шест
надцатеричный эквивалент. expression должно возвращать REF.
REGEXP_INSTR(string, pattern[, start_at[, occurrence[, roption[, mparam]]]])
Просматривает строку string, начиная с позиции start_at (целое число, боль
шее 0), в поисках вхождения регулярного выражения pattern с порядковым
номером occurrence. Возвращает позицию начала подстроки, сопоставленной
с образцом. По умолчанию параметры start_at и occurrence равны 1. Пара
метр roption, который может принимать значение 0 или 1, определяет, следу
ет ли вернуть позицию первого символа сопоставленной подстроки или сле
дующего за ним. По умолчанию roption равно 0. Параметр mparam позволяет
модифицировать способ сопоставления и может принимать следующие зна
чения:
'i' сравнивать без учета регистра
'c' сравнивать с учетом регистра
'n' символ '.' сопоставляется с символом новой строки
'm' входная строка может содержать символы новой строки; для сопостав
ления с началом строки применяйте метасимвол ‘^’, а для сопоставле
ния с концом строки – метасимвол ‘$’.
Например:
SELECT REGEXP_INSTR('Hello, World!', '([^ ]*)!', 1, 1) FROM DUAL
8
REGEXP_REPLACE(string, pattern[, newstr[, start_at[, occurrence[, mparam]]]])
Просматривает строку string, начиная с позиции start_at (целое число, боль
шее 0), в поисках вхождения регулярного выражения pattern с порядковым
номером occurrence. Возвращает результат замены всех подстрок, сопостав
ленных с образцом pattern, новой строкой newstr. По умолчанию параметры
start_at и occurrence равны 1. Параметр mparam позволяет модифицировать
способ сопоставления и может принимать следующие значения:
'i' сравнивать без учета регистра
'c' сравнивать с учетом регистра
'n' символ '.' сопоставляется с символом новой строки
'm' входная строка может содержать символы новой строки; для сопостав
ления с началом строки применяйте метасимвол ‘^’, а для сопоставле
ния с концом строки – метасимвол ‘$’.
Например:
SELECT REGEXP_REPLACE('Hello, World!', '([^ ]*!)', 'Reader!') FROM DUAL
'Hello, Reader!'
REGEXP_SUBSTR(string, pattern[, start_at[, occurrence[, mparam]]])
Просматривает строку string, начиная с позиции start_at (целое число, боль
шее 0), в поисках вхождения регулярного выражения pattern с порядковым
номером occurrence. Возвращает саму подстроку, сопоставленную с образцом.
По умолчанию параметры start_at и occurrence равны 1. Параметр mparam по
Платформо5зависимые расширения 585
ABAsxDAAKAAAAEqAAC
ABAsxDAAKAAAAEqAAD
RPAD(string1, number[, string2])
Возвращает строку string1, дополненную справа строкой string2 до длины
number символов. По умолчанию подразумевается, что строка string2 состоит
из одного пробела. Например:
SELECT RPAD('duck',8,'s') FROM DUAL > 'duckssss'
RTRIM(string[, set])
Удаляет из конца строки string все символы, встречающиеся в строке set. По
умолчанию set состоит из одного пробела. Например:
SELECT RTRIM(' welcome ', ' ') FROM DUAL > ' welcome'
SCN_TO_TIMESTAMP(scn)
Возвращает временную метку, ассоциированную с системным номером изме
нения scn. Например:
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM NUMS WHERE c1 = 1
15 APR 04 02.56.05.000000000 PM
SESSIONTIMEZONE
Возвращает смещение часового пояса для текущего сеанса. Например:
SELECT SESSIONTIMEZONE FROM DUAL > 06:00
SET(nested_table)
Возвращает вложенную таблицу, содержащую различающиеся элементы
входной вложенной таблицы nested_table. Дополнительную информацию см.
в документе Oracle SQL Reference.
SIGN(number)
Если number < 0, возвращает –1. Если number = 0, возвращает 0. Если number > 0,
возвращает 1. Например:
SELECT SIGN( 3.1415926) FROM DUAL > 1
SIN(number)
Возвращает синус числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT SIN( 0 ) > 0.000000
SINH(number)
Возвращает гиперболический синус number. Например:
SELECT SINH(180) FROM DUAL > 7.4469E+77
SOUNDEX(string)
Возвращает строку символов, содержащую фонетическое представление
строки string. Эта функция позволяет сравнивать на равенство английские
слова, которые пишутся поразному, но звучат похоже. Например:
SELECT SOUNDEX('thimble') FROM DUAL > 'T514'
Платформо5зависимые расширения 587
SYSTIMESTAMP
Возвращает текущие дату и время в системе, где работает сервер базы дан
ных. Возвращаемое значение имеет тип TIMESTAMP. Например:
SELECT SYSTIMESTAMP FROM DUAL
26 JUN 2003 11.15.00.000000 PM 06:00
TAN(number)
Возвращает тангенс числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT TAN( 3.1415 ) FROM DUAL > 0.000093
TANH(number)
Возвращает гиперболический тангенс number. Например:
SELECT TANH(180) FROM DUAL > 1
TIMESTAMP_TO_SCN(timestamp_value)
Возвращает приблизительный (каждому моменту времени может соответст
вовать несколько изменений) номер системного изменения (SCN), ассоцииро
ванный с временной меткой timestamp_value. Возвращаемое значение имеет
тип NUMBER.
TO_BINARY_DOUBLE(expr[, format[, nls_parameter]])
Преобразует expr в тип BINARY_DOUBLE. Необязательный параметр format
задает форматирование. Если expr – символьное выражение, то параметры
format и nls_parameter эквивалентны и интерпретируются так же, как в функ
ции TO_CHAR. Если expr – числовое выражение, то задавать параметры for
mat и nls_parameter запрещено. Например:
SELECT c1, TO_BINARY_DOUBLE(c1) FROM NUMS
1 1.0E+000
2 2.0E+000
3 3.0E+000
TO_BINARY_FLOAT(expr[, format[, nls_parameter]])
Преобразует expr в тип BINARY_FLOAT. Необязательный параметр format за
дает форматирование. Если expr – символьное выражение, то параметры for
mat и nls_parameter эквивалентны и интерпретируются так же, как в функции
TO_CHAR. Если expr – числовое выражение, то задавать параметры format
и nls_parameter запрещено. Например:
SELECT c1, TO_BINARY_FLOAT(c1) FROM NUMS
1 1.0E+000
2 2.0E+000
3 3.0E+000
TO_CHAR(character_expr)
Преобразует выражение character_expr в кодировку базы данных. Например:
SELECT TO_CHAR('Howdy') FROM DUAL
Howdy
590 Глава 4. Функции SQL
Спецификатор Назначение
формата
TZH Час в смещении часового пояса
TZM Минута в смещении часового пояса
TZR Обозначение часового пояса
X Местный символ, отделяющий целую часть от дробной
Y, YY или YYY Год, записанный одной, двумя или тремя цифрами
Y, YYY Год, в записи которого присутствует запятая
YYYY Год, записанный четырьмя цифрами
VSIZE(expression)
Возвращает количество байтов во внутреннем представлении expression. Если
expression равно NULL, то возвращает NULL. Например:
SELECT vsize(1) FROM DUAL > 2
XMLAGG(instance[, order_by])
Агрегатная функция, которая возвращает XMLдокумент, полученный из
таблицы фрагментов XML, заданной параметром instance. Необязательная
фраза order_by позволяет упорядочить фрагменты XML. Дополнительную ин
формацию об XMLзапросах см. в документе Oracle SQL Reference.
XMLCAST(value AS datatype)
Приводит значение value к типу datatype и возвращает результат. Дополни
тельную информацию об XMLзапросах см. в документе Oracle SQL Reference.
XMLCDATA(value)
Возвращает значение value в виде секции XML CDATA. Дополнительную ин
формацию об XMLзапросах см. в документе Oracle SQL Reference.
XMLCOLATTVAL(expr [AS alias][, ...])
Возвращает фрагмент XML, составленный из аргументов expr. Необязатель
ная фраза AS позволяет изменить значение атрибута name. Дополнительную
информацию об XMLзапросах см. в документе Oracle SQL Reference.
XMLCONCAT(instance[, ...])
Возвращает экземпляр XML, являющийся объединением параметров instance.
Дополнительную информацию об XMLзапросах см. в документе Oracle SQL
Reference.
XMLDIFF(xml1, xml2[, hashlevel, flags])
Возвращает Xdiffдокумент, описывающий различия между xml1 и xml2. До
полнительную информацию об XMLзапросах см. в документе Oracle SQL
Reference.
XMLELEMENT([NAME] name[, XMLATTRIBUTES(expr [AS alias][, ...])][,
value[, ...]])
Возвращает элемент XMLELEMENT, имя которого задано параметром
name, а атрибуты – в необязательной фразе XMLATTRIBUTES. В парамет
рах value задаются значения результирующего элемента. Дополнительную
информацию об XMLзапросах см. в документе Oracle SQL Reference.
XMLEXISTS(xquery[, passing_clause])
Возвращает TRUE, если XQueryзапрос xquery возвращает непустой резуль
тат, и FALSE – в противном случае. Дополнительную информацию об XML
запросах см. в документе Oracle SQL Reference.
XMLFOREST(value [AS alias][, ...])
Возвращает фрагмент XML, составленный из значений, переданных в списке
параметров value. Необязательная фраза AS позволяет изменить имя объем
лющего тега. Дополнительную информацию об XMLзапросах см. в докумен
те Oracle SQL Reference.
596 Глава 4. Функции SQL
ABSTIME(timestamp)
Преобразует временную метку timestamp к типу ABSTIME. Эта функция со
хранена только ради обратной совместимости и может быть исключена в бу
дущих версиях. Например:
SELECT ABSTIME(CURRENT_TIMESTAMP) > 2003 06 24 00:19:17 07
ACOS(number)
Возвращает арккосинус числа number, находящегося в диапазоне от –1 до 1.
Результат принимает значения от 0 до π и выражен в радианах. Например:
SELECT ACOS( 0 ) > 1.570796
AGE(timestamp)
То же самое, что AGE(CURRENT_DATE, timestamp).
AGE(timestamp, timestamp)
Возвращает интервал времени между двумя временными метками. Например:
SELECT AGE( '2003 12 31', CURRENT_TIMESTAMP )
6 mons 7 days 00:34:41.658325
AREA(object)
Возвращает площадь геометрического объекта. Например:
SELECT AREA( BOX '((0,0),(1,1))' ) > 1
ARRAY_APPEND(array, element)
Возвращает результат добавления элемента element в массив array. Например:
SELECT ARRAY_APPEND(ARRAY[1,2], 3) > {1,2,3}
ARRAY_CAT(array1, array2)
Возвращает результат добавления массива array2 в конец массива array1. На
пример:
SELECT ARRAY_CAT(ARRAY[1,2], ARRAY[3,4]) > {1,2,3,4}
ARRAY_DIMS(array)
Возвращает размерности массива array. Например:
SELECT ARRAY_DIMS(ARRAY[1,2]) > '[1:2]'
ARRAY_LOWER(array, i)
Возвращает нижнюю границу размерности i массива array. Например:
SELECT ARRAY_LOWER(ARRAY[1,2], 1) > 1
ARRAY_PREPEND(i, array)
Возвращает результат добавления элемента i в начало массива array. Напри
мер:
SELECT ARRAY_PREPEND(0, ARRAY[1,2]) > {0,1,2}
598 Глава 4. Функции SQL
ARRAY_TO_STRING(array, delimiter)
Возвращает строку, полученную путем конкатенации всех элементов масси
ва array. Параметр delimiter задает разделитель элементов. Например:
SELECT ARRAY_TO_STRING(ARRAY[1,2,3], ';') > '1;2;3'
ARRAY_UPPER(array, i)
Возвращает верхнюю границу размерности i массива array. Например:
SELECT ARRAY_UPPER(ARRAY[1,2], 1) > 2
ASCII(text)
Возвращает ASCIIкод первого символа строки text. Например:
SELECT ASCII('x') > 120
ASIN(number)
Возвращает арксинус числа number, находящегося в диапазоне от –1 до 1. Ре
зультат принимает значения от –π/2 до π/2 и выражен в радианах. Например:
SELECT ASIN( 0 ) > 0.000000
ATAN(number)
Возвращает арктангенс произвольного числа number. Результат принимает
значения от –π/2 до π/2 и выражен в радианах. Например:
SELECT ATAN( 3.1415 ) > 1.262619
ATAN2(float1, float2)
Возвращает арктангенс числа. Функция ATAN2(x, y) аналогична ATAN(y/x)
с тем отличием, что для определения квадранта, в котором находится резуль
тат, используются знаки аргументов x и y. Например:
SELECT ATAN2( 3.1415926, 0 ) > 1.5707963267949
BIT_AND(expression)
BIT_OR(expression)
Возвращает результат применения поразрядной операции И или ИЛИ ко
всем отличным от NULL значениям выражения expression. Например:
SELECT BIT_AND( column1 ) FROM table
0
BOOL_AND(expression)
BOOL_OR(expression)
Возвращает результат применения логической операции И или ИЛИ ко всем
отличным от NULL значениям выражения expression. Например:
SELECT BOOL_OR( column1 ) FROM table
true
BOX(box, box)
Возвращает прямоугольник BOX, являющийся пересечением двух прямо
угольников. Если прямоугольники не пересекаются, функция возвращает
NULL. Например:
Платформо5зависимые расширения 599
CIRCLE(point, float8)
Возвращает окружность CIRCLE с центром в точке point и радиусом float8.
Например:
SELECT CIRCLE(POINT '(0,0)', 2.0) > <(0,0),2>
CLOCK_TIMESTAMP( )
Возвращает текущую дату и время, которые могут измениться в процессе вы
полнения одной команды SQL.
COALESCE(list)
Возвращает первый отличный от NULL элемент списка list. Например:
SELECT COALESCE(NULL,1,2,3,NULL) > 1
COS(number)
Возвращает косинус числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT COS(0) > 1.000000
COT(number)
Возвращает котангенс числа number, представляющего собой угол, выражен
ный в радианах. Например:
SELECT COT( 3.1415 ) > 10792.88993953
CURRVAL(s)
Возвращает текущее значение последовательности с именем s. Например:
SELECT CURRVAL( 'myseq' ) > 99
DATE_PART(text, value)
То же самое, что EXTRACT(text, value); дополнительную информацию см.
в описании функции EXTRACT в разделе «Скалярные функции ANSI SQL»
выше.
DATE_TRUNC(precision, timestamp)
Усекает временную метку timestamp до указанной точности precision. Напри
мер:
SELECT DATE_TRUNC('hour', TIMESTAMP '2003 04 15 23:58:30')
2003 04 15 23:00:00
DECODE(s, type)
Декодирует закодированную строку s. Параметр type может принимать зна
чения ‘base64’, ‘hex’ или ‘escape’. Например:
SELECT DECODE( ENCODE('darjeeling', 'base64'), 'base64' ) > 'darjeeling'
DEGREES(float8)
Переводит радианы в градусы. Например:
SELECT DEGREES( 3.1415926 ) > 179.999996929531
Платформо5зависимые расширения 601
DIAMETER(circle)
Возвращает диаметр окружности circle. Например:
SELECT DIAMETER(CIRCLE(POINT '(0,0)', 2.0)) > 4
ENCODE(s, type)
Кодирует строку s. Параметр type может принимать значения ‘base64’, ‘hex’
или ‘escape’. Например:
SELECT DECODE( ENCODE('darjeeling', 'base64'), 'base64' ) > 'darjeeling'
EVERY(expression)
Синоним BOOL_AND(expression).
FLOAT(int)
Преобразует целое число int в число с плавающей точкой.
FLOAT4(int)
Преобразует целое число int в число с плавающей точкой.
HEIGHT(box)
Возвращает длину вертикальной стороны прямоугольника box. Например:
SELECT HEIGHT(BOX '((0,0),(1,1))') > 1
HOST(inet)
Возвращает адрес хоста в виде текста. Например:
SELECT HOST('192.168.1.5/24') > '192.168.1.5'
INITCAP(text)
Переводит первую букву каждого слова в верхний регистр. Например:
SELECT INITCAP( 'my name is inigo montoya.' )
'My Name Is Inigo Montoya.'
INTEGER(float)
Преобразует число с плавающей точкой в целое.
INTERVAL(reltime)
Преобразует относительное время reltime в тип INTERVAL.
ISCLOSED(path)
Возвращает 't', если путь path замкнут, иначе 'f'. Например:
SELECT ISCLOSED(PATH '((0,0),(1,1),(2,0))') > 't'
SELECT ISCLOSED(PATH '[(0,0),(1,1),(2,0)]') > 'f'
ISFINITE(interval)
Возвращает 'f', если интервал interval открыт, иначе 't'. Например:
SELECT ISFINITE(INTERVAL '4 hours') > 't'
602 Глава 4. Функции SQL
ISFINITE(timestamp)
Возвращает 'f', если временная метка timestamp некорректна или представля
ет бесконечность, иначе 't'. Например:
SELECT ISFINITE(TIMESTAMP '2001 02 16 21:28:30') > 't'
ISOPEN(path)
Возвращает 't', если путь path не замкнут, иначе 'f'. Например:
SELECT ISOPEN(PATH '((0,0),(1,1),(2,0))') > 'f'
SELECT ISOPEN(PATH '[(0,0),(1,1),(2,0)]') > 't'
JUSTIFY_DAYS(interval)
Позволяет исключить переполнение количества дней (переполнение дней
происходит, если их количество больше 30). В примере функция обрабатыва
ет «нетипичную» ситуацию с количеством дней и преобразует представление
к нормализованному виду: количество дней не более 30. Например:
select justify_days(interval ' 1 year 9 months 61 days 25 hours ') > 1 year 11 mons
1 day 25:00:00
JUSTIFY_HOURS(interval)
Работает аналогично JUSTIFY_DAYS, но нормализует часы, а не дни. При
этом ненормализованные дни не затрагиваются. Например:
SELECT JUSTIFY_HOURS(INTERVAL ' 1 year 9 months 61 days 25 hours') > 1 year 9 mons
62 days 01:00:00
JUSTIFY_INTERVAL(interval)
Совмещает в себе возможности функций JUSTIFY_DAYS и JUSTIFY_HO0
URS, т. е. нормализует как дни, так и часы. Например:
SELECT JUSTIFY_INTERVAL (INTERVAL ' 1 year 9 months 61 days 25 hours') > 1 year 11
mons 2 days 01:00:00
LENGTH(object)
Возвращает длину объекта. Например:
SELECT LENGTH('Howdy!') > 6
SELECT LENGTH(PATH '(( 1,0),(1,0))') > 4
LOG(float8[, b])
Возвращает логарифм числа float8 по основанию b. Если параметр b не задан,
возвращает десятичный логарифм. Например:
SELECT LOG( 100 ) > 2
LPAD(exp1, int, exp2)
Возвращает строку exp1, дополненную слева строкой exp2 до длины int. На
пример:
SELECT LPAD('Duck', 10, 's') > 'ssssssDuck'
Платформо5зависимые расширения 603
LSEG(box)
Возвращает диагональ прямоугольника box в виде отрезка прямой. Например:
SELECT LSEG(BOX '(( 1,0),(1,0))') > [(1,0),( 1,0)]
LSEG(point, point)
Возвращает отрезок прямой с концами в указанных точках. Например:
SELECT LSEG(POINT '( 1,0)', POINT '(1,0)') > [( 1,0),(1,0)]
LTRIM(text)
Возвращает строку text, из которой удалены начальные пробелы. Например:
SELECT LTRIM(' Howdy! ') > 'Howdy! '
MASKLEN(cidr)
Возвращает длину сетевой маски cidr. Например:
SELECT MASKLEN('192.168.1.5/24') > 24
MD5(s)
Возвращает MD5свертку s.
NETMASK(inet)
Возвращает сетевую маску для IPадреса inet. Например:
SELECT NETMASK('192.168.1.5/24') > '255.255.255.0'
NETWORK(inet)
Возвращает сетевую часть IPадреса inet. Например:
SELECT NETWORK('192.168.1.5/24') > '192.168.1.0/24'
NEXTVAL(s)
Возвращает следующее число в последовательности с именем s. Например:
SELECT NEXTVAL('myseq') > 100
NPOINTS(object)
Возвращает количество точек в описании объекта object. Например:
SELECT NPOINTS(POLYGON '((1,1),(0,0))') > 2
NULLIF(input, value)
Возвращает NULL, если input = value, в противном случае input. Например:
SELECT NULLIF( 5, 6 ), NULLIF( 5, 5 )
5 NULL
PATH(polygon)
Преобразует многоугольник polygon в путь. Например:
SELECT PATH( '((0,0),(1,1),(2,0))' )
((0,0),(1,1),(2,0))
604 Глава 4. Функции SQL
PCLOSE(path)
Преобразует путь path в замкнутый путь. Например:
SELECT PCLOSE(PATH '[(0,0),(1,1),(2,0)]')
((0,0),(1,1),(2,0))
PI( )
Возвращает значение числа π.
POINT(circle)
Возвращает центр окружности circle. Например:
SELECT POINT( CIRCLE '((0,0), 2.0)' ) > (0,0)
POINT(lseg1, lseg2)
Возвращает точку пересечения двух отрезков прямой. Например:
SELECT POINT(LSEG '(( 1,0),(1,0))', LSEG '(( 2, 2),(2,2))')
(0,0)
POINT(polygon)
Возвращает центр многоугольника polygon. Например:
SELECT POINT(POLYGON '((0,0),(1,1),(2,0))')
(1,0.333333333333333)
POLYGON(path)
Преобразует путь path в многоугольник. Например:
SELECT POLYGON(PATH '((0,0),(1,1),(2,0))')
((0,0),(1,1),(2,0))
POLYGON(box)
Преобразует прямоугольник box в многоугольник. Например:
SELECT POLYGON(BOX '((0,0),(1,1))')
((0,0),(0,1),(1,1),(1,0))
POLYGON(circle)
Синоним POLYGON(12, circle).
POLYGON(npts, circle)
Возвращает аппроксимацию окружности circle многоугольником с npts вер
шинами. Например:
SELECT POLYGON(6, CIRCLE '((0,0),2.0)')
(( 2,0),
( 0.999999999994107,1.73205080757228),
(1.00000000001179,1.73205080756207),
(2, 2.04136478690279e 11),
(0.999999999976428, 1.73205080758249),
( 1.00000000002946, 1.73205080755187))
POPEN(path)
Преобразует путь path в открытый путь. Например:
Платформо5зависимые расширения 605
SETSEED(i)
Инициализирует генератор случайных чисел числом i.
SETVAL(s, i)
Устанавливает следующее число в последовательности с именем s равным i.
Например:
SETVAL('myseq', 0)
SIGN(number)
Возвращает знак числа number. Например:
SELECT SIGN( 69 ), SIGN(69)
1,1
SIN(number)
Возвращает синус числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT SIN( 0 ) > 0.000000
STATEMENT_TIMESTAMP( )
Возвращает дату и время начала выполнения SQLкоманды.
STRING_TO_ ARRAY(str1, delimiter)
Разбивает строку str1 по разделителю delimiter и возвращает массив, состав
ленный из образовавшихся подстрок. Например:
SELECT STRING_TO_ARRAY('1;2;3', ';') > {1,2,3}
SUBSTRING(string [FROM start] [FOR bytes]), SUBSTR(string, start[, bytes])
Возвращает подстроку строки string длиной bytes байтов, начинающуюся
в позиции start. Если параметр bytes опущен, то подстрока продолжается до
конца строки. Например:
SELECT SUBSTRING( 'Inigo Montoya' FROM 7 FOR 4 ) > 'Mont'
TAN(number)
Возвращает тангенс числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT TAN( 3.1415 ) > 0.000093
TEXT(char)
Преобразует char к типу TEXT.
TIMEOFDAY( )
Возвращает текущую временную метку (полученную с помощью функции
CLOCK_TIMESTAMP) в виде строки.
TIMESTAMP(date[, time])
Преобразует дату во временную метку.
608 Глава 4. Функции SQL
TO_CHAR(expression, text)
Преобразует выражение expression в строку. Например:
SELECT TO_CHAR(NUMERIC ' 125.8', '999D99S') > 125.80
SELECT TO_CHAR (interval '15h 2m 12s','HH24:MI:SS') > 15:02:12
TO_DATE(string, format)
Преобразует строку string в дату. Второй аргумент определяет формат вход
ной строки. Например:
SELECT TO_DATE('05 Dec 2000', 'DD Mon YYYY') > 2000 12 05
В табл. 4.12 перечислены допустимые спецификаторы формата.
Таблица 4.12. Спецификаторы формата в PostgreSQL
Спецификатор Назначение
формата
AD или A.D. Индикатор новой эры
AM или A.M. Индикатор полудня
BC или B.C. Индикатор старой эры (до Рождества Христова)
CC Год, записанный двумя цифрами
D День недели (1–7)
DAY Полное название дня недели, записанное заглавными буквами
Day Полное название дня недели с заглавной буквы
day Полное название дня недели, записанное строчными буквами
DD День месяца (01–31)
DDD Порядковый номер дня в году (001–366)
DY Сокращенное название дня с заглавной буквы
Dy Сокращенное название дня, записанное заглавными буквами
dy Сокращенное название дня, записанное строчными буквами
HH или HH12 Час (01–12)
HH24 Час (0–23)
I Последние цифры года согласно стандарту ISO
IW Порядковый номер недели в году согласно стандарту ISO
IY, IYY, IYYY Последние две, три или все четыре цифры года согласно стандар
ту ISO
J Юлианский день; количество дней, прошедших с 1 января 4713 го
да до н.э.
MI Минута (00–59)
MM Месяц (01–12)
MON Сокращенное название месяца, записанное заглавными буквами
Платформо5зависимые расширения 609
Спецификатор Назначение
формата
Mon Сокращенное название месяца с заглавной буквы
mon Сокращенное название месяца, записанное строчными буквами
MONTH Полное название месяца, записанное заглавными буквами
Month Полное название месяца с заглавной буквы
month Полное название месяца, записанное строчными буквами
MS Миллисекунды (0–999)
PM или P.M. Индикатор полудня
Q Квартал года
RM Номер месяца, записанный римскими цифрами (I–XII)
rm Номер месяца, записанный римскими цифрами (I–xii)
SS Секунда (00–59)
SSSS Количество секунд, прошедших с полуночи (0–86399)
SYYY Год, записанный четырьмя цифрами; годам до нашей эры пред
шествует знак минус
TS Время в коротком формате
TZ Название часового пояса, записанное заглавными буквами
tz Название часового пояса, записанное строчными буквами
US Микросекунды (000000–999999)
W Неделя месяца (1–5)
WW Неделя года (1–53)
Y, YY, YYY Год, записанный одной, двумя, тремя или четырьмя цифрами
или YYYY
Y,YYY Год, в записи которого присутствует запятая
TO_NUMBER(string, format)
Преобразует строку string в числовое значение. Второй аргумент задает фор
мат входной строки. Например:
SELECT TO_NUMBER('12,454.8 ', '99G999D9S') > 12454.8
TO_TIMESTAMP(text, format)
Преобразует строку text во временную метку. Второй аргумент задает формат
входной строки. (О допустимых спецификаторах формата см. описание функ
ции TO_DATE.) Например:
SELECT TO_TIMESTAMP('05 Dec 2000', 'DD Mon YYYY') >
2000 12 05 00:00:00 08
610 Глава 4. Функции SQL
TRANSACTION_TIMESTAMP( )
Возвращает дату и время начала выполнения текущей транзакции.
TRANSLATE(text, from, to)
Преобразует символы текста text, которые встречаются в строке from, в соот
ветствующие символы из строки to. Например:
SELECT TRANSLATE('foo', 'fo', 'ab') > 'abb'
TRUNC(float8)
Отбрасывает все знаки после запятой. Например:
SELECT TRUNC( PI( ) ) > 3
VARCHAR(string)
Преобразует строку string в тип VARCHAR.
WIDTH(box)
Возвращает ширину прямоугольника box. Например:
SELECT WIDTH( BOX '((0,0),(3,1))' ) > 3
ATN2(float1, float2)
Возвращает угол (в радианах), тангенс которого равен float1/float2. Например:
SELECT ATN2( 35.175643, 129.44 ) > 0.265345
BINARY_CHECKSUM(* | expression[, ...n])
Возвращает двоичное значение контрольной суммы, вычисленное для списка
выражений или строки таблицы. В следующем примере возвращается список
идентификаторов пользователей, для которых сохраненная контрольная сум
ма пароля не совпадает с текущей:
SELECT userid AS 'Changed' FROM users
WHERE NOT password_chksum = BINARY_CHECKSUM( password )
CHAR(integer_expression)
Преобразует ASCIIкод в символ. Например:
SELECT CHAR( 78 ) > 'N'
CHARINDEX(substring, string[, start_location])
Возвращает начальную позицию первого вхождения подстроки substring
в строку string. Если задан необязательный аргумент start_location, то поиск
начинается с указанной в нем позиции. Например:
SELECT CHARINDEX( 'he', 'Howdy, there!' ) > 9
CHECKSUM(* | expression[, ...n])
Возвращает значение контрольной суммы, вычисленное для строки таблицы
или списка выражений. В следующем примере возвращается список иденти
фикаторов пользователей, для которых сохраненная контрольная сумма па
роля не совпадает с текущей:
SELECT userid AS 'Changed' FROM users
WHERE NOT password_chksum = CHECKSUM( password )
CHECKSUM_AGG([ALL | DISTINCT] expression)
Возвращает контрольную сумму значений в группе. Например:
SELECT CHECKSUM_AGG( BINARY_CHECKSUM(*) ) FROM authors > 67
COALESCE(expression[, ...n])
Возвращает первое отличное от NULL выражение в списке аргументов. На
пример:
SELECT COALESCE( NULL, 1, 3, 5, 7 ) > 1
COL_LENGTH(table, column)
Возвращает длину столбца column в байтах. Например:
SELECT COL_LENGTH('authors', 'au_fname') > 50
COL_NAME(table_id, column_id)
Возвращает имя столбца по идентификатору содержащей его таблицы
table_id и идентификатору самого столбца column_id. Например:
SELECT COL_NAME( OBJECT_ID('authors'), 1 )
612 Глава 4. Функции SQL
DATABASEPROPERTYEX(database, property)
Возвращает текущее значение заданного параметра или свойства базы дан
ных. Например:
SELECT DATABASEPROPERTYEX('pubs', 'Version') > 539
DATALENGTH(expression)
Возвращает количество байтов в символьной или двоичной строке. Напри
мер:
SELECT MAX( DATALENGTH( au_fname ) ) FROM authors > 11
DATEADD(datepart, number, date)
Прибавляет к дате date number единицы времени datepart (например, дней).
Например:
SELECT DATEADD( Year, 10, CURRENT_TIMESTAMP ) > 2013 06 29 19:47:15.270
DATEDIFF(datepart, startdate, enddate)
Вычисляет разность между двумя выражениями типа DATETIME, выражен
ную в единицах времени datepart. Например:
SELECT DATEDIFF( Day, CURRENT_TIMESTAMP,
DATEADD( Year, 1, CURRENT_TIMESTAMP ))
366
DATENAME(datepart, date)
Возвращает название единицы времени datepart (например, месяца) для даты
date. Например:
SELECT DATENAME(month, GETDATE( )) > 'June'
DATEPART(datepart, date)
Возвращает значение единицы времени datepart (например, года) для даты
date. Например:
SELECT DATEPART(year, GETDATE( )) > 2003
DAY(date)
Возвращает целое число, представляющее день указанной даты date. Напри
мер:
SELECT DAY('04/15/2004') > 15
DB_ID([database_name])
Возвращает идентификатор базы данных с именем database_name. Например:
SELECT DB_ID( ) > 5
DB_NAME(database_id)
Возвращает имя базы данных с идентификатором database_id. Например:
SELECT DB_NAME( 5 ) > 'pubs'
614 Глава 4. Функции SQL
DEGREES(numeric_expression)
Преобразует радианы в градусы. Например:
SELECT DEGREES( PI( ) ) > 180
DIFFERENCE(character_expression, character_expression)
Возвращает разницу между значениями SOUNDEX двух символьных выра
жений. Результатом является целое цисло от 0 до 4; чем оно больше, тем луч
ше фонетическое сходство. Например:
SELECT DIFFERENCE( 'moe', 'low' ) > 3
FILE_ID(file_name)
Возвращает идентификатор файла с логическим именем file_name. Например:
SELECT FILE_ID( 'master' ) > 1
FILE_NAME(file_id)
Возвращает логическое имя файла с идентификатором file_id. Например:
SELECT FILE_NAME( 1 ) > 'master'
FILEGROUP_ID(filegroup_name)
Возвращает идентификатор группы файлов с логическим именем filegroup_
name. Например:
SELECT FILEGROUP_ID( 'PRIMARY' ) > 1
FILEGROUP_NAME(filegroup_id)
Возвращает логическое имя группы файлов с идентификатором filegroup_id.
Например:
SELECT FILEGROUP_NAME( 1 ) > 'PRIMARY'
FILEGROUPPROPERTY(filegroup_name, property)
Возвращает значение свойства property указанной группы файлов. Например:
SELECT FILEGROUPPROPERTY( 'PRIMARY', 'IsReadOnly' ) > 0
FILEPROPERTY(file, property)
Возвращает значение свойства property указанного файла. Например:
SELECT FILEPROPERTY( 'pubs', 'SpaceUsed' ) > 160
FORMATMESSAGE(msg_number, param_value[, ... n])
Конструирует сообщение на основе сообщения, уже имеющегося в таблице
SYS.MESSAGES (аналогично RAISEERROR). Например:
sp_addmessage 50001, 1, 'Table %s has %s rows.'
SELECT FORMATMESSAGE(50001, 'AUTHORS', (SELECT COUNT(*) FROM AUTHORS) )
'Table AUTHORS has 23 rows.'
FREETEXT({column | *}, freetext_string)
Применяется для полнотекстового поиска. Возвращает строки, для которых
значение в столбце column соответствует строке freetext_string по смыслу, но
не обязательно дословно.
Платформо5зависимые расширения 615
NULL NULL 0
10 57000.0000 0
12 2275.0000 0
14 4000.0000 0
16 7000.0000 0
24 25125.0000 0
NULL 95400.0000 1
616 Глава 4. Функции SQL
HOST_ID( )
Возвращает идентификатор рабочей станции. Например:
SELECT HOST_ID( ) > 216
HOST_NAME( )
Возвращает имя рабочей станции. Например:
SELECT HOST_NAME( ) > 'PLATO'
IDENT_CURRENT(table_name)
Возвращает последнее значение в столбце идентификаторов, сгенерирован
ное для указанной таблицы. Например:
SELECT IDENT_CURRENT('jobs') > 876
IDENT_INCR(table_or_view)
Возвращает значение приращения для столбца идентификаторов. Например:
SELECT IDENT_INCR('jobs') > 1
IDENT_SEED(table_or_view)
Возвращает начальное значение для столбца идентификаторов. Например:
SELECT IDENT_SEED('jobs') > 1
IDENTITY(data_type[, seed, increment]) AS column_name
Используется только в команде SELECT INTO для вставки столбца иденти
фикаторов в новую таблицу. Например:
SELECT IDENTITY(int, 1,1) AS IDINTO NewTableFROM OldTable
INDEX_COL(table, index_id, key_id)
Возвращает имя индексированного столбца, зная имя таблицы, идентифика
тор индекса и порядковый номер ключевого столбца индекса. Например:
SELECT INDEX_COL(OBJECT_ID('authors'), 1, 1) > NULL
INDEXPROPERTY(table_id, index, property)
Возвращает указанное свойство индекса (например, FILLFACTOR). Например:
SELECT INDEXPROPERTY(OBJECT_ID('authors'), 'UPKCL_auidind', 'IsPadIndex')
0
IS_MEMBER({group | role})
Возвращает true или false (1 или 0) в зависимости от того, является пользова
тель членом указанной группы group Windows NT или роли role базы данных
SQL Server. Например:
SELECT IS_MEMBER( 'db_owner' ) > 0
IS_SRVROLEMEMBER(role[, login])
Возвращает true или false (1 или 0) в зависимости от того, является пользова
тель членом указанной роли role сервера. Например:
SELECT IS_SRVROLEMEMBER( 'sysadmin' ) > 0
Платформо5зависимые расширения 617
ISDATE(expression)
Проверяет, можно ли преобразовать указанную символьную строку в тип
DATETIME. Например:
SELECT ISDATE(NULL), ISDATE(GETDATE( ))
0 1
ISNULL(check_expression, replacement_value)
Возвращает первый аргумент, если он отличен от NULL, иначе второй аргу
мент. Например:
SELECT ISNULL( NULL, 'NULL' ) > 'NULL'
ISNUMERIC(expression)
Проверяет, можно ли преобразовать указанную символьную строку в тип NU0
MERIC. Например:
SELECT ISNUMERIC('3.1415'), ISNUMERIC('IRK')
1 0
LEFT(character_expression, integer_expression)
Возвращает первые слева integer_expression символов символьного выраже
ния character_expression. Например:
SELECT LEFT( 'Wet Paint', 3 ) > 'Wet'
LEN(string_expression)
Возвращает количество символов в указанном строковом выражении. На
пример:
SELECT LEN( 'Wet Paint' ) > 9
LOG(float_expression)
Возвращает натуральный логарифм. Например:
SELECT LOG( PI( ) ) > 1.1447298858494002
LOG10(float_expression)
Возвращает десятичный логарифм. Например:
SELECT LOG10( PI( ) ) > 0.49714987269413385
LTRIM(character_expression)
Удаляет начальные пробелы. Например:
SELECT LTRIM(' beaucoup ') > 'beaucoup '
MONTH(date)
Возвращает целое число, представляющее месяц указанной даты date. Напри
мер:
SELECT MONTH( GETDATE( ) ) > 6
618 Глава 4. Функции SQL
NCHAR(integer_expression)
Возвращает символ UNICODE с указанным целочисленным кодом. Напри
мер:
SELECT NCHAR(120) > 'x'
NEWID( )
Генерирует новый уникальный идентификатор типа UNIQUEIDENTIFIER.
Например:
SELECT NEWID( ) > '32B35185 F55E 4FE0 B2C8 B57B35815C12'
NULLIF(expression, expression)
Возвращает NULL, если оба указанных выражения равны. Например:
SELECT NULLIF( 5, 5 ) > NULL
OBJECT_ID(object)
Возвращает идентификатор объекта object. Например:
SELECT OBJECT_ID('authors') > 8
OBJECT_NAME(object_id)
Возвращает имя объекта с указанным идентификатором. Например:
SELECT OBJECT_NAME ( OBJECT_ID('authors') ) > 'authors'
OBJECTPROPERTY(id, property)
Возвращает свойства объектов в текущей базе данных. Например:
SELECT OBJECTPROPERTY ( object_id('authors'),'ISTABLE') > 1
OPEN {{[GLOBAL] cursor_name} | cursor_variable_name}
Открывает локальный или глобальный курсор.
OPENDATASOURCE(provider_name, init_string)
Открывает соединение с источником данных, не используя имя связанного
сервера (linked server). Примеры см. в разделе «Загрузчики» руководства
пользователя по SQL Server.
OPENQUERY(linked_server, query)
Передает указанный запрос источнику данных, который ранее был сконфи
гурирован как связанный сервер. Примеры см. в разделе «Загрузчики» руко
водства пользователя по SQL Server.
OPENROWSET(provider_name, {datasource, user_id, password | provider_string},
{[catalog.][schema.]object | query})
Передает указанный запрос источнику данных, не требуя, чтобы он был
сконфигурирован как связанный сервер.
PARSENAME(object_name, object_piece)
Возвращает указанную информацию об объекте: имя объекта (1), имя вла
дельца (2), имя базы данных (3) и имя сервера (4). Параметр object_piece дол
жен быть целым числом от 1 до 4. Например:
Платформо5зависимые расширения 619
STDEVP(expression)
Возвращает стандартное отклонение генеральной совокупности всех значе
ний в указанном выражении. Например:
SELECT STDEVP( qty ) FROM sales > 16.013741264834152
STR(number[, length[, decimal]])
Преобразует число number в символьную строку длины length с decimal знака
ми после запятой.
STUFF(string1, start, length, string2)
Удаляет length символов в строке string1, начиная с позиции start, и вставля
ет вместо них строку string2. Например:
SELECT STUFF( 'Donald Duck', 8, 4, 'Trump' ) > 'Donald Trump'
SUBSTRING(string, start, length)
Возвращает length символов строки string1, начиная с позиции start. Напри
мер:
SELECT SUBSTRING( 'Donald Duck', 8, 4 ) > 'Duck'
SUSER_ID([login])
Возвращает системный идентификатор пользователя (ID) с заданным име
нем. Начиная с версии SQL Server 2000, эта функция всегда возвращает
NULL, поэтому старайтесь ею не пользоваться.
SUSER_SID([login])
Возвращает системный идентификатор безопасности (SID) текущего пользо
вателя или пользователя с заданным именем. SID возвращается в двоичном
формате. Например:
SELECT SUSER_SID('montoyai')
0x68FC17A71010DE40B005BCF2E443B377
SUSER_SNAME([server_user_sid])
Возвращает имя текущего пользователя или пользователя с заданным иден
тификатором безопасности SID. Например:
SELECT SUSER_SNAME( ) > 'montoyai'
TAN(number)
Возвращает тангенс числа number, представляющего собой угол, выраженный
в радианах. Например:
SELECT TAN( 3.1415 ) > 0.000093
TEXTPTR(column)
Возвращает указатель на столбец типа TEXT, NTEXT или IMAGE в формате
VARBINARY. Например:
SELECT TEXTPTR(pr_info)FROM pub_info WHERE pub_id ='0736'
0xFEFF6F00000000005C00000001000100
622 Глава 4. Функции SQL
TEXTVALID(table.column, text_ptr)
Возвращает true или false (1 или 0) в зависимости от того, действителен ли
указатель на столбец типа TEXT, NTEXT или IMAGE. Например:
SELECT pub_id, 'Valid (if 1) Text data'
= TEXTVALID('pub_info.logo', TEXTPTR(logo)) FROM pub_info ORDER BY pub_id
0736 1
0877 1
1389 1
1622 1
1756 1
9901 1
9952 1
9999 1
TYPEPROPERTY(datatype, property)
Возвращает информацию о свойствах указанного типа данных. Параметр
datatype может содержать имя произвольного типа данных, а параметр pro
perty может принимать следующие значения:
Precision
Точность datatype, то есть количество цифр или символов, которое этот
тип способен хранить.
Scale
Масштаб datatype, то есть количество десятичных знаков для числового
типа данных. Если datatype не числовой тип, возвращается NULL.
Например:
SELECT TYPEPROPERTY('decimal', 'PRECISION') > 38
UNICODE(ncharacter_expression)
Возвращает кодовую позицию UNICODE для первого символа указанного
выражения. Например:
SELECT UNICODE('Hello!') > 72
USER_ID([user])
Возвращает идентификатор (ID) пользователя user в текущей базе данных.
Если параметр user опущен, то возвращает идентификатор текущего пользо
вателя. Например:
SELECT USER_ID( ) > 2
USER_NAME([id])
Возвращает имя пользователя с идентификатором id. Если параметр id опу
щен, то возвращает имя текущего пользователя. Например:
SELECT USER_NAME( ) > 'montoyai'
VAR(expression)
Возвращает дисперсию всех значений в указанном выражении. Например:
SELECT VAR(qty) FROM sales > 269.26190476190476
Платформо5зависимые расширения 623
VARP(expression)
Возвращает дисперсию генеральной совокупности всех значений в указанном
выражении. VARP – агрегатная функция. Например:
SELECT VARP(qty) FROM sales > 256.43990929705217
YEAR(date)
Возвращает целое число, представляющее год указанной даты date. Напри
мер:
SELECT YEAR( CURRENT_TIMESTAMP ) > 2003
A
Ключевые слова:
общие и платформозависимые
Т
таблицы, 16, 17
теория множеств, 22
типы данных, 44
MySQL, 50
Oracle, 55
PostgreSQL, 58
SQL Server, 62
SQL2003, 45
сравнение поддержки платформами,
46
транзакциями управления операторы,
28
триггер, 227
тэтасоединение, 23
У
умножение, арифметический оператор
(*), 39
унарные операторы, 40
уникальный ключ, 72
управления выполнением операторы, 28
уровни соответствия стандарту, 25
Ф
Функции
агрегатные, 502
детерминированные, 501
недетерминированные, 501
оконные, 502, 520
поддерживаемые MySQL, 551
поддерживаемые Oracle, 570
поддерживаемые PostgreSQL, 596
поддерживаемые SQL Server, 610
скалярные, 502, 528
Ч
числовые литералы, 37
числовые типы данных, 46
числовые функции, 25
Э
экземпляр, 31
Я
явные транзакции, 87
По договору между издательством «СимволПлюс» и Интернетмага
зином «Books.Ru – Книги России» единственный легальный способ
получения данного файла с книгой ISBN 9785932861653, назва
ние «SQL. Справочник, 3е издание» – покупка в Интернетмагазине
«Books.Ru – Книги России». Если Вы получили данный файл каким
либо другим образом, Вы нарушили международное законодатель
ство и законодательство Российской Федерации об охране авторско
го права. Вам необходимо удалить данный файл, а также сообщить
издательству «СимволПлюс» ([email protected]), где именно Вы по
лучили данный файл.