Академический Документы
Профессиональный Документы
Культура Документы
SQL
за 10 минут
4-еиздание
Бен Форта
•
Москва + Санкт-Петербург + Киев
2014
ББК 32.973.26-018.2.75
Ф80
УДК 681.3.07
Издательский дом "Вильяме"
Главный редактор С.Н. Тригуб
Перевод с английского и редакция В.Р. Гинзбурга
Форта, Бен.
Ф80 SQL за 10 минут, 4-е изд. : Пер. с анг.л. - М. : ООО "И.Д. Вильяме",
2014. - 288 с. : ил. - Парал. тит. анm.
ISBN 978-5-8459-1858-1 (рус.)
ББК 32.973.26-018.2.75
Научно-популярное издание
Бен Форта
Введение 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
Применение функций 85
Функции для работы с текстом 85
Функции для работы с датой и временем 88
Функции для работы с числами 91
Резюме 92
Усnовные обозначения
В книге используются различные шрифтовые выделения - во
первых, для того чтобы можно бьшо отличить программный код от
обычного текста, а во-вторых, чтобы вы не пропустили важные тер
мины.
Текст, который вы вводите, и текст, который должен появиться на
экране, будут представлены моноширинным шрифтом.
Он выглядит примерно так, как на экране.
ПРИМЕЧАНИЕ
СОВЕТ
ПРЕДУПРЕЖДЕНИЕ
Новый термин
В подобных врезках также даются определения новых базовых
понятий.
18 Введение
Ввод, т
Заголовком "Ввод" обозначен код, который можно ввести само
стоятельно.
Вывод, т
Заголовком "Вывод" помечены результаты выполнения запросов.
Ана11иэ т
Заголовок "Анализ" предшествует подробному анализу примера.
ОсновыSQL
Базы данных
Термин база данных используется в самых разных областях, но
мы (применительно к SQL) будем считать базу данных набором све
дений, хранящихся неким упорядоченным способом. Проще всего
рассматривать базу данных как шкаф для хранения документов.
Шкаф - это просто физический объект для хранения данных, неза
висимо от того, что это за данные и как они упорядочены.
&838А8ННЫХ
Таблицы
Когда вы храните документы в шкафу, вы стараетесь не переме
шивать их. Вместо этого все документы раскладываются по соответ
ствующим папкам.
В среде баз данных такая папка называется таблицей. Таблица -
Та611ица
Схема
Стопбец
Одиноч ное п оле таблицы. Все таблицы состоят из одного или не
скол ьких столбцов.
ТИn д,анных
Тип разрешен н ых дл я хранения да н н ых. Каждому стол б цу табли
цы п рисваивается тип , котор ый разрешает хран ить в н е м тол ько
определен ную информацию.
Строки
Дан ные в таблице хранятся в строках, и каждая запись хран ится в
своей строке. Возвращаясь к срав н е н ию с сеткой электронной табли
цы, м ож н о сказать, что ее вертикаль ные ряды являются столбцам и
таблицы, а горизо нтальные - строкам и.
Напри м ер, в таблице клие нтов и н форм ация о каждо м клие нте
хранится в отдельной строке. Число строк в таблице равно числу за
писей о клиентах.
Строка
Отдел ь ная запись в таблице.
24 УРОК 1. Ос новы SQL
Первичные кл ючи
В каждой строке таблицы долж н о быть н есколько столбцов, ко
торые ун икальным образом идентифицируют ее. В таблице клиентов
это могут быть н ом ера клиен тов, тогда как в таблице заказов таки м
столбцом м ожет служить иден тификатор заказа. В таблице со спи
ском сотрудн иков м ожн о использовать столбец с н ом ерам и сотрудн и
ков или столбец с н ом ерам и карточек социальн ого страхован ия.
Первичный к.nюч
Стол бец (или набор столбцов), значения которого уникал ьно
идентифицируют каждую строку таблиц ы .
П оп робуйте сам и
Подобно изучению любого другого языка, лучше всего попробо
вать применить SQL на практике. Для этого вам понадобится база
данных и СУБД, в которой можно выполнять SQL-запросы.
Во всех упражнениях книги используются настоящие инструкции
SQL и настоящие таблицы базы данных. В приложении А описыва
ются все демонстрационные таблицы и рассказывается о том, как их
получить (или создать самостоятельно), чтобы можно было выпол
нять инструкции каждого урока. В приложении Б объясняется, как
выполнять SQL-запросы в различных СУБД. Прежде чем перейти к
следующему уроку, прочитайте эти два приложения, чтобы подгото
виться к выполнению примеров.
Резюме
Н а первом уроке в ы узнали, что такое SQ L и для чего он нужен.
В связи с тем что SQL применяется для взаимодействия с базами
данных, была также рассмотрена основная терминология баз данных.
УРОК 2
Из вп ечен ие дан н ых
из та бп и ц
И н струкци я SELECT
Как уже говорилось на уроке 1, инструкции SQL состоят из обыч
ных английских терминов. Эти термины называются ключевыми сло
вами, и каждая инструкция SQL содержит одно или несколько ключе
вых слов. Чаще всего вы будете сталкиваться с инструкцией SELECT,
которая предназначена для извлечения информации из одной или не
скольких таблиц.
Кпючевое спово
За резервирован н ое слово, я вл я ю щееся частью SQL. Никогда не
назы в а йте таблицу или столбец таким словом. В п риложении Д
п еречисл е н ы н аибол ее часто испол ьзуе м ы е кл ючевые слова.
ВВОА Т
SELECT prod_name
FROM Products;
Ана11из т
В этом примере инструкция SELECT извлекает один столбец под
названием prod_пате из таблицы Products . Имя столбца указы
вается сразу после ключевого слова SELECT, а ключевое слово FROM
указывает на имя таблицы, из которой извлекаются данные. Резуль
тат выполнения инструкции будет таким.
ВЫВОА Т
prod_name
Raggedy Ann
King doll
Queen doll
SELECT prod_name
FROM Products;
SELECT
prod_name
FROM
Products;
Анаnиз т
Как и в предыдущем примере, здесь для получения данных из
таблицы Product s применяется инструкция SELECT. В данном слу
чае перечислены три имени столбца, разделенные запятыми. Резуль
тат выполнения инструкции показан ниже.
Вывод т
prod_id prod_name prod_price
--------- -------------------- -------------
Ввод т
SELECT *
FROM Products;
32 УРОК 2. Извлечение данных из табл и ц
Анаnиз т
При наличии группового символа ( * ) возвращаются все столб
цы. Обычно (но не всегда) столбцы возвращаются в том порядке, в
котором они указаны в определении таблицы. Впрочем, табличные
данные редко выводятся в том виде, в котором они хр анятся в базе
данных. (Обычно они возвращаются в приложение, которое долж
ным образом форматирует их.)
Изв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 DISTINCT vend_id
FROM Products;
Анап из т
Предложение S E LE C T D I S T INCT vend_i d заставляет СУБД
вернуть только записи с отличающимися значениями ve n d i d, _
Вывод т
vend id
BRSOl
DLLOl
FNGOl
34 УРОК 2. Извлечение данных из табл и ц
prod_name
Ана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;
Ввод т
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
ВВОА Т
SELECT prod_name -- эт о ко ммент арий
FROM Products;
Ана11иэ т
Для встраивания комментариев предназначено выражение
(два дефиса). Все, что идет далее, считается текстом комментария.
38 УРОК 2. И з влеч е н и е да н н ы х из табл и ц
ВВОА Т
# Эт о к оммен тарий
SELECT prod_narne
FROM Products;
Ана11из 'f
Символ # в начаJJ:е строки превращает ее в комментарий.
Можно также создавать многострочные комментарии, в том чис
ле такие, которые предотвращают выполнение фрагментов запроса.
ВВОА Т
/* SELECT prod_name, vend_id
FROM Products; * /
SELECT prod_narne
FROM Products;
Ана11из 'f
Выражение / * помечает начало комментария, а выражение * / его -
Резюме
На
этом уроке вы узнали, как применять инструкцию SE LECT
для извлечения одного, нескольких и всех столбцов таблицы. Было
также показано, как извлекать уникальные значения и вставлять
комментарии в код. К сожалению, вы убедились в том, что сложные
SQL-запросы приходится проверять на совместимость с различными
СУБД. Далее мы рассмотрим, как сортировать результаты запроса.
УРОК 3
Сорти р ов ка
по.nучен н ых да н н ых
SELECT prod_name
FROM Products;
Вывод� т
prod_name
Предnожение
И нструкци и SQL состоят из п редложе н и й , одн и и з кото рых обя
зател ь н ы , другие - нет. П редложе н и е обычно в кл ючает в себя
кл ючевое слово и пол ьзовател ьские да н н ые. П р и мером м ожет
служить п редложе н и е FROM и нструкц и и SELECT из п р едь�дущего
л и сти н га .
ВВОА Т
SELECT prod_name
FROM Products
ORDER ВУ prod_name;
Анаnиз т
Эта инструкция идентична предыдущей, за исключением пред
ложения ORDER ВУ, которое заставляет СУБД отсортировать данные
в алфавитном порядке по столбцу prod_name. Результат показан
ниже.
ВЫВОА Т
prod_name
ВВОА Т
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER ВУ prod__price, prod_name;
42 УРОК З. С о рти ровка пол уче н н ы х да н н ы х
ВЫВОА Т
prod_id prod_price prod_name
--------- ------------- -------- � -----------
Сорти ровка по
n о11 оже нию сто116 ца
Порядок сортировки можно указать не только по именам столб
цов, но и по относительному положению столбца (проще говоря -
по номеру столбца). Чтобы лучше понять это, рассмотрим пример.
ВЫВОА Т
prod_id prod_price prod_name
Ана11иэ •
Как видите, результат выполнения запроса идентичен предьщу
щему примеру. Разница только в предложении ORDE R ВУ. Здесь не
указаны имена столбцов, а лишь оговорено их относительное поло
жение в списке SELECT. Выражение ORDER ВУ 2 означает сорти
ровку по второму столбцу списка, а именно по столбцу prod_price.
Предложение ORDER ВУ 2 , 3 означает сортировку по столбцу prod_
pri ce, а затем - по столбцу prod_name.
Основное преимущество данного метода заключается в том, что не
нужно несколько раз набирать в запросе имена столбцов. Но имеются
и недостатки. Во-первых, отсутствие явных имен столбцов повышает
верояпюсть того, что вы случайно укажете не тот столбец. Во-вторых,
можно случайно сменить порядок столбцов при изменении списка SE
LECT (забыв при этом внести соответствующие изменения в предло
жение ORDER ВУ). И наконец, очевидно�. что нельзя использовать этот
метод для сортировки по столбцам, не указанным в списке SELECT .
Вывод т
prod_id prod_price prod_name
--------- ------------- --------------------
Вывод т
prod_id prod_price prod_name
--------- ------- ------------------
Ана11иэ т
Ключевое слово DESC применяется только к тому столбцу, после
которого оно стоит. В предыдущем примере ключевое слово DE SC
было указано для столбца p r o d_p r i c e , но не для p r o d_ name .
Таким образом, столбец р r оd_р riсе.сортируется по убыванию,
а столбец prod_name (в пределах каждого ценового блока) - как
обычно, по возрастанию.
Резюме
Этот урок был посвящен сортировке результатов запроса с по
мощью предложения ORDER ВУ инструкции SELECT. Данное пред
ложение, которое должно быть последним в инструкции SELECT,
можно применять для сортировки строк по одному или нескольким
столбцам.
УРОК 4
Ф и 11ьтраци я да н н ых
ВВОА Т
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
Анап и э т
Приведенная инструкция извлекает два столбца из таблицы то
варов, но возвращает не все строки, а только те, значение в столбце
prod_pri ce которых равно 3 . 4 9.
48 УРОК 4. Фил ьтра ция дан н ых
ВЫВОА Т
prod_name prod_price
Оператор П роверка
Равенство
<> Неравенство
!= Неравенство
< М е н ьше
<= Мен ьше и л и равно
!< Не мен ьше
> Бол ьше
>= Бол ьше и л и равно
!> Не бол ьше
BE TWEEN Вхожден и е в диа пазон
I S NULL Значение NULL
Вывод т
prod_name prod_price
Проверка на неравенство
В следующем примере выводятся все товары , не изготовленные
фирмой DLLOl.
Вывод -.
veщi_id prod_name
Ввод -.
SELECT vend_id, prod_price
FROM Products
WHERE vend id != 'DLLOl ';
обратитесь к документа ц и и .
prod_name prod_pr,ice
Ана11из т
Как видно из приведенного примера, при использовании опера
тора BETWEEN нужно указывать два значения: нижнюю и верхнюю
границы диапазона. Оба значения должны быть разделены ключе
вым словом AND. При этом извлекаются все значения из диапазона,
включая те, что равны граничным значениям.
NULL
Отсутств и е ка кого-либо значен и я , в отли ч и е от пол я , содержа
щего о, пустую строку и ли п росто несколько п робело в .
Операторы в предложении WHER E 53
ВВОА Т
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
ВВОА Т
SELECT cust name
FROM Customers
WHERE cust email IS NULL;
ВЫВОА т
cust name
Kids Place
Tha Тоу Store
Резюме
На этом уроке рассказывалось о том, как фильтровать возвращае
мые данные с помощью предложения WHERE инструкции SELECT.
Вы узнали, как проверить данны е на равенство, неравенство, вхож
дение в диапазон значений, а также на отсутствие значения {NULL).
УРОК 5
Расширенная
фи11ьтрация Аанных
Оператор
С п еци альное ключевое слово, используемое для объеди нения
или изменен и я услов и й в предложен и и WHERE.
Оператор AND
Чтобы отфильтровать данные по нескольким столбцам, необходи
мо воспользоваться оператором AND для добавления условий в пред
ложение WHERE. Вот как это делается.
Ввод т
Анапиз ..-
Посредством данного запроса извлекаются названия и цены всех
товаров, предлагаемых поставщиком DLLOl, с ценой 4 доллара и
меньше. Предложение WHERE в инструкции SELECT содержит два
условия, а оператор AND используется для их объединения. Опера
тор AND заставляет СУБД возвращать только те строки, которые удо
влетворяют всем перечисленным условиям. Если товар предлагает
ся поставщиком DLLO 1, но стоит больше 4 долларов, он не попадет
в результаты запроса. Аналогично товары, которые стоят меньше
ВЫВОА ..-
prod_id prod_price prod_name
AND
Оператор ОR
Действие оператора OR противоположно действию оператора
AND. Он заставляет СУБД извлекать только те строки, которые удо
влетворяют хотя бы одному условию. В большинстве СУБД второе
условие даже не рассматривается в предложении WHERE, если вы
полняется первое условие (в таком случае строка будет выведена не
зависимо от второго условия).
·
Рассмотрим следующую инструкцию S ELECT.
Ввод т
Анаnиз т
Вывод т
p rod_name p rod_p r i ce
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, а потом уже ло -
Ввод т
Вывод 'У
prod_name p rod_price
Ана.n из т
Оператор IN
Оператор IN служит для указания диапазона условий, любое из
которых может быть выполнено. При этом значения, заключенные
в скобки, перечисляются через запятую. Рассмотрим следующий
пример.
Ввод 'У
Вывод 'У
p rod_name p rod_p r i ce
Ана11из т
Ввод 'У
Вывод •
p rod_name prod_p r i ce
IN
Оператор NOT
Логический оператор NOT в предложении WHE RE служит только
одной цели - отрицать все условия, следующие за ним. Поскольку
он никогда не используется сам по себе (а только вместе с другими
логическими операторами), его синтаксис немного отличается . Опе
ратор NOT вставляется перед названием столбца, значения которого
Н)'"'АС НО отфильтровать, а не после.
62 У РО К 5 . Расширенная фил ьтрация дан ных
NОТ
Ввод. т
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из т
Ввод •
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.
Резюме
На этом уроке вы узнали, как использовать логические операторы
AND и OR в предложениях WHERE . Было также показано, как управ
лять порядком обработки операторов и как применять операторы IN
и NОТ.
УРОК 6
Ф и п ьтраци я
с и с n оп ь зова н ие м
метаси м воп ов
Метасимвопы
Специал ьные сим вол ы , п р и меняемые для поиска части зн ачения.
66 УРОК 6. Фил ьтра ция с использованием метасим волов
Wабпон поиска
Усло ви е отбора стро к, состоя щее из текста , м етаси м волов и лю
бой их ком б и н а ци и .
ПреАикат
Когда оператор не я в ляется оператором? Когда он я вля ется пре
д икатом , зада ющим разм е р м ножества п роверяемых значен и й .
Технически LIКE -это п реди кат, а не о п е ратор . Сутъ операции
остается той же, п росто н е пуга йтесь этого тер м и н а , если встре
тите его в документа ц и и по SQL.
Вывод т
prod_id prod_name
Анализ т
В этом примере используется шаблон поиска ' Fish% ' . При про
верке данного условия возвращаются все значения, которые начина
ются с символов Fi sh. Знак % заставляет СУБД принимать все сим
волы после слова Fish независимо от их количества.
Ввод т
SELECT prod_i d , prod_name
FROM Produ c t s
WHERE prod_name L I KE ' %bean bag% ' ;
Вывод т
prod_id prod_name
Анаnиз т
Шаблон ' %bean bag% ' означает найти все значения, содержа
щие текст Ьеап bag в любом месте названия, независимо от коли
чества символов перед указанным текстом или после н его.
Метасим вол м ожет находиться в шаблоне поиска, хотя это редко
бывает полезны м . В следующе м прим ере выполняется поиск всех
товаров, названия которых начинаются на F и заканчиваются на у.
SELECT prod_name
FROM Produ c t s
WHERE prod_name L I KE ' F% y ' ;
Рассмотрим пример.
Ввод У
SELECT prod_i d , prod_name
FROM Produ c t s
WHERE prod_name L I KE ' inch teddy bear ' ;
Вывод У
prod_ i d prod_name
Ана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
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 ] % ' .
'
ВВОА Т
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
условий WHERE.
Резюме
Н а этом уроке рассказывалось о том, что такое метасимволы и
как применять их в условиях WHERE. Теперь вы знаете, что метасим
волы нужно использовать осторожно, не злоупотребляя ими.
УРОК 7
С оздан ие -
Попе
По сути то же самое, что и столбец. В осн о в н о м эти тер м и н ы
вза и моза меняем ы , хотя столбцы табли ц о б ы ч н о н а з ы в а ют
столбца ми, а тер м и н поле ч а ще п р и м е н я ется по отношен и ю к
в ы ч исля е м ы м поля м .
Конкатенац ия попей
Чтобы продемонстрировать применение вычисляемых полей,
рассмотрим простой пример: создание заголовка, состоящего из двух
столбцов.
В таблице Vendors хранится название поставщика и его страны.
Предположим, необходимо создать отчет по поставщику и указать
его страну как часть его имени в виде имя ( страна ) .
В отчете должно быть одно значение, а данные в таблице хра
нятся в двух столбцах: vend_name и vend_country. Кроме того,
значение vend_country необходимо заключить в скобки, которых
Кон катенация полей 75
Конкатенация
Ком б и н и рова н и е значен и й (путем п рисоед и н е н и я их д руг к другу)
для получения одного "дли н ного" значен и я .
ВВОА Т
SELECT vend name + ' ( ' + vend_country + ' ) '
FROM Vendors
ORDER ВУ vend_name ;
ВЫВОА Т
Ввод� т
�ELECT vend_name 1 1 ' (' 1 1 vend_country 1 1 ') '
FROM Vendo r s
ORDER ВУ vend_name ;
В ь1 вод� т
Ввод� т
SELECT Concat ( vend_name , ' (', vend_count r y , ' ) ' )
FROM Vendo r s
ORDER ВУ vend_name ;
Ана11 из т
В предыдущих инструкциях SELECT была выполнена конкатен а
ция следующих элементов:
Вывод т
Ана11из т
Функция RTRIM ( ) отбрасывает все пробелы справа от указанно
го значения. При использовании функции RTRIM ( ) каждый столбец
форматируется корректно.
78 УРОК 7. Создание выч исляемых п ол ей
ВЫВОА Т
vend t i t l e
Ввод� т
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 ;
Ввод� т
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 реальный столбец таблицы.
В ы n оn нен ие математически х
в ы чисnени й
Еще одним способом использования вычисляемых полей являет
ся выполнение математических операций над извлеченными данны
ми. Рассмотрим пример. В таблице Orders хранятся все полученные
заказы, а в таблице Orde r i tems списки товаров для каждого за
-
Ввод т
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
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
-------- --------- ---------- ---------------
Ана11из т
Столбец expanded_price в данном случае является вычисляе
мым полем. Вычисление было простым: quan t i t y * i tem_pr i c e.
Теперь клиентское приложение может использовать новый вычис
ляемый столбец, как и любой другой в таблице.
В SQL поддерживаются основные математические операторы,
перечисленные в табл. 7 . 1 . Не забывайте, что для управления по
рядком обработки операторов можно использовать круглые скобки
(см. урок 5).
Оператор Описание
+ Сложе н и е
В ы ч ита н и е
* Ум н оже н и е
/ Дел е н и е
82 УРОК 7. Создание выч исляемых полей
Резюме
Н а этом уроке вы узнали, что такое вычисляемые поля и как их
создавать. Были рассмотрены примеры использования вычисляемых
полей для конкатенации строк и выполнения математических опера
ций. Кроме того, было показано, как создавать и применять псевдо
нимы, чтобы клиентское приложение могло обращаться к вычисляе
мым полям.
УРОК 8
И с n о.nь зова н ие
фун к ций о бр а б от к и
А8Н Н ЫХ
На этом уроке вы узнаете, что такое функ ции, как ие типы функ ций
поддерживаются в СУБД, как применять функции и какие пробл ем ы
при этом могут возникать .
Ч то такое функц и я
Как и в большинстве других языков программирования, в SQL
поддерживается использование функций для работы с данными.
Функции - это операции, которые чаще всего приходится выпол
нять над данными, включая различные преобразования и вычисления.
Примером может служить функция RTRIM ( ) , которую мы приме
няли на предыдущем уроке для удаления пробелов в конце строки.
Задача Си нтаксис
Переносим ый код
Код, кото р ы й может работать в разных системах.
П ри ме нен ие фун кц ий
В большинстве реализаций SQL поддерживаются следующие
типы функций .
Ввод т
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
Анап из т
Функция UPPER ( ) преобразует символы в верхний регистр, поэ
тому в данном примере имя каждого поставщика перечислено дваж
ды: первый раз в том виде, в котором оно хранится в таблице Ven
do r s , а второй раз - будучи преобразованным в верхний регистр,
в виде столбца vend name upca se.
_ _
Функция Описание
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
cu s t name cu s t contact
Ввои т
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
Ана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 корректно отфильтрует не
обходимые данные.
Ввод •
SELECT o rder num
FROM Orde r s
WHERE DATEPART ( yy , o rde r_date ) 2012;
Вывод •
order num
20005
20006
20007
20008
20009
В в од •
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 Путем сравнения
_ .
ВВОА •
SELECT order num
FROM Orde r s
WHERE DATE_PART ( ' ye a r ' , order_date ) 2012 ;
90 УРОК 8. И спользова н и е фун к ци й обработки да н н ых
ВВОА •
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 ;
SELECT o r de r num
FROM Orde r s
WHERE s t r ftime ( ' %Y ' , o rde r_date ) 2012 ;
Резюме
Н а этом уроке объяснялось, как применять SQL-функции, пред
назначенные для обработки данных. Несмотря на то что они могут
быть весьма полезными при форматировании и фильтрации данных,
они весьма различны в разных реализациях SQL.
УРОК 9
Итоrовые функции
Функци и , обрабаты вающие набор строк дл я в ы ч и сл е н и я одного
обобщающего з н а ч е н и я .
Функция 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
Ввод т
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 для кото
_
Функц ия COUNТ ( )
Функция C OUNT ( ) подсчитывает число строк. С ее помощью
можно узнать общее число строк в таблице или число строк, удо
влетворяющих определенному критерию.
Эту функцию можно использовать двумя способами:
Вывод т
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 клиентов
имеют адрес электронной почты).
Функ ц ия МАХ ( )
Функция МАХ ( ) возвращает наибольшее значение в указанном
столбце. Для этой функции необходимо задать имя столбца, как по
казано ниже.
ВВОА Т
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. Итоговые выч исления
Функц ия М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
Функ ц ия 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 гарантирует, что учитываться бу
дут только товары из указанного заказа.
Ввод, '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 получается более высоким, так как в таблице
есть несколько товаров с одинаково низкой ценой. Не учитывая их,
мы получаем более высокую среднюю стои мость.
Ко м би ни рован ие
ито 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
Ана11 из т
В данном случае в одной инструкции SELECT используются сра
зу четыре итоговые функции и возвращаются четыре значения (чис
ло элементов в таблице Produ c t s , самая высокая, самая низкая и
средняя стоимость товаров).
Резюме
Итоговые функции предназначены для вычисления базовых ста
тистических данных. В SQL поддерживаются пять таких функций,
104 УРОК 9 . И тогов ы е в ы ч ислен и я
Гру пп и р ов ка дан н ых
Ввод т
SELECT COUNT ( * ) AS num_prods
FROM Produ c t s
WHERE vend i d ' DLL O l ' ;
Вы вод т
num_prods
Со здан ие 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
Ввод� т
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 здесь не работает, поскольку
фильтрация основана на итоговом значении группы, а не на значени
ях отобранных строк.
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 долларов), как показа
но ниже.
Вывод, т
vend i d num_prods
BRS O l 3
DLL O l 4
FNG O l 2
строк.
ORDER BY GROUP BY
Вы вод� т
order num i t ems
----------
20006 3
20007 5
20008 5
20009 3
Груп п и ровка и сортировка 113
П Р И М ЕЧ А Н И Е : несовместимость с 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 перечислены все предложения, которые
мы изучили до сих пор, в порядке, в котором они должны следовать.
Резюме
На. предыдущем уроке вы узнали, как применять итоговые функ
ции SQL для выполнения сводных вычислений. На этом уроке рас
сказывалось о том, как использовать предложение GROUP ВУ для
выполнения аналогичных вычислений по отношению к группам дан
ных и получения отдельных результатов для каждой группы. Было
показано, как с помощью предложения НAVING осуществлять филь
трацию на уровне групп. Кроме того, объяснялось, какова разница
меЖдУ предложениями ORDER ВУ и GROUP ВУ, а также между пред
ложениями WHERE и НAVING.
УРОК 11
П о Аза n р о с ы
Запрос
Ка кая -л и бо и н струкция SQL. Одн а ко ч а ще всего этот терм и н ис
пол ьзуют по отношен и ю к и н струкц и я м SELECT.
ВЫВОА Т
o rder nurn
20007
20008
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 '
ВВОА Т
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 ' ) ;
ВВОА Т
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
Ввод� т
SELECT COUNT ( * ) AS orde r s
FROM O r de r s
WHERE c u s t i d ' 1000000001 ' ;
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
Ввод т
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. Подза просы
Резюм е
На этом уроке вы узнали, что такое подзапросы и как их приме
нять. Чаще всего подзапросы используются в операторах IN предло
жения WHERE, а также для заполнения вычисляемых столбцов. Были
· приведены примеры операций обоих типов.
УРОК 12
Объеди нен ие та бп и ц
Масштабирование
Возможность справляться со все возраста ющей нагрузкой без
сбое в. О хорошо сп роекти рова н н ых базах да н н ых ил и п риложе
н и ях говорят, что о н и хоро шо ма с шта б и руются .
За ч ем нужны объединени я
Распределение данных по многим таблицам обеспечивает их бо
лее эффективное хранение, упрощает обработку данных и повышает
масштабируемость базы данных в целом. Однако эти преимущества
не достигаются даром - за все приходится платить.
Если данные хранятся во многих таблицах, то как их извлечь с
помощью одной инструкции SELECT?
Ответ таков: посредством объединений. Объединение представля
ет собой механизм слияния таблиц в инструкции SELECT. Используя
особый синтаксис, можно объединить несколько исходных таблиц в
одну общую, которая будет на лету связывать нужные строки из каж
дой таблицы.
Со здание объединени я
Создание объединения - очень простая процедура. Нужно ука
зать все таблицы, которые должны быть включены в объединение, а
также подсказать СУБД, как они должны быть связаны между собой.
Р ассмотрим следующий пример.
Вывод. т
vend name prod_name prod_pr i ce
---------------- -------------------- ----------
Ана11из т
Инструкция SELECT начинается точно так же, как и все инструк
ции, которые мы до сих пор рассматривали, - с указания столбцов,
которые должны быть извлечены. Ключевая разница состоит в том,
что два из указанных столбцов (prod name и prod_pr i ce) нахо
_
Декартово nро11эвеАен11е
Результаты , возвращаем ы е п р и сл и я н и и табл и ц без указа н и я
условия объед и н е н и я . Кол и чество получ е н н ых строк будет равно
ч и слу строк в первой табл и це, ум н ожен ному на ч исл о строк во
второй табл и це.
Ввод т
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
--------------- -------------------- ----------
Ана11из т
Как видно из представленных результатов, декартов о произве-
дение вы, скорее всего, будете использовать очень редко . Данные,
полученные таким способом, ставят в соответствие каждому товару
130 УРОК 12. Объединение табл и ц
Перекрестное объединение
И ногда объеди н е н и е , которое возвра щает дека рто во п роизве
ден ие, назы вают перекрестн ы м объед и н е н и е м .
В нутренние объединения
Объединение, которое мы до сих пор использовали, называется
объединением по равенству - оно основано на проверке равенства
записей двух таблиц. Объединение такого типа называют также вну
тренним объединением. Для подобных объединений можно приме
нять несколько иной синтаксис, явно указывающий на тип объеди
нения. Следующая инструкция 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
Ввод т
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
------------------- --------------- ---------- -------
Анапиз т
В этом примере выводятся элементы заказа номер 2 О О О 7 . Все
они находятся в таблице Orde r i tems. Каждый элемент хранится в
соответствии с идентификатором, который ссылается на товар в та
блице Produ c t s . Эти товары связаны с соответствующими постав
щиками в таблице Vendors по идентификатору поставщика, который
хранится вместе с каждой записью о товаре. В предложении FROM
данного запроса перечисляются три таблицы, а предложение WHERE
определяет оба названных условия объединения. Дополнительное
условие служит для фильтрации только элементов заказа 2 О О О 7 .
Ана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
Анаn из т
Как уже говорилось на уроке 1 1 , получение необходимых для
этого запроса данных требует обращения к трем таблицам. Однако
вместо подзапросов здесь были применены два объединения та
блиц, а также указаны три условия WHERE . Первые два связывают
таблицы в объединение, а последнее фильтрует данные по товару
RGANO l .
Рез юм е
Объединения - одно из самых важных и востребованных
средств 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 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.
Самообъединения
Одна из основных причин для использования псевдонимов та
блиц состоит в возможности обращения к одной и той же таблице
несколько раз в одной инструкции 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
Ана11 из т
В первом решении используются подзапросы. Внутренняя ин
струкция SELECT возвращает название компании ( cus t name) с ко _ ,
Вы вод� т
cust id c u s t name cust contact
Ана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
Естественные объединения
Всякий раз, когда объединяются таблицы, по крайней мере один
столбец будет появляться более чем в одной таблице (по нему и вы
полняется объединение). Обычные объединения (внутренние, кото
рые мы рассмотрели на предыдущем уроке) возвращают все данные,
даже многократные вхождения одного и того же столбца. Естествен
ное объединение просто удаляет эти многократные вхождения, и в
результате возвращается только один столбец.
Естественным называется объединение, в котором извлекаются
только не повторяющиеся столбцы. Обычно это делается с помо
щью метасимвола (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 ' ;
Ана11из т
В этом примере метасимвол * используется только для первой
таблицы. Все остальные столбцы указаны явно, поэтому никакие ду
бликаты столбцов не извлекаются.
В действительности каждое внутреннее объединение, которое мы
использовали до сих пор, представляло собой естественное объеди
нение, и, возможно, вам никогда не понадобится внутреннее объеди
нение, не являющееся естественным.
Ввод т
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. Созда ние расширенных объединен и й
ВВОА Т
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 ;
ВВОА Т
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
Ввод, т
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. Созда н и е рас ш ире н н ых объ еди нен и й
Вывод, т
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
Ком б и н и р ова н н ые
за п р о с ы
ВЫВОА Т
c u s t name cust contact cust ema i l
Вывод т
c u s t n ame cust contact cu s t ema i l
Ана.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
Ана.nиз т
Данный запрос содержит исходные инструкции SELECT, разде
ленные ключевым словом UN I ON. Оно заставляет СУБД выполнить
обе инструкции и вывести результаты в виде одного набора резуль
татов.
150 УРОК 14. Комбинирова н н ые зап росы
Ввод т
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 ' ;
Вывод т
c u s t name c u s t contact cu s t ema i l
Ана.nиз т
При использовании оператора UNION ALL СУБД не удаляет ду
бликаты. Поэтому в данном примере получено пять строк, и одна из
них повторяется дважды.
ВВОА Т
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
Анапиэ т
В этом операторе UN I ON используется одно предложение
ORDER ВУ после заключительной инструкции SELECT. Несмотря на
то что предложение ORDER ВУ является частью только последней
инструкции SELECT, в действительности СУБД будет применять его
для сортировки всех результатов, возвращаемых обеими инструк
циями.
154 УРОК 14. Комбин ирова нные запросы
Резюме
На этом уроке вы узнали, как комбинировать инструкции SELECT
с помощью оператора UNI ON. Используя этот оператор, можно вер
нуть результаты нескольких инструкций в виде одного комбиниро
ванного запроса, включающего или исключающего дубликаты. За
счет оператора UNI ON можно значительно упростить сложные пред
ложения WHERE и запросы, связанные с извлечением данных из не
скольких таблиц.
УРОК 15
Д о ба в11 ен и е Аа н н ых
Ввод, т
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 (предпола
гается, что таблица допускает отсутствие значений в этих столбцах).
Столбцы должны заполняться в порядке, в котором они перечислены
в определении таблицы.
Ввод т
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 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 ' ,
Ввод� т
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 не включает указанные
два столбца и два соответствующих им значения.
ВВОА Т
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 .
Ввод� т
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 поддерживается
несколько иной синтаксис.
Рез юме
Н а этом уроке вы научились добавлять строки в таблицу базы
данных. Вы ознакомились с несколькими способами применения
инструкции INSERT и узнали, почему желательно в явном виде ука
зывать имена столбцов. Вы также научились применять инструкцию
INSERT SELECT для импорта строк из другой таблицы и инструк
цию SELECT INTO для экспорта строк в новую таблицу. На сле
-
Об нов11 ен ие
и уда 11 ен ие да н н ых
О бновл ен ие дан н ых
Для обновления (модификации) данных какой-либо таблицы
предназначена инструкция U P DATE, которую можно использовать
двумя способами:
Ввод 'У
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 ' ;
Ввод 'У
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
Ввод т
UPDATE Cus tome r s
S E T cust ema i l = NULL
WHERE cust id = ' 1000000005 ' ;
ВВОА Т
DELETE FROM C u s t ome r s
WHERE cu s t i d = ' 1000000006 ' ;
Помните о том, что в SQL нет кнопки отмены. Будьте очень вни
мательны, выполняя инструкции UPDATE и DELE TE, иначе можно
вдруг обнаружить, что удалены или обновлены не те данные.
Резюм е
На этом уроке вы узнали, как использовать инструкции UPDATE
и DELETE для обновления и удаления табличных данных. Вы ознако
мились с синтаксисом каждой из этих инструкций, а также с опасно
стями, которыми чревато их применение. Вы также узнали, почему
столь важно указывать предложение WHERE в инструкциях UPDATE
и DELETE, и изучили основные правила, которым нужно следовать,
чтобы по неосторожности не повредить данные.
УРОК 17
Созда н ие та б л и ц
и р а б ота с н и м и
Со здание та 611 и ц
SQL применяется не только для работы с табличными данными,
но и для выполнения всех операций с базами данных, включая созда
ние и модификацию таблиц.
Существуют два способа создания таблиц.
Ввод т
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
Анаnиз �
Как видите, имя таблицы указывается сразу же после ключе
вых слов CREATE TABLE. Определение таблицы (все ее столбцы)
заключается в круглые скобки. Определения столбцов разделяются
запятыми. Приведенная в данном примере таблица состоит из пяти
столбцов. Определение каждого столбца начинается с имени столбца
(которое должно быть уникальным в пределах данной таблицы), а за
ним указывается тип данных. (Обратитесь к уроку 1 , чтобы вспом
нить, что такое типы данных. Кроме того, в приложении Г приве
ден перечень основных типов данных в SQL.) Инструкция в целом
заканчивается точкой с запятой, которая стоит после закрывающей
круглой скобки.
Ранее уже говорилось, что синтаксис инструкции CREATE
ТАВLЕ зависит от СУБД, и данный пример наглядно доказывает это.
В Oracle, PostgreSQL, SQL Server и SQLite инструкция будет рабо
тать в приведенной форме, а вот в MySQL тип VARCНAR должен быть
заменен типом text. В DB2 значение NULL должно быть удалено из
последнего столбца. Именно поэтому пришлось использовать раз
личные сценарии создания таблиц для каждой СУБД (как объясня
ется в приложении А).
Ана.n из •
Посредством этой инструкции создается таблица Orde r s , неод
нократно использованная в книге. Таблица состоит из трех столбца�:
номер и дата заказа, а также идентификатор клиента. Все три столб
ца являются необходимыми, и каждый из них содержит специфика
цию NOT NULL, �оторая будет препятствовать добавлению в таблицу
Создан и е табл и ц 177
Ана11иэ �
Посредством этой инструкции создается таблица Vendo r s , так
же неоднократно использованная в книге. Столбцы с идентифика
тором и именем поставщика необходимы, поэтому оба Оiiределены
как NOT NULL (т.е. не допускающие значений NULL). Пять осталь
ных столбцов допускают значения NULL, поэтому для них не указана
спецификация NOT NULL. Значение NULL принято по умолчанию, и в
отсутствие спецификации NOT NULL предполагается, что значения
NULL допустимы.
Ввод� т
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
СУ Б Д Функция/переменная
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 ' )
Обновnение табn и ц
Для того чтобы обновить определение таблицы, следует восполь
зоваться инструкцией ALTER ТАВLЕ. Несмотря на то что все СУБД
поддерживают эту инструкцию, ее возможности в значительной сте
пени зависят от конкретной СУБД. Ниже приведен ряд соображений
по поводу применения инструкции ALTER ТАВLЕ.
180 УРОК 17. Созда н и е табл и ц и работа с н и м и
Анаn из т
Посредством этой инструкции в таблицу Vendo r s добавляется
столбец vend_phone. Должен быть указан тип данных столбца.
Другие операции, такие как изменение или удаление столбцов,
задание ограничений или ключей, требуют похожего синтаксиса.
(Отметим, что следующий пример будет работать уже не во всех
СУБД.)
ВВОА Т
ALTER ТАВLЕ Vendo r s
DROP COLUМN vend_phone ;
ВВОА Т
DROP ТАВLЕ C u s t C op y ;
Ана11 из т
Эта инструкция удаляет таблицу Cus tCopy (которую мы создали
на уроке 1 5). В данном случае не требуется никакого подтверждения, и
невозможно вернуться к прежнему состоянию - в результате приме
нения инструкции DROP TABLE таблица будет безвозвратно удалена.
П ереименование табл и ц
В разных СУБД переименование таблиц осуществляется по
разному. Не существует жестких, устоявшихся стандартов на выпол
нение этой операции. Пользователи DB2, MariaDB, MySQL, Oracle
и PostgreSQL могут применять инструкцию RENAМE . Пользователям
SQL Server доступна хранимая процедура sp _rename. SQLite под
держивает переименование таблиц посредством инструкции ALTER
ТАВLЕ.
Базовый синтаксис для всех операций переименования требует
указания старого и нового имен. Однако существуют различия, зави
сящие от реализации. Обратитесь к документации своей СУБД, что
бы узнать детали относительно поддерживаемого ею синтаксиса.
Резюме
На этом уроке вы ознакомились с несколькими новыми инструк
циями SQL. Инструкция CREATE TABLE предназначена для созда
ния новых таблиц, ALTER TABLE для изменения столбцов та
-
П р е д ставпен и я
Ч то такое n редставn ен ия
Представления - это виртуальные таблицы. В отличие от та
блиц, содержащих данные, представления содержат запросы, кото
рые динамически извлекают данные, когда это необходимо.
ВВОА Т
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 ' ;
ВВОА Т
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 ' ;
Со здание п редставn ен и й
Итак, вы знаете, что такое представления ( и какими правилами
следует руководствоваться при работе с ними). Теперь разберемся,
как они создаются.
Представления создаются с помощью инструкции CREATE VIEW.
Аналогично инструкции CREATE ТАВLЕ, данную инструкцию мож
но использовать только для создан ия представления, которого пре
жде не существовало.
Чтобы переза п и сать (или обнов ить) п редста вле н и е , вна чале
нужно п р и м е н ить по отношен и ю к нему и н струкци ю DROP VI EW,
а потом заново создать п редставлен ие.
Использование представлений д ля
упро щ ения сложных о бъединений
Чаще всего представления используются для упрощения слож
ных запросов, и нередко это относится к объеди н е н иям. Рассмотрим
следующий пример.
190 УРОК 18. П редста вления
Анапиз т
Посредством этой инструкции создается представление P r o
ductCu s t ome r s , которое объединяет три таблицы для получения
списка клиентов, заказавших какой-нибудь товар. Если затем выпол
нить инструкцию SELECT * FROM ProductCustome r s , она вернет
список всех клиентов, сделавших заказы.
Для получения списка клиентов, заказавших товар RGANO l , не
обходимо выполнить следующее.
Вывод т
cu s t name cust contact
Анап из т
Эта инструкция извлекает указанные данные из представления
благодаря предложению WHERE. Когда СУБД обрабатывает такой за
прос, она добавляет указанное условие к любому уже существующе
му предложению WHERE в запросе самого представления, благодаря
чему данные фильтруются правильно.
Таким образом, представления могут значительно упростить
сложные инструкции SQL. Используя представления, можно один
раз записать код SQL и затем повторно применять его, когда возника
ет такая необходимость.
Создание предста влений 191
Ввод т
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 )
Ввод т
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 ;
Ана.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 )
ВВОА Т
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 , так что соответствую
_
ВВОА Т
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
ВВОА Т
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
------- -------- ---------- --------------
ВВОА Т
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 ;
ВВОА т
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
Х р а н и м ые п р оцедуры
Ввод •
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
В ВОА Т
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
-
В ВОА Т
var ReturnVa lue NUМВER
ЕХЕС Ma i l ingL i s tCount ( : ReturnVa l ue ) ;
SELECT ReturnValue ;
Ана11из т
В этом коде объявляется переменная, которая будет хранить
значение, возвращаемое процедурой. После этого запускается сама
процедура и выполняется инструкция SELECT для отображения по
лученного значения.
Ниже приведена версия для Microsoft SQL Server.
Созда н и е х ран и м ы х процедУр 203
Ана11из т
Эта хранимая процедура вообще не принимает никаких аргу
ментов. Вызывающее приложение получает нужное значение благо
даря тому, что в SQL Server поддерживаются возвращаемые значе
ния. Здесь посредством инструкции DECLARE объявлена локальная
переменная @ cn t (имена всех локальных переменных в SQL Server
начинаются с символа @). Эта переменная затем используется в ин
струкции S E L E C T , принимая значение, возвращаемое функцией
COUNT ( * ) . Наконец, инструкция RETURN используется для передачи
результатов подсчета в вызывающее приложение.
Для запуска примера в SQL Server необходимо выполнить сле
дующий код.
Ана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. Об _
ВВОА Т
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 ;
Анализ т
Данная хранимая процедура также создает новый заказ в та
блице Orde r s . Но на этот раз СУБД сама генерирует номер зака
за. Большинство СУБД поддерживают такой тип функционально
сти (подобные столбцы называются полями автонумерации). Опять
же, процедуре передается только один аргумент: идентификатор
клиента, сделавшего заказ. Номер и дата заказа не указываются во
обще - СУБД использует значение по умолчанию для даты ( функ
ция GETDATE ( ) ), а номер заказа генерируется автоматически. Как
узнать, какой идентификатор был сгенерирован? В SQL Serer для
этого предназначена глобальная переменная @ @ I DENT I TY, возвра
щаемая в вызывающее приложение (на этот раз с использованием
инструкции SELECT).
206 УРОК 19. Хран и м ые процедУры
Резюм е
На этом уроке вы узнали, что т акое хранимые процедуры и для
чего они нужны. Вы т акже ознакомились с базовым синтаксисом,
применяемым для создания и выполнения хранимы х процедур, и
узнали о способах и х применения. В каждой СУБД хранимые про
цедуры реализуются по-разному. Не исключено, что в вашей СУБД
способ выполнения хранимых процедур будет несколько иным, и вы
получите возможности, не упомянутые в данной книге. За дополни
тельной информацией обратитесь к документации своей СУБД .
УРОК 20
Обраб от ка транз а к ци й
ВВОА Т
BEGIN TRANSACT I ON
С ОММ I Т TRANSACT I ON
Анаnиэ т
В этом примере все инструкции, заключенные между фразами
BEGIN TRANSACT I ON и СОММ I Т TRANSACT I ON, ДОЛЖНЫ быть или
выполнены, или не выполнены.
Эквивалентный код для MariaDB и MySQL приведен ниже.
ВВОА Т
S TART TRANSACT I ON
ВВОА Т
S E T TRANSACT I ON
ВВОА Т
В PostgreSQL используется синтаксис ANSI SQL.
Управление тра нзакция м и 211
BEG I N ;
И нструкц ия ROLLВACК
Инструкция ROLLBACK предназначена для отката (отмены) SQL
запросов, как показано ниже.
Ввод� т
DELETE FROM Orde r s ;
ROLLBACK ;
Анаn из т
В этом примере выполняется и сразу же, посредством инструк
ции ROLLBACK, аннулируется запрос DELETE. Пусть это и не самый
полезный пример, он все равно показывает, что, будучи включенны
ми в транзакцию, операции DELETE (а также INSERT и UPDATE ) не
являются окончательными.
И нструк ц ия СОММI Т
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
Ввод т
SAVE POINT de l e t e l ;
Ввод т
SAVE TRANSACT I ON de l e t e l ;
Ввод т
ROLLBACK TRANSAC T I ON de l e te l ;
Ввод т
ROLLBACK то de l e te l ;
Ввод т
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 Т.
Резюме
Транзакции представляют собой блоки инструкций SQL, которые
должны выполняться в пакетном режиме (все вместе). Вы ознакоми
лись с инструкциями СОММI Т и ROLLBACK, которые предназначены
для явного управления процессами записи и отмены результатов
транзакций. Вы также узнали, как применять точки сохранения для
обеспечения более гибкого контроля за отменой запросов. Разуме
ется, обработка транзакций - очень обширная тема, которую не
возможно охватить за один урок. Кроме того, механизмы обработки
транзакций реализованы по-разному в каждой СУБД. Поэтому обра
титесь к документации своей СУБД за дополнительной информацией.
УРОК 21
Кур с о ры
На этом уроке вы узнаете, что такое курсоры и как их применять.
Ч то такое курсор ы
SQL-запросы, связанные с извлечением данных, работают с на
борами строк, которые называются результирующими. Все возвра
щаемые строки соответствуют условию отбора, указанному в ин
струкции SQL; их может быть ноль или больше. При использовании
простых инструкций SELECT невозможно получить первую, следую
щую строку или предыдущие десять строк. Это объясняется особен
ностями функционирования реляционной СУБД.
Реэупьтирующиii набор
Резул ьтаты , возвраща е м ы е SQL-зa n poco м .
Работа с курсора ми
Работу с курсором можно разделить на несколько этапов .
Создание курсоров
Курсоры создаются с помощью инструкции 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
Ввод т
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) .
Теперь, после того как курсор определен, его можно открыть.
Ввод т
OPEN CURSOR CustCur s o r
Ввод т
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
Анаnиз т
В данном примере переменные объявляются для каждого извле
каемого столбца, а инструкции FETCH осуществляют выборку строк
и сохраняют их значения в этих переменных. Цикл WHI LE нужен для
последовательной обработки каждой строки, а условие WH I LE @ @
FETCH S TATUS
_ О обеспечивает завершение обработки (выход из
=
цикла) после того, как все строки будут извлечены. С ам код обработ
ки здесь тоже не показан. В реальном примере нужно заменить
собственным кодом.
Резю ме 221
Резюм е
На этом уроке вы узнали, что такое курсоры и как их применять.
В вашей СУБД, возможно, поддерживается несколько иной синтак
сис, а также доступны параметры, не упомянутые в книге. За допол
нительной информацией обратитесь к документации своей СУБД.
УРОК 22
Ра с w и рен н ые
возмо ж но ст и SQL
Оrраничения
П равила, регламенти рующие ввод и обработку и нформаци и в
базе дан н ых.
Первичн ы е кл ючи
О первичных ключах говорилось на уроке 1 . Первичный ключ -
это особое ограничение, применяемое для того, чтобы значения
в столбце (или наборе столбцов) были уникальными и никогда не
изменялись. Другими словами, это столбец (или столбцы) таблицы,
значения которого однозначно идентифицируют каждую строку та
блицы. Это облегчает обработку отдельных строк и доступ к ним.
Без первичных ключей было бы очень трудно обновлять или удалять
определенные строки, не затрагивая при этом другие.
Любой столбец таблицы может быть назначен на роль первично
го ключа, но только если он удовлетворяет следующим условиям.
Ввод •
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
В не ш ние кл ючи
Внешний ключ - это столбец одной таблицы, значения которого
совпадают со значениями столбца, являющегося первичным ключом
другой таблицы. Внешние ключи - очень важная часть механизма
обеспечения ссьшочной целостности. Чтобы разобраться в том, что
собой представляют внешние ключи, рассмотрим следующий пример.
Таблица 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
Анаnиз У
В этом определении таблицы используется ключевое слово REF
ERENCES, указывающее на то, что любое значение в столбце cus t_id
должно также находиться в столбце cus t id таблицы Customer s .
_
Ввод� У
ALTER ТАВLЕ Orders
A D D CONSTRAINT
FORE I GN КЕУ ( cust_i d ) RE FERENCES Customer s ( cust_ i d )
Анаnиэ т
После применения этого ограничения каждая добавляемая (или
обновляемая) строка будет проверяться на предмет того, чтобы коли
чество товаров бьmо больше нуля.
Дабы проконтролировать тот факт, что в столбце с обозначением
пола может содержаться только буква М или F, добавьте следующую
строку в инструкцию ALTER ТАВLЕ.
Ввод� т
ADD CONSTRAINT СНЕСК ( gende r L I КE 1 [ MF ] 1 )
Ч то такое и ндекс ы
Индексы предназначены для логической сортировки хранимых
данных, что позволяет повысить скорость поиска и сортировки строк
в запросах. Лучший способ понять, что такое индекс, - взглянуть на
предметный указатель в конце книги.
Предположим, вы хотите найти вхождения слова индекс в кни
ге. "Лобовым" способом решения этой задачи бьmо бы вернуться на
первую страницу и просмотреть каждую строку каждой страницы в
поисках совпадений. Такой вариант, конечно, допустим, но очевидно,
Ч то та кое и ндексы 231
Ввод� т
CREATE I NDEX prod_name _i n d
O N Products (prod_name ) ;
Ана.n и з т
Каждый индекс должен обладать уникальным именем. В данном
случае оно определено как prod_name _i nd. Ключевое слово ON
служит для указания таблицы, которая должна быть проиндексиро
вана, а столбцы, включаемые в индекс (в данном примере он один),
указываются в круглых скобках после имени таблицы.
Ч то такое три ггеры 233
СО В Е Т: пересмотр индексов
Эффективн ость и н дексов сн ижается , есл и в табл и цу доба вл я ют
ся да н н ые ил и п роисходит их обновление. М ногие адм и н и стра
торы баз да н н ых сч итают та к: то, что когда-то было идеал ь н ы м
набором и ндексо в, м ожет перестать б ыть та ко в ы м п осле не
скол ьких месяцев работы с базой да н н ых. Цел есообразно ре
гул я р н о пересматри в ать и ндексы и , в случае н еобход и м ости ,
настраи вать их.
Ре з ю ме
На этом уроке вы узнали, как применять некоторые расширенные
средства SQL. Ограничения - важная часть системы обеспечения
ссылочной целостности; индексы помогут улучшить производитель
ность запросов, связанных с извлечением данных; триггеры можно
использовать для обработки данных перед началом или сразу после
завершения определенных операций, а параметры системы безопас
ности можно применять для управления доступом к данным. Навер
няка ваша СУБД в той или иной форме обеспечивает указанные воз
можности. Обратитесь к ее документации, чтобы подробнее узнать
об этом.
ПРИЛОЖЕНИЕ А
Сце н а р и и
д ем о н стра цио н н ых
табn и ц
Д емонстрационн ы е табn и ц ы
Таблицы, используемые на протяжении всей книги, являются ча
стью системы регистрации заказов воображаемого дистрибьютора
игрушек. Эти таблицы служат для решения нескольких з!lдач:
П Р И М ЕЧ А Н И Е : уnрощенные nримеры
Табл и ц ы , испол ьзуе м ы е в кн и ге, н ел ьзя назвать п ол н ы м и . Ре
ал ьная систем а регистра ц и и за казов хра нила б ы м ножество
других да н н ых, не в ключе н н ых в п р едста влен н ы е табл и цы (на
п р и м ер, платежные рекв и з иты , ном ера и н войсов, контрол ь н ы е
номера п оставок и м н огое другое). В т о ж е время с помощью
этих табл и ц будет н а глядно показано, ка к структури руются базы
да н н ых и ка кие отн о ш е н и я м ежду табл и ца м и существуют на
п ра ктике. Вы см ожете п р и м е н ить получ е н н ы е знания по отн о
шен и ю к своим собствен н ы м база м да н н ых.
Описа н ия та бл иц
Далее будут рассмотрены все пять демонстрационных таблиц с
указанием имен столбцов каждой таблицы и их описаниями.
Таблиц а Vendors
В таблице Vendors (табл. А. 1 ) хранятся данные о поставщиках,
товары которых продаются. Для каждого поставщика в этой таблице
имеется отдельная запись, а столбец с идентификаторами поставщи
ков (vend_id) используется для указания соответствия между това
рами и поставщиками.
Столбец Описание
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 Стра на поста в щ и ка
Та бли ц а Products
Таблица P r o du c t s (табл . А .2) содержит каталог товаров, по
одному товару в строке. Каждый товар имеет уникальный идентифи
катор (столбец prod_i d) и связан с соответствующим поставщиком
через столбец vend_ id (уникальный идентификатор поставщика) .
Столбец Описание
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 О п и са н и е товара
Та бли ц а Customers
В таблице Custome rs (табл. А.3) хранится информация обо всех
клиентах. Каждый из них имеет уникальный идентификатор (стол
бец c u s t_i d) .
Столбец Описание
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 ПРИЛОЖЕНИЕ А. Сценари и демон стра цион н ых табл и ц
Окончание табл. А . З
Столбец Описание
Табл и ц а Orders
В таблице Orde r s (табл. А.4) хранится информация о заказах
клиентов (без подробностей). Каждый заказ имеет уникальный но
мер (столбец o rde r num). Заказы связаны с соответствующими
_
клиентами через столбец c u s t id (который связан с уникальным
_
идентификатором клиента в таблице Cus tomers).
Столбец Описание
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 )
Столбец Описание
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 Цена за еди н и цу товара
П ол учение де монстрационн ы х
та бл иц
Чтобы попрактиковаться в выполнении представленных в книге
примеров, вам понадобится набор заполненных таблиц. Все необхо
димое можно найти на сайте книги по следующим адресам :
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
� IВM DB2;
� Microsoft SQL Server (включая Microsoft SQL Server Express);
,
� MariaDB
� MySQL;
� Oracle (включая Oracle Express);
� PostgreSQL.
Adobe ColdFusion
Adobe ColdFusion представляет собой платформу для разработки
веб-приложений. В ColdFusion для создания сценариев применяется
язык, основанный на дескрипторах (тегах). Чтобы протестировать
SQL-кoд, создайте простую страницу, которую можно будет отобра
зить, открыв ее в браузере. Для этого выполните следующие дей
ствия.
I BM DB2
D B 2 компании I B M - это мощная высокопроизводительная
кроссплатформенная СУБД. Она поставляется с целым набором
клиентских инструментов, которые могут быть использованы
для выполнения SQL-запросов. Приведенные ниже инструкции
MariaDB 247
MariaDB
В MariaDB нет собственной клиентской утилиты, поэтому при
меняются клиенты MySQL (обе СУБД полностью совместимы). Об
ратитесь к разделу, посвященному MySQL.
M icrosoft Access
Microsoft Access обычно используется интерактивно для создания
баз данных и управления таблицами. В программе имеется конструк
тор запросов, который можно применять для интерактивного постро
ения инструкций SQL. Но многие не учитывают, что конструктор
запросов позволяет также вводить SQL-кoд напрямую. В ыполните
следующие действия.
M icrosoft ASP
Microsoft ASP - это платформа разработки сценариев, ориенти
рованная на создание веб-приложений. Для того чтобы протестиро
вать инструкции SQL на странице ASP, необходимо создать страни
цу, которую можно будет отобразить на экране, открыв ее в браузере.
Выполните следующие действия.
M icrosoft ASP. N ET
Microsoft ASP.NET - это платформа разработки сценариев для
создания веб-приложений с использованием технологий .NET. Что
бы протестировать инструкции SQL на странице ASP.NET, создайте
страницу, которую можно будет отобразить на экране, открыв ее в
браузере. Это можно сделать разными способами, ниже описан один
из них.
M icrosoft Query
Microsoft Query - это отдельная утилита создания SQL-запросов,
которая является удобным средством тестирования инструкций SQL
с использованием источников данных ODBC. Microsoft Query боль
ше не поставляется в составе Windows, но может опционально уста
навливаться вместе с другими продуктами Microsoft, а также с при
ложениями сторонних разработчиков.
250 ПРИ110ЖЕНИЕ 5. Работа с популярн ы м и п рогра м ма м и
MySQL
С MySQL можно работать двумя способами. СУБД поставляется
вместе с утилитой командной строки, называемой mysql. Это сугубо
текстовое средство создания запросов, которое может применяться
для выполнения любых инструкций SQL. Кроме того, разработчики
выпустили интерактивную утилиту MySQL Workbench. Ее обычно
приходится загружать и устанавливать отдельно, поэтому она может
иметься не во всех инсталляциях СУБД. В то же время настоятельно
рекомендуется работать с ней при изучении MySQL.
Чтобы воспользоваться утилитой mysql, выполните следующие
действия.
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
Oracle Express
Oracle Express - это мощная, но в то же время довольно про
стая в применении СУБД с очень удобным веб-интерфейсом. После
инсталляции СУБД в вашем распоряжении окажется ссылка Getting
Started для запуска административной веб-страницы, на которой
можно вводить инструкции SQL. Выполните следующие действия.
РНР
РНР - это популярный язык написания веб-сценариев. РНР
предлагает функции и библиотеки, предназначенвые для подключе
ния к различным базам данных, поэтому код, используемый для вы
полнения инструкций SQL, может меняться в зависимости от СУБД
(и способа доступа к ней). А раз так, то невозможно предложить
пошаrовые инструкции, которые годились бы для любой ситуации.
Ниже приведен типичный пример для MySQL. Обратитесь к доку
ментации РНР за инструкциями по подключению к своей СУБД.
1.
Создайте новую РНР-страницу (с помощью одного из расши
рений РНР).
2. Подключитесь к своей базе данных с помощью соответствую
щей функции. Для MySQL функция называется mysql con _
nect ( ) .
3. Передайте свой SQL-зaпpoc соответствующей функции об
работки запросов. Для MySQL такая функция называется
mysql query ( )
_ .
PostgreSQL
С PostgreSQL можно работать двумя способами. СУБД постав
ляется с утилитой командной строки, которая называется psql. Это
сугубо текстовое средство создания запросов, которое может слу
жить для выполнения любых инструкций SQL. Кроме того, имеется
интерактивная утилита pgAdmin, которая предназначена в основном
для административных целей, но может также применяться и для те
стирования инструкций SQL.
Чтобы воспользоваться утилитой p s q l , выполните следующие
действия.
SQLite
SQLite предназначена для встраивания в другие приложения
и обычно не используется как автономная база данных. Однако в
состав библиотеки входит утилита командной строки, с помощью
которой можно выполнять SQL-запросы к базе данных SQLite.
256 П РИ /I ОЖIЕ НИ Е &. Р а б ота с п оп улярн ы м и про гра м ма м и
вообще отсутствовать.)
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 .
Конф и rу ри рование
источни ков А8 Н Н ЫХ ODBC
Несколько приложений из числа вышеописанных используют для
интеграции с базами данных протокол ODBC, поэтому необходимо
дать краткий обзор ODBC, а также инструкции по конфигурирова
нию источников данных ODBC.
ODBC это стандарт, позволяющий клиентским приложениям
-
·
общий язык для взаимодействия с этими базами данных (в случае
необходимости выполняя нужные преобразования). Язык, используе
мый в ODBC, - ЭТО SQL.
Клиентские приложения ODBC не взаимодействуют с базами
данных напрямую. Вместо этого они обращаются к источникам дан
ных ODBC. Источник данных представляет собой логическую базу
данных, которая включает в свой состав драйвер (база данных каж
дого типа имеет свой собственный драйвер) и информацию о том,
как нужно подключаться к этой базе данных (пути к файлам, имена
серверов и т.п.).
После того как источники данных ODBC определены, с ними
может работать любое ОDВС-совместимое приложение. Источники
данных не специфичны для приложений, но специфичны для систем.
Си нта к с и с
и н стру к ци й SQL
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 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 [ ТО точка_ сохранения] ;
Ввод т
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
Ч и сл о в ые тип ы дан н ых
Числовые типы данных предназначены для хранения чисел.
В большинстве СУБД поддерживаются различные числовые типы
данных, каждый из которых рассчитан на хранение чисел определен
ного диапазона. Очевидно, что чем шире поддерживаемый диапазон,
тем больше нужно места для хранения числа. Кроме тоm, некоторые
числовые типы данных поддерживают использование десятичных
чисел (и дробей), а другие - только целые числа. В табл. Г.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
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
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 П редметн ы й у казател ь
п Столбец, 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