SQL Without Assistance
SQL Without Assistance
Освой
самостоятельно
уро
SAMS
T e a c h
Y o u r s e l f
Ben Forta
THIRD EDITION
Бен Форта
уро
3-е издание
Форта, Бен.
Ф80 Освой самостоятельно SQL. 10 минут на урок, 3-е издание. :
Пер. с англ. — М. : Издательский дом "Вильяме", 2005. —
288 с. : ил. — Парал. тит. англ.
ISBN 5-8459-0827-2 (рус.)
Данная книга поможет вам в кратчайшие сроки освоить
SQL — самый популярный язык баз данных. Начиная с простых
запросов на выборку данных, автор урок за уроком рассматрива-
ет все более сложные темы, такие как использование операций
объединения, подзапросы, хранимые процедуры, индексы, триг-
геры и ограничения. На изучение материала каждого урока вам
потребуется не более 10 минут. Благодаря этой книге вы быстро
научитесь самостоятельно составлять запросы к базам данных на
языке SQL без чьей-либо помощи.
Примеры, приведенные в книге, будут работать во всех наи-
более популярных СУБД — IBM DB2, Microsoft Access, Microsoft
SQL Server, MySQL, Oracle, PostgreSQL и Sybase Adaptive Server.
ББК 32.973.26-018.2.75
Все названия программных продуктов являются зарегистрированными торго-
выми марками соответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроиз-
ведена в какой бы то ни было форме и какими бы то ни было средствами, будь то
электронные или механические, включая фотокопирование и запись на магнитный
носитель, если на это нет письменного разрешения издательства Sams Publishing.
Authorized translation from the English language edition published by Sams
Publishing Copyright © 2004
All rights reserved. No part of this book may be reproduced or transmitted in
any form or by any means, electronic or mechanical, including photocopying,
recording or by any information storage retrieval system, without permission from
the Publisher.
Russian language edition is published by Williams Publishing House according
to the Agreement with R&I Enterprises International, Copyright © 2005
Условные обозначения
В этой книге используются различные шрифты — во-
первых, для того чтобы можно было отличить код от обыч-
ного текста, во-вторых, чтобы вы не пропустили важные
понятия.
Текст, который вы вводите, и текст, который должен поя-
виться на экране, представлены моноширинным шрифтом.
Он выглядит так, как на вашем экране.
Переменные и выражения-аргументы приведены
моноширинным курсивным шрифтом. Переменный аргумент
необходимо заменять определенным значением, которое он
представляет.
Такая стрелка (*Ь) в начале строки кода означает, что
эта строка слишком длинная и не поместилась в одну стро-
ку книги. Продолжайте вводить все символы после символа
^> так, как если бы они были частью предыдущей строки.
Введение 17
ВВОД
Пиктограммой "Ввод" обозначен код, который вы може-
те ввести самостоятельно.
ВЫВОД
Пиктограмма "Вывод" указывает на информацию, кото-
рая выдается после запуска программы.
Анализ
Пиктограмма "Анализ" указывает на то, что далее сле-
дует пошаговый комментарий к коду.
Урок 1
Основные понятия
Ниже приведены очень краткие определения основ-
ных понятий баз данных. Они предназначены либо
для того, чтобы напомнить вам о том, что вы уже зна-
ли, либо чтобы дать вам основные представления,
если вы новичок в базах данных. Понимание баз дан-
ных является очень важной частью при изучении SQL,
поэтому рекомендую найти хорошую книгу по осно-
вам баз данных и постоянно пополнять свои знания в
данном предмете.
База данных
Контейнер (обычно файл или труппа файлов) для хра-
нения упорядоченных данных.
Таблицы
Когда вы храните информацию в шкафу для докумен-
тов, вы стараетесь не перемешивать их. Напротив, все до-
кументы хранятся в соответствующих папках.
В мире баз данных такая папка называется таблицей.
Таблица — это структурированный файл, в котором могут
храниться данные определенного типа. В таблице может
находиться список клиентов, каталог продукции и любая
другая информация.
шг
, Таблица
• • • • • • " ' • - ' ' " " • • • . • • •
Распределение данных
Очень важно правильно распределить данные по не-
скольким столбцам. Например, название города, об-
ласти (штата) и почтовый индекс (для США это ZIP-
код) всегда должны быть в отдельных столбцах. Это
позволяет отсортировать или отфильтровать данные
по определенным столбцам (например, чтобы найти
всех клиентов из определенной области или города).
Если названия города и области хранятся в одном
столбце, будет очень сложно отсортировать или от-
фильтровать данные по области.
Тип данных
Тип разрешенных для хранения данных. Каждому
столбцу базы данных присваивается тип данных, ко-
торый запрещает (или разрешает) хранить в нем оп-
ределенную информацию.
Строки
Данные в таблице хранятся в строках; каждая запись
хранится в своей строке. Возвращаясь к сравнению с сет-
кой, можно сказать, что ее вертикальные столбцы являют-
ся столбцами таблицы, а горизонтальные строки — строка-
ми таблицы.
24 Урок 1
Первичные ключи
В каждой строке таблицы должно быть несколько
столбцов, которые уникальным образом идентифицируют
ее. В таблице с клиентами для этого может использоваться
столбец с номером клиента, тогда как в таблице, содержа-
щей заказы, таким столбцом может быть идентификатор
заказа. В таблице со списком служащих может использо-
ваться номер служащего или столбец с номерами карточек
социального страхования.
Первичный ключ
Столбец (или набор столбцов), значения которого
уникально идентифицируют каждую строку таблицы.
Расширения SQL
Многие разработчики СУБД расширили возможности
SQL, введя в язык дополнительные операторы или
инструкции. Эти расширения необходимы для выпол-
нения дополнительных функций или для упрощения
выполнения определенных операций. И хотя часто
они очень полезны, эти расширения привязаны к оп-
ределенной СУБД и редко поддерживаются более
чем одним разработчиком.
Стандартный SQL поддерживается комитетом стан-
дартов ANSI, и соответственно называется ANSI SQL.
Все крупные СУБД и даже те, у которых есть собст-
венные расширения, поддерживают ANSI SQL. От-
дельные же реализации носят собственные имена
(PL-SQL, Transact-SQL и т.д.).
Чаще всего в этой книге упоминается именно ANSI
SQL. В редких случаях, когда используется SQL, отно-
сящийся к определенной СУБД, об этом говорится
отдельно,
Что такое SQL 27
Попробуйте сами
Подобно изучению любого другого языка, чтобы изучить
SQL, лучше всего попробовать его использовать на практи-
ке. Для этого вам понадобится база данных и приложение,
из которого можно выполнять SQL-запросы.
Во всех уроках этой книги используются настоящие SQL-
операторы и настоящие таблицы базы данных. В приложе-
нии А, "Сценарии демонстрационных таблиц", описываются
примеры таблиц и приводятся советы по их получению (или
созданию), чтобы можно было выполнять инструкции каж-
дого урока. В приложении Б, "Работа с популярными при-
ложениями", описываются действия, необходимые для за-
пуска SQL в различных приложениях. Перед тем как перей-
ти к следующему уроку, прочитайте эти два приложения,
чтобы подготовиться к дальнейшим действиям.
Резюме
Из первого урока вы узнали, что такое SQL и чем он по-
лезен. В связи с тем что SQL используется для взаимодей-
ствия с базами данных, мы также рассмотрели некоторые
основные термины баз данных.
Урок 2
Выборка данных
На этом уроке вы узнаете, как использовать оператор
SELECT для выборки одного или нескольких столбцов дан-
ных из таблицы.
Оператор SELECT
Как уже говорилось в уроке 1, "Что такое SQL", SQL-
операторы являются обычными английскими терминами. Эти
термины называются ключевыми словами, и каждый SQL-
оператор состоит из одного или нескольких ключевых слов.
Наиболее часто вы будете использовать оператор SELECT. Он
предназначен для выборки информации из таблиц.
Ключевое слово
Зарезервированное слово, являющееся частью языка
SQL. Никогда не называйте таблицу или столбец та-
ким словом. В приложении Д "Зарезервированные
слова SQL" перечислены некоторые из наиболее час-
то используемых ключевых слов.
Рассматриваемые примеры
В примерах SQL-операторов (а также полученных с их
помощью результатов) в этой книге используются
файлы данных, описанные в приложении А, "Сцена-
рии демонстрационных таблиц". Если вы хотите са-
мостоятельно выполнить действия, указанные в при-
мерах (очень рекомендуем это делать), обратитесь к
30 Урок 2
ВВОД
SELECT prod_name
FROM Products;
Анализ
В приведенном выше операторе используется оператор
SELECT для выборки одного столбца под названием
prod_name из таблицы Products. Искомое имя столбца
указывается сразу после ключевого слова SELECT, а ключе-
вое слово FROM указывает на имя таблицы, из которой вы-
бираются данные. Результат выполнения этого оператора
будет следующий:
ВЫВОД
prod_name
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll
Выборка данных 31
Неотсортированные данные
Если вы попробовали выполнить этот запрос само-
стоятельно, то заметили, что данные были отображе-
ны в ином порядке. В этом случае не нужно волно-
ваться — так и должно быть. Если результаты запроса
не отсортированы явным образом (это мы обсудим в
следующем уроке), то данные будут возвращены без
особого порядка. Это может быть порядок, в котором
данные были занесены в таблицу, или какой-либо
другой порядок. Главное, чтобы ваш запрос возвра-
щал одно и то же число строк.
Завершение операторов
Несколько SQL-операторов должны быть разделены
точкой с запятой (символом ,-). В большинстве СУБД
не требуется вставлять точку с запятой после единст-
венного оператора, но если в вашем конкретном слу-
чае СУБД выдает ошибку, вам придется это делать.
Несомненно, при желании можно всегда добавлять
точку с запятой, она никому не будет мешать, даже
если этот символ не обязателен. Исключением явля-
ется СУБД Sybase Adaptive Server, которая "не любит"
SQL-операторы, заканчивающиеся символом ;.
32 Урок 2
SQL-операторы и регистр
Важно отметить, что SQL-операторы нечувствитель-
ны к регистру, поэтому операторы SELECT, s e l e c t и
S e l e c t эквивалентны. Многие SQL-разработчики ис-
пользуют верхний регистр для всех ключевых слов
SQL и нижний регистр для имен столбцов и таблиц,
чтобы код легче читался. Однако будьте внимательны:
SQL-операторы не зависят от регистра, в отличие от
имен таблиц, столбцов и значений (которые зависят
от СУБД и ее конфигурации).
Анализ
Как и в предыдущем примере, в этом операторе для вы-
борки данных из таблицы Products используется оператор
SELECT. В этом примере перечислены три имени столбца,
разделенные запятыми. Результат обработки этого операто-
ра показан ниже:
Выборка данных 33
вывод
prod id
1 prod_name prod_price
Представление данных
Как видно из предыдущего результата, SQL-опера-
торы обычно возвращают "сырые", неотформатиро-
ванные данные. Форматирование данных является
проблемой представления, а не выборки. Поэтому
представление (например, отображение приведен-
ных выше цен в виде определенной суммы с правиль-
но расставленными десятичными запятыми) обычно
зависит от приложения, посредством которого ото-
бражаются данные. Просто выбранные данные (без
форматирования) используются редко.
Анализ
При указании группового символа (*) возвращаются все
столбцы. Столбцы обычно (но не всегда) возвращаются в
том порядке, в котором они находились при создании таб-
лицы. Однако SQL-данные редко выводятся в том виде, в
каком они хранятся в базе данных. (Обычно они возвраща-
ются в приложение, которое необходимым образом их фор-
матирует.)
Резюме
В этом уроке мы рассмотрели порядок использования
SQL-оператора SELECT для выборки одного, нескольких и
всех столбцов таблицы. Далее мы научимся сортировать
данные, полученные в результате выборки.
УрокЗ
Сортировка выбранных
данных
На этом уроке вы узнаете, как использовать предложение
ORDER BY оператора SELECT для сортировки полученных в
результате выборки данных.
Сортировка данных
Из последнего урока вы узнали, что следующий SQL-
оператор возвращает один столбец из таблицы базы дан-
ных. Но взгляните на результат: данные выводятся в пол-
ном беспорядке.
ВВОД
SELECT prod_name
FROM Products;
вывод
prod_name
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll
Вообще-то выбранные данные отображаются не в полном
беспорядке. При отсутствии сортировки данные обычно вы-
водятся в том порядке, в котором они находятся в таблице.
Это может быть порядок, в котором они изначально добав-
36 Урок 3
Предложение
SQL-операторы завершаются предложениями, одни
из которых обязательны, другие — нет. Предложение
обычно состоит из ключевого слова и предоставляе-
мых данных. Примером может служить предложение
FROM оператора S E L E C T , которое мы использовали в
предыдущем уроке.
Анализ
Это выражение идентично предыдущему, за исключени-
ем предложения ORDER BY, которое указывает системе
управления базой данных отсортировать данные в алфавит-
ном порядке по столбцу prod_name. Результат применения
этого выражения будет следующим:
ВЫВОД
prod_name
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
Bird bean bag toy
Сортировка выбранных данных 37
Сортировка по нескольким
столбцам
Часто бывает необходимо отсортировать данные по не-
скольким столбцам. Например, если вы выводите список
служащих, вам может понадобиться отсортировать его по
имени и фамилии сотрудника (сначала по фамилии, а затем
с каждой фамилией по имени). Это может быть полезным,
если в компании есть несколько служащих с одинаковыми
фамилиями.
Чтобы осуществить сортировку по нескольким столбцам,
просто укажите их имена через запятую (так, как вы дела-
ли при простом перечислении столбцов).
В следующем коде выбираются три столбца, а результат
сортируется по двум из них — сначала по цене, а потом по
названию.
ВВОД
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
38 Урок 3
ВЫВОД Щ
prod_id prod_price prod_name
Сортировка по положению
столбца
Порядок сортировки можно указать не только по име-
нам столбцов, но и по относительному положению столбца
(проще говоря — по номеру столбца). Чтобы лучше понять
это, рассмотрим пример:
ВВОД
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
ВЫВОД
prod_id prod_price prod_name
| Анализ
Как видите, результат выполнения запроса идентичен
предыдущему примеру. Разница только в предложении
ORDER BY. Здесь мы не указывали имена столбцов, вместо
этого было оговорено их относительное положение в ука-
занном списке SELECT. Предложение ORDER BY 2 означает
сортировку по второму столбцу списка SELECT, а именно по
столбцу prod_price. Предложение ORDER BY 2, 3 означа-
ет сортировку по столбцу prod_price, а затем по столбцу
prod_name.
Основное преимущество данного метода заключается в
том, что не нужно несколько раз набирать в запросе имена
столбцов. Однако имеются и недостатки. Во-первых, некон-
кретное перечисление столбцов повышает вероятность того,
что вы случайно укажете не тот столбец. Во-вторых, можно
случайно сменить порядок данных при изменении списка
SELECT (при этом забыв внести соответствующие изменения
в предложение ORDER BY). И наконец, очевидно, нельзя ис-
пользовать этот метод для сортировки по столбцам, не ука-
занным в списке SELECT.
Сортировка по невыбранным столбцам
Очевидно, что этот метод нельзя использовать при
сортировке по столбцам, не указанным в списке
SELECT. Однако при необходимости можно в одном
операторе указывать реальные имена столбцов и их
относительные положения.
Указание направления
сортировки
Сортировка данных не ограничена порядком по возрас-
танию (от А до Я). Несмотря на то что этот порядок явля-
ется порядком по умолчанию, в предложении ORDER BY
также можно использовать порядок по убыванию (от Я до
А). Для этого необходимо указать ключевое слово DESC.
40 Урок 3
ВЫВОД
prod_id prod_price prod_name
BR03 11.9900 18 i n c h t e d d y b e a r
RYL01 9.4900 King d o l l
RYL02 9.4900 Queen d o l l
BR02 8.9900 12 i n c h t e d d y b e a r
BR01 5.9900 8 inch teddy bear
RGAN01 4.9900 Raggedy Ann
BNBG01 3.4900 F i s h bean bag t o y
BNBG02 3.4900 B i r d bean bag t o y
BNBG03 3.4900 R a b b i t bean bag t o y
ВЫВОД
prod_xd prod_price prod_name
BR03 11.9900 18 inch teddy bear
RYL01 9.4900 King doll
RYL02 9.4900 Queen doll
BR02 8.9900 12 inch teddy bear
BR01 5.9900 8 inch teddy bear
RGAN01 4.9900 Raggedy Ann
BNBG02 3.4900 Bird bean bag toy
BNBG01 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
Сортировка выбранных данных 41
Анализ
Ключевое слово DESC применяется только к тому столбцу,
после которого оно указано. В предыдущем примере ключе-
вое слово DESC было указано для столбца prodjprice, но не
для prod_name. Таким образом, столбец prod_price отсор-
тирован в порядке убывания, а столбец prod_name в обыч-
ном, возрастающем порядке.
Резюме
Этот урок был посвящен сортировке выбранных данных
при помощи предложения ORDER BY оператора SELECT. Это
предложение, которое должно быть последним в операторе
SELECT, можно использовать для сортировки данных по од-
ному или нескольким столбцам.
Урок 4
Фильтрация данных
На этом уроке вы узнаете, как использовать предложение
WHERE оператора SELECT для указания предложений поиска.
Использование предложения
WHERE
В таблицах баз данных обычно содержится очень много
информации и довольно редко возникает необходимость
выбирать все строки таблицы. Гораздо чаще бывает нужно
извлечь какую-то часть данных таблицы для каких-либо
действий или отчетов. Выборка только необходимых дан-
ных включает в себя критерий поиска, также известный
под названием предложение фильтрации.
В операторе SELECT данные фильтруются путем указа-
ния критерия поиска в предложении WHERE. Предложение
WHERE указывается сразу после названия таблицы (предло-
жения FROM) следующим образом:
ВВОД
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
Анализ
Этот оператор извлекает два столбца из таблицы това-
ров, но показывает не все строки, а только те, значение в
столбце prod_price которых равно 3.49:
ВЫВОД
prod_name prod_j?rice
Требовательная PostgreSQL
СУБД PostgreSQL имеет строгие правила, управляю-
щие значениями, передающимися в SQL-операторы,
особенно это касается чисел с десятичными дробя-
ми. Таким образом, предыдущий пример может и не
работать в PostgreSQL. Чтобы он заработал, необхо-
димо точно указать, что 3 . 4 9 — это "правильное"
число, включив в предложение WHERE его ТИП. Д Л Я
этого замените ~ з . 4 9 н а = d e c i m a l ' 3 . 4 9 ' .
П о л о ж е н и е п р е д л о ж е н и я WHERE
Операции в предложении
WHERE
В первом предложении WHERE, которое мы рассмотрели,
проводилась проверка на равенство, т.е. определялось, со-
держится ли в столбце указанное значение. SQL поддержи-
вает весь спектр условных (логических) операций, которые
приведены в табл. 4.1.
Т а б л и ц а 4 . 1 . О п е р а ц и и в п р е д л о ж е н и и WHERE
Операция Описание
= Равенство
о Неравенство
!= Неравенство
< Меньше
<= Меньше или равно
!< Не меньше
> Больше
>= Больше или равно
!> Не больше
BETWEEN Между двумя указанными значениями
I S NULL Значение NULL
Совместимость операций
Некоторые из операций, приведенных в табл. 4.1, по-
вторяются (например, <> — это то же самое, что и ! =).
Выполнение операции ! < (не меньше Чём) дает такой
46 Урок 4
ВЫВОД
prod name prod__price
Проверка на несовпадения
В этом примере выводятся товары, не изготовленные
фирмой DLL01.
Фильтрация данных 47
ВВОД
SELECT vend_id, p r o d _ p r i c e
FROM Products
1
WHERE vend i d о 'DLL01 ;
ВЫВОД
vend_id prod_name
ВЫВОД
prod_name prod_price
Анализ
Как видно из этого примера, при использовании опера-
ции BETWEEN нужно указывать два значения — меньшее и
большее из выбранного диапазона. Эти два значения долж-
ны быть разделены ключевым словом AND. При этом выби-
раются все значения из диапазона, включая указанные на-
чальное и конечное значения.
NULL
ВЫВОД
vend id
FNG1
JTS01
Резюме
В этом уроке рассказывалось о том, как отфильтровы-
вать возвращаемые данные при помощи предложения
WHERE оператора SELECT. Теперь вы знаете, как можно про-
верить данные на равенство, неравенство, наличие значений
больше чем и меньше чем, диапазон значений, а также на
значение NULL.
Урок 5
Расширенная
фильтрация данных
В этом уроке вы узнаете, как можно комбинировать пред-
ложения WHERE для создания мощных и сложных условий
поиска. Вы также узнаете, как следует использовать клю-
чевые слова NOT и IN.
Комбинирование предложений
WHERE
Все предложения WHERE, представленные в уроке 4,
"Фильтрация данных", отфильтровывают данные с исполь-
зованием одного критерия. Чтобы увеличить уровень кон-
троля над фильтром в SQL, можно использовать несколько
предложений WHERE. Эти предложения допустимо использо-
вать двумя способами: в виде предложений AND или OR.
Оператор
Специальное ключевое слово, используемое для
Объединения или изменения предложений внутри
предложения WHERE. Также известны под названием
логические операторы1.
1
Термин statement в русскоязычной литературе по языку SQL
принято переводить как оператор (и мы следовали этой традиции во
всех предыдущих уроках), хотя точнее его следовало бы переводить
как инструкция. В данном случае речь идет именно об операторах
(operator). — Прим. ред.
52 Урок 5
Анализ
Посредством данного оператора извлекается название
продукции и цена для всех товаров, изготовленных произ-
водителем DLL01, с ценой $4 и меньше. Предложение
WHERE в операторе SELECT состоит из двух предложений, а
ключевое слово AND используется для их объединения.
Ключевое слово AND указывает системе управления базой
данных возвращать только те строки, которые удовлетво-
ряют всем перечисленным предложениям. Если продукт
изготовлен производителем DLL01, но стоит больше $4, он
не попадет в результаты. Аналогично, товары, которые
стоят меньше $4 и изготовлены отличными от указанного
производителями, также не будут выведены. Данные,
выданные в результате выполнения этой SQL-инструкции,
будут выглядеть так:
ВЫВОД
Prod id
Iprod_price prod_name
AND
Анализ
Посредством этого SQL-оператора выбираются названия
товаров и их цены для всех продуктов, изготовленных од-
ним из указанных производителей. Ключевое слово OR ука-
зывает СУБД использовать какое-то одно предложение, а не
сразу два. Если бы здесь использовалось ключевое слово
AND, мы бы не получили никаких данных. После выполне-
ния этого SQL-запроса мы получим следующие данные:
ВЫВОД ^ ^ ^ В
prod name prod_price
OR
Порядок обработки
Предложения WHERE могут содержать любое количество
логических операторов AND и OR. Комбинируя их, можно
создавать сложные фильтры.
Однако при комбинировании ключевых слов AND и OR
возникает одна проблема. Рассмотрим следующий пример.
Необходимо вывести список всех изготовленных производи-
телями DLL01 и BRS01 товаров, цена которых $10 и выше.
В следующей инструкции SELECT используется комбинация
ключевых слов AND и OR для формулирования предложе-
ния WHERE:
ВВОД
SELECT prod_name, prod_j?rice
FROM P r o d u c t s
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01
AND p r o d _ p r i c e >= 10;
ВЫВОД
prod name prod_price
Fish bean bag toy- 3.4900
Bird bean bag toy- 3.4900
Rabbit bean bag toy 3.4900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
Анализ
Взгляните на результат. В четырех возвращенных стро-
ках значатся цены ниже $10 — очевидно, строки не были
отфильтрованы так, как надо. Что же произошло? Причина
в порядке обработки. SQL (как и большинство других язы-
ков) вначале обрабатывает логические операторы AND, а по-
том уже логические операторы OR. Когда SQL "видит" такое
предложение WHERE, он его считывает так: выбрать все
продукты, которые стоят $10 и больше, изготовленные
производителем BRS01, и все продукты, изготовленные
производителем DLL01 независимо от их цены. Другими
словами, так как приоритет у логического оператора AND
выше, были объединены "не те" операторы.
Решение этой проблемы состоит в использовании скобок
для точного группирования необходимых логических one-
Расширенная фильтрация данных 55
ВЫВОД
prod_name prod_price
Анализ
Единственным отличием между предыдущим выражени-
ем и этим являются скобки, в которые заключены первые
два предложения оператора WHERE. Поскольку скобки име-
ют еще больший приоритет, чем логические операторы AND
и OR, СУБД вначале обрабатывает условие OR внутри ско-
бок. Соответственно, SQL-оператор будет пониматься так:
выбрать все продукты, изготовленные либо производите-
лем DLL01, либо производителем BRS01, которые стоят
$10 и больше, а это именно то, что нужно.
Использование с к о б о к в п р е д л о ж е н и я х WHERE
Использование ключевого
слова IN
Ключевое слово IN используется для указания диапазона
условий, любое из которых может быть выполнено. При
этом значения, заключенные в скобки, перечисляются через
запятую. Рассмотрим следующий пример:
ВВОД
SELECT prod_name, prodjprice
FROM Products
WHERE vend_id IN ('DLL011, 'BRS01!
ORDER BY prod_name
ВЫВОД
prod name prod_price
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900
Анализ f ^ T H L 5
Инструкция SELECT осуществляет выборку всех товаров,
изготовленных производителями DLL01 и BRS01. После
ключевого слова IN следует список значений через запятую,
а весь список заключен в скобки.
Если вы подумаете, что ключевое слово IN выполняет ту
же функцию, что и OR, то будете совершенно правы. Сле-
дующий SQL-запрос выполняет ту же функцию, что и пре-
дыдущий:
ВВОД
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01
ORDER BY prod_name;
Расширенная фильтрация данных 57
ВЫВОД
prod_name prod_price
IN
Использование ключевого
слова NOT
Логический оператор NOT предложения WHERE служит
для выполнения только одной функции — отрицать все
58 Урок 5
ВЫВОД
prod_name
Анализ
Здесь логический оператор NOT отрицает предложение,
следующее за ним. Поэтому СУБД извлекает не те значения
vend_id, которые совпадают с DLL01, а все остальные.
Предыдущий запрос можно было также выполнить при
помощи операции <>:
ВВОД
SELECT prod_name
FROM Products
WHERE vend_id о 'DLL01'
ORDER BY prod_name;
Расширенная фильтрация данных 59
ВЫВОД
prod_name
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
Анализ
Зачем же использовать логический оператор NOT? Ко-
нечно, для таких простых предложений WHERE, какие мы
здесь рассматриваем, этот оператор не обязателен. Он поле-
зен в более сложных предложениях. Например, для нахож-
дения всех строк, которые не совпадают со списком крите-
риев, можно использовать логический оператор NOT в паре
с ключевым словом IN.
NOT в MySQL
Форма логического оператора NOT, который здесь
описывается, не поддерживается в СУБД MySQL
В MySQL NOT используется только для отрицания
в х о ж д е н и й E X I S T S (т.е. к а к N O T E X I S T S ) .
Резюме
В этом уроке вы узнали, как нужно комбинировать
предложения WHERE с логическими операторами AND и OR.
Вы также узнали, как следует управлять порядком обра-
ботки и как использовать ключевые слова IN и NOT.
Урок 6
Использование
метасимволов для
фильтрации
В этом уроке вы узнаете, что такое метасимволы, как их
использовать и как выполнять поиск с применением мета-
символов и логического оператора LIKE для фильтрации
выводимых данных.
Использование логического
оператора LIKE
Все предыдущие операторы, которые мы рассмотрели,
производили фильтрацию по известным значениям. Они
искали совпадения по одному или нескольким значениям,
более чем и менее чем известное значение или диапазон
значений. При этом везде искалось известное значение. Од-
нако фильтрация данных таким способом не всегда работа-
ет. Например, как бы вы искали продукты, в названии ко-
торых содержатся слова bean bag? Этого нельзя сделать при
помощи простых операций сравнения, здесь на помощь
приходит поиск с использованием метасимволов. При по-
мощи метасимволов можно создавать условия поиска дан-
ных. В этом примере, для того чтобы найти все продукты, в
названии которых содержатся слова bean bag, необходимо
составить шаблон поиска, позволяющий найти текст bean
bag в любом месте названия продукта.
62 Урок 6
:ji~~?JU: Метасимволы
^^З^ Специальные символы, применяемые для поиска
части значения.
Шаблон поиска
Условие поиска, состоящее из текста, метасимволов
и любой их комбинаций.
Предикат
Когда оператор не является оператором? Тогда,
когда он является предикатом. Технически, L I K E —
это предикат, а не оператор. Конечный результат
остается тем же, просто не пугайтесь этого термина,
если вы встретите его в документации по SQL.
ВВОД
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
ВЫВОД
prod_id prod_narae
Анализ
В этом примере используется шаблон поиска 'Fish%'.
При выполнении этого условия возвращаются все значения,
которые начинаются с символов Fish. Знак % указывает
СУБД принимать все символы после слова Fish независимо
от их количества.
Метасимволы Microsoft Access
Если вы работаете в Microsoft Access, необходимо
использовать символ * вместо символа %.
Зависимость от регистра
Ваша СУБД и ее конфигурация могут влиять на то, что
поиск будет зависеть от регистра. В этом случае по
строке • f ish%' значение F i s h bean bag t o y не бу-
дет найдено.
ВВОД
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE •%bean bag%';
64 Урок 6
ВЫВОД
prod_id prod_name
Анализ 1
Шаблон поиска ' %bean bag%' означает найти все зна-
чения, содержащие bean bag в любом месте названия, не-
зависимо от количества символов перед или после указан-
ного текста.
Метасимвол можно также использовать внутри шаблона
поиска, хотя это редко бывает полезным. В следующем
примере производится поиск всех продуктов, которые на-
чинаются на F и заканчиваются на у:
ВВОД
SELECT prod_name
FROM Products
WHERE prod_name LIKE 'F%yT;
Важно отметить, что помимо поиска одного или не-
скольких символов, знак % также означает и отсутствие
символов в указанном месте шаблона поиска.
ВЫВОД
prod_id prod_name
BNBG02 12 inch teddy bear
BNBG03 18 inch teddy bear
Анализ
В шаблоне поиска этого предложения WHERE использова-
ны два метасимвола, затем следует текст. В результате бы-
ли выбраны только те строки, которые удовлетворяли шаб-
66 Урок 6
ВЫВОД
prod_id prod_name
BNBG01 8 inch teddy bear
BNBG02 12 inch teddy bear
BNBG03 18 inch teddy bear
В отличие от знака %, который подразумевает также от-
сутствие символов, знак _ всегда означает один символ —
не более и не менее.
ВВОД
SELECT prod_id, prod_name
FROM Customers
WHERE cust_contact LIKE •[JM]
ORDER BY cust contact
ВЫВОД
cust_contact
Jim Jones
John Smith
Michelle Green
Анализ
Условие WHERE в этом выражении выглядит как
1
[ JM] %'. В этом шаблоне поиска используются два разных
метасимвола. По метасимволам [JM] производится поиск
всех контактных лиц, имена которых начинаются на одну
из указанных в скобках букв, но при этом учитывается
только один символ. Поэтому все имена длиннее одного
символа не будут извлечены. По метасимволу %, следующе-
му после [ JM], производится поиск любого количества сим-
волов после первой буквы, что и приводит к требуемому ре-
зультату.
Можно использовать метасимвол, выполняющий проти-
воположное действие, добавив перед ним символ Л . Напри-
мер, в следующем примере выбираются все имена, которые
не начинаются с буквы J или М (в отличие от предыдущего
примера):
ВВОД
SELECT prod_id, prod_name
FROM Customers
WHERE cust_contact LIKE ' [AJM] %
ORDER BY cust contact
Внимание!
Метасимвол ( [ ] ) поддерживается не всеми СУБД.
Обратитесь к документации по вашей СУБД, чтобы
определить, поддерживается ли этот метасимвол.
Советы по использованию
метасимволов
Как видите, метасимволы в SQL — это очень мощный
механизм. Но за эту мощь приходится платить: поиск с ис-
пользованием метасимволов требует больше времени на об-
работку, чем любые другие виды поиска, которые мы обсу-
ждали ранее. Ниже приведены несколько советов по ис-
пользованию метасимволов.
• Не злоупотребляйте метасимволами. Если можно ис-
пользовать другой оператор поиска, воспользуйтесь им.
• При использовании метасимволов старайтесь по воз-
можности не вставлять их в начало шаблона поиска.
Шаблоны поиска, начинающиеся с метасимволов, об-
рабатываются медленнее всего.
• Внимательно следите за местоположением метасим-
волов. Если они находятся не на своем месте, будут
извлечены не те данные.
Исходя из всего вышесказанного, можно заключить, что
метасимволы очень важны и очень полезны при поиске —
вы часто будете ими пользоваться.
Резюме
В этом уроке рассказывалось о том, что такое метасим-
волы и как их использовать в условиях WHERE. Теперь вы
знаете, что метасимволы нужно использовать осторожно, не
следует злоупотреблять ими.
Урок 7
Создание вычисляемых
полей
В этом уроке вы узнаете, что такое вычисляемые поля, как
их создавать и как использовать псевдонимы для ссылки на
такие поля из вашего приложения.
Поле
Изначально термин поле означал то же самое, что и
столбец, и в основном эти понятия взаимозаменяе-
мы, хотя столбцы базы данных обычно называют
столбцами, а термин поля обычно используется по
отношению к вычисляемым полям.
Конкатенация полей
Чтобы продемонстрировать работу вычисляемых полей,
рассмотрим простой пример — создание заголовка, состоя-
щего из двух столбцов.
Создание вычисляемых полей 71
Конкатенация
Комбинирование значений (путем присоединения их
друг к другу) для получения одного "длинного" значения.
Оператор + или | |
В СУБД Access, SQL Server и Sybase для конкатенации
используется знак +. В СУБД DB2, Oracle, PostgreSQL
и Sybase используется знак | |. Более подробную ин-
формацию ищите в документации по вашей СУБД.
Вообще-то | | — более предпочтительный оператор
конкатенации, так что он поддерживается все боль-
шим и большим количеством СУБД.
ВЫВОД
Bear Emporium (USA
72 Урок7
Beras R Us (USA )
Doll House Inc. (USA )
Fun and Games (England )
Furball Inc. (USA )
Jouets et ours (France )
Ниже приведена та же инструкция, но с использованием
оператора I I:
ВВОД
SELECT vend_name || • (' || vend_country
FROM Vendors
ORDER BY vend name;
ВЫВОД
Bear Emporium (USA
Beras R Us (USA
Doll House Inc. (USA
Fun and Games (England
Furball Inc. (USA
Jouets et ours (France
Анализ
В предыдущих операторах SELECT была выполнена кон-
катенация следующих элементов:
• имя, хранящееся в столбце vend_name;
• строка, содержащая пробел и открывающую круглую
скобку;
• название штата, хранящееся в столбце vend_country;
• строка, содержащая закрывающую круглую скобку.
Как видно из приведенного выше результата, выражение
SELECT возвращает один столбец (вычисляемое поле), со-
держащий все четыре элемента как одно целое.
Конкатенация в MySQL
В MySQL не поддерживается конкатенация при по-
мощи оператора + или | | .Здесь необходимо исполь-
зовать функцию CONCAT'{), в которой указывается
список элементов, по отношению к которым необхо-
димо выполнить конкатенацию. При использовании
функции CONCAT () первая строка примера выглядела
бы так:
Создание вычисляемых полей 73
ВЫВОД
Bear Emporium (USA)
Beras R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
Ниже приведено это же выражение, но с использованием
оператора I | :
ВВОД
SELECT RTRIM(vend_name) RTRIM(vend_country) ])
FROM V e n d o r s
ORDER BY v e n d name;
ВЫВОД
Bear Emporium (USA)
Beras R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
74 Урок 7
Анализ
Функция RTRIMO отбрасывает все пробелы справа от
указанного значения. При использовании функции RTRIM ()
каждый отдельный столбец обрабатывается корректно. Го-
род, штат указываются через запятую и пробел, а штат и
ZIP-код — через пробел.
Функции TRIM
Использование псевдонимов
Оператор SELECT, который использовался для конкате-
нации полей имени и адреса, как видите, справился со сво-
ей задачей. Но как же называется новый вычисляемый
столбец? По правде говоря — никак, это просто значение.
Этого может быть достаточно, если вы просматриваете ре-
зультаты в программе тестирования SQL-запросов, однако
столбец без названия нельзя использовать в клиентском
приложении, так как клиент не сможет к нему обратиться.
Для решения этой проблемы в SQL была включена под-
держка псевдонимов. Псевдоним — это альтернативное имя
для поля или значения. Псевдонимы присваиваются при
помощи ключевого слова AS. Взгляните на следующий опе-
ратор SELECT:
ВВОД
SELECT RTRIM(vend_name) (' + RTRIM(vend_country) + ')
^AS v e n d _ t i t l e
FROM Vendors
ORDER BY vend name;
ВЫВОД
vend_title
Bear Emporium (USA)
Создание вычисляемых полей 75
Beras R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
Ниже приведена эта же инструкция, но с использовани-
ем оператора | | :
ВВОД
SELECT RTRIM(vend_name) RTRIM(vend_country)
^AS v e n d _ t i t l e
FROM Vendors
ORDER BY vend name;
ВЫВОД
vend title
Bear Emporium (USA)
Beras R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
Анализ
Сам по себе этот оператор SELECT ничем не отличается от
предыдущего, за исключением того, что вычисляемое поле
указывается после текста AS v e n d _ t i t l e . Таким образом,
SQL создает вычисляемое поле, содержащее результат вы-
числений, под названием v e n d _ t i t l e . Как видите, результат
остается тем же, но столбец теперь носит имя v e n d _ t i t l e и
любое клиентское приложение может обращаться к нему по
имени, как если бы это был реальный столбец таблицы.
Другое использование псевдонимов
Псевдонимы можно использовать и по-другому. Час-
то псевдонимы используются для переименования
столбца, если в реальном названии присутствуют не-
допустимые символы (например, пробелы) или если
название сложное и трудночитаемое.
76 Урок 7
Имена псевдонимов
Псевдонимом может служить как одно слово, так и
целая строка. Если используется строка, она должна
быть заключена в кавычки. В принципе, так делать
можно, хотя и не рекомендуется. Многословные име-
на, несомненно, удобнее читать, но они создают
множество проблем для многих клиентских приложе-
ний. Таким образом, наиболее часто псевдонимы ис-
пользуются для переименования многословных на-
званий столбцов в однословные.
Производные столбцы
Псевдонимы иногда называют "производные столб-
цы", но, независимо оттого, какой термин вы будете
использовать, означают они одно и то же.
Выполнение математических
вычислений
Еще одним способом использования вычисляемых полей
является выполнение математических операций над вы-
бранными данными. Рассмотрим пример. В таблице Orders
хранятся все полученные заказы, а в таблице Order Items
содержатся наименования продуктов для каждого заказа.
Следующий SQL-оператор осуществляет выборку всех про-
дуктов в заказе номер 2 0008:
ВВОД
SELECT prod_id, quantity, item_price
FROM Orderltems
WHERE order nam = 20008;
ВЫВОД
prod id quantity item_price
RGAN01 5 4.9900
BR03 5 11.9900
BNBG01 10 3.4900
Создание вычисляемых полей 77
BNBG02 10 3.4900
BNBG03 10 3 .4900
В столбце item_price содержится цена на продукт для
каждой записи, имеющейся в заказе. Чтобы узнать полную
цену (цена за один продукт, умноженная на количество
продуктов в заказе), необходимо сделать следующее:
ВВОД
SELECT prod_id,
quantity,
item_price
quantity*item_j?rice AS expanded_price
FROM OrderItems
WHERE order nam = 20008;
ВЫВОД
prod_id quantity item_price
expanded_price
Анализ
Столбец expanded_price, показанный в предыдущем
результате, является вычисляемым полем; вычисление бы-
ло простым: quantity* itera_price. Теперь клиентское
приложение может использовать этот новый вычисляемый
столбец, как и любой другой в таблице.
В SQL поддерживаются основные математические опера-
ции, перечисленные в табл. 7.1. Кроме того, для управле-
ния порядком обработки можно использовать круглые
скобки. В уроке 5, "Расширенная фильтрация данных",
рассказывается о порядке обработки.
Таблица 7 . 1 . Математические операции в SQL
Операция Описание
Сложение
Вычитание
Умножение
Деление
78 Урок7
Резюме
В этом уроке вы узнали, что такое вычисляемые поля и
как их можно создавать. Были рассмотрены примеры ис-
пользования вычисляемых полей для конкатенации строк и
выполнения математических операций. Кроме того, вы уз-
нали, как следует создавать и использовать псевдонимы
так, чтобы ваше приложение могло обращаться к вычис-
ляемым полям.
Урок 8
Использование
функций
манипулирования
данными
В этом уроке вы узнаете, что такое функции, какие типы
функций поддерживаются в СУБД и как их мижно приме-
нять. Вы также узнаете, почему использование SQL-функ-
ций может быть проблематичным.
Проблемы с функциями
Перед тем как начать урок и рассмотреть примеры, об-
ращаю ваше внимание на то, что использование SQL-
функций может быть проблематичным.
В отличие от SQL-операторов (например, SELECT), кото-
рые в основном поддерживаются всеми СУБД одинаково, в
разных СУБД могут применяться различные функции.
Только некоторые функции в различных СУБД выполняют-
ся одинаково. И хотя все типы функций обычно доступны в
80 Урок 8
,. Переносимый код
Код, который может работать в разных системах.
Использование функций
В большинстве реализаций SQL поддерживаются сле-
дующие типы функций.
• Текстовые функции; используются для управления
текстовыми строками (например, для обрезания или
заполнения значений и преобразования значений в
верхний или нижний регистр).
• Числовые функции; используются для выполнения
математических операций над числовыми данными
(например, для вычисления абсолютных значений и
выполнения алгебраических вычислений).
• Функции даты и времени; используются для управ-
ления значениями даты и времени и для выборки от-
дельных частей этих значений (например, для воз-
вращения разницы между датами и проверки даты на
корректность).
• Системные функции; возвращают информацию, спе-
цифичную для используемой СУБД (например, воз-
вращают регистрационную информацию пользователя).
В предыдущем уроке встречалась функция, которая ис-
пользовалась в списке столбцов выражения SELECT, но это
допустимо не для всех функций. Функции можно использо-
вать как в других частях оператора SELECT (например, в
условии WHERE), так и в других SQL-операторах (об этом вы
узнаете в дальнейших уроках).
82 Урок 8
ВЫВОД
vend name vend_name_upcase
Анализ
Функция UPPER () преобразует текст в верхний регистр
и, таким образом, в этом примере имя каждого изготовите-
ля перечислено дважды: первый раз в таком виде, в каком
оно хранится в таблице Vendors, а второй раз — будучи
преобразованным в верхний регистр, в виде столбца
vend_name_upсase.
В табл. 8.2 перечислены наиболее часто используемые
функции манипулирования текстом.
Один элемент из табл. 8.2 требует более подробного объ-
яснения. SOUNDEX — это алгоритм, преобразующий тексто-
вую строку в буквенно-цифровой шаблон, описывающий
фонетическое представление данного текста. Функция
SOUNDEX берет в расчет похожие по звучанию буквы и сло-
ги, позволяя сравнивать строки не по тому, как они пишут-
ся, а по тому, как они звучат. Хотя SOUNDEX не подпадает
под основные концепции SQL, большинство СУБД осущест-
вляют поддержку этой функции.
Использование функций манипулирования данными 83
Функция Описание
LEFT () (или функция под- Возвращает символы из левой час-
строки) ти строки
LENGTH (а т а к ж е Возвращает длину строки
DATALENGTH () и л и LEN () )
LOWER () Преобразует строку в нижний ре-
гистр
LTRIM () (LCASE () в Access) Удаляет пробелы в левой части
строки
RIGHT () ( и л и ф у н к ц и я Возвращает символы из правой
подстроки) части строки
Удаляет пробелы в правой части
RTRIM() строки
Возвращает значение SOUNDEX
SOUNDEX () строки
Преобразует текст строки в верх-
UPPER () (UCASE в Access) ний регистр
Поддержка SOUNDEX
Функция S O U N D E X (). не поддерживается Microsoft
Access или PostgreSQL, поэтому следующий пример
не будет работать в этих СУБД.
ВВОД
SELECT cust_name cust_contract
FROM Customers
WHERE cust contract = 'Michael Green1
84 Урок 8
ВЫВОД
cust name cust contract
ВЫВОД
cust_name cust_contract
Анализ
В этом примере в предложении WHERE используется
функция SOUNDEX () для преобразования значения столбца
cust_contact и искомой строки в их SOUNDEX-значения.
Так как Michael Green и Michelle Green звучат одина-
ково, их SOUNDEX-значения совпадут и предложение WHERE
корректно отфильтрует необходимые данные.
ВВОД
SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date) = 2004;
ВЫВОД
order num
20005
20006
20007
20008
20009
В Access используйте следующую версию примера:
ВВОД
SELECT order_num
FROM Orders
WHERE DATEPART('yyyy*, order_date) = 2004;
Анализ
В этом примере (в версиях для SQL Server и Sybase и в
Access) используется функция DATE PART (), которая, как
видно из названия, возвращает только часть даты. В функ-
ции DATE PART () используются два параметра: часть, подле-
жащая возвращению, и дата, из которой эта часть возвраща-
ется. В рассматриваемом примере функция DATEPARTO из
столбца order_column возвращает только год. Путем срав-
нения полученного значения со значением 2 004 предложе-
ние WHERE выбирает только те заказы, которые были сдела-
ны в этом году.
Ниже приведена версия данного примера для PostgreSQL,
в которой используется похожая функция DATE_PART ():
86 Урок 8
ВВОД
SELECT order_num
FROM Orders
WHERE DATE_PART('year• , order_date) = 2004;
В MySQL, помимо DATEPARTO, есть множество других
функций, предназначенных для манипулирования значе-
ниями дат. Пользователи MySQL могут использовать функ-
цию YEAR () для выборки из даты значения года:
ВВОД
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2004;
В Oracle также нет функции DATE PART (), но существуют
несколько других функций манипулирования датой, кото-
рые можно использовать с этой же целью. Рассмотрим
пример:
ВВОД
SELECT order_num
FROM Orders
WHERE t o number(to c h a r ( o r d e r date, •YY 1 )) = 2004;
Анализ
В этом примере функция to_char () используется для
извлечения части даты, а функция to_number() — для
преобразования этой части в числовое значение, чтобы его
можно было сравнить со значением 2 004.
Тех же результатов можно добиться при помощи опера-
тора BETWEEN:
ВВОД
SELECT order_num
FROM Orders
WHERE o r d e r _ d a t e BETWEEN to_date('01-JAN-2004
AND t o d a t e ( ' 3 1 - D E C - 2 0 0 4 ' ) ;
Анализ
В этом примере функция Oracle to_date () используется
для преобразования двух строк в даты. В одной содержится
дата 1 января 2004, а в другой — 31 декабря 2004. Стан-
Использование функций манипулирования данными 87
Даты в Oracle
Даты в формате ДД-МММ-ГГГГ (как в предыдущих
примерах) системой Oracle обычно обрабатываются,
даже если они не приведены к тому виду, как при ис-
пользовании функции to_date.•(•)... Однако для надеж-
ности лучше всегда использовать эту функцию.
Резюме
В этом уроке объяснялось, как можно использовать SQL-
функции манипулирования данными. Несмотря на то, чтс
эти функции могут быть очень полезными при форматиро-
вании, манипулировании и фильтрации данных, они весьма
различны для разных реализаций SQL.
Урок 9
Суммирование данных
В этом уроке вы узнаете, что такое статистические SQL-
функции и как их можно использовать для суммирования
данных таблицы
Использование статистических
функций
Часто бывает необходимо просуммировать данные без их
выборки, и в SQL предусмотрены для этого специальные
функции. SQL-запросы с этими функциями часто исполь-
зуются с целью выборки данных для анализа и создания
отчетов. Примерами таких выборок могут послужить:
• определение числа строк в таблице (либо числа строк,
которые удовлетворяют какому-то условию или со-
держат определенное значение);
• получение суммы по набору строк в таблице;
• поиск наибольшего, наименьшего и среднего значе-
ний из столбца таблицы (из всех или из каких-то
конкретных строк).
В каждом из этих примеров необходимы какие-то итого-
вые данные по таблице, а не сами данные. Поэтому воз-
вращение реальных данных таблицы было бы пустой тра-
той времени и ресурсов (не говоря о пропускной способно-
сти сети). Итак, все, что вам нужно, — это только итоговая
информация.
Чтобы облегчить такой способ извлечения информации,
в SQL предусмотрен набор из пяти статистических функ-
ций, которые перечислены в табл. 9.1. Эти функции позво-
ляют выполнять все варианты выборки, которые были пе-
речислены выше. В отличие от функций манипулирования
данными из предыдущего урока, статистические SQL-
90 Урок 9
Функция AVG ()
Функция AVG () используется для возвращения среднего
значения определенного столбца путем подсчета числа строк
в таблице и суммирования их значений. Эту функцию можно
использовать для возвращения среднего значения всех
столбцов или определенных столбцов или строк.
В первом примере функция AVG () исользуется для возвра-
щения средней цены для всех продуктов таблицы Products:
ВВОД
SELECT AVG(prod_price) AS avg_jprice
FROM P r o d u c t s ;
ВЫВОД
avg_price
6.823333
Суммирование данных 91
Анализ
Выражение SELECT, приведенное выше, возвращает одно
значение, avg_price, в котором содержится средняя цена
всех продуктов таблицы Products. Здесь avg_price — это
псевдоним, описанный в уроке 7, "Создание вычисляемых
полей."
Функцию AVG () можно также использовать для нахож-
дения среднего значения определенных столбцов или строк.
В следущем примере возвращается средняя цена продуктов,
предлагаемых определенным поставщиком:
ВВОД
SELECT AVG(prod_price) AS avg_j>rice
FROM Products
WHERE v e n d i d = ' D L L 0 1 1 ;
ВЫВОД
avg_price
6.8650
Анализ
Этот оператор SELECT отличается от предыдущего толь-
ко тем, что в нем содержится предложение WHERE. В соот-
ветствии с предложением WHERE выбираются только те на-
именования продуктов, значение vend_id для которых
равно DLL01, поэтому значение, возвращенное в столбце с
псевдонимом avg_price, является средним только для
продуктов этого изготовителя.
Только отдел ьн ые столбцы
Функцию AVGO можно использовать только для
вычисления среднего значения определенного
числового столбца, имя этого столбца должно быть
указано в качестве параметра функции. Чтобы
получить среднее значение нескольких столбцов,
необходимо использовать несколько функций AVG ( ) .
92 Урок 9
Значения NULL
Строки столбца, с о д е р ж а щ и е значения N U L L , игнори-
руются функцией A V G ( ) .
Функция COUNT ()
Функция COUNT () подсчитывает число строк. При по-
мощи функции COUNT () можно узнать общее число строк в
таблице или число строк, удовлетворяющих определенному
критерию.
Эту функцию можно использовать двумя способами:
• В виде COUNT {*) для подсчета числа строк в таблице
независимо от того, содержат столбцы значения NULL
или нет.
• В виде COUNT (column) для подсчета числа строк, ко-
торые имеют значения в указанных столбцах, причем
значения NULL игнорируются.
В первом примере возвращается общее число имен кли-
ентов, содержащихся в таблице Customers:
ВВОД
SELECT COUNT(*) AS num_cust
FROM Cu s t ome r s;
ВЫВОД
num_cust
Анализ
В этом примере функция COUNT (*) используется для
подсчета всех строк независимо от их значений. Сумма воз-
вращается в переменную num_cust.
В следующем примере подсчитываются только клиенты,
имеющие адреса электронной почты:
ВВОД
SELECT COUNT(cust_email) AS num_cust
FROM Customers;
Суммирование данных 93
ВЫВОД
num_cust
3
Анализ
В этом выражении SELECT используется функция
COUNT (cust_email) для подсчета только строк, имеющих
ненулевое значение в столбце cust_email. В этом примере
значение cust_email равно 3 (это означает, что только 3 из
5 клиентов имеют адрес электронной почты).
Значения NULL
Строки столбцов со значениями N U L L игнорируются
функцией C O U N T ( ) , если указано и м я с т о л б ц а м и
учитываются, если используется звездочка (*).
Функция МАХ ()
Функция МАХ () возвращает самое большое значение из
указанного столбца. Для этой функции необходимо указы-
вать имя столбца, как это показано ниже:
ВВОД
SELECT MAX(prod_price) AS max_price
FROM Products;
ВЫВОД
max_price
11.9900
Анализ
Здесь функция MAX () возвращает цену наиболее дорого-
го продукта в таблице Products.
94 Урок 9
Значения NULL
Строки столбцов с о значениями N U L L игнорируются
функцией МАХ ( ) .
Функция MIN ()
Функция MIN () производит противоположное по отно-
шению к МАХ () действие — она возвращает наименьшее
значение в указанном столбце. Так же, как и для функции
МАХ ( ) , для MIN () требуется указать имя столбца, как пока-
зано ниже:
ВВОД
SELECT MIN(prod_price) AS min_price
FROM Products;
ВЫВОД
min_pnce
3.4900
Анализ
Здесь MIN () возвращает цену самого дешевого продукта
в таблице P r o d u c t s .
Суммирование данных 95
З н а ч е н и я N U L L
Функция SUMO
Функция SUM() возвращает сумму (общую) значений в
определенном столбце.
Ниже приведен пример, демонстрирующий это действие.
В таблице Orderltems содержатся предметы заказа, при-
чем каждому предмету соответствует определенное количе-
ство заказов. Общее число заказанных продуктов (сумма
всех значений переменной quantity) может быть выбрана
следующим образом:
ВВОД
SELECT SUM(quantity) AS item_ordered
FROM Orderltems
WHERE order item = 20005;
ВЫВОД
item_ordered
200
96 Урок 9
Анализ
Функция SUM (quantity) возвращает сумму всех пред-
метов заказа, а предложение WHERE гарантирует, что учи-
тываться будут только необходимые продукты.
ВВОД
SELECT SUM(item_price*quantity) AS total_price
FROM OrderIterns
WHERE order item = 20005;
ВЫВОД
total_price
1648.0000
Функция SUM(item_price*quantity) возвращает сум-
му всех цен в заказе, а предложение WHERE гарантирует,
что учитываться будут только необходимые продукты.
З н а ч е н и я N U L L
Статистические вычисления
для отдельных значений
Все пять статистических функций могут быть использо-
ваны двумя способами:
• для вычисления во всех строках при указании аргу-
мента ALL или без указания какого-либо аргумента
(так как ALL является аргументом по умолчанию);
Суммирование данных 97
ALL по умолчанию
Не в Access
Microsoft Access не поддерживает использование
аргумента D I S T I N C T В статистических функциях,
поэтому следующий пример не будет работать в
Access.
ВЫВОД
avg_price
4.2400
Анализ
В этом примере вследствие использования ключевого
слова DISTINCT значение avg_j?rice получается более вы-
соким, так как в таблице есть несколько предметов с оди-
наково низкой ценой. Не учитывая их, мы получаем более
высокую среднюю стоимость.
98 Урок 9
Внимание
Ключевое слово D I S T I N C T МОЖНО использовать С
функцией COUNT (} только в том случае, если указано
имя столбца. Его нельзя использовать с функцией
C O U N T ( * ) . Аналогично, D I S T I N C T нужно использо-
вать С именем столбца, но не с выражением.
Предикаты
Помимо ключевых слов D I S T I N C T И A L L , некоторые
СУБД поддерживают предикаты, такие как ТОР И ТОР
PERCENT, позволяющие выполнять действия над
подмножествами результатов запроса. Обратитесь к
документации вашей СУБД, чтобы точно узнать, какие
предикаты вы можете использовать.
Комбинирование
статистических функций
Во всех примерах применения статистических функций,
приведенных до сих пор, указывалась только одна функ-
ция. Но на самом деле операторы SELECT могут содержать
столько статистических функций, сколько нужно. Рассмот-
рим пример:
Суммирование данных 99
ВВОД
SELECT COUNT(*) AS num_items,
MIN(prodjprice) AS price_min,
1У1АХ (prod_price) AS price_max,
AVG(prod_price) AS proce_avg
FROM Products;
ВЫВОД
num items price_min price__max price_avg
3.4900 11.9900 6.823333
Анализ
В одном операторе SELECT используются сразу четыре
статистические функции и возвращаются четыре значения
(число элементов в таблице Products, самая высокая, са-
мая низкая и средняя их стоимость).
Псевдонимы
При указании псевдонимов для хранения результатов
статистической функции старайтесь не использовать
реальных названии столбцов в таблице, поскольку во
многих реализациях SQL такое поведение не привет-
ствуется — вы получите сообщение об ошибке.
Резюме
Статистические функции используются для получения
итоговых данных. В SQL поддерживается пять статистиче-
ских функций, каждая из которых может использоваться
несколькими способами для возвращения только необходи-
мых в данный момент результатов. Эти функции разрабо-
таны для повышения эффективности работы, обычно они
возвращают результат гораздо быстрее, чем если бы вы
производили вычисления в своем клиентском приложении.
Урок 10
Итоговые данные
В этом уроке вы узнаете, как получать итоговые данные
таким образом, чтобы можно было суммировать подмножест-
ва из содержимого таблицы. Для этого используются два но-
вых предложения оператора SELECT, предложение GROUP BY
и предложение HAVING.
ВЫВОД
num_j?rods
Создание групп
Группы создаются с помощью предложения GROUP BY
оператора SELECT.
Лучше всего это можно объяснить на примере:
ВВОД
SELECT vend_id, COUNT(*) AS numjprods
FROM Products
GROUP BY vend id;
ВЫВОД
vend id num_prods
BRS01
DLL01
FNG01
Анализ
Вышеприведенный оператор SELECT предписывает вы-
вести два столбца —vend_id, содержащий идентификатор
поставщика продукта, и num_prods, содержащий вычис-
ляемые поля (он создается с помощью функции COUNT (*)).
Предложение GROUP BY указывает СУБД сортировать дан-
ные и группировать их по столбцу vend_id. В результате
значение num_prods будет вычисляться по одному разу для
каждой группы записей vend_id, а не один раз для всей
таблицы products. Как видите, в результатах указывается,
что поставщик BRS01 предлагает три продукта, поставщик
DLL01 — четыре продукта, а поставщик FNG01 — 2 продукта.
Поскольку было использовано предложение GROUP BY,
не потребовалось указывать каждую группу, для которой
должны быть произведены вычисления. Это было сделано
автоматически. Предложение GROUP BY указывает СУБД
группировать данные и затем выполнять вычисление по
каждой группе, а не по всему набору результатов.
Итоговые данные 103
ПредложениеA L L
Фильтрующие группы
В дополнение к способности группировать данные с по-
мощью предложения GROUP BY, SQL также позволяет осу-
ществлять фильтрацию — указывать, какие группы долж-
ны быть включены в результат, а какие исключены из не-
го. Например, вам может понадобиться список клиентов,
которые сделали хотя бы два заказа. Чтобы получить такие
данные, необходим фильтр, относящийся к целой группе, а
не к отдельным строкам.
Вы уже знаете, как действует предложение WHERE (его
мы рассматривали ранее, в уроке 4, "Фильтрация данных").
Однако в данном случае предложение WHERE использовать
нельзя, поскольку фильтры WHERE указывают строки, а не
группы. Собственно говоря, WHERE "не знает", что такое
группы.
Итоговые данные 105
ввод
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
ВЫВОД
cust_id orders
1000000001 2
Анализ
Первые три строки этого оператора SELECT аналогичны
оператору, рассмотренному ранее. Последняя строка добав-
ляет к нему предложение HAVING, которое фильтрует эти
группы с помощью функции COUNT (*) >= 2 — два или
больше заказов.
Как видите, предложение WHERE здесь не работает, по-
скольку фильтрация основана на итоговом значении груп-
пы, а не на значениях указанных строк.
106 Урок 10
ВЫВОД
vend id num_jprods
BRS01 3
FNG01 2
Итоговые д а н н ы е 107
Анализ
Этот пример нуждается в пояснении. Первая строка
представляет собой основной оператор SELECT, использую-
щий статистическую функцию, — точно так же, как в пре-
дыдущих примерах. Предложение WHERE фильтрует все
строки со значениями в столбце prod_price не менее 4.
Затем данные группируются по столбцу vend_id, а потом
предложение HAVING фильтрует только группы, содержа-
щие не менее двух членов. При отсутствии предложения
WHERE была бы получена лишняя строка (поставщик, пред-
лагающий 4 продукта, каждый из которых дешевле 4), как
показано ниже.
ВВОД
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id
HAVING COUNT(*) >= 2;
ВЫВОД
vend id num_prods
BRS01
DLL01
FNG01
Использование п р е д л о ж е н и й H A V I N G И WHERE
Группирование и сортировка
Важно понимать, что предложения GROUP BY и ORDER
BY весьма различны, хотя с их помощью иногда можно до-
биться одинаковых результатов. Разобраться в этом вам
поможет табл. 10.1.
Таблица 1 0 . 1 . Сравнение предложений ORDER BY И
GROUP BY
ORDER BY GROUP BY
Сортирует полученные ре- Группирует строки. Однако ото-
зультаты бражаемый результат может не
соответствовать порядку группи-
рования
Могут быть использованы Могут быть использованы только
любые столбцы (даже не выбранные столбцы или выраже-
выбранные в предложении ния; должно быть использовано
SELECT) выражение для каждого выбран-
ного столбца
Не является необходимым Требуется, если используются
столбцы (или выражения) со ста-
тистическими функциями
ВВОД
SELECT order_num, COUNT(*] AS items
FROM OrderIterns
GROUP BY order_num
HAVING COUNT(*) >= 3;
ВЫВОД
order num items
20006
20007
20008
20009
Чтобы отсортировать результат по количеству заказан-
ных предметов, все, что вам необходимо сделать, — это до-
бавить предложение ORDER BY, как показано ниже:
ВВОД
SELECT order_num, COUNT(*) AS items
FROM OrderIterns
GROUP BY order_num
HAVING COUNT(*) >= 3;
ORDER BY items, order num;
110 Урок 10
Несовместимость с Access
f f СУБД Microsoft Access не позволяет осуществлять
сортировку по псевдонимам, и для нее этот пример
неприменим. Выход состоит в замене столбца items
(в предложении ORDER BY) вычисляемым выражени-
ем или номером поля. По существу, будут работать
оба предложения, ORDER B Y C O U N T (*}', o r d e r _ n u m
И ORDER BY 1 , o r d e r num.
ВЫВОД
order num items
20006
20009
20007
20008
Анализ
В этом примере предложение GROUP BY используется
для группирования данных по номеру заказа (столбец
order_num), так что функция COUNT (*) может возвратить
количество предметов в каждом заказе. Предложение
HAVING фильтрует данные таким образом, что возвращают-
ся только заказы с тремя и более предметами. Наконец, ре-
зультат сортируется за счет использования предложения
ORDER BY.
Упорядочение предложения
SELECT
Предложения оператора SELECT указываются в опреде-
ленном порядке. В табл. 10.2 перечислены все предложе-
ния, которые мы изучили о сих пор, в порядке, в котором
они должны использоваться.
Итоговые данные 111
ORDER BY У п о р я д о ч и в а н и е ре-
зультатов с о р т и р о в к и Нет
Резюме
В уроке 9, "Суммирование данных," вы узнали, как ис-
пользовать статистические функции SQL для выполнения
операций суммирования над данными. В этом уроке расска-
зывалось о том, как нужно использовать предложение
GROUP BY для выполнения вычислений по отношению к
группам данных, возвращения результатов для каждой
группы. Было описано, как можно использовать предложе-
ние HAVING для фильтрации указанных групп, в уроке
также пояснялось, какова разница между ORDER BY и
GROUP BY и между предложениями WHERE и HAVING.
Урок 11
Использование
подзапросов
В этом уроке рассказывается о том, что такое подзапросы
и как их можно использовать.
Запрос
Какой-либо оператор SQL. Однако этот термин обыч-
но используется по отношению к операторам SELECT.
Поддержка в MySQL
Если вы используете MySQL, знайте, что подзапросы
поддерживаются этой СУБД начиная с версии 4.1.
Более ранние версии MySQL запросы не поддержи-
вают.
114 Урок 11
Фильтрация посредством
подзапросов
Таблицы баз данных, используемые во всех уроках этой
книги, являются реляционными таблицами (см. приложе-
ние А, в котором описана каждая из таблиц и отношения
между ними). Заказы хранятся в двух таблицах. Таблица
O r d e r s (заказы) содержит по одной строке для каждого за-
каза; в ней указываются номер заказа, идентификатор кли-
ента и дата заказа. Предметы отдельного заказа хранятся в
соответствующей таблице O r d e r l t e m s . Таблица O r d e r s не
содержит информацию о клиентах. Она хранит только
идентификатор клиента. Информация о клиентах хранится
в таблице Customers (клиенты).
Теперь предположим, что вы хотите получить перечень
всех клиентов, которые заказали продукт RGAN01. Что
нужно сделать, чтобы получить эту информацию? Для это-
го нужно сделать следующее.
1. Выбрать номера всех заказов, в которых содержится
продукт RGAN01.
2. Выбрать идентификатор клиента для всех клиентов,
которые имеют заказы, перечисленные среди номеров
заказов, возвращенных на предыдущем шаге.
3. Выбрать информацию о клиенте для всех клиентов,
идентификаторы которых были возвращены на пре-
дыдущем шаге.
Каждый из этих шагов можно выполнить в виде отдель-
ного запроса. Делая это, вы используете результаты, воз-
вращенные одним оператором SELECT, чтобы заполнить
предложение WHERE для следующего оператора SELECT.
Вы можете также использовать подзапросы для того,
чтобы объединить все три запроса в один-единственный
оператор.
Первый оператор SELECT выбирает столбец order_num
для всех продуктов заказа, у которых в столбце p r o d _ i d
значится RGAN01. Результат представляет собой номера
двух заказов, содержащих этот предмет:
Использование подзапросов 115
ВВОД
SELECT order_num
FROM OrderIterns
1
WHERE prod_id = 'RGAN01
ВЫВОД
order_num
20007
20008
Следующий шаг состоит в выборке идентификаторов
клиентов, связанных с заказами 20007 и 20008. Используя
предложение IN, о котором говорилось в уроке 5, "Расши-
ренная фильтрация данных", вы можете создать такой опе-
ратор SELECT:
ВВОД
SELECT cust_id
FROM Orders
WHERE order num IN (20007,20008);
ВЫВОД
cust_id
1000000004
1000000005
Теперь объединим эти два запроса путем превращения
первого из них (того, который возвращает номера заказов)
в подзапрос. Посмотрите на следующий оператор SELECT:
ВВОД
SELECT c u s t _ i d
FROM O r d e r s
WHERE o r d e r _ n u m IN (SELECT o r d e r _ n u m
FROM O r d e r l t e m s
WHERE p r o d _ i d = 'RGAN01');
ВЫВОД
cust_id
1000000004
1000000005
116 Урок 11
Анализ
Подзапросы всегда обрабатываются, начиная с самого
внутреннего оператора SELECT в направлении "изнутри на-
ружу". При обработке предыдущего оператора СУБД в дей-
ствительности выполняет две операции.
Вначале она выполняет подзапрос:
SELECT order_nura FROM o r d e r i t e m s WHERE p r o d _ i d = ' R G A N 0 1 '
В результате выполнения этого запроса возвращается
два номера заказа, 20007 и 20008. Эти два значения затем
передаются в предложение WHERE внешнего запроса в фор-
мате с разделителем в виде запятой, необходимом для опе-
ратора IN. Теперь внешний запрос становится таким:
SELECT c u s t _ i d FROM o r d e r s WHERE order_num IN (20007,20008)
Как видите, результат корректен и точно такой же, как
полученный путем жесткого кодирования предложения
WHERE в предыдущем примере.
ВВОД
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM Orderltems
WHERE prod_id = 'RGAN01'));
ВЫВОД
cust name cust contact
Подзапросы и производительность
Представленные нами коды работают и приводят к
получению необходимых результатов. Однако подза-
118 Урок 11
Использование подзапросов
в качестве вычисляемых полей
Другой способ использования подзапросов состоит в ис-
пользовании вычисляемых полей. Предположим, вы хотите
вывести общее количество заказов, размещенных каждым
клиентом в таблице Customers (клиенты). Заказы хранятся
в таблице Orders вместе с соответствующими идентифика-
торами клиентов.
Чтобы выполнить эту операцию, необходимо сделать
следующее.
1. Выбрать перечень клиентов из таблицы Customers.
2. Для каждого выбранного клиента посчитать число его
заказов в таблице Orders.
Как следует из предыдущих двух уроков, вы можете ис-
пользовать оператор SELECT COUNT (*) для подсчета строк в
таблице, а используя предложение WHERE для фильтрации
идентификатора конкретного клиента, вы можете подсчи-
тать заказы только этого клиента. Например, посредством
следующего кода можно подсчитать количество заказов,
сделанных клиентом 1000000001:
ВВОД
SELECT COUNT(*) AS orders
FROM Orders
WHERE cust_id = '1000000001';
Чтобы получить итоговую информацию посредством
функции COUNT (*) для каждого клиента, используйте
COUNT* как подзапрос. Посмотрите на следующий код:
ВВОД
SELECT cust_name,
cust state,
Использование подзапросов 119
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust name;
ВЫВОД
cust name cust state orders
Fun4All IN 1
Fun4All AZ 1
Kids Place OH 0
The Toy Store IL
Village Toys MI 2
Анализ
Этот оператор SELECT возвращает три столбца для каж-
дого клиента из таблицы Customers: cust_name,
c u s t _ s t a t e и orders. Поле Orders является вычисляе-
мым; оно формируется в результате выполнения подзапро-
са, который заключен в круглые скобки. Этот подзапрос
выполняется один раз для каждого выбранного клиента.
В приведенном примере подзапрос выполняется пять раз,
потому что были выбраны имена пяти клиентов.
Предложение WHERE в подзапросе несколько отличается
от предложений WHERE, с которыми мы работали ранее, по-
тому что в нем используются полные имена столбцов. Сле-
дующее предложение требует от SQL, чтобы было проведено
сравнение значения cust_id в таблице Orders с тем, кото-
рое в данный момент выбирается из таблицы Customers:
WHERE Orders.cust_id = Customers.cust_id
Этот синтаксис — имя таблицы и имя столбца разделя-
ются точкой — должен использоваться всякий раз, когда
может возникнуть неопределенность в именах столбцов.
В данном примере имеется два столбца cust_id, один в
таблице Customers и один в таблице Orders. Без использо-
вания полностью определенных имен столбцов СУБД будет
считать, что вы сравниваете cust_id в таблице Orders с
самим собой. Поэтому запрос
SELECT COUNT(*) FROM O r d e r s WHERE c u s t _ i d = c u s t _ i d
будет всегда возвращать общее число заказов в таблице
Orders, но это не тот результат, который вам нужен:
120 Урок 11
ВВОД
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE cust_id = cust_id) AS orders
FROM Customers
ORDER BY cust name;
ВЫВОД
cust name cust state orders
Fun4All IN 5
Fun4All AZ 5
Kids Place OH 5
The Toy Store IL 5
Village Toys MI 5
Подзапросы чрезвычайно полезны при подготовке опера-
тора SELECT такого типа, однако внимательно следите ЗЕ
тем, чтобы были правильно указаны неоднозначные именг
столбцов.
Всегда есть несколько решений
Хотя простой код, представленный в этом уроке, и
работоспособен, зачастую он оказывается не самым
эффективным способом выборки данных такого типа.
Мы еще раз рассмотрим этот пример в одном из сле-
дующих уроков.
Резюме
В этом уроке вы узнали, что такое подзапросы и как и?
можно использовать. Чаще всего подзапросы используют i
операторах IN предложения WHERE и для заполнения вы
числяемых столбцов. Были представлены примеры опера
ций обоих названных типов.
Урок 12
Объединение таблиц
В этом уроке вы узнаете, что такое объединения, для чего
они применяются и как следует оформлять операторы
SELECT, использующие объединения.
Масштабирование
Позаботьтесь о том, чтобы можно было беспрепятст-
венно расширять базу данных. О хорошо сконструи-
рованной базе данных или приложении говорят, что
она (оно) хорошо масштабируется.
Создание объединения
Создание объединения — очень простая процедура.
Нужно указать все таблицы, которые должны быть вклю-
чены в объединение, а также "объяснить" СУБД, как они
должны быть соотнесены между собой. Посмотрите на сле-
дующий пример.
Объединение таблиц 125
ВВОД
SELECT vend_name, prod_name, p r o d _ p r i c e
FROM Vendors, Products
WHERE Vendors.vend i d = Products.vend i d ;
ВЫВОД
vend name
I prod_name prod_j?rice
Анализ I
Рассмотрим представленный выше код. Оператор SELECT
начинается точно так же, как все операторы, которые мы
до сих пор рассматривали, — с указания столбцов, которые
должны быть выбраны. Существенная разница состоит в
том, что два из указанных столбцов (prod_name и
p r o d _ p r i c e ) находятся в одной таблице, а третий
(vend_name) — в другой.
Теперь посмотрим на предложение FROM. В отличие от
предыдущих операторов SELECT, этот содержит две табли-
цы, указанные в предложении FROM, Vendors и P r o d u c t s .
Это имена двух таблиц, которые должны быть объединены
в данном операторе SELECT.
Таблицы корректно объединяются в предложении
WHERE, которое указывает СУБД связывать идентификатор
поставщика v e n d _ i d из таблицы Vendors со значением
vend_id таблицы P r o d u c t s .
Обратите внимание на то, что эти столбцы указаны как
V e n d o r s . v e n d _ i d и P r o d u c t s . v e n d _ i d . Такие полностью
определенные имена необходимы здесь потому, что, если
вы укажете только vend_id, СУБД не сможет понять, на
какие именно столбцы v e n d _ i d вы ссылаетесь. (Их два, по
одному в каждой таблице). Как можно видеть из представ-
ленного результата, один оператор SELECT возвращает дан-
ные из двух разных таблиц.
126 Урок 12
ВВОД
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;
ВЫВОД
vend name prod_name prod_price
Анализ
Как видно из представленного результата, декартово
произведение вы, скорее всего, будете использовать очень
редко. Данные, возвращенные таким образом, ставят в со-
ответствие каждому продукту каждого поставщика, вклю-
чая продукты с указанием "не того" поставщика (и даже
поставщиков, которые вообще не предлагают продуктов).
Н е з а б у д ь т е у к а з а т ь п р е д л о ж е н и е WHERE
Проверьте, включили ли вы в оператор предложение
WHERE, иначе СУБД возвратит намного больше дан-
ных, чем вам нужно. Кроме того, убедитесь в том, что
предложение WHERE сформулировано правильно. Не-
корректное предложение фильтрования приведет к
тому, что СУБД выдаст вам неверные данные.
Перекрестное объединение
Иногда объединение, которое возвращает декартово
произведение, называют перекрестным объединением.
Внутренние объединения
Объединение, которое мы до сих пор использовали, на-
зывается объединение по эквивалентности — оно основано
на проверке эквивалентности двух таблиц. Объединение та-
кого типа называют также внутреннее объединение. Для
этих объединений можно использовать несколько иной син-
таксис, явно указывающий на тип объединения. Следую-
щий оператор SELECT возвращает в точности такие же дан-
ные, как и в предыдущем примере.
Объединение таблиц 129
ВВОД
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend id = Products.vend id;
Анализ
Оператор SELECT здесь точно такой же, как и предыду-
щий, но предложение FROM другое. Здесь отношение между
двумя таблицами является частью предложения FROM, ука-
занного как INNER JOIN. При использовании такого син-
таксиса предложение объединения указывается с использо-
ванием специального предложения ON вместо предложения
WHERE. Фактическое предложение, передаваемое в ON, то же
самое, которое передавалось бы в предложение WHERE.
Обратитесь к документации своей СУБД чтобы узнать,
какой синтаксис предпочтительнее использовать.
"Правильный" синтаксис
Согласно с п е ц и ф и к а ц и и ANSI на SQL, предпочти-
тельнее использование синтаксиса I N N E R J O I N .
ВЫВОД
prod_name vend name prod_price quantity
Анализ
В этом примере выводятся предметы заказа номер
20 007. Предметы заказа хранятся в таблице Order Items.
Каждый продукт хранится в соответствии с идентификато-
ром продукта, который ссылается на продукт в таблице
Products. Эти продукты связаны с соответствующими по-
ставщиками в таблице Vendors по идентификатору постав-
щика, который хранится вместе с каждой записью о про-
дукте. В предложении FROM этого примера перечисляются
три таблицы, а предложение WHERE определяет оба назван-
ных предложения объединения. Дополнительное предложе-
ние WHERE используется затем для фильтрации только
предметов заказа 2 0 007.
К вопросу о производительности
СУБД обрабатывают объединения, тратя время на
обработку каждой указанной таблицы. Этот процесс
может оказаться очень ресурсоемким, поэтому не
следует использовать объединения таблиц без осо-
бой на то необходимости. Чем больше таблиц вы объ-
единяете, тем ниже производительность.
ВВОД
SELECT cust_name, cust_contact
FROM Customers, Orders, Orderltems
WHERE Customers . cust__id = Orders . cust_id
AND Orderltems.order_num = Orders.order_num
1
AND prod_id • 'RGANOl ;
ВЫВОД
cust name cust contact
Анализ
Как уже говорилось в уроке 11, возвращение необходи-
мых для этого запроса данных требует использования трех
таблиц. Однако вместо использования подчиненных подза-
просов здесь были применены два объединения для связи
таблиц. Здесь были также указаны три предложения
WHERE. Первые два связывают таблицы в объединение, по-
следнее фильтрует данные по продукту RGANOl.
Только экспериментально
Как видите, часто существует несколько способов для
выполнения одной и той же операции SQL. И редко
удается определить, какой способ правильный, а ка-
кой нет. Производительность может зависеть от типа
выполняемой операции, используемой СУБД, коли-
чества данных в таблицах, присутствия либо отсутст-
вия индексов и ключей, а также целого ряда других
критериев. Следовательно, зачастую бывает целесо-
образно поэкспериментировать с различными меха-
низмами выборки для выяснения того, какой из них
работает быстрее.
132 Урок 12
Резюме
Объединения — одна из самых важных и востребован-
ных особенностей SQL, их эффективное использование воз-
можно только на основе знаний о "конструкции" реляцион-
ной базы данных. В этом уроке вы познакомились с осно-
вами построения баз данных, а также узнали, как следует
создавать объединение по эквивалентности (называемое
также внутреннее объединение), которое чаще всего ис-
пользуют при создании объединения. В следующем уроке
вы научитесь создавать объединения других типов.
Урок 13
Создание расширенных
объединений
В этом уроке вы узнаете все необходимое о дополнительных
типах объединений — что они собой представляют и как их
можно использовать. Вы также узнаете, как следует при-
менять псевдонимы таблиц и как можно использовать ста-
тистические функции по отношению к объединенным таб-
лицам.
Использование псевдонимов
таблиц
Ранее, в уроке 7, "Создание вычисляемых полей" вы уз-
нали, как можно использовать псевдонимы в качестве ссы-
лок на выбираемые столбцы таблицы. Синтаксис псевдони-
мов столбцов выглядит следующим образом:
ВВОД
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country)
%+ ' ) ' AS vend_title
FROM Vendors
ORDER BY vend_name;
Помимо возможности применения псевдонимов для имен
столбцов и вычисляемых полей, SQL позволяет также ис-
пользовать псевдонимы вместо имен таблиц. На то есть две
основных причины:
• более короткий синтаксис SQL;
• это позволяет много раз использовать одну и ту же
таблицу в операторе SELECT.
Обратите внимание на следующий оператор SELECT.
В основном он такой же, как в примерах предыдущего уро-
134 Урок 13
Анализ
Заметьте, что все три таблицы в предложениях FROM
имеют псевдонимы. Выражение Customers AS С задает С в
качестве псевдонима для таблицы Customers и т.д., что по-
зволяет использовать сокращение С вместо полного слова
Customers. В этом примере псевдонимы таблиц были ис-
пользованы только в предложении WHERE, но псевдонимы
можно применять и в других случаях. Их можно использо-
вать в списке SELECT, предложении ORDER BY, а также в
любой другой части этого оператора.
Никаких AS в Oracle
Использование объединений
других типов
До сих пор вы использовали только простые объедине-
ния, которые называют внутренние объединения или объе-
динения по эквивалентности. Теперь мы рассмотрим три
дополнительных типа объединения: самообъединение, есте-
ственное объединение и внешнее объединение.
Создание расширенных объединений 135
Самообъединения
Одна из основных причин для использования псевдони-
мов таблиц состоит в возможности обращения к одной и
той таблице несколько раз в одном операторе SELECT. По-
кажем это на примере.
Предположим, вы хотите послать письма по всем кон-
тактным адресам клиентов, которые работают с той же
компанией, с которой работает Джим Джонс. Такой запрос
требует, чтобы вначале вы выяснили, с какой компанией
работает Джим Джонс, а затем — какие клиенты работают
с этой же компанией. Вот один из способов решения этой
задачи.
ВВОД
SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name • (SELECT cust_name
FROM Customers
WHERE cust contact = 'Jim Jones');
ВЫВОД
cust id cust name cust contact
Анализ
В первом решении используются подзапросы. Внутрен-
ний оператор SELECT выполняет простую выборку, чтобы
возвратить имя компании (cust_name), с которой работает
Джим Джонс. Только это имя используется в предложении
WHERE внешнего запроса, так что выбираются имена всех
служащих, работающих с этой компанией. (Все о подзапро-
сах читайте в уроке 11, "Использование подзапросов".
Теперь рассмотрим тот же самый запрос, в котором ис-
пользуется объединение.
ВВОД
SELECT cl.cust_id, cl.cust_name, cl.cust_contact
FROM Customers AS cl, Customers AS c2
WHERE cl.cust_name = c2.cust_name
AND c2.cust contact = 'Jim Jones';
136 Урок 13
ВЫВОД
cust id cust name cust contact
Анализ
Две таблицы, необходимые для выполнения запроса, на
самом деле — одна и та же таблица, поэтому таблица
Customers появляется в предложении FROM дважды. Хотя
это совершенно законно, некоторые ссылки на таблицу
Customers могли бы оказаться неоднозначными, потому
что СУБД "не знает", на какую именно таблицу Customers
вы ссылаетесь.
Для решения этой проблемы используются псевдонимы.
Первый раз для таблицы Customers назначается псевдоним
С1, второй — псевдоним С2. Теперь эти псевдонимы можно
применять в качестве имен таблиц. Например, оператор
SELECT использует префикс С1 для однозначного указания
полного имени нужного столбца. Если этого не сделать,
СУБД возвратит сообщение об ошибке, потому что имеется
по два столбца с именами cust_id, cust_name и
cust_contact. СУБД не может знать, какой именно стол-
бец вы имеете в виду (даже если в действительности это
один и тот же столбец). Первое предложение WHERE объеди-
няет эти таблицы, а затем оно фильтрует данные второй
таблицы по столбцу cust_contact, чтобы возвратить толь-
ко нужные данные.
Самообъединения вместо подзапросов
Самообъединения часто используют для замены опе-
раторов, применяющих подзапросы, которые выби-
рают данные из той же таблицы, что и внешний опе-
ратор. Хотя конечный результат получается тем же
самым, многие СУБД обрабатывают объединения на-
Создание расширенных объединений 137
Естественные объединения
Всякий раз, когда объединяются таблицы, по крайней
мере один столбец будет появляться более чем в одной таб-
лице (т.е. столбцы, которые объединялись). Обычные объе-
динения (внутренние объединения, которые мы рассмотре-
ли в предыдущем уроке) возвращают все данные, даже
многократные вхождения одного и того же столбца. Естест-
венное объединение просто уничтожает эти многократные
вхождения, так что в результате возвращается только один
столбец.
Естественное объединение — это объединение, в котором
вы выбираете только не повторяющиеся столбцы. Обычно
это делается при помощи метасимвола (SELECT *) для од-
ной таблицы и указания явного подмножества столбцов для
всех остальных таблиц. Вот пример:
ВВОД
SELECT С.*, О.order_num, O.order_date, OI.prod_id,
Ч>01 .quantity, OI. item_j?rice
FROM Customers AS C, Orders AS O, Orderltems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = О.order_num
1
AND prod_id = 'RGAN01 ;
Никаких A S в Oracle
Анализ
В этом примере метасимвол используется только для
первой таблицы. Все остальные столбцы указаны явно, по-
этому никакие дубликаты столбцов не выбираются.
Несомненно, каждое внутреннее объединение, которое
вы использовали до сих пор, представляло собой в действи-
тельности естественное объединение и, возможно, вам ни-
138 Урок 13
Внешние объединения
Большинство объединений связывают строки одной таб-
лицы со строками другой, но в некоторых случаях вам мо-
жет понадобиться включать в результат строки, не имею-
щие связанных. Например, вы можете использовать объе-
динения для решения следующих задач:
• подсчета количества заказов каждого клиента, вклю-
чая клиентов, которые еще не сделали заказ;
• составления перечня продуктов с указанием количе-
ства заказов на них, включая продукты, которые ни-
кто из клиентов не захотел заказывать;
• вычисления средних объемов продаж с учетом клиен-
тов, которые еще не сделали заказ.
В каждом из этих случаев объединение должно вклю-
чать строки, не имеющие ассоциирующихся с ними строк в
связанной таблице. Объединение такого типа называется
внешним.
Разница в синтаксисе
Важно отметить, что синтаксис, используемый при
создании внешнего объединения, может несколько
отличаться для различных реализаций SQL. Различ-
ные формы синтаксиса, описанные в следующем
разделе, помогут вам работать с большинством реа-
лизаций, но все же обратитесь к документации своей
СУБД и уточните, какой синтаксис следует использо-
вать, прежде чем начинать работу.
ВВОД
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust id = Orders.cust id;
ВЫВОД
cust id order num
1000000001 20005
1000000002 NULL
1000000003 20006
1000000004 20007
1000000005 20008
Анализ
Аналогично внутреннему объединению, которое мы рас-
сматривали на прошлом уроке, в этом операторе SELECT
используются ключевые слова OUTER JOIN для указания
типа объединения (вместо указания его в предложении
WHERE). Но, в отличие от внутренних объединений, которые
связывают строки двух таблиц, внешние объединения
включают в результат также строки, не имеющие связан-
ных с ними строк. При использовании синтаксиса OUTER
JOIN вы должны использовать ключевое слово RIGHT или
LEFT, чтобы указать таблицу, все строки которой будут
включены в результат (RIGHT для таблицы, имя которой
стоит справа от OUTER JOIN, LEFT — для той, имя которой
значится слева).
В предыдущем примере используются ключевые слова
LEFT OUTER JOIN для выборки всех строк таблицы, ука-
занной в левой части предложения FROM (таблицы
Customers). Чтобы выбрать все строки из таблицы, ука-
занной справа, используйте правое внешнее объединение
(RIGHT OUTER JOIN), как показано в следующем примере.
ВВОД
SELECT Customers.cust_id, Orders.order_num
FROM Customers RIGHT OUTER JOIN Orders
ON Orders.cust id = Customers.cust id;
140 Урок 13
cust id order_num
1000000001 20005
1000000001 20009
1000000002 NULL
1000000003 20006
1000000004 20007
1000000005 20008
Анализ
Здесь предложение объединения указано в предложении
WHERE. Вместо проверки на равенство с помощью
оператора = используется оператор *= для указания того,
что в результат должна быть включена каждая строка таб-
лицы Customers. Оператор *= представляет собой оператор
левого внешнего объединения. С его помощью выбираются
все строки левой таблицы.
Противоположностью описанного левого внешнего объе-
динения является правое внешнее объединение, его опера-
тор таков: =*. Это объединение можно использовать для
возвращения всех строк таблицы, имя которой находится
справа от данного оператора, как показано в следующем
примере.
ВВОД
SELECT Customers.cust_id, Orders.order_num
FROM Customers, Orders
WHERE Orders.cust_id =* Customers.cust_id;
Еще одна форма внешнего объединения (используемая
только в СУБД Oracle) требует использования оператора
( + ) после имени таблицы, как показано ниже.
Создание расширенных объединений 141
ВВОД
SELECT Customers.cust_id, Orders.order_num
FROM Customers, Orders
WHERE Customers.cust id (+) = Orders.cust id
ВВОД
SELECT Customers.cust_id, Orders.order_num
FROM Orders FULL OUTER JOIN Customers
ON Orders.cust id = Customers.cust id;
Использование объединений со
статистическими функциями
Как вы узнали из урока 9, "Суммирование данных", ста-
тистические функции применяют для получения статисти-
ческих сведений о данных. Хотя во всех до сих пор рас-
смотренных примерах посредством статистических функций
получались данные только для одной таблицы, эти функ-
ции можно использовать также по отношению к объедине-
ниям.
Рассмотрим пример. Допустим, вы хотите выбрать спи-
сок всех клиентов и число сделанных ими заказов. Чтобы
получить искомое, в следующем коде применяется функция
COUNT() .
ВВОД
SELECT Customers.cust_id, COUNT(Orders.order_num) AS
ВЫВОД
cust_id num_ord
1000000001 2
1000000003 1
1000000004 1
1000000005 1
Анализ
В этом операторе SELECT используются ключевые слова
INNER JOIN для связи таблиц Customers и Orders между
собой. Предложение GROUP BY служит для получения ито-
говых данных по клиентам, и, таким образом, обращение к
функции COUNT (Orders.order_num) позволяет подсчитать
количество заказов каждого клиента и возвратить резуль-
тат в виде столбца num_ord.
Статистические функции можно использовать с объеди-
нениями других типов:
Создание расширенных объединений 143
ВВОД
SELECT Customers.cust_id, COUNT(Orders.order_num) AS
Никаких AS в Oracle
ВЫВОД
cust id num ord
1000000001
1000000002
1000000003
1000000004
1000000005
Анализ
В этом примере используется левое внешнее объединение
для включения в результат всех клиентов, даже тех, кото-
рые не сделали ни одного заказа. Как видите, клиент
1000000002 также включен в результат, хотя на данный
момент у него было 0 заказов.
Использование объединений
и условий объединения
Прежде чем завершить обсуждение объединений, кото-
рое заняло два урока, есть смысл напомнить о некоторых
ключевых моментах, относящихся к объединениям и их
использованию.
• Будьте внимательны при выборе типа объединения,
которое собираетесь использовать. Возможно, что ча-
ще вы будете использовать внутреннее объединение,
хотя в зависимости от ситуации это можно также
сказать и о внешнем объединении.
144 Урок 13
Резюме
Этот урок был продолжением предыдущего урока, по-
священного объединениям. Начали мы с того, что рассказа-
ли, как и для чего используют псевдонимы, а затем про-
должили рассмотрение объединений различных типов и
различных вариантов синтаксиса, применяемых для каждо-
го из них. Теперь вы знаете, как с объединениями можно
использовать статистические функции, а также какие пра-
вила важно соблюдать при использовании объединений.
Урок 14
Комбинированные
запросы
В этом уроке вы узнаете, как использовать оператор UNION
для комбинирования многих операторов SELECT с целью
получения одного набора результатов.
Создание комбинированных
запросов
Запросы в языке SQL комбинируются с помощью опера-
тора UNION. Оператор UNION позволяет многократно указы-
вать оператор SELECT, и по завершении их работы может
быть выведен один набор результатов.
ВВОД
SELECT cust_name, cust_contact, cust_email
FROM Customers
1 1
WHERE cust state IN (•IL ,'IN ,"MI');
EH
cust_name cust_contact cust email
ВВОД
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust name = 'Fun4All';
ВЫВОД
cust name cust_contact cust_email
Анализ
Первый оператор SELECT выбирает все строки, относя-
щиеся к штатам Иллинойс, Индиана и Мичиган, передавая
аббревиатуры этих штатов в условие IN. Второй оператор
SELECT использует простую проверку на равенство, чтобы
найти все местонахождения в таблицах клиента Fun4All.
Чтобы скомбинировать эти два запроса, выполните сле-
дующее.
ВВОД
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust name = 'Fun4All';
148 Урок 14
ВЫВОД
cust_name cust_contact cust_email
Анализ
Операторы предыдущего примера состоят из обоих
предшествующих операторов SELECT, разделенных ключе-
вым словом UNION. Оператор UNION указывает СУБД вы-
полнить оба оператора SELECT и вывести результаты в виде
одного набора результатов запроса.
Для сравнения приводим тот же самый запрос, исполь-
зующий не оператор UNION, а несколько предложений
WHERE:
ВВОД
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL1,'IN1,'MI')
OR cust_name = •Fun4All';
В нашем простом примере применение оператора UNION
может оказаться более сложным, чем использование пред-
ложения WHERE. Однако если условие фильтрации окажется
более сложным или если понадобится выбирать данные из
многих таблиц (а не только из одной), то оператор UNION
может значительно упростить процесс.
Ограничения оператора U N I O N
ВВОД
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN1,'MI')
UNION ALL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust name = 'Fun4All';
ВЫВОД
cust_name cust_contact cust_email
Анализ
При использовании запроса UNION ALL СУБД не удаляет
дубликаты. Поэтому в предыдущем примере возвращено
пять строк, одна из них повторяется дважды.
U N I O N ИЛИ WHERE
Сортировка результатов
комбинированных запросов
Результат применения оператора SELECT сортируется с
помощью предложения ORDER BY. При комбинировании за-
просов посредством UNION только одно предложение ORDER
может быть использовано, и оно должно появиться после
заключительного оператора SELECT. Практически не имеет
смысла сортировать часть набора результатов одним спосо-
бом, а часть — другим, поэтому несколько предложений
ORDER BY применять не разрешается.
В следующем примере сортируются результаты, полу-
ченные предыдущим запросом UNION:
ВВОД
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL1,•IN1,'MI•)
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = cFun4All'
ORDER BY cust name, cust contact;
152 Урок 14
ВЫВОД
cust_name cust_contact cust_email
Анализ
Этот запрос UNION использует одно предложение ORDEI
BY после заключительного оператора SELECT.
Несмотря на то что ORDER BY является частью толькс
последнего оператора SELECT, на самом деле СУБД буде!
использовать его для сортировки всех результатов, возвра
щенных всеми операторами SELECT.
Резюме
В этом уроке вы узнали, как можно комбинировать за-
просы SELECT посредством оператора UNION. Используя
оператор UNION, вы можете вернуть результаты нескольких
запросов в виде одного комбинированного запроса, вклю-
чающего или исключающего дубликаты. За счет использо-
вания оператора UNION можно значительно упростить
сложные предложения WHERE и одновременно выбирать
данные из многих таблиц.
Урок 15
Добавление данных
В этом уроке вы узнаете, как можно добавлять данные в
таблицы, используя оператор INSERT языка SQL.
Ключевое слово I N T O
Анализ
В этом примере делается в точности то же самое, что и в
предыдущем варианте применения оператора INSERT, но на
этот раз имена столбцов явно указаны в круглых скобках,
следующих после имени таблицы. Когда строка вводится в
таблицу, СУБД устанавливает соответствие каждого пред-
мета в списке столбцов с соответствующим значением в
списке VALUES. Первое значение в списке VALUES соответст-
вует первому указанному имени столбца, второе значение
соответствует имени второго столбца и т.д.
Поскольку имена столбцов предоставлены, условие
VALUES должно подобрать названные имена столбцов в по-
рядке, в котором указаны столбцы, причем не обязательно
в порядке, в каком они следуют в реальной таблице. Пре-
имущество этого способа таково: даже если расположение
столбцов в таблице изменяется, оператор INSERT все равно
будет работать корректно.
156 Урок 15
Аккуратно используйте п р е д л о ж е н и е V A L U E S
Анализ
В примере, приведенном ранее в этом уроке, значения не
предлагаются для двух столбцов, cust_contact и
cust_email. Это означает, что в данном случае нет причин
включать эти столбцы в оператор INSERT. Поэтому данный
оператор INSERT не включает эти два столбца и два соот-
ветствующих им значения.
Попуск столбцов
Вы можете исключать некоторые столбцы из опера-
ции INSERT, если это позволяет делать определение
таблицы. Должно соблюдаться одно из следующих
условий:
• Этот столбец определен как допускающий значе-
ния NULL (отсутствие какого-либо значения).
158 Урок 15
ВВОД
INSERT INTO Customers(cust_id, cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_ZIP,
cust_country
FROM CustNew;
Анализ
В этом примере для импорта всех данных из таблицы
CustNew в таблицу Customers используется оператор
INSERT SELECT. Вместо того чтобы перечислять значения,
которые должны быть добавлены, оператор SELECT выбира-
ет их из таблицы CustNew. Каждый столбец в операторе
SELECT соответствует столбцу в списке указанных столбцов.
Сколько же строк добавит этот оператор? Это зависит от то-
го, сколько строк содержится в таблице CustNew. Если таб-
лица пуста, никакие строки добавлены не будут (и никакое
сообщение об ошибке не будет выдано, поскольку эта опе-
рация остается правомерной). Если таблица содержит дан-
ные, все они будут добавлены в таблицу Customers.
Имена столбцов в операторе INSERT SELECT
Не п о д д е р ж и в а е т с я в D B 2
Анализ
Этот оператор SELECT создает новую таблицу с именем
CustCopy и копирует в нее все содержимое таблицы
Customers.
Поскольку был использован оператор SELECT *, каждый
столбец таблицы Customers будет создан в таблице
CustCopy (и соответственно заполнен). Чтобы скопировать
только часть доступных столбцов, следует явно указать
имена столбцов, а не использовать метасимвол * (звездоч-
ка).
В СУБД MySQL и Oracle используется несколько иной
синтаксис:
ВВОД
CREATE TABLE CustCopy AS
SELECT *
FROM Customers;
Анализ
При использовании оператора SELECT INTO нужно об-
ращать внимание на следующие моменты.
• Можно использовать любые опции и предложения
оператора SELECT, включая WHERE и GROUP BY.
• Для добавления данных из нескольких таблиц можно
использовать объединения.
• Данные можно добавить только в одну таблицу неза-
висимо от того, из скольких таблиц они были извле-
чены.
162 Урок 15
Больше примеров
Вам нужны еще примеры использования оператора
I N S E R T ? Ознакомьтесь со с ц е н а р и я м и заполнения
таблиц, описанными в приложении А.
Резюме
В этом уроке вы узнали о том, как можно добавлять
строки в таблицу базы данных. Вы познакомились с не-
сколькими способами использования оператора INSERT и
узнали, почему желательно явно указывать имена столб-
цов. Вы научились использовать оператор INSERT SELECT
для импорта строк из другой таблицы и применять опера-
тор SELECT INTO для экспорта строк в новую таблицу.
В следующем уроке мы расскажем о том, как для манипу-
лирования данными таблиц следует использовать операто-
ры UPDATE И DELETE.
Урок 16
Обновление и удаление
данных
В этом уроке вы узнаете о том, как нужно использовать
операторы UPDATE и DELETE, позволяющие осуществлять
манипуляции с данными вашей таблицы.
Обновление данных
Для обновления (модификации) данных какой-либо таб-
лицы используется оператор UPDATE. Этот оператор можно
использовать двумя способами:
• для обновления определенной строки таблицы;
• для обновления всех строк таблицы.
Рассмотрим каждый из названных способов.
Не п р о п у с к а й т е п р е д л о ж е н и е WHERE
Удаление данных
Для удаления данных из таблицы применяется оператор
DELETE.
Его можно использовать двумя способами:
• для удаления из таблицы определенных строк;
• для удаления из таблицы всех ее строк.
166 Урок 16
ВВОД
DELETE FROM Customers
WHERE cust_id = '1000000006';
Оператор DELETE FROM требует, чтобы вы указали имя
таблицы, из которой должны быть удалены данные. Пред-
ложение WHERE фильтрует строки, определяя, какие из них
должны быть удалены. В нашем примере должна быть уда-
лена строка, относящаяся к клиенту 1000000006. Если бы
предложение WHERE было пропущено, этот оператор удалил
бы все столбцы таблицы.
Советы по обновлению
и удалению данных
Все операторы UPDATE DELETE, рассмотренные в преды-
дущем разделе, сопровождались предложениями WHERE, и
на это есть очень веская причина. Если вы пропустите
предложение WHERE, оператор UPDATE или DELETE будет
применен по отношению ко всем строкам таблицы. Други-
ми словами, если вы выполните оператор UPDATE без пред-
ложения WHERE, каждая строка таблицы будет заменена но-
выми значениями. Аналогичным образом, если вы выпол-
ните оператор DELETE без предложения WHERE, будет
удалено все содержимое таблицы.
Далее перечислены правила хорошего тона, которым
следуют программисты SQL.
• Никогда не выполняйте оператор UPDATE или DELETE
без предложения WHERE, если только вы на самом де-
ле не хотите обновить или удалить каждую строку.
168 Урок 16
Резюме
В этом уроке вы узнали, как нужно применять операто-
ры UPDATE и DELETE для манипулирования данными таб-
лиц. Вы познакомились с синтаксисом каждого из этих
операторов, а также с опасностями, которыми чревато их
применение. Вы также узнали, почему столь важно исполь-
зовать предложение WHERE в операторах UPDATE и DELETE,
и познакомились с основными правилами, которым нужно
следовать, чтобы по неосторожности не повредить данные.
Урок 17
Создание таблиц
и работа с ними
В этом уроке вы познакомитесь с основными правилами
создания, перестройки и удаления таблиц.
Создание таблиц
Язык SQL используется не только для манипуляций с
данными таблиц, он предназначен для выполнения всех
операций с базами данных и таблицами, включая собствен-
но создание таблиц и работу с ними.
Существует два способа создания таблиц.
• Большинство СУБД сопровождается инструментарием
администратора, который можно использовать для ин-
терактивного создания таблиц базы данных и управ-
ления ими.
• Таблицами можно также манипулировать посредст-
вом операторов языка SQL.
Для создания таблиц программным способом используют
оператор SQL CREATE TABLE. Стоит отметить, что, когда вы
используете интерактивный инструментарий, в действи-
тельности вся работа выполняется операторами SQL. Одна-
ко вам не приходится писать эти операторы; интерфейс
создает и выполняет их незаметно для вас (то же самое
справедливо и для процедуры изменения существующих
таблиц).
170 Урок 17
Разница в синтаксисе
Точный синтаксис оператора CREATE TABLE может
быть несколько различным для разных реализаций
SQL. Обязательно обратитесь к документации своей
СУБД за дополнительной информацией и выясните,
какой в точности синтаксис для нее необходим и ка-
кие возможности она поддерживает.
Анализ
Как видите, имя таблицы указывается сразу же после
ключевых СЛОВ CREATE TABLE.
Определение таблицы (все ее столбцы) заключается в
круглые скобки. Имена столбцов разделяются запятыми.
Приведенная в примере таблица состоит из пяти столбцов.
Определение каждого столбца начинается с имени столбца
(которое должно быть уникальным в пределах данной таб-
лицы), за ним указывается тип данных. (Обратитесь к уро-
ку 1, "Что такое SQL", чтобы вспомнить, что такое типы
данных. Кроме того, в приложении Г, "Использование ти-
пов данных SQL", приведен перечень часто используемых
типов данных и сведения об их совместимости.) Оператор в
целом заканчивается символом "точка с запятой", следую-
щим после закрывающей круглой скобки.
Ранее уже говорилось, что синтаксис оператора CREATE
TABLE весьма различен для разных СУБД, и только что
представленный нами простой сценарий доказывает это.
В СУБД Oracle, PostgreSQL, SQL Server и Sybase представ-
ленный оператор будет работать в той форме, в которой он
представлен в примере, а вот в MySQL тип VARCHAR должен
быть заменен типом t e x t . В DB2 значение NULL следует
удалить из последнего столбца. Именно поэтому нами были
предложены различные сценарии создания таблиц SQL для
каждой СУБД (см. приложение А).
Форматирование оператора
Пробелы игнорируются операторами SQL. Оператор
можно ввести в одной длинной строке или разбить ее
на несколько строк, разницы между ними не будет.
Это позволяет форматировать выражения SQL так,
как вам удобно. Показанный выше оператор CREATE
TABLE — хороший пример форматирования операто-
ра SQL. Код разбит на несколько строк, определения
столбцов разнесены для удобства чтения и редакти-
рования. Форматировать выражения SQL подобным
образом не обязательно, но все же настоятельно ре-
комендуется.
172 Урок 17
Анализ
Посредством этого оператора создается таблица Orders,
неоднократно использованная в книге. Таблица Orders со-
стоит из трех столбцов: номер заказа (order number), дата
С о з д а н и е т а б л и ц и работа с н и м и 173
ВВОД
CREATE TABLE Vendors
(
vend_id CHAR(10) NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50),
vend_city CHAR(50),
vend_state CHAR(5),
vend_ZIP CHAR(10),
vend_country CHAR(50)
Анализ
Посредством этого оператора создается таблица Vendors,
неоднократно используемая в книге. Столбцы с идентифи-
катором поставщика и именем поставщика необходимы,
поэтому оба определены как NOT NULL (т.е. не допускаю-
щие значение NULL). Пять остальных столбцов допускают
значения NULL, поэтому для них не указано требование NOT
NULL. Значение NULL является значением по умолчанию,
поэтому, если не указано требование NOT NULL, предполага-
ется разрешение на использование значения NULL.
Указание значения N U L L
Первичные ключи и з н а ч е н и я N U L L
Анализ
Посредством этого оператора создается таблица
Order I t ems, содержащая отдельные предметы, которые мо-
гут быть заказаны. (Сам заказ хранится в таблице Orders.)
Столбец q u a n t i t y (количество) содержит количество каждо-
го предмета в заказе. В данном примере добавление текста
DEFAULT 1 в описание столбца предписывает СУБД указы-
вать количество, равное 1, если не указано иное.
Значения по умолчанию часто используются для хранения
в столбцах даты и денежных единиц. К примеру, системная
дата может быть использована как дата по умолчанию путем
указания функции или переменной, используемой для ссыл-
ки на системную дату. Например, пользователи MySQL мог-
ли бы указать дату как DEFAULT CURRENT_DATE ( ) , в то вре-
мя как пользователям Oracle следовало бы вводить дату как
DEFAULT SYSDATE, а пользователям SQL Server — как
DEFAULT GETDATE ( ) . К сожалению, команда, используемая
для получения системной даты, в каждой СУБД своя.
В табл. 17.1 приведен синтаксис для нескольких СУБД (если
ваша СУБД не представлена в этом списке, обратитесь к ее
документации).
Таблица 1 7 . 1 . Получение значения даты из системы
СУБД Функция/переменная
Access NOW()
DB2 CURRENT_DATE
MySQL CURRENT_DATE()
Oracle SYSDATE
PostgreSQL CURRENT_DATE
SQL Server GETDATE()
Sybase GETDATE()
Обновление таблиц
Для того чтобы обновить определения таблицы, следует
воспользоваться оператором ALTER TABLE. Хотя все СУБД
поддерживают этот оператор, то, что они при этом позво-
ляют вам делать, в значительной степени зависит от реали-
зации СУБД. Ниже приведены несколько соображений по
поводу применения оператора ALTER TABLE.
• В идеальном случае структура таблицы вообще не
должна меняться после того, как в таблицу введены
данные. Вам придется потратить немало времени,
пытаясь предугадать будущие потребности в процессе
разработки таблиц, чтобы позже не потребовалось
вносить в их структуру существенные изменения.
• Все СУБД позволяют добавлять в уже существующие
таблицы столбцы, но некоторые ограничивают типы
данных, которые могут быть добавлены (а заодно и
использование значений NULL и DEFAULT).
• Многие СУБД не позволяют удалять или изменять
столбцы в таблице.
• Большинство СУБД разрешают переименовывать
столбцы.
• Многие СУБД налагают серьезные ограничения на
изменения, которые могут быть сделаны по отноше-
нию к заполненным столбцам, и несколько мень-
шие — по отношению к незаполненным.
Как видите, вносить изменения в существующие табли-
цы ничуть не проще, чем создавать их заново. Обратитесь к
документации вашей СУБД, чтобы уточнить, что можно
изменять.
Чтобы изменить таблицу посредством оператора ALTER
TABLE, нужно ввести следующую информацию.
• Имя таблицы, подлежащей изменению, после ключе-
вых слов ALTER TABLE. (Таблица с таким именем
должна существовать, иначе будет выдано сообщение
об ошибке.)
• Список изменений, которые должны быть сделаны.
Поскольку добавление столбцов в таблицу — единст-
венная операция, поддерживаемая всеми СУБД,
именно ее мы рассмотрим в качестве примера.
Создание таблиц и работа с ними 177
ВВОД
ALTER TABLE Vendors
ADD vend_j>hone CHAR(20);
Анализ
Посредством этого оператора в таблицу Vendors добав-
ляется столбец, названный vend_phone. Должен быть оп-
ределен тип данных.
Другие операции изменения, например, изменение или
удаление столбцов, введение ограничений или ключей, тре-
буют похожего синтаксиса. (Отметим, что следующий при-
мер будет работать уже не во всех СУБД.)
ВВОД
ALTER TABLE Vendors
DROP COLUMN vend_phone;
Сложные изменения структуры таблицы обычно выпол-
няются вручную и включают следующие шаги.
• Создание новой таблицы с новым расположением
столбцов.
• Использование оператора INSERT SELECT (см.
урок 15, "Добавление данных," в котором подробно
рассмотрены вопросы применения этого оператора)
для копирования данных из старой таблицы в новую.
При необходимости используются функции преобра-
зования и вычисляемые поля.
• Проверка того факта, что новая таблица содержит
нужные данные.
• Переименование старой таблицы (или удаление ее).
• Присвоение новой таблице имени, которое ранее при-
надлежало старой таблице.
• Восстановление триггеров, хранимых процедур, ин-
дексов и внешних ключей, если это необходимо.
178 Урок 17
Удаление таблиц
Удаление таблиц (имеется в виду удаление именно таб
лиц, а не их содержимого) — очень простой процесс. Таб
лицы удаляются с помощью оператора DROP TABLE:
ВВОД
DROP TABLE CustCopy;
Анализ
Этот оператор удаляет таблицу CustCopy (которую вы
создали в ходе изучения материалов урока 15). В данном
случае не требуется никакого подтверждения, невозможнс
возвратиться к прежнему состоянию — в результате приме-
нения этого оператора таблица будет безвозвратно удалена.
Использование реляционных правил для предот-
вращения ошибочного удаления
Во многих СУБД применяются правила, препятст-
вующие удалению таблиц, связанных с другими таб-
лицами. Если эти правила действуют и вы применяе-
те оператор DROP T A B L E ПО отношению к таблице,
которая связана с другой таблицей, СУБД блокирует
проведение этой операции до тех пор, пока не будет
удалена данная связь. Применение этих опций при-
ветствуется, поскольку благодаря им можно воспре-
пятствовать ошибочному удалению нужных таблиц.
Создание таблиц и работа с ними 179
Переименование таблиц
В разных СУБД переименование таблиц осуществляется
по-разному. Не существует жестких, устоявшихся стандар-
тов на выполнение этой операции. Пользователи СУБД
DB2, MySQL, Oracle и PostgreSQL могут применять для
этого оператор RENAME. Пользователи SQL Server и Sybase
могут использовать хранимую процедуру sp_rename. Ос-
новной синтаксис для всех операций переименования тре-
бует указания старого и нового имен. Однако существуют
различия, зависящие от реализации. Обратитесь к докумен-
тации своей СУБД, чтобы узнать подробности относительно
поддерживаемого ею синтаксиса.
Резюме
В этом уроке вы познакомились с несколькими новыми
операторами SQL. Оператор CREATE TABLE применяется для
создания новых таблиц, ALTER TABLE — для изменения
столбцов таблицы (или других объектов, таких как ограни-
чения или индексы), а оператор DROP TABLE позволяет
полностью удалить таблицу. Все эти операторы нужно ис-
пользовать с особой осторожностью и только после создания
резервных копий базы данных. Поскольку точный синтак-
сис этих операторов варьируется в зависимости от СУБД,
вам придется обратиться к документации своей СУБД за
дополнительной информацией.
Урок 18
Использование
представлений
В этом уроке рассказывается о том, что такое представле-
ния, как они работают и когда их можно использовать. Вы
узнаете также, как представления можно использовать для
упрощения некоторых операций SQL, выполненных в про-
шлых уроках.
Создание представлений
Итак, вы знаете, что такое представления (а также от-
части знакомы с правилами, которыми следует руково-
дствоваться при работе с ними), теперь разберемся, как они
создаются.
Представления создаются с помощью оператора CREATE
VIEW. Аналогично оператору CREATE TABLE, оператор
CREATE VIEW можно использовать только для создания
представления, которого до сих пор не существовало.
Удаление представлений
Для удаления представления используется опера-
тор DROP. Его синтаксис прост: DROP VIEW
имя представления;.
186 Урок 18
ВВОД
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, Orderltems
WHERE Customers.cust_id = Orders.cust_id
AND Orderltems.order num = Orders.order num;
Анализ
Посредством этого оператора создается представление,
названное P r o d u c t C u s t o m e r s , которое объединяет три таб-
лицы с целью возвращения списка клиентов, заказавших
какой-то продукт. Если бы был использован оператор
SELECT * FROM P r o d u c t C u s t o m e r s , в список был бы
включен любой клиент, который сделал заказ.
ВВОД
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';
Использование представлений 187
ВЫВОД
cust name cust contact
Анализ
Этот оператор возвращает указанные данные из пред-
ставления в результате применения предложения WHERE.
Когда СУБД обрабатывает запрос, она добавляет указанное
предложение WHERE к каждому уже существующему пред-
ложению WHERE в запросе к представлению, так что данные
фильтруются правильно.
Таким образом, представления могут значительно упро-
стить сложные операторы SQL. Используя представления,
вы можете один раз записать код SQL и затем повторно ис-
пользовать его, если возникает такая необходимость.
Создание повторно используемых представлений
Хорошей идеей является создание представлений, не
привязанных к конкретным данным. Например, пред-
ставление, созданное в предыдущем примере, возвра-
щает имена клиентов, заказавших все продукты, а не
только продукт RGANOI (для которого представление
первоначально и создавалось). Расширение возможно-
стей представления позволяет многократно использо-
вать его, тем самым устраняется также необходимость
создавать и хранить много похожих представлений, что
делает представление еще более эффективным.
ВВОД
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend__country)
Ь+ ' )' AS vend_title
FROM Vendors
ORDER BY vend name;
ВЫВОД
vend t i t l e
ВЫВОД
vendtitle
Ь+ ')' AS v e n d _ t i t l e
FROM Vendors;
Здесь также применяется оператор, использующий син-
таксис I I:
ВВОД
CREATE VIEW VendorLocations AS
SELECT RTRIM(vend_name) || ' (' | |
^RTRIM(vend_country) || ' ) ' AS vend_title
FROM Vendors;
Анализ
Посредством этого оператора создается представление,
использующее в точности тот же самый запрос, как и в
предыдущем операторе SELECT. Для извлечения данных,
необходимых для создания почтовых наклеек, выполните
следующее:
ВВОД
SELECT *
FROM VendorLocations;
ВЫВОД
vend title
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
ВВОД
CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust email IS NOT NULL;
Анализ
Очевидно, отправляя сообщение в соответствии со спи-
ском адресов e-mail, следовало бы пропустить клиентов, у
которых нет адреса электронной почты. Предложение
WHERE отфильтровывает здесь строки, имеющие значения
NULL в столбцах c u s t _ e r a a i l , так что соответствующие за-
писи не будут выбираться.
Теперь представление CustomerEMailList можно ис-
пользовать подобно любой другой таблице.
ВВОД
SELECT *
FROM CustomerEMailList;
ВЫВОД
cust id cust name cust email
П р е д л о ж е н и я WHERE
Использование представлений
с вычисляемыми полями
Представления чрезвычайно полезны для упрощения ис-
пользования вычисляемых полей. Далее приведен оператор
SELECT, впервые использованный нами в уроке 7. Он из-
влекает предметы указанного заказа и вычисляет суммар-
ную стоимость для каждого предмета:
ВВОД
SELECT prod_id,
quantity,
item_price,
quantity*item_jprice AS expanded_price
FROM OrderItems
WHERE order num = 20008;
ВЫВОД
prod_id quantity item_price expanded_price
ВЫВОД
order_num prod_id quantity item_price expanded_price
Резюме
Представления — это виртуальные таблицы. Они не со-
держат данных, вместо данных представления содержат за-
просы, посредством которых данные выбираются в случае
необходимости. Представления обеспечивают должный уро-
вень инкапсуляции SQL-операторов SELECT и могут быть
использованы для упрощения манипулирования данными, а
также для переформатирования данных и ограничения дос-
тупа к ним.
Урок 19
Работа с хранимыми
процедурами
В этом уроке вы узнаете, что такое хранимые процедуры,
для чего и как они используются. Вы также познакомитесь
с основами синтаксиса, используемого при создании и при-
менении хранимых процедур.
Access и MySQL
Хранимые процедуры не поддерживаются в Access.
Кроме того, когда эта книга готовилась к печати,
СУБД MySQL v4.x (текущая версия) также не поддер-
живала хранимые процедуры (их поддержку планиро-
валось осуществить в версии MySQL 5).
Выполнение хранимых
процедур
Хранимые процедуры выполняются намного чаще, чем
пишутся, поэтому мы начнем именно с их выполнения.
Оператор SQL для выполнения хранимой процедуры —
EXECUTE — принимает имя хранимой процедуры и некото-
рые параметры, необходимые для перехода к ней. Посмот-
рите на этот пример:
ВВОД
EXECUTE AddNewProduct ('JTS01' ,
'Stuffed Eiffel Tower',
6.49,
'Plush stuffed toy with the
La Tour Eiffel in red white and blue')
Анализ
Здесь выполняется хранимая процедура по имени
AddNewProduct; она добавляет новый продукт в таблицу
Products. Хранимая процедура AddNewProduct принимает
четыре параметра: идентификатор поставщика (первичный
ключ таблицы Vendors), название продукта, цена и описа-
ние. Эти четыре параметра соответствуют четырем ожидае-
мым переменным хранимой процедуры (определенным как
часть самой хранимой процедуры). Данная хранимая про-
цедура добавляет новую строку в таблицу Products и рас-
пределяет эти передаваемые атрибуты по соответствующим
столбцам.
В таблице Products есть еще один столбец, нуждаю-
щийся в присвоении значения: столбец prod_id, который
является первичным ключом таблицы. Почему это значение
не передается в хранимую процедуру в виде атрибута? Для
того чтобы идентификаторы генерировались правильно,
безопаснее сделать этот процесс автоматизированным (и не
полагаться на конечного пользователя). Именно поэтому
хранимая процедура используется в этом примере, она вы-
полняет следующие действия.
• Подтверждает правильность передаваемых данных,
обеспечивая наличие значений у всех четырех пара-
метров.
198 Урок 19
Анализ
Эта хранимая процедура принимает один параметр, на-
зываемый ListCount. Вместо того чтобы передавать значе-
ние в хранимую процедуру, этот параметр передает значе-
ние из нее. Ключевое слово OUT указывает ей вести себя по-
добным образом. СУБД Oracle поддерживает параметры
типов IN (которые передаются в хранимые процедуры), OUT
(они передаются из хранимых процедур) и INOUT (они ис-
пользуются для передачи параметров в хранимые процеду-
ры и из них). Собственно код хранимой процедуры заклю-
чен между BEGIN и END, и здесь для выборки клиентов,
имеющих адреса электронной почты, выполняется простой
оператор SELECT. Затем передаваемому выходному пара-
метру ListCount присваивается значение, равное количест-
ву строк в выборке.
А вот версия для Microsoft SQL:
ВВОД
CREATE PROCEDURE MailingListCount
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;
Анализ
Эта хранимая процедура вообще не принимает парамет-
ров. Вызываемое приложение выбирает нужное значение,
пользуясь тем, что в СУБД SQL Server поддерживается воз-
вращение кода. Здесь посредством оператора DECLARE объ-
явлена локальная переменная @cnt (имена всех локальных
переменных в SQL Server начинаются с символа @). Эта пе-
ременная затем используется в операторе SELECT, так что
он содержит значение, возвращаемое функцией COUNT ().
Наконец, оператор RETURN используется для возвращения
результатов подсчета в вызывающее приложение — RETURN
@cnt.
Приведем еще один пример, на этот раз мы будем добав-
лять новый заказ в таблицу Orders. Этот пример подходит
только для SQL Server, но он хорошо показывает, как нуж-
но использовать хранимые процедуры:
200 Урок 19
ВВОД
CREATE PROCEDURE NewOrder @cust_id CHAR(10)
AS
-- Объявление переменной для номера заказа
DECLARE @order_num INTEGER
-- Получение текущего наибольшего номера заказа
SELECT @order_num=MAX(order_num)
FROM Orders
Determine next order number
SELECT @order_num=@order_num+l
-- Добавление нового заказа
INSERT INTO Orders(order_num order_date, cust_id)
VALUES(@order_num, GETDATE() @cust id)
-- Возвращение номера заказа
RETURN ©order nura;
Анализ
Эта хранимая процедура создает новый заказ в таблице
Orders. Она принимает один параметр — идентификатор
клиента, сделавшего заказ. Два других столбца таблицы,
номер и дата заказа, генерируются автоматически в самой
хранимой процедуре. Вначале в коде объявляется локаль-
ная переменная для хранения номера заказа. Затем выби-
рается текущий наибольший номер заказа (посредством
функции МАХ ()) и увеличивается на единицу (с помощью
оператора SELECT). После этого добавляется заказ посредст-
вом оператора INSERT с использованием только что сгене-
рированного номера заказа, выбирается текущая системная
дата (с помощью функции GETDATE ()) и передается иден-
тификатор клиента. Наконец, номер заказа (необходимый
для обработки предметов заказа) возвращается как RETURN
@order_nura. Отметим, что код снабжен комментариями, это
всегда следует делать при написании хранимых процедур.
ВВОД
CREATE PROCEDURE NewOrder @cust_id CHAR(10)
AS
-- Добавление нового заказа
INSERT INTO Orders(cust_id)
VALUES(@cust_id)
-- Возвращение номера заказа
SELECT order num = ©©IDENTITY;
Анализ
Эта хранимая процедура также создает новый заказ в
таблице O r d e r s . На этот раз СУБД сама генерирует номер
заказа. Большинство СУБД поддерживают такой тип функ-
циональности; SQL Server обращается к этим автоинкре-
ментируемым столбцам как к полям I d e n t i t y (другие
СУБД используют такие имена, как Auto Number или
Sequences). Опять же, передается только один параметр:
идентификатор клиента, сделавшего заказ. Номер и дата за-
каза не указываются вообще — СУБД использует значение
по умолчанию для даты (функция GETDATE ()), а номер зака-
за генерируется автоматически. Как можно узнать, кокой
идентификатор пользователя был сгенерирован? В СУБД SQL
Serer для этого используется глобальная переменная
©©IDENTITY, возвращаемая в вызывающее приложение (на
этот раз с использованием оператора SELECT).
Как видите, хранимые процедуры очень часто позволяют
решить одну и ту же задачу разными способами. Метод, ко-
торый вы выберете, во многом будет зависеть от особенно-
стей СУБД, которую вы используете.
202 Урок 19
Резюме
В этом уроке вы узнали, что такое хранимые процедуры
и для чего они используются. Вы также познакомились с
основами синтаксиса, применяемого для выполнения и соз-
дания хранимых процедур, и узнали о некоторых способах
их использования. Возможно, в вашей СУБД форма выпол-
нения этих функций будет несколько иной и в ваше распо-
ряжение будут предоставлены возможности, не упомянутые
в этой книге. За дополнительной информацией рекоменду-
ем обратиться к документации вашей СУБД.
Урок 20
Обработка транзакций
В этом уроке вы узнаете, что такое транзакции и как ис-
пользовать операторы COMMIT и ROLLBACK для их обработки.
Управляемые транзакции
Теперь, когда вы знаете, что такое обработка транзак-
ций, перейдем к управляемым транзакциям.
Различия в реализациях
Точный синтаксис, используемый для обработки
транзакций, для разных СУБД различен. Прежде чем
заняться такой обработкой, обратитесь к документа-
ции своей СУБД.
Анализ
В этом примере все операторы, заключенные между
BEGIN TRANSACTION И COMMIT TRANSACTION, ДОЛЖНЫ быть
или выполнены, или не выполнены.
Эквивалентный код для MySQL таков:
Обработка транзакций 207
ВВОД
START TRANSACTION
ВВОД
В СУБД PostgreSQL используется синтаксис ANSI SQL:
ввод
BEGIN;
Анализ
В этом примере выполняется и сразу же, посредством
оператора ROLLBACK, аннулируется операция DELETE. Хотя
это и не самый полезный пример, он все равно показывает,
что, будучи включенными в блок транзакции, операции
DELETE (а также INSERT и UPDATE) не являются оконча-
тельными.
Анализ
В этом примере для SQL Server заказ номер 12345 пол-
ностью удаляется из системы. Поскольку это приводит к
обновлению двух таблиц базы данных, Orders и
Orderltems, блок транзакции применяется для того, чтобы
заказ не мог быть удален лишь частично. Конечный опера-
тор COMMIT записывает изменения только в случае, если не
произошло ошибки. Если первый оператор будет выполнен,
а второй, из-за ошибки, не выполнен, удаление не будет
зафиксировано.
Чтобы выполнить то же самое в СУБД Oracle, нужно
сделать следующее:
ВВОД
DELETE Orderltems WHERE order_num = 12345;
DELETE Orders WHERE order_num = 12345;
COMMIT;
ВВОД
SAVEPOINT deletel;
В SQL Server и Sybase нужно сделать следующее:
ВВОД
SAVE TRANSACTION deletel;
Каждая точка сохранения должна иметь уникальное
имя, идентифицирующее ее таким образом, чтобы, когда
вы выполняете отмену, СУБД "знала", в какую точку она
должна вернуться. Чтобы выполнить отмену действия всех
операторов после этой точки, в СУБД SQL Server нужно
выполнить следующее:
ВВОД
ROLLBACK TRANSACTION deletel;
В MySQL и Oracle можно сделать так:
ВВОД
ROLLBACK TO deletel;
А вот полный пример для SQL Server:
ВВОД
BEGIN TRANSACTION
INSERT INTO Customers(cust_id, cust_name)
VALUES(4000000010', 'Toys Emporium');
SAVE TRANSACTION StartOrder;
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20100,'2001/12/1','1000000010');
IF @@ERROR о 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO Orderltems(order_num, order_item,
(
i>prod_id, quantity, item_price)
VALUES(20010, 1, 'BR011, 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO Orderltems(order_num, order_item,
4>prod_id, quantity, item_price)
1
VALUES(20010, 2, 'BR03 , 100, 10.99);
210 Урок 20
Анализ
Здесь имеется набор, состоящий из четырех операторо!
INSERT, включенных в блок транзакции. Точка сохранения
определена после первого оператора INSERT, так что еслк
какая-то из последующих операций INSERT закончится не-
удачей, отмена транзакции произойдет лишь до этой точки
В SQL Server для контроля успешности завершения какой
либо операции может быть использована переменная с име-
нем @@ERROR. (В других СУБД используются иные функция
или переменные для возвращения такой информации.) Ес-
ли переменная @@ERROR возвращает значение, отличное oi
О, значит, произошла ошибка и транзакция отменяется дс
точки сохранения. Если обработка транзакции в целом за-
вершается успешно, выполняется операция COMMIT для со-
хранения данных.
Чем больше точек сохранения, тем лучше
Вы можете создать столько точек сохранения в ва-
шем SQL-коде, сколько захотите, и чем больше, тем
лучше. Почему? Потому что чем больше у вас точек
сохранения, тем большая гибкость вам доступна в
управлении отменами.
Резюме
Транзакции представляют собой блоки из операторов
SQL, которые должны выполняться в пакетном режиме (все
вместе). Вы познакомились с правилами использования
операторов COMMIT и ROLLBACK для явного управления про-
цессами записи и отмены результатов операций. Вы также
узнали, как нужно использовать точки сохранения для
обеспечения более высокой степени контроля за выполне-
нием операций отмены.
Урок 21
Использование
курсоров
В этом уроке вы узнаете, что такое курсоры и как ими
пользоваться.
Результирующее множество
Результаты, возвращаемые в ответ на SQL-запрос.
Поддержка в MySQL
В то время, когда эта книга готовилась к печати, СУБД
MySQL еще не поддерживала курсоры (поддержку
для них планируется ввести в MySQL 5).
Работа с курсорами
Работу с курсором можно разделить на несколько четко
выраженных стадий.
• Прежде чем курсор может быть использован, его сле-
дует объявить (определить). В ходе этого процесса
выборка данных не производится, просто определяет-
ся оператор SELECT, который будет использован, и
некоторые опции курсора.
• После объявления курсор может быть открыт для ис-
пользования. В ходе этого процесса уже производится
выборка данных согласно предварительно определен-
ному оператору SELECT.
• После того как курсор заполнен данными, могут быть
извлечены (выбраны) отдельные необходимые строки.
• После того как это сделано, курсор должен быть за-
крыт и, возможно, должны быть освобождены ресур-
сы, которые он занимал (в зависимости от СУБД).
214 Урок 21
Создание курсоров
Курсоры создаются с помощью оператора DECLARE, сив
таксис которого различен для разных СУБД. Операто
DECLARE дает курсору имя и принимает оператор SELEd
дополненный при необходимости предложением WHERE :
другими. Чтобы показать, как это работает, мы создадим
курсор, который будет делать выборку всех клиентов, н
имеющих адресов электронной почты, в виде части прилс
жения, позволяющего служащему вводить недостающие ад
реса.
Приведенная версия подходит для DB2, SQL Server i
Sybase:
ВВОД
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust email IS NULL
А вот версия для Oracle и PostgreSQL:
ВВОД
DECLARE CURSOR CustCursor
IS
SELECT * FROM Customers
WHERE cust email IS NULL
Анализ
В обеих версиях для определения имени курсора исполь
зуется оператор DECLARE — в данном случае это будет им*
CustCursor. Оператор SELECT определяет курсор, содер
жащий имена всех клиентов, которые не имеют адрес*
электронной почты (соответствующее значение равно NULL).
Теперь, после того как курсор определен, его можно от
крыть.
Использование курсоров 215
Использование курсоров
Курсоры открываются с помощью оператора OPEN
i^JRSOR, синтаксис которого настолько прост, что его под-
{ерживают большинство СУБД:
)PEN CURSOR CustCursor
При обработке оператора OPEN CURSOR выполняется за-
ipoc, и выборка данных сохраняется для последующих
фосмотра и прокрутки.
Теперь доступ к данным этого курсора может быть по-
гучен с помощью оператора FETCH. Оператор FETCH указы-
вает строки, которые должны быть выбраны, откуда они
щ ж н ы быть выбраны и где их следует сохранить (имя пе-
ременной, например). В первом примере используется син-
таксис Oracle для выборки одной строки курсора (первой).
ВВОД
DECLARE TYPE CustCursor IS REF CURSOR
Ь RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
3EGIN
OPEN CustCursor;
FETCH CustCursor INTO CustRecord;
CLOSE CustCursor;
END;
Анализ
В данном примере оператор FETCH используется для вы-
борки текущей строки (автоматически он начнет с первой
строки) в переменную, объявленную с именем CustRecord.
С выбранными данными ничего не делается.
В следующем примере (в нем вновь используется син-
таксис Oracle) выбранные данные подвергаются цикличе-
ской обработке от первой строки до последней:
ВВОД
DECLARE TYPE CustCursor IS REF CURSOR
•^ RETURN CuStomers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
LOOP
FETCH CustCursor INTO CustRecord;
EXIT WHEN CustCursor%NOTFOUND;
216 Урок 21
END LOOP;
CLOSE CustCursor;
END;
Анализ
Аналогично предыдущему примеру, здесь используете
оператор FETCH для выборки текущей строки в перемер
ную, объявленную с именем CustRecord. Однако в отличи
от предыдущего примера, здесь оператор FETCH находите
внутри цикла LOOP, так что он выполняется снова и снов*
Код EXIT WHEN CustCursor%NOTFOUND указывает, что это
процесс должен быть завершен (выход из цикла), когд
больше не останется строк для выборки. В этом пример
также не выполняется никакой обработки, тогда как в р(
альном коде вам следовало бы заменить . . . вашим co6ci
венным кодом.
Вот другой пример, на этот раз с использованием сиь
таксиса Microsoft SQL Server:
ВВОД
DECLARE @cust_id CHAR(10),
@cust_name CHAR(50),
@cust_address CHAR(50),
@cust_city CHAR(50),
@cust_state CHAR(5),
@cust_ZIP CHAR(10),
@cust_country CHAR(50),
@cust_contact CHAR(50),
@cust_email CHAR(255),
OPEN CustCursor
FETCH NEXT FROM CustCursor
INTO @cust_id, @cust_name, @cust_address,
@cust_city, @cust_state, @cust_ZIP,
@cust_country, @cust_contact, @cust_email
WHILE @@FETCH_STATUS = 0
BEGIN
Анализ
В этом примере переменные объявляются для каждого
из выбираемых столбцов, а операторы FETCH осуществляют
выборку строки и сохранение значений в этих переменных.
Цикл WHILE используется для организации цикла по стро-
кам, а условие WHILE @@FETCH_STATUS = 0 обеспечивает
завершение обработки (выход из цикла) после того как все
строки будут извлечены. И вновь этот пример ничего на
самом деле не обрабатывает. В реальном коде нужно заме-
нить . . . вашим собственным кодом.
Закрытие курсоров
Как следует из предыдущих примеров, после использо-
вания курсоров их нужно закрывать. Кроме того, в некото-
рых СУБД (таких как SQL Server) требуется, чтобы ресур-
сы, занятые курсором, были освобождены явным образом.
Вот соответствующий синтаксис для СУБД DB2, Oracle и
PostgreSQL:
ВВОД
CLOSE CustCursor
А это синтаксис для Microsoft SQL Server:
ВВОД
CLOSE CustCursor
DEALLOCATE CURSOR CustCursor
Для закрытия курсора используется оператор CLOSE; по-
сле того как курсор закрыт, его нельзя использовать, не
открыв перед этим вновь. Однако его не нужно объявлять
заново при повторном использовании, достаточно оператора
OPEN.
Резюме
В этом уроке вы узнали, что такое курсоры и как их ис-
пользуют. В вашей СУБД, возможно, эти функции выпол-
няются несколько иначе, а также доступны функции, не
упомянутые в книге. За дополнительной информацией вам
следует обратиться к документации вашей СУБД.
Урок 22
Расширенные
возможности SQL
В этом уроке мы рассмотрим несколько расширенных воз-
можностей манипулирования данными: ограничения, ин-
дексы и триггеры.
„Ограничения
Правила, регламентирующие ввод данных в базу дан-
ных и манипуляцию ими.
Предупреждение
Существует несколько типов ограничений, и каждая
СУБД обеспечивает свой собственный уровень их
поддержки. Следовательно, примеры, приведенные
ниже, могут работать не так, как вы предполагаете.
Обратитесь к документации своей СУБД, прежде чем
выполнять их.
Первичные ключи
О первичных ключах мы рассказывали в уроке 1, "Что
такое SQL". Первичный ключ — это особое ограничение,
применяемое для того, чтобы значения в столбце (или на-
Расширенные возможности SQL 221
Анализ
В этом примере в определение таблицы добавлено клю-
чевое слово PRIMARY KEY, так что столбец vend_id стано-
вится первичным ключом.
222 Урок 22
ВВОД
ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY (vend id);
Анализ
Здесь в качестве первичного ключа определен тот же са-
мый столбец, но использован синтаксис CONSTRAINT. Этот
синтаксис может быть использован в операторах CREATE
TABLE И ALTER TABLE.
Внешние ключи
Внешний ключ — это столбец одной таблицы, значения
которого совпадают со значениями столбца, являющегося
первичным ключом другой таблицы. Внешние ключи —
очень важная часть механизма обеспечения ссылочной цело-
стности данных. Чтобы разобраться в том, что собой пред-
ставляют внешние ключи, рассмотрим следующий пример.
Таблица Orders содержит единственную строку для ка-
ждого заказа, зафиксированного в базе данных. Информа-
ция о клиенте хранится в таблице Customers. Заказы в
таблице Orders связаны с определенными строками в таб-
лице Customers за счет идентификатора клиента. Иденти-
фикатор клиента является первичным ключом в таблице
Customers; каждый клиент имеет уникальный идентифи-
катор. Номер заказа является первичным ключом в табли-
це Orders; каждый заказ имеет свой уникальный номер.
Значения в столбце таблицы Orders, содержащем иден-
тификаторы клиентов, не обязательно уникальные. Если
клиент сделал несколько заказов, может быть несколько
строк с тем же самым идентификатором клиента (хотя ка-
ждая из них будет иметь свой номер заказа). В то же время
единственные значения, которые могут появиться в столбце
идентификаторов клиента таблицы Orders, — это иденти-
фикаторы клиентов из таблицы Customers.
Именно так и образуются внешние ключи. В нашем
примере внешний ключ определен как столбец идентифи-
каторов клиента, содержащихся в первичном ключе табли-
цы Customers, так что этот столбец может принимать
только значения, имеющиеся в первичном ключе таблицы
Customers.
Расширенные возможности SQL 223
Анализ
Это определение таблицы, использующее ключевое слово
REFERENCES для утверждения того факта, что любое значе-
ние в столбце cust_id должно быть также и в столбце
cust_id таблицы Customers.
Того же результата можно было бы добиться с использо-
ванием синтаксиса CONSTRAINT в операторе ALTER TABLE:
ВВОД
ALTER TABLE Customers
ADD CONSTRAINT
FOREIGN KEY (cust id) REFERENCES Customers (cust id)
Ограничения уникальности
Ограничения уникальности обеспечивают уникальность
всех данных в столбце (или в наборе столбцов). Такие
столбцы похожи на первичные ключи, но имеются и важ-
ные отличия.
• Таблица может содержать множество ограничений
уникальности, но у нее должен быть только один
первичный ключ.
• Столбцы с ограничением уникальности могут содер-
жать значения NULL.
• Столбцы с ограничением уникальности можно моди-
фицировать и обновлять.
• Значения столбцов с ограничением уникальности
можно использовать повторно.
• В отличие от первичных ключей, ограничения уни-
кальности не могут быть использованы для определе-
ния внешних ключей.
Примером использования ограничения может служить
таблица с данными о служащих. Каждый из них имеет
свой уникальный номер карточки социального страхования,
но вы вряд ли будете использовать его в качестве первично-
го ключа, поскольку он слишком длинный (и, кроме того,
вы вряд ли захотите сделать эту информацию легко доступ-
ной). Поэтому каждому служащему присваивается уни-
кальный идентификатор (первичный ключ) в дополнение к
его номеру карточки социального страхования.
Поскольку идентификатор служащего является первич-
ным ключом, вы можете быть уверены в том, что он уни-
кален. К примеру, для того чтобы СУБД проверила уни-
Расширенные возможности SQL 225
Анализ
После применения этого ограничения каждая добавляе-
мая (или обновляемая) строка будет проверяться на пред-
мет того, что количество предметов больше нуля.
Чтобы проконтролировать тот факт, что в столбце с на-
именованием пола может содержаться только буква М или
F, можно сделать следующее в операторе ALTER TABLE:
ВВОД
ADD CONSTRAINT CHECK ( g e n d e r LIKE ' [MF] ' )
Анализ
Каждый индекс должен иметь уникальное имя. В данном
случае оно определено как prod_name_ind после ключевых
слов CREATE INDEX. Ключевое слово ON используется для
указания таблицы, которая должна быть проиндексирована,
столбцы, включаемые в индекс (в нашем примере он один),
указываются в круглых скобках после имени таблицы.
Пересмотр индексов
Эффективность индексов снижается, если в таблицу
добавляются данные или происходит их обновление.
Многие администраторы баз данных считают так: то,
что когда-то было идеальным набором индексов, мо-
жет перестать быть таковым после нескольких меся-
цев манипуляции с данными. Целесообразно регу-
лярно пересматривать индексы и при необходимости
осуществлять их точную настройку;
Поддержка в MySQL
Когда эта книга готовилась к печати, СУБД MySQL
еще не поддерживала триггеры (их поддержку плани-
ровалось ввести в версии MySQL 5.1).
Резюме
В этом уроке вы узнали, как можно реализовать некото-
рые расширенные возможности SQL. Ограничения — важ-
ная часть системы принудительного обеспечения целостно-
сти ссылочных данных, индексы могут улучшить характе-
Расширенные возможности SQL 233
Сценарии
демонстрационных
таблиц
Процесс написания операторов SQL требует хорошего
знания структуры базы данных. Без знания того, какая
информация в какой таблице хранится, как таблицы соот-
носятся одна с другой и как распределены данные в стро-
ках, невозможно написать эффективный SQL-код.
Вам настоятельно рекомендуется выполнить в реальных
условиях каждый пример каждого урока этой книги. Во
всех уроках используется один и тот же набор файлов с
данными. Чтобы вам было легче разобраться в этих приме-
рах и выполнять их по мере изучения материала, в этом
приложении описываются используемые таблицы, отноше-
ния между ними и способы построения таблиц (или их по-
лучения).
Упрощенные образцы
Таблицы, используемые в книге, нельзя назвать пол-
ными. Реальная система регистрации заказов храни-
ла бы множество других данных, не включенных в
представленные таблицы (например, платежи и дан-
ные учета, сведения об отгрузке и многие другие).
Однако с помощью этих таблиц будет наглядно пока-
зано, как организовываются данные и отношения ме-
жду таблицами в реальных условиях. Вы сможете
применить эти методы и технологии по'отношению к
вашим собственным базам данных.
Описания таблиц
Далее будут представлены каждая из пяти таблиц с ука-
занием имен столбцов каждой таблицы и их описаниями.
Таблица Vendors
В таблице Vendors хранятся данные о поставщиках,
продукты которых продаются. Для каждого поставщика в
этой таблице имеется запись, а столбец с идентификатором
поставщика (vend_id) используется для указания соответ-
ствия между продуктами и поставщиками.
Таблица. А.1. Столбцы таблицы columns
Столбец Описание
vend_id "Уникальный идентификатор (ID) поставщика
vend_name Имя поставщика
vend_address Адрес поставщика
vend_city Город поставщика
vend_state Штат поставщика
vend_ZIP ZIP-код поставщика
vend_country Страна поставщика
Сценарии демонстрационных таблиц 2 3 7
Таблица Products
Таблица Products содержит каталог продуктов, по од-
ному продукту в строке. Каждый продукт имеет уникаль-
ный идентификатор (в столбце prod_id) и связан с соответ-
ствующим поставщиком через vend_id (уникальный иден-
тификатор поставщика).
Таблица А.2. Столбцы таблицы Products
Столбец Описание
prod_id Уникальный идентификатор (ID) продукта
vend_id Идентификатор поставщика продукта (соответст-
вует столбцу vend_id таблицы Vendors)
prod_name Название продукта
prod_price Цена продукта
prod_desc Описание продукта
Таблица Customers
В таблице Customers хранится информация обо всех
клиентах. Каждый из них имеет уникальный идентифика-
тор (столбец cust_id).
Таблица А.З. Столбцы таблицы Customers
Столбец Описание
cust_id Уникальный идентификатор клиента
cust_name Имя клиента
cust_address Адрес клиента
cust_city Город клиента
238 Приложение А
Столбец Описание
cust_state Штат клиента
cust_ZIP ZIP-код клиента
cust_country Страна клиента
cust_contact Контактное имя клиента
cust_email Контактный адрес электронной почты клиента
Таблица Orders
В таблице Orders хранится информация о заказах кли-
ентов (без подробностей). Каждый заказ пронумерован с со-
блюдением правила уникальности (столбец order_num). За-
казы связаны с соответствующими клиентами через столбец
cust_id (который связан с уникальным идентификатором
клиента в таблице Customers).
Таблица А.4. Столбцы таблицы Orders
Столбец Описание
order_num Уникальный номер заказа
order_date Дата заказа
cust_id Идентификатор клиента, сделавшего заказ (свя-
зан со столбцом cust_id таблицы Customers)
Таблица Orderltems
В таблице Orderltems хранятся предметы каждого за-
каза, для каждого предмета каждого заказа выделено по
одной строке. Каждой строке таблицы Orders соответствует
Сценарии демонстрационных таблиц 2 3 9
Получение демонстрационных
таблиц
Чтобы попрактиковаться в выполнении представленных
в книге примеров, вам нужен будет набор заполненных
таблиц. Все, что вам необходимо получить и испытать,
можно найти на Web-странице этой книги по адресу
http://www.forta.com/books/0672325675/.
240 Приложение А
Работа с популярными
приложениями
Как говорилось в уроке 1, "Что такое SQL," SQL — это
не приложение, но язык. Для того чтобы выполнить при-
меры этой книги, вам необходимо приложение, поддержи-
вающее выполнение SQL-операторов.
В приложении Б описываются шаги по выполнению
операторов SQL в некоторых наиболее часто используемых
приложениях.
Вы можете использовать любое приложение из числа
указанных ниже, а также многие другие для проверки SQL-
кода и экспериментирования с ним. Итак, какое же при-
ложение использовать?
• Многие СУБД поставляются со своими собственными
клиентскими утилитами, с ними вполне можно начи-
нать работу. Однако для них не характерен интуи-
тивно понятный пользовательский интерфейс.
• Пользователи Windows, возможно, установили на
своем компьютере утилиту Microsoft Query. Эта про-
стая утилита очень хороша для проверки простых
операторов.
• Прекрасная альтернатива для пользователей Windows —
Query Tool Джорджа Пулоса (George Poulose). Ссылку
можно найти на Web-странице книги по адресу
http://www.forta.com/books/0672325667/.
• Aqua Data Studio — чрезвычайно полезная бесплат-
ная Java-утилита, которая работает под управлением
Windows, Linux, Unix, Mac OSX и других операцион-
ных систем. Ссылку на эту утилиту можно найти на
Web-странице книги по адресу h t t p : //www. f o r t a .
com/books/0672325667/.
Любая из названных утилит будет хорошим выбором. За
дополнительными рекомендациями обратитесь к Web-стра-
нице этой книги.
244 Приложение Б
1
ODBC (сокр. от Open DataBase Connectivity) — открытый интер-
фейс доступа к базам данных, встроенный в Windows и Windows NT,
определяет набор функций, которые можно использовать для доступа
к любой реляционной СУБД. — Прим. ред.
Работа с популярными приложениями 245
Использование DB2
СУБД DB2 компании IBM — это мощная высокопроиз-
водительная многоплатформенная СУБД. Она поставляется
с целым набором клиентских инструментов, которые могут
быть использованы для выполнения операторов SQL.
Приведенные ниже инструкции предназначены для Java-
утилиты Command Center — одной из самых простых и
наиболее универсальной среди всех приложений.
1. Запустите Command Center.
2. Выберите вкладку Script.
3. Введите оператор SQL в поле Script.
4. Выберите команду Execute в меню Script или щелкни-
те на кнопке Execute, чтобы выполнить этот сцена-
рий.
5. Результирующие данные в необработанном виде будут
отображены в нижнем окне. Перейдите на вкладку
Results, чтобы отобразить результаты в виде таблицы.
6. Command Center предлагает также интерактивный фор-
мирователь SQL-операторов, называемый SQL Assist.
Его можно запустить из вкладки Interactive.
Использование Macromedia
ColdFusion
ColdFusion компании Macromedia представляет собой
платформу для разработки Web-приложений.
ColdFusion использует для создания сценариев язык, ос-
нованный на дескрипторах (тегах). Чтобы протестировать
ваш SQL-код, создайте простую страницу, которую вы смо-
жете отобразить, вызвав ее посредством своего Web-брау-
зера. Выполните следующие шаги:
1. Прежде чем вы сможете обращаться к каким-либо ба-
зам данных из ColdFusion, должен быть определен ис-
точник данных (Data Source). Программа ColdFusion
Administrator обеспечивает Web-интерфейс для опре-
деления источников данных (обратитесь за помощью к
документации ColdFusion, если это необходимо).
246 Приложение Б
Использование Microsoft
Access
Microsoft Access обычно используется интерактивно для
создания баз данных, управления, манипулирования и
взаимодействия с данными, a Access предлагает еще и кон-
структор запросов (Query Designer), который можно ис-
пользовать для интерактивного построения операторов SQL.
Зачастую остающаяся невыявленной возможность конст-
руктора запросов состоит в том, что он также позволяет
вводить SQL-код для немедленного выполнения. Благодаря
этому Access можно использовать для передачи операторов
SQL любому источнику данных ODBC, хотя больше всего
эта программа подходит для выполнения SQL-кода в уже
открытой базе данных. Для того чтобы использовать на-
званную возможность, сделайте следующее.
1. Запустите Microsoft Access. Вам предложат открыть
(или создать) базу данных. Откройте базу данных,
которую вы собираетесь использовать.
2. Выберите меню Запросы в окне с названием вашей
базы данных, а затем дважды щелкните на ссылке
Создание запроса в режиме конструктора (либо щелк-
ните на кнопке Создать и выберите в появившемся
окне пункт Конструктор).
Работа с популярными приложениями 2 4 7
Использование Microsoft
ASP.NET
Microsoft ASP.NET — это платформа подготовки сцена-
риев для создания Web-приложений с использованием тех-
нологии .NET. Чтобы протестировать операторы SQL на
странице ASP.NET, создайте страницу, которую можно ото-
бразить, вызвав ее посредством браузера. Это можно сде-
лать разными способами, ниже описан один из них.
1. Создайте новый файл с расширением . aspx.
2. Создайте подключение к базе данных, используя
функцию SqlConnectionO или OleDbConnectionO .
3. Используйте функцию SqlCommand () или
OleDbCommand () для передачи оператора в СУБД.
250 Приложение Б
Использование MySQL
СУБД MySQL поставляется вместе с утилитой командной
строки, называемой mysql. Это сугубо текстовое средство
создания запросов, которое можно использовать для вы-
полнения любых операторов SQL. Чтобы воспользоваться
утилитой mysql, выполните следующее.
1. Введите mysql, чтобы запустить эту утилиту. В зави-
симости от ограничений, налагаемых системой безо-
пасности, вам может понадобиться использовать па-
раметры -и и -р, чтобы ввести регистрационную ин-
формацию.
2. В ответ на приглашение mysql > введите USE ба-
за_данных, указывая тем самым имя базы данных,
которая будет использоваться.
3. Введите ваш SQL-код после приглашения mysql >,
проверив, чтобы каждый оператор заканчивался точ-
кой с запятой (;). Результаты будут отображены на
экране.
4. Введите \h для получения списка команд, которые
вы можете использовать, и \s для получения инфор-
мации о статусе (включая информацию о версии
MySQL).
5. Введите \q для выхода из утилиты mysql.
Использование Oracle
СУБД Oracle поставляется с основанным на Java-
технологии средством управления, которое называется
Enterprise Manager. На самом деле это набор инструментов,
один из которых называется SQL*Plus Worksheet. Ниже
рассказано, как им нужно пользоваться.
Работа с популярными приложениями 253
Использование РНР
РНР — это популярный язык написания Web-сценариев.
РНР предлагает функции и библиотеки, используемые для
подключения к различным базам данных, а поэтому код,
используемый для выполнения операторов SQL, может ме-
няться в зависимости от того, какая СУБД используется
(и как к ней осуществляется доступ). А раз так, то невоз-
можно предложить пошаговые инструкции, которые годи-
лись бы для любой ситуации. Обратитесь к документации
РНР за инструкциями по подключению именно к вашей
СУБД.
Использование PostgreSQL
PostgreSQL поставляется с утилитой командной строки,
которая называется psql. Это — сугубо текстовое средство
создания запросов, которое можно использовать для вы-
полнения любых операторов SQL. Для того чтобы восполь-
зоваться утилитой psql, выполните следующее.
1. Введите psql, чтобы запустить утилиту. Чтобы загру-
зить конкретную базу данных, укажите ее в команд-
ной строке как psql база_данных (PostgreSQL не
поддерживает команду USE).
2. Введите ваш SQL-код в ответ на приглашение =>,
убедившись в том, что каждый оператор заканчивает-
ся точкой с запятой (;). Результаты будут отображе-
ны на экране.
254 Приложение Б
2
ADO (сокр. от ActiveX Data Objects) — технология доступа к
данным, включающая набор высокоуровневых интерфейсов, которые
позволяют разработчикам обращаться к данным на любом языке про-
граммирования. — Прим. ред.
Работа с популярными приложениями 255
Использование Sybase
Sybase Adaptive Server поставляется с Java-утилитой
SQL Advantage. Данная утилита очень похожа на Query
Analyzer, поставляемую вместе с СУБД Microsoft SQL
Server (эти продукты имеют общее прошлое). Для того что-
бы воспользоваться SQL Advantage, выполните следующее:
1. Вызовите приложение SQL Advantage.
2. Получив предложение зарегистрироваться, введите
свое регистрационное имя и пароль.
3. После того как появится окно для ввода запроса, вы-
берите базу данных в раскрывающемся списке.
4. Введите в появившемся окне ваш SQL-код.
5. Чтобы выполнить запрос, щелкните на кнопке
Execute, выберите команду Execute Query в меню
Query или нажмите <Ctrl+E>.
6. Результаты (если они есть) будут отображены в новом
окне.
Конфигурирование источников
данных ODBC
Несколько приложений из числа описанных выше ис-
пользуют для интеграции с базами данных протокол ODBC,
поэтому мы начнем с краткого обзора ODBC и инструкций
по конфигурированию источников данных ODBC.
256 Приложение Б
Синтаксис операторов
SQL
Для того чтобы помочь вам быстро найти образец нуж-
ного синтаксиса, в этом приложении приводятся образцы
для наиболее часто выполняемых операций SQL. Каждый
оператор начинается с краткого описания, затем приводит-
ся соответствующий синтаксис.
Для большего удобства даются также ссылки на уроки,
в которых изучались соответствующие операторы.
При рассмотрении синтаксиса операторов помните сле-
дующее:
• Символ " | " служит для выбора одного из нескольких
вариантов, поэтому NULL | NOT NULL означает указа-
ние NULL ИЛИ NOT NULL.
• Ключевые слова или предложения, заключенные в
квадратные скобки, [например, так], являются оп-
циональными.
• Представленный ниже синтаксис подходит почти для
любой СУБД. Рекомендуем обращаться к документа-
ции вашей СУБД за подробностями относительно
возможных изменений в синтаксисе.
ALTER TABLE
Оператор ALTER TABLE используется для обновления
схемы существующей таблицы. Чтобы создать новую таб-
лицу, используйте оператор CREATE TABLE. За более де-
тальной информацией обратитесь к уроку 17, "Создание
таблиц и работа с ними".
ВВОД
ALTER TABLE имя таблицы
260 Приложение В
COMMIT
Оператор COMMIT используется для создания запросов к
базе данных в виде транзакций. За более детальной инфор-
мацией обратитесь к уроку 20, "Обработка транзакций".
ВВОД
COMMIT [TRANSACTION];
CREATE INDEX
Оператор CREATE INDEX используется для создания ин-
декса одного или нескольких столбцов. За более детальной
информацией обратитесь к уроку 22, "Расширенные воз-
можности SQL".
ВВОД
CREATE INDEX название_индекса
ON имя_таблицы (имя_столбца, . . . ) ;
CREATE PROCEDURE
Оператор CREATE PROCEDURE используется для создания
хранимых процедур. За более детальной информацией об-
ратитесь к уроку 19, "Работа с хранимыми процедурами".
В СУБД Oracle используется синтаксис, отличный от опи-
санного в этом уроке.
ВВОД
CREATE PROCEDURE имя_процедуры [параметры]
^t> [опции]
AS
SQL statement;
Синтаксис операторов SQL 261
CREATE TABLE
Оператор CREATE TABLE используется для создания но-
вых таблиц базы данных. Чтобы обновить схему уже суще-
ствующей таблицы, используйте оператор ALTER TABLE. За
более детальной информацией обратитесь к уроку 17.
ВВОД
CREATE TABLE имя_таблицы
(
имя_столбца тип_данных [NULL|NOT NULL]
"*> [CONSTRAINTS] ,
имя_столбца тип_данных[NULL|NOT NULL]
Ь [CONSTRAINTS] ,
CREATE VIEW
Оператор CREATE VIEW используется для создания ново-
го представления одной или нескольких таблиц. За более
детальной информацией обратитесь к уроку 18, "Использо-
вание представлений".
ВВОД
CREATE VIEW имя_представления AS
SELECT имена_столбцов, ...
FROM t a b l e s , . . .
[WHERE . . . ]
[GROUP BY . . . ]
[HAVING . . . ] ;
DELETE
Оператор DELETE удаляет одну или несколько строк таб-
лицы. За более детальной информацией обратитесь к уро-
ку 16, "Обновление и удаление данных".
ВВОД
DELETE FROM имя_таблицы
[WHERE .. .] ;
262 Приложение В
DROP
Оператор DROP навсегда удаляет объекты базы данных
(таблицы, представления, индексы и т.д.). За более деталь-
ной информацией обратитесь к урокам 17 и 18.
ВВОД
DROP INDEX|PROCEDURE|TABLE|VIEW
%имя__индекса \ имя_процедуры\ имя_таблицы\ имя_представления;
INSERT
Оператор INSERT добавляет в таблицу одну строку. За
более детальной информацией обратитесь к уроку 15, "До-
бавление данных".
ВВОД
INSERT INTO имя_таблицы [(имена_столбцов, ...)]
VALUES{значения, ...) ;
INSERT SELECT
Оператор INSERT SELECT добавляет результаты выпол-
нения оператора SELECT в таблицу. За более детальной ин-
формацией обратитесь к уроку 15.
ВВОД
INSERT INTO имя_таблицы [(имена_столбцов, ...)]
SELECT имена_столбцов, ... FROM имя_таблицы, ...
[WHERE . . . ] ;
ROLLBACK
Оператор ROLLBACK используется для аннулирования ре-
зультатов работы блока транзакции. За более детальной
информацией обратитесь к уроку 20.
ВВОД
ROLLBACK [ ТО точка_сохранения];
Синтаксис операторов SQL 263
или
ввод
ROLLBACK TRANSACTION;
SELECT
Оператор SELECT используется для выборки данных из
одной или нескольких таблиц (или представлений). За бо-
лее детальной информацией обратитесь к уроку 2, "Выбор-
ка данных"; уроку 3, "Сортировка выбранных данных"; и
уроку 4, "Фильтрация данных". (Во всех уроках со 2 по 14
рассматриваются аспекты применения оператора SELECT.)
ВВОД
SELECT имя_столбца,
FROM имя_таблицы, .
[WHERE . . . ]
[UNION . . . ]
[GROUP BY . . . ]
[HAVING . . . ]
[ORDER BY . . . ] ;
UPDATE
Оператор UPDATE обновляет одну или несколько строк
таблицы. За более детальной информацией обратитесь к
уроку 16.
ВВОД
UPDATE имя_таблицы
SET имя__столбца = значение,
[WHERE . . . ] ;
Приложение Г
Использование типов
данных SQL
Как уже говорилось в уроке 1, "Что такое SQL", типы
данных представляют собой основные правила, определяю-
щие, какие данные могут храниться в столбцах и в каком
виде эти данные в действительности хранятся.
Типы данных используются по нескольким причинам.
• Типы данных позволяют ограничить разновидности
данных, которые могут храниться в столбце. Напри-
мер, столбцы с данными числового типа будут при-
нимать только числовые данные.
• Типы данных позволяют более эффективно организо-
вывать хранение. Числовые значения и значения да-
ты/времени могут храниться в более компактном
формате, чем текстовые строки.
• Типы данных позволяют изменять порядок сортиров-
ки. Если все данные трактуются как строки, то 1
предшествует 10, а 10 предшествует 2.
• (Строки сортируются в лексикографической последо-
вательности, по одному символу за один раз, начиная
слева). Если выполняется числовая сортировка, то
числа будут располагаться по возрастанию.
При разработке таблиц обращайте пристальное внимание
на используемые в них типы данных. При использовании
неправильных типов данных работа вашего приложения
серьезно осложнится.
Изменение типов данных уже имеющихся и заполнен-
ных столбцов — задача нетривиальная. (Кроме того, при ее
выполнении возможна потеря данных.)
В одном приложении невозможно дать исчерпывающую
информацию по типам данных и методам их использова-
ния, однако здесь все же рассмотрены основные типы дан-
ных, рассказано, для чего они используются, а также рас-
крываются возможные проблемы совместимости.
266 Приложение Г
Строковые данные
Чаще всего используются данные типа строки, или стро-
ковые данные. К ним относятся хранимые в СУБД строки,
например, имена, адреса, номера телефонов и ZIP-коды.
Вам придется использовать строковые данные в основ-
ном двух типов — строки фиксированной длины и строки
переменной длины (табл. Г.1).
Строки фиксированной длины относятся к типу данных,
которые могут состоять из фиксированного числа символов,
это число определяется при создании таблиц.
Например, вы можете разрешить ввод 30 символов в
столбец, предназначенный для хранения имен, или 11 сим-
волов в столбец с номером карточки социального страхова-
ния. В столбцы для строк фиксированной длины нельзя
вводить больше символов, чем разрешено. Столбцы также
выделяют для хранения именно столько места, сколько
разрешено. Так, если имя Бен сохраняется в поле столбца
имен, рассчитанном на ввод 30 символов, будет сохранено
ровно 30 символов (при необходимости текст дополняется
пробелами или нулями).
В строках переменной длины можно хранить столько
символов, сколько необходимо (максимальное значение ог-
раничивается типом данных и СУБД). Некоторые типы
данных переменной длины имеют ограничение снизу (фик-
сированное значение минимальной длины). Другие ограни-
чений не имеют. В любом случае сохраняются только ука-
занные данные (и никаких дополнительных).
Если тип данных переменной длины обладает такой гиб-
костью, зачем вам использовать типы данных фиксирован-
Использование типов данных SQL 267
Использование кавычек
Независимо от формы используемых строковых дан-
ных значение строки должно быть всегда заключено в
одинарные кавычки.
Кавычки не используются
В отличие от строковых типов данных, числовые нико-
гда не заключаются в кавычки.
Указание дат
Не существует стандартного способа указания даты,
который подходил бы к любой СУБД. В большинстве
реализаций приемлем формат типа 2о04-12-30 или
Dec 3 0 t h , 2004, но даже эти значения могут ока-
заться проблемой для некоторых СУБД. Обязательно
обратитесь к документации своей СУБД и найдите
список распознаваемых ею форматов.
Даты в ODBC
Поскольку в каждой СУБД используется свой формат
представления даты, ODBC создал свой собственный
формат, который способен работать с любой СУБД
при использовании ODBC. Формат ODBC выглядит
так: {d '2004-12-30'} для значений дат,
{ t ' 2 1 : 4 6 : 2 9 ' } для значений времени и { t s '2004-
12-30 21:46 -.29'} для значений даты и времени. Ес-
ли вы выполняете SQL-код через ODBC, убедитесь в
том, что значения даты и времени отформатированы
подобным образом.
Зарезервированные
слова SQL
В языке SQL широко используются ключевые слова —
особые слова, применяемые для выполнения операций SQL.
Нужно внимательно следить за тем, чтобы эти ключевые
слова не были использованы в качестве имен баз данных,
таблиц, столбцов и других объектов баз данных. Поэтому
ключевые слова считаются зарезервированными.
В данном приложении содержится перечень зарезерви-
рованных слов, наиболее часто встречающихся в основных
СУБД. Обратите внимание на следующие моменты.
• Ключевые слова — вещь весьма специфичная, поэто-
му не все приведенные ниже ключевые слова исполь-
зуются во всех СУБД.
• Во многих СУБД используется расширенный пере-
чень зарезервированных слов SQL; в него включаются
термины, специфичные для данной реализации. Мно-
гие из специфичных для отдельных СУБД ключевых
слов не представлены ниже.
• Чтобы обеспечить совместимость и переносимость,
следует избегать любого из зарезервированных слов,
если даже некоторые из них не относятся к числу за-
резервированных в вашей СУБД.
ABORT ABSOLUTE ACTION
ACTIVE ADD AFTER
ALL ALLOCATE ALTER
ANALYZE AND ANY
ARE AS AS С
ASCENDING ASSERTION AT
AUTHORIZATION AUTO AUTO-INCREMENT
AUTOINC AVG BACKUP
274 Приложение Д
OFFSET OFFSETS ON
ONCE ONLY OPEN
OPTION OR ORDER
OUTER OUTPUT OVER
OVERFLOW OVERLAPS PAD
PAGE PAGES PARAMETER
PARTIAL PASSWORD PERCENT
PERM PERMANENT PIPE
PLAN POSITION PRECISION
PREPARE PRIMARY PRINT
PRIOR PRIVILEGES PROC
PROCEDURE PROCESSEXIT PROTECTED
PUBLIC PURGE RAISERROR
READ READTEXT REAL
REFERENCES REGEXP RELATIVE
RENAME REPEAT REPLACE
REPLICATION REQUIRE RESERV
RESERVING RESET RESTORE
RESTRICT RETAIN RETURN
RETURNS REVOKE RIGHT
ROLLBACK ROLLUP ROWCOUNT
RULE SAVE SAVEPOINT
SCHEMA SECOND SECTION
SEGMENT SELECT SENSITIVE
SEPARATOR SEQUENCE SESSIONJJSER
SET SETUSER SHADOW
SHARED SHOW SHUTDOWN
SINGULAR SIZE SMALLINT
SNAPSHOT SOME SORT
SPACE SQL SQLCODE
SQLERROR STABILITY STARTING
STARTS STATISTICS SUBSTRING
SUM SUSPEND TABLE
TABLES TAPE TEMP
Зарезервированные слова SQL 277
E
Enterprise Manager, 252 Аргумент
ALL, 96
M DISTINCT, 97
Macromedia, 245
Microsoft ASP, 248 Б
Microsoft ASP.NET, 249 База данных
Microsoft Query, 243, 250 безопасность, 231
Microsoft SQL Server, 251 основные понятия, 20
MySQL, 252 реляционная, 122
типа ISAM, 212
О
ODBC, 256 В
Oracle, 252 Внешнее объединение, 138
Внешний ключ, 222
Внутреннее объединение, 128
PHP, 253 Выборка
всех столбцов, 33
PostgreSQL, 44, 253
нескольких столбцов, 32
psql, 253
отдельных столбцов, 30
Вычисляемое поле, 69, 70
Предметный указатель 279
Индексно-последовательный
метод доступа, 212
Группа, 102 Источник данных ODBC, 256
фильтрующая, 104 Итоговые данные, 101
Групповой символ, 34
К
Д Кавычки, 47
Данные Каскадное удаление, 224
двоичные, 270 Ключ
добавление, 153 внешний, 222
итоговые, 101 первичный, 24, 122, 220
неотсортированные, 31 Ключевое слово, 29, 273
распределение по столбцам, AND, 52, 87
22 AS, 74, 134
сортировка, 35 ASC, 41
строковые, 266 BETWEEN, 48
тип, 23 DEFAULT, 174
форма представления, 33 DESC, 41
числовые, 268 FROM, 166
Декартово произведение, 126 IN, 56, 57
Добавление INTO, 154
выбранных данных, 158 NOT, 57, 58
данных, 153 ON, 229
нескольких строк, 160 OR, 53
полных строк, 153 OUT, 199
части строки, 157 PRIMARY KEY, 221
REFERENCES, 223
Е UNIQUE, 225
Код переносимый, 80
Естественное объединение, 137
Комбинированный запрос, 145
Копирование данных, 160
3 Критерий поиска, 43
Запись, 24 Курсор, 211
Запрос, 113 закрытие, 217
вложенный, 113 открытие, 215
комбинированный, 145 создание, 214
подчиненный, 113
сложный, 145 Л
Зарезервированное слово, 273
Левое внешнее объединение,
140
И
Индекс, 227
создание, 229
280 Предметный указатель
м GRANT, 232
INSERT, 153, 262
Масштабирование, 123 INSERT SELECT, 158, 262
Метасимвол, 62 INTERSECT, 152
знак процента, 62 LIKE, 61
квадратные скобки, 66 MINUS, 152
символ подчеркивания, 65 OPEN CURSOR, 215
Модуль ODBC, 256 RENAME, 179
REVOKE, 232
н ROLLBACK, 207, 262
SAVEPOINT, 209
Неявная фиксация, 207
SELECT, 29, 263
SELECT INTO, 160
О SQL, синтаксис, 259
Обновление данных, 163 TRUNCATE TABLE, 167
Объединение, 121 UNION, 146
внешнее, 138 UNION ALL, 150
внешнее левое, 140 UPDATE, 163, 263
внешнее полное, 141 в предложении WHERE, 51
внешнее правое, 140 завершение, 31
внутреннее, 128 левого внешнего
естественное, 137 объединения, 140
многих таблиц, 129 независимость от регистра,
перекрестное, 128 32
по эквивалентности, 128 правого внешнего
Ограничение, 219 объединения,140
на значения столбца, 225 условный, 45
уникальности, 224 Операция
Оператор !=, 47
ALTER TABLE, 176, 259 о, 47
CLOSE, 217 Откат, 205
COMMIT, 207, 260 Отмена, 205
CREATE INDEX, 229, 260
CREATE PROCEDURE, 260 п
CREATE TABLE, 169, 259, Первичный ключ, 24, 122, 220
261 создание, 221
CREATE VIEW, 185, 261
Переименование таблиц, 179
DECLARE, 214
Перекрестное объединение,
DELETE, 165, 261 128
DROP, 185, 262 Подзапрос, 113
DROP TABLE, 178 Поле, 70
EXCEPT, 152 вычисляемое, 69, 70
EXECUTE, 197 таблицы, 22
FETCH, 215
Предметный указатель 281
Бен Форта
Освой самостоятельно SQL,
10 минут на урок
Литературный редактор П.Н. Мачуга
Верстка АЛ. Полинчик
Художественный редактор В.Г. Павлютин
Корректор Л. В. Пустовойтова
h t t p : / / w w w . w i l l i a m s p u b l i s h i n g . c o m
M Y S Q L .
РУКОВОДСТВО
АДМИНИСТРАТОРА
Компания MySQL AB MySQL занимает лидирующие
позиции среди множества
систем управления базами
данных с открытым исходным
кодом. Благодаря высокой
производительности и простоте
• настройки, богатому выбору
API-интерфейсов, а также
функциональным средствам
работы с сетями, сервер MySQL
стал одним из наиболее удачных
вариантов для разработки Web-
приложений, взаимодействующих
с базами данных.
В этой книге предложен
всеобъемлющий подход к
установке, обслуживанию и
администрированию сервера
баз данных MySQL. Являясь,
фактически, официальной
MySQL документацией, книга
покрывает весь спектр вопросов,
- касающихся администрирования,
ОфМЦМ-ЯДЬИС!? РУКОВОДСТВО ПО ¥С!3*Ю&К&,
а также предлагает информацию,
ориентированную на
опытных пользователей
www.williamspublishing.com и администраторов.
Книга рассчитана на
администраторов и
разработчиков Web-приложений
любой квалификации, а также
на студентов и преподавателей
соответствующих дисциплин.
ISBN 5 - 8 4 5 9 - 0 8 0 5 - 1 в продаже
M Y S Q L
СПРАВОЧНИК ПО ЯЗЫКУ
шшшц
запросов к базам данных, а также
особенностях реализации стандарта
т SQL в сервере MySQL. По сути — это
официальная документация фирмы-
производителя. В книге рассмотрен
весь спектр вопросов, касающихся
языковой структуры, допустимых
типов столбцов, операторов,
операций и функций, а также
существующих расширений MySQL;
также представлена информация,
предназначенная для опытных
программистов и администраторов.
Как известно, MySQL занимает
лидирующие позиции среди
"шШтш множества систем управления
базами данных с открытым
MySQL исходным кодом. Благодаря
Справочник по языку высокой производительности и
простоте настройки, богатому
выбору API-интерфейсов, а также
функциональным средствам работы
с сетями, сервер MySQL стал одним
из наиболее удачных вариантов
www.williamspublishing.com для разработки Web-приложений,
взаимодействующих с базами данных.
Книга рассчитана на разработчиков
Web-приложений и администраторов
любой квалификации, а также
на студентов и преподавателей
соответствующих дисциплин.