Вы находитесь на странице: 1из 281

Освой самостояте11ьно

SQL
за 10 минут

4-еиздание

Бен Форта


Москва + Санкт-Петербург + Киев
2014
ББК 32.973.26-018.2.75
Ф80
УДК 681.3.07
Издательский дом "Вильяме"
Главный редактор С.Н. Тригуб
Перевод с английского и редакция В.Р. Гинзбурга

По общим вопросам обращайтесь


в Издательский дом "Вильяме" по адресу:
info@williamspublishing.com, http://www.williamspuЫishing.com

Форта, Бен.
Ф80 SQL за 10 минут, 4-е изд. : Пер. с анг.л. - М. : ООО "И.Д. Вильяме",
2014. - 288 с. : ил. - Парал. тит. анm.
ISBN 978-5-8459-1858-1 (рус.)
ББК 32.973.26-018.2.75

Все названия программных продуктов являются зарегистрированными торговыми мар­


ками соответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в
какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или
механические, включая фотокопирование и запись на магнитный носитель, если на это нет
письменного разрешения издательства Sams PuЬlishing.
Authorized Russian translation of the English edition ofSams Teach YourselfSQL in 10 Minutes, � 2013 Ьу
Pearson Education, lnc. (ISBN 978-0-672-33607-2).
Тhis translation is puЫished and sold Ьу permission of Pearson Education, lnc., which owns or controls all
rights to puЫish and sell the same.
All rights reservcd. No part of this book тау Ье reproduced or transmitted in any form or Ьу any means,
electronic or mecbanical, including photocopying, recording, or Ьу any information storage or retrieval system,
without the prior written permission of the copyright owner and the PuЬlisher.

Научно-популярное издание
Бен Форта

SQL за 10 минут, 4-е издание


Литературный редактор И.А. Попова
Верстка Л.В. Чернокозинская
Художественный редактор Е.П.Дынник
Корректор Л.А. Гордиенко

Подписано в печать 08.11.2013. Формат 84х108/32.


Гарнитура Times. Печать офсетная.
Усл. печ . л. 28,73. Уч.-изд. л. 8,82.
Тираж 2000 экз. Заказ № 1273

Первая Академическая типография "Наука"


199034, Санкт-Петербург, 9-я линия, 12/28

ООО "И. Д. Вильяме", 127055, г. Москва, ул. Лесная, д. 43, стр. 1

ISBN 978-5-8459-1858-1 (рус.) ©Издательский дом "Вильяме", 2014


ISBN 978-0-672-33607-2 (англ.) © Pearson Education, Inc., 2013
Оr11ав11ение

Введение 15
УРОК 1. Основы SQL 19
УРОК 2. Извлечение данных из таблиц 27
УРОК 3. Сортировка полученных данных 39
УРОК 4. Фильтрация данных 47
УРОК 5. Расширенная фильтрация данных 55
УРОК 6. Фильтрация с использованием метасимволов 65
УРОК 7. Создание вычисляемых полей 73
УРОК 8. Использование функций обработки данных 83
УРОК 9. Итоговые вычисления 93
УРОК 10. Группировка данных 105
УРОК 11. Подзапросы 115
УРОК 12. Объединение таблиц 123
УРОК 13. Создание расширенных объединений 135
УРОК 14. Комбинированные запросы 147
УРОК 15. Добавление данных 155
УРОК 16. Обновление и удаление данных 165
УРОК 17. Создание таблиц и работа с ними 173
УРОК 18. Представления 185
УРОК 19. Хранимые процедуры 197
УРОК 20. Обработка транзакций 207
УРОК 21. Курсоры 215
УРОК 22. Расширенные возможности SQL 223
ПРИЛОЖЕНИЕ А. Сценарии демонстрационных таблиц 237
ПРИЛОЖЕНИЕ Б. Работа с популярными программами 245
ПРИЛОЖЕНИЕ В. Синтаксис инструкций SQL 259
ПРИЛОЖЕНИЕ Г. Типы данных в SQL 265
ПРИЛОЖЕНИЕ д. Зарезервированные слова SQL 273
Предметный указатель 277
Содержание

Об авторе 13

Введение 15
Для кого предназначена эта книга 16
СУБД, рассмотренные в книге 16
Условные обозначения 17
Ждем ваших отзывов! 18

Урок 1 . Основы SQL 19


Терминология баз данных 19
Базы данных 20
Таблицы 20
Столбцы и типы данных 21
Строки 23
Первичные ключи 24
Что такое SQL 25
Попробуйте сами 26
Резюме 26

Урок 2. Извлечение данных из таблиц 27


Инструкция SELECT 27
Извлечение отдельных столбцов 28
Извлечение нескольких столбцов 30
Извлечение всех столбцов 31
Извлечение уникальных строк 32
Ограничение результатов запроса 34
Использование комментариев 37
Резюме 38

Урок З. Сортировка полученных данных 39


Сортировка записей 39
Сортировка по нескольким столбцам 41
Сортировка по положению столбца 42
Содержание 7

Указание направления сортировки 43


Резюме 46

Урок 4. Фильтрация данных 47


Использование предложения WHERE 47
Операторы в предложении WHERE 49
Сравнение с одиночным значением 49
Проверка на неравенство 50
Сравнение с диапазоном значений 51
Проверка на отсутствие значения 52
Резюме 54

Урок 5. Расширенная фильтрация данных 55


Комбинирование условий WHERE 55
Оператор AND 55
Оператор OR 57
Порядок обработки операторов 58
Оператор IN 60
Оператор NOT 61
Резюме 63

Урок 6. Фильтрация с использованием метасимволов 65


Использование оператора LIK E 65
Метасимвол "знак процента"(%) 66
Метасимвол "знак подчеркивания" (_) 69
Метасимвол "квадратные скобки" ( [] ) 70
Советы по использованию метасимволов 72
Резюме 72

Урок 7. Создание вычисляемых полей 73


Что такое вычисляемые поля 73
Конкатенация полей 74
Использование псевдонимов 78
Выполнение математических вычислений 80
Резюме 82

Урок 8. Использование функций обработки данных 83


Что такое функция 83
Проблемы с функциями 83
8 Содержание

Применение функций 85
Функции для работы с текстом 85
Функции для работы с датой и временем 88
Функции для работы с числами 91
Резюме 92

Урок 9. Итоговые вычисления 93


Использование итоговых функций 93
Функция AVG () 94
Функция COUNT () 96
Функция МАХ () 97
Функция MIN () 98
Функция SUМ () 99
Итоговые вычисления для уникальных значений 101
Комбинирование итоговых функций 103
Резюме 103

Урок 10. Группировка данных 105


Принципы группировки данных 105
Создание групп 106
Фильтрация по группам 108
Группировка и сортировка 111
Порядок предложений в инструкции SELECT 114
Резюме 114

Урок 11. Подзапросы 115


Что такое подзапросы 115
Фильтрация с помощью подзапросов 115
Использование подзапросов в качестве вычисляемых полей 119
Резюме 122

Урок 12. Объединение таблиц 123


Что такое объединение 123
Что такое реляционные таблицы 1 23
Зачем нужны объединения 125
Создание объединения 126
Важность предложения WHERE 127
Внутренние объединения 130
Объединение нескольких таблиц 13 1
Резюме 134
Содержание 9

Урок 13. Создание расширенных объединений 135


Использование псевдонимов таблиц 135
Объединения других типов 136
Самообъединения 137
Естественные объединения 139
Внешние объединения 1 40
Использование объединений совместно с итоговыми функциями 143
Правила создания объединений 145
Резюме 145

Урок 14. Комбинированные запросы 147


Что такое комбинированные запросы 147
Создание комбинированных запросов 148
Использование оператора UNION 148
Правила применения оператора UNION 151
Включение или исключение повторяющихся строк 151
Сортировка результатов комбинированных запросов 153
Резюме 154

Урок 15. Добавление данных 155


Способы добавления данных 1 55
Добавление полных строк 155
Добавление части строки 159
Добавление результатов запроса 160
Копирование данных из одной таблицы в другую 162
Резюме 164

Урок 16. Обновление и удаление данных 165


Обновление данных 165
Удаление данных 168
Советы по обновлению и удалению данных 170
Резюме 171

Урок 17. Создание таблиц и работа с ними 173


Создание таблиц 1 73
Создание простой таблицы 174
Работа со значениями NULL 1 76
Определение значений по умолчанию 178
Обновление таблиц 179
10 Содержание

Удаление таблиц 182


Переименование таблиц 183
Резюме 183

Урок 18. Представления 185


Что такое представления 185
Зачем нужны представления 186
Правила и ограничения представлений 187
Создание представлений 189
Использование представлений для упрощения
сложных обьединений 189
Использование представлений для
переформатирования извлекаемых данных 191
Использование представлений для фильтрации
нежелательных данных 193
Использование представлений с вычисляемыми полями 194
�ю� 1%

Урок 19. Хранимые процедуры 197


Что такое хранимые процедуры 197
Зачем нужны хранимые процедуры 198
Выполнение хранимых процедур 200
Создание хранимых процедур 201
Резюме 206

Урок 20. Обработка транзакций 207


Что такое транзакции 207
Управление транзакциями 209
Инструкция ROLLBA CK 211
Инструкция СОММIТ 211
Точки сохранения 212
Резюме 214

Урок 21. Курсоры 215


Что такое курсоры 215
Работа с курсорами 217
Создание курсоров 217
Управление курсорами 218
Закрытие курсоров 221
Резюме 221
Содержание 11

Урок 22. Расширенные возможности SQL 223


Что такое ограничения 223
Первичные ключи 224
Внешние ключи 226
Ограничения уникальности 228
Ограничения на значения столбца 229
Что такое индексы 230
Что такое триггеры 233
Безопасность.баз данных 235
Резюме 236

Приложение А. Сценарии демонстрационных таблиц 237


Демонстрационные таблицы 237
Описания таблиц 238
Получение демонстрационных таблиц 242
Загрузка готовых баз данных 242
Загрузка SQL-сценариев для различных СУБД 243

Приложение Б. Работа с популярными программами 245


Apache OpenOffice Base 245
Adobe ColdFusion 246
IВM DB2 246
MariaDB 247
MicrosoftAccess 247
MicrosoftASP 248
MicrosoftASP.NET 249
Microsoft Query 249
Microsoft SQL Server (включая Microsoft SQL Server Express) 250
MySQL 251
Oracle 252
Oracle Express 253
РНР 254
PostgreSQL 254
SQLite 255
Конфигурирование источников данных ODBC 256
12 Содержание

Приложение В. Синтаксис инструкций SQL 259


ALTER TAВLE 259
СОММIТ 260
CREATE INDEX 260
CREATE PROCEDURE 260
CREATE ТАВLЕ 261
CREATEVIEW 261
DELETE 261
DROP 262
INSERT 262
INSERT SELECT 262
ROLLBACK 262
SELECT 263
UPDATE 263

Приложение Г. Типы данных в SQL 265


Строковые типы данных 266
Числовые типы данных 268
Типы данных даты и времени 269
Бинарные типы данных 270

Приложение Д. Зарезервированные слова SQL 273

Предметный указатель 277


Об авторе
Бен Форта - директор департамента разработки в компании
Adobe Systems. За его плечами более 20 лет работы в компьютер­
ной индустрии, включая разработку продуктов, их поддержку и рас­
пространение, а также обучение пользователей. Бен - автор мно­
жества бестселлеров, включая книги по MySQL, ColdFusion, Flash,
Java, Windo ws и другим компьютерным технологиям. Имеет боль­
шой опыт проектирования баз данных, часто читает лекции и пишет
статьи, посвященные технологиям баз данных. Живет в г. Оук-Парк,
штат Мичиган, со своей женой Марси и семью детьми. Можете на­
писать Бену письмо по адресу ben@forta.com или же посетить его
сайт http://forta.com.
Введение
SQL является самым популярным языком баз данных. Не важно,
кто вы - разработчик приложений, администратор баз данных, веб­
дизайнер или пользователь пакета Microsoft Office. Хорошее практи­
ческое знание SQL в любом случае поможет вам взаимодействовать
с базами данных.
Эта книга бьша написана по необходимости. Несколько лет я чи­
тал курс лекций по разработке веб-приложений, и студенты постоян­
но просили порекомендовать им книгу по SQL. Существовало много
книг, посвященных данной теме, и некоторые из них действительно
были очень хороши. Но всем им была присуща одна общая черта:
в них было слишком много информации с точки зрения рядовых
пользователей. Вместо того чтобы фокусироваться непосредственно
на SQL, в большинстве книг излагалось все: от проектирования и
нормализации баз данных до теории реляционных баз данных и во­
просов администрирования. И хотя это очень важные темы, они не
интересны большинству людей, которые просто хотят изучить SQL.
Итак, не найдя ни одной книги, которую я мог бы порекомендо­
вать, я вложил весь опыт преподавания в книгу, которую вы держите
в руках. Она поможет вам быстро освоить SQL. Мы начнем с про­
стой выборки данных, постепенно переходя к более сложным темам,
таким как объединения, подзапросы, хранимые процедуры, курсоры,
триггеры и ограничения. Обучение будет проходить методично, си­
стематично и просто - на каждый урок вам потребуется не более
10 минут.
Книга уже помогла изучить SQL сотням тысяч пользователей, те­
перь пришел ваш черед. Переходите к первому уроку и приступайте
к работе. Вы быстро научитесь писать эффективные SQL-запросы.
16 Введение

Д.nя коrо nреАназначена эта книrа


Эта книга предназначена для вас, еслй вы:

.... новичок в SQL;


..,. хотите быстро научиться использовать SQL;
..,. хотите научиться применять SQL в разрабатываемых вами
приложениях;
..,. хотите самостоятельно составлять запросы к базам данных на
SQL без чьей-либо помощи.

СУ&Д, рассмотренные в книrе


В большинстве случаев SQL-запросы, рассматриваемые в данной
книге, можно выполнять в любой системе управления базами данных
(СУБД). Но поскольку не все реализации SQL идентичны, особое
внимание в книге будет уделено следующим СУБД (по мере необхо­
димости будут даваться детальные инструкции или примечания):

..,. Apache OpenOffice Base;


.... IВM DB2;
..,. Microsoft Access;
..,. Microsoft SQL Server (включая Microsoft SQL Server Express);
..,. MariaDB;
.... MySQL;
..,. Oracle (включая Oracle Express);
..,. PostgreSQL;
.... SQLite.

Для каждой из перечисленных СУБД на сайте книги доступны де­


монстрационные базы данных (или SQL-сценарии для их создания):
http://forta.com/books/0672336073/
http://www.williamspuЬlishing.com/
Books/978-5-8459-1858-1.html
Условные обозначения 17

Усnовные обозначения
В книге используются различные шрифтовые выделения - во­
первых, для того чтобы можно бьшо отличить программный код от
обычного текста, а во-вторых, чтобы вы не пропустили важные тер­
мины.
Текст, который вы вводите, и текст, который должен появиться на
экране, будут представлены моноширинным шрифтом.
Он выглядит примерно так, как на экране.

Переменные и аргументы функций приводятся моноширинным


:курсивным шрифтом. Их необходимо заменять конкретными значе­
ниями, в зависимости от логики запроса.
Стрелка (�) в начале строки кода означает, что эта строка слиш­
ком длинная и не поместилась в одну строку книги. Продолжайте
вводить все символы после символа � так, как если бы они были
частью предыдущей строки.

ПРИМЕЧАНИЕ

В примечаниях приводится интересная информация, относящая­


ся к обсуждаемой теме.

СОВЕТ

В советах даются полезные подсказки или же объясняются


более быстрые способы выполнения требуемых действий.

ПРЕДУПРЕЖДЕНИЕ

В предупреждениях говорится о возможных проблемах и объяс­


няется, как избегать неприятных ситуаций.

Новый термин
В подобных врезках также даются определения новых базовых
понятий.
18 Введение

Ввод, т
Заголовком "Ввод" обозначен код, который можно ввести само­
стоятельно.

Вывод, т
Заголовком "Вывод" помечены результаты выполнения запросов.

Ана11иэ т
Заголовок "Анализ" предшествует подробному анализу примера.

Ждем ваших отзывов!


Вы, читатель этой книги, и есть главный ее критик. Мы ценим
ваше мнение и хотим знать, что было сделано нами правильно, что
можно бьmо сделать лучше и что еще вы хотели бы увидеть издан­
ным нами. Нам интересны любые ваши замечания в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете
прислать нам бумажное или электронное письмо либо просто посе­
тить наш сайт и оставить свои замечания там. Одним словом, любым
удобным для вас способом дайте нам знать, нравится ли вам эта кни­
га, а также выскажите свое мнение о том, как сделать наши книги
более интересными для вас.
Отправляя письмо или сообщение, не забудьте указать название
книги и ее авторов, а также свой обратный адрес. Мы внимательно
ознакомимся с вашим мнением и обязательно учтем его при отборе и
подготовке к изданию новых книг.

Наши электронные адреса:


E-mail: info@williamspuЫishing.com
WWW: http: / /williamspuЫishing. сот

Наши почтовые адреса:


в России: 127055, г. Москва, ул. Лесная, д. 43, стр. 1
в Украине: 03150, Киев, а/я 152
УРОК 1

ОсновыSQL

На этом уроке вы узнаете, что такое SQL и что можно сделать


с его помощью.

Термино11оrия баз данных


Тот факт, что вы читаете книгу по SQL, говорит о том, что вам так
или иначе необходимо работать с базами данных. SQL предназначен
именно для этого, поэтому, прежде чем перейти к рассмотрению язы­
ка, очень важно ознакомиться с основными понятиями баз данных.
Хотите вы того или нет, но вы постоянно пользуетесь базами дан­
ных. Каждый раз, когда вы выбираете имя в адресной книге элек­
тронной почты, вы обращаетесь к базе данных. Когда вы что-то ище­
те с помощью поискового сайта в Интернете, то посылаете запросы
к базе данных. Когда вы регистрируетесь на офисном компьютере, то
вводите свое имя и пароль, которые затем сравниваются со значения­
ми, хранящимися в базе данных. И даже когда вы вставляете свою
пластиковую карту в банкомат, проверка РIN-кода и остатка на счете
идет через базу данных.
Но, несмотря на то что мы постоянно имеем дело с базами дан­
ных, для многих остается загадкой, что же это такое. Отчасти это
связано с тем, что разные люди вкладывают разный смысл в одни и
те же термины. Поэтому мы начнем с определения наиболее важных
терминов, относящихся к базам данных.

СОВЕТ: вспомните основные концепции

Ниже даны очень краткие определения основных понятий баз


данных. Они предназначены либо для того, чтобы освежить ваши
знания, либо чтобы дать вам самые общие представления, если
вы новичок. Понимание основ баз данных необходимо для изу­
чения SQL, поэтому рекомендую найти хорошую книгу по базам
данных и пополнить свой багаж знаний.
20 УРОК 1. Основы SQL

Базы данных
Термин база данных используется в самых разных областях, но
мы (применительно к SQL) будем считать базу данных набором све­
дений, хранящихся неким упорядоченным способом. Проще всего
рассматривать базу данных как шкаф для хранения документов.
Шкаф - это просто физический объект для хранения данных, неза­
висимо от того, что это за данные и как они упорядочены.

&838А8ННЫХ

Контейнер (обычно файл или группа файлов) для хранения упо­


рядоченных данных.

ПРЕДУПРЕЖДЕНИЕ: неnравипьное уnотре611ение термина


nривоАИТ к nутанице

Люди часто используют термин база данных для обозначения


программного обеспечения, управляющего базой данных. Это
ведет к путанице. На самом деле такое программное обеспе­
чение называется СУБД (система управления базами данных).
База данных - это хранилище, создаваемое и управляемое по­
средством СУБД. Что именно представляет собой такое хранили­
ще, зависит от конкретной СУБД.

Таблицы
Когда вы храните документы в шкафу, вы стараетесь не переме­
шивать их. Вместо этого все документы раскладываются по соответ­
ствующим папкам.
В среде баз данных такая папка называется таблицей. Таблица -

это структурированный файл, в котором могут храниться данные


определенного типа. В таблице может находиться список клиентов,
каталог продукции и любая другая информация.

Та611ица

Структурированный набор данных определенного типа.


Терминология баз данных 21

Ключевой момент заключается в том, что данные, хранимые в


таблице, должны быть одного типа или взяты из одного списка. Ни­
когда не храните список клиентов и список заказов в одной rаблице
базы данных. Это затрудняет поиск и получение информации. Лучше
создать две таблицы для каждого из списков.
Каждая таблица базы данных обладает уникальным именем,
идентифицирующим ее, и никакая другая таблица в базе данных не
может носить то же самое имя.

ПРИМЕЧАНИЕ: имена та611иц

Уникальность имени таблицы достигается комбинацией несколь­


ких компонентов, включая имя базы данных и самой таблицы.
В качестве части уникального имени в некоторых базах данных
применяется также имя владельца. Это означает, что нельзя ис­
пользовать два одинаковых имени таблицы в одной базе, но
в ра зных базах данных им ена таблиц могут повторять ся.

Таблицы имеют определенные характеристики и свойства,


определяющие, каким образом в них хранятся данные. Сюда входит
информация о том, какие данные могут храниться в таблицах, как
они распределены по таблицам, как называются отдельные инфор­
мационные блоки, и многое другое. Подобный набор информации,
описывающей таблицу, называется схемой. Схемы служат для опи­
сания как отдельных таблиц в базе данных, так и базы данных в
целом (а также для описания связей между таблицами, если таковые
имеются).

Схема

Информация о базе данных, а также о структуре и свойствах ее


таблиц.

Столбцы и типы данных


Таблицы состоят из столбцов, в которых хранятся отдельные
фрагменты информации.
22 УРОК 1. Основы SQL

Стопбец
Одиноч ное п оле таблицы. Все таблицы состоят из одного или не­
скол ьких столбцов.

Чтобы лучше по нять это, представьте себе таблицу базы данных


в виде сетки наподобие электронной таблицы. В каждом столбце сет­
ки находится определен н ая часть и н формации. Наприм ер, в таблице
клиентов в одном столбце находится н о мер клиента, в друтом - его
имя. Адрес, город, область, почтовый индекс - все это расположено
в отдельных столбцах.

СОВ ЕТ: расnреАеnение АВННЫХ


Оче н ь важно п равил ь н о расп ределить да н н ые по н ескол ь ки м
стол б цам. Н а п ример, название города , области (штата) и почто­
в ы й индекс всегда должн ы находиться в отдел ь ных столб цах. Это
позвол я ет сортировать или фил ьтровать да н н ы е по столбцам
( н а п ример, дл я поиска всех клиентов из оп редел е н н о й области
или города). Если назва ния города и области хра н ятся в одн о м
столб це, будет очень сложно отсортировать ил и отфил ьтровать
да н н ые п о области.
Когда в ы расп редел яете да н н ы е по стол б ца м , уровень дробле­
ния оп редел я ется вами и требования м и кон кретно й базы да н ­
н ых. Н а п ример, адреса обы ч н о хра н ятся в виде названия улицы
и номера дома. Это удобно, если тол ько однажды в ы н е решите
отсортировать таблицу по назва ния м улиц. В та ком случае п ред­
почтител ь н о отделять номера домов от названий улиц.

С кажды м столбцом базы данн ых связан определенный тип дан­


н ых, который указывает, какие дан ные могут хран иться в этом столб­
це. Наприм ер, если в столбце должн ы содержаться числа (скажем ,
соответствующие количеству товаров в заказах), то тип дан н ых будет
числовы м . Если в столбце необходи м о хранить даты, текст, зам етки,
денежные сумм ы и тому подобное, то для всех этих данн ых суще­
ствуют определе нн ые типы.
Терм и нология баз да н н ых 23

ТИn д,анных
Тип разрешен н ых дл я хранения да н н ых. Каждому стол б цу табли­
цы п рисваивается тип , котор ый разрешает хран ить в н е м тол ько
определен ную информацию.

Типы данных ограничивают харакгер информации, которую мож­


но хран ить в столбце ( н априм ер, предотвращают ввод алфавитных
си м волов в числовое поле). Типы данных также пом огают коррекгн о
отсортировать и н формацию и играют важную роль в опти м изации
использован ия м еста н а диске. Таки м образом , выбору типов дан­
ных для столбцов создаваем ой таблицы н еобходи мо уделить особое
внимание.

П РЕДУП РЕЖД Е Н И Е : совместимость тиnов данных


Тип ы дан н ых и их названия я вля ются одним из основных источ­
ников несовмести мости в SQL. Базовые типы да н н ых обычно
поддерживаются всеми СУБД п римерно одинаково, в отличие от
некоторых сложн ых типов. Более того, иногда вы будете сталки­
ваться с тем , что один и тот же тип да н н ых в разных СУБД назы­
вается по-разному. К сожалению, с этим ничего н ел ьзя поделать,
п росто следует пом нить о таких вещах п ри создании схем таблиц.

Строки
Дан ные в таблице хранятся в строках, и каждая запись хран ится в
своей строке. Возвращаясь к срав н е н ию с сеткой электронной табли­
цы, м ож н о сказать, что ее вертикаль ные ряды являются столбцам и
таблицы, а горизо нтальные - строкам и.
Напри м ер, в таблице клие нтов и н форм ация о каждо м клие нте
хранится в отдельной строке. Число строк в таблице равно числу за­
писей о клиентах.

Строка
Отдел ь ная запись в таблице.
24 УРОК 1. Ос новы SQL

П Р И М ЕЧА Н И Е: заnиси и.nи строки?


Часто п ол ьзователи баз да н н ы х говорят о записях, имея в виду
строки. О б ы ч н о эти два термина взаимозамен я ем ы , но тер мин
строка технически более п ра вилен .

Первичные кл ючи
В каждой строке таблицы долж н о быть н есколько столбцов, ко­
торые ун икальным образом идентифицируют ее. В таблице клиентов
это могут быть н ом ера клиен тов, тогда как в таблице заказов таки м
столбцом м ожет служить иден тификатор заказа. В таблице со спи­
ском сотрудн иков м ожн о использовать столбец с н ом ерам и сотрудн и­
ков или столбец с н ом ерам и карточек социальн ого страхован ия.

Первичный к.nюч
Стол бец (или набор столбцов), значения которого уникал ьно
идентифицируют каждую строку таблиц ы .

Столбец (или н абор столбцов), ун икаль н о иде нтифицирующий


каждую строку таблицы , н азывается первичным кл ючом. Первичны й
ключ н ужен для обращен ия к конкретн ой строке. Без н его выполнять
об н овле н ие или удале н ие строк таблицы было бы оче н ь затрудн и­
тель н о, так как н е было бы н икакой гарантии, что изм е н яются н уж­
ные строки.

СОВ ЕТ: всеrда оnреАе.nнйте nервичные к.nючи


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

Любой столбец таблицы м ожет быть выбран в качестве первич­


н ого ключа, если соблюдаются следующие условия.

� Две раз ные строки н е могут и меть одн о и то же зн аче н ие пер­


вич н ого ключа.
Что такое SQL 25

..,. Каждая строка должна иметь определенное значение первич­


ного ключа (столбцы первичного ключа не могут иметь зна­
чения NULL) .
..,. Значения в столбце первичного ключа не могут быть изменены .
..,. Значения первичного ключа нельзя исполь зовать дважды.
(Если строка удалена из таблицы, ее первичный ключ нельзя
в дальнейшем назначать другим строкам.)

В качестве первичного ключа обычно выбирается только один


столбец таблицы. Но данное требование не обязательно, и первич­
ным ключом могут служить несколько столбцов. При этом правила,
приведенные выше, должны соблюдаться для всех столбцов первич­
ного ключа, а все комбинации их значений должны быть уникальны­
ми (в отдельных столбцах значения могут повторяться).
Существует еще один важный тип ключа, который называется
"внешний ключ", но его мы рассмотрим на уроке 22.

Что такое SQL


SQL (Structured Queгy Language) - это язык структурированных
запросов, который был специально разработан для взаимодействия с
базами данных.
В отличие от других я зыков (разговорных, вроде английского,
или языков программирования, таких как Java, С# или РНР), SQL со­
стоит всего из нескольких слов. И сделано это намеренно . SQL был
создан для решения одной задачи, с которой он вполне справляет­
ся, - предоставлять простой и эффективный способ чтения и записи
информации из баз данных.
Каковы же преимущества SQL?
..,. SQL не относится к числу шrгентованных языков, используемых
поставщиками определенных СУБД . Почти все ведущие СУБ.Д:
поддерживают SQL, поэтому знание данного языка позволит
вам взаимодействовать практически с любой базой данных .
..,. SQL легко изучить. Его немногочисленные инструкции состо­
ят из простых английских слов .
..,. Несмотря на кажущуюся простоту, SQL является очень мощ­
ным языком. Разумно пользуясь его инструкциями, можно вы­
полнять очень сложные операции с базами данных.

Вот почему стоит и зучить SQL.


26 УРОК 1. Основы SQL

П Р И М ЕЧАН И Е: расwиренин SQL


М ногие п остав щики СУБД расширили возможности SQL, в ведя в
я з ы к доп ол нител ь н ы е о перато р ы или инструкции. Эти расшире­
ния необходи м ы для обеспечения допол нител ьной фун кциональ­
ности или для упроще ния оп ределен н ы х операций . И хотя часто
они б ы в а ют очень п олез н ы , п одобн ы е расширения специфич н ы
для кон кретной СУБД и редко поддержива ются более чем одним
постав щиком.
Ста нда рт SQL контролируется комитетом ANSI и соответстве н н о
называется A N S I SQL. Все круп н ы е СУБД, даже т е , у которых есть
собствен н ы е расширения , поддерживают ANSI SQL. Отдел ьн ые же
реализации носят собствен н ы е имена (PL-SQL, Traпsact-SQL и др.).
Ч а ще всего в книге рассматривается имен но ANSI SQL. В тех
редких случаях, когда используется разновидность SQL, относя­
щаяся к оп редел е н н о й СУБД, об этом упоминается отдел ьно.

П оп робуйте сам и
Подобно изучению любого другого языка, лучше всего попробо­
вать применить SQL на практике. Для этого вам понадобится база
данных и СУБД, в которой можно выполнять SQL-запросы.
Во всех упражнениях книги используются настоящие инструкции
SQL и настоящие таблицы базы данных. В приложении А описыва­
ются все демонстрационные таблицы и рассказывается о том, как их
получить (или создать самостоятельно), чтобы можно было выпол­
нять инструкции каждого урока. В приложении Б объясняется, как
выполнять SQL-запросы в различных СУБД. Прежде чем перейти к
следующему уроку, прочитайте эти два приложения, чтобы подгото­
виться к выполнению примеров.

Резюме
Н а первом уроке в ы узнали, что такое SQ L и для чего он нужен.
В связи с тем что SQL применяется для взаимодействия с базами
данных, была также рассмотрена основная терминология баз данных.
УРОК 2

Из вп ечен ие дан н ых
из та бп и ц

На этом уроке вы узнаете, как применять инструк цию SELECT


для извлечения одного или нескольк их столбцов из таблицы.

И н струкци я SELECT
Как уже говорилось на уроке 1, инструкции SQL состоят из обыч­
ных английских терминов. Эти термины называются ключевыми сло­
вами, и каждая инструкция SQL содержит одно или несколько ключе­
вых слов. Чаще всего вы будете сталкиваться с инструкцией SELECT,
которая предназначена для извлечения информации из одной или не­
скольких таблиц.

Кпючевое спово
За резервирован н ое слово, я вл я ю щееся частью SQL. Никогда не
назы в а йте таблицу или столбец таким словом. В п риложении Д
п еречисл е н ы н аибол ее часто испол ьзуе м ы е кл ючевые слова.

Чтобы при помощи инструкции SELECT извлечь данные из та­


блицы, нужно указать как минимум две вещи : что именно вы хотите
извлечь и откуда.
28 УРОК 2. И звлечение да н н ы х из т а бл и ц

П Р И М ЕЧАН И Е: выnо11няйте nрнмеры no ХОАУ чтения кннrн


Во всех п рим ерах книги испол ьзуются файл ы да н н ых, о писа н ­
н ы е в п риложении А. Если в ы хотите самостоятел ь н о в ы п ол н ять
п римеры (оч е н ь желател ьно поступать именно та к), обратитесь к
п риложению А, в котором дан ы инструкции о том , ка к загрузить
эти файл ы и создать с их помощью гото в ы е таблиц ы .
О ч е н ь важно понимать, что S Q L -это я з ы к, а н е п риложение.
'
Способ в вода инструкций SQL и отображения резул ьтатов их
в ы пол н е ния зависит от кон кретно го п риложения. Чтоб ы помочь
в а м п рисп особить рассматривае м ы е примеры к своей СУБД,
в п риложении Б объясняется , ка к в ы пол н ять п римеры книги в
попул я р н ых СУБД и средах разработки.

Изв.n ече н ие отАе.n ь н ых сто.n бцов


Начнем с простой инструкции S ELECT.

ВВОА Т
SELECT prod_name
FROM Products;

Ана11из т
В этом примере инструкция SELECT извлекает один столбец под
названием prod_пате из таблицы Products . Имя столбца указы­
вается сразу после ключевого слова SELECT, а ключевое слово FROM
указывает на имя таблицы, из которой извлекаются данные. Резуль­
тат выполнения инструкции будет таким.

ВЫВОА Т
prod_name

Fish bean bag toy


Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Извлечение отдел ьных столбцов 29

Raggedy Ann
King doll
Queen doll

П Р И М ЕЧАН И Е: неотсортированные А&Нные


Есл и в ы поп робуете в ы п ол н ить этот зап рос самостоятел ьно, то
за метите, что да н н ые часто отобража ются в и н о м порядке. Вол ­
новаться не стоит - та к и должно б ыть. Есл и резул ьтаты зап роса
не отсорти ров а н ы я в н ы м образом (об этом будет говориться на
следующем уроке), то да н н ые будут возвра щаться в п роизвол ь­
ном п о рядке. Это м ожет б ыть п о рядок, в котором строки зано­
сил ись в табл и цу, или ка кой -то д ругой порядок. Гла в ное, чтобы
зап рос возвра щал одно и то же ч и сло строк.

Простая инструкция SELECT, которая использовалась в предыду­


щем примере, возвращает все строки таблицы. Данные не фильтру­
ются и не сортируются. Эти темы будут рассматриваться на следую­
щих уроках.

СОВ ЕТ: завершение инструкций


Нескол ь ко и н струкций SQL должн ы б ыть раздел е н ы точ ко й с
запятой (сим вол о м ; ). В бол ь ш и нстве СУБД не требуется вста в­
лять точ ку с запятой после еди н ственной и н струкц и и , н о есл и в
вашем кон кретно м случае СУБД в ыдает о ш и б ку, в а м п ридется
это делать. Точ ку с запятой всегда можно доба влять; о н а не п о ­
мешает, даже есл и не я вл я ется обязател ьной .

СОВ ЕТ: инструкции SQL и регистр симво11ов


Важно подчеркнуть, что и н струкци и SQL нечувствител ь н ы к ре­
гистру с и м вол о в , п оэто му и н струкци и SELECT, select и Select
экви валентн ы . М ногие разработч ики п р и м е н я ют верхн и й ре­
гистр дл я всех кл ючевых слов SQL и нижн и й регистр - дл я и м е н
столбцов и табл и ц, чтобы код л е г ч е ч итался. Но будьте в н и ма­
тел ьн ы : и н струкции SQL не зависят от регистра , в отл ич и е от
и мен табл и ц, стол бцов и значен и й (это зависит от СУБД и ее
кон ф и гура ц и и ).
30 ______У_Р_О_К_2_. _Извлечение данных из таблиц

СОВ ЕТ: исnоnьэование npo6enoв


Все л и ш н ие п робел ы в и нструкц и и SQL п ропуска ются п р и обра­
ботке зап роса. П оэтому и н струкция SQL может б ыть за п исана
как в одной дл и н ной строке, та к и разбита на н ескол ько строк.
Следующие три и н струкции фун кционал ьно иденти ч н ы .

SELECT prod_name
FROM Products;

SELECT prod_name FROM Products;

SELECT
prod_name
FROM
Products;

Бол ь ш и н ство разработч и ков разб и в а ют инструкци и на нескол ь­


ко строк, чтобы их было легче ч итать и отлажи в ать.

Изв11ече н ие н еско11 ь ких сто116цов


Для извлечения нескольких столбцов из таблицы применяется
та же самая инструкция SELECT. Отличие состоит в том, что после
ключевого слова SELECT необходимо через запятую указать несколь­
ко имен столбцов.

СОВ ЕТ: будьте вниматеnьны с запятыми


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

Следующая инструкция SELECT извлекает из таблицы Products


три столбца.

SELECT prod_id, prod_name, prod_price


FROM Products;
Извлечение всех столбцов 31

Анаnиз т
Как и в предыдущем примере, здесь для получения данных из
таблицы Product s применяется инструкция SELECT. В данном слу­
чае перечислены три имени столбца, разделенные запятыми. Резуль­
тат выполнения инструкции показан ниже.

Вывод т
prod_id prod_name prod_price
--------- -------------------- -------------

BNBGOl Fish bean bag toy 3.4900


BNBG02 Bird bean bag toy 3.4900
BNВG03 Rabbit bean bag toy 3.4900
BROl 8 inch teddy bear 5.9900
BR02 12 inch teddy bear 8.9900
BR03 18 inch teddy bear 11.9900
RGANOl Raggedy Ann 4.9900
RYLOl King doll 9.4900
RYL02 Queen doll 9.4900

П РИ М ЕЧАН И Е : nредставпение данных


Ка к видно и з результатов зап роса, и н струкци и SQL о б ы ч н о воз­
враща ют н еотфор м ати рова н н ы е да н н ые. Фо р м ати рова н и е да н ­
ных я вляется п роблемой п редста влен и я , а не в ы борки . П оэтому
п редста вле н и е ( н а п р и м ер, отображен и е п р и веде н н ых в ы ш е
ц е н в виде денежной сум м ы с п ра в ил ь н ы м ч исло м з н а ков п о ­
сле десяти ч н о й запятой) зависит о т п р иложе н и я , посредством
которого отобража ются да н н ы е . Неотформати рова н н ы е да н н ы е
п р и м е н я ются редко.

Извn ечение всех стоnбцов


.Помимо извлечения указанных столбцов (одного или нескольких),
с помощью инструкции SELECT можно запросить все столбцы, не пе­
речисляя каждый из них. Для этого вместо имен столбцов указывается
rрупповой символ "звездочка" ( * ) . Эго делается следующим образом.

Ввод т
SELECT *
FROM Products;
32 УРОК 2. Извлечение данных из табл и ц

Анаnиз т
При наличии группового символа ( * ) возвращаются все столб­
цы. Обычно (но не всегда) столбцы возвращаются в том порядке, в
котором они указаны в определении таблицы. Впрочем, табличные
данные редко выводятся в том виде, в котором они хр анятся в базе
данных. (Обычно они возвращаются в приложение, которое долж­
ным образом форматирует их.)

П РЕДУП РЕЖДЕН И Е: 11сnо11ьэован11е rpynnoвыx симвопов


Луч ше не испол ьзовать груп повой с и м вол * (кром е тех случаев,
когда вам действител ьно н еобходи м ы все столб ц ы табл и цы ) . Н е­
смотря на то что груп повые с и м вол ы п о могут сэконом ить в ре­
мя и усил и я , необходи м ые для переч и сл е н и я всех н еобходи м ых
столбцов, извлечение ненужных столб цо в об ы ч н о п р и водит к
сн ижен и ю п ро и зводител ьности зап роса и п р ил оже н и я в цел о м .

СОВЕТ: иэuечение неизвестных сто116цов


Есть одно бол ьшое п реи мущество в испол ьзова н и и груп повых
с и м волов. П оскол ьку в ы не указы ваете точ н ы е и мена столб цов
(при нал и ч и и с и м вола * возвращаются все столбцы), по я вл я ет­
ся возможность извлечь столбцы , и м е н а которых неизвестн ы .

Извnече н ие ун и ка n ь н ых строк
Как вы убедились, инструкция S E L E C T возвращает все стро­
ки, соответствующие критерию отбора. Но что е сли вам не нуж­
ны абсолютно все значения? Предположим, например, что не­
обходимо узнать идентификаторы всех поставщиков из таблицы
Products .

ВВОА Т
SELECT vend id
FROM Products;
Из влечение ун и кал ь н ы х строк зз

Вывод т
vend id

BRSOl
BRSOl
BRSOl
DLLOl
DLLOl
DLLOl
DLLOl
FNGOl
FNGOl

Инструкция SELECT вернула 9 строк (хотя в списке всего четыре


поставщика), потому что в таблице Produc t s указаны 9 товаров.
Как же получить список уникальных значений?
Решение заключается в применении ключевого слова D I S T INCT,
которое, как нетрудно предположить, заставляет СУБД вернуть толь­
ко уникальные значения.

Ввод т
SELECT DISTINCT vend_id
FROM Products;

Анап из т
Предложение S E LE C T D I S T INCT vend_i d заставляет СУБД
вернуть только записи с отличающимися значениями ve n d i d, _

и в результате мы получаем три строки, как показано ниже. Ключе­


вое слово DI S T INCT, если оно имеется, должно находиться непо­
средственно перед списком имен столбцов.

Вывод т
vend id

BRSOl
DLLOl
FNGOl
34 УРОК 2. Извлечение данных из табл и ц

П Р ЕДУП РЕЖДЕН И Е: строки не моrут быть частично


уника11ьными
Кл ючевое слово DISTINCT п р и ме ня ется ко всем стол б ца м , а не
тол ь ко к тому, перед кото р ы м оно стоит. Есл и задать в ы раже н и е
SELECT DISTINCT vend_id, prod__price, будут извлеч е н ы все
строки , есл и тол ь ко н е о кажется , что оди н и тот же п родавец
п редл а гает раз н ы е товары по оди на ко в ы м цен а м .

Оrран ичение резуnьтатов зап роса


Инструкция S E LECT возвращает все строки, соответствующие
критерию отбора. Зачастую это все строки таблицы. Но что если не­
обходимо получить лишь первую строку или заданное число строк?
Такое вполне возможно, однако приходится с сожалением констати­
ровать, что это одна из тех редких ситуаций, когда разные реализа­
ции SQL ведут себя по-разному.
В Microsoft SQL Server и MicrosoftAccess можно воспользоваться
ключевым словом ТОР, чтобы извлечь лишь несколько первых запи­
сей, как показано ниже.

SELECT ТОР 5 prod_name


FROM Products;

prod_name

8 inch teddy bear


12 inch teddy bear
18 inch teddy bear
Fish bean bag toy
Bird bean bag toy

Анаn и э У
В этой инструкции предложение SELECT ТОР 5 задает извлече­
ние первых пяти строк.
В DB2 применяется собственный уникальный синтаксис.
О гра н и ч е н и е резул ьт атов за п рос а 35

Ввод т
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;

Анапиз т
Предложение FETCH FIRST 5 ROWS ONLY навряд ли требует
каких-либо пояснений.
В Oracle необходимо организовать подсчет строк с помощью
встроенного счетчика ROWNUM.

Ввод т
SELECT prod_name
FROM Products
WHERE ROWNUМ <=5;

В MySQL, MariaDB, PostgreSQL и SQLite можно воспользоваться


предложением LIMIT.

Ввод т
SELECT prod_name
FROM Products
LIMIT 5;

Анапиз т
В этой инструкции извлекается единственный столбец. Предло­
жение L IMI T 5 заставляет СУБД вернуть не более пяти строк. Если
необходимо получить следующие пять строк, задайте начальную
точку извлечения и требуемое количество строк, как показано ниже.

Ввод т
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
36 УРОК 2. Извлечение да нных из табл иц

Ана.nиз т
Предложение L IMIT 5 OFFSE T 5 заставляет СУБД вернуть
пять строк, начиная со строки 5. Первое число - это количество
строк для извлечения, а второе - начальная точка. Результат пока­
зан ниже.

Вывод, т
prod_name

Rabbit bean bag toy


Raggedy Ann
King doll
Queen doll

П РЕДУП РЕЖДЕН И Е: строка О


Первая и звлекаемая строка и м еет номер о, а не l. Та ки м об­
разо м , и н струкция с п редложе н и е м LIMIT l OFFSET l вер н ет
вто рую стро ку, а не первую.

СОВ ЕТ: крат кая форма эаnиси ря MySQL,


MariaDB и SQLite
MySQL, M a r i a D B и SQ Lite поддерживают краткую форму п ред­
ложе н и я LIMIT З OFFSET 4, позволяя з а п и сать его ка к LIM­
IT з, 4. В да н н о й форме ч и сло перед запятой задает кол ичество
строк, а п осле зап ятой - начал ь ную точ ку.

П РИ М ЕЧ А Н ИЕ: не все реа11иэации SQL од,инако в ы


Да н н ы й раздел с о п и са н ием инструкци й , позвол я ю щих огр а н и ­
ч и вать резул ьтаты зап роса, включен л и ш ь дл я того, чтобы по­
казать: н ел ьзя слепо надеяться на то, что си нта ксис и н струк ц и й
S Q L будет оди н а ко в ы м и согласова н н ы м в о всех СУБД. П ро­
сте й ш и е и н струкци и обы ч н о я вл я ются перенос и м ы м и , но более
слож н ы е всегда нужно п ро верять. П о м н ите об это м п р и р азра­
ботке п риложен и й дл я баз да н н ых.
И спол ьзова н ие ком ментариев 37

Итак, предложение LIMIT задает число возвращаемых строк. Пред­


ложение LIMIT с ключевым словом OFFSET указывает, с какой строки
таблицы необходимо начать отсчет. В нашем примере таблица Pro­
ducts содержит всего девять товаров, поэтому инструкция с предло­
жением LIMIT 5 OFFSET 5 вернула четыре строки (пятой просто нет).

Исn оn ьз ование комментариев


Инструкции S Q L обрабатываются самой СУБД. Но что если в
инструкцию необходимо включить текст, который не должен ни вы­
полняться, ни обрабатываться? И зачем это вообще нужно? Вот не­
сколько причин.

� Рассмотренные ранее инструкции были очень короткими и


простыми. Но по мере увеличения сложности запросов в них
придется добавлять описательные комментарии (в качестве на­
поминания самому себе на будущее или для друтих членов про­
екта). Такие комментарии вставляются в тексты запросов, но со­
вершенно очевидно, что они не предназначены для обработки
со стороны СУБД. В качестве примеров изучите файлы cre ­
a te . txt и populate . txt, использованные в прилщкении Б.
� То же самое справедливо для заголовков в начале SQL-файла,
содержащих контактные данные программиста, а также раз­
личные описания и примечания . Примеры этого также можно
увидеть в файлах, использованных в приложении Б.
� Другое важное применение комментариев - временный запрет
выполнения фрагментов SQL-кoдa. Если вы создаете длинный
запрос и хотите протестировать лишь его фрагмент, закоммен­
тируйте лишние фрагменты, чтобы СУБД проигнорировала их.

Большинство СУБД поддерживает несколько вариантов синтакси­


са комментариев. Начнем с комментариев, встроенных в строку кода.

ВВОА Т
SELECT prod_name -- эт о ко ммент арий
FROM Products;

Ана11иэ т
Для встраивания комментариев предназначено выражение
(два дефиса). Все, что идет далее, считается текстом комментария.
38 УРОК 2. И з влеч е н и е да н н ы х из табл и ц

Подобным образом удобно, к примеру, описывать назначение столб­


цов в инструкции C REATE ТАВLЕ.
Вот еще одна разновидность встроенных комментариев (она под­
держивается реже).

ВВОА Т
# Эт о к оммен тарий
SELECT prod_narne
FROM Products;

Ана11из 'f
Символ # в начаJJ:е строки превращает ее в комментарий.
Можно также создавать многострочные комментарии, в том чис­
ле такие, которые предотвращают выполнение фрагментов запроса.

ВВОА Т
/* SELECT prod_name, vend_id
FROM Products; * /
SELECT prod_narne
FROM Products;

Ана11из 'f
Выражение / * помечает начало комментария, а выражение * / его -

конец. Все, что находится между ними, становится комментарием. По­


добный тип комментариев часто применяется для блокирования фраг­
ментов кода. В данном примере определены две инструкции SELECT,
но первая из них не будет выполняться, потому что закомментирована.

Резюме
На
этом уроке вы узнали, как применять инструкцию SE LECT
для извлечения одного, нескольких и всех столбцов таблицы. Было
также показано, как извлекать уникальные значения и вставлять
комментарии в код. К сожалению, вы убедились в том, что сложные
SQL-запросы приходится проверять на совместимость с различными
СУБД. Далее мы рассмотрим, как сортировать результаты запроса.
УРОК 3

Сорти р ов ка
по.nучен н ых да н н ых

На этом уроке вы узнаете, как использовать предложение ORDER ВУ


инструк ции SELECT для сортировк и результатов запроса.

Сорти ровка з а п исей


Как объяснялось на предыдущем уроке, следующая инструкция
SQL возвращает один столбец из таблицы. Но взгляните на результа­
ты: данные выводятся в произвольном порядке.

SELECT prod_name
FROM Products;

Вывод� т
prod_name

Fish bean bag toy


Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

Вообще-то, строки отображаются не в случайном порядке. При


отсутствии сортировки строки обычно выводятся в том порядке, в
котором они хранятся в таблице. Скорее всего, именно в этой по­
следовательности они изначально добавлялись в таблицу. Но если
40 УРОК з. Сортировка полученных да нных

данные впоследствии обновлялись или удалялись, то порядок будет


зависеть от того, как СУБД использует освободившееся место. Таким
образом, вы не можете (и не должны) полагаться на порядок сорти­
ровки, если не задаете его в явном виде. В теории реляционных баз
данных говорится, что порядок извлечения данных не имеет значе­
ния, если не указан порядок сортировки.

Предnожение
И нструкци и SQL состоят из п редложе н и й , одн и и з кото рых обя­
зател ь н ы , другие - нет. П редложе н и е обычно в кл ючает в себя
кл ючевое слово и пол ьзовател ьские да н н ые. П р и мером м ожет
служить п редложе н и е FROM и нструкц и и SELECT из п р едь�дущего
л и сти н га .

Для сортировки извлекаемых инструкцией SELECT данных пред­


назначено предложение ORDE R ВУ. В нем указывается имя одного
или нескольких столбцов, по которым и сортируются результаты за­
проса. Рассмотрим следующий пример.

ВВОА Т
SELECT prod_name
FROM Products
ORDER ВУ prod_name;

Анаnиз т
Эта инструкция идентична предыдущей, за исключением пред­
ложения ORDER ВУ, которое заставляет СУБД отсортировать данные
в алфавитном порядке по столбцу prod_name. Результат показан
ниже.

ВЫВОА Т
prod_name

12 inch teddy bear


18 inch teddy bear
8 inch teddy bear
Bird bean bag toy
С о рти ровка по н ескол ьки м столбца м 41

Fish bean bag toy


King doll
Queen doll
Rabbit bean bag toy
Raggedy Ann

П РЕДУП Р ЕЖДЕ Н И Е: местоnо11ожен11е nредпожения


ORDER ВУ
П ри испол ьзова н и и п редложе н и я ORDER ВУ убедитесь в том , что
оно я вл я ется п оследн и м в и н струкци и SELECT. В п роти в н о м слу­
чае будет выда н о сообще н и е об о ш и б ке.

СОВ ЕТ: сортировка no невыбранным сто116цам


Чаще всего стол бцы, указы ваемые в предложе н и и ORDER ВУ,
отобража ются на экране, хотя это не обязател ьно. Да н н ы е мо­
гут сорти роваться и по столбцу, кото р ы й н е и з влекается в са м о м
зап росе.

Сортиро вка по неско11 ь ки м


сто11 бц а м
Часто бывает необходимо отсортировать данные по нескольким
столбцам. Например, если вы выводите список сотрудников, вам мо­
жет понадобиться отсортировать его сначала по фамилии сотрудни­
ка, а затем по имени. Это может быть полезным, если в компании
есть несколько человек с одинаковыми фамилиями.
Чтобы выполнить сортировку по нескольким столбцам, укажи­
те их имена через запятую. В следующем примере извлекаются три
столбца, а результат сортируется по двум из них: сначала - по цене,
потом - по названию.

ВВОА Т
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER ВУ prod__price, prod_name;
42 УРОК З. С о рти ровка пол уче н н ы х да н н ы х

ВЫВОА Т
prod_id prod_price prod_name
--------- ------------- -------- � -----------

BNBG02 3.4900 Bird bean bag toy


BNBGOl 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
RGANOl 4.9900 Raggedy Ann
BROl 5.9900 8 inch teddy bear
BR02 8.9900 12 inch teddy bear
RYLOl 9.4900 King doll
RYL02 9.4900 Queen doll
BR03 1 1. 9900 18 inch teddy bear

Важно понимать, что при сортировке по нескольким столбцам


порядок сортировки будет таким, который указан в запросе. Други­
ми словами, в приведенном выше примере товары сортируются по
столбцу prod_ name, только если существует несколько строк с оди­
наковыми значениями prod_pr i ce. Если никакие значения столбца
prod_p r i c e не совпадают, данные по столбцу prod_name сорти­
роваться не будут.

Сорти ровка по
n о11 оже нию сто116 ца
Порядок сортировки можно указать не только по именам столб­
цов, но и по относительному положению столбца (проще говоря -
по номеру столбца). Чтобы лучше понять это, рассмотрим пример.

SELECT prod_id, prod_price, prod_name


FROM Products
ORDER ВУ 2, З;

ВЫВОА Т
prod_id prod_price prod_name

BNBG02 3.4900 Bird bean bag toy


BNBGOl 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
RGANOl 4.9900 Raggedy Ann
Указа ние направлен ия сортировки 43

BROl 5.9900 8 inch teddy bear


BR02 8.9900 12 inch teddy bear
RYLOl 9.4900 King doli
RYL02 9.4900 Queen doll
ВRОЗ 11. 9900 18 inch teddy bear

Ана11иэ •
Как видите, результат выполнения запроса идентичен предьщу­
щему примеру. Разница только в предложении ORDE R ВУ. Здесь не
указаны имена столбцов, а лишь оговорено их относительное поло­
жение в списке SELECT. Выражение ORDER ВУ 2 означает сорти­
ровку по второму столбцу списка, а именно по столбцу prod_price.
Предложение ORDER ВУ 2 , 3 означает сортировку по столбцу prod_
pri ce, а затем - по столбцу prod_name.
Основное преимущество данного метода заключается в том, что не
нужно несколько раз набирать в запросе имена столбцов. Но имеются
и недостатки. Во-первых, отсутствие явных имен столбцов повышает
верояпюсть того, что вы случайно укажете не тот столбец. Во-вторых,
можно случайно сменить порядок столбцов при изменении списка SE­
LECT (забыв при этом внести соответствующие изменения в предло­
жение ORDER ВУ). И наконец, очевидно�. что нельзя использовать этот
метод для сортировки по столбцам, не указанным в списке SELECT .

СОВ ЕТ: сортировка no иевы&раииым сто.n&цам


О п и са н н ы й в ы ш е м етод нельзя п р и менять п р и сорти ров ке по
столбца м , отсутствующ и м в сп иске SELECT. Одн а ко в случ а е не­
обходи м ости можно в одн о й и нструкци и указы вать реал ь н ы е
и мена столбцов и их номера.

У каза н ие на n равn ения


сортировки
Данные можно сортировать н е только п о возрастанию (от А д о Я).
Такой порядок задан по умолчанию, но в предложении ORDER ВУ
можно также указывать порядок по убыванию (от Я до А). Для этого
предназначено ключевое слово DESC .
В следующем примере товары сортируются в порядке убывания
цен (вначале идут самые дорогие товары).
44 УРОК З. С о рти ров ка пол уч е н н ы х да н н ы х

SELECT prod_id, prod_price, prod_name


FROM Products
ORDER ВУ prod_price DESC;

Вывод т
prod_id prod_price prod_name
--------- ------------- --------------------

BR03 11.9900 18 inch teddy bear


RYLOl 9.4900 King doll
RYL02 9.4900 Queen doll
BR02 8.990.0 12 inch teddy bear
BROl 5.9900 8 inch teddy bear
RGANOl 4.9900 Raggedy Ann
BNBGOl 3.4900 Fish bean bag toy
BNBG02 3.4900 Bird bean bag toy
BNBG03 3.4900 Rabbit bean bag toy

Но как быть в случае сортировки по нескольким столбцам? В сле­


дующем примере товары сортируются в порядке убывания цен (вна­
чале самые дорогие), а также по наз ваниям.

SELECT prod_id, prod_price, prod_name


FROM Products
ORDER ВУ prod_price DESC, prod_name;

Вывод т
prod_id prod_price prod_name
--------- ------- ------------------

BR03 11. 9900 18 inch teddy bear


RYLOl 9.4900 King doll
RYL02 9.4900 Queen doll
BR02 8.9900 12 inch teddy bear
BROl 5.9900 8 inch teddy bear
RGANOl 4.9900 Raggedy Ann
BNBG02 3.4900 Bird bean bag toy
BNBGOl 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
Указа ние направлен ия сортировки 45

Ана11иэ т
Ключевое слово DESC применяется только к тому столбцу, после
которого оно стоит. В предыдущем примере ключевое слово DE SC
было указано для столбца p r o d_p r i c e , но не для p r o d_ name .
Таким образом, столбец р r оd_р riсе.сортируется по убыванию,
а столбец prod_name (в пределах каждого ценового блока) - как
обычно, по возрастанию.

COB El: сортировка no убыванию no неско11ьким сто116цам


Есл и необходи м о отсорти ровать да н н ы е в порядке убы в а н и я по
н ескольки м стол бца м , укажите для каждого и з н их кл ючевое
СЛОВО DESC.

Следует уточнить, что DESC ЭТО сокращение от DESCE NDING;


-

можно использовать оба ключевых слова. Антонимом для D E SC


является ключевое слово ASC (ASCENDING), которое можно указы­
вать для сортировки по возрастанию. Однако на практике слово ASC
обычно не применяется, поскольку такой порядок используется по
умолчанию (он предполагается, если не указано ни ASC , ни DESC).

СОВ ЕТ: чувствите11ьность к реrистру симво11ов и nорядок


сортировки
П ри сорти ровке текстовых да н н ых А- это то же самое, что и а?
И а идет п еред в и л и п осле я? Это не теорети ческие воп росы, и
ответ на н их зав исит от настроек базы да н н ых.
При словарном порядке сорти ровки А считается и денти ч н ы м а,
и та кое п оведе н и е я вл я ется обы ч н ы м для бол ь ш и нства СУБД.
Одна ко в некоторых СУБД адм и н и страто р м ожет в случае не­
обходи мости и з м е н ить да н ную настрой ку. (Это может о казаться
пол ез н ы м , есл и в базе да н н ых содержится м ного текстовых за­
п исей на и н остра н но м я з ы ке.)
Суть в том , что есл и вам понадобится альтернати в н ы й порядок
сорти ровки, его н ел ьзя будет дости ч ь посредство м обыч ного
п редложе н и я ORDER ВУ. Вам п р и дется обратиться к адм и н и стра­
тору базы да н н ых.
46 УРОК з. С о рти ровка полученн ых да н н ых

Резюме
Этот урок был посвящен сортировке результатов запроса с по­
мощью предложения ORDER ВУ инструкции SELECT. Данное пред­
ложение, которое должно быть последним в инструкции SELECT,
можно применять для сортировки строк по одному или нескольким
столбцам.
УРОК 4

Ф и 11ьтраци я да н н ых

На этом уроке вы узнаете, как использовать предложение WHERE


инструкции SELECT для задания условий фильтрации строк .

Исn оnьзов ание


n реАJJожения WНERE
В таблицах: баз данных о.,бычно содержится очень много информа­
ции, и довольно редко возникает необходимость извлекать все строки
из таблицы. Гораздо чаще требуется извлечь какую-то часть данных
для последующей обработки или составления отчетов. В этом случае
необходимо указать критерий отбора, также называемый условием
фильтрации.
В инструкции SELECT данные фильтруются путем указания кри­
терия отбора в предложении WHERE. Это предложение указывается
сразу после названия таблицы (в предложении FROM) следующим
образом.

ВВОА Т
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

Анап и э т
Приведенная инструкция извлекает два столбца из таблицы то­
варов, но возвращает не все строки, а только те, значение в столбце
prod_pri ce которых равно 3 . 4 9.
48 УРОК 4. Фил ьтра ция дан н ых

ВЫВОА Т
prod_name prod_price

Fish bean bag toy 3.49


Bird bean bag toy 3.49
Rabbit bean bag toy 3.49

В данном примере используется простая проверка на равенство:


сначала проверяется, содержится ли в столбце указанное значение, а
затем данные фильтруются соответствующим образом. Однако SQL
позволяет выполнять не только проверку на равенство.

СОВЕТ: скопько нyneii?


В ы пол н я я п ри меры дан ного урока , вы обна ружите, что ч исло­
вые резул ьтаты отоб ража ются в разных форматах: з. 49, з. 490,
З. 4900 и т. п . Подобное поведе н и е зависит от кон кретной СУБД и
от того, ка кие форм аты да н н ых в н е й п р и м е н я ются. Та к что, есл и
в а ш и резул ьтаты чуть отл и ч а ются от п р и веде н н ых в кн и ге , н е
пережива йте. В кон це кон цов, з . 4 9 и З . 4900 - это одно и то же.

СОВЕТ: фипьтрация в SQL и в nрипожении


Да н н ы е могут та кже фил ьтроваться на уро в не п р ил оже н и я . Для
этого и н струкция SELECT первоначал ь н о извлекает бол ь ш е
да н н ых, ч ем необход и м о для кл и ентского п р ил оже н и я , а затем
кл и ентски й код обрабаты вает получ е н н ы е да н н ы е для отбора
тол ько нужн ых строк.
Как правило, та кой м етод н е п р и в етствуется . Базы да н н ых опти­
м из и рова н ы дл я быстрой и эффекти вной фил ьтра ц и и . Заста вля я
кл и ентское п р иложе н и е в ы пол н ять фун кци и б а з ы да н н ых, в ы
знач ител ь н о ухудшаете его п роизводител ьность, а та кже затруд­
н я ете его корректное масштаби рова н ие. Кром е того, есл и да н ­
н ы е фил ьтруются на стороне кл иента , сер вер отп равляет ненуж­
н ы е да н н ы е по сети , тем са м ы м увел и ч и вая сетевой трафи к.

П РЕДУП РЕЖДЕН И Е : nопожение nреД11 ожения WНERE


П р и испол ьзова н и и обоих п редложе н и й , ORDER ВУ и WHERE, убе­
дитесь, что п редложе н и е ORDER ВУ следует за п редложе н и е м
WHERE, и н а ч е воз н и кнет о ш и бка (см . у р о к 3).
О пе рато р ы в п ре дло же н и и WHERE 49

Операторы в n реАJJожен и и WНERE


В первом предложении WHERE, которое мы рассмотрели, вы­
полнялась проверка на равенство, т.е . определялось, содержится
ли в столбце указанное значение. В SQL поддерживается целый
набор условных (логических) операторов, которые перечислены в
табл. 4. 1.

ТАБЛИ ЦА 4.1. Операторы в предложении WНERE

Оператор П роверка

Равенство
<> Неравенство
!= Неравенство
< М е н ьше
<= Мен ьше и л и равно
!< Не мен ьше
> Бол ьше
>= Бол ьше и л и равно
!> Не бол ьше
BE TWEEN Вхожден и е в диа пазон
I S NULL Значение NULL

П Р ЕДУП Р ЕЖДЕН И Е: совместимость оnераторов


Некоторые из операторов, п р и веде н н ы х в табл. 4.1, избыточ н ы .
Нап р и мер, <> - это то же самое, что и ! =. П р и м е н е н и е опера­
тора ! < ( н е м е н ьше чем) дает тот же резул ьтат, что и >= (бол ьше
и л и равно). Одн а ко учтите: не все из этих операторов п оддер­
живаются все м и СУБД . Обратитесь к документа ц и и своей СУБД,
чтобы узнать, ка кие логические операторы она поддержи вает.

Сравнение с одиночным значением


Мы уже рассмотрели пример проверки на равенство. Теперь п о­
знакомимся с другими операторами.
В первом примере выводятся названия товаров, стоимость кото ­
рых не превышает 1 О долларов.
50 УРОК 4. Фильтра ция д а н н ы х

SELECT prod_name, prod_price


FROM Products
WHERE prod_price < 10;

Вывод т
prod_name prod_price

Fish bean bag toy 3. 49


Bird bean bag toy 3.49
Rabbit bean bag toy 3. 49
8 inch teddy bear 5. 99
12 inch teddy bear 8.99
Raggedy Ann 4. 99
King doll 9.49
Queen doll 9. 49

В следующей инструкции извлекаются все товары , которые стоят


1Одолларов или меньше (результат будет таким же, как и в предыду­
щем примере, так как в базе данных нет товаров, которые стоили бы
ровно 1 0 долларов).

SELECT prod_name, prod_price


FROM Products
WHERE prod_price <= 10;

Проверка на неравенство
В следующем примере выводятся все товары , не изготовленные
фирмой DLLOl.

SELECT vend_id, prod_price


FROM Products
WHERE vend id <> 'DLL01';
Операторы в предложении WHERE 51

Вывод -.
veщi_id prod_name

BRSOl 8 inch teddy bear


BRSOl 12 inch teddy bear
BRSOl 18 inch teddy bear
FNGOl King doll
FNGOl Queen doll

СОВЕТ: коrА& 11сnо11ьэовать кавычки


Если вы в н и м ательно и зуч ите в ы раже н и я в п редыдущих п редло­
жен и ях WHERE, то заметите, что некоторые значен и я за i<люче н ы
в оди н а р н ы е ка в ы ч ки , а н екоторые - нет. Оди н а р н ы е ка в ы ч ки
служат для оп ределе н и я гра н и ц строки. П р и сравнен и и з н аче­
ния со столбцо м , содержащ и м строковые да н н ые, необходи­
м о за ключать строку в ка в ы ч ки . При использо ва н и и ч и словых
столбцов ка в ы ч ки н е нужн ы .

Ниже приведен тот же пример, только здесь уже используется


оператор ! вместо <>.
=

Ввод -.
SELECT vend_id, prod_price
FROM Products
WHERE vend id != 'DLLOl ';

П РЕДУП Р ЕЖДЕН И Е: оnератор ! = 111111 <>


Оп ерато р ы ! и <> обычно вза и моза м е ня е м ы . Одна ко не во
=

всех СУБД п оддержива ются обе фор м ы о п ератора. Н а п ри мер,


в M icrosoft Access поддерживается оператор <> и н е п оддержи­
вается ! Если у вас воз н и кли сом н е н и я по п оводу своей СУБД,
=.

обратитесь к документа ц и и .

Сравнение с диапазоном значений


Для сравнения с диапазоном значений можно использовать опера­
тор BETWEEN. Его синтаксис немного отличается от других операто­
ров в предложении WHERE, так как для него требуются два значения:
52 УРОК 4. Фил ьтра ция да н н ых

начальное и конечное. Например, данный оператор можно исполь­


зовать для поиска товаров, цена которых находится в промежутке
между 5 и 1 О долларами, или всех дат, которые попадают в диапазон
между указанными начальной и конечной датами.
В следующем примере демонстрируется применение оператора
BETWEEN для извлечения всех товаров, цена которых выше 5 и ниже
1 О долларов.

SELECT prod_name, prod_price


FROM Products
WEERE prod_price BETWEEN 5 AND 1 0 ;

prod_name prod_pr,ice

8 inch teddy bear 5. 9.9


12 inch teddy bear 8.99
King doll 9.49
Queen doll 9.49

Ана11из т
Как видно из приведенного примера, при использовании опера­
тора BETWEEN нужно указывать два значения: нижнюю и верхнюю
границы диапазона. Оба значения должны быть разделены ключе­
вым словом AND. При этом извлекаются все значения из диапазона,
включая те, что равны граничным значениям.

Проверка на отсутствие значения


После создания таблицы разработчик может указать, допустимо
ли, чтобы в отдельных ее столбцах не содержались никакие значе­
ния. Когда в столбце не содержится никакого значения, это значит,
что в нем содержится значение NULL.

NULL
Отсутств и е ка кого-либо значен и я , в отли ч и е от пол я , содержа­
щего о, пустую строку и ли п росто несколько п робело в .
Операторы в предложении WHER E 53

Чтобы проверить, содержит ли столбец значение NULL, нельзя


просто записать NULL. Для предложения WHERE предусмотрено спе­
=

циальное выражение, которое используется для проверки значений


NULL в столбцах: IS NULL. Синтаксис выглядит следующим образом.

ВВОА Т
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;

Эта инструкция возвращает список товаров без цены (поле


prod _p r i ce пустое, а не содержит цену О), а поскольку таковых
нет, никаких данных мы не получим. Однако в таблице Cus tome r s
есть столбцы с о значениями NULL -в столбце cu s t_ema i l будет
содержаться NULL, если не указан адрес электронной почты.

ВВОА Т
SELECT cust name
FROM Customers
WHERE cust email IS NULL;

ВЫВОА т
cust name

Kids Place
Tha Тоу Store

СОВ ЕТ: оnераторы, сnец11ф11чные AllЯ конкретной СУ&Д


Во м н о гих СУБД набор операторов расш и рен дополн итель н ы м и
фильтра м и . Обратитесь к документа ции своей СУБД за дополн и ­
тельной и нформацией.

СО В ЕТ: значения NULL 11 nроверк11 на неравенство


М ногие пользователи ожида ют, что п р и извлеч ени и строк, не со­
держащих задан ного значен ия, будут также возвращаться строки,
содержащие значение NULL. Одн а ко это не та к. Значе ние NULL
тра ктуется ка к неоп ределен ное, и СУБД не может в ы полн ить
п роверку та кого значения ни на равенство, ни на неравенство.
54 УРОК 4. Фильтрация да н н ых

Резюме
На этом уроке рассказывалось о том, как фильтровать возвращае­
мые данные с помощью предложения WHERE инструкции SELECT.
Вы узнали, как проверить данны е на равенство, неравенство, вхож­
дение в диапазон значений, а также на отсутствие значения {NULL).
УРОК 5

Расширенная
фи11ьтрация Аанных

На эmo"it уроке вы узнаете, как комбинировать предложения WHERE


для создания сложных условий отбора. Будет также продеАюн­
стрировано 12рlL\1енение операторов NOT и IN.

Комбинирование усnовий WНERE


Все предложения WHERE, представленные на уро ке 4, фильтру­
ют данные с использованием одного критерия. Чтобы создать более
сложные фильтры, можно использовать несколько усл ов и й WHERE.
Для этого предназначены операторы AND и OR.

Оператор
С п еци альное ключевое слово, используемое для объеди нения
или изменен и я услов и й в предложен и и WHERE.

Оператор AND
Чтобы отфильтровать данные по нескольким столбцам, необходи­
мо воспользоваться оператором AND для добавления условий в пред­
ложение WHERE. Вот как это делается.

Ввод т

SELECT prod_id, p rod_p rice, prod_name


FROM P roduct s
WHERE vend id = 'DLLOl' AND prod_p r i ce <=4;
56 УРОК 5� Расширенная фильтрация данных

Анапиз ..-
Посредством данного запроса извлекаются названия и цены всех
товаров, предлагаемых поставщиком DLLOl, с ценой 4 доллара и
меньше. Предложение WHERE в инструкции SELECT содержит два
условия, а оператор AND используется для их объединения. Опера­
тор AND заставляет СУБД возвращать только те строки, которые удо­
влетворяют всем перечисленным условиям. Если товар предлагает­
ся поставщиком DLLO 1, но стоит больше 4 долларов, он не попадет
в результаты запроса. Аналогично товары, которые стоят меньше

4 долларов и предлагаются иными поставщиками, также не будут


выведены. Результаты запроса будут такими.

ВЫВОА ..-
prod_id prod_price prod_name

BNBG02 3.4900 Bird bean bag toy


BNBGOl 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy

AND

Ключ евое слово, испол ьзуемое в предложен и и WHERE для того,


чтоб ы воз вращались тол ь ко те строки, которы е удовлетворя ют
всем указа н н ы м услов и я м .

В приведенном примере использовались два условия фильтра­


ции, объединенные оператором AND. Можно задавать и большее чис­
ло условий. Каждое из них должно отделяться оператором AND.

П РИ МЕЧАНИ Е: отсутствие nредпожения ORDERBY

Для эконом и и места в бол ьши нстве пр и меро в не указы вается


п редложен и е ORDER ВУ. Поэтому в пол н е возможно, что получен­
н ые ва м и результаты будут н е м ного отличаться от тех, что при­
ведены в кн и ге. Кол ич ество воз вращае м ых строк всегда будет
оди н а ков ы м , а вот их порядок может о казаться иным. Можете
доба влять предложен и е ORDER ВУ по своему усмотрен ию. Гла в­
ное, чтобы оно стояло посл е предложен и я WHERE.
Ком бинирование услов и й W H ER E 57

Оператор ОR
Действие оператора OR противоположно действию оператора
AND. Он заставляет СУБД извлекать только те строки, которые удо­
влетворяют хотя бы одному условию. В большинстве СУБД второе
условие даже не рассматривается в предложении WHERE, если вы­
полняется первое условие (в таком случае строка будет выведена не­
зависимо от второго условия).
·
Рассмотрим следующую инструкцию S ELECT.

Ввод т

SELECT p rod_name , prod_p r i ce


FROM Produc t s
WHERE vend i d = ' DLLOl ' O R vend i d = ' BRS O l ' ;

Анаnиз т

Посредством этого запроса извлекаются названия и цены всех


товаров, изготовленных одним из указанных поставщиков. Оператор
OR заставляет СУБД применять какое-то одно условие, а не оба сра­
зу. Если бы здесь использовался оператор AND, мы не получили бы
никаких данных. Результаты запроса будут такими.

Вывод т

p rod_name p rod_p r i ce

F i s h bean bag toy 3 . 4 900


B i rd bean bag toy 3 . 4 900
Rabb i t bean bag toy 3 . 4 900
8 inch teddy bea r 5 . 9900
12 i nch t eddy bear 8 . 9900
18 inch teddy bear 1 1 . 9900
Raggedy Ann 4 . 9900

OR

Ключевое слово, при м е н яемое в предложен и и WHERE дл я того,


чтобы возвращал и с ь все строки , удовлетворяющие любому и з
указа н н ых усл о в и й .
58 УРОК s. Расширенная фил ьтрация дан ных

По р ядок обра ботки операто р ов


Предложения WHERE могут содержать любое количество логиче­
ских операторов AND и OR. Комбинируя их, можно создавать слож­
ные фильтры.
Однако при комбинировании операторов AND и OR возникает
одна проблема. Рассмотрим прим.ер. Необходимо в ывести список
всех предлагаемых поставщиками DLLO l и BRSO l товаров, цена ко­
торых - 1 О долларов и выше. В следующей инструкции S E LE CT
используется комбинация операторов AND и OR для формирования
условия отбора строк.

Ввод �
SELECT prod_name , p rod_price
FROM Produ c t s
WHERE vend i d = ' DLL O l ' O R vend i d = ' BRS O l '
AND prod_pr i ce >= 10;

Вы вод �
prod_name p rod_pr i ce

F i s h bean bag t o y 3 . 4 90 0
Bird b e a n b a g t o y 3 . 4 90 0
Rabb i t b e a n b a g t o y 3 . 4 900
18 i n ch teddy bea r 1 1 . 9900
Raggedy Ann 4 . 9 90 0

Анаn из �
Взгляните н а результат. В четырех возвращаемых строках значат­
ся цены ниже 1 О долларов - очевидно, строки не были отфильтрова­
ны так, как надо. Что же произошло? Причина заключается в поряд­
ке обработки операторов. SQL (как и большинство других языков)
вначале обрабатывает логические операторы AND, а потом уже ло­ -

гические операторы OR. Когда СУБД встречает такое предложение


WHERE, она интерпретирует его так: извлечь все товары, которые
стоят 1 О долларов и больИlе и при это.м предлагаются поставщико.м
BRS O l , а также все товары, предлагаемые п оставщико�и DLL Ol,
Ко мбиниро в а н ие условий WH ERE 59

независимо от их цены . Другими словами, в с вязи с тем, что при­


оритет у логического оператора AND выше, были объединены не те
операторы.
Решение этой проблемы состоит в использовании скобок для точ"
ной группировки необходимых логических операторов. Рассмотрим
следующую инструкцию SELE C T и ее результаты.

Ввод т

SELECT prod_name , p rod_p r i ce


FROM Products
WHERE ( vend_i d = ' DLLO l ' OR vend_i d = ' BRS O l ' )
AND prod_p r i ce >= 10;

Вывод 'У

prod_name p rod_price

18 inch teddy bear 1 1 . 9900

Ана.n из т

Единственным различием между предыдущим запросом и этим


являются скобки, в которые заключены первые два условия пред­
ложения WHERE . Поскольку скобки имеют еще больший приоритет,
чем логические операторы AND и OR, СУБД вначале обрабатывает
условие OR в скобках. Соответственно, запрос будет пониматься так:
извлечь все товары, предлагае.;иые либо поставщиком DLL O l , либо
поставщико.м BRS O l, которые стоят 1 0 долларов и больше. Это
именно то, что нужно.

СОВ ЕТ: исnоnьзова ние скобок в nредпожен1111 WНERE

И сп ол ьзуя логические о п ераторы AND и OR в п р едложе н и и


WHERE, всегда вста вля йте с кобки , чтобы точ но с груп п и ровать
усл о в и я . Не пол а га йтесь на порядо к обработки no умол ча н и ю,
даже есл и он под разум евает н еобходи м ы й ва м резул ьтат. Тем
са м ы м в ы всегда будете застрахо ва н ы от н еожида н н осте й .
60 УРОК 5 . Расширенная фил ьтрация данных

Оператор IN
Оператор IN служит для указания диапазона условий, любое из
которых может быть выполнено. При этом значения, заключенные
в скобки, перечисляются через запятую. Рассмотрим следующий
пример.

Ввод 'У

SELECT p rod_name , prod_pr i ce


FROM Produc t s
WHERE vend_i d IN ( ' DLL O l ' , ' BRS O l ' )
ORDER ВУ prod_name

Вывод 'У

p rod_name p rod_p r i ce

1 2 i nch teddy bear 8 . 9 90 0


18 i n ch teddy bear 11 . 9900
8 i n ch teddy bear 5 . 9900
B i rd bean bag t o y 3 . 4 90 0
Fi s h b e a n b a g toy 3 . 4 900
Rabb i t bean bag toy 3 . 4 90 0
Raggedy Ann 4 . 9 90 0

Ана11из т

Инструкция SELECT извлекает все товары, предлагаемые постав­


щиками DLLO l и BRS O l . После оператора IN указан список значе­
ний через заПЯ'JУЮ, а весь список заключен в скобки.
Если вы думаете, что оператор IN выполняет ту же функцию, что
и OR, то будете совершенно правы. Следующий запрос равносилен
предыдущему.

Ввод 'У

SELECT p rod_name , prod_p r ice


FROM Product s
WHERE vend id = ' DLL O l ' OR ve nd i d = ' BRS O l '
ORDER ВУ p rod_name ;
Оператор N OT 61

Вывод •
p rod_name prod_p r i ce

12 i n ch t eddy bear 8 . 9900


1 8 i nch teddy bear 1 1 . 9900
8 i n ch t eddy be ar 5 . 9900
Bi rd bean bag t oy 3 . 4 900
Fi s h bean bag toy 3 . 4 900
Rabb i t bean bag t o y 3 . 4 900
Raggedy Ann 4 . 9 900

Зачем же нужен оператор I N? Его преимущества таковы .

...., При работе с дли н ными списками необходимых значений


синтаксис логического оператора I N гораздо понятнее .
...., При использовании оператора I N совместно с операторами
AND и OR гораздо легче управлять порядком обработки .
....,. Операторы I N почти всегда быстрее обрабатываются, чем
списки операторов OR (впрочем, это сложно заметить в слу­
чае коротких списков) .
....,. Самое большое преимущество логического оператора IN за­
ключается в том, что в нем может содержаться еще одна ин­
струкция SELECT, а это позволяет создавать очень гибю1е пред­
ложения WНERE. Подробнее об этом рассказывается на уроке 1 1 .

IN

Кл ючевое слово, испол ьзуемое в п редложен и и WHERE для указа­


н и я с п и с ка з н а че н и й , обра баты вае м ых та к же, ка к это дел а ется
в случ а е п р и менен и я о п ератора OR.

Оператор NOT
Логический оператор NOT в предложении WHE RE служит только
одной цели - отрицать все условия, следующие за ним. Поскольку
он никогда не используется сам по себе (а только вместе с другими
логическими операторами), его синтаксис немного отличается . Опе­
ратор NOT вставляется перед названием столбца, значения которого
Н)'"'АС НО отфильтровать, а не после.
62 У РО К 5 . Расширенная фил ьтрация дан ных

NОТ

Кл юч евое слово, п р и м е н я е м ое в п редложе н и и WHERE для отри ­


ца н ия ка ко го-л и бо усл о в и я .

В следующем примере демонстрируется применение логическо­


го оператора NOT. Здесь извлекается список товаров, предлагаемых
всеми поставщиками, кроме DLL O l .

Ввод. т

SELECT p rod_name
FROM Product s
WHERE NOT vend id = ' DLLO l '
ORDER ВУ prod_name ;

Вывод. т

prod_name

12 i nch teddy be a r
18 i nch teddy bear
8 i nch teddy bear
K i ng do l l
Queen do l l

Анаnиз т

Логический оператор NOT отрицает условие, следующее за ним.


Поэтому СУБД извлекает не те значения vend id, которые совпада­
_

ют с DLL O l , а все остальные.


Предыдущий запрос можно было бы записать при помощи опе­
ратора <>.

Ввод •
SELECT prod_name
FROM Produ c t s
WHERE vend i d <> ' DLL O l '
ORDER ВУ p r od_name ;
Резюме 63

Вывод �
prod_name

1 2 i n ch teddy bear
1 8 i n ch t eddy bear
8 inch teddy be a r
King do l l
Queen do l l

Анапиз �
Зачем же использовать логический оператор NOT? Конечно, для
таких простых предложений WHERE , которые здесь рассмотрены;
он не обязателен. Его преимущества проявляются в более сложных
условиях. Например, для нахождения всех строк, которые не совпа­
дают со списком критериев, можно использовать логический опера­
тор NOT в связке с оператором IN.

П РИ М ЕЧАН И Е: оnератор NОТ в MarlaDB

В M a ria DB операто р NOT испол ьзуется тол ь ко для отр и ца н и я опе­


раторов IN, BETWEEN и EX I S T S . Это отл и чается от бол ь ш и н ства
СУБД, которые до пуска ют п ри м е н ен и е да н н о го о п ератора дл я
отри ца н и я л юбых усл о в и й .

Резюме
На этом уроке вы узнали, как использовать логические операторы
AND и OR в предложениях WHERE . Было также показано, как управ­
лять порядком обработки операторов и как применять операторы IN
и NОТ.
УРОК 6

Ф и п ьтраци я
с и с n оп ь зова н ие м
метаси м воп ов

На этом уроке вы узнаете, что такое метасимволы, как их исполь­


зовать и выполнять поиск с применением метасимволев и логическо­
го оператора L IКE для фильтрации извлекаемых данных.

Исn оп ьз ован ие оператора LIКE


Все предыдущие операторы, которые мы рассмотрели, выпол­
няли фильтрацию по известным значениям. Они искали совпаде­
ния по одному или нескольким значениям, осуществляли проверку
"больше-меньше" или проверку на вхождение в диапазон значений.
При этом везде отыскивалось известное значение.
Однако фильтрация данных таким способо� не всегда работает.
Например, как бы вы искали товары, в названии которых содержат­
ся слова Ь еап bag? Этого нельзя сделать в простых операциях срав­
нения, и здесь на помощь приходит поиск с использованием мета­
символов. Благодаря метасимволам можно создавать расширенные
условия отбора строк. В данном примере, для того чтобы найти все
товары, в названии которых содержатся слова Ьеап bag, необходимо
составить шаблон поиска, позволяющий найти текст Ьеап bag в лю­
бом месте названия товара.

Метасимвопы
Специал ьные сим вол ы , п р и меняемые для поиска части зн ачения.
66 УРОК 6. Фил ьтра ция с использованием метасим волов

Wабпон поиска
Усло ви е отбора стро к, состоя щее из текста , м етаси м волов и лю­
бой их ком б и н а ци и .

Метасимволы сами п о себе являются специальными знаками,


которые особым образом трактуются в условии WHERE. В SQL под­
держиваются метасимволы нескольких типов. Чтобы использовать
метасимволы в условиях отбора строк, необходимо задействовать
ключевое слово L I KE . Оно сообщает СУБД о том, что следующий
шаблон поиска необходимо анализировать с учетом метасимволов, а
не искать точные совпадения.

ПреАикат
Когда оператор не я в ляется оператором? Когда он я вля ется пре­
д икатом , зада ющим разм е р м ножества п роверяемых значен и й .
Технически LIКE -это п реди кат, а не о п е ратор . Сутъ операции
остается той же, п росто н е пуга йтесь этого тер м и н а , если встре­
тите его в документа ц и и по SQL.

Поиск с использованием метасимволов может осуществляться


только в текстовых полях (строках). Метасимволы нельзя применять
при поиске нетекстовых полей.

Метасимвол "знак пр о ц ента " {%)


Наиболее часто используемый метасимвол - знак процента (%).
В шаблоне поиска знак % означает найти все вхожден ия любого сим ­
вола. Например, чтобы найти все товары, названия которых начина­
ются со слова Fi sh, можно выполнить следующий запрос.

SELECT prod_id, prod_name


FROM Products
WHERE prod_name L I KE ' Fish % ' ;
Использова ние оператора LIKE 67

Вывод т
prod_id prod_name

BNBGO l F i s h bean bag t o y

Анализ т
В этом примере используется шаблон поиска ' Fish% ' . При про­
верке данного условия возвращаются все значения, которые начина­
ются с символов Fi sh. Знак % заставляет СУБД принимать все сим­
волы после слова Fish независимо от их количества.

П Р И М ЕЧ АН И Е: метасимво11ы в Microsoft Access


П р и работе в M ic rosoft Access необход и м о испол ьзовать с и м ­
вол * в место % .

П РИ М ЕЧАН И Е: чувствите11ьность к реrистру символов


В за в и с и м ости от СУБД и ее кон ф и гура ц и и операции поиска
могут быть чувств ител ь н ы к реrистру с и м волов . В таком случае
з н а ч е н и е Fish bean bag t oy не будет соответствовать усл о в и ю
' fish% ' .

Метасимволы могут встречаться в любом месте шаблона поис­


ка, причем в неограниченном количестве. В следующем примере ис­
пользуются два метасимвола, по одному на обоих концах шаблона.

Ввод т
SELECT prod_i d , prod_name
FROM Produ c t s
WHERE prod_name L I KE ' %bean bag% ' ;

Вывод т
prod_id prod_name

BNВGO l F i s h bean bag t o y


BNВG02 B i rd bean bag toy
ВNВGО З Rabb i t bean bag toy
68 УРОК 6. Фил ьтрация с использованием метасим волов

Анаnиз т
Шаблон ' %bean bag% ' означает найти все значения, содержа­
щие текст Ьеап bag в любом месте названия, независимо от коли­
чества символов перед указанным текстом или после н его.
Метасим вол м ожет находиться в шаблоне поиска, хотя это редко
бывает полезны м . В следующе м прим ере выполняется поиск всех
товаров, названия которых начинаются на F и заканчиваются на у.

SELECT prod_name
FROM Produ c t s
WHERE prod_name L I KE ' F% y ' ;

СОВ ЕТ: поиск фраrментов аАресов эnектронной почты


Это ка к раз та ситуа ц и я , в которой м етас и м в ол ы оказ ы ваются
очен ь п олез н ы м и в середин е поискового ш а бл о н а , н а п ри мер
WHERE email LIKE ' b% @ forta . сот ' .

Важно отм етить, что, пом им о соответствия одному или несколь­


ким символам , знак % также означает отсутствие сим волов в указан­
ном месте поискового шаблона.

П Р И М ЕЧ А Н И Е : сnеАите за замыкающими про6еnами


М н огие СУБД, в кл ючая Microsoft Access, запол н я ют содержи мое
поля п робел а м и . Н а п ри м е р , есл и стол бец рассч ита н на 50 с и м ­
волов, а в него вста влен текст Fish bean b a g t o y (17 с и м во·
лов), то , чтобы запол н ить стол бец, в него м огут б ыть доба вле н ы
еще 3 3 п робел а . О б ы ч н о это не вл и я ет н а отображе н и е дан н ых,
но может негати в н о сказаться н а рассмотрен ном в ы ш е S Q L·
зап росе. По усл о в и ю WHERE prod_name LIKE ' F% y ' будут н а й ·
ден ы тол ь ко т е значен и я prod_name , кото р ы е н а ч и н а ются н а
F и зака н ч и в а ются н а у. Есл и значение доп ол нено п робел а м и ,
о н о не будет зака н ч и ваться на у и строка Fish bean b a g toy
не будет и з влечена. Одн и м из п ростых решен и й м ожет б ыть до­
бавл е н и е второго с и м вола % в шаблон поиска : ' F%y% ' , п осле
чего будут уч иты ваться л юбые с и м вол ы (в том ч исле п робел ы )
после буквы у. Но луч ше "отсечь" п робел ы с п о м о щ ь ю функци й ,
кото р ы е рассматри в а ются н а уро ке 8.
Ис пол ьзова н и е опера т ора LIKE 69

П РЕДУП Р ЕЖДЕН И Е : следите за значениями NULL


М ожет показаться , будто метасим вол % соответствует чему угод­
но, но есть одн о искл ючение: NULL. Даже усл о в и е в ида WHERE
prod_ name LIKE ' % ' не позвол ит отобрать стро ку, в которой в
поле назва н и я то вара содержится NULL.

Метасимвол "знак подчеркивания " (_)


Еще одним полезным метасимволом является знак подчеркива­
ния (_J. Он используется так же, как и знак %, но при этом учитыва­
ется не множество символов, а только один.

П Р И М ЕЧАН И Е : метасимвопы в DB2


М етаси м вол не поддержи вается в DB2.

П Р И М ЕЧАН И Е: метасимвопы в Microsoft Access


П р и работе в M ic rosoft Access испол ьзуйте с и м вол ? в место

Рассмотрим пример.

Ввод У
SELECT prod_i d , prod_name
FROM Produ c t s
WHERE prod_name L I KE ' inch teddy bear ' ;

П Р И М ЕЧ А Н И Е : следите за замыкающими nробепами


Как и в п редыдущем п р и мере, возможно, понадобится добав ить
мета си м вол % в ко нец шаблона, чтобы п р и мер работал .

Вывод У
prod_ i d prod_name

BNВ G 0 2 12 inch teddy bear


ВNВGО З 18 inch te ddy bear
70 УРОК 6. Фил ьтра ция с использованием метасим волов

Ана11из 'У
В шаблоне поиска этого предложения WHERE использованы два
метасимвола, после которых следует текст. В результате были ото­
браны только те строки, которые удовлетворяют условию: по двум
символам подчеркивания было найдено число 1 2 в первой строке и
1 8 - во второй. Товар 8 inch teddy bear не был отобран, так как
в шаблоне поиска требуется два совпадения, а не одно. Для сравне­
ния: в следующей инструкции SELECT используется метасимвол % ,
вследствие чего извлекаются три товара.

ВВОА 'У
SELECT p r o d_id , prod_name
FROM Produ c t s
WHERE prod_name L I КE ' % i nch teddy bear ' ;

prod_id prod_name

BNBGO l В inch t e ddy bear


BNBG02 1 2 inch t e ddy bear
BNBGO З 18 inch t eddy bear

В отличие от знака % , который подразумевает также отсутствие


символов, знак всегда означает один символ - не больше и не
меньше.

Метасимвол "квадратные скобки " ( [] )


Метасимвол "квадратные скобки" ( [ ] ) служит для указания на­
бора символов, каждый из которых должен совпадать с искомым зна­
чением, причем в точно указанном месте (в позиции метасимвола).

П РИ М ЕЧ А Н И Е: наборы не всеrАа nомерисиваются


В отли ч и е от оп иса н н ых ранее метасим воло в , использо в а н и е
квадратн ых скобок для созда н и я п ровероч н ы х наборов не
п оддерживается м ноги м и СУБД. Н аборы п оддержи в а ются в
M icrosoft Access и M i c rosoft SQL Server. Обратитесь к докумен­
та ц и и своей СУБД, чтобы о п ределить, поддерж и в а ются ли в ней
н а бо р ы .
Ис поль зова н и е оператора LIKE 71

Например, чтобы найти всех клиентов, имена которых начинают­


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

SELECT c u s t contact
FROM Cus tome r s
WHERE c u s t contact L I KE ' [ JМ ] % '
ORDER ВУ cust contact

ВЫВОА Т
cust contact

Jim Jon e s
John Smi th
Mi che l l e Green

Анапиз т
Условие WHERE в этой инструкции выглядит так: [ JM ] % ' .
'

В данном шаблоне поиска используются два разных метасимвола.


По выражению [ JМ] осуществляется поиск всех клиентов, имена ко­
торых начинаются на одну из указанных в скобках букв, но при этом
учитывается только один символ. Поэтому все имена длиннее одного
символа не будут извлечены. Благодаря метасимволу %, следующему
после [ JМ ] , выполняется поиск любого количества символов после
первой буквы, что и приводит к нужному результату.
Можно использовать метасимвол, обозначающий противоположное
действие: л.Например, в следующем примере возвращаются все име­
на, которые не начинаются с буквы J или М (в отличие от предыдущего
примера).

ВВОА Т
SELECT c u s t contact
FROM C u s t ome r s
WHERE c u s t contact L I KE ' [ л JМ ] % '
ORDER ВУ cust contact

П Р И М ЕЧАН И Е: инверсия наборов в Microsoft Access


Если в ы работаете в M icrosoft Access и требуется создать п ро­
тивополож н ы й набор, необходимо использовать с и м вол ! в ме­
сто поэтому указ ы ва йте [ ! JМ ] , а не [ л JМ ] .
л,
72 УРОК 6. Ф ил ьтра ци я с использова н и ем метас и м волов

Конечно, можно достичь того же результата, воспользовавшись


логическим оператором NOT . Единственным преимуществом сим­
вола является более простой синтаксис при наличии нескольких
л

условий WHERE.

SELECT cust contact


FROM C u s t ome r s
WHERE N O T cu s t c o n t a c t L I KE ' [ JМ ] % '
ORDER ВУ cust contact

Со веты по испоn ьз ова н и ю


метасимвоnов
Как видите, метасимволы в SQL - очень мощный механизм. Но
за эту мощь приходится платить: на поиск с использованием мета­
символов уходит больше времени, чем на любые другие виды по­
иска, которые рассматривались ранее. Ниже приведено несколько
советов по использованию метасимволов .

..,.. Не злоупотребляйте метасимволами. Если можно использо­


вать другой оператор поиска, задействуйте его .
..,.. При использовании метасимволов старайтесь по возможности
не вставлять их в начало шаблона поиска. Шаблоны, начина­
ющиеся с метасимволов, обрабатываются медленнее всего .
..,.. Внимательно следите за позицией метасимволов . Если они
находятся не на своем месте, будут извлечены не те данные.

Тем не менее следует сказать, что метасимволы очень важны и


полезны при поиске, - вы часто будете ими пользоваться.

Резюме
Н а этом уроке рассказывалось о том, что такое метасимволы и
как применять их в условиях WHERE. Теперь вы знаете, что метасим­
волы нужно использовать осторожно, не злоупотребляя ими.
УРОК 7
С оздан ие -

в ыч и с11 яем ых n о11 еи.

На этом уроке вы узнаете, что такое вычисляемые поля, как их соз­


давать и как применять псевдонимы для ссылки на т ак ие поля из
пр ил ожений.

Ч то та кое вычисл яем ые поnя


Данные, хранимые в таблицах базы данных, обычно бывают
представлены не в таком виде, который необходим в приложениях.
Вот несколько примеров .

..,. Вам необходимо отобразить поле, содержащее название ком­


пании и ее адрес, но эта информация находится в разных
столбцах таблицы .
..,. Город, штат и почтовый индекс хранятся в отдельных столб­
цах (как и должно быть), но для программы печати почтовых
наклеек эта информация нужна в одном корректно отформа­
тированном поле .
..,. Данные в столбце введены прописными и строчными буква­
ми, но в отчете необходимо использовать только прописные .
..,. В таблице с элементами заказа хранится цена каждого товара
и его количество, но не полная стоимость (цена одного товара,
умноженная на его количество). Чтобы распеч атать инвойс,
нужно вычислить полные цены .
..,. Вам нужно знать общую сумму, среднее значение или друтие
итоговые показатели, основанные на данны х , хранящихся в
таблице.

В каждом из этих примеров данные хранятся не в том виде, в


котором их необходимо предоставить приложению. В место того что­
бы извлекать данные, а затем переформатировать их в клиентском
74 УРОК 7 . Созда ние выч исляемых полей

приложении или отчете, лучше извлекать уже преобразованные, под­


считанные или отформатированные данные прямо из базы данных.
Именно здесь на помощь приходят вычисляемые поля. Вообще­
то, в таблицах базы данных никаких вычисляемых столбцов нет. Они
создаются на лету инструкцией SELECT.

Попе
По сути то же самое, что и столбец. В осн о в н о м эти тер м и н ы
вза и моза меняем ы , хотя столбцы табли ц о б ы ч н о н а з ы в а ют
столбца ми, а тер м и н поле ч а ще п р и м е н я ется по отношен и ю к
в ы ч исля е м ы м поля м .

Важно отметить, что только база данных "знает", какие столбцы


в инструкции SELECT являются реальными столбцами таблицы, а
какие - вычисляемыми полями. С точки зрения клиента (например,
пользовательского приложения) данные вычисляемого поля возвра­
щаются точно так же, как и данные из любого другого столбца.

П Р И М ЕЧАН И Е: КllИ8НТСКОе ИllИ серверное


форматирование?
М ногие п реобразо в а н и я и изменен и я форматов, кото р ы е могут
быть в ы полн е н ы посредством и н струкци й SQL, могут быть та кже
реализова н ы и клиентски м п ри ложе н и е м . Одн а ко, ка к п ра в и ло,
эти опера ц и и гораздо б ы стрее в ы полн я ются н а сер в е ре баз
да н н ых, ч е м на стороне кли ента .

Конкатенац ия попей
Чтобы продемонстрировать применение вычисляемых полей,
рассмотрим простой пример: создание заголовка, состоящего из двух
столбцов.
В таблице Vendors хранится название поставщика и его страны.
Предположим, необходимо создать отчет по поставщику и указать
его страну как часть его имени в виде имя ( страна ) .
В отчете должно быть одно значение, а данные в таблице хра­
нятся в двух столбцах: vend_name и vend_country. Кроме того,
значение vend_country необходимо заключить в скобки, которых
Кон катенация полей 75

нет в таблице базы данных. Инструкция SELECT, которая возвращает


имена поставщиков и адреса, довольно проста, но как создать комби­
нированное значение?

Конкатенация
Ком б и н и рова н и е значен и й (путем п рисоед и н е н и я их д руг к другу)
для получения одного "дли н ного" значен и я .

Для этого необходимо соединить два значения. В инструкции


S E L E C T можно выполнить конкатенацию двух столбцов при по­
мощи специального оператора. В зависимости от СУБД это может
быть знак "плюс" ( +) или две вертикальные черточки ( 1 1 ) В случае .

MySQL и MariaDB придется использовать специальную функцию.

П Р И М ЕЧАН И Е: оператор + ИllИ 1 1 ?


В Access и SQL Server для кон кате н а ц и и исп ользуется о п ера­
тор +. В DB2, O racle, PostgreSQL, SQ Lite и OpeпOffice Base под­
держи вается оператор 1 1 . За более подробной и н фо р м а цией
обратитесь к документа ц и и своей СУБД.

Ниже приведен пример использования оператора + (синтаксис,


принятый в большинстве СУБД).

ВВОА Т
SELECT vend name + ' ( ' + vend_country + ' ) '
FROM Vendors
ORDER ВУ vend_name ;

ВЫВОА Т

Bear Empor ium ( USA


Bears R Us ( USA
Do l l Hou s e I n c . ( USA
Fun and Game s ( Engl and
Furbal l I n c . ( USA
Joue t s et ours ( France

Ниже приведена та же инструкция, но с использованием опе­


ратора 1 1 .
76 УРОК 7. С о зда н и е вы ч исляем ых полей

Ввод� т
�ELECT vend_name 1 1 ' (' 1 1 vend_country 1 1 ') '
FROM Vendo r s
ORDER ВУ vend_name ;

В ь1 вод� т

Bear Emp o r i um ( USA


Bears R U s ( USA
Do l l Hou s e I n c . ( USA
Fun and Game s (England
Furb a l l I n c . ( USA
Jouet s et o u r s ( France

А вот эквивалентная инструкция для MySQL и MariaDB.

Ввод� т
SELECT Concat ( vend_name , ' (', vend_count r y , ' ) ' )
FROM Vendo r s
ORDER ВУ vend_name ;

Ана11 из т
В предыдущих инструкциях SELECT была выполнена конкатен а­
ция следующих элементов:

� имя, хранящееся в столбце vend_name;


� строка, содержащая пробел и открывающую круглую скобку;
� название страны, хранящееся в столбце vend_ count ry;
� строка, содержащая закрывающую круглую скобку.

Как видно из результатов запроса, инструкция SELECT возвра­


щает один столбец (вычисляемое поле), содержащий все четыре эле­
мента как одно целое.
Взгляните еще раз на результат, возвращаемый инструкцией
SELECT. Два столбца, объединенных в вычисляемое поле, дополне­
ны пробелами. Во многих базах данных (но не во всех) сохраненный
текст дополняется пробелами до ширины столбца. Чтобы получить
Ко н катенация полей 77

правильно отформатированные данные, необходимо убрать лишние


пробелы. Это можно сделать с помощью SQL-функции RTRIM ( ) .

SELECT RTRIM ( vend_name ) + ' (' + RTRIM (vend_coun t r y ) + ') '


FROM Vendo r s
ORDER ВУ vend_name ;

Bear Emp o r i um ( USA)


Bears R U:S ( USA)
Do l l Hou s e I n c . ( USA)
Fun and Game s ( England)
Furba l l I n c . ( USA)
Jou e t s e t ours ( France )

Ниже приведена та же самая инструкция, но с использованием


оператора 1 1 .

SELECT RTRIM (vend_name ) 1 1 ' (' 1 1 RТRIM (vend_country) 1 1 ') '


FROM Vendo r s
ORDER ВУ vend_name ;

Вывод т

Bear Emporium ( USA )


B e a r s R Us ( USA)
Do l l Hou s e I n c . (USA)
Fun and Game s (England)'
Furba l l I n c . ( USA)
Jou e t s e t ours ( France )

Ана11из т
Функция RTRIM ( ) отбрасывает все пробелы справа от указанно­
го значения. При использовании функции RTRIM ( ) каждый столбец
форматируется корректно.
78 УРОК 7. Создание выч исляемых п ол ей

П Р И М ЕЧАН И Е : функции семейства ТRIМ


В боль ш и н стве СУБД п оддержи вается н е только фун кция
RTRIM f) ( котора я , ка к м ы увидели , обрезает п ра вую часть стро­
ки), но также LTRIM ( ) ( которая удаляет левую часть строки) и
TRIM ( ) ( которая обрезает строку слева и с п рава).

Испол ьзование псевдонимов


Инструкция SELECT, которая использовалась для конкатенации
полей адреса, как видите, справилась со своей задачей. Но как же
называется новый вычисляемы й столбец? По правде говоря, никак.
Этого может быть достаточно, если вы просматриваете результаты
в программе тестирования SQL-запросов, однако столбец без назва­
ния нельзя использовать в клиентском приложении, так как клиент
не сможет к нему обратиться.
Для решения указанной проблемы в SQL бы ла включена под­
держка псевдонимов. Псевдоним - это альтернативное имя для
поля или значения. Псевдонимы присваиваются с помощью ключе­
вого слова AS. Рассмотрим сnедующую инструкцию SELECT.

SELECT RTRIM ( vend_name ) + ' (' + RTRIM ( vend_country ) + ' ) '


AS vend t i t l e
FROM Vendo r s
ORDER ВУ vend_name ;

ВЫВОА Т
vend t i t l e

B e a r Emp o rium ( USA )


B e a r s R Us ( USA)
Do l l Hou s e I n c . ( U SA)
Fun and Game s ( England)
Furbal l I n c . ( USA)
Jouet s e t o u r s ( France )

Ниже приведена та же инструкция, но с использованием опера­


тора 1 1 .
Кон катенация полей 79

Ввод� т
SELECT RTRIM ( vend_name ) 1 1 ' (' 1 1 RТRIM (vend_country) 1 1 ') '
AS ven d t i t l e
FROM Vendors
ORDER ВУ vend_name ;

А вот эквивалентная инструкция для MySQL и MariaDB .

Ввод� т
SELECT Goncat ( vend_name , ' (', vend_coun t r y , ' ) ' )
AS vend t i t l e
FROM Vendors
ORDER ВУ vend_name ;

Ана11 из т
Сама по себе эта инструкция SELECT ничем не отличается от
предыдущей, за исключением того, что после вычисляемого ноля
стоит выражение AS vend_t i t l e . Оно заставляет СУБД создать
вычисляемое поле с именем vend_ t i t l e . Как видите, результат
остается тем же, но столбец теперь называется vend_ ti t l e , и лю­
бое клиентское приложение может обращаться к нему по имени, как
если бы это бьm реальный столбец таблицы.

П РИ М ЕЧАН И Е : кпючевое спово AS часто RВJIR8TCR


нео&яэательным
Кл ючевое слово AS я вляется необязател ь н ы м во м ногих СУБД,
но его п р и менение сч итается обще п р и н ятой п р а ктико й .

СОВЕТ: друrие nрименения nсевдонимов


Псевдон и м ы м ожно испол ьзовать и по-другому. Часто о н и п р и ­
м е н я ются дл я переи менова н и я стол бца, есл и в реал ьном назва­
нии встреча ются недопусти м ые с и м вол ы ( н а п р и мер, п робел ы )
и л и есл и назва н и е сл и ш ком дл и н ное и трудноч итаемое.
80 УРОК 7 . Создание выч исляемы х полей

П РЕДУ П Р ЕЖДЕН И Е: имена псевдонимов


Псевдо н и м о м может служить ка к одно слово, так и цела я строка.
Есл и испол ьзуется строка , она должна быть за кл юч е н а в ка в ы ч ­
ки. В п р и н ци п е , поступать п одоб н ы м образом не рекомендует­
ся . М н о госл о в н ы е и м е н а , н есом н е н н о , удобнее ч итать, но о н и
созда ют м ножество п робл е м для кл иентских п р ил оже н и й . Та ки м
образо м , ч а ще всего псевдо н и м ы п р и м е н я ются для переи мено­
в а н и я м ногосл о в н ых назва н и й стол бцов в односл о в н ы е .

П РИ М ЕЧАН И Е: nроиэводные сто.nбцы


Псевдо н и м ы и н о гда н а з ы в а ют п роизводн ы м и стол б ца м и , но,
неза в и с и м о от того, какой терм и н употребляется , означают они
одно и то же.

В ы n оn нен ие математически х
в ы чисnени й
Еще одним способом использования вычисляемых полей являет­
ся выполнение математических операций над извлеченными данны­
ми. Рассмотрим пример. В таблице Orders хранятся все полученные
заказы, а в таблице Orde r i tems списки товаров для каждого за­
-

каза. Следующий запрос извлекает все товары, относящиеся к заказу


с номером 2 0 0 0 8 .

Ввод т
SELECT prod_i d , quan t i t y , i tem_p r i c e
FROM Orde r i t ems
WHERE orde r nam = 20008;

Вывод т
prod_id qua n t i t y i tem_p r i c e
----------- ------------ -------------

RGANO l 5 4 . 9900
BR0 3 5 11 . 9900
BNBGO l 10 3 . 4900
BNBG0 2 10 3 . 4900
BNВG0 3 10 3 . 4900
В ы п ол н е н и е математически х в ы ч и слен и й 81

В столбце i t em_p r i c e содержится цена за единицу товара,


включенного в заказ. Чтобы узнать полную стоимость (цена за еди­
ницу, умноженная на количество товаров в заказе), необходимо мо­
дифицировать запрос следующим образом.

SELECT prod_i d ,
quant i t y ,
i tem_p r i c e
quant i t y * i tem_p r i c e AS expanded_p r i c e
FROM Orde r l t ems
WHERE o r de r nam = 2000 8 ;

ВЫ ВОА Т
prod_id qua n t i t y i tem_p r i c e expanded_p r i ce
-------- --------- ---------- ---------------

RGAN O l 5 4 . 9900 24 . 9500


BR0 3 5 11 . 9900 59 . 9500
BNBG O l 10 3 . 4900 34 . 9000
BNBG0 2 10 3 . 4 900 34 . 9000
BNBG0 3 10 3 . 4900 3 4 . 90 0 0

Ана11из т
Столбец expanded_price в данном случае является вычисляе­
мым полем. Вычисление было простым: quan t i t y * i tem_pr i c e.
Теперь клиентское приложение может использовать новый вычис­
ляемый столбец, как и любой другой в таблице.
В SQL поддерживаются основные математические операторы,
перечисленные в табл. 7 . 1 . Не забывайте, что для управления по­
рядком обработки операторов можно использовать круглые скобки
(см. урок 5).

ТАБЛ И ЦА 7.1. Математические операторы в SQL

Оператор Описание
+ Сложе н и е
В ы ч ита н и е
* Ум н оже н и е
/ Дел е н и е
82 УРОК 7. Создание выч исляемых полей

СО ВЕТ: как тестировать вычи сл яемые выражения


С помощью и н струкци и SELECT удобно экс п е р и м е нтировать с
разл и ч н ы м и фун кци я м и и в ы ч ислен и я м и . Обы ч н о эта и нструкция
п р и меняется дл я и з влечен и я да н н ых из табл и ц ы , одн а ко п ред­
ложение FROM м ожно п росто опустить и работать тол ь ко с в ы ра ­
жен и я м и , указа н н ы м и в с п и ске столбцов. Н а п р и мер, и нструкция
SELECT 3 * 2 ; вернет 6 , и н струкция SELECT Trim ( ' аЬс ' ) ;
вернет аЬс, а и н струкция SELECT Now ( ) ; испол ьзует фун кцию
Now ( ) для о п редел е н и я текущих даты и времен и .

Резюме
Н а этом уроке вы узнали, что такое вычисляемые поля и как их
создавать. Были рассмотрены примеры использования вычисляемых
полей для конкатенации строк и выполнения математических опера­
ций. Кроме того, было показано, как создавать и применять псевдо­
нимы, чтобы клиентское приложение могло обращаться к вычисляе­
мым полям.
УРОК 8

И с n о.nь зова н ие
фун к ций о бр а б от к и
А8Н Н ЫХ

На этом уроке вы узнаете, что такое функ ции, как ие типы функ ций
поддерживаются в СУБД, как применять функции и какие пробл ем ы
при этом могут возникать .

Ч то такое функц и я
Как и в большинстве других языков программирования, в SQL
поддерживается использование функций для работы с данными.
Функции - это операции, которые чаще всего приходится выпол­
нять над данными, включая различные преобразования и вычисления.
Примером может служить функция RTRIM ( ) , которую мы приме­
няли на предыдущем уроке для удаления пробелов в конце строки.

Пробле м ы с функ ция м и


Прежде чем переходить к примерам, обращаю ваше внимание на
то, что использование SQL-функций может быть проблематичным.
В отличие от инструкций SQL (например, S E LECT), которые в
основном поддерживаются всеми СУБД одинаково, в разных СУБД
могут применяться разные функции для одних и тех же целей. Лишь
некоторые функции в раз!!Iичных СУБД называются одинаково.
Общая функциональность доступна в каждой СУБД, но названия
функций и их синтаксис могут существенно отличаться. Чтобы ста­
ло понятно, насколько это может быть проблематичным, в табл. 8 . 1
приведены три наиболее часто возникающие задачи и названия соот­
ветствующих функций в различных СУБД.
84 УРОК s. Ис пол ьзова н и е функци й об ра б отки да н н ых

ТАБЛ И ЦА 8 . 1 . Разл и ч и я в названиях функций

Задача Си нтаксис

Выборка В Access испол ьзуется фун кция MID ( ) , в D B 2 ,


части строки O racle, PostgreSQ L и SQLite SUBSTR ( ) , в
-

MariaDB, MySQL и SQL Server SUBSTRING ( )


-

П реобразо в а н ие В Access и Oracle испол ьзуется н ескол ь ко фун к-


ти па да н н ых ц и й , по одной на кажд ы й ти п п реобразова н и я .
В DB2 и PostgreSQL испол ьзуется фун кция CAST ( ) ,
в MariaDB, MySQL и SQL Server - CONVERT ( )
П олуч е н и е В Access испол ьзуется фун кция NOW ( ) , в DB2
текущей даты и PostgreSQL CURRENT_DATE , в M a r i a D B и
-

MySQL -CURDATE ( ) ' в Oracle SYSDATE , в SQL


-

Server -GETDATE ( ) ' в SQLite DATE ( )


-

Как видите, в отличие от инструкций, SQL-функции не являются


переносимыми. Это означает, что код, который написан для одной
реализации SQL, может не работать в друтой.

Переносим ый код
Код, кото р ы й может работать в разных системах.

Ставя перед собой цель обеспечить переносимость кода, многие


SQL-программисты стараются не использовать зависящие от реали­
зации функции. В целом это довольно разумная позиция, но она не
всегда удачна с точки зрения производительности. Программисту
приходится искать другие способы выполнения того, что СУБД сде­
лала бы более эффективно.

СОВЕТ: стоит пи исnоnьэовать функции?


Реш е н и е за в и сит от вас, и здесь н ет п р а в ил ь ного ил и неп ра­
вильн о го выбора. Есл и в ы решили испол ьзовать фун кци и , до­
бавля йте подроб н ы е ком мента р и и к коду, чтобы в будущем в ы
(ил и другой разработч и к) смогл и понять, дл я ка кой реал иза ц и и
S Q L п и сался да н н ы й код.
П ри ме н е н и е функций 85

П ри ме нен ие фун кц ий
В большинстве реализаций SQL поддерживаются следующие
типы функций .

..,.. Текстовые функции. Используются для обработки текстовых


строк (например, для отсечения пробелов, или заполнения
строк пробелами, или преобразования символов в верхний
либо нижний регистр) .
..,.. Числовые функции. Используются для выполнения математи­
ческих операций над числовыми данными (таких, как возве­
дение в степень, извлечение корня и т.п.) .
..,.. Функции даты и времени. Используются для обработки значе­
ний даты и времени, а также для извлечения отдельных ком­
понентов этих значений (например, для определения разницы
между датами и проверки корректности даты) .
..,.. Системные функции. Возвращают информацию, специфич­
ную для конкретной СУБД (например, сведения об учетной
записи пользователя).

На предыдущем уроке нам встречалась функция, которая ис­


пользовалась в списке столбцов инструкции S E L E C T , но это до­
пустимо не для всех функций. Функции можно применять как в
других предложениях инструкции SELECT (например, в условии
WHERE), так и в других инструкциях SQL (об этом вы уз1;1аете на
следующих уроках).

Функци и для ра б оты с текстом


На предыдущем уроке функция RTRIM ( ) применялась для удале­
ния пробелов в конце значения столбца. Ниже приведен другой при­
мер, в котором используется функция UPPER ( ) .

Ввод т
SELECT vend_name , UPPER ( vend_name ) AS vend_name_upca s e
FROM Vendo r s
ORDER ВУ vehd_name ;
86 УРОК 8. И с пользова н и е функци й обработки да н н ы х

ВЫВОА Т
vend name vend_name_upca s e

Bear Empor i um B e a r Empor ium


Bears R U s Bears R Us
D o l l Hou s e I n c . Do l l Hou s e I n c .
Fun and Game s Fun and Game s
Furb a l l I n c . Furb a l l I n c .
Jouet s et ours Joue t s et ours

Анап из т
Функция UPPER ( ) преобразует символы в верхний регистр, поэ­
тому в данном примере имя каждого поставщика перечислено дваж­
ды: первый раз в том виде, в котором оно хранится в таблице Ven­
do r s , а второй раз - будучи преобразованным в верхний регистр,
в виде столбца vend name upca se.
_ _

В табл. 8.2 приведены наиболее часто используемые текстовые


функции.

ТАБЛ И ЦА 8 . 2 . Наиболее часто используемые текстовые


функции

Функция Описание
LEFT ( ) Воз в ра щает с и м вол ы и з левой части стро­
ки
LENGTH (а та кже Возвра щает дл и н у строки
DATALENGT H ( )
ил и LEN ( ) )
LOWER ( ) ( L C A S E ( ) П реобразует строку в н и ж н и й регистр
в Access)
L Т R IM ( ) Удал я ет п робел ы в левой части строки
RIGHT ( ) Возвра щает с и м вол ы из п равой части стро­
ки
RTRIM ( ) Удаля ет п робел ы в п ра в о й части строки
S OUNDEX ( ) Возвра щает значен ие S OUND E X строки
U P P E R ( ) (UC A S E ( ) П реобразует стр о ку в верхн и й регистр
в Access)
Применение фун кци й 87

Одна функция из табл. 8.2 требует более подробного объясне­


ния. SOUNDEX - это алгоритм, преобразующий текстовую строку
в буквенно-цифровой шаблон, описывающий фонетическое пред­
ставление данного текста. Функция S OUNDEX ( ) берет в расчет по­
хожие по звучанию буквы и слоги, позволяя сравнивать строки не по
тому, как они пишутся, а по тому, как они звучат. Несмотря на то что
SOUNDEX ( ) не соответствует основным концепциям SQL, большин­
ство СУБД поддерживает эту функцию.

П РИ М ЕЧАН И Е : nомержка функции SOUNDEX ( )


Фун кция SOUNDEX ( ) н е поддерживается в M ic rosoft Access и
PostgreSQL, п оэтому сл едующ и й п р и мер не будет работать в ука­
за н н ых СУБД.
Кроме того, она будет доступ на в SQLite, тол ь ко есл и п р и сбор ке
п риложе н и я был зада н параметр ком п ил я ц и и SQLI TE SOUNDEX.
_

А поскол ь ку по умол ч а н и ю да н н ы й пара метр не испол ьзуется ,


в бол ь ш и н стве реал изаци й SQ Lite фун кция S OUNDEX ( ) тоже н�
поддержи вается .

Ниже приведен пример использования функции SOUNDEX ( ) . Кли­


ент Kids Place находится в таблице Custorne r s , и его контактным
лицом является Miche l l e Green. Но что если это опечатка, и на
самом деле контактное лицо пишется как Michae l Green? Очевид­
но, поиск по корректному имени ничего не даст, как показано ниже.

SELECT cus t_name , c u s t_contact


FROM Custome r s
WHERE cu s t contact = ' Mi chael Green ' ;

cu s t name cu s t contact

А теперь попробуем выполнить поиск с помощью функции


SOUNDEX ( ) , чтобы найти все имена контактны х' лиц, которые звучат
как Mi chae l Green.
88 УРОК 8. И спол ьзова н и е ф ункци й обработки да н н ых

Ввои т
SELECT cus t_name , c u s t_contact
FROM Custome r s
WHERE SOUNDEX ( cu s t_conta c t ) = SOUNDEX ( ' Mi ch a e l Green ' ) ;

ВЫВОА Т
c u s t name cu s t contact

Kids P l ace Miche l l e Green

Ана11 иэ т
В данном примере в предложени и WHERE используется функция
SOUNDEX ( ) для преобразования значения столбца cu s t_contact
и искомой строки в их S ОUNDЕХ-значения. Поскольку M i c h a e l
Green и Miche l l e Green звучат схожим образом, их SОUNDЕХ­
значения совпадут и предложение WHERE корректно отфильтрует не­
обходимые данные.

Функ ц ии для работы с датой и временем


Значения даты и времени хранятся в таблицах с и спользованием
соответствующи х типов данных, которые в каждой СУБД свои. Бла­
годаря наличию специальных форматов эти значения можно быстро
отсортировать или отфильтровать, а кроме того, они занимают до­
статочно мало места на диске.
Формат, в котором хранятся значения даты и времени, обычно
нельзя использовать в приложениях, поэтому почти всегда приходит­
ся применять специальные функции для извлечения этих значений и
манипулирования ими. В результате такие функции являются одними
из наиболее важных в SQL. К сожалению, они наименее согласованы
и наименее совместимы в различных реализациях SQL.
Чтобы продемонстрировать применение этих функций, рассмо­
трим простой пример. В таблице Orde rs все заказы хранятся с датой
заказа. Чтобы и звлечь список всех заказов, сделанных в 20 1 2 году, в
SQL Server необходимо выполнить следующую инструкцию.
При менен и е функци й 89

Ввод •
SELECT o rder num
FROM Orde r s
WHERE DATEPART ( yy , o rde r_date ) 2012;

Вывод •
order num

20005
20006
20007
20008
20009

В Access инструкция будет такой.

В в од •
SELECT o rder num
FROM O r de r s
WHERE DATEPART ( ' yyyy ' , o rder_date ) 2012 ;

Анаnиэ •
В этом примере (в версиях для SQL Server и Access) применяется
функция DATE PART ( ) , которая, как видно из названия, возвращает
только фраrмент даты. У функции DATEPART ( ) два аргумента: фраг­
мент, подлежащий извлечению, и дата, из которой этот фрагмент
извлекается. В рассматриваемом примере функция DATE PART ( )
возвращает только год из столбца order date Путем сравнения
_ .

полученного значения со значением 2 О 1 2 предложение WHERE воз­


вращает только те заказы, которые бьmи сделаны в указанном году.
Ниже приведена версия данного примера для PostgreSQL, в кото­
рой и спользуется похожая функция DATE PART ( ) _ •

ВВОА •
SELECT order num
FROM Orde r s
WHERE DATE_PART ( ' ye a r ' , order_date ) 2012 ;
90 УРОК 8. И спользова н и е фун к ци й обработки да н н ых

В Oracle тоже нет функции DATEPART ( ) , но существует несколь­


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

ВВОА •
SELECT order num
FROM Orde r s
WHERE to nшnЬer ( to_char ( o rde r_da t e , ' УУУУ ' ) ) 2012 ;

Анаnиз •
В этом примере функция to _ char ( ) используется для извлече­
ния компонента даты, а функция to _numЬer ( ) - для преобразо­
вания полученного значения в числовой вид, чтобы его можно бьmо
сравнить со значением 2 О 1 2 .
Аналогичных результатов можно добиться с помощью оператора
BETWEEN.

ВВОА •
SELECT o rder num
FROM Orde r s
WHERE o rde r_date BETWEEN t o_dat e ( ' O l - 0 1 - 2 0 1 2 ' )
AND to_date ( ' 1 2 - 3 1 - 2 0 1 2 ' ) ;

Анаnиз •
В этом примере функция Oracle to _da te ( ) используется для
преобразования двух строк в даты. В одной строке задается дата
1 января 20 12 года, а в другой - 3 1 декабря 20 1 2 года. Стандарт­
ный оператор BETWEEN позволяет осуществить поиск всех заказов,
сделанных в период между этими двумя датами . Подобный код не
будет работать в SQL Server, так как в этой СУБД не поддерживается
функция t o_dat e ( ) . Однако если заменить функцию t o_dat e ( )
функцией DATEPART ( ) , данный синтаксис можно будет применять.
В MySQL и MariaDB имеются все функции работы с датами, за
исключением DATEPART ( ) . Пользователи этих СУБД могут приме­
нять функцию YEAR ( ) для извлечения номера года из даты.
П ри менен ие ф ункц и й 91

SELECT o r de r num
FROM Orde r s
WHERE YEAR ( o rde r_da t e ) 2012 ;

В SQLite формат инструкции чуть сложнее.

SELECT o r de r num
FROM Orde r s
WHERE s t r ftime ( ' %Y ' , o rde r_date ) 2012 ;

В этом примере извлекается только часть даты (год). Чтобы от­


фильтровать заказы по месяцу, необходимо сделать то же самое, до­
бавив ключевое слово AND для сравнения месяца и года.
Различные СУБД обычно могут выполнять гораздо больше дей­
ствий с датами. В большинстве из них имеются функции для сравне­
ния дат и выполнения арифметических операций с датами, а также
опции форматирования дат и многое другое. Но, как уже было пока­
зано, функции даты и времени сильно зависят от конкретной СУБД.
Обратитесь к документации своей СУБД и уточните, какие функции
работы с датой и временем в ней поддерживаются.

Функ ц и и для работы с числами


Числовые функции предназначены для обработки числовых дан­
ных. Они применяются в основном для выполнения алгебраических,
тригонометрических и геометрических вычислений, поэтому потреб­
ность в них возникает не так часто, как в строковых функциях или
функциях работы с датой и временем.
По иронии судьбы, в большинстве СУБД именно числовые функ­
ции наиболее стандартизированы. В табл. 8 . 3 приведены наиболее
часто используемые числовые функции.
92 УРОК 8. И спользова н ие фу н кций о б работки да н н ых

ТАБЛ И ЦА 8.3. Наиболее часто используемые ч исловые функции

Функция Что возвращается


ABS ( ) Модул ь ч и сла
cos () Коси н ус зада н н о го угл а
ЕХР ( ) Экспонента зада н н ого ч исл а
PI ( ) Ч и сло п

S IN ( ) Си нус зада н но го угл а


S QRT ( ) Квадратн ы й коре н ь зада н н ого ч и сла
TAN ( ) Та н генс зада н но го угла

Обратитесь к документации своей СУБД, чтобы узнать, какие


числовые функции она поддерживает.

Резюме
Н а этом уроке объяснялось, как применять SQL-функции, пред­
назначенные для обработки данных. Несмотря на то что они могут
быть весьма полезными при форматировании и фильтрации данных,
они весьма различны в разных реализациях SQL.
УРОК 9

Ито rовые в ычи сn ен и я

На этом уроке вы узнаете, что такое итоговые SQL-функции и как


их применять для обработки табличных данных.

Исn о11ьз ова ние ито rовых фун к ций


Часто бывает необходимо подвести итоги, н е отображая исходные
данные, и в SQL для этого предусмотрены специальные функции.
SQL-запросы с такими функциями часто используются для анализа
данных и создания отчетов. Примерами подобных запросов могут
служить:

..,_ подсчет числа строк в таблице (либо числа строк, которые


удовлетворяют какому-то условию или содержат определен­
ное значение);
..,_ определение суммы по набору строк в таблице;
..,_ поиск наибольшего, наименьшего и среднего значений в столб­
це таблицы (по всем или каким-то кон кретным строкам).

В каждом из этих примеров пользователю нужны итоговые свод­


ки по таблице, а не исходные данные. Поэтому извлечение данных из
таблицы было бы пустой тратой времени и ресурсов. Итак, все, что
вам нужно, - только итоговая информация.
Чтобы облегчить извлечение подобной информации, в SQL пред­
усмотрен набор из пяти итоговЬrх функций, которые приведены в
табл. 9 . 1 . Эти функции позволяют выполнять все варианты запросов,
которые были перечислены выше. В отличие от функций обработки
данных из предыдущего урока, итоговые функции поддерживаются
без особых изменений в большинстве реализаций SQL. ·
94 УРО К 9 . Итоговые выч ислен ия

Итоrовые функции
Функци и , обрабаты вающие набор строк дл я в ы ч и сл е н и я одного
обобщающего з н а ч е н и я .

ТАБЛ И ЦА 9.1. Итоговые фун кции в SQL

Функция Что возвращается


AVG ( ) Среднее з н а ч е н и е по стол бцу
C OUNT ( ) Ч исло строк в стол б це
МАХ ( ) На и бол ьшее з н а ч е н и е в стол б це
M IN ( ) Н а и мен ь шее з н а ч е н и е в стол бце
SUM ( ) Сум ма значен и й столб ца

Функция AVG ( )
Функция AVG ( ) предназначена для определения среднего значе­
ния по столбцу путем подсчета числа строк в таблице и суммирова­
ния их значений. Эту функцию можно применять для вычисления
среднего значения всех столбцов или же определенных столбцов
либо строк.
В первом примере функция AVG ( ) используется для нахождения
средней цены всех товаров в таблице Products.

В вод т
SELECT AVG (prod_p r i ce ) AS avg_p r i c e
FROM Product s ;

Вывод т
avg_p r i c e

6 . 823333

Ана11из т
Приведенная выше инструкция SELECT возвращает одно значе­
ние, avg_p r i ce, соответствующее средней цене всех товаров в та­
блице Products. Здесь avg_price это псевдоним (см. урок 7).
-
Использова ние итоговых фун кци й 95

Функцию AVG ( ) можно также применять для нахождения сред­


него значения по определенным столбцам или строкам. В следущем
примере возвращается средняя цена товаров, предлагаемых постав­
щиком DLL O l .

Ввод т
SELECT AVG ( prod_price ) AS avg_p r i c e
FROM Produ c t s
WHERE v e n d i d = ' DLL O l ' ;

Вывод т

avg_p r i ce

3 . 8 65 0

Анаnиз т
Эта инструкция отличается от предыдущей только тем, что в
ней содержится предложение WHERE . В соответствии с условием
WHERE выбираются только те товары, значение vend id для кото­
_

рых равно DLL O l , поэтому значение, полученное в столбце с псев­


донимом avg_p r i ce, является средни м только для товаров данно­
го поставщика.

П Р ЕДУП РЕЖДЕН И Е: TOllltKO OTA8111tHltl8 сто116цw


Фун кци ю AVG ( ) можно испол ьзовать тол ько для в ы ч и слен и я
средн е го значен и я кон кретного ч ислового столбца . И м я этого
столб ца должно б ыть указано в кач естве а р гумента фун к ц и и .
Чтобы определ ить среднее значение п о нескол ьки м столб ца м ,
необходимо испол ьзовать н ескол ько фун кци й AVG ( ) .

П РИ М ЕЧАН И Е: значения NULL


Строки столбца, содержа щие знач е н и я NULL, и гн о р и руются
фун кцией AVG ( ) .
96 УРОК 9. И тоговые в ы ч ислен и я

Функц ия COUNТ ( )
Функция C OUNT ( ) подсчитывает число строк. С ее помощью
можно узнать общее число строк в таблице или число строк, удо­
влетворяющих определенному критерию.
Эту функцию можно использовать двумя способами:

� в виде выражения COUNT ( * ) для подсчета числа строк в та­


блице независимо от того, содержат столбцы значения NULL
или нет;
� в виде выражения COUNT ( столбец) для подсчета числа
строк, которые имеют значения в указанных столбцах, при­
чем значения NULL игнорируются.

В первом примере возвращается общее число имен клиентов, со­


держащихся в таблице Custorne r s .

SELECT COUNT ( * ) A S num c u s t


FROM Custome r s ;

Вывод т
num cu s t

Ана11из т
В этом примере функция COUNT ( * ) используется для подсчета
всех строк независимо от их значений. Сумма возвращается в виде
столбца с псевдонимом nurn_ cus t.
В следующем примере подсчитываются только клиенты, имею­
щие адреса электронной почты.

Ввод т
SELECT COUNT ( cu s t_ema i l ) AS num cu s t
FROM Custome r s ;
И спол ьзова н и е итоговых функци й 97

ВЫВОА Т
пит cust

Анапиэ т
В этой инструкции функция COUNT ( ) испоцьзуется для подсчета
только строк, имеющих ненулевое значени е в столбце cus t_ema i l .
В данном случае число строк равно 3 (т.е. только 3 из 5 клиентов
имеют адрес электронной почты).

П Р И М ЕЧАНИЕ: значения NULL


Строки со значен и я м и NULL и гнори руются фун кцией COUNT ( ) ,
есл и указано и м я стол бца, и уч иты ваются , есл и испол ьзуется
звездочка ( * ) .

Функ ц ия МАХ ( )
Функция МАХ ( ) возвращает наибольшее значение в указанном
столбце. Для этой функции необходимо задать имя столбца, как по­
казано ниже.

ВВОА Т
SELECT МAX ( prod__p r i c e ) AS max_p r i ce
FROM Products ;

ВЫВОА Т
max_price

11 . 9900

Анапиэ т
Здесь функция МАХ ( ) возвращает цену самого дорогого товара в
таблице Produ c t s .
98 УРОК 9. Итоговые выч исления

СОВЕТ: исnо.nьзование функции МАХ ( ) с нечис.nовыми


А8ННЫМИ
Несмотря н а то что фун кция МАХ ( ) о б ы ч н о испол ьзуется для по­
и с ка наи бол ьшего ч и слового значен и я ил и дат ы , м ногие (но не
все) СУБД п озвол я ют п р и м е н ять ее для н ахожден и я н а и бол ьше­
го значен и я среди в сех столб цо в , в ключая текстовые. При ра­
боте с текстовы м и да н н ы м и фун кция МАХ ( ) возвра щает строку,
которая была бы последней , есл и б ы да н н ы е б ы л и отсорти рова­
ны по этому столбцу.

П Р И М ЕЧАН И Е : значения NULL


Строки со значен и я м и NULL и гн о р и руются фун кцией МАХ ( ) .

Функц ия МIN ( )
Функция MIN ( ) выполняет противоположное по отношению к
МАХ ( ) действие: она возвращает наименьшее значение в указанном
столбце. В качестве аргумента также требуется указать имя столбца.

Ввод� т
SELECT MIN ( p rod_p r i c e ) AS min_p r i c e
FROM Produ c t s ;

В ывод� т
m i n_p r i c e

3 . 4 900

Анаnиз т
Здесь функция MIN ( ) возвращает цену самого дешевого товара
в таблице Products .
Использова ние итоговых фун кци й 99

С О В ЕТ: исnо111оэование функции МIN ( ) с нечисповыми


данными
Несмотря на то что фун кция MIN ( ) о б ы ч н о испол ьзуется для по­
иска н а и меньшего ч ислового значен и я и л и даты , м ногие ( н о н е
все) СУБД позволяют п р и ме н ять ее для нахожден и я н а и м ен ь ш е­
го значения среди всех столбцов, в кл юч а я тексто в ы е. П р и ра­
боте с текстов ы м и д а н н ы м и фун кция MIN ( ) возвра щает строку,
которая была б ы первой , есл и бы да н н ы е был и отсо рти рова н ы
п о этому столбцу.

П Р И М ЕЧАН И Е: значения NULL


Строки со значен ия м и NULL и гнори руются фун кцией MIN ( ) .

Функ ц ия suм ( )
Функция SUМ ( ) возвращает сумму значений в указанном столбце.
Рассмотрим пример. В таблице Order ! tems содержатся элемен­
ты заказа, причем каждому элементу соответствует определенное ко­
личество, указанное в заказе. Общее число заказанных товаров (сум­
му всех значений столбца quantity) можно определить следующим
образом.

Ввод т
SELECT S UM ( quant i t y ) AS i t em o rde red
FROM Orde r ! tems
WHERE o rder item = 20005;

Вывод т
i tem o rde red

200
100 УРОК 9. Итоговые выч ислен и я

Анаnиз т
Функция SUM ( quan ti t у ) возвращает общее количество всех
элементов заказа, а предложение WHERE гарантирует, что будут учи­
тываться только товары из указанного заказа.
Функцию SUM ( ) можно также применять для подсчета вычис­
ляемых полей . В следующем примере общая стоимость заказа вы­
числяется путем суммирования выражений i tern_price * quanti ty
по каждому элементу.

Ввод� т
S E LECT SUМ ( i tem_p r i c e * quant i t y ) AS tota l_p r i c e
FROM Orde r i tems
WHERE orde r i tem = 2G005;

В ывод� т
t o t a l_p r i c e

1648 . 0000

Анаnиз т
Функция SUМ ( i tem_price * quanti ty) возвращает сумму всех
цен в заказе, а предложение WHERE гарантирует, что учитываться бу­
дут только товары из указанного заказа.

СОВ ЕТ: вычиспения с неско11ькими сто11бцами


Все ито говые фун кции позвол я ют в ы пол нять в ы ч исл е н и я над
нескол ь ки м и столбца м и с использо в а н и е м ста нда ртн ых м ате­
м атических опе раторов, ка к было показа но в да н н ом п р и м ере.

П Р И М ЕЧАН И Е: значения NULL


Строки со значен и я м и NULL и гнори руются фун кцией suм ( ) .
И тоговые в ыч исле н и я для у н и кал ь н ых зна ч е н и й 101

И то rов ые выч исnен ия


дпя у н и каn ь н ых значени й
Все пять итоговых функций могут быть использованы двумя
способами:

� для выполнения вычислений по всем строкам при наличии


ключевого слова ALL или без указания какого-либо аргумента
(так как ALL является аргументом по умолчанию);
� для выполнения вычислений по уникальным значениям при
наличии ключевого слова D I S T INCT.

СОВ ЕТ: арrумент ALL задан по умо11чанию


Кл ючевое слово ALL не обя зател ьно указы вать, та к ка к оно я в ­
ляется а р гументом п о умол ч а н и ю . Есл и не зада но кл ючевое сло­
во D I S T I NCT, то п одразумевается а р гумент ALL.

П Р И М ЕЧАН И Е: то11ько не в Access


M i c rosoft Access не поддержи вает и с п ол ьзова н и е кл ючевого
слова DI S T INCT в итоговых фун кци.ях, поэтому сл едующ и й п р и ­
м е р н е будет работать в Access. Для получен и я аналоги ч ного ре­
зультата в это й СУБД необход и м о создать в и н струкци и SELECT
COUNT ( * ) п одза п рос, возвраща ю щ и й ун и кал ь н ы е стро ки.

В следующем примере функция AVG ( ) используется для опреде­


ления средней цены товаров, предлагаемых заданным поставщиком.
Это такая же инструкция SELECT, как и та, что была рассмотрена
ранее, но теперь в ней указано ключевое слово DIST INCT - при вы­
числении среднего значения учитываются только уникальные цены.

Ввод, 'f
SELECT AVG ( DI S T INCT prod_p r i c e ) AS avg_p r i ce
FROM Produ c t s
WHERE vend i d = ' DLLO l ' ;
102 УРОК 9. Итоговые выч исления

Вывод т
avg_p r i c e

4 . 2400

Анаnиэ т
В этом прим ере вследствие наличия ключевого слова D I S T INCT
значение avg_price получается более высоким, так как в таблице
есть несколько товаров с одинаково низкой ценой. Не учитывая их,
мы получаем более высокую среднюю стои мость.

П РЕДУП РЕЖДЕН И Е: не исnо11ьзуйте кпючевое спово


DISTINCT с функцией COUNТ ( * )

Кл ючевое сл ово D I S T I NCT можно испол ьзовать с фун кцией


COUNT ( ) тол ь ко в том случае, есл и указано имя столбца. Е го
нельзя п р и менять с фун кцией COUNT ( * ) . Анало гич но, кл юче­
вое слово D I S T INCT должно стоять перед и менем столбца, а н е
п еред в ы ч и сляем ы м п олем ил и в ы раже н и е м .

СО В ЕТ: исnо11ьзование кпючевоrо спова DISTINCT


С функциями MIN ( ) И МАХ ( )
Н есм отря н а то что кл ючевое слово D I S T INCT разрешается ис­
п ол ьзовать с фун кци я м и MIN ( ) и МАХ ( ) , реал ьной необход и мо­
сти в этом нет. М и н и мал ь н ы е и м а кси мал ьные значен и я в стол б­
це будут тем и же, неза в и с и м о от того, уч иты в а ются ун и кал ь н ы е
значения ил и нет.

П Р И М ЕЧАН И Е : доnо11ните11ьные арrументы итоrовых


функций
П о м и м о ключевых сло в D I S T INCT и ALL, некоторые СУБД п од­
держ и в а ют допол н ител ь н ы е п реди каты , та кие ка к ТОР и ТОР
PERCENT, позвол я ющие в ы п ол н ять действия н ад п одм ножества­
ми результатов за п роса . Обратитесь к документа ц и и своей СУБД,
чтобы узнать, ка кие кл ючевые слова можно и с п ол ьзо вать.
Комбин ирова ние итоговых фун кци й 103

Ко м би ни рован ие
ито rовых фун кций
Во всех примерах применения итоговых функций, приведенных
до сих пор, использовалась только одна функция. Но в действитель­
ности инструкция SELECT может содержать столько итоговых функ­
ций, сколько нужно для запроса. Рассмотри м пример.

Ввод т
SELECT COUNT ( * ) AS num_i tems ,
MIN ( prod_p r i c e ) AS p r i ce_m i n ,
МAX ( prod_p r i c e ) AS p r i c e_max ,
AVG ( prod_p r i c e ) AS proce_avg
FROM Products ;

Вывод т
num i t ems p r i c e_min p r i c e_max p r i ce_avg

9 3 . 4900 1 1 . 9900 6 . 823333

Ана11 из т
В данном случае в одной инструкции SELECT используются сра­
зу четыре итоговые функции и возвращаются четыре значения (чис­
ло элементов в таблице Produ c t s , самая высокая, самая низкая и
средняя стоимость товаров).

П Р ЕДУП РЕ ЖД Е Н И Е: имена псевдон имов


При указа н и и псевдо н и мов дл я хранен и я резул ьтато в итого­
вой фун кци и ста ра йтесь не испол ьзовать реал ь н ые назва н и я
стол бцов в табл и це, поскол ьку в о м ногих реал изациях S Q L та­
кое поведе н и е не п р и ветствуется - будет выда н о сооб ще н и е
об о ш и бке.

Резюме
Итоговые функции предназначены для вычисления базовых ста­
тистических данных. В SQL поддерживаются пять таких функций,
104 УРОК 9 . И тогов ы е в ы ч ислен и я

каждая из которых м ожет и споль зоваться нескольким и способам и


для получен ия только необходи мых в данный момент ре зультатов.
Эти функции дост аточно эффективны и обычно возвращают резуль­
тат гораздо быстрее, чем если бы аналогичные вычисления выполня­
ли сь в клиентском приложении .
УРОК 10

Гру пп и р ов ка дан н ых

На этом уроке в ы узнаете, как группировать данные таким обра­


зом, чтобы можно было подводить итоги по п одмножеству запи­
сей таблицы. Для этого предназначены два предложен ия инструк­
ции SELECT: GROUP В У и НAVING.

При н ци п ы r руппи ровки да н н ых


На предыдущем уроке вы узнали, что итоговые функции SQL
можно применять для получения статистически х показателей. Это
позволяет подсчитывать число строк, вычислять суммы и средние
значения, а также определять наибольшее и наи меньшее значения,
не прибегая к извлечению всех данных.
Прежде все итоговые вычисления выполнялись над всеми дан­
ными таблицы или над данными, которые соответствовали условию
WHERE. В качестве напоминания приведем пример, в котором возвра­
щается количество товаров, предлагаемых поставщиком DLLO l .

Ввод т
SELECT COUNT ( * ) AS num_prods
FROM Produ c t s
WHERE vend i d ' DLL O l ' ;

Вы вод т
num_prods

Но что если вы хотите узнать количество товаров, предлагаемых


каждым поставщиком? Или выяснить, какие поставщики предлагают
только один товар или, наоборот, несколько товаров?
106 УРОК 10. Груп п и ро вка да н н ых ·

Именно в таких случаях нужно использовать группы . Группиров­


ка дает возможность разделить все данные на логические наборы,
благодаря чему становится возможным выполнение статистических
вычислений отдельно по каждой группе.

Со здан ие rpyn n
Группы создаются с помощью предложения GROUP ВУ инструк­
ции SELECT.
Лучше всего это можно продемонстрировать на конкретном
примере.

Ввод т
SELECT vend_i d , COUNT ( * ) AS num_prods
FROM Produ c t s
GROUP ВУ vend_i d ;

Вывод т
vend i d num_prods

BRS O l 3
DLL O l 4
FNG O l 2

Анап и з т
Данная инструкция SELECT выводит два столбца: vend_ id, со­
держащий идентификатор поставщика товара, и num_prods, со­
держащий вычисляемые поля (он создается с помощью функции
COUNT ( * ) ) . Предложение GROUP ВУ заставляет СУБД отсортировать
данные и сгруппировать их по столбцу vend_id. В результате значе­
ние num_prods будет вычисляться по одному разу для каждой груп­
пы записей vend_id, а не один раз для всей таблицы products. Как
видите, в результатах указывается, что поставщик BRS O l предлагает
три товара, поставщик DLLO l - четыре, а поставщик FNGO l - два.
Поскольку бьmо использовано предложение GROUP ВУ, не при­
шлось указывать каждую группу, для которой должны быгь выполнены
вычисления. Эrо бьmо сделано автоматически. Предложение GROUP ВУ
заставляет СУБД сначала группировать данные, а затем выполнять
вычисления по каждой группе, а не по всему набору результатов.
Созда ние груп п 107

Прежде чем применять предложение GROUP ВУ, ознакомьтесь с


важными правилами, которыми необходимо руководствоваться.

� В предложениях GROUP ВУ можно указывать произвольное


число столбцов . Это позволяет вкладывать группы одна в
другую, благодаря чему обеспечивается тщательный контроль
над тем, какие данные подлежат группировке.
� Если в предложении GROU P ВУ используются вложенные
группы, данные подытоживаются для последней указанной
группы. Другими словами, если задана группировка, вычис­
ления осуществляются для всех указанных столбцов (вы не
сможете получить данные для каждого отдельного столбца).
� Каждый столбец, указанный в предложении GROUP ВУ, должен
быть извлекаемым столбцом или выражением (но не итоговой
функцией). Если в инструкции SELECT используется какое­
то выражение, то же самое выражение должно быть указано
в предложении GROUP ВУ. Псевдонимы применять нельзя.
� В большинстве реализаций SQL нельзя указывать в пред­
ложении GROUP ВУ столбцы, в которых содержатся данные
переменной длины (например, текстовые поля или поля ком­
ментариев).
� За исключением инструкций, связанных с итоговыми вычис­
лениями, каждый столбец, упомянутый в инструкции SELECT,
должен быть представлен в предложении GROUP ВУ.
� Если столбец, по которому выполняется группировка, содер­
жит строку со значением NULL, оно будет трактоваться как от­
дельная группа. Если имеется несколько строк со значениями
NULL, они будут сгруппированы вместе.
� Предложение GROUP ВУ должно стоять после предложения
WHERE и перед предложением ORDER ВУ.

СОВЕТ: к.n ючевое спово ALL


В некоторых реал изациях SQL ( н а п р и мер, в M icrosoft SQL Server)
поддержи в ается необязател ьное кл ючевое слово ALL в п ред­
ложе н и и GROUP ВУ. Е го можно п р и мен ять дл я извлеч е н и я всех
груп п , даже тех, которые не и меют соответствую щих строк (в та­
ком случае итоговая фун кция возвра щает значение NULL). Обра­
титесь к документа ц и и своей СУБД, чтобы узнать, п оддержи вает
л и она кл ючевое слово ALL.
108 УРОК 10. Гру п п и ровка дан н ых

П Р ЕДУП РЕЖДЕ Н И Е : указание сто116цов по их


относитепьному по11ожению
Некоторые реал изаци и SQL позвол я ют указы вать столбцы в пред­
ложен и и GROUP ВУ по их положен и ю в сп иске и н струкци и SELECT.
Напри мер, в ы ражение GROUP ВУ 2 , 1 может означать груп п и ровку
по второму извлекаемому столбцу, а затем - по первому. И хотя
та кой сокраще н н ы й си нта ксис довольно удобен , он подцержи ва­
ется не всеми реал изация м и SQL. Его п р и менен и е также я вляет­
ся р искова н н ы м в том см ысле, что весьма в ысока вероятность
воз н и кновен ия ошибок п р и редакти рова н и и и н струкци й SQL.

Фиn ьтрация по rpynna м


SQL позволяет не только группировать данные с помощью пред­
ложения GROUP ВУ, но и осуществлять их фильтрацию, т.е. указы­
вать, какие группы должны быть включены в результаты запроса, а
какие - исключены из них. Например, вам может понадобиться спи­
сок клиентов, которые сделали хотя бы два заказ а. Чтобы получить
такие данные, необходим фильтр, относящийся к целой группе, а не
к отдельным строкам.
Вы уже знаете, как работает предложение WHERE (см. урок 4).
Однако в данном случае его нельзя использовать, поскольку условия
WHERE касаются строк, а не групп. Собственно говоря, предложение
WHERE "не знает", что такое группы.
Но что тогда следует применить вместо предложения WHERE?
В SQL предусмотрено другое предложение, подходящее для этих це­
лей: НAVING. Оно очень напоминает предложение WHERE. И действи­
тельно, все типы выражений в предложении WHERE, с которыми вы уже
знакомы, допустимы и в предложении HAVING. Единственная разни­
ца состоит в том, что WHERE фильтрует строки, а НAVING - группы.

СОВЕТ: предпожение НAVING поддерживает все


операторы предпожения WНERE
На уроках 4 и 5 было показа но, ка к п р и менять п редложе н и е
WHERE (вкл ючая испол ьзова н и е метас и м волов и логических опе­
раторов). Все эти метаси м вол ы и операто р ы п оддержи ва ются и
в п редл оже н и и НAVING. Си нта кс и с точ н о та кой же, отл и ч а ются
тол ь ко начал ь н ы е слова.
Фил ьтрация по груп пам 109

Как же осуществляется фильтрация по группам? Рассмотрим сле­


дующий пример.

Ввод� т
SELECT c u s t_i d , COUNT ( * } AS orde r s
FROM Orders
GROUP ВУ cust i d
НAVING COUNT ( * } >= 2;

Вывод� т
cust id o r de r s

1000000001 2

Ана11 из т
Первые три строки этого запроса напоминают и н струкцию
SELECT, рассмотренную ранее. Однако в последней строке появля­
ется предложение HAVING, которое фильтрует группы с помощью
выражения COUNT ( * ) >= 2 - два или больше заказов.
Как видите, предложение WHERE здесь не работает, поскольку
фильтрация основана на итоговом значении группы, а не на значени­
ях отобранных строк.

П Р И М ЕЧАН И Е : разница М8ИСАУ ПР8АJIОИС8НИЯМИ НAVING


И WНЕRЕ
Вот ка к это можно объя с н ить: п редложе н и е WHERE фил ьтрует
строки до того, ка к да н н ы е будут сгруп п и рова н ы , а п редл оже­
н и е HAVING - посл е то го, ка к да н н ы е были сгруп п и ро ва н ы . Это
важное разл и ч ие. Строки, котор ы е б ыл и искл ючен ы по усл о в и ю
WHERE , не войдут в груп пу, и н а ч е это могло бы измен ить в ы ч и с­
л я е м ы е значен и я , которые, в свою очередь, могл и бы повл и ять
на ф ил ьтра ц и ю груп п в п редложе н и и HAVING.

А теперь подумаем : возникает ли необходимость в использова­


нии как предложения WHERE, так и предложения HAVING в одной
инструкции? Конечно, возникает. Предположим, вы хотите усовер­
шенствовать фильтр предыдущей инструкции таким образом, чтобы
возвращались имена всех клиентов, которые сделали два или бо­
лее заказа за последн ие 1 2 месяцев. Чтобы добиться этого, можно
110 УРОК 10. Груп п иро в ка да н н ы х

добавить предложение WHERE, которое учитывает только заказы, сде­


ланные за последние 1 2 месяцев. Затем вы добавляете предложение
HAVING, чтобы отфильтровать только те группы, в которых имеются
минимум две строки.
Чтобы лучше разобраться в этом, рассмотрим следующий при­
мер, в котором перечисляются все поставщики, предлагающие не
менее двух товаров по цене 4 доллара и более за единицу.

SELECT vend_id , COUNT ( * ) AS num_prods


FROM Produ c t s
WHERE prod_p r i c e >= 4
GROUP ВУ vend i d
НAVING COUNT ( * ) >= 2;

vend i d num_prods

BRS O l 3
FNG O l 2

Анап и з �
Данный пример нуждается в пояснении . Первая строка пред­
ставляет собой основ н ую инструкцию S E L E C T ; использующую
итоговую функцию, - точ н о так же, как и в предыдущих примерах.
Предложение WHERE фильтрует все строки со зн ачениями в столбце
p rod_p:r: i ce не менее 4 . Затем данные группируются по столбцу
vend_ i d, после чего предложение HAVING фильтрует только груп­
пы, содержащие н е менее двух членов. При отсутствии предложения
WHERE бьша бы получен а лишняя строка (поставщик, предлагающий
четыре товара, каждый из которых дешевле 4 долларов), как показа­
но ниже.

SELECT vend i d , COUNT ( * ) AS num_prods


FROM Produ c t s
GROUP ВУ vend i d
HAVING COUNT ( * ) >= 2;
Груп пировка и сортировка 111

Вывод, т
vend i d num_prods

BRS O l 3
DLL O l 4
FNG O l 2

П РИ М ЕЧА Н И Е : исnо111оэование ПР8А11 0JК8НИЙ НAVING


И 'NНЕRЕ
П редложе н ие НAVING стол ь сил ь н о н а п о м и нает п редложен и е
WHERE, что в бол ь ш и н стве СУБД оно тра ктуется точ н о та к же,
есл и тол ько не указа н о п редложе н и е GROUP ВУ. Тем не менее
следует знать, что между н и м и существует раз н и ца . Испол ьзуйте
п редложе н и е НАVING тол ько в месте с п редложе н и е м GROUP ВУ,
а п р едл оже н и е WHERE для ста нда ртно й фил ьтра ц и и на уро в н е
-

строк.

Гру n n и ровка и с ортировка


Важно понимать, что предложения GROUP ВУ и ORDER ВУ суще­
ственно различаются, хотя с их помощью иногда можно добиться
одинаковых результатов. Разобраться в этом поможет табл. 1 0. 1 .

ТАБЛ И ЦА 10.1. Сравнение пр �дложений ORDER ВУ и GROUP ВУ

ORDER BY GROUP BY

Сорти рует п олуч е н н ы е ре- Груп п и рует стро к и . Одн а ко отобра­


зул ыаты жаем ы й резул ьтат может не соответ-
ствовать п о рядку груп п и ровки
М о гут б ыть испол ьзов а н ы л ю- М о гут б ыть испол ьзова н ы тол ько из­
бые стол бцы (даже не указан- влекаем ы е столбцы или в ы раже н и я ;
н ы е в п редложе н и и SELECT) должно быть указано каждое в ы ра-
жен и е и з п р едложе н и я SELECT
Н е я вл я ется необходи м ы м Требуется , есл и испол ьзуются столб­
ц ы (ил и в ы раже н и я ) с итого в ы м и
фун к ци я м и

Первое и з отличий, перечисленных в табл. 1 0. 1 , является очень


важным. Чаще всего вы обнаружите, что данные, сгруппированные
112 УРОК 10. Груп пировка да н н ых

с помощью предложения GROUP ВУ, будут отображаться в порядке


группировки. Но так будет не всегда, и в действительности этого не
требуется в спецификациях SQL. Более того, даже если СУБД сорти­
рует данные так, как указано в предложении GROUP ВУ, вам может
понадобиться отсортировать их по-другому. То, что вы группируете
данные определенным способом (чтобы получить для группы необ­
ходимые итоговые значения), не означает, что требуемый результат
должен быть отсортирован именно так. Следует явным образом ука­
зывать предложение ORDER ВУ, даже если о н о совпадает с предло­
жением GROUP ВУ.

СОВ ЕТ: не забывайте исnо.nьэовать nреА.11 о жение


ORDER ВУ
Ка к п р а в ил о , вся ки й раз, когда в ы испол ьзуете п редл оже н и е
GROUP В У , п риходится указы вать и п редложен ие ORDER В У . Это
еди нствен н ы й способ, га ра нти рующи й , что да н н ы е будут отсо­
рти рова н ы п ра вил ьно. Не следует надеяться на то, что да н н ые
будут отсорти рова н ы п редл ожением GROUP ВУ.

Чтобы продемонстрировать совместн ое использование пред­


ложений GROUP ВУ и ORDER ВУ, рассмотрим пример. Следующая
инструкция SELECT аналогична тем, которые использовались ранее:
она выводит номер заказа и количество товаров для всех заказов, ко­
торые содержат три товара или больше.

SELECT o rde r_num, COUNT ( * ) AS i tems


FROM Orde r i tems
GROUP ВУ orde r num
HAV I N G COUNT ( * ) >= 3 ;

Вы вод� т
order num i t ems
----------

20006 3
20007 5
20008 5
20009 3
Груп п и ровка и сортировка 113

Чтобы отсортировать результат по количеству заказанных то­


варов, все, что необходимо сделать, - это добавить предложение
ORDER ВУ, как показано ниже.

SELECT o rder_num, COUNT ( * ) AS i t ems


FROM Orde r i tems
GROUP ВУ orde r num
НAVING COUNT ( * ) >= 3 ;
ORDER ВУ i tems , o rder_num;

П Р И М ЕЧ А Н И Е : несовместимость с Access
M icrosoft Access не позволяет осуществлять сорти ров ку по псев­
дон и м а м , и для да н н о й СУБД этот п р и м е р н е п р и м е н и м . В ы ход
состоит в замене стол б ца items (в п редложен и и ORDER ВУ)
в ы ч исл я е м ы м в ы раже н и е м и л и номером п ол я . П о существу,
будут работать оба в а р и а нта: ORDER ВУ COUNT ( * ) , order num
И ORDER ВУ 1 , order_num.

ВЫВОА •
order num i t ems
----------
20006 3
20009 3
20007 5
20008 5

Анаnиз •
В этом примере предложение GROUP ВУ используется для груп­
пировки данных по номеру заказа (столбец o rde r_num), благода­
ря чему функция COUNT ( * ) может вернуть количество товаров в
каждом заказе. Предложение HAVING фильтрует данные таким об­
разом, что возвращаются только заказы с тремя и более товарами.
Наконец, результат сортируется за счет использования предложения
ORDER ВУ.
, 114 УРОК 10. Груп п и ро вка дан н ых

Пор Я АО К n редn ож ен и й
в инструкц ии SELECT
Предложения инструкции SELECT должны указываться в опреде­
ленном порядке. В табл. 1 0.2 перечислены все предложения, которые
мы изучили до сих пор, в порядке, в котором они должны следовать.

ТАБЛ И ЦА 10.2. П редложения инструкции SELEC'l'


и порядок их следования

П редложение Описание Необходимость


S E LECT Столбцы или в ы раже н и я , Да
которые должн ы б ыть по­
луч е н ы
FROM Табл и ца дл я извлеч е н и я Тол ько есл и извлека ют-
да н н ых ся да н н ы е и з табл и ц ы
WHERE Ф и л ьтра ц и я н а уро в н е Н ет
строк
GROUP ВУ Оп ределение груп п ы Тол ь ко есл и в ы пол н я -
ются ито го в ы е в ы ч ис­
л е н и я п о груп п а м
HAV ING Ф и л ьтра ц и я н а уро в н е Н ет
груп п
ORDER ВУ П орядок сорти ровки ре- Н ет
зул ыатов

Резюме
На. предыдущем уроке вы узнали, как применять итоговые функ­
ции SQL для выполнения сводных вычислений. На этом уроке рас­
сказывалось о том, как использовать предложение GROUP ВУ для
выполнения аналогичных вычислений по отношению к группам дан­
ных и получения отдельных результатов для каждой группы. Было
показано, как с помощью предложения НAVING осуществлять филь­
трацию на уровне групп. Кроме того, объяснялось, какова разница
меЖдУ предложениями ORDER ВУ и GROUP ВУ, а также между пред­
ложениями WHERE и НAVING.
УРОК 11

П о Аза n р о с ы

На этом уроке вы узнаете, что такое подзапросы и как их пр и­


менять.

Ч то такое подза про с ы


Инструкции SELECT - это запросы SQL. Все инструкции, с ко­
торыми мы имели дело до сих пор, представляли собой простые за­
просы: посредством отдельных инструкций извлекались данные из
определенных таблиц.

Запрос
Ка кая -л и бо и н струкция SQL. Одн а ко ч а ще всего этот терм и н ис­
пол ьзуют по отношен и ю к и н струкц и я м SELECT.

В SQL можно также создавать подзапрос ы : запросы, которые вло­


жены в другие запросы. Почему возникает необходимость в подза­
просах? Лучший способ объяснить эту концепцию - рассмотреть
несколько примеров.

П Р И М ЕЧАН И Е: nомержка в MySQL


Есл и вы работаете с MySQL, то учтите, что подза п росы п оддержи­
ва ются этой СУБД н а ч и н а я с верси и 4.1. В более ра н н их версиях
MySQL п р и меры из да н н о го урока работать н е будуr.

Фи11 ьт раци я с помощью


подза п росов
Таблицы баз данных, используемые во всех примерах книги, яв­
ляются реляционными (см. приложение А, в котором оп и сана �аж­
дая из таблиц). Заказы хранятся в двух: таблицах. Таблица Orders
116 УРОК 11. П одза п росы

содержит по одной строке для каждого заказа; в ней указываются но­


мер заказа, идентификатор клиента и дата заказа. Отдельные элемен­
ты заказов хранятся в таблице Orde r i tems . Таблица Orde r s не со­
держит информацию о клиентах. Она хранит только идентификатор
клиента. Информация о клиентах находится в таблице Custome r s .
Теперь предположим, что в ы хотите получить список всех кли­
ентов, которые заказали товар RGAN O l . Для этого необходимо вы­
полнить следующее:

1) извлечь номера всех заказов, содержащих товар RGAN O l ;


2 ) получить идентификаторы всех клиентов, которые сделали за­
казы, перечисленные на предыдущем шаге;
3) извлечь информацию обо всех клиентах, идентификаторы ко­
торых были получены на предыдущем шаге.

Каждый из этих пунктов можно выполнить в виде отдельного


запроса. Поступая так, вы используете результаты, возвращаемые
одной инструкцией SELECT, чтобы заполнить предложение WHERE
для следующей инструкции SELECT.
Но можно также воспользоваться подзапросами для того, чтобы
объединить все три запроса в одну-еди нственную инструкцию.
Первая инструкция SELECT извлекает столбец o rde r_ num для
всех элементов заказов, у которых в столбце p r o d i d значится
_

RGAN O l . Результа'l' представляет собой номера двух заказов, содер­


жащих данный товар.

SELECT order nurn


FROM Orde r i terns
WHERE prod_id = ' RGAN O l ' ;

ВЫВОА Т
o rder nurn

20007
20008

Следующий шаг состоит в получении идентификаторов клиен­


тов, связанных с заказами 2 0 0 0 7 и 2 0 0 0 8 . Используя предложение
IN, о котором говорилось на уроке 5 , можно создать показанную
ниже инструкцию SELECT.
Ф ил ьт р ация с помо щ ь ю подзап росов 117

SELECT cu s t i d
FROM Orde r s
WHERE o r de r num IN (20007 , 20008) ;

ВЫ ВОА Т
cu s t i d

1000000004
1000000005

Теперь объединим эти два запроса путем превращения первого из


них (того, который возвращает номера заказов) в подзапрос.

SELECT cu s t i d
FROM Orde r s
WHERE order num IN ( SELECT orde r_num
FROM Orde r i tems
WHERE prod_id = ' RGAN O l ' ) ;

cu s t i d

1000000004
1000000005

Анаn из т
Подзапросы всегда обрабатываются, начиная с самой внутренней
инструкции SELECT в направлении "изнутри наружу". При обработ­
ке предыдущей инструкции СУБД в действительности выполняет
две операции.
Вначале она выполняет следующий подзапрос:
S E L E C T o r de r_num FROM O r de r i tems WHERE p r o d_ i d= ' RGAN O l '

В результате возвращаются два номера заказа: 2 О О О 7 и 2 О О О 8 .


Эти два значения затем передаются в предложение WHERE внешнего
запроса в формате с разделителем в виде запятой, необходимом для
оператора IN. Теперь внешний запрос становится таким:
SELECT cust id FROM orders WHERE order num IN (20007 , 20008 )
118 УРОК 11. Подза просы

Как видите, результат корректен и является точно таким же, как


и полученный путем жесткого кодирования предложения WHERE в
предыдущем примере.

СОВЕТ: форматируйте SQL-эanpocы


И н струкци и SELECT, содержа щие подза п росы, м о гут о казаться
трудн ы м и для чте н и я и отладки, особе н н о есл и их сложность воз­
растает. Разб и е н и е зап росов на нескол ько стро к и в ы ра в н и ва­
н и е строк отступа м и , ка к показа но в рассматр и ваемых п р и ме­
рах, знач ител ьно обл е гчает работу с подзап роса м и .

Теперь у нас есть идентификаторы всех клиентов, заказавших


товар RGAN O l . Следующий шаг состоит в получении клиентской ин­
формации для каждого из этих идентификаторов. Инструкция SQL,
осуществляющая выборку двух столбцов, выглядит так.

ВВОА Т
SELECT cus t_name , c u s t_cont a c t
FROM Cu s t ome r s
WHERE c u s t_id I N ( ' 1000000004 ' , ' 1000000005 ' ) ;

Но вместо жесткого указания идентификаторов клиентов можно


превратить данное цредложение WHERE в подзапрос.

ВВОА Т
SELECT cus t_name , c u s t_contact
FROM Cu s t ome r s
WHERE c u s t i d I N ( SELECT c u s t_id
FROM Orde r s
WHERE o r d e r num IN ( SELECT o r de r_num
FROM Orde r i tems
WHERE prod_ i d =
' RGANO l ' ) ) ;

В ЬI ВОА Т
cust паше c u s t contact

Fun 4Al l Den i s e L . Stephens


The Т о у S t o r e Kim Howard
Испол ьзован и е подза п росов в качестве в ы ч исляем ых полей 119

Чтобы выполнить такой запрос, СУБД должна по сути обработать


три инструкции SELECT. Самый внутренний подзапрос возвращает
перечень номеров заказов, который затем используется как предло­
жение WHERE для подзапроса, внешнего по отношению к данному.
Эгот подзапрос возвращает перечень идентификаторов клиентов, ко­
торые используются в предложении WHERE запроса самого высокого
уровня. Запрос верхнего уров ня возвращает искомые данные.
Как видите, благодаря подзапросам можно создавать очень мощ­
ные и гибкие инструкции SQL. Не существует ограничений на число
подчиненных запросов, хотя на практике можно столкнуться с ощу­
тимым снижением производительности, которое подскажет вам, что
было использовано слишком много уровней подзапросов.

П РЕДУП РЕЖДЕН И Е: топько OAllH стоп6ец


И н струкци и SELECT в п одза п росах м о гут возвра щать тол ько
оди н столбец. Поп ытка извлеч ь нескол ь ко стол бцов п р и ведет к
поя влен и ю оообще н и я об о ш ибке.

П РЕДУП РЕЖДЕН И Е: no113anpocы 11 nрО113ВОА11Т8дЬНОСТЬ


П редста влен н ы е здесь п р и меры работают и п р и водят к достиже­
н и ю необходи м ых резул ьтатов . Одн а ко п одза п росы - не всегда
сам ы й эффекти в н ы й способ п олуч е н и я да н н ых такого т и п а . Бо­
лее подробно об этом рассказ ы вается на уроке 12, где повторно
будет рассмотрен тот же са м ы й п р и м ер.

Исnоnьзование n одза n росов


в качестве выч исnяем ых попе й
Другой способ использования подзапросов заключается в созда­
нии вычисляемых полей. Предположим, необходимо вывести общее
количество заказов, сделанных каждым клиентом из таблицы Cu s ­
tome r s (клиенты). Заказы хранятся в таблице Orde r s вместе с со­
ответствующими идентификаторами клиентов.
Чтобы выполнить эту операцию, необходимо сделать следующее:

1) извлечь список клиентов из таблицы Customers;


2) для каждого выбранного клиента подсчитать число его зака­
зов в таблице Orders.
120 УРОК 11. Подзапросы

Как объяснялось на предыдущих двух уроках, можно выполнить


инструкцию SELECT COUNT ( * ) для подсчета строк в таблице, а ис­
пользуя предложение WHERE для фильтрации идентификатора кон­
кретного клиента, можно подсчитать заказы только этого клиента.
Например, с помощью следующего запроса можно подсчитать коли­
чество заказов, сделанных клиентом 1 0 0 0 0 0 0 0 0 1 .

Ввод� т
SELECT COUNT ( * ) AS orde r s
FROM O r de r s
WHERE c u s t i d ' 1000000001 ' ;

Чтобы получить итоговую информацию посредством функции


COUNT ( * ) для каждого клиента, используйте выражение COUNT ( * )
как подзапрос. Рассмотрим следующий пример.

SELECT cus t_name ,


c u s t_s tate ,
( SELECT • COUNT ( * )
FROM Orde r s
WHERE Orde r s . cu s t i d C u s t ome r s . c u s t_ i d ) AS
orde r s
FROM C u s tome r s
ORDER В У cus t_name ;

c u s t n ame cust s t a t e o r de r s

Fun 4Al l IN 1
Fun 4Al l AZ 1
Kids P l ace он о
The Т о у Store IL 1
Vi l l age Toys MI 2

Анапиз т
Эта инструкция S E LE C T возвращает три столбца для каждо­
го клиента из таблицы Cus tome r s : c u s t_name, cu s t_ s t a t e и
o r de r s . Поле O r de r s является вычисляемым; оно формируется
Испол ь зование подза п росов в качестве вычисляемых полей 121

в результате выполнения подзапроса, который заключен в круглые


скобки. Подзапрос выполняется один раз для каждого выбранного
клиента. В приведенном примере подзапрос выполняется пять раз,
потому что были получены имена пяти клиентов.
Предложение WHERE в подзапросе несколько отличается от пред­
ложений WHERE, с которыми мы работали ранее, потому что в нем
используются полные имена столбцов. Следующее предложение тре­
бует от СУБД, чтобы было проведено сравнение значения cu s t_id
в таблице Orde r s с тем, которое в данный момент извлекается из
таблицы Cus tome r s .
WHERE O r de r s . cu s t i d = C u s t ome r s . c u s t i d

Подобный синтаксис - имя таблицы и имя столбца разделяются


точкой - должен применяться всякий раз, когда может возникнуть
неопределенность в именах столбцов. В данном примере имеются
два столбца cust_ id: один - в таблице Cus tomers, другой - в та­
блице Orde r s . Без использования полностью определенных имен
столбцов СУБД будет считать, что вы сравниваете поле c u s t_ id в
таблице Orde r s с самим собой. Поэтому следующий запрос будет
всегда возвращать общее число заказов в таблице Orde r s , а это не
тот результат, который нам нужен.
S E L E C T COUNT ( * ) FROM O r de r s WHERE c u s t i d cu s t i d

Ввод т
SELECT c u s t_name ,
c u s t_s tate ,
( SELECT COUNT ( * )
FROM >Orde r s
WHERE c u s t i d c u s t_i d ) A S orde r s
FROM Cu s t ome r s
ORDER ВУ cus t_name ;

Вывод т
cust n ame c u s t s tate orde r s
---------------- ----------

Fun 4All IN 5
Fun 4All AZ 5
Kids P l a c e он 5
The Т о у Store IL 5
Vi l l age Toys MI 5
122 УРОК 11. Подза просы

Подзапросы чрезвычайно полезны при создании инструкций


SELECT такого типа, однако внимательно следите за тем, чтобы были
правильно указаны неоднозначные имена столбцов.

П РЕДУП Р ЕЖДЕН И Е : nо.nностью оnреде.nенные имена


сто.nбцов
Вы тол ь ко что н а глядно убедил ись, почему та к важно ука з ы в ать
пол ностью о п редел е н н ы е и мена столбцов. Без доп ол н ител ь н ых
уточ н е н и й СУБД вернул а н е п р а в ил ь н ы е результаты , п отому что
не смогла п ра в и л ь н о и нтерп рети ровать в а ш и н а м е ре н и я . В н е­
которых случаях неоп ределе н н ость с назва н и я м и столбцов
способна даже п р и вести к п о я влен и ю сообщен и я об о ш и бке.
Это м ожет, н а п р и мер, п роизойти , есл и п редложен и е WHERE или
ORDER ВУ содержит имя стол бца, встречающееся в нескол ьких
табл и цах. Вот почему хорошей п ра ктикой я вл я ется указа н ие
пол н ость ю о п редел е н н ых и мен столбцов вся к и й раз, когда в и н ­
струкц и и SELECT п е реч ислено нескол ь ко табл и ц. Это п оз вол ит
избежать л юбых неоп редел е н н осте й .

СОВЕТ: nодааnросы н е всеrда яв.nяются оnтима.nьным


реwением
Несмотря на то что показа н н ы й здесь п р и м е р работоспособен,
зачастую он о ка з ы вается не са м ы м эффекти в н ы м с пособом из­
влеч е н и я да н н ых та кого ти п а . Мы еще раз рассмотри м этот п ри­
мер на одн о м из сл едую щих уроко в .

Резюм е
На этом уроке вы узнали, что такое подзапросы и как их приме­
нять. Чаще всего подзапросы используются в операторах IN предло­
жения WHERE, а также для заполнения вычисляемых столбцов. Были
· приведены примеры операций обоих типов.
УРОК 12

Объеди нен ие та бп и ц

На этом уроке вы узнаете, что такое объединения , для чего он и


нужны и как создавать инструкции SELECT, и спользующие объ е­
динения.

Ч то такое объеди нение


Одной и з ключевых особенностей SQL является возможность на
лету объединять таблицы при выполнении запросов, связанных с из­
влечением данных. Объединения - это самые мощные операции,
которые можно выполнить с помощью инструкции SELECT, поэтому
понимание объединений и их синтаксиса является важной частью
процесса изучения SQL.
Прежде чем вы сможете эффективно применять объединения,
следует разобраться, что такое реляционные таблицы и как проек­
тируются реляционные базы данных. В столь маленькой книге пол­
ностью осветить такую обширную тему не удастся, но нескольких
уроков будет вполне достаточно для того, чтобы вы смогли получить
общее представление.

Что такое реля ционные табл и цы


Понять, что представляют собой реляционные таблицы, поможет
пример из реальной жизни.
Предположим, определенная таблица базы данных содержит ка­
талог товаров, в котором для каждого элемента выделена одна стро­
ка. Информация, хранящаяся о каждом товаре, должна включать опи­
сание товара и его цену, а также сведения о компании, выпустившей
данный товар.
Теперь предположим, что в каталоге имеется целая группа то ва­
ров от одного поставщика. Где следует хранить информацию о по­
ставщике (такую, как название компании, адрес и контактная инфор­
мация)? Эти сведения не рекомендуется хранить вместе с данными о
товарах по нескольким причинам.
124 УРОК i2. Объединение табл и ц

... Информация о поставщике одна и т а ж е для всех его товаров.


Повторение этой информации для каждого товара приведет к
напрасной потере времени и места на диске .
... Если информация о поставщике изменяется (например, если
он переезжает или изменяется его почтовый код), вам придет­
ся обновить все записи о его товарах.
... Когда данные повторяются (а такое происходит, когда инфор­
мация о поставщике указывается для каждого товара), высока
вероятность того, что где-то данные будут введены с ошиб­
кой. Несовместимые данные очень трудно использовать при
создании отчетов.

Отсюда можно сделать вывод, что хранить множество экзем­


пляров одних и тех же данных крайне нежелательно. Именно этот
принцип и лежит в основе реляционных баз данных. Реляционные
таблицы разрабатываются таким образом, что вся информация рас­
пределяется по множеству таблиц, причем для данных каждого типа
создается отдельная таблица. Эти таблицы соотносятся (связывают­
ся) между собой через общие поля.
В нашем примере можно создать две таблицы: одну для хра­
-

нения информации о поставщике, другую - о его товарах. Таблица


Vendo r s содержит информацию о поставщиках, по одной строке
для каждого поставщика, с обязательным указанием его уникального
идентификатора. Это значение называется первичным ключом.
В таблице Products хранится только информация о товарах, но
нет никакой конкретной информации о поставщиках, за исключени­
ем их идентификаторов (первичного ключа таблицы Vendors). Этот
ключ связывает таблицу Vendo r s с таблицей Produ ct s . Благода­
ря применению идентификатора поставщика можно использовать
таблицу Vendors для поиска информации о соответствующем по­
ставщике.
Что это дает? Ниже указаны ключевые преимущества.

... Информация о поставщике никогда не повторяется, благодаря


чему экономится время, требуемое для заполнения базы дан­
ных, а также место на диске.
... Если информация о поставщике изменяется, достаточно об­
новить всего одну запись о нем, единственную в таблице
Vendo r s . Данные в связанных с нею таблицах изменять не
нужно.
Ч то такое объеди нение 125

... Поскольку никакие данные не повторяются, они, очевидно,


оказываются непротиворечивыми, благодаря чему составле­
ние отчетов значительно упрощается.

Таким образом, данные в реляционных таблицах хранятся доста­


точно эффективно, и ими легко манипулировать. Вот почему реляци­
онные базы данных масштабируются значительно лучше, чем базы
данных других типов.

Масштабирование
Возможность справляться со все возраста ющей нагрузкой без
сбое в. О хорошо сп роекти рова н н ых базах да н н ых ил и п риложе­
н и ях говорят, что о н и хоро шо ма с шта б и руются .

За ч ем нужны объединени я
Распределение данных по многим таблицам обеспечивает их бо­
лее эффективное хранение, упрощает обработку данных и повышает
масштабируемость базы данных в целом. Однако эти преимущества
не достигаются даром - за все приходится платить.
Если данные хранятся во многих таблицах, то как их извлечь с
помощью одной инструкции SELECT?
Ответ таков: посредством объединений. Объединение представля­
ет собой механизм слияния таблиц в инструкции SELECT. Используя
особый синтаксис, можно объединить несколько исходных таблиц в
одну общую, которая будет на лету связывать нужные строки из каж­
дой таблицы.

П Р И М ЕЧАН И Е : исnопьзование интерактивных


инструментов СУ&Д
Важно п о н и мать, что объед и н е н и е не я вл я ется физи ческой та­
бл и цей - други м и слова м и , оно не существует ка к реал ьная
табл и ца в базе да н н ых. Объед и нен и е создается СУБД по м е ре
необходи м ости и сохра н я ется тол ько на в ре м я вы пол не н и я
зап роса. М н огие СУБД п редла гают графи ч ески й и нтерфейс,
кото р ы й можно ис п ол ьзовать дл я и нтеракти вного оп ределе­
н и я связей табл и ц ы . Эти и н струм енты могут оказаться ч рез­
в ы ч а й н о полезн ы м и дл я поддержа н и я ссылоч ной целостности .
126 УРОК 12. Объеди нение табл и ц

П р и испол ьзова н и и рел я цион н ых табл и ц важно, чтобы в связа н ­


н ы е стол бцы заносились тол ько корректн ы е да н н ые. Вернемся
к н а шему п р и меру: есл и в табл и це Products хра н ится н едосто­
верн ы й идентиф и катор п оста в щ и ка , соответствующие тов а р ы
о кажутся н едоступ н ы м и , п оскол ьку о н и н е будут относиться н и
к одному п оста в щ и ку. Во и збежа н и е этого б а з а да н н ых должна
позвол ять пользовател ю в водить тол ько досто в е р н ы е значен и я
(т.е. та кие, котор ы е п редста влен ы в табл и це Vendo rs) в столбце
идентифи каторов поста в щ и ков в табл и це Produ c t s . Ссылоч н а я
целостность означает, что СУБД заста вляет пол ьзователя собл ю­
дать п ра в ила, обеспеч и вающие неп роти вореч и вость да н н ых.
И контрол ь этих п ра в ил часто обеспеч и вается бла года р я и нтер­
фейса м СУБД.

Со здание объединени я
Создание объединения - очень простая процедура. Нужно ука­
зать все таблицы, которые должны быть включены в объединение, а
также подсказать СУБД, как они должны быть связаны между собой.
Р ассмотрим следующий пример.

SELECT vend_name , prod_name , prod_p r i c e


FROM Vendo r s , Produ c t s
WHERE Vendo r s . vend i d P rodu c t s . vend_id ;

Вывод. т
vend name prod_name prod_pr i ce
---------------- -------------------- ----------

Do l l House I n c . F i s h bean bag toy 3 . 4900


Do l l Hou s e I n c . B i r d bean bag toy 3 . 4900
Do l l Hou s e I n c . Rabb i t bean bag toy 3 . 4900
Bears R Us 8 i n ch teddy bear 5 . 9900
Bears R U s 1 2 inch teddy bear 8 . 9900
Bears R U s 1 8 inch teddy bear 11 . 9900
Do l l House I n c . Raggedy Ann 4 . 9900
Fun and Game s King do l l 9 . 4900
F u n a n d Game s Queen do l l 9 . 4900
Создание объеди нения 127

Ана11из т
Инструкция SELECT начинается точно так же, как и все инструк­
ции, которые мы до сих пор рассматривали, - с указания столбцов,
которые должны быть извлечены. Ключевая разница состоит в том,
что два из указанных столбцов (prod name и prod_pr i ce) нахо­
_

дятся в одной таблице, а третий ( vend_name) - в другой.


Взгляните на предложение FROM. В отличие от предыдущих ин­
струкций SELECT, оно содержит две таблицы: Vendo r s и Prod­
ucts. Это имена двух таблиц, которые должны быть объединены в
данном запросе. Таблицы корректно объединяются в предложении
WHERE, которое заставляет СУБД связать идентификатор поставщика
vend_id из таблицы Vendors с полем vend_ id таблицы Products.
Обратите внимание на то, что эти столбцы указаны как Ve n ­
dor s . vend_ i d и Produ c t s . vend_id. Полностью определенные
имена необходимы здесь потому, что, если вы укажете только vend_
id, СУБД не сможет понять, на какие именно столбцы vend id вы _

ссылаетесь (их два, по одному в каждой таблице). Как видно из пред­


ставленных результатов, одна инструкция SELECT сумела извлечь
данные из двух разных таблиц.

П Р ЕДУП РЕЖДЕ Н И Е : nо11ностью оnред,е11енные имен а


сто116цов
Испол ьзуйте пол н остью о п редел е н н ы е и мена столб цов (в кото­
рых назва н и я табл и ц и столб цов разделя ются точ кой ) в с я к и й
р а з , когда может воз н и кнуть неоднозначность отн осител ь н о
того, н а какой столбец в ы ссылаетесь. В бол ь ш и н стве СУБД бу­
дет выдано сообще н и е об о ш и б ке, есл и вы введете неод нознач­
ное имя столбца, не о п редел и в е го пол ностью путем ук а за н и я
и м е н и табл и ц ы .

Важность предлож ения WНERE


Использование предложения WHERE для установлен и я связи
между таблицами может показаться странным, но на то есть весо­
мая причина. Вспомните: когда таблицы объединяются в инструкции
SELECT, отношение создается на лету. В определениях таблиц базы
данных ничего не говорится о том, как СУБД должна объединять их.
Вы должны указать это сами. Когда вы объединяете две таблицы,
128 УРОК 12. Объеди нение табл иц

то в действительности создаете пары, состоящие из каждой стро­


ки первой таблицы и каждой строки второй таблицы. Предложение
WHERE действует как фильтр, позволяющий включать в результат
только строки, которые соответствуют указанному условию филь­
трации - в данном случае условию объединения. Без предложения
WHERE каждая строка в первой таблице будет образовывать пару с
каждой строкой второй таблицы независимо от того, есть ли логика
в их объединении или нет.

Декартово nро11эвеАен11е
Результаты , возвращаем ы е п р и сл и я н и и табл и ц без указа н и я
условия объед и н е н и я . Кол и чество получ е н н ых строк будет равно
ч и слу строк в первой табл и це, ум н ожен ному на ч исл о строк во
второй табл и це.

Для того чтобы разобраться в этом, рассмотрим следующую ин­


струкцию SELECT и результат ее выполнения.

Ввод т
SELECT vend_name , prod_name , prod_p r i c e
FROM Vendo r s , Product s ;

Вывод т
vend name prod_name p r o d_p r i ce
--------------- -------------------- ----------

Bears R U s 8 inch teddy bear 5 . 99


Bears R U s 1 2 i n ch t e ddy bear 8 . 99
Bears R Us 1 8 i n ch t e ddy bear 1 1 . 99
Bears R U s Fish bean bag toy 3 . 49
Bears R U s B i rd b e a n bag t o y 3 . 49
Bears R Us Rabb i t bean bag toy 3.49
Bears R U s Raggedy Ann 4 . 99
Bears R U s K i n g do l l 9 . 49
Bears R U s Queen do l l 9 . 49
Bear Emp o r i um 8 i n ch teddy bear 5 . 99
Bear Emp o r ium 1 2 i n ch t e ddy bear 8 . 99
Bear Emp o r ium 1 8 i nch t eddy bear 11 . 99
Bear Emp o r i um F i s h bean bag toy 3.49
Bear Emp o r i um B i r d bean bag toy 3.49
Bear Emp o r i um Rabb i t bean bag toy 3 . 49
Создание объединения 129

Bear Emporium Raggedy Ann 4 . 99


Bear Emporium King do l l 9 . 49
Bear Emporium Quee n dol l 9 . 49
D o l l Hous e I n c . 8 inch teddy bear 5 . 99
Do l l Hou s e I n c . 1 2 i n ch teddy bear 8 . 99
D o l l Hou s e I n c . 1 8 i n ch t eddy bear 11 . 99
D o l l Hou s e I n c . F i s h bean bag toy 3 . 49
D o l l Hou s e I n c . B i rd bean bag toy 3 . 49
Do l l Hou s e I n c . Rabbi t bean bag t o y 3 . 49
D o l l Hou s e I n c . Raggedy Ann 4 . 99
Do l l Hou s e I n c . King do l l 9 . 49
Do il Hou s e I n c . Queen do l l 9.49
Furb a l l I n c . 8 inch teddy bear 5 . 99
Furb a l l I n c . 1 2 i n ch teddy bear 8 . 99
Furb a l l I n c . 1 8 inch teddy bear 11 . 99
Furba l l I n c . F i s h bean bag toy 3 . 49
Furba l l I n c . B i rd bean bag toy 3 . 49
Furb a l l I n c . Rabbi t bean bag toy 3 . 49
Furb a l l I n c . Raggedy Ann 4 . 99
Furb a l l I n c . King do l l 9 . 49
Furb a l l I n c . Queen do l l 9 . 49
Fun and Game s 8 inch teddy bear 5 . 99
Fun and Game s 1 2 inch t eddy bear 8 . 99
Fun and Game s 1 8 i n ch t eddy bear 11 . 99
Fun and Game s F i s h bean bag toy 3 . 49
Fun and Game s B i r d bean bag toy 3 . 49
Fun and Game s Rabb i t bean bag toy 3 . 49
Fun and Game s Raggedy Ann 4 . 99
Fun and Game s King do l l 9 . 49
Fun and Game s Queen do l l 9 . 49
Joue t s e t o u r s 8 i n c h teddy bear 5 . 99
Jouet s e t ours 1 2 i n ch teddy bear 8 . 99
Jouet s e t ours 18 i n ch teddy bear 11 . 99
Joue t s e t o u r s F i s h b e a n bag toy 3 . 49
Jouet s e t o u r s B i r d bean bag toy 3 . 49
Jouet s e t ours RabЬ i t bean bag toy 3 . 49
Joue t s et ours Raggedy Ann 4 . 99
Jouet s e t o u r s King do l l 9 . 49
Joue t s e t o u r s Q u e e n do l l 9 . 49

Ана11из т
Как видно из представленных результатов, декартов о произве-
дение вы, скорее всего, будете использовать очень редко . Данные,
полученные таким способом, ставят в соответствие каждому товару
130 УРОК 12. Объединение табл и ц

каждого поставщика, включая товары с указанием "не того" постав­


щика (и даже поставщиков, которые вообще не предлагают никаких
товаров).

П Р ЕДУП РЕЖДЕ Н И Е: не забудьте указать nредnо•ение


WНERE
П роверьте, в кл ю ч и л и л и вы в зап рос п редложен и е WHERE, и на­
че СУБД вернет н а м ного бол ьше да н н ых, ч е м вам нужно. Кроме
того, убедитесь в том , что п редложен и е WHERE сфо рмул и ровано
п равильно. Н екорректное усл о в и е фил ьтра ц и и п р и ведет к то му,
что СУБД в ыдаст неверные да н н ы е .

Перекрестное объединение
И ногда объеди н е н и е , которое возвра щает дека рто во п роизве­
ден ие, назы вают перекрестн ы м объед и н е н и е м .

В нутренние объединения
Объединение, которое мы до сих пор использовали, называется
объединением по равенству - оно основано на проверке равенства
записей двух таблиц. Объединение такого типа называют также вну­
тренним объединением. Для подобных объединений можно приме­
нять несколько иной синтаксис, явно указывающий на тип объеди­
нения. Следующая инструкция S E LE C T возвращает те же самые
данные, что и в предыдущем примере.

ВВОА Т
SELECT vend_name , prod_name , prod_p r i c e
FROM Vendo r s I NNER JO IN Produ c t s
O N Vendo r s . vend i d Product s . vend_i d ;

Ана.nиз т
Предложение SELECT здесь точно такое же, как и в предыдущем
случае, а вот предложение FROM другое. В данном запросе отноше­
ние между двумя таблицами определяется в предложен и и FROM,
Созда ние объеди нения 131

содержащем спецификацию INNER JOIN. При использовании тако­


го синтаксиса условие объединения задается с помощью специально­
го предложения ON, а не WHERE. Фактическое условие, указываемое в

предложении ON, то же самое, которое задавалось бы в предложение


WHERE.
Обратитесь к документации своей СУБД, чтобы узнать, какой
синтаксис предпочтительнее использовать.

П Р И М ЕЧАН И Е: "nравипьный" синтаксис


Согласно специ ф и ка ц и и ANSI SQL, п р едпочтителе н с и нта кси с
INNER JO IN. В т о ж е время бол ь ш и нство СУБД п оддержи вает
оба си нта ксиса. И зуч ите оба фор мата и п ри м е н я йте тот из н их,
кото р ы й кажется вам более удобн ы м .

Объединение нескол ьких табли ц


SQL не ограничивает число таблиц, которые могут быть объеди­
нены посредством инструкции SELECT. Основные правила созда­
ния объединения остаются теми же. Вначале перечисляются все та­
блицы, а затем определяются отношения между ними. Рассмотрим
пример.

Ввод т
SELECT prod_name , vend_name , prod_p r i c e , quan t i t y
FROM Orde r i tems , Product s , Vendor s
WHERE Product s . vend-i d = Vendo r s . vend-i d
AND Orde r i tems . prod_id Product s . prod_id
AND order num = 20007;

Вы вод т
prod_name vend name prod_price quantity
------------------- --------------- ---------- -------

18 inch teddy Ьеа r Bears R Us 11 . 9900 50


F i s h bean bag toy Doll House Inc . 3 . 4900 100
B i rd bean bag toy Dol l House Inc . 3 . 4900 100
RaЬbit Ьеаn bag toy Dol l House Inc . 3 . 4900 100
Raggedy Ann Dol l House Inc . 4 . 9900 50
132 УРОК 12. Объеди нен ие табл и ц

Анапиз т
В этом примере выводятся элементы заказа номер 2 О О О 7 . Все
они находятся в таблице Orde r i tems. Каждый элемент хранится в
соответствии с идентификатором, который ссылается на товар в та­
блице Produ c t s . Эти товары связаны с соответствующими постав­
щиками в таблице Vendors по идентификатору поставщика, который
хранится вместе с каждой записью о товаре. В предложении FROM
данного запроса перечисляются три таблицы, а предложение WHERE
определяет оба названных условия объединения. Дополнительное
условие служит для фильтрации только элементов заказа 2 О О О 7 .

П РЕДУП Р ЕЖДЕН И Е: к вопросу о nроиэводите11ьности


Все СУБД обрабаты вают объед и н е н и я д и н а м и ч ески , затрач и вая
время на обработку каждой указа н ной табл и ц ы . Этот п роцесс
может о казаться очень ресурсоем к и м , поэто му не следует ис­
пользовать объед и н е н и я табл и ц без особо й надобности. Че м
бол ь ш е табл и ц в ы объед и н я ете, те м н иже п ро и зводител ьность.

П Р ЕДУП РЕЖДЕ Н И Е: максима11ьное чиспо таб11и ц


в объединении
Несмотря н а то что SQL н е н а клады вает каких-л ибо огра н и ч е­
н и й на ч и сло табл и ц в объеди нен и и , м ногие СУБД на самом деле
и меют та кие огра н и чен и я . Обратитесь к документа ц и и своей
СУБД, чтобы узн ать, ка кие огра н и ч е н и я та кого рода она нала­
гает (есл и они есть).

Теперь самое время вернуться к примеру из урока 1 1 , в котором


инструкция SELECT возвращала список клиентов, заказавших товар
RGANO l .

SELECT c u s t name , cu s t contact


-
FROM cus tome r s
WHERE cu s t i d IN ( SE LECT cust i d
-
FROM Orde r s
WHERE order num IN ( SELECT order num
FROM O r de r i tems
WHERE prod id =
' RGANO l ' ) ) ;
Созда ние объединения 133

Анаnиз т
Как упоминалось на уроке 1 1 , подзапросы не всегда являются
самым эффективным способом выполнения сложных инструкций
SELECT, поэтому тот же самый запрос можно переписать с исполь­
зованием синтаксиса объединений.

Ввод т
SELECT cus t_narne , cust_contact
FROM C u s t ome r s , Orde r s , Orde r i t ems
WHERE C u s t ome r s . cu s t i d = Orde r s . cu s t i d
AND O rde r i tems . o rde r num Orde r s . o rde r num
AND prod_id = ' RGAN O l ' ;

Вывод т
cust name cu s t contact

Fun 4All Den i s e L . Stephe n s


The Т оу Store K i m Howard

Анаn из т
Как уже говорилось на уроке 1 1 , получение необходимых для
этого запроса данных требует обращения к трем таблицам. Однако
вместо подзапросов здесь были применены два объединения та­
блиц, а также указаны три условия WHERE . Первые два связывают
таблицы в объединение, а последнее фильтрует данные по товару
RGANO l .

СОВ ЕТ: эксnериментируйте


Ка к в идите, часто существует нескол ько способов в ы пол н е н и я
одн о го и того ж е SQL-зa п poca. И редко удается одн означно ска­
зать, ка кой из н их п р а в ил ь н ы й . П роизводител ьность может за­
в исеть от типа опера ци и , испол ьзуемой СУБД, кол и чества дан­
н ых в табл и цах, нал и ч и я л и бо отсутствия и ндексов и кл ючей , а
та кже цело го ряда других критериев. Сл едо вател ьно, зачастую
бы вает цел есообразно поэкспер и менти ровать с разл и ч н ы м и
ти п а м и зап росов дл я выяснен и я того, ка кой и з н и х работает б ы­
стрее.
134 УРОК 12. Объеди нение табл и ц

Рез юм е
Объединения - одно из самых важных и востребованных
средств SQL, но их эффективное применение возможно только на
основе знаний о струюуре реляционной базы данных. На этом уроке
вы ознакомились с основами построения баз данных, а также узнали,
как создавать объединение по равенству (называемое также внутрен­
ним объединением), которое используют чаще всего. На следующем
уроке вы научитесь создавать объединения других типов.
УРОК 13

Созда н ие
р а с w и р ен н ых
о бъеди нен и й

На этом уроке вы узнаете о дополнит ельных типах объ единений -


что они собой представляют и когда они нужны . В ы также узнае­
те, как применять псевдоним ы таблиц и использовать итоговые
функции со вм ест но с объ единен иями.

Ис п о11ьзов ание
п севдон и м ов таб11 и ц
На уроке 7 вы узнали, как использовать псевдонимы в качестве
ссылок на извлекаемые столбцы таблицы. Синтаксис псевдонимов
столбцов выглядит следующим образом.

Ввод 'f
SELECT RTRI M ( vend_name ) + ' ( ' + RTRIM (vend_coun t r y ) + ') '
AS vend t i t l e
FROM Vendo r s
ORDER В У vend_name ;

Псевдонимы можно применять не только для имен столбцов и


вычисляемых полей, но и вместо имен таблиц. На то есть две основ­
ные причины:

.... сокращение синтаксиса запросов;


.... возможность многоразового использования одной и той же
таблицы в инструкции SELECT.
136 УРОК 13. Созда ние расш и ренных объеди нен ий

Рассмотрим следующую инструкцию SELECT. В основном она


такая же, как и в примерах предыдущего урока, но здесь она моди­
фицирована с учетом псевдонимов.

Ввод� т
SELECT cus t_name , c u s t contact
FROM Cus tome rs AS С, Orde r s AS О, Orde r i t ems AS O I
WHERE C . cu s t i d = O . cust id
AND O I . order num = O . order num
AND prod_id = ' RGANO l ' ;

Анапиэ т
Заметьте, что все три таблицы в предложениях FROM имеют псев­
донимы. Например, выражение Customer s AS С задает С в качестве
псевдонима для таблицы Cu s t ome r s , что позволяет использовать
сокращение С вместо полного имени Customer.s . В данном приме­
ре псевдонимы таблиц указаны только в предложении WHERE, но их
можно применять и в других местах, например в списке извлекаемых
таблиц, в предложении ORDER ВУ, а также в любой другой части ин­
струкции SELECT.

СОВ ЕТ: в Oracle нет кn�очевоrо спова AS


Oracle не поддержи вает кл ючевое слово AS. Чтобы создать псев­
дон и м в Oracle, п росто укажите его без кл ючевого сл ова AS, на­
пример Custome rs с вместо Cus tomers AS с.

Следует отметить, что псевдонимы таблиц существуют только во


время выполнения запроса. В отличие от псевдонимов столбцов, они
никогда не сообщаются клиенту.

Объеди нен ия дру r их типов


До сих пор мы применяли только простые объединения, кото­
рые называются внутренними. Теперь рассмотрим три других типа
объединения: самообъединение, естественное объединение и внеш­
нее объединение.
Объединения других ти пов 137

Самообъединения
Одна из основных причин для использования псевдонимов та­
блиц состоит в возможности обращения к одной и той же таблице
несколько раз в одной инструкции SELECT. Продемонстрируем это
на примере.
Предположим, вы хотите послать письма по всем контактным
адресам клиентов, которые работают с той же компанией, с которой
работает Джим Джоне. Такой запрос требует, чтобы вначале вы вы­
яснили, с какой компанией работает Джим Джоне, а затем - какие
клиенты работают с этой же компанией. Один из способов решения
данной задачи приведен ниже.

ВВОА Т
SELECT cus t i d , cus t_name , cust_contact
FROM C u s t ome r s
WHERE c u s t name ( SELECT cus t_name
FROM Cus t ome r s
WHERE cu s t contact ' Jim Jon e s ' ) ;

ВЫВОА Т
cu s t i d c u s t name cu s t contact

1000000003 Fun4Al l Jim Jon e s


1000000004 Fun 4Al l Den i s e L . S tephens

Ана11 из т
В первом решении используются подзапросы. Внутренняя ин­
струкция SELECT возвращает название компании ( cus t name) с ко­ _ ,

торой работает Джим Джоне. Именно это название используется в


предложении WHERE внешнего запроса, благодаря чему извлекаются
имена всех служащих, работающих с данной компанией. (О подза­
просах см. урок 1 1 .)
Теперь рассмотрим тот же самый запрос, но с использованием
объединений.
138 УРОК 13. Созда ние расш иренных объеди нен ий

SELECT c l . c u s t_i d , c l . cus t_name , c l . cus t_contact


FROM Custome r s AS c l , C u s t ome r s AS с 2
WHERE c l . cu s t n ame = c2 . cust name
AND c2 . cu s t contact = ' Jim Jon e s ' ;

Вы вод� т
cust id c u s t name cust contact

1000000003 Fun 4Al l Jim Jon e s


1000000004 Fun4Al l Den i s e L . S tephen s

СОВ ЕТ: в Oracle нет кпючевоrо спова AS


Пол ьзовател и Oracle, не забыва йте уби рать из своих и н струкци й
кл ючевое слово AS.

Ана11 из т
Две таблицы, необходимые для выполнения запроса, на самом
деле являются одной и той же таблицей, поэтому таблица Cu s t om­
e r s появляется в предложении FROM дважды. И хотя это совершен­
но законно, любые ссылки на таблицу Customer s оказались бы не­
однозначными, потому что СУБД не знает, на какую именно таблицу
Custome rs вы ссьmаетесь.
Для решения данной проблемы и предназначены псевдонимы.
Первый раз для таблицы Custome rs назначается псевдоним c l , а
второй раз - псевдоним с 2 . Теперь эти псевдонимы можно при­
менять в качестве имен таблиц. В частности, инструкция SELECT
использует префикс с 1 для однозначного указания полного имени
нужного столбца. Если этого не сделать, СУБД выдаст сообщение
об ошибке, потому что имеется по два столбца с именами cus t_id,
cust_name и cust_ contact. СУБД не может знать, какой именно
столбец вы имеете в виду (даже если в действительности это один
и тот же столбец). Первое предложение WHERE объединяет обе ко­
пии таблицы, а затем фильтрует данные второй таблицы по столбцу
cust_contact, чтобы вернуть только нужные данные.
Объединен ия других типов 139

СОВЕТ: самообъединенин вместо nодэаnросов


Самообъед и н е н и я часто п ри ме н я ются для за м е н ы и н струкци й
с подза п роса м и , кото р ы е извлека ют да н н ы е из той же табл и ­
цы, что и в н е ш н я я и н струкци я . Несмотря н а т о что кон еч н ы й ре­
зультат п олучается тем же са м ы м , м ногие СУБД обрабаты вают
объединен и я гораздо б ы стрее, чем п одза п росы. Стоит поэкспе­
р и менти ровать с тем и други м , чтобы оп редел ить, какой зап рос
работает б ы стрее.

Естественные объединения
Всякий раз, когда объединяются таблицы, по крайней мере один
столбец будет появляться более чем в одной таблице (по нему и вы­
полняется объединение). Обычные объединения (внутренние, кото­
рые мы рассмотрели на предыдущем уроке) возвращают все данные,
даже многократные вхождения одного и того же столбца. Естествен­
ное объединение просто удаляет эти многократные вхождения, и в
результате возвращается только один столбец.
Естественным называется объединение, в котором извлекаются
только не повторяющиеся столбцы. Обычно это делается с помо­
щью метасимвола (SELECT *) для одной таблицы и указания явно­
го подмножества столбцов для всех остальных таблиц. Рассмотрим
пример.

ВВОА Т
SELECT С . * , O . o rde r_nurn, O . orde r_date ,
O I . prod_i d , O I . qua n t i ty, O I . i tern_p r i c e
FROM Custorne r s AS С , Orde r s AS О,
Orde r i terns AS O I
WHERE C . cu s t i d = O . cu s t i d
AND O I . order nurn = O . order nurn
AND prod_id = ' RGAN O l ' ;

СОВЕТ: в Oracle нет 1U11Очевоrо спова AS


Пол ьзовател и Oracle, не забыва йте уби рать из кода кл ючевое
СЛОВО АS.
140 УРОК 13. Созда ние расширенных объеди нен ий

Ана11из т
В этом примере метасимвол * используется только для первой
таблицы. Все остальные столбцы указаны явно, поэтому никакие ду­
бликаты столбцов не извлекаются.
В действительности каждое внутреннее объединение, которое мы
использовали до сих пор, представляло собой естественное объеди­
нение, и, возможно, вам никогда не понадобится внутреннее объеди­
нение, не являющееся естественным.

В неш ние объединения


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

� подсчет количества заказов каждого клиента, включая клиен­


тов, которые еще не сделали заказ;
� составление перечня товаров с указанием количества заказов
на них, включая товары, которые никем не бьши заказаны;
� вычисление средних объемов продаж с учетом клиентов, ко­
торые еще не сделали заказ.

В каждом из этих случаев объединение должно включать строки,


не имеющие ассоциированных с ними строк в связанной таблице.
Объединение такого типа называется внешним.

П РЕДУП Р Е ЖДЕН И Е : различия в синтаксисе


Важно отм етить, что си нта ксис вне ш него объед и н е н и я м ожет
нескол ько отл и ч аться в разных реал изациях SQL. Разл и ч н ы е
фор м ы си нта ксиса , о п и са н н ы е дал ее, охваты в а ют бол ь ш и нство
реал иза ц и й , но все же, прежде чем н а ч и нать работу, обратитесь
к докум ента ц и и своей СУБД и уточн ите, ка кой с и нта ксис необхо­
димо п р и м е н ять.

Следующая инструкция S E LECT позволяет выполнить простое


внутреннее объединение. Она извлекает список всех клиентов и их
заказы.
Объединения других типов 141

Ввод т
SELECT Custome r s . cu s �_id, Orde r s . orde r_num
FROM C u s t ome r s INNER JO I N Orde r s
O N Cus tome r s . cust i d Orde r s . cust_i d ;

Синтаксис внешнего объединения похож на этот. Для получения


имен всех клиентов, включая тех, которые еще не сделали заказов,
можно сделать следующее.

Ввод т
SELECT Custome r s . c u s t_i d , Orde r s . o rder_num
FROM Custome r s LEFT OUTER JO I N Orde r s
O N Cus tome r s . cust i d Orde r s . c u s t_i d ;

Вы вод т
cu s t i d o r d e r num
---------- ---------
1000000001 20005
1000000001 20009
1000000002 NULL
1000000003 20006
1000000004 20007
1000000005 20008

Ана11 из т
Аналогично внутреннему объединению, которое мы рассматри­
вали на прошлом уроке, в этой инструкции S E LECT используется
спецификация OUTER JOIN для указания типа объединения (в пред­
ложении FROМ, а не WHERE ) . Но, в отличие от внутренних объедине­
ний, которые связывают строки двух таблиц, внешние объединения
включают в результат также строки, не имеющие пар. При исполь­
зовании спецификации OUTER JO IN необходимо указать ключевое
слово R I GHT или LEFT, чтобы определить таблицу, все строки ко­
торой будут включены в результаты запроса ( RI GHT для таблицы,
имя которой стоит справа от OUTER JO IN, и LEFT - для той, имя
которой значится слева). В предыдущем примере используется спец­
ификация LEFT OUTER JO IN для извлечения всех строк таблицы,
указанной в левой части предложения FROM (таблицы Custome rs).
142 УРОК 13. Созда ние расширенных объединен и й

Чтобы извлечь все строки и з таблицы, указанной справа, используй­


те правое внешнее объединение (RIGHT OUTER JOIN), как показано
в следующем примере.

ВВОА Т
SELECT C u s t ome r s . cu s t_i d , Orde r s . o rde r_num
FROM C u s t ome r s RI GHT OUTER JO I N Orde r s
O N Orde r s . cu s t i d = Custome r s . cu s t_i d ;

П РЕДУП РЕЖДЕН И Е : внешние объеиинения в SQLite


SQLite п оддержи вает левое в н е ш нее объед и н е н и е , но не п ра­
вое. К счастью, существует очень п ростое решение, объясняе­
мое в следующем совете.

СОВЕТ: тиnы внешних объеиинений


Существуют две осно в н ы е фор м ы вне ш него объед и н е н и я : левое
и п ра вое. Еди н ственная разн и ца м ежду н и м и состоит в п о рядке
указа н и я с в я з ы ваемых табл и ц. Други м и слова м и , левое в н е ш ­
нее объед и н е н и е м ожет б ы т ь п ре в ра ще н о в п ра вое п росто з а
счет изменен и я порядка указа н и я и м е н та бл и ц в п редложе н и и
FROM или WHERE. А р а з так, т о эти д в а ти п а в н е ш него объеди не­
ния м о гут заменять друг друга, и реше н и е о том , какое и м е н н о
и з них нужно испол ьзовать, о п ределя ется л и ч н ы м и п редпочте­
ниями.

Существует и другой вариант внешнего объединения - полное


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

ВВОА Т
SELECT Cu s t ome r s . cust_id, Orde r s . o rder_num
FROM Orde r s FULL OUTER JO IN Cus tome r s
O N Orde r s . cu s t id = Cu s t ome r s . cust_i d ;
Испол ьзова н ие объеди нен и й совместно с итоговы м и фун кция м и 143

П РЕДУ П РЕЖДЕН И Е: поддержка no11нoro внеwнеrо


Об'Ь8АИН8НИЯ
Си нтаксис FULL OUTER JO IN не п оддержи вается в Access,
MariaDB, MySQL, OpenOffice Base и SQL1te.

Исnоn ьз ован и е объед и нен ий


совместно с итоrов ы м и
функц иями
Как было показано н а уроке 9, итоговые функции служат для по­
лучения базовых статистических показателей. Во всех рассмотрен­
ных до сих пор примерах итоговые функции применялись только
для одной таблицы, но их можно использовать и по отношению к
объединениям.
Рассмотрим пример. Допустим, вы хотите получить список всех
клиентов и число сделанных ими заказов. Для этого в следующем
запросе применяется функция COUNT ( ) .

Ввод, т
SELECT Cus t ome r s . cu s t_i d ,
COUNT ( Orde r s . o rde r_num) AS num o r d
FROM Custome r s I NNER JO I N Orde r s
O N Cu s t ome r s . cu s t i d = Orde r s . cu s t id
GROUP ВУ Cus tome r s . c u s t_ i d ;

В ь1 вод, т
cu s t id num ord
---------- --------

1000000001 2
1000000003 1
1000000004 1
1000000005 1

Анаn из т
В этой инструкции используется спецификация I NNER JO I N
для связи таблиц Custome rs и Orde rs между собой. Предложение
144 УРОК 13. Созда н и е рас ш ире н н ых объ еди нен и й

GROUP В У группирует данные п о клиентам, и, таким образом, вы­


зов функции COUNT ( Orde r s . orde r num ) позволяет подсчитать
_

количество заказов для каждого клиента и вернуть результат в виде


столбца num ord.
_

Итоговые функции можно также использовать с объединениями


других типов.

SELECT C u s t ome r s . c u s t_id,


COUNT ( Orde r s . o rder_num ) AS num ord
FROM Cu s t ome rs LEFT OUTER JO IN Orde r s
O N Cus t ome rs . cu s t i d = Orde r s . cu s t i d
GROUP В У Custome r s . c u s t_i d ;

СО ВЕТ: в Oracle нет кпючевоrо спова AS


Еще раз напом и н а ю п ол ьзовател я м O racle о необход и мости уда­
л е н и я кл ючевого слова AS из кода зап роса.

Вывод, т
cust id пит ord
---------- -------

1000000001 2
1000000002 о
1000000003 1
1000000004 1
1000000005 1

Ана11 из т
В этом примере используется левое внешнее объединение для
включения в результат всех клиентов, даже тех, которые не сделали
ни одного заказа. Как видите, клиент 1 0 0 0 0 0 0 0 0 2 также включен в
список, хотя на данный момент у него ноль заказов.
Пра вила создан ия объеди н ен и й 145

П рави л а создан ия объед и нен ий


Прежде чем завершить обсуждение объединений, которое заняло
два урока, имеет смысл напомнить о ключевых моментах, касающих­
ся объединений.

� Будьте внимательны при выборе типа объединения. Возмож­


но, что чаще вы будете применять внутреннее объединение,
хотя в зависимости от ситуации это может быть и внешнее
объединение.
� Посмотрите в документации к СУБД, какой именно синтак­
сис объединений она поддерживает. (Большинство СУБД под­
держивает одну из форм синтаксиса, описанных на этих двух
уроках.)
� Проверьте, правильно ли указано условие объединения (неза­
висимо от используемого синтаксиса), иначе будут получены
неверные данные.
� Не забывайте указывать условие объединения, в противном
случае вы получите декартово произведение таблиц.
� Можно включать в объединение несколько таблиц и даже при­
менять для каждой из них свой тип объединения. Несмотря на
то что это допустимо и часто оказывается полезным, жела­
тельно проверить каждое объединение отдельно, прежде чем
применять их вместе. Это намного упростит поиск ошибок.

Резю ме
Этот урок стал продолжением предыдущего, посвященного объе­
динениям. Вначале бьmо показано, как и для чего используют псевдо­
нимы, а затем мы продолжили рассмотрение объединений различных
типов и вариантов синтаксиса для каждого из них. Вы также узнали,
как применять итоговые функции совместно с объединениями и ка­
кие правила важно соблюдать при использовании объединений.
УРОК 14

Ком б и н и р ова н н ые
за п р о с ы

На этом уроке вы узнаете, как применять о перат ор UNION для


объединения нескольких инструкций SELECT с целью получен ия еди­
ного набора результатов.

Ч то такое комб и н и рованные


зап рос ы
В большинстве SQL-запросов применяется одна инструкция
SELECT, посредством которой извлекаются данные из одной или не­
скольких таблиц. SQL позволяет также выполнять множественные
запросы (за счет многократного использования инструкции SELECT)
и возврашать результаты в виде единого набора. Такие запросы обыч­
но называются соединениям и , или комбинированными запросами.
Комбинированные запросы обычно нужны в двух ситуациях:

.... получение одинаковым образом структурированных данных


из различных таблиц посредством одного запроса;
.... выполнение многократных запросов к одной таблице и полу­
чение данных в виде единого набора.

СО В ЕТ: комбинированные запросы и многократные


усповив WНERE
Резул ьтат ком би н и рова н и я двух зап росов к одн о й и той же та­
бл и це в основном а н алогичен резул ьтату, получ е н н о му п р и в ы ­
пол н е н и и одного зап роса с нескол ь ки м и услов и я м и в п редложе­
н и и WHERE. Други м и слова м и , ка к будет показа н о в следующем
разделе, любую и н струкцию SELECT с н ескол ь ки м и усл ов и я м и
WHERE тоже можно рассматри вать ка к ком б и н и рова н н ы й зап рос.
148 УРОК 14. Ко м б и н ирова н н ы е запросы

Создани е комби н и рованн ых


з а про сов
Запросы в SQL комбинируются с помощью оператора UN I ON, ко­
торый позволяет многократно указывать инструкцию SELECT, воз­
вращая один набор результатов.

Испол ьзовани е оператора UNION


Использовать оператор UNI ON довольно просто. Все, что необхо­
димо сделать, - это указать каждую инструкцию SELECT и вставить
между ними ключевое слово UNI ON.
Рассмотрим пример. Допустим, требуется получить отчет, со­
держащий сведения обо всех клиентах из штатов Иллинойс, Индиа­
на и Мичиган. Вы также хотите включить в него данные о клиенте
Fun4Al l независимо от штата. Конечно, можно создать условие
WHERE, благодаря которому будут выполнены указанные требования,
но в данном случае гораздо удобнее прибегнуть к оператору UN I ON.
Как уже говорилось, применение оператора UNION подразумевает
многократное использование инструкций SELECT. Вначале рассмо­
трим отдельные компоненты комбинированного запроса.

SELECT cus t_name , cus t_contact , cus t_ema i l


FROM Cus tome r s
WHERE c u s t s t a t e I N ( ' I L ' , ' IN ' , ' MI ' ) ;

ВЫВОА Т
c u s t name cust contact cust ema i l

Vi l l age Toys John Smi th s a l e s @ v i l l agetoys . com


Fun 4Al l Jim Jone s j j one s @ fu n 4 a l l . com
The Т о у S t o r e Kim Howard NULL

SELECT cus t_name , cust_contact , c u s t ema i l


FROM C u s t orne r s
WHERE c u s t n ame ' Fun4Al l ' ;
Созда н и е комб и н ирова н н ых за просов 149

Вывод т
c u s t n ame cust contact cu s t ema i l

Fun 4Al l Jim Jon e s j j one s @ fun 4 al l . com


Fun4Al l Den i s e L . S tephens dstephens @ fu n 4 al l . com

Ана.nиз т
Первая инструкция SELECT извлекает все строки, относящиеся к
штатам Иллинойс, Индиана и Мичиган, аббревиатуры которых ука­
заны в операторе IN. Вторая инструкция SELECT использует про­
стую проверку на равенство, чтобы найти все вхождения клиента
Fun 4Al l .
Чтобы скомбинировать оба запроса, выполните следующее.

Ввод т
SELECT cust_name , cus t_con t a c t , cu s t_ema i l
FROM C u s t ome r s
WHERE c u s t_s tate I N ( ' I L ' , ' IN ' , ' MI ' )
UN I ON
SELECT cus t_name , cu s t_con t a c t , cu s t ema i l
FROM C u s t ome rs
WHERE c u s t name ' Fun4Al l ' ;

Вывод т
cust ncэ.me cu s t contact cust ema i l

Fun 4Al l Den i s e L . S tephens ds tephen s @ fu n 4 a l l . com


Fun 4Al l Jim Jon e s j j one s @ fun 4 a l l . com
Vi l l age T o y s John Smi th s a l e s @ v i l l agetoys . com
The Тоу Store Kim Howard NULL

Ана.nиз т
Данный запрос содержит исходные инструкции SELECT, разде­
ленные ключевым словом UN I ON. Оно заставляет СУБД выполнить
обе инструкции и вывести результаты в виде одного набора резуль­
татов.
150 УРОК 14. Комбинирова н н ые зап росы

Для сравнения приведем тот же самый запрос, но использующий


не оператор UNION, а несколько предложений WHERE .

Ввод т
SELECT cus t_name , cu s t_cont act , cus t_ema i l
FROM Cu s t ome r s
WHERE cu s t_ s tate IN ( ' I L ' , ' IN'' , ' MI ' )
OR c u s t name = ' Fun4Al l ' ;

В данном простом примере применение оператора UN I ON мо­


жет показаться более громоздким, чем использование предложения
WHERE . Но если условие фильтрации окажется более сложным или
понадобится извлекать данные из нескольких таблиц (а не только из
одной), то оператор UNI ON может значительно упростить процесс.

СО В ЕТ: ограничения оператора UNION


В ста нда рте SQL не существует огра н и ч е н и й на ч и сло и н струк­
ц и й SELECT, которые могут быть ском би н и рова н ы посредством
операто ра UNI ON. Одн а ко луч ше все же обратиться к докум ен­
та ц и и своей СУБД и убедиться в том , что она н е н а клады вает
каких-л и бо огра н и чен и й на м а кси м ал ь н о допусти мое ч исло и н ­
струкци й .

П РЕДУП РЕЖД Е Н И Е: nро611емы, связанные


С П РОИ3ВОАИТ811ЬНОСТЬЮ
В бол ь ш и н стве СУБД и меется в н утрен н и й опти м изатор зап ро­
сов , комб и н и рующий и н струкции SELECT, п режде чем СУБД на­
ч и нает их обработку. Теоретически это означает, что с точ ки з ре­
н и я п роизводител ьности нет реал ь н о й раз н и цы м ежду испол ь­
зова н и ем нескол ьких предложе н и й WHERE и оператора UNI ON.
М ы гов о р и м "тео ретически " , п отому что на п ра кти ке м ногие
о пти м и зато р ы зап росов не всегда в ы п ол н я ют свою работу та к
хорошо, ка к следовало бы. Луч ше всего п ротести ровать оба ме­
тода и посмотреть, ка кой из н их луч ше п одходит.
Созда н и е комби н ирова н н ых запросов 151

Правила при м енения оператора UNION


Как видите, оператор UN I ON очень прост в применении. Но су­
ществует несколько правил, четко указывающих, что именно может
быть объединено.

• Оператор UNION должен включать две или более инструкции


SELECT, отделенные одна от другой ключевым словом UNION
(таким образом, если в запросе четыре инструкции SELECT,
должно быть указано три ключевых слова UNION).
• Каждый запрос в операторе UN I ON должен содержать одни
и те же столбцы, выражения или итоговые функции (кроме
того, некоторые СУБД требуют, чтобы столбцы были перечис­
лены в одном и том же порядке).
• Типы данных столбцов должны быть совместимыми. Столб­
цы не обязательно должны быть одного типа, но они должны
быть того типа, который СУБД сможет неявно преобразовать
(например, это могут быть различные числовые типы данных
или различные типы даты).

При соблюдении этих основных правил и ограничений комбини­


рованные запросы можно применять для решения любых задач по
извлечению данных.

Вкл ючение или искл ючение


повторя ющихся строк
Вернемся к предыдущему примеру и рассмотрим использован­
ные в нем инструкции SELECT. Несложно заметить, что, когда они
выполняются по-отдельности, первая инструкция SELECT возвраща­
ет три строки, а вторая - две. Но, когда эти две инструкции комби­
нируются с помощью ключевого слова UNI ON, возвращаются только
четыре строки, а не пять.
Оператор UNION авгоматически удаляет все повторяющиеся стро­
ки из набора результатов (иными словами, он работает точно так же,
как и несколько предложений WHERE в одной инструкции SELECT).
В частности, здесь имеется запись о клиенте Fun 4Al l из штата Ин­
диана - эта строка бьmа возвращена обеими инструкциями SELECT.
В случае оператора UNION повторяющаяся строка удаляется.
152 УРОК 14. Ко м би н и рова н н ы е запросы

Таково поведение оператора UN I ON по умолчанию , но при же­


лании его можно изменить. Если требуется, чтобы возвращались
все вхождения, необходимо использовать оператор UN I ON ALL, а не
UNI ON.
Рассмотрим следующий пример.

SELECT cus t_name , cu s t_contact , cus t_ema i l


FROM C u s t ome rs
WHERE c u s t_state I N ( ' I L ' ' ' IN ' , ' MI ' )
UNI ON ALL
SELECT cu s t_name , cu s t_contact , c u s t ema i l
FROM Cu s t ome rs
WHERE c u s t name ' Fun4Al l ' ;

Вывод т
c u s t name c u s t contact cu s t ema i l

Vi l l age Toys John Smi th s a l e s @ v i l lagetoys . com


Fun 4All Jim Jon e s j j one s @ fun4 a l l . com
The Т о у S t o r e K i m Howard NULL
Fun 4Al l Jim Jones j j one s @ fun 4 a l l . com
Fun 4 A l l Den i s e L . S tephens dstephens @ fu n 4 a l l . com

Ана.nиз т
При использовании оператора UNION ALL СУБД не удаляет ду­
бликаты. Поэтому в данном примере получено пять строк, и одна из
них повторяется дважды.

СОВ ЕТ: UNION ИllИ WНERE


В начале урока говорилось о том , что оператор UNION почти всег­
да в ы пол н я ет то же самое, что и нескол ько усл о в и й WHERE. О п е­
ратор UNION ALL я вляется разновидностью оператора UNI ON,
делая то, что не способн ы в ы п ол н ить п редложе н и я WHERE. Есл и
в ы хотите п олуч ить все вхожден ия для каждого усл о в и я ( в кл ю­
чая дубл и каты ), используйте оператор UN I ON ALL, а не п ред­
ложе н и е WHERE.
Созда ние ком бинированных зап росов 153

Сортировка резул ьтатов


комбинированных запросов
Результаты запроса SELECT сортируются с помощью предложе­
ния ORDER ВУ. При комбинировании запросов посредством опера­
тора UN I ON только одно предложение ORDER ВУ может быть ис­
пользовано, и оно Должно стоять после заключительной инструкции
SELECT. Не имеет смысла сортировать часть результатов запроса
одним способом, а часть - другим, поэтому применять несколько
предложений ORDER ВУ не разрешается.
В следующем примере сортируются результаты, возвращаемые
предыдущим оператором UNION.

ВВОА Т
SELECT cus t_name , cus t_contact , cu s t_ema i l
FROM C u s t ome r s
WHERE cu s t_s t a t e I N ( ' I L ' , ' IN ' , ' MI ' )
UN I ON
SELECT cus t_name , c u s t_contact , c u s t ema i l
FROM Cus t ome r s
WHERE c u s t name = ' Fun4Al l '
ORDER ВУ c u s t_name , c u s t_contact ;

ВЫВОА Т
cust name c u s t contact cust ema i l

Fun 4Al l Den i s e L . Stephens dstephen s @ fun 4 al l . com


Fun4Al l Jim Jon e s j j on e s @ fu n 4 a l l . com
The Т о у S t o r K i m Howard NULL
Vi l l age Toys John Smi th s a l e s @ vi l l agetoys . com

Анапиэ т
В этом операторе UN I ON используется одно предложение
ORDER ВУ после заключительной инструкции SELECT. Несмотря на
то что предложение ORDER ВУ является частью только последней
инструкции SELECT, в действительности СУБД будет применять его
для сортировки всех результатов, возвращаемых обеими инструк­
циями.
154 УРОК 14. Комбин ирова нные запросы

П Р И М ЕЧАН И Е: д,руrие типы комбинированных запросов


Некоторые СУБД поддерж и в а ют два до пол н ител ь н ых ти па ком ­
б и н и рова н н ых зап росов . Оператор ЕХСЕРТ ( и н о гда назы ваем ы й
MINUS) может б ыть испол ьзован дл я и з влечен и я строк, котор ы е
существуют тол ько в первой табл и це, но не во второй , а о пе­
ратор INTERSECT можно п р и м енять дл я извлечен и я тол ько тех
строк, кото р ы е и меются в обеих табл и цах. Одн а ко на п р а кти ке
та кие зап росы нужн ы редко, поскол ьку те же са м ы е резул ьтаты
м огут б ыть получ е н ы посредством объеди нен и й .

СОВ ЕТ: работа с нескопькими табпицами


Ради п ростоты в п р и мерах да н н о го урока опе ратор UNI ON п ри­
м е н ялся дл я объед и н е н и я зап росов к одной и той же табл и це.
Но на п ра ктике этот операто р особе н н о полезен для объеди не­
н и я да н н ых из нескол ьких табл и ц , в частности та ких, кото р ы е
содержат несо в п ада ющие и м ена столбцов. В п оследнем случае
можно п ри м е н ить псевдо н и м ы дл я получ е н и я еди ного набора
резул ьтатов .

Резюме
На этом уроке вы узнали, как комбинировать инструкции SELECT
с помощью оператора UNI ON. Используя этот оператор, можно вер­
нуть результаты нескольких инструкций в виде одного комбиниро­
ванного запроса, включающего или исключающего дубликаты. За
счет оператора UNI ON можно значительно упростить сложные пред­
ложения WHERE и запросы, связанные с извлечением данных из не­
скольких таблиц.
УРОК 15

Д о ба в11 ен и е Аа н н ых

На этом уроке вы узнаете, как добавлять данные в таблицы, ис-


пользуя инструкцию INSER Т.

С посо б ы доба вnен ия данн ых


Несомненно, S E L E C T является наиболее часто используемой
инструкцией SQL (именно поэтому мы посвятили ее изучению
14 уроков). Но помимо нее в SQL регулярно применяются еще три
инструкции, которыми необходимо уметь пользоваться. Первая из
них - INS'E RT. (О двух других мы расскажем на следующем уроке.)
Как следует из наЗ вания, инструкция INSERT предназначена для
добавления строк в таблицу базы данных. Это можно осуществить
несколькими способами:

. ..,. добавить одну полную строку;


..,. добавить часть одной строки;
..,. добавить результаты запроса.

Далее будут рассмотрены все вышеперечисленные варианты.

СОВЕТ: инструкция INSERT и безопасность систем ы


Дл я в ы п ол н е н и я и н струкци и INSERT в кл иент-серверной СУБД
могут потребоваться особые права доступа. П реJ!<Ае чем п р и ме­
н ять и н струкцию, убедитесь в том , что у вас есть на это п раво.

Добавление полных строк


Простейший способ добавления данных в таблицу реализуется с
помощью базового синтаксиса инструкции INSERT. Для этого нужно
указать имя таблицы и значения, которые должны быть введены в
новую строку. Рассмотрим пример.
156 УРОК 15. Доба вление да н н ых

Ввод, т
INSERT INTO Cu s t ome r s
VALUES ( ' 1 0 0 0 0 0 0 0 0 6 ' ,
' Т о у Land ' ,
' 1 2 3 Any S t r e e t ' ,
' New York ' ,
' NY ' ,
' 11111 ' ,
' USA ' ,
NUL L ,
NULL ) ;

Анаn из т
В этом примере в таблицу добавляются , сведения о новом кли­
енте. Данные, которые должны быть сохранены в каждом столбце
таблицы, указываются в предложении VALUE S . Значения должны
быть заданы для каждого столбца. Если для какого-то столбца нет
соответствующего значения (как в случае столбцов cust_contact
и cus t_ema i l в данном примере), следует указать NULL (предпола­
гается, что таблица допускает отсутствие значений в этих столбцах).
Столбцы должны заполняться в порядке, в котором они перечислены
в определении таблицы.

СОВЕТ: Кll lО Чевое спово INТO


В некоторых реал изациях SQL кл ючевое сл ово INTO после и н ­
струкции INSERT является необязател ь н ы м . Одна ко хорошей
п ра ктикой сч итается указа н и е этого кл ючевого сл ова даже в тех
случаях, когда этьго не требуетс я . П оступа я та к и м образо м , в ы
обеспеч ите переноси мость кода между разн ы м и СУБД.

Показанный синтаксис довольно прост, но не вполне безопасен,


поэтому его применения следует всячески избегать. Результаты вы­
полнения вышеприведенной инструкции весьма чувствительны к
порядку, в котором столбцы определены в таблице. Необходимо так­
же иметь доступ к определению таблицы. Но даже если в данный
момент порядок соблюдается, то нет гарантий, что столбцы будут
расположены в том же самом порядке, когда таблица будет редакти­
роваться в следующий раз. Следовательно, использовать инструкцию
С пособы доба влен и я да н н ых 157

SQL, результаты применения которой зависят от порядка следования


столбцов, весьма небезопасно. Если вы будете пренебрегать этим со­
ветом, вас ждут неприятности.
Безопасный (и, к сожалению, более громоздкий) способ записи
инструкции INSERT таков.

Ввод т
INSERT INTO Cus tome r s ( cu s t_id,
cus t_name ,
cu s t_addr e s s ,
cu s t_c i t y ,
c u s t_s tate ,
cu s t_z ip ,
cus t_count r y ,
cus t_contact ,
cus t_ema i l )
VALUES ( ' 1 0 0 0 0 0 0 0 0 6 ' ,
' Т о у Land ' ,
' 1 2 3 Any Street ' ,
' New Yor k ' ,
' NY ' ,
' 11111 ' ,
' USA ' ,
NUL L ,
NULL ) ;

Ана11 из т
В данном примере делается в точности то же самое, что и в
предыдущем случае, но на этот раз имена столбцов явно указаны в
круглых скобках после имени таблицы. Когда строка вводится в та­
блицу, СУБД устанавливает соответствие каждого элемента в списке
столбцов с соответствующим значением в списке VALUE S . Первое
значение в списке VALUE S соответствует первому указанному имени
столбца, второе значение - второму имени и т.д.
Поскольку имена столбцов перечислены в явном виде, значения,
указанные в предложении VALUES, должны соответствовать им в том
же самом порядке, причем он не обязательно должен совпадать с по­
рядком столбцов в реальной таблице. Преимущество данного спо­
соба таково: даже если расположение столбцов в таблице меняется,
инструкция INSERT все равно будет работать корректно.
158 УРОК 15. Добавление да н н ых

Следующая инструкция INSERT заполняет все столбцы строки


(как и в предыдущем примере), но делает это в другом порядке. По­
скольку имена столбцов указываются явно, добавление будет выпол­
нено правильно.

ВВОА Т
INSERT INTO C u s t ome r s ( cu s t_i d ,
cu s t_contact ,
cus t_ema i l ,
cus t_name ,
cus t_addre s s ,
c u s t_c i t y ,
cu s t_s t a t e ,
c u s t_z i p ,
VALUES ( ' 1 0 0 0 0 0 0 0 0 6 ' ,
NUL L ,
NUL L ,
' Т о у Land ' ,
' 1 2 3 Any S t re e t ' ,
' New Y o r k ' ,
' NY ' ,
' 11111 ' ,

СОВ ЕТ: всеrАа указывайте список сто116цов


Как п ра в ило, и н струкция INSERT не испол ьзуется без я в н о го
указа н и я с п и ска стол бцо в . Бла года ря этому знач ител ь н о воз­
растает вероятность того, что вы сможете усп е ш н о в ы пол н ить
зап рос, даже есл и в табл и це п роизойдут изменен и я .

П РЕДУП РЕЖДЕН И Е: аккуратно исnо11ьзуiiте ПР8Аll О Ж8НИ8


VALUES
Н еза в и с и м о от си нта ксиса и н струкции INSERT, значения в п ред­
ложе н и и VALUE S должн ы б ыть указа н ы п ра в и л ь н о . Есл и и мена
стол б цов отсутствуют, должно быть п р и веден о значение дл я
каждого столб ца табл и ц ы . Есл и и м ена столбцов указ ы ва ются ,
должно б ыть зада но значение дл я каждого стол бца, в кл ючен­
ного в с п и сок. Есл и что-то п ропущено, будет сгене р и ро в а н о со­
обще н и е об о ш и бке и строка не будет вста вле н а в табл и цу.
Способы доба вления да н н ых 159

Добавление ч асти строки


Рекомендуемый в предъщущем разделе способ использования ин­
струкции INSERT заключается в явном указании имен столбцов та­
блицы. Применяя такой синтаксис, вы также получаете возможность
пропустить определенные столбцы. Это означает, что вы вводите
значения для одних столбцов и пропускаете - для других.
Рассмотрим следующий пример.

Ввод� т
INSERT INTO C u s t ome r s ( cu s t_i d ,
cu s t name ,
-
c u s t addre s s ,
cus (:c i t y ,
cu s t s t a t e ,
:::
cust z i p ,
cu s t_coun t r y )
VALUES ( ' 1 0 0 0 0 0 0 0 0 6 ' ,
' Т о у Land ' ,
' 1 2 3 A n y S t reet ' ,
' New Y o r k ' ,
' NY ' ,
' 11111 ' ,
' USA ' ) ;

Ана11иэ т
В приведенном ранее примере для двух столбцов - cust_con­
tact и cust _ema i l - вводились значения NULL. Это означает, что
нет причин включать данные столбцы в инструкцию INSERT. Поэто­
му рассмотренная здесь инструкция INSERT не включает указанные
два столбца и два соответствующих им значения.

П РЕДУП РЕЖДЕН И Е : пропуск сто.n&цов


Столбцы м ожно и с ключать из и н струкци и INSERT, есл и это до­
пускается о п редел е н и е м табл и цы . Должно собл юдаться одно и з
следующих усл о в и й .
lill- Столбец оп ределе н к а к допускающи й значен и я NULL
(отсутствие ка кого-л ибо значения).
lill- В о п редел е н и и столб ца зада но значение по умол ч а н и ю.
Это означает, что, есл и не указа н о н и ка кое кон кретное
значен ие, будет испол ьзовано значен и е п о умол ч а н и ю .
160 УРОК 15. Добавление дан н ых

П РЕДУП Р ЕЖДЕН И Е : nponycк обяэатеnьных значений


Есл и в ы п ро пускаете стол бец, для которого не допуска ются зна­
чения NULL и н е зада н ы з н а ч е н и я по умолча н и ю, СУБД выдаст
сообще н и е об о ш и б ке и строка не будет добавлена.

Добавление резул ьтатов запроса


Обычно инструкция INSERT служит для добавления строки в та­
блицу с использованием явно заданных значений. Существует и дру­
гая форма инструкции INSERT, которую можно применять для до­
бавления результатов запроса SELECT. Такая инструкция называется
INSERT SELECT и, как подсказывает ее название, выполняет то же
самое, что делают инструкции INSERT и SELECT по отдельности.
Предположим, необходимо занести в таблицу Customers список
клиентов из другой таблицы. Вместо того чтобы извлекать по одной
строке и затем добавлять каждую иэ них посредством инструкции
INSERT, МОЖНО сделать следующее.

П Р И М ЕЧАН И Е: nояснения к cneAJioщeмy nримеру


В следующем п р и мере да н н ы е и м порти руются из табл и ц ы Cust­
New в табл и цу Cu stome r s . Сначала созда йте и запол н ите табл и ­
ц у Cus tNew. Ее формат должен б ыть та ки м ж е , ка к и у табл и цы
cus tome r s , о п иса н ной в п р иложе н и и А. П р и запол н е н и и табл и­
цы Cus tNew удостоверьтесь в том , что не испол ьзуются з н а ч е н и я
cust_id, кото р ы е уже существуют в табл и це Cus tomers ( п осле­
дующая операция INSERT поте р п ит н еудачу, есл и значен и я пер­
в и ч ного кл ю ч а будут п о вторяться).

ВВОА Т
INSERT INTO C u s tome r s ( cu s t_id,
c u s t_contac t ,
cus t_ema i l ,
cus t_name ,
cus t_addre s s ,
c u s t_c i t y ,
c u s t_s tate ,
c u s t_z ip ,
cus t_count r y )
Способы добавления да н н ых 161

SELECT cu s t_i d ,
cust_con t a c t ,
cus t_ema i l ,
cus t_name ,
cus t_addre s s ,
c u s t_c i t y ,
cust_s tate ,
c u s t_z ip ,
cust_coun,t ry
FROM C u s tNew ;

Ана11иэ •
В этом примере для импорта всех данных из таблицы Cus tNew
в таблицу Cu s t ome r s применяется инструкция INSERT SELECT.
Вместо того чтобы перечислять значения, которые должны быть до­
бавлены, инструкция SELECT извлекает их из таблицы C u s tNew.
Каждый столбец в инструкции SELECT соответствует столбцу в спи­
ске INSERT. Сколько же строк добавит эта инструкция? Все зависит
от того, сколько строк содержится в таблице Cus tNew. Если таблица
пуста, никакие строки добавлены не будут (и никакое сообщение об
ошибке не будет выдано, поскольку подобная операция допустима).
Если таблица содержит данные, все они будут добавлены в таблицу
Cus tome r s .

СОВ ЕТ: имена сто11бцов в инструкции INSERT SELECT


В да н н ом п р и мере ради п ростоты б ы л и испол ьзова н ы оди н а ко­
вые и мена столбцов в и н струкциях INSERT и SELECT. Одн а ко
это вовсе не обязател ьно. В действ ител ь ности СУБД вообще не
обра щает в н и м а н и я на и мена стол б цов, возвращаем ых и нструк­
цией SELECT. Она уч иты вает л и ш ь положе н и е столбца, та к что
перв ы й стол бец в и н струкци и SELECT ( н еза в и с и м о от и ме н и )
будет испол ьзован дл я запол н е н и я пер вого указа н ного столб ца
табл и ц ы и т.д.

Инструкция SELECT, используемая в запросе INSERT SELECT,


может включать предложение WHERE для фильтрации данных, кото­
рые должны быть добавлены.
162 УРОК 15. Доба вление да н н ых

С О В ЕТ: добавление нескольких строк


И н струкция INSERT о б ы ч н о добавл я ет тол ько одну стро ку.
Чтобы добав ить нескол ько строк, нужно в ы п ол н ить нескол ь ко
и н струкци й INSERT . И с кл юч е н и е м из это го п р а в ил а я вл я ется
и н струкция INSERT SELECT, которая м ожет быть и с п ол ьзо в а н а
дл я доба вл е н и я м н ожества строк посредством одн о го зап ро­
са - ка кие бы да н н ы е ни вернул а и н струкция SELECT, все о н и
будут доба вл е н ы в табл и цу.

Коп и рование Аанных


из ОА Н О Й табл и ц ы в APYryIO
Существует другой способ добавления данных, при котором ин­
струкция INSERT вообще не применяется. Чтобы скопировать со­
держимое какой-то таблицы в новую таблицу (которая создается на
лету), можно использовать инструкцию SELECT INTO.

П РИ М ЕЧАН И Е: не поддерживается в DB2


DB2 не поддержи вает испол ьзо в а н и е и н струкц и и SELECT INTO
о п и са н н ы м здесь способо м .

В отличие от инструкции INSERT S E L E C T , посредством кото­


рой данные добавляются в уже существующую таблицу, инструкция
SELEC:Г INTO копирует данные в новую таблицу (и, в зависимости
от СУБД, может перезаписать таблицу, если она уже существует).

П РИ М ЕЧАН И Е : разница между инструкциями INSERT


SELECT И SELECT INТO
Одно из разл и ч и й между и н струкци я м и SELECT INTO и INSERT
SELECT закл ючается в том , что первая экспорти рует да н н ые, а
вторая - и м порти рует.

В следующем примере демонстрируется применение инструкции


SELECT INTO.
Коп ирова ние да н н ых из одной табл ицы в другую 163

Ввод� т
SELECT *
INTO C u s t C opy
FROM C u s t ome r s ;

Анаnиз т
Эта инструкция создает новую таблицу Cus tCopy и копирует в
нее все содержимое таблицы Cus t ome r s . Поскольку применяется
синтаксис SELECT * , каждый столбец таблицы C u s t ome r s будет
воссоздан в таблице Cus tCopy (и заполнен соответствующим обра­
зом). Чтобы скопировать только часть доступных столбцов, следует
явно указать их имена, а не использовать метасимвол * (звездочка).
В MariaDB, MySQL, Oracle, PostgreSQL и SQLite поддерживается
несколько иной синтаксис.

CREATE ТАВLЕ Cus tCopy AS


SELECT * FROM Custome r s ;

При использовании инструкции SELECT INTO нужно обращать


внимание на следующие нюансы.

� Разрешается применять любые ключевые слова и предложе­


ния инструкции SELECT, включая WHERE и GROUP ВУ.
� Для добавления данных из нескольких таблиц можно исполь­
зовать объединения.
� Данные можно добавить только в одну таблицу независимо от
того, из скольких таблиц они были извлечены.

СОВ ЕТ: создание копий таб11иц


И н струкц и я SELECT INTO я вляется п рекрас н ы м с редством
созда н и я коп и й табл и ц для экспериментов с нов ы м и для вас
и н струкция м и SQL. Созда в коп и ю , в ы п олуч ите возможность
п ротести ровать и н струкци и SQ L на этой коп и и , а не на табл и цах
реал ь н о й базы да н н ых.
164 УРОК 15. Доба вление да н н ых

П РИ М ЕЧАН И Е: АОnопнитепьные примеры


Есл и хотите увидеть другие п р и меры испол ьзо в а н и я и н струкц и и
INSERT, ознако м ьтесь с о сцена р и я м и запол н е н и я табл и ц, о п и ­
са н н ы м и в п р иложе н и и А .

Рез юме
Н а этом уроке вы научились добавлять строки в таблицу базы
данных. Вы ознакомились с несколькими способами применения
инструкции INSERT и узнали, почему желательно в явном виде ука­
зывать имена столбцов. Вы также научились применять инструкцию
INSERT SELECT для импорта строк из другой таблицы и инструк­
цию SELECT INTO для экспорта строк в новую таблицу. На сле­
-

дующем уроке будет показано, как с помощью инструкций UPDATE


и DELETE обновлять и удалять строки.
УРОК 16

Об нов11 ен ие
и уда 11 ен ие да н н ых

На этом уроке в ы узнаете о том, как применят ь инструкции


UPDATE и DELETE для обновления и удаления записей в таблицах.

О бновл ен ие дан н ых
Для обновления (модификации) данных какой-либо таблицы
предназначена инструкция U P DATE, которую можно использовать
двумя способами:

� обновление определенных строк в таблице;


� обновление всех строк в таблице.

Рассмотрим оба способа.

П РЕДУП РЕЖДЕ Н И Е: не забывайте указывать


nреw�ожение WНERE
П р и менять и нструкци ю UPDATE следует с особо й осторожностью,
пото му что можно по о ш и бке обновить все строки табл и ц ы . П ро­
ч ита йте весь раздел , посвя щен н ы й и н струкци и UPDATE, п режде
чем нач и н ать созда вать соответствующие зап рос ы .

СОВ ЕТ: инструкция UPDAТE и безопасность системы


Дл я в ы пол н е н и я и н струкции UPDATE в кл иент-серверной СУБД
могут потребо ваться особые п рава доступ а . П режде чем п р и ме­
нять и н струкци ю, убедитесь в том , что у вас есть н а это п раво.
166 УРОК 16. Обновление и удаление да нных

Инструкция UPDATE очень проста. Она состоит из трех основных


частей:

� имя таблицы, подлежащей обновлению;


� имена столбцов и их новые значения;
� условия фильтрации, определяющие, какие именно строки
должны быть обновлены.

Рассмотрим простой пример. Допустим, у клиента 1 0 0 0 0 0 0 0 0 5


появился адрес электронной почты, поэтому его запись нужно обно­
вить. Такое обновление можно выполнить посредством следующей
инструкции.

Ввод 'У
UPDATE Cus tome r s
SET c u s t ema i l = ' kim@ thetoystore . com '
WHERE cust id = ' 10 0 0 0 0 0 0 05 ' ;

Инструкция U P DATE всегда начинается с имени таблицы, под­


лежащей обновлению. В нашем примере это таблица Cus torne r s .
Затем используется предложение S E T , чтобы ввести в столбец но­
вое значение. В данном случае обновляется значение столбца cust _
erna i l .
S E T c u s t_ema i l = ' k im@ t h e t o y s t o re . c om '

Заканчивается инструкция UPDATE предложением WHERE, кото­


рое сообщает СУБД, какая строка подлежит обновлению. При от­
сутствии такого предложения СУБД обновила бы все строки табли­
цы C us torne r s , введя в них новый (причем один и тот же ! ) адрес
электронной почты, а это, конечно же, не то, что нам нужно.
Для обновления нескольких столбцов необходим иной син­
таксис.

Ввод 'У
UPDATE Custome r s
SET cust contact = ' S am Roberts ' ,
cust ema i l = ' s am @ t o y l and . com '
WHERE cu s t id = ' 1000000006 ' ;
Обновление да н н ых 167

В этом случае используется только одно предложение S E T , а


каждая пара "столбец-значение" отделяется запятой (после завер­
шающей пары запятая не ставится). В нашем примере оба столб­
ца, cu s t_cont act и cus t_erna i l , будут обновлены для клиента
1 0 0 0 0 0 0 0 0 6.

СО В ЕТ: исnо11ьзование nодзаnросов в инструкции UPDAТE


В и н струкциях UPDATE м о гут быть испол ьзо ва н ы п одза п росы ,
что дает возможность обновлять стол бцы да н н ы м и , и з влечен­
н ы м и посредством и н струкции SELECT (см . урок 11).

СОВЕТ: nредпожение FROМ


Некоторые реал изаци и SQL поддерживают п р едл оже н и е FROM
в и н струкци и UPDATE. Оно может быть использовано дл я обнов­
ления строк одной табл и ц ы да н н ы м и из друго й . Обратитесь к до­
кумента ц и и своей СУБД и в ы ясн ите, поддержи вает ли о н а та кую
возможн ость.

Чтобы удалить значение из столбца, можно присвоить ему значе­


ние NULL (если определение таблицы позволяет вводить в нее значе­
ния NULL). Это можно сделать следующим образом.

Ввод т
UPDATE Cus tome r s
S E T cust ema i l = NULL
WHERE cust id = ' 1000000005 ' ;

Здесь ключевое слово NULL используется для удаления значения


из столбца cu s t_erna i l . Это совсем не то же самое, что хранение
пустой строки. Сама по себе пустая строка (записывается как ' ) '

является значением, тогда как NULL указывает на отсутствие какого­


либо значения.
168 УРОК 16. Обновление и удаление да н н ых

Удаn ение данн ых


Для удаления данных из таблицы предназначена инструкция
DELETE. Ее можно использовать двумя способами:

..,.. для удаления определенных строк из таблицы;


..,.. для удаления всех строк из таблицы.

Рассмотрим оба способа.

П Р ЕДУ ПР ЕЖДЕ Н И Е: не забывайте указ_8'1вать


nреД11 ожение WНERE
П р и м ен ять и н струкци ю DELETE следует с особой осторожностью,
потому что можно по о ш иб ке удал ить все строки табл и цы . П ро­
ч ита йте весь раздел , посвя щен н ы й и н струкци и DELETE, п режде
чем н а ч и нать созда вать соответствующие за п росы.

СОВ ЕТ: инструкция DELEТE и безопасность системы


Дл я в ы пол н е н и я и н струкци и DELETE в кл иент-серверной СУБД
могут п отребоваться особы е п рава доступа. П режде чем п р и ме­
нять и н струкци ю , убедитесь в том , что у вас есть на это п раво.

Выше уже говорилось о том, что инструкция UPDATE очень про­


ста. К счастью, инструкция DELETE еще проще.
Следующая инструкция удаляет одну строку из таблицы Cu s ­
tomers.

ВВОА Т
DELETE FROM C u s t ome r s
WHERE cu s t i d = ' 1000000006 ' ;

Предложение DELETE FROM требует указания имени таблицы, из


которой должны быть удалены данные. Предложение WHERE филь­
трует строки, определяя, какие из них должны быть удалены. В на­
шем примере должна быть удалена строка, относящаяся к клиенту
1 0 0 0 0 0 0 0 0 6 . Если бы предложение WHERE было пропущено, ин­
струкция удалила бы все строки из таблицы.
Удаление дан н ых 169

СОВ ЕТ: научитесь работать с внеwними кnючами


На уроке 12 в ы ознако м ил ись с кон цеп цией объеди нен и й и узна­
ли, что в объединяемых табл и цах должн ы быть общие пол я . Но
можно заста в ить СУБД созда вать п р и нудител ь н ы е связи междУ
табл и ца м и с помощью внеш н их кл ючей {при меры их оп реде­
лен и й можно на йти в п р иложе н и и А). Когда и меются в н е ш н и е
кл юч и , СУБД испол ьзует и х , чтобы гара нти ровать ссылоч ную
целостность. Н а п р и мер, есл и поп ытаться доба в ить н о в ы й товар
в табл и цу Products, указа в неизвестн ы й идентифи катор по­
ста в щ и ка, СУБД не позвол ит этого сделать, поскол ьку столбец
vend_id я вляется внеш н и м кл ючом для табл и цы Vendors. Вы
сп росите, какое отношение все это и меет к и н струкции DELETE?
Положител ь н ы м побоч н ы м эффектом испол ьзова н и я внеш н их
кл ючей для поддержа н и я ссылочной целостности я вляется то, что
СУБД обычно зап рещает удаление строк, которые обеспеч ивают
корректность отношен и й междУ табл и ца м и . Н а п ример, есл и по­
п ытаться удал ить из табл ицы Products товар, указа н н ы й в суще­
ствующих заказах в табл и це Orderl tems , и н струкция DELETE за­
верш ится неудачей и будет выдано сообщение об ошибке. Это ве­
ская п р и ч и н а для того, чтобы всегда определять в н е ш н и е кл ючи.

СОВ ЕТ: кnючевое спово FROМ


В н екоторых реал изациях SQL кл ючевое слово FROM п осл е и н ­
струкции DELETE я вл я ется н еобязател ь н ы м . Одн а ко хорошей
п р а ктикой сч итается указа н и е этого кл ючевого слова даже в тех
случаях, когда этого не требуется. П оступая та к и м образо м , в ы
обеспеч ите перенос и м ость кода между разн ы м и СУБД.

Инструкция DELETE не принимает имена столбцов или мета­


символы. Она удаляет строки целиком, а не отдельные столбцы. Для
удаления конкретного столбца следует использовать инструкцию
UPDATE.

П Р И М ЕЧАН И Е: содержимое табnиц, но не сами табnицы


И н струкция DELETE удал яет из табл и ц ы отдел ь н ы е строки или
даже все строки за оди н раз, но она н и когда не удаляет саму
табл и цу.
170 УРОК 16. Об новлени е и удал е н и е да н н ых

СО В ЕТ: 6011ее быстрое УАSnение


Есл и необходимо удал ить все строки из табл и ц ы , не испол ьзуйте
и н струкц и ю DELETE. Дл я этого существует и н струкция TRUNCATE
ТАВLЕ, которая делает то же самое, но гораздо быстрее (потому
что изменения да н н ых не регистри руются в журнале СУБД).

С овет ы по обновл ению


и уда л ени ю данн ы х
Все инструкции UPDATE и DELETE, рассмотренные в предыду­
щих разделах, сопровождались предложениями WHERE, и на то есть
веская причина. Если пропустить предложение WHERE, инструкция
будет применена по отношению ко всем строкам таблицы. Други­
ми словами, если выполнить инструкцию UPDATE без предложения
WHERE, каждая строка таблицы будет заменена новыми значениями.
Аналогичным образом, если выполнить инструкцию DELETE без
предложения WHERE, будет удалено все содержимое таблицы.
Ниже даны рекомендации, которым следуют большинство разра­
ботчиков SQL.

• Никогда не выполняйте инструкцию UPDATE или DELETE без


предложения WHERE, если только на самом деле не хотите об­
новить или удалить каждую строку таблицы.
• Убедитесь в том, что каждая таблица имеет первичный ключ
(см. урок 1 2, если забыли, что это такое), и используйте его в
предложении WHERE всякий раз, когда это возможно. (Можно
указывать отдельные первичные ключи, несколько значений
или диапазоны значений.)
• Прежде чем использовать предложение WHERE с инструкцией
U P DATE или DELETE, сначала проверьте его с инструкцией
SELECT, дабы убедиться в том, что оно правильно фильтрует
записи. Можно ошибиться и записать неправильное условие.
• Используйте внешние ключи, чтобы СУБД не позволяла уда­
лять строки, для которых в других таблицах имеются связан­
ные с ними данные.
• Некоторые СУБД позволяют администраторам баз данных
устанавливать ограничения, препятствующие выполнению
Резюме 171

инструкций U P DATE или DELETE без предложения WHERE .


Если ваша СУБД поддерживает такую возможность, не пре­
небрегайте ею.

Помните о том, что в SQL нет кнопки отмены. Будьте очень вни­
мательны, выполняя инструкции UPDATE и DELE TE, иначе можно
вдруг обнаружить, что удалены или обновлены не те данные.

Резюм е
На этом уроке вы узнали, как использовать инструкции UPDATE
и DELETE для обновления и удаления табличных данных. Вы ознако­
мились с синтаксисом каждой из этих инструкций, а также с опасно­
стями, которыми чревато их применение. Вы также узнали, почему
столь важно указывать предложение WHERE в инструкциях UPDATE
и DELETE, и изучили основные правила, которым нужно следовать,
чтобы по неосторожности не повредить данные.
УРОК 17

Созда н ие та б л и ц
и р а б ота с н и м и

На этом уроке вы ознаком итесь с основными правW1ами создания,


изменения и удаления таблиц.

Со здание та 611 и ц
SQL применяется не только для работы с табличными данными,
но и для выполнения всех операций с базами данных, включая созда­
ние и модификацию таблиц.
Существуют два способа создания таблиц.

� Большинство СУБД содержат инструменты администрирова­


ния, которые можно применять для интерактивного создания
таблиц и управления ими.
� С таблицами можно также работать посредством инструкций
SQL.

Для создания таблиц программным способом предназначена ин­


струкция CREATE TABLE. Стоит отметить, что, когда вы применяе­
те интерактивный инструментарий, в действительности вся работа
выполняется инструкциями SQL. Но вам не приходится писать эти
инструкции, поскольку СУБД создает и выполняет их незаметно для
вас (то же самое справедливо и для процедуры изменения существу­
ющих таблиц).
174 УРОК 17. Создание табл и ц и работа с н и м и

П Р ЕДУП РЕЖДЕ Н И Е: раэпичия в синтаксисе


Точ н ы й си нта кси с и н струкции CREATE ТАВLЕ м ожет н е м ного от­
л и ч аться в разл и ч н ых реал изациях SQL. Обязател ьно обратитесь
к докум ента ц и и своей СУБД за доп ол н ител ь н о й и нформацией и
в ы я с н ите, какой в точ ности си нта кси с необходи м дл я н ее и ка­
кие возможности она п оддержи вает.

Полное рассмотрение всех параметров, применяемых при созда­


нии таблиц, не входит в задачи данного урока. Мы рассмотрим толь­
ко основы. За дополнительной информацией обратитесь к докумен­
тации своей СУБД.

П Р И М ЕЧАН И Е: nримеры All R конкретных СУ&Д


И н струкци и CREATE ТАВLЕ для кон кретн ых СУ БД п р и веде н ы в
п р ил оже н и и А.

Создание простой таблицы


Чтобы создать таблицу с помощью инструкции CREATE ТАВLЕ,
нужно указать следующие данные:

.,.. имя новой таблицы, которое задается после ключевых слов


CREATE ТАВLЕ;
.,.. имена и определения столбцов таблицы, разделенные запятыми;
.,.. в некоторых СУБД также требуется, чтобы было задано рас­
положение таблицы.

Следующая инструкция создает таблицу P r o du c t s , часто ис­


пользуемую в книге.

Ввод т
CREATE ТАВLЕ Produ c t s
(
p rod_id CНAR ( l O ) NOT NUL L ,
vend i d СНАR ( 1 0 ) NOT NUL L ,
prod_name CHAR ( 2 5 4 ) N O T NUL L ,
Создание таблиц 175

prod_p r i c e DEC IМAL ( B , 2 ) NOT NULL ,


prod_de s c VARCHAR ( 1 0 0 0 ) NULL
) ;

Анаnиз �
Как видите, имя таблицы указывается сразу же после ключе­
вых слов CREATE TABLE. Определение таблицы (все ее столбцы)
заключается в круглые скобки. Определения столбцов разделяются
запятыми. Приведенная в данном примере таблица состоит из пяти
столбцов. Определение каждого столбца начинается с имени столбца
(которое должно быть уникальным в пределах данной таблицы), а за
ним указывается тип данных. (Обратитесь к уроку 1 , чтобы вспом­
нить, что такое типы данных. Кроме того, в приложении Г приве­
ден перечень основных типов данных в SQL.) Инструкция в целом
заканчивается точкой с запятой, которая стоит после закрывающей
круглой скобки.
Ранее уже говорилось, что синтаксис инструкции CREATE
ТАВLЕ зависит от СУБД, и данный пример наглядно доказывает это.
В Oracle, PostgreSQL, SQL Server и SQLite инструкция будет рабо­
тать в приведенной форме, а вот в MySQL тип VARCНAR должен быть
заменен типом text. В DB2 значение NULL должно быть удалено из
последнего столбца. Именно поэтому пришлось использовать раз­
личные сценарии создания таблиц для каждой СУБД (как объясня­
ется в приложении А).

СО В ЕТ: форматирование инструкции


П о м н ите о том , что п робел ы и гнори руются и н струкц и я м и SQL.
И н струкцию можно в вести в одной дл и н н ой строке ил и разбить
ее н а нескол ь ко строк; разн и цы между н и м и не будет. Это по­
звол я ет формати ровать л исти н ги SQL та к, ка к в а м удобно. По­
каза н н а я в ы ш е и н струкция CREATE TABLE - хоро ш и й п р и мер
формати рова н и я SQ L-зa п poca . Код разбит на нескол ько строк,
а оп редел е н и я столб цов в ы ро в н е н ы п робел а м и дл я удобства
чте н и я и редакти рова н и я . Формати ро вать и н струкции SQL по­
доб н ы м образом не обязател ьно, н о все же настоятел ьно реко­
мендуетс я .
176 УРОК 17. Созда н ие табл и ц и работа с н и м и

СОВ ЕТ: замена существующих таб11иц


Когда в ы создаете новую табл и цу, указы ваемое в а м и имя не
должно существовать в СУБД, и н а ч е будет в ыда но сообще н и е
об о ш и бке. Чтобы избежать случ а й н о й переза п и с и , SQL требует,
чтобы в ы в н ачале в руч ную удал или табл и цу (подробности оп иса­
ны дал ее), а затем в н о в ь создал и ее, а не п росто переза п исал и .

Р абота со значениями NULL


На уроке 4 рассказывалось о том, что такое значение NULL. Оно
подразумевает, что в столбце не содержится никакого значения. Стол­
бец, в котором допускаются значения NULL, позволяет добавлять в
таблицу строки, в которых не предусмотрено значение для данного
столбца. Столбец, в котором не допускаются значения NULL, не при­
нимает строки с отсутствующим значением. Другими словами, для
этого столбца всегда потребуется вводить какое-то значение при до­
бавлении или обновлении строк.
Каждый столбец таблицы может быть либо пустым (NULL), либо
не пустым (NOT NULL), и это его состояние оговаривается в опреде­
лении таблицы на этапе ее создания. Рассмотрим следующий пример.

CREATE , TAВLE Orde r s


(
o r-der num INTEGER NOT NULL ,
o rde r date DATET IМE NOT NULL ,
cu s t id СНАR ( 1 0 ) NOT NULL
) ;

Ана.n из •
Посредством этой инструкции создается таблица Orde r s , неод­
нократно использованная в книге. Таблица состоит из трех столбца�:
номер и дата заказа, а также идентификатор клиента. Все три столб­
ца являются необходимыми, и каждый из них содержит специфика­
цию NOT NULL, �оторая будет препятствовать добавлению в таблицу
Создан и е табл и ц 177

столбцов с отсутствующим значением. При попытке добавления та­


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

CREATE ТАВLЕ Vendo r s


(
vend_id, CНAR ( l O ) NOT NUL L ,
vend name CНAR ( S O ) NOT NUL L ,
vend addre s s СНАR ( 5 0 )
vend_ci t y СНАR ( 5 0 )
vend s tate CНAR ( S )
vend_zip CНAR ( l O )
vend_country CНAR ( S O )
) ;

Ана11иэ �
Посредством этой инструкции создается таблица Vendo r s , так­
же неоднократно использованная в книге. Столбцы с идентифика­
тором и именем поставщика необходимы, поэтому оба Оiiределены
как NOT NULL (т.е. не допускающие значений NULL). Пять осталь­
ных столбцов допускают значения NULL, поэтому для них не указана
спецификация NOT NULL. Значение NULL принято по умолчанию, и в
отсутствие спецификации NOT NULL предполагается, что значения
NULL допустимы.

П Р ЕДУП РЕЖДЕН И Е: указание значения NOLL


Во м ногих СУБД отсуrствие специфика ц и и NOT NULL тра юуется
ка к NULL. Одн а ко не во всех. В 0 8 2 нал и ч и е кл ючевого слова
NULL я вл я ется обязател ь н ы м , и есл и оно не указано, генери ру­
ется сооб щение об о ш и бке. Обратитесь к документа ц и и своей
СУБД, чтобы п олуч ить исчер п ы ва ющую и нформ а ц и ю о си нта к­
сисе и н струкци и .
178 УРОК 17. Созда ние табл иц и работа с н и м и

СОВ ЕТ: первичные кпючи и значения NULL


На уроке 1 говорилось о том , что перв и ч н ы е кл ю ч и - это стол б­
цы, значен и я которых ун и кал ьно идентиф и ци руют каждую строку
табл и ц ы . Стол б ц ы , допуска ющие отсутствие значен и й , не мо гут
испол ьзоваться в качестве ун и кал ьн ых идентиф и каторов.

П Р ЕДУП РЕЖДЕН И Е: что такое NULL


Не пута йте значен и я NULL с пусты м и строка м и . NULL означа­
ет отсутствие значен и я ; это н е пустая строка. Есл и указать в
коде ' ' (две оди н а р н ых ка в ы ч ки , м ежду кото р ы м и н ич е го н ет),
это значение м ожно будет ввести в стол бец ти п а NOT NULL. Пу­
стая строка я вл я ется допусти м ы м значен и е м ; она не означает
отсутствие значен и я . Значен и я NULL зада ются тол ь ко посред­
ством кл ючевого слова NULL, но не пусты м и строка м и .

Определение значений по умол чанию


SQL позволяет определять значения по умолчанию, которые бу­
дут использованы в том случае, если при добавлении строки значе­
ние одного из полей не указано. Значения по умолчанию задаются
с помощью ключевого слова DEFAULT в определениях столбцов в
инструкции CREATE ТАВLЕ.
Рассмотрим следующий пример.

Ввод� т
CREATE ТАВLЕ Orde r i t ems
(
orde r num INTEGER NOT NUL L ,
order i tem INTEGER N O T NUL L ,
prod_id CHAR ( l O ) N O T NULL ,
quan t i t y INTEGER NOT NULL DE FAULT 1 ,
i t em_p r i c e DEC IМAL ( 8 , 2 ) NOT NULL
) ;

Анапиз т
Посредством этой инструкции создается таблица Orde r i tems,
содержащая отдельные элементы заказов (сам заказ хранится в
Обновление табл иц 179

таблице Orde r s) . Столбец quan t i t y содержит количество каж­


дого товара в заказе. В данном примере добавление спецификации
DEFAULT 1 в описание столбца заставляет СУБД подразумевать ко­
личество, равное 1 , если не указано иное.
Значения по умолчанию часто используются для хранения даты
и времени. К примеру, системная дата может быть назначена как
дата по умолчанию путем указания функции или переменной, ис­
пользуемой для ссьmки на системную дату. В частности, пользовате­
ли MySQL могут указать дату как DEFAULT CURRENT DATE ( ) , в то
_

время как пользователям Oracle нужно вводить дату как DE FAULT


SYSDATE, а пользователям SQL Server -как DEFAULT GET DATE ( ) .
К сожалению, команда, используемая для получения системной даты,
в каждой СУБД своя. В табл. 1 7. 1 приведен синтаксис для несколь­
ких СУБД (если ваша СУБД не представлена в этом списке, обрати­
тесь к ее документации).

ТАБЛ И ЦА 1 7 . 1 . Получение системной даты

СУ Б Д Функция/переменная

Access NOW ( )
DB2 CURREN T DATE
MySQL CURREN T _ DATE ( )
O racle S Y S DATE
PostgreSQL CURRENT DATE
SQL Server G E T DATE ( )
SQL1te da te ( ' n ow ' )

СОВ ЕТ: 11сnо11ьэован11е значений DEFAULT вместо NULL


М н огие разработч и ки баз дан н ых п р и меняют значен и я DEFAULT
в м есто стол бцов NULL, особен н о в стол бцах, котор ы е будут ис ­
пол ьзов а н ы в в ы ч ислениях или п р и груп п и ровке строк.

Обновnение табn и ц
Для того чтобы обновить определение таблицы, следует восполь­
зоваться инструкцией ALTER ТАВLЕ. Несмотря на то что все СУБД
поддерживают эту инструкцию, ее возможности в значительной сте­
пени зависят от конкретной СУБД. Ниже приведен ряд соображений
по поводу применения инструкции ALTER ТАВLЕ.
180 УРОК 17. Созда н и е табл и ц и работа с н и м и

.... В идеальном случае структура таблицы вообще не должна ме­


няться после того, как в таблицу введены данные. В процессе
разработки таблиц потратьте время на анализ будущих по­
требностей пользователей, чтобы позже не пришлось вносить
в структуру таблиц существенные изменения.
.... Все СУБД позволяют добавлять столбцы в уже существую­
щие таблицы, но некоторые СУБД ограничивают типы дан­
ных, которые могут быть добавле н ы (а заодно и правила ис­
пользования значений NULL и DEFAULT).
.... Многие СУБД не позволяют удалять или изменять столбцы
в таблице.
.... Большинство СУБД разрешает переименовывать столбцы.
.... Многие СУБД налагают серьезные ограничения на измене­
н ия, которым могут подвергнуться заполненные столбцы, и
зн ачительно меньшие ограничения - в случае незаполнен­
н ых столбцов.

Как видите, вносить изменения в существующие таблицы ничуть


не проще, чем создавать их заново. Обратитесь к документации сво­
ей СУБД, чтобы уточнить, что име н но можно изменять.
Чтобы изменить таблицу посредством инструкции ALTER ТАВLЕ,
нужно задать следующую информацию:

.... имя таблицы, подлежащей изменению (таблица с таким име­


н ем должна существовать, иначе будет выдано сообщение об
ошибке);
.... список изменений, которые должны быть сделаны.

Поскольку добавление столбцов в таблицу - единственная опе­


рация, поддерживаемая всеми СУБД, именно ее мы и рассмотрим в
качестве примера.

ALTER ТАВLЕ Vendo r s


ADD vend_phone СНАR ( 2 0 ) ;
Обновление табл иц 181

Анаn из т
Посредством этой инструкции в таблицу Vendo r s добавляется
столбец vend_phone. Должен быть указан тип данных столбца.
Другие операции, такие как изменение или удаление столбцов,
задание ограничений или ключей, требуют похожего синтаксиса.
(Отметим, что следующий пример будет работать уже не во всех
СУБД.)

ВВОА Т
ALTER ТАВLЕ Vendo r s
DROP COLUМN vend_phone ;

Сложные изменения структуры таблицы обычно выполняются


вручную и включают следующие этапы.

1. Создание новой таблицы с новым расположением столбцов.


2. Использование инструкции INSERT SELECT (см. урок 1 5)
для копирования данных из старой таблицы в новую. В слу­
чае необходимости задействуются функции преобразования и
вычисляемые поля.
3. Проверка того факта, что новая таблица содержит нужные
данные.
4. Переименование старой таблицы (или удаление ее).
5. Присвоение имени новой таблице, которое ранее принадлежа­
ло старой таблице.
6. Восстановление триггеров, хранимых процедур, индексов и
внешних ключей, если это необходимо.

П Р И М ЕЧАН И Е: инструкция ALТER ТАВLЕ в SQLite


SQ Lite огра н и ч и вает переч ень операци й , которые можно в ы п ол­
н ять с помощью и н струкции ALTER ТАВLЕ. Одно и з н а и более
важн ых огра н и ч е н и й закл ючается в том , что в этой СУБД н ел ь­
зя п р и менять да н ную и н струкци ю дл я измен е н и я перв и ч н ых и
в н еш н их кл ючей . О н и должн ы указываться тол ько в начал ь н о й
и н струкци и CREATE ТАВLЕ.
182 УРОК 17. Созда ние табл иц и работа с н и м и

П Р ЕДУП РЕЖДЕ Н И Е: аккуратно исnо11ьэуйте инструкцию


ALТER ТАВLЕ
И н струкци ю ALTER ТАВLЕ следует испол ьзовать с особой осто­
рожность ю. П режде чем в ы пол н ять да н н ы й зап рос, убедитесь в
том , что у вас есть пол н ы й ком плект резе р в н ы х коп и й (схе м ы
и са м их да н н ых). В н есе н ие изменен и й в табл и цу базы да н н ых
нел ьзя отм ен ить. Есл и вы доба в ите в нее ненуж н ы е стол б ц ы ,
у в а с н е будет воз м ожности удал ить их. Аналоги ч н о , есл и в ы уда­
л и �е стол бец, кото р ы й вам на са мом деле нуже н , то рискуете по­
терять все да н н ые, содержа в ш и еся в н е м .

УАаn ение табn и ц


Удаление таблиц (имеется в виду удаление самих таблиц, а н е их
содержимого) - очень простой процесс. Таблицы удаляются с по­
мощью инструкции DROP TABLE.

ВВОА Т
DROP ТАВLЕ C u s t C op y ;

Ана11 из т
Эта инструкция удаляет таблицу Cus tCopy (которую мы создали
на уроке 1 5). В данном случае не требуется никакого подтверждения, и
невозможно вернуться к прежнему состоянию - в результате приме­
нения инструкции DROP TABLE таблица будет безвозвратно удалена.

СОВ ЕТ: исnо11ьэование ре11яционных nрави11 All R


nредотвращения оwибочноrо уда11ения
Во м н о гих СУБД п р и меняются п ра в ил а , п репятствующие удале­
н и ю табл и ц, связа н н ых с други м и табл и ца м и . Есл и эти п р а в ил а
действуют и в ы п р и м еняете и н струкци ю DROP ТАВLЕ по отно­
шен и ю к табл и це, которая связа н а с друго й табл и це й , СУБД за­
бл оки рует опера ц и ю до тех пор, пока не будет удал ена да н н а я
с в я з ь . Та кое поведение п р и ветствуется , поскол ь ку бла года ря
ему можно восп реп ятствовать ош ибочному удал е н и ю нужных
табл и ц .
Переи менова н и е та бл и ц 183

П ереименование табл и ц
В разных СУБД переименование таблиц осуществляется по­
разному. Не существует жестких, устоявшихся стандартов на выпол­
нение этой операции. Пользователи DB2, MariaDB, MySQL, Oracle
и PostgreSQL могут применять инструкцию RENAМE . Пользователям
SQL Server доступна хранимая процедура sp _rename. SQLite под­
держивает переименование таблиц посредством инструкции ALTER
ТАВLЕ.
Базовый синтаксис для всех операций переименования требует
указания старого и нового имен. Однако существуют различия, зави­
сящие от реализации. Обратитесь к документации своей СУБД, что­
бы узнать детали относительно поддерживаемого ею синтаксиса.

Резюме
На этом уроке вы ознакомились с несколькими новыми инструк­
циями SQL. Инструкция CREATE TABLE предназначена для созда­
ния новых таблиц, ALTER TABLE для изменения столбцов та­
-

блицы (или других объектов, таких как ограничения или индексы),


а инструкция DROP TABLE позволяет полностью удалить таблицу.
Все эти инструкции нужно использовать с особой осторожностью
и только после создания резервных копий базы данных. Поскольку
точный синтаксис этих инструкций варьируется в зависимости от
СУБД, вам придется обратиться к документации своей СУБД за до­
полнительной информацией.
УРОК 18

П р е д ставпен и я

На этом уроке рассказывается о том, что такое представлен ия,


как они работают и зачем они нужны. В ы также узнаете, как ис­
пользовать представления для упро щения некоторых SQL-запросов,
изученных нами на предыдущих уроках.

Ч то такое n редставn ен ия
Представления - это виртуальные таблицы. В отличие от та­
блиц, содержащих данные, представления содержат запросы, кото­
рые динамически извлекают данные, когда это необходимо.

П РИ М ЕЧАН И Е: nомержка в разных СУ&Д


M icrosoft Access поддержи вает п редста вле н и я , но не та к, ка к это
п р и н ято в ста нда ртн ых реал изациях SQL. Та к и м образо м , п р и­
меры да н ного урока не п р и м ен и м ы к Access.
П оддержка п редста влен и й была добавлена в MySQL верс и и 5.
В более ра н н их версиях СУБД п р и меры да н н о го урока работать
не будут.
SQLite п оддерживает п редста вле н и я , доступ н ы е тол ь ко для чте­
н и я . Их м ожно созда вать и п росматри в ать, но их qодерж и м ое
нел ьзя обновл ять.

Лучший способ объяснить, что такое представления, - рассмо­


треть конкретный пример. Вернемся к уроку 1 2 , на котором была
создана следующая инструкция SELECT для извлечения данных сра­
зу из трех таблиц.
186 УРОК 18. Предста вления

ВВОА Т
SELECT cus t_name , c u s t_cont a c t
FROM C u s t ome r s , Orde r s , Orde r i tems
WHERE C u s t ome r s . cu s t i d = Or de r s . cu s t id
AND Orde r i tems . o rder num Orde r s . o rde r num
AND prod_id = ' RGAN O l ' ;

Этот запрос позволяет извлечь информацию о клиентах, которые


заказали указанный товар. Любой пользователь, которому необходи­
мы такие данные, должен бьm бы разобраться в структуре таблицы,
а также в методике объединения таблиц. Чтобы извлечь аналогичные
данные для другого товара (или для нескольких товаров), последнее
условие в предложении WHERE придется модифицировать.
Теперь предположим, что весь этот запрос можно сохранить в
виде виртуальной таблицы ProductCu s t ome r s . Тогда для получе­
ния тех же самых данных достаточно было бы сделать следующее.

ВВОА Т
SELECT cus t_name , c u s t_contact
FROM Produ c t C u s t ome r s
WHERE prod_i d = ' RGAN O l ' ;

Это как раз тот случай, когда нужны представления. Таблица


ProductCu s t ome rs является представлением, поскольку она не со­
держит каких-либо столбцов или данных. Вместо них хранится за­
прос - тот самый, который был использован выше для объединения
таблиц.

СОВЕТ: соrnасованность СУ&Д


Си нта ксис созда н и я п редста вле н и й оди н а ков во всех осн о в н ых
СУБД.

Зачем нужны представления


Выше был рассмотрен один из случаев использования представ­
ления. Довольно часто они применяются для выполнения следую­
щих операций.
Что такое представлен ия 187

..,. Повторное использование инструкций SQL .


..,. Упрощение сложных запросов. После того как запрос подго­
товлен, его можно с легкостью использовать повторно, и для
этого не придется разбираться в нюансах его работы .
..,. Вывод фрагментов таблицы вместо всей таблицы .
..,. Защита данных. Пользователям можно предоставить доступ к
определенному подмножеству таблиц, а не ко всем таблицам .
..,. Изменение форматирования и способа отображения данных.
Представления могу�;: возвращать данные, отформатирован­
ные и отображаемые не так, как они хранятся в таблицах.

Созданные представления можно использовать точно так же, как


и таблицы. Можно выполнять инструкции SELECT по отношению
к ним, фильтровать и сортировать в них данные, объединять пред­
ставления с другими представлениями или таблицами и, возможно,
даже добавлять в них данные или обновлять их. (На последнюю опе­
рацию налагаются определенные ограничения. Об этом будет рас­
сказано далее.)
Важно не забывать о том, что представления - это виртуальные
таблицы, данные которых хранятся в других таблицах. Представле­
ния не содержат данных как таковых, поэтому строки, которые они
возвращают, извлекаются из других таблиц. Если данные этих та­
блиц изменяются, представления обновятся автоматически.

П Р ЕДУП РЕЖДЕ Н И Е: nробпемы ПРОИ3ВОАИТеnьности


Поскол ь ку предста вл е н и я не содержат да н н ых, кажд ы й раз, ког­
да п роисходит обра щен ие к н и м , дл я в ы пол н е н и я за п роса п рихо­
дится п роводить оп ределен н ы й поиск. Есл и вы создал и сложное
п редста вл е н и е с нескол ь ки м и объединен и я м и и фил ьтра м и или
есл и б ыл и задействова н ы вл оже н н ы е п редста влен и я , п роиз­
водител ь н ость СУБД резко с н и з ится . Рекомендуется п ровести
тести рова н и е , п режде чем созда вать п р иложен и я , в которых
и нтенс и в н о и спол ьзуются п редста вле н и я .

Правила и ограничения представлений


Прежде чем создавать представления, следует узнать о связанных
с ними ограничениях. К сожалению, представления весьма специ­
фичны для каждой СУБД, поэтому обязательно обратитесь к доку­
ментации своей СУБД.
188 УРОК 18. П редста вления

Ниже приведено несколько самы)\. общих правил и ограничений,


которыми следует руководствоваться при создании и использовании
представлений.

� Представления, как и таблицы, должны иметь уникальные


имена. (Они не могут быть названы так же, как другие табли­
цы или представления.)
� Не существует ограничения на количество представлений, ко­
торые могут быть созданы.
� Для того чтобы создать представление, необходимо иметь со­
ответствующие права доступа. Обычно их предоставляет ад­
министратор базы данных.
� Представления могут быть вложенными. Это означает, что
представление может быть создано посредством запроса, ко­
торый извлекает данные из другого представления. Точное
количество уровней вложения зависит от СУБД. (Вложенные
представления могут серьезно снизить производительность
при выполнении запроса, поэтому их нужно основательно
протестировать, прежде чем применять на практике.)
� Во многих СУБД запрещается использование предложения
ORDER ВУ в запросах к представлениям.
� В некоторых СУБД требуется, чтобы каждый возвращаемый
столбец обладал именем, - это подразумевает использова­
ние псевдонимов, если столбцы представляют собой вычис­
ляемые поля. (См. урок 7, где рассказывалось о псевдонимах
столбцов.)
� Представления нельзя индексировать. Они также не могут
иметь триггеров или связанных с ними значений по умолчанию.
� В некоторых СУБД представления трактуются как запросы,
предназначенные только для чтения. Это означает, что из пред­
ставлений можно извлекать данные, но их нельзя заносить в
таблицы, на основе которых было создано представление. Об­
ратитесь к документации своей СУБД, чтобы узнать детали.
� Некоторые СУБД позволяют создавать представления, кото­
рые не разрешают добавлять или обновлять строки, если это
может привести к тому, что строки уже не будут являться ча­
стью данного представления. Например, если представление
возвращает только информацию о клиентах, имеющих адре­
са электронной почты, обновление информации о клиенте с
Созда ние предста влен ий 189

целью удаления его адреса электронной почты приведет к


тому, что данный клиент будет исключен из представления.
Таково поведение по умолчанию, и оно допускается, но не­
которые СУБД способ н ы препятствовать возникновен ию по­
добных случаев.

СОВ ЕТ: обратитесь к иокументации своей СУ&Д


С п и сок этих п ра в ил довол ьно дл и н н ы й , и докум ента ц и я вашей
СУБД почти н а в е р н я ка содержит еще какие-то п ра в ил а . П ридет­
ся потратить н е кото рое время на и зуче н и е подобн ых огра н и че­
н и й , п режде чем браться за созда н и е п редста влен и й .

Со здание п редставn ен и й
Итак, вы знаете, что такое представления ( и какими правилами
следует руководствоваться при работе с ними). Теперь разберемся,
как они создаются.
Представления создаются с помощью инструкции CREATE VIEW.
Аналогично инструкции CREATE ТАВLЕ, данную инструкцию мож­
но использовать только для создан ия представления, которого пре­
жде не существовало.

П РИ М ЕЧАН И Е: УА8118НИ8 nреиставпений


Для удале н и я п редста вле н и я п редназначена и н струкция DROP
VIEW. Ее с и нта кси с п рост:

DRO P V I E W имя_ представления;

Чтобы переза п и сать (или обнов ить) п редста вле н и е , вна чале
нужно п р и м е н ить по отношен и ю к нему и н струкци ю DROP VI EW,
а потом заново создать п редставлен ие.

Использование представлений д ля
упро щ ения сложных о бъединений
Чаще всего представления используются для упрощения слож­
ных запросов, и нередко это относится к объеди н е н иям. Рассмотрим
следующий пример.
190 УРОК 18. П редста вления

CREATE V I EW ProductCu s t ome r s AS


SELECT cus t_name , c u s t_conta c t , prod_id
FROM Cus t ome r s , Orde r s , Orde r i tems
WHERE C u s t ome r s . cust i d = Orde r s . cu s t id
AND Orde r i tems . o rde r num Orde r s . o rder_num ;

Анапиз т
Посредством этой инструкции создается представление P r o ­
ductCu s t ome r s , которое объединяет три таблицы для получения
списка клиентов, заказавших какой-нибудь товар. Если затем выпол­
нить инструкцию SELECT * FROM ProductCustome r s , она вернет
список всех клиентов, сделавших заказы.
Для получения списка клиентов, заказавших товар RGANO l , не­
обходимо выполнить следующее.

SELECT cu s t_name , c u s t�contact


FROM Produ c t C u s t ome r s
WHERE prod_id = ' RGAN O l ' ;

Вывод т
cu s t name cust contact

Fun4Al l Den i s e L . Stephens


The Т о у S t o r e Kim Howard

Анап из т
Эта инструкция извлекает указанные данные из представления
благодаря предложению WHERE. Когда СУБД обрабатывает такой за­
прос, она добавляет указанное условие к любому уже существующе­
му предложению WHERE в запросе самого представления, благодаря
чему данные фильтруются правильно.
Таким образом, представления могут значительно упростить
сложные инструкции SQL. Используя представления, можно один
раз записать код SQL и затем повторно применять его, когда возника­
ет такая необходимость.
Создание предста влений 191

СОВ ЕТ: созАание nовторно исnо.nьзуемых nреАстав.nений


Хо рошей идеей я вляется созда н и е п редста влен и й , не п р и вя­
за н н ых к кон кретн ы м да н н ы м . Н а п р и мер, п редста вле н ие, соз­
да н ное в п редыдущем п р и мере, возвра щает и мена кл иентов,
заказа в ш их все тов а р ы , а н е тол ько тов а р RGAN O l (дл я кото ро­
го п редставление первоначал ь н о и созда валось). Рас ш и ре н и е
д и а п азона п редста вле н и я позвол я ет м ного кратно испол ьзо­
вать его, и тем са м ы м устра н я ется н еобход и мость в созда н и и и
хра н е н и и м ножества п охожих п редста влен и й . Это дел ает та кое
п редста влен и е еще более эффекти в н ы м .

Испол ьзование представлений для


переформатирования извлекаем ых данных
Как уже говорилось ранее, другим распространенным случаем
использования представлений является переформатирование извле­
каемых данных. Следующая инструкция SELECT (см. урок 7) воз­
вращает имя поставщика и его местонахождение в одном комбини­
рованном вычисляемом столбце.

Ввод т
SELECT RTRIM ( vend_name ) + ' ( ' + RTRIM ( vend_country) + ' ) '

AS vend t i t l e
FROM Vendo r s
ORDER ВУ vend_name ;

Вы вод т
vend t i t l e

B e a r Emporium ( USA)
Bears R U s ( USA)
Do l l House I n c . ( USA)
Fun and Game s ( England)
Furb a l l I n c . ( USA)
Jouet s e t ours ( France )

Показанная ниже инструкция аналогична вышеприведенной,


но в ней применяется оператор 1 1 (его мы также рассматривали на
уроке 7).
192 УРОК 18. Предста вл е н ия

Ввод т
SELECT RTRIM (vend_name ) 1 1 ' (' 1 1 RТRIM (vend_country) 1 1 ') '
AS vend t i t l e
FROM Vendo r s
ORDER В У vend_name ;

Вывод т
vend t i t l e

B e a r Emporium ( USA)
Bears R U s (USA)
Do l l Hou s e I n c . ( USA)
Fun and Game s ( England)
Furb a l l I n c . ( US A )
Joue t s e t ours ( France )

Теперь предположим , что результаты регулярно требуются в та­


ком форм ате. В м есто того чтобы выполнять конкатенацию всякий
раз, когда в этом возникает необходи м ость, м ожно создать пред­
ставление и использовать его в м есто объединения. Для превраще­
ния этой инструкции в представление нужно поступить следующи м
образом .

Ввод т
CREATE VIEW Vendo rLocat i o n s AS
SELECT RTRIM ( vend_name ) + ' (' + RTRIM ( vend_count r y ) + ') '
AS vend t i t l e
FROM Vendo r s ;

А вот синтаксис с использованием оператора 1 1 .

CREATE V I EW Vendo rLocat i o n s AS


SELECT RTRIM (vend_name ) 1 1 ' (' 1 1 RTRIM ( vend_country) 1 1 ') '
AS vend t i t l e
FROM Vendo r s ;
Созда ние представлений 193

Ана.nиз т
Посредством этой инструкции создается представление, исполь­
зующее в точности тот же самый запрос, что и в предыдущей ин­
струкции SELECT. Чтобы извлечь данные, необходимые для созда­
ния почтовых наклеек, выполните следующее.

Ввод, т
SELECT *
FROM Vendo rLo c a t i on s ;

Вывод, т
vend t i t l e

B e a r Emp o r i um ( USA)
B e a r s R U s ( USA)
Doll Hous e . I n c . ( USA)
Fun and Game s ( England)
Furb a l l I n c . ( USA)
Jou e t s e t ours ( France )

П РИ М ЕЧАН И Е : все оrраничения инструкции SELECT


сохраняются
Ранее уже го ворилось о том , что си нта ксис созда н и я п редста в­
лен и й достаточно согласован в разн ых СУБД. Но откуда тогда та к
м н о го верси й си нта ксиса и н струкций? Дело в то м , что п редста в­
ление п росто скры вает и н струкцию SELECT, с и нта ксис которой
должен четко соответство вать п равилам и огра н и ч е н и я м , п р и ­
н яты м в испол ьзуемой СУБД.

Испол ьзование представлений для


ф ил ьтра ц ии нежелательных данных
Представления могут также оказаться полезными для примене­
ния распространенных условий WHERE. Например, вам может пона­
добиться определить представление Cu s t ome rEMa i l L i s t таким
образом, чтобы оно отфильтровывало клиентов, не имеющих адре­
сов электронной почты. Для этого необходимо создать следующую
инструкцию.
194 УРОК 18. Предста вления

ВВОА Т
CREATE V I EW C u s t omerEMa i l L i s t AS
SELECT c u s t i d , c u s t_name , cus t_ema i l
FROM Cus tome r s
WHERE cu s t ema i l I S N O T NULL ;

Ана11 из т
Очевидно, отправляя сообщение в список рассылки, следовало
бы пропустить клиентов, у которых нет адреса электронной почты.
В данном случае предложение WHERE отфильтровывает строки, име­
ющие значения NULL в столбце cus t ema i l , так что соответствую­
_

щие записи не будут извлекаться.


Теперь представление C u s t ome rEMa i l Li s t можно использо­
вать подобно любой другой таблице.

ВВОА Т
SELECT *
FROM C u s t omerEMa i l L i s t ;

В ЬI ВОА Т
cust id c u s t name cust ema i l

1000000001 Vi l l age Toys s a l e s @ v i l l agetoys . com


1000000003 Fun 4Al l j j one s @ fun 4 a l l . com
1000000004 Fun 4All ds tephen s @ fun 4 a l l . com

П РИ М ЕЧАН И Е: ПР8А11 0 Ж8НИЯ WНERE


Есл и п р едл оже н и е WHERE испол ьзуется п р и и з вл ечен и и да н н ых
из п редста влен и я , два н а бора усл о в и й (одно в са м о м п редста в­
лен и и и другое, переда ваемое ему) будут ско м б и н и рова н ы ав­
томати чески .

И спол ьзование представлений


с вы ч исл я е м ы м и пол я м и
Представления чрезвычайно палезны для упрощения запросов
с вычисляемыми полями. Ниже приведена инструкция S E L E C T ,
С озда н и е предста влен и й 195

впервые использованная нами на уроке 7. Она извлекает элементы


указанного заказа и вычисляет суммарную стоимость для каждого
элемента.

ВВОА Т
SELECT prod_i d ,
quant i t y ,
i tem_p r i c e ,
quant i t y * i tem_p r i c e AS expanded_p r i c e
FROM Orde r i tems
WHERE o r de r num = 20008;

ВЫВОА Т
prod_id quant i t y i tem_p r i c e expanded_p r i c e
------- -------- ---------- --------------

RGAN O l 5 4 . 9900 24 . 9500


BR0 3 5 11 . 9900 59 . 9500
BNBG O l 10 3 . 4 900 34 . 9000
BNB G 0 2 10 3 . 4 900 34 . 9000
BNBG 0 3 10 3 . 4 900 34 . 9000

Для превращения его в представление необходимо выполнить


следующее.

ВВОА Т
CREATE V I EW Orde r i t emsExpanded AS
SELECT o rde r_num,
prod_id ,
quan t i t y ,
i t em_p r i c e ,
quan t i t y * i tem_p r i c e AS expanded_p r i c e
FROM Orde r i t ems ;

Чтобы получить информацию о заказе 2 0 0 0 8 (она была выведена


выше), необходимо выполнить следующий запрос.

ВВОА т
SELECT *
FROM Orde r i temsExpanded
WHERE order num = 20008;
196 УРОК 18. П р едста вл е н ия

Вывод� т
order num prod_ i d quant i ty i tem_p r i c e expanded_p r i c e
--------- ------- -------- ---------- --------------

20008 RGAN O l 5 4 . 99 · 2 4 . 95
20008 BR0 3 5 1 1 . 99 5 9 . 95
20008 BNBGO l 10 3 . 49 34 . 90
20008 BNBG0 2 10 3 . 49 34 . 90
20008 BNBG0 3 10 3 . 49 34 . 90

Как видите, представления легко создавать, а использовать - еще


легче. В эффективно спроектированной базе данных представления
могут существенно упростить сложные запросы.

Резюме
Представления - это виртуальные таблицы. Вместо самих дан­
ных они содержат запросы, посредством которых данные извлекают­
ся в случае необходимости. Представления обеспечивают должный
уровень инкапсуляции инструкций SELECT и могут быть использо­
ваны для упрощения работы с данными, а также для переформатиро­
вания данных и ограничения доступа к ним.
УРОК 19

Х р а н и м ые п р оцедуры

На этом уроке вы узнаете, что такое хранимые процедуры, для чего


и как они прим еняются . В ы также ознакомитесь с базовым синтак­
сисом, используемым при создании и запуске хранимых процедур.

Ч то такое хран и м ые процедуры


Большинство запросов SQL, которые м ы до сих пор создавали,
просты в том смысле, что в них применяется только одна инструкция
по отношению к одной или нескольким таблицам. Но не все запросы
столь просты - зачастую приходится использовать несколько ин­
струкций для выполнения сложного запроса. Рассмотрим, к примеру,
следующий с ценарий.
,
.... При обработке заказа необходимо удостовериться в том, что
соответствующие товары есть на складе.
.... Если товары есть на складе, они должны быть зарезервиро­
ваны, чтобы их не продали кому-то другому, а их количество,
доступное другим покупателям, должно быть уменьшено со­
о,тветственно сделанному заказу.
.... Товары, отсутствующие на складе, должны быть запрошены
у поставщика.
.... Клиенту необходимо сообщить, какие товары есть на складе
(и могут бьпь отгружены немедленно), а какие - запрашива­
ются под заказ.

Очевидно, это не полный список действий, но суть должна быть


ясна. Решен ие подобной задачи потребует применения многих ин­
струкций SQL по отношению ко многим таблицам. Помимо того что
сами инструкции, подлежащие выполнению в подобных случаях, и
их порядок не постоянны, они могут (и будут) изменяться в зависи­
мости от того, какие товары имеются на складе, а каких там нет.
198 УРОК 19. Хранимые процедуры

Как бы вы написали такой код? Можно бьшо бы записать каждую


из инструкций SQL отдельно и выполнять инструкции в зависимо­
сти от полученных результатов. Вам пришлось бы делать это каждый
раз, когда возникала бы необходимость в подобной обработке дан­
ных (и для каждого приложения, которое в ней нуждается).
Альтернативный вариант - создать хранимую процедуру. Это
набор из нескольких инструкций, сохраненный для последующего
выполнения. Хранимую процедуру можно рассматривать как ко­
мандный файл, хотя это нечто большее.

П РИ М ЕЧАН И Е: поддержка в различных СУ&Д


Хра н и м ые процедуры не п оддерживаются в Access и SQLite.
Та к и м об разом , п р и м еры дан ного урока не п р и м е н � м ы в этих
СУБД.
П оддержка хра н и м ых п ро цедур была доба влена в MySQ L вер­
сии 5. В более ра н н их версиях СУБД п р и ме р ы урока работать
не будут.

П Р И М ЕЧАН И Е: rораздо бопьwе информации


Хра н и м ые п ро цедуры - тем а довол ьно сл ож н а я , и пол ностью
рассмотреть ее можно тол ько в отдел ьной кн и ге. Да н н ы й урок не
н ауч ит вас всему, что н еобход и м о з н ать о хра н и м ых п роцедурах.
Скорее это в веде н и е в дан ную тему, п р и з в а н ное озна ко м ить
вас с тем , что собой п редста вл я ют хра н и м ые п роцедуры и что с
их помощью м ожно делать. По существу, п редста влен н ы е здесь
п р и меры соответствуют тол ько си нта ксису Oracle и SQL Server.

З ачем н ужны хра н и м ы е


процедуры
Теперь, когда вы знаете, что такое хранимые процедуры, возника­
ет другой вопрос: для чего их применять? На то существует множе­
ство причин, ниже перечислены лишь основные.

� Для упрощения сложных запросов (как уже говорилось выше)


за счет инкапсуляции инструкций в один блок, удобный для
выполнения.
З а ч ем н уж н ы хра н и м ы е процедуры 199

... Для обеспечения непротиворечивости данных за счет того,


что не требуется снова и снова воспроизводить одну и ту же
последовательность инструкций. Если все разработчики и
приложения используют одни и те же хранимые процедуры,
значит, будет выполняться один и тот же код.
Следствием этого является предотвращение ошибок. Чем
больше действий необходимо выполнить, тем выше вероят­
ность появления ошибок. Отсутствие ошибок обеспечивает
целостность данных.
... Для упрощения управления изменениями. Если таблицы, име­
на столбцов, деловые правила (или что-то подобное) изменя­
ются, обновлять приходится только код хранимой процедуры
и ничего больше.
Следствием этого является повышение безопасности. Предо­
ставление доступа к основным данным только через храни­
мые процедуры снижает вероятность повреждения данных
(случайного или преднамеренного).
... Поскольку хранимые процедуры обычно хранятся в скомпи­
лированном виде, СУБД тратит меньше времени на их обра­
ботку. Это приводит к повышению производительности.
... Некоторые возможности SQL реализуются только в одиноч­
ных запросах. Хранимые процедуры можно применять для
написания более гибкого и мощного кода.

Итак, имеются три основных преимущества: простота, безопас­


ность и производительность. Очевидно, все они чрезвычайно важны.
Однако, прежде чем бросаться превращать весь свой SQL-кoд в хра­
нимые процедуры, следует узнать и о другой стороне медали.

... Синтаксис хранимых процедур сильно зависит от СУБД. На­


писать по-настоящему переносимый код хранимой проце­
дуры практически невозможно. В то же время сами вызовы
хранимых процедур (их имена и способы передачи аргумен­
тов) могут быть достаточно переносимыми, поэтому, если вам
необходимо перейти на другую СУБД, по крайней мере код
клиентского приложения, возможно, не придется менять.
... Хранимые процедуры сложнее в написании, чем основные
инструкции SQL, и их подготовка требует большей квали­
фикации и опыта. Поэтому многие администраторы баз дан­
ных ограничивают права на создание хранимых процедур в
качестве меры безопасности.
200 УРОК 19. Хранимые процедуры

Несмотря на вышесказанное, хранимые процедуры весьма полез­


ны и непременно должны применяться. В действительности многие
СУБД располагают всевозможными хранимыми процедурами, ко­
торые предназначены для управления базами данных и таблицами.
Обратитесь к документации своей СУБД, чтобы получить больше
информации об этом.

П РИ М ЕЧАН И Е: не можете написать хранимые


процед,уры? Тоrд,а просто испо11ьзуйте их
Во м ногих СУБД разл и ч а ются меры безопасности и п ра в а до­
ступа, необход и м ы е дл я н а п и са н и я хра н и м ых п роцедур и дл я ·их
в ы пол н е н и я . И это хорошо. Есл и в ы не н а м е ре н ы п и сать соб­
стве н н ы е хра н и м ы е п роцедуры , и с п ол ьзуйте гото в ы е .

В ы n о.n нение хранимых п роцедур


Хранимые процедуры выполняются намного чаще, чем пишутся,
поэтому мы начнем именно с их выполнения. Инструкция SQL для
запуска хранимой процедуры - EXECUTE - принимает имя храни­
мой процедуры и передаваемые ей аргументы. Рассмотрим следую­
щий пример.

Ввод •
EXECUTE AddNewProduct ( ' JT S O l ' ,
' S tuffed E i f f e l Towe r ' ,
6 . 49,
' Pl u s h s t u f fed toy with the text
� La Tour E i f f e l i n red wh i t e and Ы u е ' )

Ана11из •
Здесь выполняется хранимая процедура AddNewProduct, кото­
рая добавляет новый товар в таблицу Produ c t s . Процедура при­
нимает четыре аргумента: идентификатор поставщика (первичный
ключ таблицы Vendo r s ) , название товара, цена и описание. Эти
четыре параметра соответствуют четырем ожидаемым переменным
хранимой процедуры (определенным в ней). Данная процедура до­
бавляет новую строку в таблицу Products и распределяет получен­
ные аргументы по соответствующим столбцам.
Созда н и е хра н и м ых процедур 201

В таблице P r o du c t s есть еще один столбец, нуждающийся


в присвоении значения: p r o d_i d, который является первичным
ключом таблицы. Почему это значение не передается в хранимую
процедуру в виде аргумента? Для того чтобы идентификаторы гене­
рировались правильно, безопаснее сделать подобный процесс авто­
матизированным (не полагаясь на конечного пользователя). Именно
поэтому хранимая процедура используется в данном примере. Она
выполняет следующие действия:

� подтверждает правильность передаваемых данных, обеспечи­


вая наличие значений у всех четырех аргументов;
� генерирует уникальный идентификатор, который будет ис­
пользован в качестве первичного ключа;
� добавляет данные о новом товаре в таблицу Produ c t s , со­
храняя созданный первичный ключ и занося данные в соот­
ветствующие столбцы.

Таков основной способ выполнения хранимой процедуры. В за­


висимости от СУБД могут быть доступны и другие варианты выпол­
нения, включая следующие.

� Опциональные аргументы со значениями по умолчанию, при­


сваиваемыми в случае, если аргумент не задан пользовате­
лем.
� Нестандартные параметры, указываемые в виде пар парамеТр=
значение.
� Выходные параметры, позволяющие хранимой процедуре
обновлять переменную, используемую вызывающим прило­
жением.
� Данные, извлекаемые инструкцией SELECT.
� Возвращаемые коды, позволяющие хранимой процедуре пере­
давать значение вызывающему приложению.

Со здание хранимых п роцедур


Как уже говорилось, создание хранимой процедуры - задача не
из тривиальных. Чтобы продемонстрировать это, рассмотрим про­
стой пример : хранимую процедуру, которая подсчитывает в списке
рассылки число клиентов, имеющих адрес электронной почты.
Ниже приведена версия для Oracle.
202 УРОК 19. Хра н и м ые процедуры

В ВОА Т
CREATE PROCEDURE Ma i l i n gL i s tCount
L i s t C ount OUT INTEGER

IS
v rows INTEGER ;
BEGIN
SELECT COUNT ( * ) INTO v rows
FROM Cus tome r s
WHERE NOT c u s t ema i l I S NUL L ;
L i s t C ount ·= v_rows ;
END ;

Ана11 из т
Эта хранимая процедура принимает один аргумент List­
-

Count. Вместо того чтобы передавать значение в хранимую проце­


дуру, данный аргумент возвращает значение из нее. Ключевое слово
OUT определяет подобное поведение аргумента. Oracle поддерживает
аргументы типов IN (передаются в хранимые процедуры), OUT (пе­
редаются из хранимых процедур) и INOUT (передаются в обоих на­
правлениях). С обственно код хранимой процедуры заключен между
ключевыми словами BEG IN и END. Здесь для определения клиентов,
имеющих адреса электронной почты, выполняется простая инструк­
ция SELECT. После этого выходному аргументу L i s tCount при­
сваивается значение, равное количеству строк в выборке.
ДJJя запуска примера в Oracle необходимо вьшолнить следующий код.

В ВОА Т
var ReturnVa lue NUМВER
ЕХЕС Ma i l ingL i s tCount ( : ReturnVa l ue ) ;
SELECT ReturnValue ;

Ана11из т
В этом коде объявляется переменная, которая будет хранить
значение, возвращаемое процедурой. После этого запускается сама
процедура и выполняется инструкция SELECT для отображения по­
лученного значения.
Ниже приведена версия для Microsoft SQL Server.
Созда н и е х ран и м ы х процедУр 203

CREATE PROCEDURE Ma i l i n gL i s tCount


AS
DECLARE @ cnt INTEGER
SELECT @ cn t = COUNT ( * )
FROM C u s t ome r s
WHERE N O T cust ema i l I S NULL ;
RETURN @ cn t ;

Ана11из т
Эта хранимая процедура вообще не принимает никаких аргу­
ментов. Вызывающее приложение получает нужное значение благо­
даря тому, что в SQL Server поддерживаются возвращаемые значе­
ния. Здесь посредством инструкции DECLARE объявлена локальная
переменная @ cn t (имена всех локальных переменных в SQL Server
начинаются с символа @). Эта переменная затем используется в ин­
струкции S E L E C T , принимая значение, возвращаемое функцией
COUNT ( * ) . Наконец, инструкция RETURN используется для передачи
результатов подсчета в вызывающее приложение.
Для запуска примера в SQL Server необходимо выполнить сле­
дующий код.

DECLARE @ ReturnValue INT


EXECUTE @ Retu rnVa lue=Ma i l ingL i s tCount ;
SELECT @ Re t u rnValue ;

Ана11из т
В этом коде объявляется переменная, которая будет хранить зна­
чение, возвращаемое процедурой. Затем запускается сама процедура
и выполняется инструкция SELECT для отображения полученного
значения.
Приведем еще один пример, но на этот раз будем добавлять но­
вый заказ в таблицу Orde r s . Данный пример подходит только для
SQL Server, однако он хорошо иллюстрирует, как применять храни­
мые процедуры.
204 УРОК 19. Хра н и м ые процедуры

ВВОА Т
CREATE PROCEDURE NewOrde r @ cu s t_id CHAR ( l O )
AS
-- Объявление переменной для номера заказа
DECLARE @ o rde r пит INTEGER
- - Получение т екуще г о наибольше г о номера заказа
SELECT @ o rder_num=МAX ( o rde r_num )
,FROM Orde r s
- - Определение следующе г о номера заказа
SELECT @ o rder-num= @ o rder-num+ l
-- Добавление нового заказа
INSERT INTO Orde r s ( o rde r_num, · o rde r_date , cus t_i d )
VALUE S ( @ orde r_num, GETDATE ( ) , @ cu s t_i d )
- - В озвращение номера заказа
RETURN @ o rder_num ;

Анап из т
Эта хранимая процедура создает новый заказ в таблице Orde r s
и принимает один аргумент: идентификатор клиента, сделавшего за­
каз. Два других столбца таблицы - номер и дата заказа - генери­
руются автоматически в самой хранимой процедуре. Вначале в коде
объявляется локальная переменная для хранения номера заказа. За­
тем запрашивается текущий наибольший номер заказа (посредством
функции МАХ ( ) ), который увеличивается на единицу (с помощью
инструкции SELECT) . После этого посредством инструкции INSERT
добавляется новый заказ с использованием только что сгенерирован­
ного номера заказа, текущей системной даты (определяется с помо­
щью функции GETDATE ( ) ) и полученного идентификатора клиента.
Наконец, номер заказа (необходимый для обработки элементов зака­
за) возвращается с помощью инструкции RETURN @ o rder num. Об­ _

ратите внимание на то, что код снабжен комментариями. Это всегда


следует делать при написании хранимых процедур.
Ниже приведена несколько иная версия того же кода для SQL
Server.
Создание хранимых процедур 205

ВВОА Т
CREATE PROCEDURE NewOrde r @ cu s t id CНAR ( l O )
AS
-- Д о бавление нов о г о заказа
INSERT INTO Orde r s ( cu s t_id)
VALUES ( @ cust_i d )
- - Во звращение н омера заказа
SELECT o rder num = @ @ I DENT I T Y ;

С О ВЕТ: комментируйте свой код


Л юбой код должен б ыть сн абжен ко м м ента р и я м и , и хра н и м а я
п роцедура - н е искл юч е н и е . Добавл е н и е ко м м е нта рие в не
окажет н и ка кого вл и я н и я на п роизводител ьность, та к что здесь
нет "обратно й стороны м едал и " ( в ре м я тратится тол ько на на­
п и са н и е ком м ента риев). А п ре и м ущества очевидн ы , н а п р и м е р
облегч е н и е п о н и м а н и я кода друг и м и п рогра м м иста м и (да и
ва м и тоже), а та кже удобство его изменен и я спустя н е которое
в рем я .
Ка к отмечалось на уроке 2 , сам ы й расп ростра нен н ы й способ
ком м е нти рова н и я кода - поста вить в начале строки с и м во­
лы -- (два деф иса). Некоторые СУБД поддерживают и ал ьтерна­
ти в н ы й си нта ксис ком м е нтариев, н о си нта ксис - - ун и версал е н ,
поэтому луч ш е испол ьзовать его.

Анализ т
Данная хранимая процедура также создает новый заказ в та­
блице Orde r s . Но на этот раз СУБД сама генерирует номер зака­
за. Большинство СУБД поддерживают такой тип функционально­
сти (подобные столбцы называются полями автонумерации). Опять
же, процедуре передается только один аргумент: идентификатор
клиента, сделавшего заказ. Номер и дата заказа не указываются во­
обще - СУБД использует значение по умолчанию для даты ( функ­
ция GETDATE ( ) ), а номер заказа генерируется автоматически. Как
узнать, какой идентификатор был сгенерирован? В SQL Serer для
этого предназначена глобальная переменная @ @ I DENT I TY, возвра­
щаемая в вызывающее приложение (на этот раз с использованием
инструкции SELECT).
206 УРОК 19. Хран и м ые процедУры

Как видите, хранимые процедуры очень часто позволяют решить


одну и ту же задачу разными способами . Выбор во многом будет з а­
висеть от особенностей СУБД , с которой вы работаете.

Резюм е
На этом уроке вы узнали, что т акое хранимые процедуры и для
чего они нужны. Вы т акже ознакомились с базовым синтаксисом,
применяемым для создания и выполнения хранимы х процедур, и
узнали о способах и х применения. В каждой СУБД хранимые про­
цедуры реализуются по-разному. Не исключено, что в вашей СУБД
способ выполнения хранимых процедур будет несколько иным, и вы
получите возможности, не упомянутые в данной книге. За дополни­
тельной информацией обратитесь к документации своей СУБД .
УРОК 20

Обраб от ка транз а к ци й

На этом уроке вы узнаете, что такое транзакции и как применять


инструкции СОММI Т и ROLLBACK для их обработки.

Ч то такое тран закци и


Обработка транзакций обеспечивает сохранение целостности
базы данных за счет того, что пакеты SQL-запросов выполняются
полностью или не выполняются вовсе.
Как объяснялось на уроке 1 2 , реляционные базы данных органи­
зованы таким образом, что информация в них хранится во многих
таблицах. Благодаря этому облегчается управление данными, а также
их повторное использование. Не вдаваясь в подробности, почему ре­
ляционные базы данных устроены именно так, следует отметить, что
схемы всех удачно спроектированных баз данных можно в какой-то
степени отнести к реляционным.
Хороший пример - таблицы заказов, с которыми мы работали на
последних 1 8-ти уроках. Заказы хранятся в двух таблицах: Orde r s
содержит описание самих заказов, а Orderi tems - информацию об
отдельных элементах заказов. Эти две таблицы связаны между собой
с помощью уникальных идентификаторов, которые называются пер­
вичными ключам и (см. урок 1 ) Кроме того, эти таблицы связаны и с
.

другими таблицами, содержащими информацию о клиентах и товарах.

1 . Процесс добавления нового заказа заключается в выполнении


следующих действий.
2. Проверка, содержится ли информация о клиенте в базе дан­
ных. Если нет, такая информация добавляется.
3. Получение идентификатора клиента.
4. Добавление строки в таблицу Orders и связывание ее с иден­
тификатором клиента.
5. Получение идентификатора нового заказа, присвоенного ему
в таблице Orde r s .
208 УРОК 20. Об ра ботка тра нзакций

Добавление одной строки в таблицу Orderitems для каждого за­


казанного товара и соотнесение его с таблицей Orde r s посредством
полученного идентификатора заказа (а также с таблицей Products
посредством идентификатора товара).
Теперь предположим, что какая-то ошибка в базе данных (напри­
мер, нехватка места на диске, ограничения, связанные с безопасно­
стью, блокировка таблицы) помешала завершить эту последователь­
ность действий. Что случится с данными?
Хорошо, если ошибка произойдет после добавления информации
о клиенте в таблицу, но до того, как она будет добавлена в табли­
цу Orde r s , - в таком случае проблем не возникнет. Разрешается
хранить данные о клиентах без заказов. При повторном выполнении
приведенной выше последовательности действий добавленная за­
пись о клиенте будет возвращена и использована. Вы сможете про­
должить работу с того места, на котором остановились.
Но что если ошибка произойдет после того, как была добавлена
строка в таблицу Orders, но до того, как будут добавлены строки в
таблицу Orde r i tems? Теперь в базе данных будет присутствовать
пустой заказ.
Или еще более плохой сценарий: что если система сделает ошиб­
ку в процессе добавления строк в таблицу Orde r i t ems ? В таком
случае заказ будет внесен в базу данных лишь частично, и вы даже
не будете знать об этом.
Как решить эту проблему? Именно здесь в игру вступают тран­
закции. Обработка транзакций - это механизм, применяемый для
управления наборами SQL-запросов, которые должны быть выпол­
нены только целиком, т.е. таким образом, чтобы в базу данных не
могли попасть результаты частичного выполнения запросов. При
обработке транзакций можно быть уверенным в том, что выполне­
ние набора запросов не было прервано посередине - они или были
выполнены все, или не был выполнен ни один из них. Если никаких
ошибок не произошло, результаты работы всего набора фиксируются
(записываются) в таблицах базы данных. Если произошла ошибка,
должны быть отменены все операции, чтобы вернуть базу данных в
прежнее согласованное состояние.
Итак, если обратиться к нашему примеру, то вот как на самом
деле должен выглядеть процесс.

1 . Проверка, содержится ли информация о клиенте в базе дан­


ных. Если нет, такая информация добавляется.
Уп равление тран за кци я м и 209

2. Фиксация информации о клиенте.


3. Получение идентификатора клиента.
4. Добавление строки в таблицу Orde r s .
5 . Если в о время добавления строки в таблицу Orde r s проис­
ходит ошибка, операция отменяется.
6. Получение идентификатора нового заказа, присвоенного ему
в таблице Orde r s
7 . Добавление одной строки в таблицу Orde r i terns для каждо­
го заказанного товара.
8. Если в процессе добавления строк в таблицу O r de r i terns
происходит ошибка, добавление всех строк в таблицу Order­
I terns отменяется.

При работе с транзакциями вы часто будете сталкиваться с одни­


ми и теми же терминами.

• Транзакция. Единый набор SQL-запросов.


• Откат. Процесс отмены указанных инструкций SQL.
• Фиксация. Запись несохраненных инструкций SQL в табли­
цы базы данных.
• Точка сохранения . Временное состояние в ходе выполне­
ния транзакции, в которое можно вернуться после отмены
части инструкций набора (в отличие от отмены всей тран­
закции) .

СОВ ЕТ: действие каких инструкций можно отменить?


Обработка транзакци й задействуется в ходе в ы п ол н е н и я и н ­
струкц и й INSERT, UPDATE и DELETE. Н ел ьзя отмен ить действ и е
и н струкции SELECT ( в этом нет см ы сла.) Нел ьзя та кже отмен ить
зап росы CREATE или DROP. Их можно задействовать в транзак­
циях, но есл и понадобится в ы пол н ить откат, действ и е этих и н ­
струкц и й а н нул и ровано не будет.

Уn равn ение транзакци я м и


Теперь, когда вы знаете, что такое обработка транзакций, перей­
дем к управлению транзакциями.
210 УРОК 20. Об работка тра нзакций

П РЕДУП РЕЖДЕН И Е: раэпичия в реаnиэациях


Точ н ы й си нта ксис, испол ьзуем ы й дл я обработки тра нзакци й ,
зависит от СУБД. П режде чем п р и м е н ять о п и с ы ваем ые далее
и н струкци и , обратитесь к документа ц и и своей СУБД.

Ключ к управлению транзакциями заключается в том, чтобы


сrруппировать SQL-запросы в логические блоки и явно указать, ког­
да может быть выполнен откат, а когда - нет.
В некоторых СУБД требуется, чтобы пользователь явно пометил
начало и конец каждой транзакции. Например, в SQL Server нужно
сделать следующее.

ВВОА Т
BEGIN TRANSACT I ON

С ОММ I Т TRANSACT I ON

Анаnиэ т
В этом примере все инструкции, заключенные между фразами
BEGIN TRANSACT I ON и СОММ I Т TRANSACT I ON, ДОЛЖНЫ быть или
выполнены, или не выполнены.
Эквивалентный код для MariaDB и MySQL приведен ниже.

ВВОА Т
S TART TRANSACT I ON

В Oracle синтаксис будет таким.

ВВОА Т
S E T TRANSACT I ON

ВВОА Т
В PostgreSQL используется синтаксис ANSI SQL.
Управление тра нзакция м и 211

BEG I N ;

В других СУБД применяются схожие варианты синтаксиса. Вы


заметите, что в большинстве реализаций не требуется явного завер­
шения транзакции. Вместо этого транзакция продолжается до тех
пор, пока что-то не прервет ее. Обычно это либо инструкция СОММIТ
для сохранения изменений, либо инструкция ROLLBACK для их от­
мены.

И нструкц ия ROLLВACК
Инструкция ROLLBACK предназначена для отката (отмены) SQL­
запросов, как показано ниже.

Ввод� т
DELETE FROM Orde r s ;
ROLLBACK ;

Анаn из т
В этом примере выполняется и сразу же, посредством инструк­
ции ROLLBACK, аннулируется запрос DELETE. Пусть это и не самый
полезный пример, он все равно показывает, что, будучи включенны­
ми в транзакцию, операции DELETE (а также INSERT и UPDATE ) не
являются окончательными.

И нструк ц ия СОММI Т

Обычно после выполнения инструкций SQL результаты записы­


ваются непосредственно в таблицы баз данных. Это называется не­
явная ф иксац ия - операция сохранения (или записи) выполняется
автоматически.
Однако в транзакции неявная фиксация может и не применяться.
Это зависит от того, с какой СУБД вы работаете. Некоторые СУБД
трактуют завершение транзакции как неявную фиксацию.
Для принудительной фиксации изменений предназначена ин­
струкция СОММIТ. Вот соответствующий пример для SQL Server.
212 УРОК 20. Об ра б отка тра нза кци й

BEGIN TRANSACT I ON
DELETE Orde r i tems WHERE order num = 12345
DELETE Orde rs WHERE orde r num = 12345
СОММ I Т TRANSACT I ON

Ана11 иэ т
В этом примере заказ номер 1 2 3 4 5 полностью удаляется из базы
данных. Поскольку это приводит к обновлению двух таблиц, Orders
и Orde r i tems, транзакция применяется для того, чтобы не допу­
стить частичного удаления заказа. Конечная инструкция СОММI Т
фиксирует изменения только в том случае, если не произошло ни­
каких ошибок. Если первая инструкция будет выполнена, а вторая
из-за ошибки - нет, удаление не будет зафиксировано.
Чтобы выполнить то же самое в Oracle, воспользуйтесь следую­
щим кодом.

SET TRANSACT I ON
DELETE Orde r i t ems WHERE o rde r_num = 12345 ;
DELETE Orde r s WHERE order num = 1234 5 ;
СОММI Т ;

Точки сохранения
Простые инструкции СОММI Т и ROLLBACK позволяют фиксиро­
вать или отменять транзакции в целом. Это вполне оправданно по
отношению к коротким транзакциям, но для более сложных могут
понадобиться частичные фиксации или откаты.
Например, описанный выше процесс добавления заказа представ­
ляет собой одну транзакцию. Если произойдет ошибка, необходимо
вернуться в состояние, когда строка еще не была добавлена в табли­
цу Orde r s . Но вы вряд ли захотите отменить добавление данных в
таблицу Custome rs (если оно было сделано).
Для отмены части транзакции нужно иметь возможность разме­
щения меток в стратегически важных точках блока инструкций. Тог­
да, если понадобится сделать частичный откат, вы сможете вернуть
базу данных в состояние, соответствующее одной из меток.
Упра вление тра нзакция м и ? 13

В SQL подобные метки называются точками сохранения . Для


создания такой точки в MariaDB, MySQL и Oracle применяется ин­
струкция SAVEPOINT.

Ввод т
SAVE POINT de l e t e l ;

В SQL Server нужно сделать следующее.

Ввод т
SAVE TRANSACT I ON de l e t e l ;

Каждая точка сохранения должна обладать уникальным именем,


однозначно идентифицирующим ее, чтобы, когда вы выполняете от­
кат, СУБД "знала", в какую точку она должна вернуться. Для отмены
всех инструкций после этой точки в SQL Server нужно выполнить
следующее.

Ввод т
ROLLBACK TRANSAC T I ON de l e te l ;

В MariaDB, MySQL и Oracle необходимо поступить так.

Ввод т
ROLLBACK то de l e te l ;

А вот полный пример для SQL Server.

Ввод т
BEGIN TRANSACT I ON
INSERT INTO Cus tome r s ( cu s t_i d , cus t_name )
VALUES ( ' 1 0 0 0 0 0 0 0 1 0 ' , ' T oys Emp o r i um ' ) ;
SAVE TRANSACT I ON S t a rtOrde r ;
INSERT INTO Orde r s ( order_num, order_date , cu s t_i d )
VALUES ( 2 0 1 0 0 , ' 2 0 0 1 / 1 2 / 1 ' , ' 1 0 0 0 0 0 0 0 1 0 ' ) ;
I F @ @ ERROR <> о ROLLBACK TRANSAC T I ON S t a rtOrde r ;
INSERT INTO Orde r i tems ( o rde r_num, order_i tem, prod_i d ,
214 УРОК 20. Обработка транзакци й

� quant i t y , i tem_p r i c e )
VALUES ( 2 0 1 0 0 , 1, ' BRO l ' , 100, 5 . 49) ;
I F @ @ ERROR <> о ROLLBACK TRANSAC T I ON S t a rtOrde r ;
I NSERT INTO Orde r i tems ( o rder num , order- i t em , prod_id ,
-
� quant i t y ,
i tem_p r i c e )
VALUES ( 2 0 1 0 0 , 2, ' ВR О З ' , 100, 10 . 99) ;
I F @ @ ERROR <> О ROLLBACK TRANSACT I ON S t a rtOrde r ;
СОММ I Т TRANSACT I ON

Ана11 из т
Здесь выполняется набор из четырех инструкций INSERT, объе­
диненных в транзакцию. Точка сохранения определена после первой
инструкции INSERT, так что если один из последующих запросов
INSERT закончится неудачей, отмена транзакции произойдет лишь
до этой точки. В SQL Server для контроля успешности запроса мож­
но использовать системную переменную @ @ ERROR. (В других СУБД
применяются иные функции или переменные.) Если переменная
@ @ ERROR содержит ненулевое значение, значит, произошла ошиб­
ка и транзакция отменяется до точки сохранения. Если транзакция
в целом завершается успешно, для сохранения данных выполняется
инструкция СОММI Т.

СОВЕТ: чем боnьwе точек сохранения, тем 11учwе


М ожно созда вать с кол ько угодно точек сохра н е н и я в SQ L- кoдe,
и чем больше, тем луч ше. Почему? П ото му что чем бол ь ш е у вас
точек сохранен и я , тем более гибко можно уп ра вл ять отката м и .

Резюме
Транзакции представляют собой блоки инструкций SQL, которые
должны выполняться в пакетном режиме (все вместе). Вы ознакоми­
лись с инструкциями СОММI Т и ROLLBACK, которые предназначены
для явного управления процессами записи и отмены результатов
транзакций. Вы также узнали, как применять точки сохранения для
обеспечения более гибкого контроля за отменой запросов. Разуме­
ется, обработка транзакций - очень обширная тема, которую не­
возможно охватить за один урок. Кроме того, механизмы обработки
транзакций реализованы по-разному в каждой СУБД. Поэтому обра­
титесь к документации своей СУБД за дополнительной информацией.
УРОК 21

Кур с о ры
На этом уроке вы узнаете, что такое курсоры и как их применять.

Ч то такое курсор ы
SQL-запросы, связанные с извлечением данных, работают с на­
борами строк, которые называются результирующими. Все возвра­
щаемые строки соответствуют условию отбора, указанному в ин­
струкции SQL; их может быть ноль или больше. При использовании
простых инструкций SELECT невозможно получить первую, следую­
щую строку или предыдущие десять строк. Это объясняется особен­
ностями функционирования реляционной СУБД.

Реэупьтирующиii набор
Резул ьтаты , возвраща е м ы е SQL-зa n poco м .

Но иногда бывает необходимо просмотреть строки в прямом или


обратном порядке по одной или по нескольку строк за раз. Именно
для этого и нужны курсоры. Курсор представляет собой запрос к базе
данных, хранящийся на сервере СУБД, - это не инструкция S E ­
LECT, н о результирующий набор, выборка, полученная в результате
выполнения инструкции SELECT. После того как курсор сохранен,
приложения могут "прокручивать" (просматривать) строки в прямом
или обратном порядке, когда возникает такая необходимость.
Различные СУБД поддерживают разные параметры курсоров.
Чаще всего предоставляются следующие возможности.
� Возможность помечать курсор как предназначенный только
для чтения, в результате чего данные можно считывать, но
нельзя обновлять или удалять.
� Возможность задавать направление выполняемых операций
(вперед, назад, первая, последняя, абсолютное положение, от­
носительное положение и т.п.).
216 УРОК 21. Курсоры

П Р И М ЕЧАН И Е: поддержка в раэпичных СУ&Д


В M 1 c rosoft Access не поддерживаются курсор ы . Та к и м образо м ,
п р и води м ы е далее п р и меры н е п р и м ен и м ы в это й СУБД.
Поддержка курсоров была доба влена в MySQL верс и и 5. В бол ее
ра н н их версиях СУБД п р и меры да н н о го урока р аботать не будут.
В SQLite поддержи вается разн о в идность курсо ров, назы ваемая
ша га ми. Осно в н ы е кон цеп ц и и , рассматри ваем ы е на этом уроке,
п р и м ен и м ы к ш а га м , н о си нта ксис будет совер ш е н н о и н ы м .

� Возможность помечать одни столбцы как редактируемые, а


другие - как нередактируемые.
� Указание области видимости, благодаря чему курсор может
бьпь доступен только для запроса, посредством которого он
был создан (например, для хранимой процедуры), или для
всех запросов.
� Указание СУБД создать копию полученных данных (в про­
тивоположность работе с "живыми" данными в таблицах),
чтобы они не изменялись в промежуток времени между от­
крытием курсора и обращением к нему.

Курсоры используются главным образом интерактивными при­


ложениями, которые позволяют пользователям прокручивать ото­
бражаемые на экране записи вперед и назад, просматривать их или
изменять.

П Р И М ЕЧАН И Е: курсоры и веб-nрипожения


Курсоры п ра ктически бес полез н ы в веб- п р иложе н и ях ( н а п и ­
са н н ых, к п р и м еру, на AS P, AS P. N ET, Cold Fus i o n , Р Н Р, Pyt h o n ,
R u by и JSP). Курсо р ы п редна з н а ч е н ы дл я и с п ол ьзова н и я в
тече н и е сеа нса с в я з и м ежду кл и е нтск и м п р иложе н и е м и сер­
веро м , н о та кая м одел ь н е годится дл я веб- п р иложен и й , п ото­
му что сервер п р ил оже н и й я вл я ется кл иенто м баз ы да н н ых, а
не ко н еч н ы м пол ьзовател е м . А раз так, то бол ь ш и н ство раз­
работч и ко в п р ил ожен и й избега ют и с п ол ьзо ва н и я курсоров и
реал и зуют нужную фун кционал ь н ость самостоятел ь н о в случ ае
н еобход и м ости .
Ра б ота с курсора м и 217

Работа с курсора ми
Работу с курсором можно разделить на несколько этапов .

..,. Прежде чем курсор может быть использован, его следует


объявить (определить). В ходе этого процесса не происходит
извлечение данных , а просто определяется соответствующая
инструкция SELECT и задаются параметры курсора .
..,. После объявления курсор нужно открыть для получения дан­
ных . В ходе этого процесса уже происходит извлечение строк
согласно предварительно заданной йнструкции SELECT .
..,. После того как курсор заполнен данными, из него могут быть
извлечены необходимые строки .
..,. По окончании работы курсор должен быть закрыт, и, возмож­
но, должны быть освобождены занятые им ресурсы (в зависи­
мости от СУБД).

После того как курсор объявлен, его можно открывать и закры­


вать столько раз, сколько необходимо. Если курсор открыт, извлекать
из него строки можно произвольное число раз.

Создание курсоров
Курсоры создаются с помощью инструкции DECLARE, синтаксис
которой зависит от СУБД. Инструкция DECLARE присваивает курсо­
ру имя и определяет инструкцию SELECT, дополненную по необхо­
димости предложением WHERE и другими. Чтобы показать, как это
работает, мы создадим курсор, который будет извлекать список всех
клиентов, не имеющи х адресов электронной почты. Такой курсор
является частью приложения, позволяющего менеджеру вводить не­
достающие адреса.
Приведенная ниже версия подходит для DB2, MariaDB, MySQL
и SQL Server.

ВВОА Т
DECLARE C u s t Cu r s o r CURSOR
FOR
SELECT * FROM Cus tome r s
WHERE cu s t ema i l I S NULL

А вот версия для Oracle и PostgreSQL.


218 УРОК 21. Курс оры

Ввод т
DECLARE CURSOR C u s t C u r s o r
IS
S E L E C T * FROM Cus tome r s
WHERE c u s t ema i l I S NULL

Ана11 из т
В обеих версиях для указания имени курсора применяется ин­
струкция DECLARE - в данном случае это будет имя Cu stCursor.
Инструкция SELECT определяет курсор, содержащий имена всех
клиентов, у которых нет адреса электронной почты (соответствую­
щее значение равно NULL) .
Теперь, после того как курсор определен, его можно открыть.

Управл ение курсорам и


Курсоры открываются с помощью инструкции O PEN CURSOR,
синтаксис которой настолько прост, что его поддерживает большин­
ство СУБД.

Ввод т
OPEN CURSOR CustCur s o r

При обработке инструкции OPEN CURSOR выполняется заданный


запрос, и полученные строки сохраняются для последующего про­
смотра.
Доступ к содержимому курсора можно получить с помощью ин­
струкции FETCH. Она задает, какие строки должны быть извлечены,
откуда они должны быть извлечены и где их следует сохранить (имя
переменной, например). В первом примере применяется синтаксис
Oracle для извлечения одной строки курсора (первой).

Ввод т
DECLARE ТУРЕ C u s t C u r s o r I S RE F CURSOR
RETURN Custome r s % ROWTYPE ;
DECLARE Cus tRe cord Custome r s % ROWTYPE
BEGIN
Работа с курсора м и 219

OPEN CustCu r s o r ;
FETCH CustCu r s o r INTO CustRe c o r d ;
CLOSE CustCu r s o r ;
END ;

Анаnиэ т
В данном примере инструкция FETCH извлекает текущую строку
(считывание автоматически начинается с первой строки) и записыва­
ет ее в переменную Cus tRecord. С полученными данными ничего
не делается.
В следующем примере (в нем вновь применяется синтаксис
Oracle) полученные данные подвергаются циклической обработке от
первой строки до последней.

ВВОА Т
DECLARE ТУРЕ C u s t C u r s o r I S RE F CURSOR
RETURN Cus t ome r s % ROWTYPE ;
DECLARE Cus tRecord Cus t ome r s % ROWTYPE
BEGIN
OPEN CustCur s o r ;
LOOP
FETCH C u s t C u r s o r INTO Cus tRecord;
E X I T WHEN CustCu r s o r%NOTFOUN D ;

E N D LOO P ;
CLOSE C u s t Cu r s o r ;
END ;

Анаnи э т
Как и в предыдущем примере, здесь используется инструкция
FETCH для записи текущей строки в переменную C u s t Re c o rd.
Однако в данном случае инструкция FETCH находится в цикле
LOOP, поэтому она выполняется снова и снова. Строка EX I T WHEN
CustCurso r%NOTFOUND означает, что цикл должен быть завершен,
когда больше не останется строк для извлечения. С ам код о'бработ­
ки здесь не показан. В реальном примере необходимо заменить . . .
собственным кодом.
Рассмотрим другой пример, на этот раз с использованием синтак­
сиса Microsoft SQL Server.
220 УРОК 21. Курсоры

Ввод т
DECLARE @ cu s t id CНAR ( l O ) ,
@ cu s t_name СНАR ( 5 0 ) ,
@ cu s t_addre s s СНАR ( 5 0 ) ,
@ cu s t_c i t y CHAR ( 5 0 ) ,
@ cu s t_s tate СНАR ( 5 ) ,
@ cu s t_zip СНАR ( 1 0 ) ,
@ cu s t_country CHAR ( 5 0 ) ,
@ cu s t_contact CHAR ( 5 0 ) ,
@ cu s t_ema i l CHAR ( 2 5 5 ) ,
OPEN CustCursor
FETCH NEXT FROM C u s t Cu r s o r
INTO @ cu s t_i d , @ cu s t_name , @ cu s t_addre s s ,
@ cu s t_c i t y , @ cu s t_s t ate , @ cu s t_z ip ,
@ cu s t_coun t r y , @ cu s t_cont a c t , @ cu s t ema i l
WH I LE @ @ FETCH S TATUS = О
BEGIN

FETCH NEXT FROM CustCur s o r


INTO @ cu s t_ i d , @ cu s t_name , @ cu s t_addre s s ,
@ cu s t_c i t y , @ cu s t_s t a t e , @ cu s t_z ip ,
@ cu s t_coun t r y , @ cu s t_cont a c t , @ cu s t_ema i l
END
CLOSE CustCursor

Анаnиз т
В данном примере переменные объявляются для каждого извле­
каемого столбца, а инструкции FETCH осуществляют выборку строк
и сохраняют их значения в этих переменных. Цикл WHI LE нужен для
последовательной обработки каждой строки, а условие WH I LE @ @
FETCH S TATUS
_ О обеспечивает завершение обработки (выход из
=

цикла) после того, как все строки будут извлечены. С ам код обработ­
ки здесь тоже не показан. В реальном примере нужно заменить
собственным кодом.
Резю ме 221

Закрытие курс оров


Как бьmо показано в предыдущих примерах, по окончании рабо­
ты с курсорами их нужно закрывать. Кроме того, в некоторых СУБД
(например, в SQL Server) требуется, чтобы ресурсы, занятые курсо­
ром, бьmи освобождены явным образом. С оответствующий синтак­
сис для DB2, Oracle и PostgreSQL приведен ниже.

CLOSE Cus tCur s o r

А вот синтаксис для Microsoft SQL Server.

CLOSE Cus tCurs o r


DEALLOCATE CURSOR C u s t Cu r s o r

Для закрытия курсора предназначена инструкция CLOSE. После


того как курсор закрыт, к нему нельзя обратиться, не открыв перед
этим вновь. Однако его не нужно объявлять заново при повторном
использовании, достаточно лишь выполнить инструкцию OPEN.

Резюм е
На этом уроке вы узнали, что такое курсоры и как их применять.
В вашей СУБД, возможно, поддерживается несколько иной синтак­
сис, а также доступны параметры, не упомянутые в книге. За допол­
нительной информацией обратитесь к документации своей СУБД.
УРОК 22
Ра с w и рен н ые
возмо ж но ст и SQL

На этом уроке мы рассмотрим несколько расширенных средств


обработки данных в SQL: ограничения, индексы и триггеры .

Что такое о r ран ичения


SQL прошел целый ряд этапов развития, прежде чем стать полно­
ценным и мощным языком. В итоге он обогатился эффективными ин­
струментами обработки данных, в том числе такими, как ограничения.
Мы уже неоднократно говорили о реляционных таблицах и ссьшоч­
ной целостности на предыдущих уроках. В частности, подчеркивалось,
что реляционные базы данных хранят информацию во многих таблицах,

каждая из которых содержит поля, связанные с полями из других таблиц.


Для создания ссьшок из одной таблицы на другие используются ключи .
Чтобы реляционная база данных работала должным образом, не­
обходимо убедиться в том, что данные в ее таблицах введены пра­
вильно. Например, если в таблице Orde r s хранится информация
о заказах, а в таблице Orde r i t ems- их детальные описания, вы
должны быть уверены, что все идентификаторы заказов, упомянутые
в таблице Orderitems, существуют и в таблице Orders. Аналогич­
но каждый клиент, упомянутый в таблице Orde r s , не должен быть
забыт и в таблице Cus t omers.
Несмотря на то что можно проводить соответствующие провер­
ки перед вводом новых строк (выполняя инструкцию SELECT для
другой таблицы, дабы удостовериться в том, что нужные значения
правильны), лучше избегать этого по следующим причинам.

� Если правила, обеспечивающие целостность базы данных,


навязываются на клиентском уровне, их придется соблюдать
каждому клиенту (некоторые из клиентов наверняка не захо­
тят этого делать).
224 УРОК 22. Рас ш и рен н ые воз мо ж ности SQL

Jll- Вам придется принудительно ввести правила для выполнения


запросов UPDATE и DELETE.
Jll- Выполнение проверок на стороне клиента - процесс, отни­
мающий много времени. Заставить СУБД выполнять такие
проверки - намного более эффективный подход.

Оrраничения
П равила, регламенти рующие ввод и обработку и нформаци и в
базе дан н ых.

СУБД принудительно обеспечивает ссылочную целостность за


счет ограничений, налагаемых на таблицы базы данных. Большин­
ство ограничений задается в определениях таблиц (с помощью ин­
струкций CREATE TABLE или ALTER TABLE; см. урок 1 7).

П Р ЕДУП Р ЕЖДЕ Н И Е: оrраничения зависят от СУ&Д


Существуют разл и ч н ы е ти п ы огра н и ч е н и й , и каждая СУБД обе­
спечи вает собствен н ы й уров е нь их поддержк и . Следовател ьно,
п р и м е р ы да н н о го урока м огут работать не та к, ка к в ы п редпо­
лагаете. Обратитесь к документа ц и и своей СУБД, п режде чем
в ы пол н ять их.

Первичн ы е кл ючи
О первичных ключах говорилось на уроке 1 . Первичный ключ -
это особое ограничение, применяемое для того, чтобы значения
в столбце (или наборе столбцов) были уникальными и никогда не
изменялись. Другими словами, это столбец (или столбцы) таблицы,
значения которого однозначно идентифицируют каждую строку та­
блицы. Это облегчает обработку отдельных строк и доступ к ним.
Без первичных ключей было бы очень трудно обновлять или удалять
определенные строки, не затрагивая при этом другие.
Любой столбец таблицы может быть назначен на роль первично­
го ключа, но только если он удовлетворяет следующим условиям.

Jll- Никакие две строки не могут иметь одно и то же значение


первичного ключа.
Ч то та кое о гра н и ч е н ия 225

� Каждая строка должна иметь какое-то значение первичного


ключа (в таких столбцах не должны допускаться значения
NULL) .
� Столбец, содержащий значения первичного ключа, не может
быть модифицирован или обновлен.
� Значения первичного ключа ни при каких обстоятельствах
не могут быть использованы повторно. Если какая-то строка
удаляется из таблицы, ее первичный ключ не может быть на­
значен новой строке.

Один из способов определить первичный ключ - указать соот­


ветствующее ограничение в процессе создания таблицы.

Ввод •
CREATE ТАВLЕ Ven do r s
(
vend i d CHAR ( l O ) NOT NULL PRIМARY КЕУ ,
vend name CHAR ( S O ) NOT NUL L ,
vend addre s s СНАR ( 5 0 ) NUL L ,
vend_c i t y СНАR ( 5 0 ) NUL L ,
vend s t a t e CНAR ( S ) NUL L ,
vend_z ip CHAR ( l O ) NUL L ,
vend_country CHAR ( S O ) NULL
) ;

Анапиэ •
В данном примере в определение таблицы добавлена специфика­
ция PRIМARY КЕУ, благодаря которой столбец vend id становится
_

первичным ключом.

Ввод •
ALTER ТАВLЕ Vendo r s
ADD CONSTRAINT PRIМARY К Е У ( vend_i d ) ;

Анап и э •
Здесь в качестве первичного ключа назначен тот же самый стол­
бец, но с использованием ключевого слова CONS TRAINT. Оно допу­
стимо в инструкциях CREATE ТАВLЕ и ALTER TABLE.
226 УРОК 22. Расш и рен н ы е воз мож ност и SQL

П Р И М ЕЧАН И Е: ключи в SQLite


В SQ Lite нел ьзя оп ределять кл ю ч и с помощью и н струкци и ALTER
TABLE . Это можно делать тол ько в первоначал ь н о й и н струкци и
CREATE TABLE .

В не ш ние кл ючи
Внешний ключ - это столбец одной таблицы, значения которого
совпадают со значениями столбца, являющегося первичным ключом
другой таблицы. Внешние ключи - очень важная часть механизма
обеспечения ссьшочной целостности. Чтобы разобраться в том, что
собой представляют внешние ключи, рассмотрим следующий пример.
Таблица Orde r s содержит единственную строку для каждого
заказа, зафиксированного в базе данных. Информация о клиенте
хранится в таблице Cus t ome r s . Заказы в таблице Orde r s связаны
с определенными строками в таблице Cus t ome r s за счет иденти­
фикатора клиента, который является первичным ключом в таблице
Cus t ome r s . Каждый клиент имеет уникальный идентификатор. Но­
мер заказа является первичным ключом в таблице Orders, и каждый
заказ имеет свой уникальный номер.
Значения в столбце таблицы Orde r s , содержащем идентифика­
торы клиентов, не обязательно уникальные. Если клиент сделал не­
сколько заказов, могут существовать несколько строк с тем же самым
идентификатором клиента (хотя каждая из них будет иметь свой но­
мер заказа). В то же время единственные значения, которые могут
появиться в столбце идентификаторов клиента в таблице Orders, -
это идентификаторы клиентов из таблицы Cus t ome r s .
Именно так и образуются внешние ключи. В нашем примере
внешний ключ определен как столбец идентификаторов клиентов в
таблице Orders, который может принимать только значения, содер­
жащиеся в первичном ключе таблицы Custome r s .
Вот один и з способов определения внешнего ключа.

Ввод т
CREATE ТАВLЕ Orde r s
{
order num INTEGER NOT NULL PRIМARY КЕУ ,
Что такое огран ичения 227

order date DATETIМE N O T NUL L ,


cust id СНАR ( 1 0 ) N O T NULL RE FERENCE S
�Custo�rs ( cust_i d )
) ;

Анаnиз У
В этом определении таблицы используется ключевое слово REF­
ERENCES, указывающее на то, что любое значение в столбце cus t_id
должно также находиться в столбце cus t id таблицы Customer s .
_

Аналогичного результата можно добиться с помощью ключевого


слова CONSTRAINT в инструкции ALTER TABLE.

Ввод� У
ALTER ТАВLЕ Orders
A D D CONSTRAINT
FORE I GN КЕУ ( cust_i d ) RE FERENCES Customer s ( cust_ i d )

СОВЕТ: внеwние кпючи моrут восnреnятствовать


случайному уда11ению данных
В н е ш н и е кл ю ч и не тол ько помога ют обеспеч и вать ссылоч ную
целостность, н о та кже служат д ругой важной цел и . П осле того
ка к в н еш н и й кл юч оп редел е н , СУБД не п озвол ит удалять стро­
ки, связа н н ы е со строка м и в д ругих табл и цах. На п р и мер, вы не
сможете удал ить и нфор м а ц и ю о кл иенте, у которого есть заказы.
Еди н ственн ы й способ это сделать состоит в п редв а рител ьном
удале н и и связа н н ых с кл иентом за казов (для чего, в свою оче­
редь, нужно удал ить и нформ а ц и ю об элементах этих заказов).
Поскол ь ку требуется стол ь м етод и ч ное и цел е н а п ра вл е н н ое уда­
ление, в неш н и е кл ючи могут о казать помощь в предотвращен и и
случ а й но го удаления да н н ых.
Одн а ко в некоторых СУБД п оддержи вается возможность кас­
кадного удаления. Есл и та кая фун кция реал изова н а , можно
удалять все связа н н ы е со строкой да н н ы е при удале н и и ее из
табл и ц ы . Н а п р и мер, есл и разрешено каскадн ое удале н и е и и м я
кл иента удаляется из табл и ц ы C u s t ome r s , все связа н н ы е с
его заказа м и строки удал я ются а втоматически.
228 УРОК 22. Рас ш и рен н ы е в озм ож н ости SQL

Ограничен и я уникал ьности


Ограничения уникальности обеспечивают неповторяемость всех
данных в столбце (или в наборе столбцов). Такие столбцы напомина­
ют первичные ключи, однако имеются и важные отличия .

.,.. Таблица может содержать множество ограничений уникаль­


ности, но у нее должен быть только один первичный ключ .
.,.. Столбцы с ограничением уникальности могут содержать зна­
чения NULL .
.,.. Столбцы с ограничением уникальности можно модифициро­
вать и обновлять .
.,.. Значения столбцов с ограничением уникальности можно ис­
пользовать повторно .
.,.. В отличие от первичных ключей, столбцы с ограничениями
уникальности не могут быть использованы для определения
внешних ключей.

Примером такого ограничения может служить таблица с данны­


ми о сотрудниках. Каждый из них имеет свой уникальный номер кар­
точки социального страхования, но вы вряд ли будете использовать
его в качестве первичного ключа, поскольку он слишком длинный
(и, кроме того, вы вряд ли захотите сделать эту информацию легко
доступной). Поэтому каждому сотруднику присваивается уникаль­
ный идентификатор (первичный ключ) в дополнение к его номеру
карточки социального страхования.
Поскольку идентификатор сотрудника является первичным клю­
чом, можно быть уверенным в том, что он уникален. А для того
чтобы СУБД проверила уникальность каждого номера карточки со­
циального страхования (исключив вероятность опечатки при вводе,
когда для одного сотрудника указывается номер карточки другого),
необходимо задать ограничение UNI QUE для столбца, в котором со­
держатся номера карточек социального страхования.
Синтаксис ограничения уникальности напоминает синтаксис
других ограничений: в определении таблицы указывается ключевое
слово UN I QUE или отдельно задается ограничение CONSTRAINT.
Ч то такое огра н и ч е н и я 229

Огра н ичения на значен ия стол б ц а


Ограничения на значения столбца нужны для того, чтобы данные
в столбце (или наборе столбцов) соответствовали указанным вами
критериям. Наиболее распространенными ограничениями являются
следующие.

� Ограничение максимального и минимального значений - на­


пример, для предотвращения появления заказов на О (нуль)
товаров (хотя О и является допустимым числом).
� Указание диапазонов - например, ограничение на то, чтобы
дата отгрузки наступала позже или соответствовала текущей
дате и не отстояла от нее больше, чем на год.
� Разрешение только определенных значений - например, раз­
решение вводить в поле "пол" только букву М или F.

Типы данных (см. урок 1 ) сами по себе ограничивают данные, ко­


торые могут храниться в столбце, а ограничения на значения столбца
предъявляют дополнительные требования к данным определенного
типа, чтобы в базу данных можно было вводить только конкретные
значения. Вместо того чтобы полагаться на клиентское приложение
или добросовестность пользователя, СУБД самостоятельно отверга­
ет некорректные данные.
В следующем примере налагается ограничение на значения
столбца quanti t y таблицы Orde r i tems , с тем чтобы для всех то­
варов указывалось количество, большее О .

CREATE ТАВLЕ Orde r i tems


(
o rder num I NTEGER NOT NUL L ,
o rder i t em INTEGER NOT NULL ,
prod_id CHAR ( 1 0 ) NOT NUL L ,
quan t i t y INTEGER NOT NULL СНЕСК ( quant i t y > 0 ) ,
i tem_p r i ce MONEY NOT NULL
) ;
230 УРОК 22. Расширенные возможности SQL

Анаnиэ т
После применения этого ограничения каждая добавляемая (или
обновляемая) строка будет проверяться на предмет того, чтобы коли­
чество товаров бьmо больше нуля.
Дабы проконтролировать тот факт, что в столбце с обозначением
пола может содержаться только буква М или F, добавьте следующую
строку в инструкцию ALTER ТАВLЕ.

Ввод� т
ADD CONSTRAINT СНЕСК ( gende r L I КE 1 [ MF ] 1 )

СОВ ЕТ: nо11ьзовате11ьские типы ианных


Пользовател и некоторых СУБД могут созда вать собствен н ы е
ти п ы да н н ых. О б ы ч н о это базо вые ти п ы , н о с допол н ител ь н ы м и
огра н и ч е н и я м и н а значен и я . Н а п ри мер, можно о п редел ить соб­
ствен н ы й тип да н н ых, назвав его gende r (пол). Он будет п ред­
ста влять значен и я , состоящие из одной буквы , с огра н и ч е н и е м ,
допуска ю щ и м тол ько два вариа нта: м ил и F ( и , возможно, NULL, .
есл и п ол служа щего неизвесте н ). Та кой тип да н н ых можно ука­
зы вать в оп ределениях табл и ц. П реи мущество пол ьзовател ьских
ти пов да н н ых состоит в том , что подобн ы е огра н и ч е н и я м ожно
задать всего оди н раз ( в о п ределен и и ти п а да н н ых), посл е чего
о н и будут а втом атически п р и м е н яться вся кий раз, когда задей ­
ствуется пол ьзовател ьский ти п да н н ых. Посмотрите в докумен­
та ции своей СУБД, поддерживает ли она пол ьзовател ьские ти п ы
да н н ых.

Ч то такое и ндекс ы
Индексы предназначены для логической сортировки хранимых
данных, что позволяет повысить скорость поиска и сортировки строк
в запросах. Лучший способ понять, что такое индекс, - взглянуть на
предметный указатель в конце книги.
Предположим, вы хотите найти вхождения слова индекс в кни­
ге. "Лобовым" способом решения этой задачи бьmо бы вернуться на
первую страницу и просмотреть каждую строку каждой страницы в
поисках совпадений. Такой вариант, конечно, допустим, но очевидно,
Ч то та кое и ндексы 231

что он нереален. Просмотреть несколько страниц текста еще можно,


но просматривать подобным образом всю книгу - плохая затея. Чем
больше объем текста, в котором нужно провести поиск, тем больше
времени требуется на выявление мест вхождения нужных данных.
Именно поэтому книги снабжают предметными указателями.
Предметный указатель - это список ключевых слов и терминоло­
гических словосочетаний, расположенных в алфавитном порядке, со
ссылками на страницы, на которых искомые слова упоминаются в
книге. Чтобы найти термин индекс, необходимо посмотреть в пред­
метном указателе, на каких страницах он встречается.
Что делает предметный указатель столь эффективным средством
поиска? Попросту говоря, тот факт, что он правильно отсортирован.
Трудность поиска слов в книге обусловлена не тем, что ее объем слиш­
ком велик, а тем, что слова в ней не отсортированы в алфавитном по­
рядке. Если бы они бьmи отсортированы подобно тому, как это дела­
ется в словарях, в предметном указателе не было бы необходимости
(именно поэтому словари не снабжаются предметными указателями).
Индексы баз данных работают схожим образом. Данные первич­
ного ключа всегда отсортированы - СУБД делает это за вас. Таким
образом, извлечение указанных строк по первичному ключу всегда
осуществляется быстро и эффективно.
Однако поиск значений в других столбцах выполняется уже не
столь эффективно. Что произойдет, например, если попытаться по­
лучить список всех клиентов, проживающих в определенном штате?
Поскольку таблица не отсортирована по названиям штатов, СУБД
придется просматривать каждую строку таблицы (начиная с самой
первой), отыскивая совпадения точно так же, как это сделали бы вы в
поисках вхождений слов в книге, не имеющей предметного указателя.
Решение указанной проблемы состоит в использовании индекса.
В качестве индекса можно назначить один или несколько столбцов,
чтобы СУБД хранила отсортированный список содержимого для вну­
тренних целей. После того как индекс определен, СУБД применяет
его точно так же, как вы работаете с предметным указателем книги.
Она проводит поиск в отсортированном индексе, чтобы найти место­
положения всех совпадений и затем извлечь соответствующие строки.
Но прежде чем создавать множество индексов, примите во вни­
мание следующее.

� Индексы повышают производительность запросов, связан­


ных с извлечением данных, но ухудшают производительность
232 УРОК 22. Р ас ш и ре н н ы е в о зможн ости SQL

операций добавления, модификации и удаления строк. Это


связано с тем, что при выполнении подобных операций СУБД
должна еще и динамически обновлять индекс .
..,. Для хранения индекса требуется дополнительное место на
диске .
..,. Не все данные подходят для индексации. Данные, которые не
являются достаточно уникальными (как, например, названия
штатов в столбце cus t_s t a te ), не дадут такого выигрыша от
индексации, как данные, которые имеют больше возможных
значений (как, например, имя и фамилия) .
..,. Индексы применяются для фильтрации и сортировки данных.
Если вы часто сортируете данные одинаковым образом, эти
данные могут быть кандидатом на индексацию .
..,. В качестве индекса можно определить несколько столбцов
(например, с названием штата и названием города). Такой ин­
декс будет полезен, только если данные сортируются в поряд­
ке "штат плюс город" (если вы захотите отсортировать дан­
ные лишь по названию города, индекс окажется бесполезен).

Не существует твердых правил относительно того, что и когда


следует индексировать. В большинстве СУБД предлагаются утили­
ты, которые можно применять для определения эффективности ин­
дексов, и ими следует регулярно пользоваться.
Индексы создаются с помощью инструкции CREATE INDEX, син­
таксис которой зависит от СУБД. Следующая инструкция создает
простой индекс для столбца с наименованиями товаров в таблице
Produ c t s .

Ввод� т
CREATE I NDEX prod_name _i n d
O N Products (prod_name ) ;

Ана.n и з т
Каждый индекс должен обладать уникальным именем. В данном
случае оно определено как prod_name _i nd. Ключевое слово ON
служит для указания таблицы, которая должна быть проиндексиро­
вана, а столбцы, включаемые в индекс (в данном примере он один),
указываются в круглых скобках после имени таблицы.
Ч то такое три ггеры 233

СО В Е Т: пересмотр индексов
Эффективн ость и н дексов сн ижается , есл и в табл и цу доба вл я ют­
ся да н н ые ил и п роисходит их обновление. М ногие адм и н и стра­
торы баз да н н ых сч итают та к: то, что когда-то было идеал ь н ы м
набором и ндексо в, м ожет перестать б ыть та ко в ы м п осле не­
скол ьких месяцев работы с базой да н н ых. Цел есообразно ре­
гул я р н о пересматри в ать и ндексы и , в случае н еобход и м ости ,
настраи вать их.

Ч то такое три rrеры


Триггеры - это особые хранимые процедуры, автоматически вы­
полняемые при наступлении определенных событий в базе данных.
Триггеры могут быть связаны с выполнением инструкций INSERT,
UPDATE и DELETE по отношению к указанным таблицам.
В отличие от хранимых процедур (которые представляют собой
заранее записанные инструкции SQL), триггеры связаны с отдельны­
ми таблицами. Триггер, ассоциированный с инструкциями INSERT
по отношению к таблице Orde r s , будет выполняться только в том
случае, если в эту таблицу добавляется строка. Аналогично, триг­
гер, относящийся к инструкциям INSERT и UPDATE для таблицы
Custome r s , будет выполняться только в случае применения указан­
ных операций по отношению к данной таблице.
Код триггера может иметь доступ к следующим данным:

IJIJ> все новые данные в инструкциях INSERT;


IJIJ> все новые и старые данные в инструкциях UPDATE;
IJIJ> удаляемые данные в инструкциях DELETE.

В зависимости от СУБД, с которой вы работаете, триггер может


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

IJIJ> обеспечение непротиворечивости данных (например, для пре­


образования всех названий штатов в верхний регистр при вы­
полнении инструкций INSERT или UPDATE);
,IJIJ> выполнение действий по отношению к другим таблицам на
основе изменений, которые были сделаны в какой-то таблице
234 УРОК 22. Р ас ш ирен н ы е в о змож н о сти S Q L

(например, для внесения записи в контрольный журнал с це­


лью регистрации каждого случая обновления или удаления
строки);
� дополнительная проверка и, в случае необходимости, отмена
ввода данных (например, дабы удостовериться в том, что раз­
решенная для клиента сумма кредита не превышена, в про­
тивном случае операция блокируется);
� подсчет значений вычисляемых полей или обновление меток
даты/времени.

Как вы, наверное, уже догадываетесь, синтаксис создания тригге­


ров зависит от СУБД. За подробностями обратитесь к документации
своей СУБД.
В следующем примере создается триггер, преобразующий значе­
ния столбца c u s t s tate в таблице Custome r s в верхний регистр
_

при выполнении любых инструкций INSERT и UPDATE.


Вот версия для SQL Server.

CREATE TRI GGER custome r state


ON Cus t omer s
FOR INSERT , UPDATE
AS
UPDATE Cus tome rs
SET cu s t state = Upper ( cu s t_state )
WHERE Customers . cu s t id i n s e rted . cust_i d ;

Ниже приведена версия для Oracle и PostgreSQL.

CREATE TRI GGER cus tome r state


AFTER INSERT OR UPDATE
FOR ЕАСН ROW
BEGIN
UPDATE Customers
SET cu s t state =Upper ( cu s t _state )
WHERE Cus tome rs . cu s t id : OLD . cu s t id
END ;
Б езопасност ь баз дан н ых 235

СОВЕТ: оrраничения работают быстрее, чем триrrеры


Как п ра в ило, огра н и ч е н и я обрабаты ваются быстрее, ч е м три гге­
ры, поэтому стара йтес ь по возможности испол ь зоват ь и м е н но их.

& езо n асност ь баз Аанных


Нет ничего более ценного для организации, чем ее данные, поэ­
тому они всегда должны быть защищены от кражи или случайного
просмотра. В то же время данные должны быть всегда доступны для
определенных пользователей, поэтому большинство СУБД предо­
ставляет в распоряжение администраторов инструменты, посред­
ством которых можно разрешать или ограничивать доступ к данным.
В основе любой системы безопасности лежит авторизация и ау­
тентификация пользователей. Так называется процесс, в ходе кото­
рого пользователь подтверждает, что он - это именно он и что ему
разрешено проводить операции, которые он собирается выполнить.
Одни СУБД применяют для этого средства безопасности операцион­
ной системы, другие хранят свои собственные списки пользователей
и паролей, третьи интегрируются с внешними серверами службы ка­
талогов.
Чаще всего применяются следующие ограничения безопасности:

..,. ограничение доступа к административным функциям ( соз­


д ание таблиц, изменение или удаление существующих таб­
лиц и т.п . ) ;
..,. ограничен и е доступа к отдельным базам данных и л и таб­
лицам;
..,. ограничение типа доступа (только для чтения, доступ к от­
дельным столбцам и т.п.);
..,. организация доступа к таблицам только через представления
или хранимые процедуры;
..,. создание нескольких уровней безопасности, вследствие чего
обеспечивается различная степень доступа и контроля на
основе учетных записей пользователей .
..,. ограничение возможности управлять учетными записями
пользователей.
236 УРОК 22. Расш и ре н н ые возмо ж ности SQL

Управление безопасностью осуществляется посредством ин­


струкций GRANT и REVOKE, хотя большинство СУБД предлагает ин­
терактивные утилиты администрирования, в которых применяются
те же самые инструкции.

Ре з ю ме
На этом уроке вы узнали, как применять некоторые расширенные
средства SQL. Ограничения - важная часть системы обеспечения
ссылочной целостности; индексы помогут улучшить производитель­
ность запросов, связанных с извлечением данных; триггеры можно
использовать для обработки данных перед началом или сразу после
завершения определенных операций, а параметры системы безопас­
ности можно применять для управления доступом к данным. Навер­
няка ваша СУБД в той или иной форме обеспечивает указанные воз­
можности. Обратитесь к ее документации, чтобы подробнее узнать
об этом.
ПРИЛОЖЕНИЕ А

Сце н а р и и
д ем о н стра цио н н ых
табn и ц

Процесс написания инструкций SQL требует хорошего понима­


ния структуры базы данных. Без знания того, какая информация в
какой таблице хранится, как таблицы связаны одна с другой и как
распределены данные в строках, невозможно написать эффективный
SQL-кoд.
Настоятельно рекомендую проверить на практике каждый при­
мер каждого урока книги. Во всех уроках используется один и тот же
набор файлов данных. Чтобы вам бьmо легче разбираться в примерах
и выполнять их по мере изучения книги, в этом приложении описы­
ваются применяемые таблицы, отношения между ними и способы
построения таблиц (или их получения в готовом виде).

Д емонстрационн ы е табn и ц ы
Таблицы, используемые на протяжении всей книги, являются ча­
стью системы регистрации заказов воображаемого дистрибьютора
игрушек. Эти таблицы служат для решения нескольких з!lдач:

..,_ взаимодействие с поставщиками;


..,_ работа с каталогами товаров;
..,_ управления списками клиентов;
..,_ прием заказов от клиентов.

Всего требуется пять таблиц (они тесно связаны между собой в


рамках схемы реляционной базы данных). В следующих разделах
описана каждая из таблиц.
238 П РИЛОЖЕН И Е А. Сценари и демонстрацион ных табл и ц

П Р И М ЕЧ А Н И Е : уnрощенные nримеры
Табл и ц ы , испол ьзуе м ы е в кн и ге, н ел ьзя назвать п ол н ы м и . Ре­
ал ьная систем а регистра ц и и за казов хра нила б ы м ножество
других да н н ых, не в ключе н н ых в п р едста влен н ы е табл и цы (на­
п р и м ер, платежные рекв и з иты , ном ера и н войсов, контрол ь н ы е
номера п оставок и м н огое другое). В т о ж е время с помощью
этих табл и ц будет н а глядно показано, ка к структури руются базы
да н н ых и ка кие отн о ш е н и я м ежду табл и ца м и существуют на
п ра ктике. Вы см ожете п р и м е н ить получ е н н ы е знания по отн о­
шен и ю к своим собствен н ы м база м да н н ых.

Описа н ия та бл иц
Далее будут рассмотрены все пять демонстрационных таблиц с
указанием имен столбцов каждой таблицы и их описаниями.

Таблиц а Vendors
В таблице Vendors (табл. А. 1 ) хранятся данные о поставщиках,
товары которых продаются. Для каждого поставщика в этой таблице
имеется отдельная запись, а столбец с идентификаторами поставщи­
ков (vend_id) используется для указания соответствия между това­
рами и поставщиками.

ТА БЛ И ЦА А . 1 . Столбцы таблицы Vendors

Столбец Описание
vend ± d Ун и кал ь н ы й идентифи катор п оста в щ и ка
v e n d n ame И м я поста в щ и ка
vend addre s s Адрес поста в щ и ка
v e n d_c ii. t y Город п оста в щ и ка
vend s tate Штат поста в щи ка
v e n d_ z ip ZI Р-код поста в щ и ка
v e n d_c o u n t r y Стра на поста в щ и ка

.... Для всех таблиц должны быть определены первичные ключи.


В данной таблице в качестве первичного ключа следует ис­
пользовать столбец vend_id.
Демонстрацион ные табл и цы 239

Та бли ц а Products
Таблица P r o du c t s (табл . А .2) содержит каталог товаров, по
одному товару в строке. Каждый товар имеет уникальный идентифи­
катор (столбец prod_i d) и связан с соответствующим поставщиком
через столбец vend_ id (уникальный идентификатор поставщика) .

ТАБЛ И ЦА А.2. Столбцы таблицы Products

Столбец Описание
p r o d_ i d Ун и кал ь н ы й идентифи катор товара
ve n d i d Иденти ф и като р п оста в щ и ка то в а р а ( с в я з а н со
столбцом vend_ id табл и ц ы V e n do r s )
p r o d_ n ame Назва н и е тов а ра
p r o d_p r i c e Цен а товара
p r o d_de s c О п и са н и е товара

.... Для всех таблиц должны быть определены первичные ключи.


В данной таблице в качестве первичного ключа следует ис­
пользовать столбец prod_i d.
.... Для обеспечения ссылочной целостности следует определить
'
внешний ключ на основе стол бца vend_ i d, связав его со
столбцом vend_ id таблицы Vendors.

Та бли ц а Customers
В таблице Custome rs (табл. А.3) хранится информация обо всех
клиентах. Каждый из них имеет уникальный идентификатор (стол­
бец c u s t_i d) .

ТАБЛ И ЦА А.З. Столбцы таблицы Customers

Столбец Описание
cu s t i d Ун и кал ь н ы й идентифи катор кл и е нта
cu s t n ame И м я кл и ента
cu s t addre s s Адрес кл и ента
c u s t_c i t y Город кл и ента
cu s t s t a t e Штат кл и ента
cu s t_ z ip ZI Р-код кл иента
240 ПРИЛОЖЕНИЕ А. Сценари и демон стра цион н ых табл и ц

Окончание табл. А . З

Столбец Описание

cu s t_c o un t r y Стра на кл и ента


cus t cont a c t Конта ктное л и цо кл и ента
cu s t ema i l Конта ктн ы й адрес электрон ной п очты кл и ента

� Для всех таблиц должны быть определены первичные ключи.


В данной таблице в качестве первичного ключа следует ис­
пользовать столбец cus t_i d.

Табл и ц а Orders
В таблице Orde r s (табл. А.4) хранится информация о заказах
клиентов (без подробностей). Каждый заказ имеет уникальный но­
мер (столбец o rde r num). Заказы связаны с соответствующими
_
клиентами через столбец c u s t id (который связан с уникальным
_
идентификатором клиента в таблице Cus tomers).

ТАБЛ И ЦА А.4. Столбцы таблицы Orders

Столбец Описание
o r d e r num Ун и кал ь н ы й номер заказа
o r de r da t e Дата заказа
cu s t id Идентифи катор клиента , сделавшего заказ (связан
со столбцом c u s t _ id табл и ц ы C u s t ome r s )

� Для всех таблиц должны быть определены первичные ключи.


В данной таблице в качестве первичного ключа следует ис­
пользовать столбец order num.
_
� Для обеспечения ссылочной целостности следует определить
внешний ключ на основе столбца c u s t _ i d, связав его со
столбцом cus t id таблицы Cus t ome rs.
_

Табл и ц а Orderi tems


В таблице Orde r i tems (табл. А.5) хранятся элементы всех за­
казов, и для каждого элемента каждого заказа выделено по одной
Демон страцион н ы е табл и цы 241

строке. Каждой строке таблицы Orde r s соответствует одна или не­


сколько строк в таблице Orde r i tems. Каждый элемент заказа уни­
кальным образом идентифицирован посредством номера заюца в
совокупности с номером элемента в заказе (первый элемент заказа,
второй и т.д.). Элемент заказа связан с соответствующим ему зака­
зом через столбец order_num (который соотносит его с уникальным
идентификатором заказа в таблице Orders). Кроме того, каждая за­
пись об элементе заказа содержит идентификатор товара (который
связывает товар с таблицей Products).

ТАБЛ И ЦА А.5. Столбцы табл и цы Orderitems

Столбец Описание
o r de r num Номер за каза (связан со стол бцом o r de r _ num
табл и ц ы O r de r s )
o r de r i t em Номер эл емента за каза ( п оследо вател ь н о п р и ­
сваи ваем ы й в за казе)
p r o d_ i d Иденти ф и като р то в а р а ( с в я з а н с о стол б ц о м
p r o d_ i d табл и ц ы P r o du c t s )
qu a n t i t y Кол и чество заказа н н ых товаров
i t em_p r i c e Цена за еди н и цу товара

.... Для всех таблиц должны быть определены первичные ключи.


В данной таблице в качестве первичного ключа следует ис­
пользовать связку столбцов order_num и o rde r_i tem.
.... Для обеспечения ссьmочной целостности следует определить
внешние ключи на основе столбца o rde r num, связав его с
_
полем o rder_num таблицы Orders, и столбца p rod_id, свя­
зав его с полем prod_ id таблицы Products.

Администраторы СУБД часто используют диаграммы отно­


шений, демонстрирующие , как связаны между собой таблицы
базы данных. Помните, что отношения определяются внешними
ключами, описанными в табл . А. 1 -А . 5 . На рис. А. 1 приведена
диаграмма отношений для пяти таблиц, рассмотренных в данном
приложении.
242 П РИЛОЖЕНИЕ А. Сценари и де мон страцион н ых табл и ц

РИС. А.1. Д и а г ра м м а отн о шен и й м ежду демонстра ц и о н н ы м и та б­


л и ца м и

П ол учение де монстрационн ы х
та бл иц
Чтобы попрактиковаться в выполнении представленных в книге
примеров, вам понадобится набор заполненных таблиц. Все необхо­
димое можно найти на сайте книги по следующим адресам :
h t tp : / / www . f o r t a . com/ b o o ks / 0 6 7 2 3 3 6 0 7 3 /
h t tp : / / www . wi l l i amspuЫ i s h i n g . com/
B o o ks / 9 7 8 - 5 - 8 4 5 9 - 1 8 5 8 - 1 . html

Загрузка готовых баз данных


П ерейдите по одному из указанных выше адресов, чтобы полу­
чить готовые базы данных в следующих форматах:

� Apache OpenOffice Base;


� Microsoft Access (2000 и 2007);
� SQLite.
П олуч е н и е демонстра цион н ы х табл и ц 243

Если вы воспользуетесь этими файлами, то вам не придется вы­


полнять никаких сценариев создания и заполнения таблиц.

Загрузка SQL- сценариев


дл я различн ых СУ Б Д
Большинство СУБД хранят данные в форматах, которые не по­
зволяют распространять файлы баз данных (в отличие от Access,
OpenOffice Base и SQLite) . Для таких СУБД по указанным выше
адресам можно загрузить SQL-сценарии, включающие два файла:

� файл c r e a t e . txt, содержащий инструкции SQL, которые


необходимы для создания пяти демонстрационных таблиц
базы данных (включая определения всех первичных и внеш­
них ключей);
� файл populate . txt, содержащий инструкции INSERT, ис­
пользуемые для заполнения демонстрационных таблиц.

Инструкции SQL, содержащиеся в этих файлах, зависят от СУБД,


поэтому выполняйте только те сценарии, которые соответствуют ва­
шей СУБД. Эти сценарии предназначены лишь для удобства читате­
лей, и никакая ответственность за возможные проблемы при их ис­
пользовании не предполагается.
К тому моменту, когда книга уходила в печать, были доступны
сценарии для следующих СУБД:

� IВM DB2;
� Microsoft SQL Server (включая Microsoft SQL Server Express);
,
� MariaDB
� MySQL;
� Oracle (включая Oracle Express);
� PostgreSQL.

По мере необходимости этот список может быть дополнен дру­


гими СУБД.
В приложении Б приведены инструкции по выполнению сцена­
риев в популярных средах разработки.
244 ПРИЛОЖЕНИЕ А. Сценари и демонстрацион н ых табл и ц

П Р И М ЕЧАН И Е : вначапе C03A8Tlt, nотом эаnопнять


В н ачал е следует в ы пол н ить сцена р и й созда н и я табл и ц , и тол ько
потом - сце н а р и й их запол н е н и я . Убедитесь в том , что сце н а р и и
не возвраща ют н и ка ких сообщен и й об о ш и бках. Есл и сцена р и й
созда н и я табл и ц п9те р п ит неудачу, в 1;�1 я в ите и устран ите воз н и к­
ш и е п роблем ы , а потом уже запол н я йте табл и ц ы .

П РИ М ЕЧАН И Е: инструкции n o настройке All R конкретных


СУ&Д
Действ и я по настройке кон кретн ых СУБД существе н н о разл и ­
чаются . За груз и в SQL-сце н а р и и на сайте кн и г и , в ы найдете в
каждом а рхи ве фа йл R EAD M E с о п и са н ием действ и й , которые
необход и м о в ы пол н ить в каждом кон кретном случае.
ПРИЛОЖЕНИЕ Б
Раб ота с nоn уnя рн ы м и
n ро rра м м а м и

Как объяснялось на уроке 1 , SQL - это язык, а не программа.


Для того чтобы работать с примерами книги, необходима программа,
поддерживающая выполнение инструкций SQL.
В данном приложении описывается порядок выполнения SQL­
запросов в наиболее популярных СУБД и средах разработки баз данных.
Для проверки SQL-кодов можно использовать любую из рассмо­
тренных здесь систем. На чем же остановиться?

• Многие СУБД поставляются со своими собственными кли­


ентскими утилитами . С ними вполне можно начинать работу.
Однако для них не всегда характерен интуитивно понятный
пользовательский интерфейс.
• Если вы веб-разработчик, можете воспользоваться любым
языком разработки серверных приложений, включая ASP.
NET, ColdFusion, Java, JSP, РНР, Python и Ruby.

Apache OpenOffice Base


Apache OpenOffice Base - это открытое клиентское приложение
на основе Java, предназначенное для работы с базами данных. За­
просы для него можно писать непосредственно на SQL. Выполните
следующие действия.

1. Откройте свою базу данных в Apache OpenOffice Base.


2. Выберите раздел Q u e ries на панели Database в левой части
окна.
З. На панели Tasks щелкните на кнопке C reate Q u e ry ln SQL
View, чтобы отобразить окно Query Desi g n .
4 . Введите свой SQL-зaпpoc в большом текстовом поле (все
окно представляет собой текстовое поле).
246 ПРИЛОЖЕНИЕ 6. Работа с попул ярн ы м и програм ма м и

5. Чтобы выпuлнить SQL-зaпpoc, щелкните на кнопке R u n


Query (на ней изображены документы и зеленая метка). Мож­
но также нажать клавишу <F5::: или выбрать команду R u n
Query в меню Edit.

Adobe ColdFusion
Adobe ColdFusion представляет собой платформу для разработки
веб-приложений. В ColdFusion для создания сценариев применяется
язык, основанный на дескрипторах (тегах). Чтобы протестировать
SQL-кoд, создайте простую страницу, которую можно будет отобра­
зить, открыв ее в браузере. Для этого выполните следующие дей­
ствия.

1 . Прежде чем обращаться к каким-либо базам данных из


ColdFusion, должен быть определен источник данных. Про­
грамма ColdFusion Administrator предлагает веб-интерфейс
для создания источников данных (в случае необходимости
обратитесь к документации ColdFusion).
2. Создайте новую страницу ColdFusion (с расширением CFM).
3. Используйте дескрипторы CFML <CFQUERY> и < / C FQUERY>
для создания блока запроса. Присвойте ему имя, используя
атрибут NАМЕ, и укажите источник данных в атрибуте DATA­
SOURCE.
4. Введите свою инструкцию SQL между дескрипторами
<CFQUERY> и < / C FQUERY>.
5. Используйте цикл <CFDUМP> или <CFOUTPUT> для отображе­
ния результатов запроса.
6. Сохраните страницу в любом каталоге исполняемых файлов,
находящемся в структуре корневого каталога веб-сервера.
7. Отобразите страницу, открыв ее в браузере.

I BM DB2
D B 2 компании I B M - это мощная высокопроизводительная
кроссплатформенная СУБД. Она поставляется с целым набором
клиентских инструментов, которые могут быть использованы
для выполнения SQL-запросов. Приведенные ниже инструкции
MariaDB 247

предназначены для Jаvа-утилиты Control Center - одной из самых


простых и универсальных среди всех утилит СУБД.

1. Запустите Control Center.


2. На панели O bj ect Vi ew в левой части окна будет приведен
список всех доступных баз данных. Раскройте раздел A l l
Databases и выберите требуемую базу данных.
3. Чтобы открыть окно Q u e ry, щелкните правой кнопкой мыши
на названии своей базы данных и выберите пункт Q u e ry
либо (пока база данных активизирована) пункт Q u e ry в меню
Sel ected.
4. Введите инструкцию SQL в верхнее поле.
5. Щелкните на кнопке Execute (с изображением зеленой стрел­
ки, направленной вправо), чтобы выполнить запрос.
6. В нижнем окне отобразится статусная информация. Щелкни­
те на вкладке Q u e ry Resu lts, чтобы просмотреть результаты
запроса в виде таблицы.

MariaDB
В MariaDB нет собственной клиентской утилиты, поэтому при­
меняются клиенты MySQL (обе СУБД полностью совместимы). Об­
ратитесь к разделу, посвященному MySQL.

M icrosoft Access
Microsoft Access обычно используется интерактивно для создания
баз данных и управления таблицами. В программе имеется конструк­
тор запросов, который можно применять для интерактивного постро­
ения инструкций SQL. Но многие не учитывают, что конструктор
запросов позволяет также вводить SQL-кoд напрямую. В ыполните
следующие действия.

1. Запустите Microsoft Access. Программа предложит открыть


(или создать) базу данных. Откройте базу данных, с которой
собираетесь работать.
2. Выберите меню Зап росы в окне базы данных, а затем дваж­
ды щелкните на ссылке Созда н и е запроса в режи ме ко н ­
структора (либо щелкните н а кнопке Создать и выберите в
248 П РИ ЛОЖЕНИЕ &. Раб ота с популярн ы м и прогр а м ма м и

появившемся окне пункт Конструктор). При работе с лентой


перейдите на вкладку Созда н и е и щелкните на кнопке Кон ­
структор запросов.
3. Появится диалоговое окно Добавл е н и е табл и цы . Закройте
его, не выбрав ни одну из таблиц.
4. В ыберите команду Реж и м S Q L в меню В ид. При работе с
лентой раскройте меню кнопки Режим на контекстной вклад­
ке Конструктор и выберите пункт Режи м SQL.
5. Введите свою инструкцию SQL в окне запроса.
6. Чтобы выполнить SQL-зaпpoc, щелкните на кнопке Запуск
(она помечена красным восклицательным знаком). Результаты
запроса отобразятся в том же окне, но в режиме таблицы.
7. Можно переключаться с режима ввода запросов (вам нужно
будет повгорно выполнить команду Режи м SQ L для изменения
SQL-зaпpoca) на режим отображения их результатов. Мож­
но также выбрать вариант Созда н и е зап роса с п о м о щью
мастера для интерактивного построения инструкций SQL.

M icrosoft ASP
Microsoft ASP - это платформа разработки сценариев, ориенти­
рованная на создание веб-приложений. Для того чтобы протестиро­
вать инструкции SQL на странице ASP, необходимо создать страни­
цу, которую можно будет отобразить на экране, открыв ее в браузере.
Выполните следующие действия.

1. ASP для взаимодействия с базами данных использует ODBC,


поэтому соответствующий источник данных ODBC должен
быть создан заранее (об этом рассказывается в конце прило­
жения).
2. Создайте новую страницу ASP (с расширением ASP) в любом
текстовом редакторе.
3. Используйте метод S e rve r . C r e a t e Ob j e c t для создания
экземпляра объекта ADODB . Conne c t i on.
4. Используйте метод Ope n для открытия нужного источника
данных ODBC.
5. Передайте свою инструкцию SQL методу Exe�ute в качестве
аргумента. Метод Execute возвращает результаты запроса.
Используйте команду Set для сохранения полученных данных.
Microsoft ASP. N ET 249

6. Чтобы отобразить результаты запроса, воспользуйтесь циклом


<% Do Whi le NOT EOF %>.
7. Сохраните страницу в любом каталоге исполняемых файлов,
находящемся в структуре корневого каталога веб-сервера.
8. Откройте страницу в браузере.

M icrosoft ASP. N ET
Microsoft ASP.NET - это платформа разработки сценариев для
создания веб-приложений с использованием технологий .NET. Что­
бы протестировать инструкции SQL на странице ASP.NET, создайте
страницу, которую можно будет отобразить на экране, открыв ее в
браузере. Это можно сделать разными способами, ниже описан один
из них.

1 . Создайте новый файл с расширением a spx.


.

2. Создайте подключение к базе данных, используя функцию


SqlConnection ( ) или OleDbConneq t i o n ( ) .
3. Используйте функцию S q l C omman d ( ) или O l e Db C om­
mand ( ) для передачи инструкции в СУБД.
4. Создайте объект Dat aReade r, используя метод E xe c u t e ­
Reader.
5. Последовательно обработайте все записи, содержащиеся в
объекте, чтобы получить возвращаемые значения.
6. Сохраните страницу в любом каталоге исполняемых файлов,
находящемся в структуре корневого каталога веб-сервера.
7. Откройте страницу в браузере.

M icrosoft Query
Microsoft Query - это отдельная утилита создания SQL-запросов,
которая является удобным средством тестирования инструкций SQL
с использованием источников данных ODBC. Microsoft Query боль­
ше не поставляется в составе Windows, но может опционально уста­
навливаться вместе с другими продуктами Microsoft, а также с при­
ложениями сторонних разработчиков.
250 ПРИ110ЖЕНИЕ 5. Работа с популярн ы м и п рогра м ма м и

СОВЕТ: nоиск Microsoft Query


M icrosoft Query часто уста навли вается в системе в м есте с дру­
ги м и п рогра м м н ы м и па кета м и M icrosoft ( н а п р и м е р , Office), но
обычно это происходит тол ько п р и пол н о й уста н о в ке па кета .
Есл и утил ита не отображается в м е н ю Пуск, поп робуйте осуще­
ств ить поиск файла MSQRY32 . EXE и л и MSQUERY. EXE.

Для работы с Microsoft Query необходимо выполнить следующие


действия.

1. Microsoft Query использует ODBC для взаимодействия с база­


ми данных, поэтому в системе предварительно должен быть
создан источник данных ODBC (об этом рассказывается в
конце приложения).
2. Прежде чем начинать использовать утилиту Microsoft Query,
убедитесь в том, что она установлена в системе. Просмотрите
список программ, открывающийся после щелчка на кнопке
Пуск, и найдите утилиту.
3. В меню Файл выберите команду В ы п ол н ить зап рос S Q L.
Откроется окно В ы п ол н е н и е зап роса SQ L.
4. Щелкните на кнопке И сточ н и к и , чтобы выбрать источник
данных ODBC. Если нужный вам источник отсутствует в
списке, щелкните на кнопке Обзор, чтобы найти его. После
того как будет выбран нужный источник данных, щелкните
на кнопке ОК.
5. Введите свою инструкцию в поле И н струкци я S Q L.
6. Щелкните на кнопке В ы п ол н ить, чтобы выполнить SQL­
зaпpoc и отобразить полученные данные.

M icrosoft SQL Server (вкnюч ая


M icrosoft SQL Server Express)
Microsoft SQL Server содержит мощную административную ути­
литу, называемую SQL Server Management Studio. Она позволяет ре­
шать множество задач: администрировать базы данных, управлять
безопасностью, создавать отчеты и многое другое. Она также предо­
ставляет удобную среду для создания и тестирования SQL-запросов.
Вот как работать с SQL Server Management Studio.
М SQL 251

1 . Запустите SQL Server Management Studio.


2. В случае необходимости укажите информацию о сервере и
введите свои учетные данные.
3. Появится окно SQL Server Management Studio, разделенное
на несколько панелей. На панели Object Explorer в левой ча­
сти окна приведен список всех баз данных с описанием их
параметров. На панелях инструментов в верхней части окна
доступны кнопки для выполнения конкретных действий.
Основную часть окна занимает большое текстовое поле, пред­
назначенное для ввода инструкций SQL.
4. В левой части нижней панели инструментов находится рас­
крывающийся список, в котором указана текущая база дан­
ных. Если необходимо, выберите в списке друтую базу дан­
ных (это эквивалентно выполнению инструкции USE).
5. Введите свой SQL-зaпpoc в большом текстовом окне, после
чего щелкните на кнопке Execute Query (с изображением
красного восклицательного знака), чтобы выполнить его .
(Можно также нажать клавишу <F5> или выбрать команду
Execute в меню Query.)
6. Результаты отобразятся на отдельной панели под окном SQL­
кoдa.
7. Щелкайте на вкладках внизу окна запроса для переключения
между режимами просмотра данных и просмотра полученных
сообщений.

MySQL
С MySQL можно работать двумя способами. СУБД поставляется
вместе с утилитой командной строки, называемой mysql. Это сугубо
текстовое средство создания запросов, которое может применяться
для выполнения любых инструкций SQL. Кроме того, разработчики
выпустили интерактивную утилиту MySQL Workbench. Ее обычно
приходится загружать и устанавливать отдельно, поэтому она может
иметься не во всех инсталляциях СУБД. В то же время настоятельно
рекомендуется работать с ней при изучении MySQL.
Чтобы воспользоваться утилитой mysql, выполните следующие
действия.

1. В ведите mys ql, чтобы запустить эту утилиту. В зависимо­


сти от ограничений, налагаемых системой безопасности, вам
252 ПРИ Л ОЖЕНИ Е &. Работа с по п улярн ы м и п рогра м мам и

может понадобиться указать параметры -u и -р, чтобы вве­


сти имя пользователя и пароль.
2. В ответ на приглашение mysql> введите USE база_данных,
указав тем самым имя рабочей базы данных.
3. Введите свой SQL-зaпpoc после приглашения mysql>, про­
верив, чтобы каждая инструкция заканчивалась точкой с за­
пятой ( ; ). Результаты будут отображены на экране.
4. Введите \h для получения списка доступных команд или \ s
для получения информации о статусе (включая информацию
о версии MySQL).
5. Введите \ q, чтобы выйти из утилиты mys ql.

Чтобы воспользоваться утилитой MySQL Workbench, выполните


следующее.

1. Запустите утилиту.
2. В самом левом столбце будут перечислены доступные под­
ключения к базам данных MySQL. Щелкните на любом под­
ключении, чтобы открыть его, или выберите команду N ew
Conn ecti o n , если нужной базы данных нет в списке.
3. После подключения к базе данных появится окно с панелями.
На панели O bj ect B rowser в левой части окна перечислены
доступные базы данных, большая текстовая панель в центре
предназначена для ввода инструкций SQL, а результаты за­
просов и сообщения отображаются в нижней панели.
4. Щелкните на кнопке +SQL, чтобы открыть новое окно SQL­
зaпpoca.
5. После ввода запроса щелкните на кнопке Execute (с изобра­
жением молнии), чтобы выполнить его. Результаты запроса
отобразятся внизу.

Oracle
В Oracle имеется большой набор административных и клиент­
ских утилит. При изучении SQL лучше всего пользоваться утилитой
Oracle SQL Developer. Она может инсталлироваться вместе с самой
СУБД либо загружаться и инсталлироваться отдельно. Ниже описа­
но, как работать с ней.
Oracle Express 253

1. Запустите Oracle SQL Developer. (В Windows это нужно


сделать через специальный файл сценария, а не через саму
СУБД.)
2. Прежде чем начать работать с какой-либо базой данных, не­
обходимо создать подключение к ней. Для этого воспользуй­
тесь командами, доступными на панели Connecti ons в левой
части окна.
3. После подключения к базе данных можно воспользоваться
вкладкой S Q L Wo rksheet в окне Query B u i l d e r для ввода ин­
струкций SQL.
4. Чтобы выполнить SQL-зaпpoc, щелкните на кнопке Execute
(с изображением молнии). Результаты запроса отобразятся на
нижней панели.

Oracle Express
Oracle Express - это мощная, но в то же время довольно про­
стая в применении СУБД с очень удобным веб-интерфейсом. После
инсталляции СУБД в вашем распоряжении окажется ссылка Getting
Started для запуска административной веб-страницы, на которой
можно вводить инструкции SQL. Выполните следующие действия.

1. Откройте административную веб-страницу Oracle Express.


2. В ответ на запрос введите свои имя пользователя и пароль,
которые были заданы на этапе инсталляции СУБД.
3. После регистрации в системе вы увидите ряд пиктограмм,
включая значок со словом SQL. Щелкните на нем, чтобы по­
лучить доступ к параметрам запросов.
4. Первая из пиктоrрамм называется SQL Commands. Ею мож­
но воспользоваться для ввода инструкций SQL. (Вторая, SQL
Scripts, удобна для выполнения готовых сценариев, например
сценариев создания и заполнения демонстрационных таблиц,
предлагаемых на сайте книги.) Щелкните на ней, чтобы от­
крыть окно S Q L Commands.
5. Введите свой SQL-зaпpoc в верхней части окна.
6. Чтобы выполнить запрос, щелкните на кнопке R u n в правом
верхнем углу. Результаты отобразятся под текстом запроса.
254 ПРИЛОЖЕНИЕ Ei. Работа с поп улярн ы м и програ м м ам и

РНР
РНР - это популярный язык написания веб-сценариев. РНР
предлагает функции и библиотеки, предназначенвые для подключе­
ния к различным базам данных, поэтому код, используемый для вы­
полнения инструкций SQL, может меняться в зависимости от СУБД
(и способа доступа к ней). А раз так, то невозможно предложить
пошаrовые инструкции, которые годились бы для любой ситуации.
Ниже приведен типичный пример для MySQL. Обратитесь к доку­
ментации РНР за инструкциями по подключению к своей СУБД.

1.
Создайте новую РНР-страницу (с помощью одного из расши­
рений РНР).
2. Подключитесь к своей базе данных с помощью соответствую­
щей функции. Для MySQL функция называется mysql con­ _

nect ( ) .
3. Передайте свой SQL-зaпpoc соответствующей функции об­
работки запросов. Для MySQL такая функция называется
mysql query ( )
_ .

4. В ответ будет получен массив результатов запроса, который


необходимо обработать в цикле, чтобы вывести результаты на
экран.
5. Сохраните страницу в любом каталоге исполняемых файлов,
находящемся в структуре корневого каталога веб-сервера.
6. Откройте страницу в браузере.

PostgreSQL
С PostgreSQL можно работать двумя способами. СУБД постав­
ляется с утилитой командной строки, которая называется psql. Это
сугубо текстовое средство создания запросов, которое может слу­
жить для выполнения любых инструкций SQL. Кроме того, имеется
интерактивная утилита pgAdmin, которая предназначена в основном
для административных целей, но может также применяться и для те­
стирования инструкций SQL.
Чтобы воспользоваться утилитой p s q l , выполните следующие
действия.

1. В ведите p s q l , чтобы запустить утилиту. Чтобы загрузить


конкретную базу данных, укажите ее в командной строке в
SQLite 255

виде p s ql база_данных. (PostgreSQL не поддерживает ин­


струкцию USE.)
2. Введите свой SQL-зaпpoc в ответ на приглашение =>, убедив­
шись в том, что каждая инструкция заканчивается точкой с
запятой ( ; ). Результаты будут отображены на экране.
3. Введите \ ? , чтобы отобразить список доступных команд.
4. Введите \ h , чтобы получить справку по SQL, или \ h
инструкция, чтобы получить справку относительно конкрет­
ной инструкции SQL (например, \h SELECT) .
5. Введите \ q, чтобы выйти из утилиты psql.

Чтобы воспользоваться утилитой pgAdmin, выполните сле-


дующее.

1. Запустите утилиту (она может называться pgAdmin Ш).


2. В случае необходимости введите имя пользователя и пароль.
3. Утилита отобразит список серверов баз данных в левой части
окна. Выберите нужный сервер, после чего утилита подклю­
чится к нему и выведет информацию о сервере.
4. Далее необходимо выбрать конкретную базу данных (в ре­
зультате на панели инструментов станут доступны соответ­
ствующие кнопки).
5. Найдите на панели кнопку Exec ute Arb ltrary S Q L Q ueries (на
ней изображена лупа со словом SQL) и щелкните на ней.
6. Появится новое окно. Убедитесь в том, что требуемая база
данных выбрана в раскрывающемся списке в правом верхнем
углу окна.
7. Теперь можете вводить инструкции SQL в большом текстовом
поле в верхней части окна.
8. Щелкните на кнопке Execute B utto n (с изображением зеле­
ной стрелки, направленной вправо), чтобы выполнить SQL­
зaпpoc. Результаты запроса отобразятся внизу.

SQLite
SQLite предназначена для встраивания в другие приложения
и обычно не используется как автономная база данных. Однако в
состав библиотеки входит утилита командной строки, с помощью
которой можно выполнять SQL-запросы к базе данных SQLite.
256 П РИ /I ОЖIЕ НИ Е &. Р а б ота с п оп улярн ы м и про гра м ма м и

Эта утилита называется sql i t е З (или s q l i t е З . ехе в Windows).


Для работы с ней выполните следующие действия.

1 . В идеальном случае утилита sql i t е З и база данных должны


находиться в одной и той же папке. (Базы данных SQLite хра­
нятся в отдельном файле, чаще всего с расширением . s ql i te
или d.Ь, но в принципе расширение может быть любым или
.

вообще отсутствовать.)
2. Введите s ql i tеЗ база_данных . sql i te (заменив аргумент
командной строки реальным именем файла базы данных).
3. Появится приглашение sql i te>, после которого можно вво­
дить любые инструкции SQL. Все инструкции должны завер­
шаться символом ; (точка с запятой).
4. По умолчанию s ql i t e З отображает результаты запроса с
символами 1 в качестве разделителей столбцов и без заголов­
ков. Чтобы изменить это поведение, введите . mode column
и нажмите клавишу <Enter>, после чего введите header on .

и снова нажмите клавишу <Enter>.


5. Чтобы завершить сеанс работы с утилитой s ql it e З , введите
. qui te и нажмите клавишу <Enter>.

Конф и rу ри рование
источни ков А8 Н Н ЫХ ODBC
Несколько приложений из числа вышеописанных используют для
интеграции с базами данных протокол ODBC, поэтому необходимо
дать краткий обзор ODBC, а также инструкции по конфигурирова­
нию источников данных ODBC.
ODBC это стандарт, позволяющий клиентским приложениям
-

взаимодействовать с различными серверами баз данных и различ­


ными СУБД. При наличии ODBC можно написать код с помощью
одного клиента, и этот код будет взаимодействовать почти с любой
базой данных или СУБД.
ODBC не является ни базой данных, ни СУБД. Скорее это си­
стемная оболочка, позволяющая всем базам данных вести себя не­
противоречивым и согласованным образом. Это достигается за счет
программных драйверов, выполняющих две основные функции. Во­
первых, они инкапсулируют характерные для отдельных баз данных
особенности, скрывая их от клиентов, а во-вторых, обеспечивают
Конфигурирова ние источ н и ков дан н ых O D BC 257

·
общий язык для взаимодействия с этими базами данных (в случае
необходимости выполняя нужные преобразования). Язык, используе­
мый в ODBC, - ЭТО SQL.
Клиентские приложения ODBC не взаимодействуют с базами
данных напрямую. Вместо этого они обращаются к источникам дан­
ных ODBC. Источник данных представляет собой логическую базу
данных, которая включает в свой состав драйвер (база данных каж­
дого типа имеет свой собственный драйвер) и информацию о том,
как нужно подключаться к этой базе данных (пути к файлам, имена
серверов и т.п.).
После того как источники данных ODBC определены, с ними
может работать любое ОDВС-совместимое приложение. Источники
данных не специфичны для приложений, но специфичны для систем.

П РЕДУП Р ЕЖДЕ Н И Е: различия в реаnизации


Существует м н о го верс и й систе м н ых модулей O D BC, поэтому не­
возможн о дать четкие и н струкци и , п р и м е н и м ы е ко всем верси­
ям. Обраща йте в н и м а н и е на подсказ ки, когда будете созда вать
свои источ н и ки да н н ых.

Источники данных ODBC создаются с помощью ОDВС-аплета


панели управления Windows. Чтобы установить какой-либо источник
данных, выполните следующие действия.

1. Откройте ОDВС-аплет панели управления Windows (он мо­


жет находиться в разделе Ад м и н и стрирование).
2. Большинство источников данных ODBC должны быть обще­
системными (в противоположность пользовательским источ­
никам данных), поэтому выберите вкладку Систе м н ы й D S N ,
если она доступна.
3. Щелкните на кнопке Добав ить, чтобы добавить новый ис­
точник данных.
4. Выберите драйвер, который будет применяться. Обычно по
умолчанию доступен набор драйверов, обеспечивающих под­
держку большинства продуктов компании Microsoft. В вашей
системе могут быть установлены и другие драйверы. Необхо­
димо выбрать драйвер, соответствующий типу базы данных,
к которой вы собираетесь подключаться.
258 П РИЛОЖЕНИЕ &. Работа с п опулярны м и п рогра м ма м и

5. В зависимости от типа базы данных или СУБД вам будет


предложено ввести имя сервера или путь к ф айлу и, возмож­
но, регистрационную ин ф ормацию. Введите запрашиваемые
параметры и следуйте остальным инструкциям, чтобы создать
источник данных.
ПРИЛОЖЕНИЕ В

Си нта к с и с
и н стру к ци й SQL

Для того чтобы помочь вам быстро узнать нужный синтаксис, в


этом приложении описывается синтаксис наиболее распространен­
ных инструкций SQL. Каждый раздел начинается с краткого опи­
сания инструкции, а затем приводится ее синтаксис. Для удобства
даются также ссылки на уроки, на которых рассматривались соот­
ветствующие инструкции.
При изучении синтаксиса инструкций помните следующее.

.... Символ 1 означает выбор одного из нескольких вариантов,


поэтому выражение NULL 1 NOT NULL означает, что нужно
вводить либо NULL, либо NOT NULL.
.... Ключевые слова или предложения, заключенные в квадрат­
ные скобки, [ например , так ] , являются необязательными.
.... Рассматриваемый здесь синтаксис подходит почти для лю­
бой СУБД. Обратитесь к документации своей СУБД, чтобы
узнать, нет ли каких-то изменений в синтаксисе.

ALTER TAВLE
Инструкция ALTER ТАВLЕ предназначена для обновления схемы
существующей таблицы. Чтобы создать новую таблицу, используйте
инструкцию CREATE ТАВLЕ. За более детальной информацией об­
ратитесь к уроку 1 7 .
260 ПРИЛОЖЕНИ Е В. Си нта кси с и нструкци й SQL

Ввод� т
ALTER TABLE имя_ та блицы
(
ADD [ DROP столбец тип_данных [ NULL [ NOT NULL ]
[ CONSTRAINTS ] ,
ADD I DROP столбец тип_данных [ NULL I NOT NUL L ]
[ CONSTRAINT S ] ,

) ;

СОММI Т
Инструкция СОММIТ предназначена для сохранения результатов
транзакции в базе данных (см. урок 20).

Ввод� т
СОММIТ [ TRANSACT I ON ] ;

CREATE INDEX
Инструкция CREATE INDEX предназначена для создания индекса
одного или нескольких столбцов (см. урок 22) .

Ввод� т
CREATE INDEX название_индекса
ON имя_ та блицы ( столбец, . . . ) ;

CREATE PROCEDURE
Инструкция CREATE PROCE DURE предназначена для создания
хранимых процедур (см. урок 1 9). В Oracle применяется иной син­
таксис.

Ввод� т
CREATE PROCE DURE имя_ процедуры [ аргументы] [ опции]
AS
инструкция SQL ;
CR EATE TABLE 261

СRЕАТЕ ТАВLЕ
Инструкция CREATE TABLE предназначена для создания новых
таблиц базы данных. Чтобы обновить схему уже существующей та­
блицы, используйте инструкцию ALTER TABLE. За более детальной
информацией обратитесь к уроку 1 7.

CREATE ТАВLЕ имя_ та блицы


(
столбец тип_данных [ NULL I NOT NULL ] [ CONS TRAINT S ] ,
столбец тип_данных [ NULL I NOT NULL ] [ CONSTRAINT S ] ,

) ;

CREATE VIEW
Инструкция CREATE VI EW предназначена для создания нового
представления одной или нескольких таблиц (см. урок 1 8).

Ввод� т
CREATE VIEW имя представления AS
_
SELECT столбцы, . . .
FROM та блицы, . . .
[ WHERE . . . ]
[ GROUP ВУ . . . ]
[ HAVING . . . ] ;

DELEТE
Инструкция DELETE удаляет одну или несколько строк из табли­
цы (см. урок 1 6).

Ввод� т
DELETE FROM имя_ та блицы
[ WHERE . . . ] ;
262 П РИЛОЖЕН И Е в. Си нта ксис и нструкци й SQL

DROP
Инструкция DRO P удаляет объекты из базы данных (таблицы,
представления, индексы и т.п.). За более детальной информацией об­
ратитесь к урокам 1 7 и 1 8 .

Ввод т
DROP INDEX I PROCEDURE I TAВLE I VI EW
имя_иццекса l имя_ процедуры l имя_ таблицы l имя_ представления;

INSERT
Инструкция INSERT добавляет в таблицу одну строку (см. урок 1 5).

В вод т
INSERT INTO имя_ та блицы [ ( столбцы, . . • ) ]
VALUES ( зна чения, . . . ) ;

INSERT SELECT
Инструкция INSERT SELECT добавляет результаты выполнения
инструкции SELECT в таблицу (см. урок 1 5) .

В вод т
INSERT INTO имя_ та блицы [ ( столбцы, • • • ) ]
SELECT столбцы, FROM имя_ таблицы,
[WHERE ] ;
• • •

ROLLВACK
Инструкция ROLLBACK предназначена для отмены результатов
транзакции (см. урок 20).

Ввод т
ROLLBACK [ ТО точка_ сохранения] ;

Ниже приведен альтернативный вариант.


SELECT 263

Ввод т
ROLLBACK TRANSAC T I ON ;

SELECT
Инструкция SELECT предназначена для извлечения данных из
одной или нескощ.ких таблиц (или из представлений). За более де­
тальной информацией обратитесь к урокам 2-4. (На всех уроках со
2-го по 1 4-й рассматриваются различные аспекты применения ин­
струкции SELECT.)

Ввод т
SELECT имя столбца , . . .
FROM имя_ та блицы,
[ WHERE • • • ]
[ UN I ON . . . ]
[ GROUP ВУ . . . ]
[ HAVING . . . ]
[ ORDER ВУ . . . ] ;

UPDAТE
Инструкция UPDATE обновляет одну или несколько строк в та­
блице (см. урок 1 6).

Ввод т
UPDATE имя_та блицы
S E T имя_ столбца = значение ,
[ WHERE • • • ] ;
ПРИЛОЖЕНИЕ Г

ти п ы дан н ых в SQL

Как объяснялось на уроке 1 , типы данных представляют собой


основные правила, определяющие, какие данные могут храниться в
столбцах и в каком виде эти данные в действительности хранятся.
Типы данных нужны по нескольким причинам.

� Они позволяют ограничить диапазон данных, которые могут


храниться в столбце. Например, столбцы с данными числово­
го типа будут принимать только числовые значения.
� Они позволяют более эффективно организовать хр � ение дан­
ных. Числовые значения и значения даты/времени могут хра­
ниться в более компактном виде, чем текстовые строки.
� Они позволяют изменять порядок сортировки. Если все дан­
ные трактуются как строки, то 1 предшествует 1 0 , а 1 0 пред­
шествует 2 . (Строки сортируются в словарном порядке, по
одному символу за раз, начиная слева.) Если выполняется
числовая сортировка, то числа будут располагаться по возрас­
танию.

При разработке таблиц обращайте особое внимание на использу­


емые в них типы данных. При наличии неправильных типов данных
работа базы данных серьезно замедлится. Изменение типов данных
для уже имеющихся и заполненных столбцов - задача нетривиаль­
ная. (Кроме того, при ее выполнении возможна потеря данных : )
В одном приложении невозможно дать исчерпывающую инфор­
мацию по типам данных и способам их использования. Здесь рас­
смотрены лишь основные типы данных, рассказано, для чего они
нужны, и указаны возможные проблемы совместимости.
266 ПРИЛОЖЕНИЕ Г. Ти п ы да нных в SQL

П РЕДУП Р ЕЖДЕ Н И Е : не су щ ествует двух одинаковых СУ&Д


Об это м уже го ворилось, но не л и ш н и м будет сказать еще раз.
К сожален и ю , в разных СУБД испол ьзуются отл И ч а ющиеся ти п ы
да н н ых. Даже есл и назва н и я т и п о в да н н ых звучат оди н а ково,
п о н и м аться под одн и м и тем же ти п о м да н н ых в разных СУБД
может не одно и то же. Обязател ьно обратитесь к документа ции
своей СУБД и в ы я с н ите, ка кие в точ ности ти п ы да н н ых о н а под­
держи вает и ка к и м образо м .

Строковые тип ы данных


Чаще всего используются данные строковых типов. К ним от­
носятся хранимые в базах данных строки, например имена, адреса,
номера телефонов и почтовые индексы. В основном строки бывают
двух типов : фиксированной и переменной длины (табл. Г. 1 ) .
Строки фиксированной длины могут состоять и з фиксированного
числа символов, и это число определяется при создании таблицы.
Например, можно разрешить ввод 30 символов в столбец, предна­
значенный для хранения имен, или 1 1 символов в столбец с номером
карточки социального страхования . В столбцы для строк фиксиро­
ванной длины нельзя вводить больше символов, чем разрешено. База
данных выделяет для хранения ровно столько места, сколько указа­
но. Так, если строка Иван сохраняется в столбце имен, рассчитанном
на ввод 30 символов, будет сохранено ровно 30 символов (в случае
необходимости текст дополняется пробелами или нулями).
В строках переменной длины можно хранить столько символов,
сколько необходимо (максимальное значение ограничивается типом
данных и конкретной СУБД). Некоторые типы данных переменной
длины имеют ограничение снизу (фиксированное значение мини­
мальной длины). Другие ограничений не имеют. В любом случае со­
храняются только заданные символы (и никаких дополнительных).
Если строки переменной длины обладают такой гибкостью, то за­
.чем нужны строки фиксированной длины? Ответ прост: для повыше­
ния производительности. СУБД способна сортировать столбцы с дан­
ными фиксированной длины и манипулировать ими намного быстрее,
чем в случае данных переменной длины. Кроме того, многие СУБД не
способны индексировать столбцы с данными переменой длины (или
переменную часть столбца). (Индексы рассматривались на уроке 22.)
Строковые ти пы да н н ых 267

ТАБЛ И ЦА Г. 1 . Строковые тип ы данных

Тип данных Описание


C HAR Строка ф и кс и рова н но й дл и н ы , состоящая и з 1 - 255
с и м вол о в . Ее размер долже н б ыть о п редел ен на
эта пе созда н и я табл и цы
NC HAR Разновидность ти па да н н ых C HAR, разработа н ная
с цел ью п оддержки м н о гоба йто в ы х с и м в ол о в ил и
с и м вол о в U п icode (то ч н а я с п е ц и ф и к а ц и я з а в и сит
от реал изации)
NVARCHAR Разновидность типа да н н ых ТЕХТ, разработа н ная
с цел ью п оддержки м н о гобайто в ы х с и м вол о в ил и
с и м вол о в U n icode (то ч н а я с п е ц и ф и к а ц и я з а в и сит
от реал из а ц и и )
ТЕХТ (также Текст переме н н о й дл и н ы
назы вается
LONG, MEMO
ил и VARCHAR)

СОВ ЕТ: исnо11ьэование кавычек


Неза в и с и м о от ти па строковых да н н ых строка всегда должна
быть закл юч ена в оди н а р н ы е ка в ы ч к и .

П РЕДУ П Р ЕЖДЕ Н И Е: коrиа чисповые значения не явnяются


таковыми
М ожет показаться , будто номера телефонов и почтовые и ндексы
должны хра н иться в ч исловых полях (ведь они содержат тол ько
ч и словые да н н ые), но поступ ать та к нецелесообразно. Есл и в ы
сохра н ите п очто в ы й и ндекс 01234 в ч исл овом п оле, будет со­
хра нено ч исло 1234, и вы потеряете одну цифру.
Основное п р а в ило та ково: есл и ч исло испол ьзуется в в ы ч и сле­
н иях (итоговых сум м , средних значен и й и т. п . ) , его следует хра­
н ить в стол бце, п редназначенном для ч исло в ых да н н ых. Есл и
же оно и с п ользуется в кач естве строкового л итерала (пусть он и
состоит тол ько из цифр), е го место - в столбце с да н н ы м и стро­
кового ти п а .
268 ПРИЛОЖЕНИЕ Г. Ти п ы да н н ых в SQL

Ч и сл о в ые тип ы дан н ых
Числовые типы данных предназначены для хранения чисел.
В большинстве СУБД поддерживаются различные числовые типы
данных, каждый из которых рассчитан на хранение чисел определен­
ного диапазона. Очевидно, что чем шире поддерживаемый диапазон,
тем больше нужно места для хранения числа. Кроме тоm, некоторые
числовые типы данных поддерживают использование десятичных
чисел (и дробей), а другие - только целые числа. В табл. Г.2 пред­
ставлены наиболее часто используемые числовые типы данных. Не
все СУБД следуют соглашениям о наименовании и описаниям, при­
веденным в таблице.

ТАБЛ И ЦА Г. 2 . Ч исловые типы данных

Ти пы данных Описание
ВIТ Одноразрядное значен и е, О или 1; испол ь­
зуется в основном дл я битовых фла го в
DE C I MAL (та кже З н а ч е н и я с ф и кс и рова н н о й и л и пл а в а ю ­
называется NUME R I C ) щей зап ятой разл и ч ной степени точ н ости
FLOAT (также З н а ч е н и я с пла вающей зап ято й
назы вается NUMBE R)
INT 4 - б а й то в ы е цел ы е з н а ч е н и я ; п одде р ­
(та кже называется ж и в а ются ч и сл а о т - 2 1 4 7 483648 д о
I N T E GE R) 2147483647
REAL 4-байто в ы е з н а ч е н и я с п л а в а ю щей за п я ­
той
SМAL L I N T 2-байтовые цел ые значен и я ; п оддержи ва­
ются ч и сла от -32768 до 32767
T I NY I N T 1-байтовые цел ые значен и я ; поддержи ва­
ются ч и сла от О до 255

СОВЕТ: ка в ы чки не использу ются


В отл и ч и е от строковых ти пов да н н ых, ч исл а н и когда не закл ю­
ча ются в кав ы ч к и .
Ти пы да н н ых даты и времени 269

СОВ ЕТ: денежные тиnы данных


В бол ь ш и н стве СУБД п оддерживается особ ы й ч и словой тип да н­
ных дл я хра н е н и я денежных значен и й . О б ы ч н о о н н азы вается
MONEY или CURRENCY. Ка к п ра в ило, та кие ти п ы да н н ых отн осятся
к типу DEC IМAL, но со специфически м и диапазон а м и , делающи­
м и их удоб н ы м и дл я хра н е н и я де нежн ых значен и й .

ти пы данных даты и времени


Все СУБД поддерживают типы данных, предназначенные для
хранения значений даты и времени (табл . Г. 3 ) . Аналогично чис­
ловым типам, в большинстве СУБД имеется несколько типов дан­
ных даты и времени, каждый со своим диапазоном и степенью
точности .

ТАБЛ И ЦА Г. З . типы данных даты и времени

Тип данных Описание


DATE З н а ч е н и я даты
DATE T I ME З н а ч е н и я даты и врем е н и
(также называется
T I ME S TAМ P)
SМA L L DAT E T I ME З н а ч е н и я даты и време н и с точ н остью до
м и нуты (без з н а ч е н и й секунд и л и м ил л и ­
секунд)
T I ME Значен и я времени

П РЕДУПРЕЖДЕН И Е: формат даты


Не существует ста нда ртн о го способа указа н и я даты, кото р ы й
подходил бы дл я л юбой СУБД. В бол ь ш и н стве реал изаци й п р и ­
емлем фо р м ат в ида 2 0 1 5 - 1 2 - 3 0 или D e c З O th , 2 0 1 5 , н о даже
эти значе н и я могут о казаться п роблемой дл я некоторых СУБД.
Обя зател ь н о обратитесь к документа ц и и своей СУБД и узн а йте
сп исок ра спознаваемых ею формато в даты .
270 ПРИЛОЖЕНИЕ Г. Ти п ы да н н ых в SQL

СОВЕТ: значения даты в ODBC


Поскол ьку в каждой СУБД п р и меняется свой формат предста в­
ления даты , в O D BC в веден собстве н н ы й форм ат, кото р ы й п одхо­
дит дл я л юбой СУБД п р и работе с O D BC. Формат O D BC в ы гл ядит
та к: { d ' 2 0 1 5 - 1 2 - З О ' } для значен и й дат, { t ' 2 1 : 4 6 : 2 9 ' } дл я
значен и й времени и { t s ' 2 0 1 5 - 1 2 - 3 0 2 1 : 4 6 : 2 9 ' } для з н а ­
ч е н и й даты и времен и . Есл и в ы в ы п ол н яете SQ L-за п росы через
O D BC, убедитесь в том , что з н а ч е н и я даты и времен и отформа­
ти ров а н ы соответствующи м образо м .

&и нарные т и n ы дан н ых


Бинарные типы данных относятся к наименее совместимым
(и реже всего используемым) типам данных. В отличие от всех дру­
гих типов данных, рассмотренных нами до сих пор и предназна­
ченных для весьма конкретного применения, бинарные типы могут
содержать любые данные, даже информацию в двоичном виде, в
частности графические изображения, мультимедийные объекты и
документы текстового процессора (табл. Г.4).

ТАБЛ И ЦА Г.4. Б инарные типы данных

Тип данных Описание


B I NARY Дво и ч н ы е да н н ы е ф и к с и рова н н о й дл и н ы
( м а кси м ал ьная дл и н а м ожет б ыть от 255 до
8000 ба йт, в зависимости от реал изации)
LONG RAW Дво и ч н ы е да н н ы е п е ре м е н н о й дл и н ы (до
2 Гба йт)
RAW Дво и ч н ы е да н н ы е ф и кс и ро в а н н о й дл и н ы
( в некоторых (до 255 ба йт)
реал изациях
назы вается B I NARY)
VARВ I NARY Двои ч н ы е дан н ы е перем е н н о й дл и н ы (об ы ч­
но м а кси мальная дл и н а варьи руется от 255
до 8000 байт, в з а в и с и м ости от реал из�­
ции)
Б и на р н ые ти п ы да н ных 271

П Р И М ЕЧАН И Е : сравнение тиnов данных


Чтобы увидеть реал ь н ы й п р и мер и п ро вести сра в н е н и е ти пов
да н н ых в разл и ч н ых СУБД, воспол ьзуйтесь сцен а ри я м и созда­
н и я демонстра цион н ых табл и ц (см . п риложен и е А). Путем срав­
нения сценариев, п редназначен н ых дл я разл и ч н ых СУБД, вы
вооч и ю убедитесь в том , наскол ько сл ожна з адача согласова н и я
т и п о в да н н ых .
ПРИЛОЖЕНИЕ Д
З арезер ви р ова н н ые
cno в a SQL

В инструкциях SQL широко применяются ключевые слова, ко­


торые считаются зарезервированными. Нужно внимательно следить
за тем, чтобы они не использовались в качестве имен баз данных,
таблиц, столбцов и других объектов.
В данном приложении содержится перечень зарезервированных
слов, наиболее часто встречающихся в основных СУБД. Обратите
внимание на следующие моменты.

� Ключевые слова сильно зависят от конкретной СУБД, поэ­


тому не все приведенные ниже слова используются во всех
СУБД.
� Во многих СУБД имеется расширенный перечень зарезерви­
рованных слов SQL, включающий термины, которые специ­
фичны для конкретной реализации языка. Многие из таких
слов не представлены ниже.
� Чтобы обеспечить совместимость и переносимость базы дан­
ных, следует избегать применения любых ключевых слов,
даже тех, которые не являются зарезервированными в кон­
кретной СУБД.

АВОRТ AВSOLUTE ACT I ON


ACT I VE ADD AFTER
ALL ALLOCATE ALTER
ANALYZE AND ANY
ARE AS ASC
ASCENDING AS SERT I ON АТ
AUTHORI ZAT I ON AUTO AUTO- INCREМENТ
AUTOINC AVG BACKUP
BEFORE BEGIN BETWEEN
274 ПРИЛОЖЕНИЕ д. Зарезерв и рова н н ы е сл о ва SQL

B I G INT B I NARY BIT


BLOB BOOLEAN вотн
ВRЕАК BROWSE BULK
ВУ BYTES САСНЕ
CALL CASCADE CASCADED
CASE CAS T CATALOG
CHANGE CHAR CНARACTER
CНARACTER LENGTH СНЕСК CHECKPOINТ
CLOSE CLUSTER CLUSTERED
COALE SCE COLLATE COLUМN
COLUМNS СОММЕNТ СОММI Т
СОММI ТТЕD COMPUTE COMPUTED
COND I T I ONAL CONF I RМ CONNECT
CONNEC T I ON CONS TRAINT CONSTRAINТS
CONTAINING CONTAINS CONТAINS TAВLE
CONT INUE CONTROLROW CONVERT
СОРУ COUNT CREATE
CROSS CSTRING CUBE
CURRENT CURRENT DATE CURRENТ Т I МЕ
CURRENT Т I МЕSТАМР CURRENT USER CURSOR
DATAВASE DATABASES DATE
DATET IМE DAY овес
DEALLOCATE DEBUG DEC
DECIМAL DECLARE DEFAULT
DELETE DENY DE SC
DESCENDING DE SCRIBE D I S CONNECT
D I SK D I S T INCT D I S TRIBUTED
DIV 00 DOМAIN
DOUBLE DROP DUММУ
DUMP ELSE ELSE I F
ENCLOSED END ERRLVL
ERROREXIT ESCAPE ESCAPED
ЕХСЕРТ EXCE P T I ON ЕХЕС
EXECUTE EXI STS EX I T
EXPLAIN EXTEND EXTERNAL
EXTRACT FALSE FETCH
F I ELD F IELDS F I LE
F I LLFACTOR F I LTER FLOAT
FLOPPY FOR FORCE
FORE I GN FOUND FREETEXT
Зарезерв ирова н н ы е слова SQL 275

FREETEXTTAВLE FROM FU +. L
FUNCT I ON GENERATOR GET
GLOBAL GO GOTO
GRANT GROUP HAVING
HOLDLOCK HOUR I DENT ITY
IF IN INAC T I VE
INDEX INDI CATOR INF I LE
INNER INOUT INPUT
INSENS I T IVE INSERT INT
INTEGER INTERSECT INTERVAL
INTO IS I SOLAT I ON
JO IN КЕУ K I LL
LANGUAGE LAST LEADING
LEFT LENGTH LEVEL
L I KE LIMIT L I NENO
L INES L I S TEN LOAD
LOCAL LOCK LOGFI LE
LONG LOWER МANUAL
МАТСН МАХ МERGE
МE SSAGE MIN MINUTE
MI RROREX I T MODULE MONEY
MONTH MOVE NAМE S
NAT I ONAL NATURAL NCHAR
NEXT NEW NO
NOCHECK NONCLUSTERE D NONJ;:
NOT NULL NULL I F
NUМERIC OF OFF
OFFSET OFFSETS ON
ONCE ONLY OPEN
OPT I ON OR ORDER
OUTER OUTPUT OVER
OVERFLOW OVERLAPS РАО
PAGE PAGE S PARAМETER
PART IAL PAS SWORD PERCENT
РЕRМ PERМANENT P I PE
PLAN POS I T I ON PREC I S I ON
PREPARE PRIМARY PRINТ
PRIOR PRIVI LEGE S PROC
PROCEDURE PROCE SSEXIT PROTECTED
PUBLI C PURGE RAI SERROR
276 ПРИЛОЖЕНИЕ д. З арезер в иро ва н н ы е сло ва SQL

READ READTEXT REAL


RE FERENCES REGEXP RELAT I VE
RENAМE RE PEAT RE PLACE
RE PLICAT ION REQUI RE RE SERV
RE SERVING RESET RE S TORE
RE STRICT RETAIN RE TURN
RE TURNS REVOKE R I GHT
ROLLBACK ROLLUP ROWCOUNT
RULE SAVE SAVE POINT
S СНЕМА SECOND S E C T I ON
SEGМENT SELECT SENS I T I VE
SE PARATOR SEQUENCE S E S S I ON USER
SET SETUSER S HADOW
S НARED SHOW S HUTDOWN
S INGULAR S I ZE SМALLINT
SNAPSHOT SОМЕ SORT
S PACE SQL S QLCODE
SQLERROR S TAВ I L I TY S TART ING
S TARTS S TAT I S T I C S SUBS TRING
SUM SUS PEND TABLE
TAВLES ТАРЕ ТЕМР
TEMPORARY ТЕХТ TEXT S I ZE
THEN Т I МЕ Т IМЕ S ТАМР
то ТОР TRA I L I NG
TRAN TRANSACT I ON TRANSLATE
TRI GGER TRIM TRUE
TRUNCATE UNCOММITTED UNI ON
UNI QUE UNT I L UPDATE
UPDATETEXT UPPER USAGE
USE USER US ING
VALUE VALUES VARCНAR
VARIAВLE VARY ING VERВOSE
V I EW VOLUМE WAI T
WAI T FOR WHEN WHERE
WH I LE W I TH WORК
WRITE WRI TETEXT XOR
YEAR ZONE
Предметный указатеnь
А г
Access, 247 Группировка, 1 05
ASP, 248 Групповой символ, 32
ASP.NET, 249
д
с Дата, 1 79
ColdFusion, 246 Декартово произведение, 1 28
Добавление
D извлеченных данных, 1 60
DB2, 246 нескольких строк, 1 62
полных строк, 1 55
м части строки, 1 59
MariaDB, 247
Microsoft Query, 249 Е
MySQL, 25 1 Естественное объединение, 1 39

N 3
NOT NULL, 1 76 Запись, 24
NULL, 52; 1 76 Запрос, 1 1 5
комбинированный, 1 47
о Значение по умолчанию, 1 78
ODBC, 256
и
OpenOffice Base, 245
Индекс, 230
Oracle, 252
Инструкция
Oracle Express, 253
ALТER TABLE, 1 79; 225 ; 259
р
BEGIN TRANSACTION, 2 1 0
РНР, 254 CLOSE, 22 1
PostgreSQL, 254 СОММIТ, 2 1 1 ; 260
CREATE INDEX, 232; 260
s CREATE PROCEDURE, 20 1 ;
SQL Server, 250 260
SQLite, 255 CREATE ТАВLЕ, 1 73; 225; 261
CREATE TRIGGER, 234
Б CREATE VIEW, 1 89; 26 1
База данных, 20 DECLARE, 203 ; 2 1 7
Безопасность, 235 DELETE, 1 68 ; 26 1
DROP, 262
в DROP TABLE, 1 82
Внешнее объединение, 1 40 DROP VIEW, 1 89
Внешний ключ, 1 69; 226 EXECUTE, 200
Внутреннее объединение, 1 30 FETCH, 2 1 8
Вычисляемое поле, 73 ; 74; 1 94 GRANT, 236
278 П редметн ы й у казател ь

INSERT, 1 5 5 ; 262 Комбинированный запрос, 1 47


INSERT SELECT, 1 60; 262 Комментарий, 37; 204
OPEN CURSOR, 2 1 8 Конкатенация, 75
RENAME, 1 83 Критерий отбора, 4 7
REVOКE, 236 Курсор, 2 1 5
ROLLBACK, 2 1 1 ; 262 закрытие, 22 1
SAVE TRANSACTION, 2 1 3 открытие, 2 1 8
SAVEPOINT, 2 1 3 создание, 2 1 7
SELECT, 27; 263
порядок предложений, 1 1 4 м
SELECT INTO, 1 62 Математическая операция, 80
SET TRANSACТION, 2 1 0 Метасимвол, 65
START TRANSACTION, 2 1 0 знак процента, 66
TRUNCATE TABLE, 1 70 квадратные скобки, 70
UPDATE, 1 65 ; 263 символ подчеркивания, 69
Источник данных, 257
Итоговая функция, 94; 1 43 н
Неявная фиксация, 2 1 1
к
Кавычки, 5 1 о
Каскадное удаление, 227 Обновление
Ключевое слово, 27; 273 данных, 1 65
ALL, 1 0 1 ; 1 07 таблиц, 1 79
AND, 55 Объединение, 1 23
AS, 78; 136 внешнее, 1 40
ASC, 45 внутреннее, 1 30
BETWEEN, 5 1 естественное, 1 3 9
CONSTRAINT, 225 нескольких таблиц, 1 3 1
DEFAULT, 1 78 перекрестное, 1 30
DESC, 43 полное внешнее, 1 42
DISТINCT, 3 3 ; 1 0 1 Ограничение, 223
IN, 60 на значения столбца, 229
INTO, 1 56 уникальности, 228
LIКE, 65 Оператор
NOT, 6 1 ЕХСЕРТ, 1 5 4
OR, 57 INTERSECT, 1 54
REFERENCES, 227 UNION, 1 48
ТОР, 34 UNION ALL, 1 52
UNIQUE, 228 математический, 8 1
Ключ условный, 49
внешний, 1 69 ; 226 Откат транзакции, 209
первичный, 24; 1 24; 224
П ред м етн ы й указател ь 279

п Столбец, 22; 74
Первичный ключ, 24; 1 24; 224 производный, 80
Переименование таблиц, 1 83 Строка, 23
Перекрестное объединение ' 1 30 Схема, 2 1
Переносимый код, 84
Подзапрос, 1 1 5 т
в качестве вычисляемого Таблица, 20
поля, 1 1 9 копирование, 1 63
Поле, 74 обновление, 1 79
Полное внешнее переименование, 1 83
объединение, 1 42 реляционная, 1 23
Пользовательский тип создание, 1 73
данных, 230 удаление, 1 82
Предика:г, 66 Тип данных, 23; 265
Предложение, 40 бинарный, 270
GROUP ВУ, 1 06 даты и времени, 269
HAVING, 1 08 денежный, 269
LIMIТ, 3 5 пользовательский, 23Q
ON, 1 3 1 строковый, 266
ORDER ВУ, 40; 1 1 1 числовой, 268
SET, 1 66 Точка сохранения, 209; 2 1 2
VALUES, 1 56 Транзакция, 207
WHERE, 47; 5 5 отмена, 2 1 1
Представление, 1 85 Триггер, 233
создание, 1 89
у
удаление, 1 89
Псевдоним, 78; 1 3 5 Удаление
данных, 1 68
р таблиц, 1 82
Реляционная таблица, 1 23 Условие фильтрации, 47

с ф
СУБД, 20 Фиксация транзакции, 209
Самообъединение, 1 3 7 неявная, 2 1 1
Скобки, 59 Функция, 83
Соединение, 1 47 AVG(), 94
Сортировка, 39; 1 1 1 COUNT(), 96
в указанном направлении, 43 DATE_PART(), 89
по невыбранным DATEPART(), 89
столбцам, 4 1 ; 43 LTRIM(), 78
по нескольким столбцам, 4 1 МАХ(), 97
по положению столбца, 42 MIN(), 98
Ссылочная целостность, 1 26 RTRIM(), 77
280 П редметн ы й указател ь

SOUNDEX(), 87 х
SUM(), 99 Хранимая процедура, 1 97
to_char(), 90 создание, 20 1
to_date(), 90
to_number(), 90 ш
TRIM(), 78 Шаблон поиска, 66
UPPER(), 85
YEAR(), 90

Вам также может понравиться