287

SQL Without Assistance

Embed Size (px)

Citation preview

Page 1: SQL Without Assistance
Page 2: SQL Without Assistance

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

уро

Page 3: SQL Without Assistance

SAMS

T e a c hY o u r s e l f

Ben Forta

SAMS

THIRD EDITION

800 East 96th Street, Indianapolis, Indiana, 46240 USA

Page 4: SQL Without Assistance

SAMS

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

Бен Форта

уро3-е издание

Издательский дом "Вильяме"Москва • Санкт-Петербург • Киев2005

Page 5: SQL Without Assistance

ББК 32.973.26-018.2.75Ф80

УДК 681.3.07

Издательский дом "Вильяме"

Главный редактор С.Н. Тригуб

Зав. редакцией В.Р. Гинзбург

Перевод с английского и редакция B.C. Гусева

По общим вопросам обращайтесь в Издательский дом "Вильяме" по адресу:[email protected], http://www.williamspublishing .com

115419, Москва, а/я 783, 03150, Киев, а/я 152.

Форта, Бен.

Ф80 Освой самостоятельно SQL. 10 минут на урок, 3-е издание. :Пер. с англ. — М. : Издательский дом "Вильяме", 2005. —288 с. : ил. — Парал. тит. англ.

ISBN 5-8459-0827-2 (рус.)

Данная книга поможет вам в кратчайшие сроки освоитьSQL — самый популярный язык баз данных. Начиная с простыхзапросов на выборку данных, автор урок за уроком рассматрива-ет все более сложные темы, такие как использование операцийобъединения, подзапросы, хранимые процедуры, индексы, триг-геры и ограничения. На изучение материала каждого урока вампотребуется не более 10 минут. Благодаря этой книге вы быстронаучитесь самостоятельно составлять запросы к базам данных наязыке SQL без чьей-либо помощи.

Примеры, приведенные в книге, будут работать во всех наи-более популярных СУБД — IBM DB2, Microsoft Access, MicrosoftSQL Server, MySQL, Oracle, PostgreSQL и Sybase Adaptive Server.

ББК 32.973.26-018.2.75

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

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

Authorized translation from the English language edition published by SamsPublishing Copyright © 2004

All rights reserved. No part of this book may be reproduced or transmitted inany form or by any means, electronic or mechanical, including photocopying,recording or by any information storage retrieval system, without permission fromthe Publisher.

Russian language edition is published by Williams Publishing House accordingto the Agreement with R&I Enterprises International, Copyright © 2005

ISBN 5-8459-0827-2 (рус.) © Издательский дом "Вильяме", 2005ISBN 0-672-32567-5 (англ.) © Sams Publishing, 2004

Page 6: SQL Without Assistance

Оглавление

Введение 15

Урок 1. Что такое SQL 19

Урок 2. Выборка данных 29

Урок 3. Сортировка выбранных данных 35

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

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

Урок 6. Использование метасимволов для фильтрации 61

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

Урок 8. Использование функций манипулирования данными 79

Урок 9. Суммирование данных 89

Урок 10. Итоговые данные 101

Урок 11. Использование подзапросов 113

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

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

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

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

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

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

Урок 18. Использование представлений 181

Урок 19. Работа с хранимыми процедурами 193

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

Урок 21. Использование курсоров 211

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

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

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

Приложение В. Синтаксис операторов SQL 259

Приложение Г. Использование типов данных SQL 265

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

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

Page 7: SQL Without Assistance

СодержаниеОб автореБлагодарностиЖдем ваших отзывов!

ВведениеДля кого эта книга?СУБД, используемые в этой книгеУсловные обозначения

Урок 1. Что такое SQLОсновы баз данных

Что такое база данныхТаблицыСтолбцы и типы данныхСтрокиПервичные ключи

Что такое SQL?Попробуйте самиРезюме

Урок 2. Выборка данныхОператор SELECTВыборка отдельных столбцовВыборка нескольких столбцовВыборка всех столбцовРезюме

Урок 3. Сортировка выбранных данныхСортировка данныхСортировка по нескольким столбцамСортировка по положению столбцаУказание направления сортировкиРезюме

Урок 4. Фильтрация данныхИспользование предложения WHEREОперации в предложении WHERE

Проверка одного значенияПроверка на несовпаденияПроверка на диапазон значенийПроверка на отсутствие значения

Резюме

Page 8: SQL Without Assistance

Содержание 7

Урок 5. Расширенная фильтрация данных 51Комбинирование предложений WHERE 51

Использование ключевого слова AND 52Использование ключевого слова OR 53Порядок обработки 54

Использование ключевого слова IN 56Использование ключевого слова NOT 57Резюме 59

Урок 6. Использование метасимволов для фильтрации 61Использование логического оператора LIKE 61

Метасимвол "знак процента" (%) 62Метасимвол "символ подчеркивания" (_) 65Метасимвол "квадратные скобки" ([ ]) 66

Советы по использованию метасимволов 68Резюме 68

Урок 7. Создание вычисляемых полей 69Что такое вычисляемые поля 69Конкатенация полей 70

Использование псевдонимов 74Выполнение математических вычислений 76Резюме 78

Урок 8. Использование функций манипулирования данными 79Что такое функция 79

Проблемы с функциями 79Использование функций 81

Функции манипулирования текстом 82Функции манипулирования датой и временем 84Функции для манипулирования числами 87

Резюме 88

Урок 9. Суммирование данных 89Использование статистических функций 89

Функция AVG () 90Функция COUNT () 92Функция МАХ () 93Функция MIN () 94Функция SUMO 95

Статистические вычисления для отдельныхзначений 96

Комбинирование статистических функций 98Резюме 99

Page 9: SQL Without Assistance

8 Содержание

Урок 10. Итоговые данные 101Получение итоговых данных 101Создание групп 102Фильтрующие группы 104Группирование и сортировка 108Упорядочение предложения SELECT 110Резюме 111

Урок 11. Использование подзапросов 113Что такое подзапросы 113Фильтрация посредством подзапросов 114Использование подзапросов в качестве

вычисляемых полей 118Резюме 120

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

Что такое реляционные таблицы 121Для чего используют объединения 123

Создание объединения 124Важность предложения WHERE 126Внутренние объединения 128Объединение многих таблиц 129

Резюме 132Урок 13. Создание расширенных объединений 133

Использование псевдонимов таблиц 133Использование объединений других типов 134

Самообъединения 135Естественные объединения 137

Внешние объединения 138Использование объединений со статистическими

функциями 142Использование объединений и условий

объединения 143Резюме 144

Урок 14. Комбинированные запросы 145Что такое комбинированные запросы 145Создание комбинированных запросов 146

Использование оператора UNION 146Правила применения запросов UNION 149Включение или исключение повторяющихся

строк 150

Page 10: SQL Without Assistance

Содержание 9

Сортировка результатов комбинированныхзапросов 151

Резюме 152

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

Добавление полных строк 153Добавление части строки 157Добавление выбранных данных 158

Копирование данных из одной таблицы в другую 160Резюме 162

Урок 16. Обновление и удаление данных 163Обновление данных 163Удаление данных 165Советы по обновлению и удалению данных 167Резюме 168

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

Основы создания таблиц 170Работа со значениями NULL 172Определение значений по умолчанию 174

Обновление таблиц 176Удаление таблиц 178Переименование таблиц 179Резюме 179

Урок 18. Использование представлений 181Что такое представления 181

Для чего используют представления 182Представления: правила и ограничения 183

Создание представлений 185Использование представлений для упрощения

сложных объединений 186Использование представлений для

переформатирования выбранных данных 187Использование представлений для фильтрации

нежелательных данных 190Использование представлений с вычисляемыми

полями 191Резюме 192

Урок 19. Работа с хранимыми процедурами 193Что такое хранимые процедуры 193Для чего используют хранимые процедуры 195

Page 11: SQL Without Assistance

10 Содержание

Выполнение хранимых процедур 197Создание хранимых процедур 198Резюме 202

Урок 20. Обработка транзакций 203Что такое обработка транзакций 203Управляемые транзакции 206

Использование оператора ROLLBACK 207Использование оператора COMMIT 207Использование точек сохранения 208

Резюме 210

Урок 21. Использование курсоров 211Что такое курсоры 211Работа с курсорами 213

Создание курсоров 214Использование курсоров 215Закрытие курсоров 217

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

Что такое ограничения 219Первичные ключи 220Внешние ключи 222Ограничения уникальности 224Ограничения на значения столбца 225

Что такое индексы 227Что такое триггеры 229Безопасность баз данных 231Резюме 232

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

Описания таблиц 236Таблица Vendors 236Таблица Products 237Таблица Customers 237Таблица Orders 238Таблица Orderltems 238

Получение демонстрационных таблиц 239Загрузка готового к работе MDB-файла для

Microsoft Access 240Загрузка SQL-сценариев СУБД 240

Приложение Б. Работа с популярными приложениями 243Использование Aqua Data Studio 244

Page 12: SQL Without Assistance

Содержание 11

Использование DB2Использование Macromedia ColdFusionИспользование Microsoft AccessИспользование Microsoft ASPИспользование Microsoft ASP.NETИспользование Microsoft QueryИспользование Microsoft SQL ServerИспользование MySQLИспользование OracleИспользование PHPИспользование PostgreSQLИспользование Query ToolИспользование SybaseКонфигурирование источников данных ODBC

Приложение В. Синтаксис операторов SQLALTER TABLECOMMITCREATE INDEXCREATE PROCEDURECREATE TABLECREATE VIEWDELETEDROPINSERTINSERT SELECTROLLBACKSELECTUPDATE

Приложение Г. Использование типов данных SQLСтроковые данныеЧисловой тип данныхТипы данных даты и времениДвоичные типы данных

Приложение Д. Зарезервированные слова SQLПредметный указатель

245245246248249250251252252253253254255255

259259260260260261261261262262262262263263

265266268269270

273278

Page 13: SQL Without Assistance

Об автореБен Форта — главный технический специалист компа-

нии Macromedia, за его плечами 20 лет работы в компью-терной индустрии, включая разработку продуктов, их под-держку и распространение, а также обучение пользованиюими. Бен Форта — автор таких бестселлеров, как ColdFu-sion Web Application Construction Kit и Advanced ColdFusionDevelopment, Sams Teach Yourself Regular Expressions in10 Minutes (Освой самостоятельно регулярные выражения.10 минут на урок, Издательский дом "Вильяме"), а такжекниг по Flash, Java, WAP, Windows 2000 и другим техно-логиям. У него огромный опыт в разработке баз данных, онобеспечил их поддержку в нескольких очень популярныхпрограммных пакетах. Он часто читает лекции и пишетстатьи для Internet, посвященные технологиям баз данных.Бен родился в Лондоне, там же получил образование, затемучился в Нью-Йорке и Лос-Анджелесе. Сейчас он живет вг. Оук-Парк, штат Мичиган, со своей женой Марси и семьюдетьми. Бену можно написать по адресу [email protected] ипосетить его Web-узел по адресу h t t p : //www. fort a. com.

Page 14: SQL Without Assistance

БлагодарностиСпасибо команде из Sams за многолетнюю поддержку.

Особую благодарность хочу выразить Майку Стивенсу (MikeStephens) и Марку Ренфроу (Mark Renfrow) за то, что онипровели это новое издание книги от идеи до реальности(при этом иногда им приходилось вести и меня самого).

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

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

Page 15: SQL Without Assistance

Ждем ваших отзывов!Вы, читатель этой книги, и есть главный ее критик и

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

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

Посылая письмо или сообщение, не забудьте указать на-звание книги и ее авторов, а также ваш обратный адрес.Мы внимательно ознакомимся с вашим мнением и обяза-тельно учтем его при отборе и подготовке к изданию после-дующих книг. Наши координаты:E-mail: inf o@williamspublishing. comWWW: h t t p : //www. will iamspublishing. com

Адреса для писем:из России: 115419, Москва, а/я 783из Украины: 03150, Киев, а/я 152

Page 16: SQL Without Assistance

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

Не важно, кто вы — разработчик приложений, админист-ратор баз данных, Web-дизайнер или пользователь пакетаMicrosoft Office, — хорошее практическое знание SQL по-может вам взаимодействовать с базами данных.

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

Итак, не найдя ни одной книги, которую я бы мог поре-комендовать, я вложил весь опыт преподавания в книгу,которую вы держите в руках. Данная книга поможет вамбыстро освоить SQL. Начнем мы с простой выборки дан-ных, затем перейдем к более сложным темам, таким какиспользование операций объединения, подзапросы, храни-мые процедуры, индексы, триггеры и ограничения. Обуче-ние будет проходить методично, систематично и просто —на каждый урок вам потребуется не более 10 минут.

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

Для кого эта книгаЭта книга для вас, если вы• новичок в SQL;• хотите быстро научиться использовать SQL;• хотите научиться использовать SQL в разрабатывае-

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

данных на SQL без чьей-либо помощи.

Page 17: SQL Without Assistance

16 Введение

СУБД, используемые в этойкниге

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

• IBM DB2• Microsoft Access• Microsoft SQL Server• MySQL• Oracle• PostgreSQL• Sybase Adaptive ServerПримеры баз данных и SQL-сценарии будут работать во

всех этих СУБД.

Условные обозначенияВ этой книге используются различные шрифты — во-

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

Текст, который вы вводите, и текст, который должен поя-виться на экране, представлены моноширинным шрифтом.Он выглядит так, как на вашем экране.

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

Такая стрелка (*Ь) в начале строки кода означает, чтоэта строка слишком длинная и не поместилась в одну стро-ку книги. Продолжайте вводить все символы после символа> так, как если бы они были частью предыдущей строки.

Page 18: SQL Without Assistance

Введение 17

В примечаниях находится интересная информация,относящаяся к обсуждаемой теме.

ш В подсказке вы найдете полезный совет или болеебыстрый способ что-либо выполнить.

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

Под данной пиктограммой вы найдете определенияновых базовых понятий.

ВВОДПиктограммой "Ввод" обозначен код, который вы може-

те ввести самостоятельно.

ВЫВОДПиктограмма "Вывод" указывает на информацию, кото-

рая выдается после запуска программы.

АнализПиктограмма "Анализ" указывает на то, что далее сле-

дует пошаговый комментарий к коду.

Page 19: SQL Without Assistance
Page 20: SQL Without Assistance

Урок 1

Что такое SQLНа этом уроке вы узнаете, что такое SQL и что с его по-мощью можно сделать.

Основы баз данныхТот факт, что вы читаете книгу по SQL, говорит о том,

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

Хотите вы этого или нет, но вы постоянно пользуетесьбазами данных. Каждый раз, когда вы выбираете имя в ад-ресной книге электронной почты, вы используете базу дан-ных. Если вы что-то ищете при помощи поискового серверав Internet, вы используете базу данных. Когда вы регистри-руетесь в локальной сети на работе, вы вводите свое имя ипароль, которые затем сравниваются со значениями, хра-нящимися в базе данных. И даже когда вы используетесвою пластиковую карту в банкомате, вы используете базуданных при проверке PIN-кода и остатка на счету.

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

Page 21: SQL Without Assistance

20 Урок 1

Основные понятия

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

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

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

База данных

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

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

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

Page 22: SQL Without Assistance

Что такое SQL 21

ТаблицыКогда вы храните информацию в шкафу для докумен-

тов, вы стараетесь не перемешивать их. Напротив, все до-кументы хранятся в соответствующих папках.

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

, Таблицашг • • • • • • " ' • - ' ' " " • • • . • • •

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

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

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

Имена таблиц

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

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

Page 23: SQL Without Assistance

22 Урок 1

в базе данных, так и для базы данных в целом (а также дляописания взаимосвязей (отношений) между таблицами, ес-ли таковые имеются).

Схема

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

Столбцы и типы данныхТаблицы состоят из столбцов, в которых находятся от-

дельные фрагменты информации таблицы.

Столбец

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

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

Распределение данных

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

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

Page 24: SQL Without Assistance

Что такое SQL 23

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

Тип данных

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

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

Совместимость типов данных

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

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

хранится в своей строке. Возвращаясь к сравнению с сет-кой, можно сказать, что ее вертикальные столбцы являют-ся столбцами таблицы, а горизонтальные строки — строка-ми таблицы.

Page 25: SQL Without Assistance

24 Урок 1

Например, в таблице клиентов информация о каждомклиенте хранится в отдельной строке. Число строк в табли-це равно числу записей о клиентах.

Строка

Запись в таблице.

Записи или строки?

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

Первичные ключиВ каждой строке таблицы должно быть несколько

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

Первичный ключ

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

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

Page 26: SQL Without Assistance

Что такое SQL 25

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

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

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

• Две разные строки не могут иметь одно и то же зна-чение первичного ключа.

• Каждая строка должна иметь определенное значениепервичного ключа (столбцы первичного ключа не мо-гут иметь значения NULL).

• Значения в столбце первичного ключа не могут бытьизменены.

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

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

Существует еще один важный тип ключа, который на-зывается внешний ключ, но к нему мы вернемся в уро-ке 12, "Объединение таблиц".

Что такое SQL?SQL — это аббревиатура выражения Structured Query

Language (язык структурированных запросов). SQL был спе-циально разработан для взаимодействия с базами данных.

В отличие от других языков (разговорных, таких каканглийский, или языков программирования, например Java

Page 27: SQL Without Assistance

26 Урок 1

или Visual Basic), SQL состоит всего из нескольких слов. Исделано это умышленно. SQL был создан для решения од-ной задачи, с которой он вполне справляется, — предостав-лять простой и эффективный способ считывания и записиинформации в базу данных.

Каковы же преимущества SQL?• SQL не относится к числу патентованных языков, ис-

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

• SQL легко изучить. Его немногочисленные операторысостоят из простых английских слов.

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

Именно поэтому стоит изучить SQL.

Расширения SQL

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

Page 28: SQL Without Assistance

Что такое SQL 27

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

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

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

РезюмеИз первого урока вы узнали, что такое SQL и чем он по-

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

Page 29: SQL Without Assistance
Page 30: SQL Without Assistance

Урок 2

Выборка данныхНа этом уроке вы узнаете, как использовать операторSELECT для выборки одного или нескольких столбцов дан-ных из таблицы.

Оператор SELECTКак уже говорилось в уроке 1, "Что такое SQL", SQL-

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

Ключевое слово

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

Чтобы при помощи оператора SELECT извлечь данные изтаблицы, нужно указать как минимум две вещи — что выхотите выбрать и откуда.

Рассматриваемые примеры

В примерах SQL-операторов (а также полученных с ихпомощью результатов) в этой книге используютсяфайлы данных, описанные в приложении А, "Сцена-рии демонстрационных таблиц". Если вы хотите са-мостоятельно выполнить действия, указанные в при-мерах (очень рекомендуем это делать), обратитесь к

Page 31: SQL Without Assistance

30 Урок 2

приложению А, в котором вы найдете инструкции позагрузке или созданию этих файлов.Очень важно понимать, что SQL— это язык, а не при-ложение. Метод ввода SQL-операторов и вывод ре-зультатов их выполнения различен для разных прило-жений. Чтобы помочь вам приспособить примеры квашей СУБД, в приложении Б, "Работа с популярнымиприложениями" объясняется, как выполнять команды,приведенные в этой книге, в нескольких популярныхпрограммах и средах разработки. А если вам нужноприложение, которое поможет вам выполнять приме-ры, там же вы найдете рекомендации по его выбору.

Выборка отдельных столбцовНачнем с простого SQL-оператора SELECT:

ВВОДSELECT prod_nameFROM Products;

АнализВ приведенном выше операторе используется оператор

SELECT для выборки одного столбца под названиемprod_name из таблицы Products. Искомое имя столбцауказывается сразу после ключевого слова SELECT, а ключе-вое слово FROM указывает на имя таблицы, из которой вы-бираются данные. Результат выполнения этого операторабудет следующий:

ВЫВОДprod_name

Fish bean bag toyBird bean bag toyRabbit bean bag toy8 inch teddy bear12 inch teddy bear18 inch teddy bearRaggedy AnnKing dollQueen doll

Page 32: SQL Without Assistance

Выборка данных 31

Неотсортированные данные

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

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

Используйте пробелы

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

Завершение операторов

Несколько SQL-операторов должны быть разделеныточкой с запятой (символом ,-). В большинстве СУБДне требуется вставлять точку с запятой после единст-венного оператора, но если в вашем конкретном слу-чае СУБД выдает ошибку, вам придется это делать.Несомненно, при желании можно всегда добавлятьточку с запятой, она никому не будет мешать, дажеесли этот символ не обязателен. Исключением явля-ется СУБД Sybase Adaptive Server, которая "не любит"SQL-операторы, заканчивающиеся символом ;.

Page 33: SQL Without Assistance

32 Урок 2

SQL-операторы и регистр

Важно отметить, что SQL-операторы нечувствитель-ны к регистру, поэтому операторы SELECT, s e l e c t иS e l e c t эквивалентны. Многие SQL-разработчики ис-пользуют верхний регистр для всех ключевых словSQL и нижний регистр для имен столбцов и таблиц,чтобы код легче читался. Однако будьте внимательны:SQL-операторы не зависят от регистра, в отличие отимен таблиц, столбцов и значений (которые зависятот СУБД и ее конфигурации).

Выборка нескольких столбцовДля выборки из таблицы нескольких столбцов использу-

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

Будьте внимательны с запятыми

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

В следующем операторе SELECT из таблицы Productsвыбираются три столбца:

ВВОДSELECT prod_id, prod_name, prod_priceFROM Products;

АнализКак и в предыдущем примере, в этом операторе для вы-

борки данных из таблицы Products используется операторSELECT. В этом примере перечислены три имени столбца,разделенные запятыми. Результат обработки этого операто-ра показан ниже:

Page 34: SQL Without Assistance

выводprod id

BNBG01BNBG02BNBG03BR01BR02BR03RGAN01RYL01RYL02

1prod_name

Fish bean bag toy-Bird bean bag toyRabbit bean bag toy8 inch teddy bear12 inch teddy bear18 inch teddy bearRaggedy AnnKing dollQueen doll

Выборка данных

prod_price

3.49003 .49003 .49005.99008.990011.99004.99009.4900

9.4900

33

Представление данных

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

Выборка всех столбцовПомимо возможности осуществлять выборку определен-

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

ВВОДSELECT *FROM Products;

Page 35: SQL Without Assistance

34 Урок 2

АнализПри указании группового символа (*) возвращаются все

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

Использование групповых символов

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

Выборка неизвестных столбцов

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

РезюмеВ этом уроке мы рассмотрели порядок использования

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

Page 36: SQL Without Assistance

УрокЗ

Сортировка выбранныхданныхНа этом уроке вы узнаете, как использовать предложениеORDER BY оператора SELECT для сортировки полученных врезультате выборки данных.

Сортировка данныхИз последнего урока вы узнали, что следующий SQL-

оператор возвращает один столбец из таблицы базы дан-ных. Но взгляните на результат: данные выводятся в пол-ном беспорядке.

SELECT prod_nameFROM Products;

ВВОД

выводprod_name

Fish bean bag toyBird bean bag toyRabbit bean bag toy8 inch teddy bear12 inch teddy bear18 inch teddy bearRaggedy AnnKing dollQueen doll

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

Page 37: SQL Without Assistance

36 Урок 3

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

Предложение

SQL-операторы завершаются предложениями, однииз которых обязательны, другие — нет. Предложениеобычно состоит из ключевого слова и предоставляе-мых данных. Примером может служить предложениеF R O M о п е р а т о р а S E L E C T , к о т о р о е м ы и с п о л ь з о в а л и впредыдущем уроке.

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

ВВОДSELECT prod_nameFROM ProductsORDER BY prod_name;

АнализЭто выражение идентично предыдущему, за исключени-

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

ВЫВОДprod_name

12 inch teddy bear18 inch teddy bear8 inch teddy bearBird bean bag toy

Page 38: SQL Without Assistance

Сортировка выбранных данных 37

Fish bean bag toy-King dollQueen dollRabbit bean bag toyRaggedy Ann

М е с т о п о л о ж е н и е п р е д л о ж е н и я O R D E R B Y

При использовании предложения O R D E R B Y убеди-

тесь, что оно указано последним в операторе S E L E C T .

Использование предложений в неправильном поряд-ке ведет к появлению сообщений об ошибках.

Сортировка по невыбранным столбцам

Чаще всего столбцы, используемые в предложенииO R D E R BY, отображаются на экране. Но это не всегдабывает так, данные могут сортироваться и по столб-цу, который не выбирается этим запросом.

Сортировка по несколькимстолбцам

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

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

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

ВВОДSELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY prod_price, prod_name;

Page 39: SQL Without Assistance

38 Урок 3

ВЫВОД Щprod_id

BNBG02BNBG01BNBG03RGAN01BR01BR02RYL01RYL02BR03

prod_price

3.49003.49003.49004.99005.99008.99009.49009.490011.9900

prod_name

Bird bean bag toyFish bean bag toyRabbit bean bag toyRaggedy Ann8 inch teddy bear12 inch teddy bearKing dollQueen doll18 inch teddv bear

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

Сортировка по положениюстолбца

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

ВВОДSELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY 2, 3;

ВЫВОДprod_id

BNBG02BNBG01BNBG03RGAN01BR01BR02

prod_price

3 .49003.49003.49004.99005.99008.9900

prod_name

Bird bean bag toyFish bean bag toyRabbit bean bag toyRaggedy Ann8 inch teddy bear12 inch teddy bear

Page 40: SQL Without Assistance

RYL01RYL02BR03

| Анализ

9.9.11

49004900.9900

Сортировка выбранных данных

King dollQueen doll18 inch teddy bear

39

Как видите, результат выполнения запроса идентиченпредыдущему примеру. Разница только в предложении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.

Page 41: SQL Without Assistance

40 Урок 3

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

ВВОДSELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY prod_price DESC;

ВЫВОДprod_id prod_price prod_name

BR03 11.9900 18 inch teddy bearRYL01 9.4900 King d o l lRYL02 9.4900 Queen d o l lBR02 8.9900 12 inch teddy bearBR01 5.9900 8 inch teddy bearRGAN01 4.9900 Raggedy AnnBNBG01 3.4900 Fi sh bean bag toyBNBG02 3.4900 Bird bean bag toyBNBG03 3.4900 Rabbit bean bag toy

Но что, если производится сортировка по несколькимстолбцам? В следующем примере продукция сортируется поцене в убывающем порядке (вначале самые дорогие), плюспо названию продукта:

ВВОДSELECT prod_id, prod_price, prod_nameFROM ProductsORDER BY prod_price DESC, prod_name;

ВЫВОДprod_xd

BR03RYL01RYL02BR02BR01RGAN01BNBG02BNBG01BNBG03

prod_price

11.99009.49009.49008.99005.99004.99003.49003.49003.4900

prod_name

18 inch teddy bearKing dollQueen doll12 inch teddy bear8 inch teddy bearRaggedy AnnBird bean bag toyFish bean bag toyRabbit bean bag toy

Page 42: SQL Without Assistance

Сортировка выбранных данных 41

АнализКлючевое слово DESC применяется только к тому столбцу,

после которого оно указано. В предыдущем примере ключе-вое слово DESC было указано для столбца prodjprice, но недля prod_name. Таким образом, столбец prod_price отсор-тирован в порядке убывания, а столбец prod_name в обыч-ном, возрастающем порядке.

Сортировка по убыванию по нескольким столбцам

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

Следует упомянуть, что DESC — это сокращение отDESCENDING, можно использовать оба ключевых слова. Про-тивоположным словом для DESC является ASC (ASCENDING),которое можно указывать для сортировки по возрастанию.Однако на практике слово AS С обычно не применяется, по-скольку такой порядок используется по умолчанию (он пред-полагается, если не указано ни ASC, ни DESC).

Чувствительность к регистру и порядок сорти-ровки

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

Page 43: SQL Without Assistance

42 УрокЗ

РезюмеЭтот урок был посвящен сортировке выбранных данных

при помощи предложения ORDER BY оператора SELECT. Этопредложение, которое должно быть последним в оператореSELECT, можно использовать для сортировки данных по од-ному или нескольким столбцам.

Page 44: SQL Without Assistance

Урок 4

Фильтрация данныхНа этом уроке вы узнаете, как использовать предложениеWHERE оператора SELECT для указания предложений поиска.

Использование предложенияWHERE

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

В операторе SELECT данные фильтруются путем указа-ния критерия поиска в предложении WHERE. ПредложениеWHERE указывается сразу после названия таблицы (предло-жения FROM) следующим образом:

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE prod_price = 3.49;

АнализЭтот оператор извлекает два столбца из таблицы това-

ров, но показывает не все строки, а только те, значение встолбце prod_price которых равно 3.49:

ВЫВОДprod_name prod_j?rice

Fish bean bag toy 3.4 900

Page 45: SQL Without Assistance

44 Урок 4

Bird bean bag toy 3.4900Rabbit bean bag toy 3.4 900

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

Требовательная PostgreSQL

СУБД PostgreSQL имеет строгие правила, управляю-щие значениями, передающимися в SQL-операторы,особенно это касается чисел с десятичными дробя-ми. Таким образом, предыдущий пример может и неработать в PostgreSQL. Чтобы он заработал, необхо-димо точно указать, что 3 . 4 9 — это "правильное"число, включив в предложение WHERE его ТИП. Д Л Яэтого замените ~ з . 4 9 н а = decimal ' 3 . 4 9 ' .

Фильтрация в SQL и в приложении

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

Page 46: SQL Without Assistance

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

Положение п р е д л о ж е н и я WHERE

При использовании обоих предложений, ORDER BY ИWHERE, убедитесь, что предложение O R D E R B Y следу-

ет за предложением WHERE, иначе возникнет ошибка.

(Более подробно предложение O R E D E R B Y описыва-

ется в уроке 3.)

Операции в предложенииWHERE

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

Таблица 4 . 1 . О п е р а ц и и в п р е д л о ж е н и и WHERE

Операция Описание

! =

<

< =

!<

>

> =

!>

BETWEEN

I S NULL

РавенствоНеравенство

Неравенство

Меньше

Меньше или равно

Не меньше

Больше

Больше или равно

Не больше

Между двумя указанными значениями

Значение NULL

Совместимость операций

Некоторые из операций, приведенных в табл. 4.1, по-вторяются (например, <> — это то же самое, что и ! =).Выполнение операции ! < (не меньше Чём) дает такой

Page 47: SQL Without Assistance

46 Урок 4

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

Проверка одного значенияМы рассмотрели пример проверки на равенство. Теперь

рассмотрим примеры использования других операций.В первом примере выводятся названия товаров, стои-

мость которых не превышает $10:

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE prod_price < 10;

ВЫВОДprod name

Fish bean bag toyBird bean bag toyRabbit bean bag toy8 inch teddy bear12 inch teddy bearRaggedy AnnKing dollQueen doll

prod__price

3.49003.49003.49005.99008.99004.99009.49009.4900

В следующем выражении выбираются все товары, кото-рые стоят $10 и меньше (результат будет такой же, как и впервом примере, так как в базе данных нет товаров, кото-рые бы стоили ровно $10):

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE prod_price <= 10;

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

фирмой DLL01.

Page 48: SQL Without Assistance

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

ВВОДSELECT vend_id, prod_priceFROM ProductsWHERE vend id о 'DLL011;

ВЫВОДvend_id

BRS01BRS01BRS01FNG01FNG01

prod_name

8 inch teddy bear12 inch teddy bear18 inch teddy bearKing dollQueen doll

Когда использовать кавычки

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

Ниже приведен тот же пример, только здесь уже исполь-зуется операция !=, вместо <>:

ВВОДSELECT vend_id, prod_priceFROM ProductsWHERE vend id != 'DLL01

1;

Операция ! = или <>

Операции •= и <> обычно взаимозаменяемы. Однаконе во всех СУБД поддерживаются обе формы опера-ции неравенства. Например, в Microsoft Accessподдерживается операция <> и не поддерживается !=.Если у вас возникли сомнения по поводу своей СУБД,обратитесь к ее документации.

Page 49: SQL Without Assistance

48 Урок 4

Проверка на диапазон значенийДля поиска диапазона значений можно использовать

операцию BETWEEN. Ее синтаксис немного отличается отдругих операций предложения WHERE, так как для нее тре-буются два значения: начальное и конечное. Например,операцию BETWEEN можно использовать для поиска това-ров, цена которых находится в промежутке между $5 и$10, или всех дней, которые попадают в диапазон междууказанными начальным и конечным числами.

В следующем примере демонстрируется использованиеоперации BETWEEN для выборки всех товаров, цена которыхвыше $5 и ниже $10:

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE prod_price BETWEEN 5 AND 10;

ВЫВОДprod_name

8 inch teddy bear12 inch teddy bearKing dollQueen doll

Анализ

prod_price

5.99008.99009.49009.4900

Как видно из этого примера, при использовании опера-ции BETWEEN нужно указывать два значения — меньшее ибольшее из выбранного диапазона. Эти два значения долж-ны быть разделены ключевым словом AND. При этом выби-раются все значения из диапазона, включая указанные на-чальное и конечное значения.

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

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

Page 50: SQL Without Assistance

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

NULL

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

Для оператора SELECT предусмотрена специальная фор-ма предложения WHERE, которая используется для проверкизначений NULL в столбцах и содержит проверку IS NULL.Синтаксис выглядит следующим образом:

ВВОДSELECT prod_nameFROM ProductsWHERE prod_jprice IS NULL;

Это выражение возвращает список товаров без цены (по-ле prodjprice пустое, а не с ценой 0), а поскольку тако-вых нет, никаких данных мы не получим. Однако в табли-це Vendors есть столбцы со значениями NULL — в столбцеvend_state будет содержаться NULL, если не указан ника-кой штат (в случае, когда адресат находится за пределамиСоединенных Штатов):

ВВОДSELECT vend_idFROM VendorsWHERE vend state IS NULL;

ВЫВОДvend id

FNG1JTS01

Особые операции СУБД

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

Page 51: SQL Without Assistance

50 Урок 4

РезюмеВ этом уроке рассказывалось о том, как отфильтровы-

вать возвращаемые данные при помощи предложенияWHERE оператора SELECT. Теперь вы знаете, как можно про-верить данные на равенство, неравенство, наличие значенийбольше чем и меньше чем, диапазон значений, а также назначение NULL.

Page 52: SQL Without Assistance

Урок 5

Расширеннаяфильтрация данныхВ этом уроке вы узнаете, как можно комбинировать пред-ложения WHERE для создания мощных и сложных условийпоиска. Вы также узнаете, как следует использовать клю-чевые слова NOT и IN.

Комбинирование предложенийWHERE

Все предложения WHERE, представленные в уроке 4,"Фильтрация данных", отфильтровывают данные с исполь-зованием одного критерия. Чтобы увеличить уровень кон-троля над фильтром в SQL, можно использовать несколькопредложений WHERE. Эти предложения допустимо использо-вать двумя способами: в виде предложений AND или OR.

Оператор

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

1 Термин statement в русскоязычной литературе по языку SQLпринято переводить как оператор (и мы следовали этой традиции вовсех предыдущих уроках), хотя точнее его следовало бы переводитькак инструкция. В данном случае речь идет именно об операторах(operator). — Прим. ред.

Page 53: SQL Without Assistance

52 Урок 5

Использование ключевого слова ANDЧтобы отфильтровать данные по более чем одному

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

ВВОДSELECT prod_id, prod_price, prod_nameFROM ProductsWHERE vend_id = 'DLL01' AND prod_price <=4;

АнализПосредством данного оператора извлекается название

продукции и цена для всех товаров, изготовленных произ-водителем DLL01, с ценой $4 и меньше. ПредложениеWHERE в операторе SELECT состоит из двух предложений, аключевое слово AND используется для их объединения.Ключевое слово AND указывает системе управления базойданных возвращать только те строки, которые удовлетво-ряют всем перечисленным предложениям. Если продуктизготовлен производителем DLL01, но стоит больше $4, онне попадет в результаты. Аналогично, товары, которыестоят меньше $4 и изготовлены отличными от указанногопроизводителями, также не будут выведены. Данные,выданные в результате выполнения этой SQL-инструкции,будут выглядеть так:

ВЫВОДProd id

BNBG02BNBGO1BNBG03

Iprod_price

3.49003.49003.4900

prod_name

Bird bean bag toy-Fish bean bag toyRabbit bean bag toy

AND

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

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

Page 54: SQL Without Assistance

Расширенная фильтрация данных 53

Использование ключевого слова ORДействие ключевого слова OR противоположно действию

ключевого слова AND. Ключевое слово OR указывает системеуправления базой данных выбирать только те строки, кото-рые удовлетворяют хотя бы одному предложению. На са-мом деле в большинстве лучших СУБД второе предложениедаже не рассматривается в предложении OR WHERE, еслиудовлетворено первое предложение. (Если первое предло-жение выполнено, строка будет выведена независимо отвторого предложения.)

Взгляните на следующий оператор SELECT:

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE vend id = 'DLL01

1 OR vend id = 'BRS01

АнализПосредством этого SQL-оператора выбираются названия

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

ВЫВОД ^ ^ ^ Вprod name

Fish bean bag toyBird bean bag toyRabbit bean bag toy8 inch teddy bear12 inch teddy bear18 inch teddy bearRaggedy Ann

prod_price

3.49003.49003.49005.99008.990011.99004.9900

OR

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

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

Page 55: SQL Without Assistance

54 Урок 5

Порядок обработкиПредложения WHERE могут содержать любое количество

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

Однако при комбинировании ключевых слов AND и ORвозникает одна проблема. Рассмотрим следующий пример.Необходимо вывести список всех изготовленных производи-телями DLL01 и BRS01 товаров, цена которых $10 и выше.В следующей инструкции SELECT используется комбинацияключевых слов AND и OR для формулирования предложе-ния WHERE:

ВВОДSELECT prod_name, prod_j?riceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id =

AND prod_price >= 10;'BRS01

ВЫВОДprod name

Fish bean bag toy-Bird bean bag toy-Rabbit bean bag toy18 inch teddy bearRaggedy Ann

prod_price

3.49003.49003.490011.99004.9900

АнализВзгляните на результат. В четырех возвращенных стро-

ках значатся цены ниже $10 — очевидно, строки не былиотфильтрованы так, как надо. Что же произошло? Причинав порядке обработки. SQL (как и большинство других язы-ков) вначале обрабатывает логические операторы AND, а по-том уже логические операторы OR. Когда SQL "видит" такоепредложение WHERE, он его считывает так: выбрать всепродукты, которые стоят $10 и больше, изготовленныепроизводителем BRS01, и все продукты, изготовленныепроизводителем DLL01 независимо от их цены. Другимисловами, так как приоритет у логического оператора ANDвыше, были объединены "не те" операторы.

Решение этой проблемы состоит в использовании скобокдля точного группирования необходимых логических one-

Page 56: SQL Without Assistance

Расширенная фильтрация данных 55

раторов. Взгляните на следующий оператор SELECT и еговыходные данные:

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE (vend_id = 'DLL01

1 OR vend_id = 'BRS01')

AND prod_j?rice >= 10;

ВЫВОДprod_name prod_price

18 inch teddy bear 11.9900

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

ем и этим являются скобки, в которые заключены первыедва предложения оператора WHERE. Поскольку скобки име-ют еще больший приоритет, чем логические операторы ANDи OR, СУБД вначале обрабатывает условие OR внутри ско-бок. Соответственно, SQL-оператор будет пониматься так:выбрать все продукты, изготовленные либо производите-лем DLL01, либо производителем BRS01, которые стоят$10 и больше, а это именно то, что нужно.

Использование скобок в предложениях WHERE

Когда бы вы ни использовали предложения WHERE Сключевыми словами AND и OR, всегда вставляйтескобки, чтобы точно сгруппировать логические опе-раторы. Не полагайтесь на порядок обработки поумолчанию, даже если он подразумевает необходи-мый вам результат. Нет никаких недостатков в ис-пользовании скобок, кроме того, вы всегда будете за-страхованы от неопределенностей.

Page 57: SQL Without Assistance

56 Урок 5

Использование ключевогослова IN

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

ВВОДSELECT prod_name, prodjpriceFROM ProductsWHERE vend_id IN ('DLL01

1, 'BRS01

!

ORDER BY prod_name

ВЫВОДprod name

12 inch teddy bear18 inch teddy bear8 inch teddy bearBird bean bag toyFish bean bag toyRabbit bean bag toyRaggedy Ann

Анализ f T H L 5

prod_price

8.990011.99005.99003.49003.49003.49004.9900

Инструкция SELECT осуществляет выборку всех товаров,изготовленных производителями DLL01 и BRS01. Послеключевого слова IN следует список значений через запятую,а весь список заключен в скобки.

Если вы подумаете, что ключевое слово IN выполняет туже функцию, что и OR, то будете совершенно правы. Сле-дующий SQL-запрос выполняет ту же функцию, что и пре-дыдущий:

ВВОДSELECT prod_name, prod_priceFROM ProductsWHERE vend_id = 'DLL01' OR vend_id =ORDER BY prod_name;

'BRS01

Page 58: SQL Without Assistance

Расширенная фильтрация данных 57

ВЫВОДprod_name prod_price

8.990011.99005.99003.49003.49003 . 4 9 0 04 . 9 9 0 0

12 inch teddy bear18 inch teddy bear8 inch teddy bearBird bean bag toyFish bean bag toyRabbit bean bag toyRaggedy Ann

Зачем же нужно ключевое слово IN? Его преимуществаследующие.

• При работе с длинными списками необходимых зна-чений синтаксис логического оператора IN гораздолегче читать.

• При использовании ключевого слова IN гораздо легчеуправлять порядком обработки (так как используетсяменьшее количество операторов).

• Логические операторы IN почти всегда быстрее обра-батываются, чем списки логических операторов OR.

• Самое большое преимущество логического оператораIN в том, что в данном операторе может содержатьсяеще одна инструкция SELECT, а это позволяет созда-вать очень динамичные предложения WHERE. Болееподробно вы об этом узнаете в уроке 11, "Использо-вание подзапросов".

IN

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

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

Использование ключевогослова NOT

Логический оператор NOT предложения WHERE служитдля выполнения только одной функции — отрицать все

Page 59: SQL Without Assistance

58 Урок 5

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

N O T • • ; - , - . ; • • ; '• • . - • :'•• ••:• • ' : ' • :

Ключевое слово, применяемое в предложении WHEREдля отрицания какого-то условия.

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

ВВОДSELECT prod_nameFROM ProductsWHERE NOT vend_id =ORDER BY prod_name;

'DLL01 1

ВЫВОДprod_name

12 inch teddy bear18 inch teddy bear8 inch teddy bearKing dollQueen doll

АнализЗдесь логический оператор NOT отрицает предложение,

следующее за ним. Поэтому СУБД извлекает не те значенияvend_id, которые совпадают с DLL01, а все остальные.

Предыдущий запрос можно было также выполнить припомощи операции <>:

ВВОДSELECT prod_nameFROM ProductsWHERE vend_id о 'DLL01'ORDER BY prod_name;

Page 60: SQL Without Assistance

Расширенная фильтрация данных 59

ВЫВОДprod_name

12 inch teddy bear18 inch teddy bear8 inch teddy bearKing dollQueen 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.

Page 61: SQL Without Assistance
Page 62: SQL Without Assistance

Урок 6

Использованиеметасимволов дляфильтрацииВ этом уроке вы узнаете, что такое метасимволы, как ихиспользовать и как выполнять поиск с применением мета-символов и логического оператора LIKE для фильтрациивыводимых данных.

Использование логическогооператора LIKE

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

Page 63: SQL Without Assistance

62 Урок 6

:ji~~?JU: Метасимволы

^ ^ З ^ Специальные символы,части значения.

применяемые для поиска

Шаблон поиска

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

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

Предикат

Когда оператор не является оператором? Тогда,когда он является предикатом. Технически, L I K E —это предикат, а не оператор. Конечный результатостается тем же, просто не пугайтесь этого термина,если вы встретите его в документации по SQL.

Поиск с использованием метасимволов может осуществ-ляться только в текстовых полях (строках), нельзя исполь-зовать метасимволы при поиске полей с нетекстовым типомданных.

Метасимвол "знак процента" (%)Наиболее часто используемый метасимвол — знак про-

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

Page 64: SQL Without Assistance

Использование метасимволов для фильтрации 63

ВВОДSELECT prod_id, prod_nameFROM ProductsWHERE prod_name LIKE 'Fish%';

ВЫВОДprod_id

BNBG01

prod_narae

Fish bean bag toy

АнализВ этом примере используется шаблон поиска 'Fish%'.

При выполнении этого условия возвращаются все значения,которые начинаются с символов Fish. Знак % указываетСУБД принимать все символы после слова Fish независимоот их количества.

Метасимволы Microsoft Access

Если вы работаете в Microsoft Access, необходимоиспользовать символ * вместо символа %.

Зависимость от регистра

Ваша СУБД и ее конфигурация могут влиять на то, чтопоиск будет зависеть от регистра. В этом случае построке • f ish%' значение F i s h bean bag t o y не бу-дет найдено.

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

ВВОДSELECT prod_id, prod_nameFROM ProductsWHERE prod_name LIKE •%bean bag%';

Page 65: SQL Without Assistance

64 Урок 6

ВЫВОДprod_id

BNBG01BNBG02BNBG03

Анализ

prod_name

Fish bean bag toyBird bean bag toyRabbit bean bag toy

1Шаблон поиска ' %bean bag%' означает найти все зна-

чения, содержащие bean bag в любом месте названия, не-зависимо от количества символов перед или после указан-ного текста.

Метасимвол можно также использовать внутри шаблонапоиска, хотя это редко бывает полезным. В следующемпримере производится поиск всех продуктов, которые на-чинаются на F и заканчиваются на у:

ВВОДSELECT prod_nameFROM ProductsWHERE prod_name LIKE 'F%y

T;

Важно отметить, что помимо поиска одного или не-скольких символов, знак % также означает и отсутствиесимволов в указанном месте шаблона поиска.

Следите за замыкающими пробелами

Многие СУБД, включая Microsoft Access, заполняютсодержимое поля пробелами. Например, если стол-бец рассчитан на 50 символов, а в нем вставлен текстF i s h bean bag t o y (17 символов), то, чтобы запол-нить столбец, в него может быть добавлено еще 33пробела. Обычно это не влияет на данные или их ис-пользование, но может негативно отразиться на пре-дыдущем SQL-выражении. По условию WHEREprod_name LIKE ' F l y ' будут найдены только тезначения prod_name, которые начинаются на F и за-канчиваются на у. Если значение заполнено пробе-лами, оно не будет заканчиваться на у, и значениеF i s h bean bag t o y не будет извлечено. Одним изпростых решений может быть добавление второго

Page 66: SQL Without Assistance

Использование метасимволов для фильтрации 65

символа % в шаблон поиска: • F%y%', после чего будутучитываться символы (пробелы) после буквы у. Нолучше "отрезать" пробелы при помощи функций, ко-торые обсуждаются в уроке 8, "Использование функ-ций манипулирования данными".

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

подчеркивания (_). Символ подчеркивания используетсятак же, как и %, но при этом учитывается не много симво-лов, а только один.

Метасимволы в Microsoft Access

Если вы работаете в Microsoft Access, вам нужно ис-пользовать знак ? вместо символа .

Взгляните на этот пример.

ВВОДSELECT prod_id, prod_nameFROM ProductsWHERE prod_name LIKE ' inch teddy bear';

Следите за замыкающими пробелами

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

prod_name

ВЫВОДprod_id

BNBG02BNBG03

АнализВ шаблоне поиска этого предложения WHERE использова-

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

12 inch teddy bear18 inch teddy bear

Page 67: SQL Without Assistance

66 Урок 6

лону поиска: по двум символам подчеркивания было най-дено число 12 в первой строке и 18 во второй. Продукт 8inch teddy bear не был найден, так как в шаблоне поис-ка требуется два совпадения, а не одно. Для сравнения, вследующем выражении SELECT используется метасимвол %,вследствие чего извлекаются три названия товара:

ВВОДSELECT prod_id, prod_nameFROM ProductsWHERE prod_name LIKE '% inch teddy bear•

ВЫВОДprod_id prod_name

BNBG01 8 inch teddy bearBNBG02 12 inch teddy bearBNBG03 18 inch teddy bear

В отличие от знака %, который подразумевает также от-сутствие символов, знак _ всегда означает один символ —не более и не менее.

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

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

Наборы не всегда поддерживаются

В отличие от метасимволов, описанных ранее, ис-пользование квадратных скобок для создания набо-ров многими СУБД не поддерживается. Наборы под-держиваются в СУБД Microsoft Access, Microsoft SQLServer и Sybase Adaptive Server. Обратитесь к доку-ментации по вашей СУБД, чтобы определить, под-держиваются ли в ней наборы.

Например, чтобы найти все контакты людей, имена ко-торых начинаются на букву J или М, необходимо сделатьследующее:

Page 68: SQL Without Assistance

Использование метасимволов для фильтрации 67

ВВОДSELECT prod_id, prod_nameFROM CustomersWHERE cust_contact LIKE •[JM]ORDER BY cust contact

ВЫВОДcust_contact

Jim JonesJohn SmithMichelle Green

АнализУсловие WHERE в этом выражении выглядит как

1 [ JM] %'. В этом шаблоне поиска используются два разныхметасимвола. По метасимволам [JM] производится поисквсех контактных лиц, имена которых начинаются на однуиз указанных в скобках букв, но при этом учитываетсятолько один символ. Поэтому все имена длиннее одногосимвола не будут извлечены. По метасимволу %, следующе-му после [ JM], производится поиск любого количества сим-волов после первой буквы, что и приводит к требуемому ре-зультату.

Можно использовать метасимвол, выполняющий проти-воположное действие, добавив перед ним символ Л. Напри-мер, в следующем примере выбираются все имена, которыене начинаются с буквы J или М (в отличие от предыдущегопримера):

ВВОДSELECT prod_id, prod_nameFROM CustomersWHERE cust_contact LIKE ' [

AJM] %

ORDER BY cust contact

Противоположные наборы в Microsoft Access

Если вы работаете в Microsoft Access и требуетсясоздать противоположный набор, необходимо ис-пользовать символ г вместо А , поэтому указывайте

Page 69: SQL Without Assistance

68 Урок 6

Конечно, можно достичь того же результата, воспользо-вавшись логическим оператором NOT. Единственным пре-имуществом символа Л является более простой синтаксиспри выполнении нескольких предложений WHERE.

Внимание!

Метасимвол ( [ ] ) поддерживается не всеми СУБД.Обратитесь к документации по вашей СУБД, чтобыопределить, поддерживается ли этот метасимвол.

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

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

• Не злоупотребляйте метасимволами. Если можно ис-пользовать другой оператор поиска, воспользуйтесь им.

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

• Внимательно следите за местоположением метасим-волов. Если они находятся не на своем месте, будутизвлечены не те данные.

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

РезюмеВ этом уроке рассказывалось о том, что такое метасим-

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

Page 70: SQL Without Assistance

Урок 7

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

Что такое вычисляемые поляДанные, хранимые в таблицах базы данных, обычно бы-

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

• Вам необходимо отобразить поле, содержащее имякомпании с ее адресом, но эта информация располо-жена в разных столбцах таблицы.

• Город, штат и ZIP-код хранятся в отдельных столб-цах (как и должно быть), но для программы печатипочтовых наклеек необходима эта информация в од-ном, корректно сформированном поле.

• Данные в столбце введены с заглавными и строчнымибуквами, но в вашем отчете необходимо использоватьтолько заглавные буквы.

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

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

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

Page 71: SQL Without Assistance

70 Урок7

Вместо того чтобы извлекать эти данные, а затем изменятьих форму при помощи клиентского приложения или отче-та, лучше извлекать уже преобразованные, подсчитанныеили отформатированные данные прямо из базы данных.

Именно здесь помогут вычисляемые поля. В отличие отвсех выбранных нами ранее столбцов, вычисляемых полейна самом деле в таблице базы данных нет. Они создаются"на лету" SQL-оператором SELECT.

Поле

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

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

Клиентское или серверное форматирование?

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

Конкатенация полейЧтобы продемонстрировать работу вычисляемых полей,

рассмотрим простой пример — создание заголовка, состоя-щего из двух столбцов.

Page 72: SQL Without Assistance

Создание вычисляемых полей 71

В таблице Vendors содержится название поставщика иего адрес. Предположим, что вам необходимо создать отчетпо поставщику и указать его адрес как часть его имени ввиде имя {адрес) .

В отчете должно быть одно значение, а данные в таблицехранятся в двух столбцах: vend_name и vend_country.Кроме того, значение vend__country необходимо заключитьв скобки, которых нет в таблице базы данных. ВыражениеSELECT, которое возвращает имена поставщиков и адреса,довольно простое, но как создать комбинированное значение?

Конкатенация

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

Для этого необходимо соединить два значения. В SQL-выражении SELECT можно выполнить конкатенацию двухстолбцов при помощи специального оператора. В зависимо-сти от СУБД это может быть знак "плюс" (+) или две вер-тикальные черточки ( | | ) .

Оператор + или | |

В СУБД Access, SQL Server и Sybase для конкатенациииспользуется знак +. В СУБД DB2, Oracle, PostgreSQLи Sybase используется знак | |. Более подробную ин-формацию ищите в документации по вашей СУБД.Вообще-то | | — более предпочтительный операторконкатенации, так что он поддерживается все боль-шим и большим количеством СУБД.

Ниже приведен пример использования знака "плюс'(применяется синтаксис, принятый в большинстве СУБД):

ВВОДSELECT vend_name +FROM VendorsORDER BY vend_name;

(' + vend_country + ')

ВЫВОД

Bear Emporium (USA

Page 73: SQL Without Assistance

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_countryFROM VendorsORDER BY vend name;

ВЫВОД

Bear Emporium (USABeras R Us (USADoll House Inc. (USAFun and Games (EnglandFurball Inc. (USAJouets et ours (France

АнализВ предыдущих операторах SELECT была выполнена кон-

катенация следующих элементов:• имя, хранящееся в столбце vend_name;• строка, содержащая пробел и открывающую круглую

скобку;• название штата, хранящееся в столбце vend_country;• строка, содержащая закрывающую круглую скобку.Как видно из приведенного выше результата, выражение

SELECT возвращает один столбец (вычисляемое поле), со-держащий все четыре элемента как одно целое.

Конкатенация в MySQL

В MySQL не поддерживается конкатенация при по-мощи оператора + или | | .Здесь необходимо исполь-зовать функцию CONCAT'{), в которой указываетсясписок элементов, по отношению к которым необхо-димо выполнить конкатенацию. При использованиифункции CONCAT () первая строка примера выгляделабы так:

Page 74: SQL Without Assistance

Создание вычисляемых полей 73

SELECT GONCAT (vend__name, ' С , fvend_country, ' ) ' )В MySQL поддерживается использование оператора

|, но не для конкатенации. В MySQL || является эк-вивалентом логического оператора OR, a &&— экви-валентом логического оператора AND.

Взгляните еще раз на результат, полученный после при-менения оператора SELECT. Два столбца, объединенные ввычисляемое поле, заполнены пробелами. Во многих базахданных (но не во всех) сохраненный текст дополняется про-белами до ширины столбца. Чтобы выбрать правильно от-форматированные данные, необходимо убрать добавленныепробелы. Это можно сделать при помощи SQL-функцииRTRIMO следующим образом:

ВВОДSELECT RTRIM(vend_name)FROM VendorsORDER BY vend name;

(' + RTRIM(vend_country) + ')

ВЫВОД

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)FROM VendorsORDER BY v e n d name;

RTRIM(vend_country) ])

ВЫВОД

Bear Emporium (USA)Beras R Us (USA)Doll House Inc. (USA)Fun and Games (England)Furball Inc. (USA)Jouets et ours (France)

Page 75: SQL Without Assistance

74 Урок 7

АнализФункция RTRIMO отбрасывает все пробелы справа от

указанного значения. При использовании функции RTRIM ()каждый отдельный столбец обрабатывается корректно. Го-род, штат указываются через запятую и пробел, а штат иZIP-код — через пробел.

Ф у н к ц и и T R I M

В большинстве СУБД поддерживаются как функцияR T R I M () (которая, как мы увидели, "обрезает" правуючасть строки), так и L T R I M () (которая удаляет левуючасть строки), а также T R I M О (которая "обрезает"строку слева и справа).

Использование псевдонимовОператор SELECT, который использовался для конкате-

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

Для решения этой проблемы в SQL была включена под-держка псевдонимов. Псевдоним — это альтернативное имядля поля или значения. Псевдонимы присваиваются припомощи ключевого слова AS. Взгляните на следующий опе-ратор SELECT:

ВВОДSELECT RTRIM(vend_name)^AS v e n d _ t i t l eFROM VendorsORDER BY vend name;

(' + RTRIM(vend_country) + ')

ВЫВОДvend_title

Bear Emporium (USA)

Page 76: SQL Without Assistance

Создание вычисляемых полей 75

Beras R Us (USA)Doll House Inc. (USA)Fun and Games (England)Furball Inc. (USA)Jouets et ours (France)

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

ВВОДSELECT RTRIM(vend_name)^AS v e n d _ t i t l eFROM VendorsORDER BY vend name;

RTRIM(vend_country)

ВЫВОД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 vend_ti t le . Таким образом,SQL создает вычисляемое поле, содержащее результат вы-числений, под названием vend_ti t le . Как видите, результатостается тем же, но столбец теперь носит имя vend_ti t le илюбое клиентское приложение может обращаться к нему поимени, как если бы это был реальный столбец таблицы.

Другое использование псевдонимов

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

Page 77: SQL Without Assistance

76 Урок 7

Имена псевдонимов

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

Производные столбцы

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

Выполнение математическихвычислений

Еще одним способом использования вычисляемых полейявляется выполнение математических операций над вы-бранными данными. Рассмотрим пример. В таблице Ordersхранятся все полученные заказы, а в таблице Order Itemsсодержатся наименования продуктов для каждого заказа.Следующий SQL-оператор осуществляет выборку всех про-дуктов в заказе номер 2 0008:

ВВОДSELECT prod_id, quantity, item_priceFROM OrderltemsWHERE order nam = 20008;

ВЫВОДprod id quantity item_price

RGAN01BR03BNBG01

5510

4.990011.99003.4900

Page 78: SQL Without Assistance

Создание вычисляемых полей 77

BNBG02BNBG03

1010

3.49003 .4900

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

ВВОДSELECT prod_id,

quantity,item_pricequantity*item_j?rice AS expanded_price

FROM OrderItemsWHERE order nam = 20008;

ВЫВОДprod_id quantityexpanded_price

item_price

RGAN01BR03BNBG01BNBG02BNBG03

Анализ

55101010

4.990011.99003.49003.49003.4900

24.950059.950034.900034.900034.9000

Столбец expanded_price, показанный в предыдущемрезультате, является вычисляемым полем; вычисление бы-ло простым: quanti ty* itera_price. Теперь клиентскоеприложение может использовать этот новый вычисляемыйстолбец, как и любой другой в таблице.

В SQL поддерживаются основные математические опера-ции, перечисленные в табл. 7.1. Кроме того, для управле-ния порядком обработки можно использовать круглыескобки. В уроке 5, "Расширенная фильтрация данных",рассказывается о порядке обработки.

Таблица 7 . 1 . Математические операции в SQL

Операция ОписаниеСложениеВычитаниеУмножениеДеление

Page 79: SQL Without Assistance

78 Урок7

РезюмеВ этом уроке вы узнали, что такое вычисляемые поля и

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

Page 80: SQL Without Assistance

Урок 8

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

Что такое функцияКак и в большинстве других языков программирования,

в SQL поддерживается использование функций для мани-пулирования данными. Функции — это операции, которыеобычно производятся над данными, чаще всего для облег-чения преобразований и манипулирования.

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

Проблемы с функциямиПеред тем как начать урок и рассмотреть примеры, об-

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

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

Page 81: SQL Without Assistance

80 Урок 8

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

Таблица 8 . 1 . Различия в функциях СУБД

Функция Синтаксис

Выборка части строки

Преобразование типаданных

Получение текущейдаты

В Access используется функцияMID ( ) . В DB2, Oracle и PostgreSQL ис-пользуется функция SUBSTR () .В MySQL, SQL Server и Sybase —SUBSTRING()

В Access и Oracle используются не-сколько функций, по одной на каждыйтип преобразования. В DB2 иPostgreSQL используется функцияCAST ( ) . В MySQL, SQL Server и Sybaseиспользуется функция CONVERT ()

В Access используется функция NOW ( ) .В DB2 и PostgreSQL — CURRENT_DATE.В MySQL используется функцияCURDATE () . В Oracle — SYSDATE.В SQL Server и Sybase — GETDATE ()

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

,. Переносимый код

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

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

Page 82: SQL Without Assistance

Использование функций манипулирования данными 81

Стоит ли использовать функции?

Итак, вы пытаетесь решить, использовать функцииили нет. Это решение зависит от вас, и здесь нет пра-вильного или неправильного выбора. Если вы решилииспользовать функции, дописывайте подробныекомментарии к коду, чтобы в будущем вы (или другойразработчик) могли узнать, для какой реализацииSQL писался данный код.

Использование функцийВ большинстве реализаций SQL поддерживаются сле-

дующие типы функций.• Текстовые функции; используются для управления

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

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

• Функции даты и времени; используются для управ-ления значениями даты и времени и для выборки от-дельных частей этих значений (например, для воз-вращения разницы между датами и проверки даты накорректность).

• Системные функции; возвращают информацию, спе-цифичную для используемой СУБД (например, воз-вращают регистрационную информацию пользователя).

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

Page 83: SQL Without Assistance

82 Урок 8

Функции манипулирования текстомВ примере функций манипулирования текстом в седь-

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

ВВОДSELECT vend_name UPPER(vend_name) AS vend_name_upcaseFROM VendorsORDER BY vend name;

ВЫВОДvend name

Bear EmporiumBeras R UsDoll House Inc.Fun and GamesFurball Inc.Jouets et ours

vend_name_upcase

BEAR EMPORIUMBERAS R USDOLL HOUSE INC.FUN AND GAMESFURBALL INC.JOUETS ET OURS

АнализФункция UPPER () преобразует текст в верхний регистр

и, таким образом, в этом примере имя каждого изготовите-ля перечислено дважды: первый раз в таком виде, в какомоно хранится в таблице Vendors, а второй раз — будучипреобразованным в верхний регистр, в виде столбцаvend_name_upсase.

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

Один элемент из табл. 8.2 требует более подробного объ-яснения. SOUNDEX — это алгоритм, преобразующий тексто-вую строку в буквенно-цифровой шаблон, описывающийфонетическое представление данного текста. ФункцияSOUNDEX берет в расчет похожие по звучанию буквы и сло-ги, позволяя сравнивать строки не по тому, как они пишут-ся, а по тому, как они звучат. Хотя SOUNDEX не подпадаетпод основные концепции SQL, большинство СУБД осущест-вляют поддержку этой функции.

Page 84: SQL Without Assistance

Использование функций манипулирования данными 83

Таблица 8.2. Наиболее часто используемые функцииманипулирования текстом

Функция Описание

LEFT () (или функция под-строки)

LENGTH (а т а к ж еDATALENGTH () и л и LEN () )

LOWER ()

LTRIM () (LCASE () в Access)

RIGHT () (или ф у н к ц и яподстроки)

RTRIM()

SOUNDEX ()

UPPER () (UCASE в Access)

Возвращает символы из левой час-ти строки

Возвращает длину строки

Преобразует строку в нижний ре-гистр

Удаляет пробелы в левой частистроки

Возвращает символы из правойчасти строки

Удаляет пробелы в правой частистроки

Возвращает значение SOUNDEXстроки

Преобразует текст строки в верх-ний регистр

Поддержка SOUNDEX

Функция S O U N D E X (). не поддерживается Microsoft

Access или PostgreSQL, поэтому следующий примерне будет работать в этих СУБД.

Ниже приведен пример использования функцииSOUNDEX (). Клиент Kids Place находится в таблицеCustomers и имеет контактное лицо Michelle Green. Ночто, если это опечатка и на самом деле контактное лицопишется как Michael Green? Очевидно, поиск по коррект-ному имени ничего не даст, это показано ниже:

ВВОДSELECT cust_name cust_contractFROM CustomersWHERE cust contract = 'Michael Green

1

Page 85: SQL Without Assistance

84 Урок 8

ВЫВОДcust name cust contract

А теперь попробуйте выполнить поиск при помощифункции SOUNDEX (), чтобы найти все имена контактныхлиц, которые звучат как Michael Green:

ВВОДSELECT cust_name cust_contractFROM CustomersWHERE SOUNDEX(cust_contract) = SOUNDEX('MichaelOGreen

1) ;

ВЫВОДcust_name cust_contract

Kids Place Michelle Green

АнализВ этом примере в предложении WHERE используется

функция SOUNDEX () для преобразования значения столбцаcust_contact и искомой строки в их SOUNDEX-значения.Так как Michael Green и Michelle Green звучат одина-ково, их SOUNDEX-значения совпадут и предложение WHEREкорректно отфильтрует необходимые данные.

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

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

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

Page 86: SQL Without Assistance

Использование функций манипулирования данными 85

ше всего поддаются переносу на другие платформы и реа-лизации SQL.

Чтобы продемонстрировать процедуру использованияфункции манипулирования датой и временем, приведемпростой пример. В таблице Orders все заказы хранятся сдатой заказа. Чтобы извлечь список всех заказов, сделан-ных в 2 004 году, в SQL Server и Sybase необходимо выпол-нить следующее:

ВВОДSELECT order_numFROM OrdersWHERE DATEPART(yy, order_date) = 2004;

ВЫВОДorder num

2000520006200072000820009

В Access используйте следующую версию примера:

ВВОДSELECT order_numFROM OrdersWHERE DATEPART('yyyy*, order_date) = 2004;

АнализВ этом примере (в версиях для SQL Server и Sybase и в

Access) используется функция DATE PART (), которая, каквидно из названия, возвращает только часть даты. В функ-ции DATE PART () используются два параметра: часть, подле-жащая возвращению, и дата, из которой эта часть возвраща-ется. В рассматриваемом примере функция DATEPARTO изстолбца order_column возвращает только год. Путем срав-нения полученного значения со значением 2 004 предложе-ние WHERE выбирает только те заказы, которые были сдела-ны в этом году.

Ниже приведена версия данного примера для PostgreSQL,в которой используется похожая функция DATE_PART ():

Page 87: SQL Without Assistance

86 Урок 8

ВВОДSELECT order_numFROM OrdersWHERE DATE_PART('year• , order_date) = 2004;

В MySQL, помимо DATEPARTO, есть множество другихфункций, предназначенных для манипулирования значе-ниями дат. Пользователи MySQL могут использовать функ-цию YEAR () для выборки из даты значения года:

ВВОДSELECT order_numFROM OrdersWHERE YEAR(order_date) = 2004;

В Oracle также нет функции DATE PART (), но существуютнесколько других функций манипулирования датой, кото-рые можно использовать с этой же целью. Рассмотримпример:

ВВОДSELECT order_numFROM OrdersWHERE t o number(to char(order d a t e ,

Анализ

•YY1)) = 2 0 0 4 ;

В этом примере функция to_char () используется дляизвлечения части даты, а функция to_number() — дляпреобразования этой части в числовое значение, чтобы егоможно было сравнить со значением 2 004.

Тех же результатов можно добиться при помощи опера-тора BETWEEN:

ВВОДSELECT order_numFROM OrdersWHERE order_date BETWEEN to_date('01-JAN-2004AND t o date( '31-DEC-2004');

АнализВ этом примере функция Oracle to_date () используется

для преобразования двух строк в даты. В одной содержитсядата 1 января 2004, а в другой — 31 декабря 2004. Стан-

Page 88: SQL Without Assistance

Использование функций манипулирования данными 87

дартный оператор BETWEEN используется для поиска всехзаказов, сделанных в период между этими двумя датами.Этот код не будет работать в SQL Server, так как в этойСУБД не поддерживается функция to_date (). Однако еслизаменить функцию to_date () функцией DATAPART (), этотоператор можно будет использовать.

Даты в Oracle

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

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

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

Функции для манипулированиячислами

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

По иронии судьбы среди всех функций в большинствеСУБД именно числовые функции наиболее стандартизиро-ваны. В табл. 8.3 перечислены наиболее часто используе-мые функции манипулирования числовыми данными.

Page 89: SQL Without Assistance

88 Урок 8

Таблица 8.3. Наиболее часто используемые функцииманипулирования числами

Функция Описание

ABS () Возвращает абсолютное значение числа

COS () Возвращает косинус указанного угла

ЕХР () Возвращает экспоненту указанного числа

PI () Возвращает значение числа пи

SIN () Возвращает синус указанного угла

SQRT () Возвращает квадратный корень указанного числа

TAN () Возвращает тангенс указанного угла

Обратитесь к документации по вашей СУБД, чтобы оп-ределить, какие функции манипулирования числовымиданными она поддерживает.

РезюмеВ этом уроке объяснялось, как можно использовать SQL-

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

Page 90: SQL Without Assistance

Урок 9

Суммирование данныхВ этом уроке вы узнаете, что такое статистические SQL-функции и как их можно использовать для суммированияданных таблицы

Использование статистическихфункций

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

• определение числа строк в таблице (либо числа строк,которые удовлетворяют какому-то условию или со-держат определенное значение);

• получение суммы по набору строк в таблице;• поиск наибольшего, наименьшего и среднего значе-

ний из столбца таблицы (из всех или из каких-токонкретных строк).

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

Чтобы облегчить такой способ извлечения информации,в SQL предусмотрен набор из пяти статистических функ-ций, которые перечислены в табл. 9.1. Эти функции позво-ляют выполнять все варианты выборки, которые были пе-речислены выше. В отличие от функций манипулированияданными из предыдущего урока, статистические SQL-

Page 91: SQL Without Assistance

90 Урок 9

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

Статистические (итоговые) функции

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

Таблица 9 . 1 . Статистические SQL-функции

Функция Описание

AVG () Возвращает среднее значение столбца

COUNT () Возвращает число строк в столбце

МАХ () Возвращает самое большое значение в столбце

MIN () Возвращает самое маленькое значение в столбце

SUM () Возвращает сумму значений столбца

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

Функция AVG ()Функция AVG () используется для возвращения среднего

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

В первом примере функция AVG () исользуется для возвра-щения средней цены для всех продуктов таблицы Products:

ВВОДSELECT AVG(prod_price) AS avg_jpriceFROM Products ;

ВЫВОДavg_price

6.823333

Page 92: SQL Without Assistance

Суммирование данных 91

АнализВыражение SELECT, приведенное выше, возвращает одно

значение, avg_price, в котором содержится средняя ценавсех продуктов таблицы Products. Здесь avg_price — этопсевдоним, описанный в уроке 7, "Создание вычисляемыхполей."

Функцию AVG () можно также использовать для нахож-дения среднего значения определенных столбцов или строк.В следущем примере возвращается средняя цена продуктов,предлагаемых определенным поставщиком:

ВВОДSELECT AVG(prod_price) AS avg_j>riceFROM ProductsWHERE 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 ( ) .

Page 93: SQL Without Assistance

92 Урок 9

Значения NULL

Строки столбца, содержащие значения N U L L , игнори-руются функцией A V G ( ) .

Функция COUNT ()

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

Эту функцию можно использовать двумя способами:• В виде COUNT {*) для подсчета числа строк в таблице

независимо от того, содержат столбцы значения NULLили нет.

• В виде COUNT (column) для подсчета числа строк, ко-торые имеют значения в указанных столбцах, причемзначения NULL игнорируются.

В первом примере возвращается общее число имен кли-ентов, содержащихся в таблице Customers:

ВВОДSELECT COUNT(*) AS num_custFROM Cu s t ome r s;

ВЫВОДnum_cust

5

АнализВ этом примере функция COUNT (*) используется для

подсчета всех строк независимо от их значений. Сумма воз-вращается в переменную num_cust.

В следующем примере подсчитываются только клиенты,имеющие адреса электронной почты:

ВВОДSELECT COUNT(cust_email) AS num_custFROM Customers;

Page 94: SQL Without Assistance

Суммирование данных 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_priceFROM Products;

ВЫВОДmax_price

11.9900

АнализЗдесь функция MAX () возвращает цену наиболее дорого-

го продукта в таблице Products.

Page 95: SQL Without Assistance

9 4 Урок 9

Использование функции М А Х ( ) С нечисловымиданными

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

Значения NULL

Строки столбцов со значениями N U L L игнорируются

функцией МАХ ( ) .

Функция MIN ()Функция MIN () производит противоположное по отно-

шению к МАХ () действие — она возвращает наименьшеезначение в указанном столбце. Так же, как и для функцииМАХ ( ) , для MIN () требуется указать имя столбца, как пока-зано ниже:

ВВОДSELECT MIN(prod_price) AS min_priceFROM Products;

ВЫВОДmin_pnce

3.4900

АнализЗдесь MIN () возвращает цену самого дешевого продукта

в таблице P r o d u c t s .

Page 96: SQL Without Assistance

Суммирование данных 95

Использование функции M I N ( ) С нечисловымиданными

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

З н а ч е н и я N U L L

Строки столбцов со значениями N U L L игнорируютсяфункцией мш О.

Функция SUMOФункция SUM() возвращает сумму (общую) значений в

определенном столбце.Ниже приведен пример, демонстрирующий это действие.

В таблице Orderltems содержатся предметы заказа, при-чем каждому предмету соответствует определенное количе-ство заказов. Общее число заказанных продуктов (суммавсех значений переменной quantity) может быть выбранаследующим образом:

ВВОДSELECT SUM(quantity) AS item_orderedFROM OrderltemsWHERE order item = 20005;

ВЫВОДitem_ordered

200

Page 97: SQL Without Assistance

96 Урок 9

АнализФункция SUM (quantity) возвращает сумму всех пред-

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

ВВОДSELECT SUM(item_price*quantity) AS total_priceFROM OrderIternsWHERE order item = 20005;

ВЫВОДtotal_price

1648.0000

Функция SUM(item_price*quantity) возвращает сум-му всех цен в заказе, а предложение WHERE гарантирует,что учитываться будут только необходимые продукты.

Вычисления с несколькими столбцами

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

З н а ч е н и я N U L L

Строки столбцов со значениями N U L L игнорируютсяф у н к ц и е й S U M ( ) .

Статистические вычислениядля отдельных значений

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

• для вычисления во всех строках при указании аргу-мента ALL или без указания какого-либо аргумента(так как ALL является аргументом по умолчанию);

Page 98: SQL Without Assistance

Суммирование данных 97

для указания отдельных значении при помощи аргу-мента DISTINCT.

A L L п о у м о л ч а н и ю

Аргумент A L L не обязательно указывать, так как онявляется аргументом по умолчанию. Если не указана р г у м е н т D I S T I N C T , T O п о д р а з у м е в а е т с я а р г у м е н т

A L L . • . . . . - • / " ' •• :• • ' - . - • •'

Не в Access

Microsoft Access не поддерживает использованиеаргумента D I S T I N C T В статистических функциях,поэтому следующий пример не будет работать вAccess.

В следующем примере используется функция AVG () длявозвращения средней цены продуктов, предлагаемых опре-деленным поставщиком. Это такой же оператор SELECT,как и предыдущий, но с использованием ключевого словаDISTINCT — при вычислении среднего значения учитыва-ются только определенные цены.

ВВОДSELECT AVG(DISTINCT prod_price) AS avg_priceFROM ProductsWHERE v e n d i d = ' L L 0 1 ' ;

ВЫВОДavg_price

4.2400

АнализВ этом примере вследствие использования ключевого

слова DISTINCT значение avg_j?rice получается более вы-соким, так как в таблице есть несколько предметов с оди-наково низкой ценой. Не учитывая их, мы получаем болеевысокую среднюю стоимость.

Page 99: SQL Without Assistance

98 Урок 9

Внимание

Ключевое слово D I S T I N C T МОЖНО использовать С

функцией COUNT (} только в том случае, если указаноимя столбца. Его нельзя использовать с функциейC O U N T ( * ) . Аналогично, D I S T I N C T нужно использо-вать С именем столбца, но не с выражением.

Использование ключевогофункциями M I N () и МАХ ()

слова DISTINCT с

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

Предикаты

Помимо ключевых слов D I S T I N C T И A L L , некоторыеСУБД поддерживают предикаты, такие как ТОР И ТОРP E R C E N T , позволяющие выполнять действия над

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

Комбинированиестатистических функций

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

Page 100: SQL Without Assistance

Суммирование данных 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;

price_min

3.4900

price__max

11.9900

price_avg

6.823333

ВЫВОДnum items

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

статистические функции и возвращаются четыре значения(число элементов в таблице Products, самая высокая, са-мая низкая и средняя их стоимость).

Псевдонимы

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

РезюмеСтатистические функции используются для получения

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

Page 101: SQL Without Assistance
Page 102: SQL Without Assistance

Урок 10

Итоговые данныеВ этом уроке вы узнаете, как получать итоговые данныетаким образом, чтобы можно было суммировать подмножест-ва из содержимого таблицы. Для этого используются два но-вых предложения оператора SELECT, предложение GROUP BYи предложение HAVING.

Получение итоговых данныхИз предыдущего урока вы узнали, что статистические

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

Все эти вычисления до сих пор выполнялись над всемиданными таблицы или над данными, которые соответство-вали указанному предложению WHERE. В качестве напоми-нания приведем пример, в котором возвращается количест-во продуктов, предлагаемых поставщиком DLL01:

ВВОДSELECT COUNT(*) AS num_prodsFROM ProductsWHERE v e n d i d = 'DLLOl ' ;

ВЫВОДnum_j?rods

Но что, если вы хотите узнать количество продуктов,предлагаемых каждым поставщиком? Или выяснить, какиепоставщики предлагают только один продукт, или, наобо-рот, несколько продуктов?

Page 103: SQL Without Assistance

102 Урок 10

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

Создание группГруппы создаются с помощью предложения GROUP BY

оператора SELECT.Лучше всего это можно объяснить на примере:

ВВОДSELECT vend_id, COUNT(*) AS numjprodsFROM ProductsGROUP BY vend id;

ВЫВОДvend id num_prods

BRS01DLL01FNG01

АнализВышеприведенный оператор SELECT предписывает вы-

вести два столбца —vend_id, содержащий идентификаторпоставщика продукта, и num_prods, содержащий вычис-ляемые поля (он создается с помощью функции COUNT (*)).Предложение GROUP BY указывает СУБД сортировать дан-ные и группировать их по столбцу vend_id. В результатезначение num_prods будет вычисляться по одному разу длякаждой группы записей vend_id, а не один раз для всейтаблицы products. Как видите, в результатах указывается,что поставщик BRS01 предлагает три продукта, поставщикDLL01 — четыре продукта, а поставщик FNG01 — 2 продукта.

Поскольку было использовано предложение GROUP BY,не потребовалось указывать каждую группу, для которойдолжны быть произведены вычисления. Это было сделаноавтоматически. Предложение GROUP BY указывает СУБДгруппировать данные и затем выполнять вычисление покаждой группе, а не по всему набору результатов.

Page 104: SQL Without Assistance

Итоговые данные 103

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

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

• Если вы используете вложенные группы в предложе-нии GROUP BY, данные суммируются для последнейуказанной вами группы. Другими словами, если вве-дено группирование, вычисления осуществляются длявсех указанных столбцов (вы не сможете вернутьданные для каждого отдельного столбца).

• Каждый столбец, указанный в предложенииGROUP BY, должен быть столбцом выборки или вы-ражением (но не функцией группирования). Если воператоре SELECT используется какое-то выражение,то же самое выражение должно быть указано в пред-ложении GROUP BY. Псевдонимы применять нельзя.

• В большинстве реализаций SQL нельзя указывать впредложении GROUP BY столбцы, в которых содер-жатся данные переменной длины (т.е. столбцы, со-держащие текстовые поля или поля комментариев).

• За исключением операторов статистических вычисле-ний, каждый столбец, упомянутый в оператореSELECT, должен быть представлен в предложенииGROUP BY.

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

• Предложение GROUP BY должно следовать после пред-ложения WHERE и до какого-либо предложенияORDER BY.

П р е д л о ж е н и е A L L

В некоторых реализациях SQL (например, в MicrosoftSQL Server) опционально поддерживается предложе-

Page 105: SQL Without Assistance

104 Урок 10

н и е A L L в п р е д л о ж е н и и G R O U P B Y . Э т о п р е д л о ж е н и е

можно использовать для возвращения всех групп,даже тех, которые не имеют соответствующих строк(в этом случае функция группирования возвращаетзначение NULL). Обратитесь к документации своейСУБД, чтобы узнать, поддерживает ли она предложе-ние A L L . V- •.. / [•• - . : . . - . ; : :

Указание столбцов по их относительному поло-жению

Некоторые реализации SQL позволяют указыватьстолбцы в предложении GROUP B Y по их положению в

с п и с к е S E L E C T . Н а п р и м е р , в ы р а ж е н и е G R O U P B Y 2 , 1

может означать группирование по выбранному вто-рому столбцу и затем по первому/Хотя этот "стено-графический" синтаксис удобен, он поддерживаетсяне всеми реализациями SQL. Его применение такжеявляется рискованным в том смысле, что весьма вы-сока вероятность появления ошибок при редактиро-вании операторов SQL.

Фильтрующие группыВ дополнение к способности группировать данные с по-

мощью предложения GROUP BY, SQL также позволяет осу-ществлять фильтрацию — указывать, какие группы долж-ны быть включены в результат, а какие исключены из не-го. Например, вам может понадобиться список клиентов,которые сделали хотя бы два заказа. Чтобы получить такиеданные, необходим фильтр, относящийся к целой группе, ане к отдельным строкам.

Вы уже знаете, как действует предложение WHERE (егомы рассматривали ранее, в уроке 4, "Фильтрация данных").Однако в данном случае предложение WHERE использоватьнельзя, поскольку фильтры WHERE указывают строки, а негруппы. Собственно говоря, WHERE "не знает", что такоегруппы.

Page 106: SQL Without Assistance

Итоговые данные 105

Но тогда что можно использовать вместо предложенияWHERE? SQL предлагает другое предложение, подходящеедля этих целей: предложение HAVING. Предложение HAVINGочень похоже на предложение WHERE. И действительно, всетипы выражений в предложении WHERE, с которыми выуже знакомы, могут быть также использованы с предложе-нием HAVING. Единственная разница состоит в том, чтоWHERE фильтрует строки, a HAVING — группы.

Предложение H A V I N G МОЖНО использовать со

всеми операторами

Из уроков 4 и 5 вы знаете, как можно применятьпредложение WHERE (включая использование мета-символов и логических операций). Все эти методы иопции могут быть применены и по отношению кHAVING. Синтаксис такой же, отличаются только клю-чевые слова.

Вспомним, как фильтруются строки. Посмотрите на сле-дующий пример.

вводSELECT cust_id, COUNT(*) AS ordersFROM OrdersGROUP BY cust_idHAVING COUNT(*) >= 2;

ВЫВОДcust_id

1000000001

orders

2

АнализПервые три строки этого оператора SELECT аналогичны

оператору, рассмотренному ранее. Последняя строка добав-ляет к нему предложение HAVING, которое фильтрует этигруппы с помощью функции COUNT (*) >= 2 — два илибольше заказов.

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

Page 107: SQL Without Assistance

106 Урок 10

Разница между HAVING и WHERE

Вот как это можно рассматривать: WHERE фильтрует

до того, как данные будут сгруппированы, a H A V I N G

фильтрует после того, как данные были сгруппирова-ны. Это— важное различие; строки, которые быливыброшены по предложению WHERE, не будут включе-ны в группу, иначе это могло бы изменить вычисляе-мые значения, которые, в свою очередь, могли бы по-влиять на фильтрацию групп в предложении HAVING.

А теперь подумаем: возникает ли необходимость в ис-пользовании как предложения WHERE, так и предложенияHAVING в одном операторе?

Конечно, возникает. Предположим, вы хотите усовер-шенствовать фильтр предыдущего оператора таким обра-зом, чтобы он возвращал имена всех клиентов, которыесделали два или больше заказов за последние 12 месяцев.Чтобы добиться этого, вы можете добавить предложениеWHERE, которое берет во внимание только заказы, сделан-ные в последние 12 месяцев. Затем вы добавляете предло-жение HAVING, чтобы отфильтровать только те группы, вкоторых имеются две или больше строк.

Чтобы лучше разобраться в этом, рассмотрим следую-щий пример, где перечисляются все поставщики, которыепредлагают несколько продуктов по цене 4 и более за еди-ницу:

ВВОДSELECT vend_id, COUNT(*) AS num_prodsFROM ProductsWHERE prod_price >= 4GROUP BY vend_idHAVING COUNT(*) >= 2;

ВЫВОДvend id

BRS01FNG01

num_jprods

32

Page 108: SQL Without Assistance

Итоговые данные 1 0 7

АнализЭтот пример нуждается в пояснении. Первая строка

представляет собой основной оператор SELECT, использую-щий статистическую функцию, — точно так же, как в пре-дыдущих примерах. Предложение WHERE фильтрует всестроки со значениями в столбце prod_price не менее 4.Затем данные группируются по столбцу vend_id, а потомпредложение HAVING фильтрует только группы, содержа-щие не менее двух членов. При отсутствии предложенияWHERE была бы получена лишняя строка (поставщик, пред-лагающий 4 продукта, каждый из которых дешевле 4), какпоказано ниже.

ВВОДSELECT vend_id, COUNT(*) AS num_prodsFROM ProductsGROUP BY vend_idHAVING COUNT(*) >= 2;

ВЫВОДvend id num_prods

BRS01DLL01FNG01

Использование п р е д л о ж е н и й H A V I N G И WHERE

Предложение H A V I N G так похоже на предложение

WHERE, что в большинстве СУБД оно трактуется точно

так же, если только не указано никакое предложение

GROUP BY. И все же вы должны знать, что между ними

существует разница. Используйте предложениеH A V I N G т о л ь к о в м е с т е с п р е д л о ж е н и я м и G R O U P B Y , a

предложение W H E R E — для стандартной фильтрации

на уровне строк.

Page 109: SQL Without Assistance

108 Урок 10

Группирование и сортировкаВажно понимать, что предложения GROUP BY и ORDER

BY весьма различны, хотя с их помощью иногда можно до-биться одинаковых результатов. Разобраться в этом вампоможет табл. 10.1.

Таблица 1 0 . 1 . Сравнение предложений ORDER BY И

GROUP BY

ORDER BY GROUP BYСортирует полученные ре- Группирует строки. Однако ото-зультаты бражаемый результат может не

соответствовать порядку группи-рования

Могут быть использованы Могут быть использованы тольколюбые столбцы (даже не выбранные столбцы или выраже-выбранные в предложении ния; должно быть использованоSELECT) выражение для каждого выбран-

ного столбца

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

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

Page 110: SQL Without Assistance

Итоговые данные 109

Не забывайте использовать предложение ORDER BY

Как правило, каждый раз, когда вы используете пред-ложение GROUP BY, приходится указывать и предло-жение ORDER BY. Это — единственный способ, гаран-тирующий, что данные будут отсортированы правиль-но. Не следует надеяться на то, что ваши данныео т с о р т и р у е т п р е д л о ж е н и е G R O U P B Y .

Чтобы вы могли понять, как следует использовать совме-стно предложения GROUP BY и ORDER BY, рассмотрим при-мер. Следующий оператор SELECT аналогичен тем, которыеиспользовались ранее: он выводит номер заказа и количест-во предметов, упорядоченных по всем заказам, которые со-держат три или больше предметов.

ВВОДSELECT order_num, COUNT(*]FROM OrderIternsGROUP BY order_numHAVING COUNT(*) >= 3;

AS items

ВЫВОДorder num items

20006200072000820009

Чтобы отсортировать результат по количеству заказан-ных предметов, все, что вам необходимо сделать, — это до-бавить предложение ORDER BY, как показано ниже:

ВВОДSELECT order_num, COUNT(*) AS itemsFROM OrderIternsGROUP BY order_numHAVING COUNT(*) >= 3;ORDER BY items, order num;

Page 111: SQL Without Assistance

110 Урок 10

f f

Несовместимость с Access

СУБД Microsoft Access не позволяет осуществлятьсортировку по псевдонимам, и для нее этот примернеприменим. Выход состоит в замене столбца i tems(в предложении ORDER BY) вычисляемым выражени-ем или номером поля. По существу, будут работатьо б а п р е д л о ж е н и я , O R D E R 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

20006200092000720008

АнализВ этом примере предложение GROUP BY используется

для группирования данных по номеру заказа (столбецorder_num), так что функция COUNT (*) может возвратитьколичество предметов в каждом заказе. ПредложениеHAVING фильтрует данные таким образом, что возвращают-ся только заказы с тремя и более предметами. Наконец, ре-зультат сортируется за счет использования предложенияORDER BY.

Упорядочение предложенияSELECT

Предложения оператора SELECT указываются в опреде-ленном порядке. В табл. 10.2 перечислены все предложе-ния, которые мы изучили о сих пор, в порядке, в которомони должны использоваться.

Page 112: SQL Without Assistance

Итоговые данные 111

Таблица 1 0 . 2 . Предложения о п е р а т о р а S E L E C T

и последовательность их использования

Предложение Описание НеобходимостьSELECT Столбцы и л и выра-

ж е н и я , которыед о л ж н ы быть воз-в р а щ е н ы

FROM Таблица д л я возвра-щ е н и я д а н н ы х и з . . .

WHERE Ф и л ь т р а ц и я на уров-не строк

GROUP BY Определение группы

HAVING Ф и л ь т р а ц и я на уров-не групп

ORDER BY Упорядочивание ре-зультатов сортировки

Да

Только если выбирают-ся данные из таблицы

Нет

Только если осуществ-л я ю т с я статистическиев ы ч и с л е н и я по группе

Нет

Нет

РезюмеВ уроке 9, "Суммирование данных," вы узнали, как ис-

пользовать статистические функции SQL для выполненияопераций суммирования над данными. В этом уроке расска-зывалось о том, как нужно использовать предложениеGROUP BY для выполнения вычислений по отношению кгруппам данных, возвращения результатов для каждойгруппы. Было описано, как можно использовать предложе-ние HAVING для фильтрации указанных групп, в урокетакже пояснялось, какова разница между ORDER BY иGROUP BY и между предложениями WHERE и HAVING.

Page 113: SQL Without Assistance
Page 114: SQL Without Assistance

Урок 11

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

Что такое подзапросыОператоры SELECT представляют собой запросы SQL. Все

операторы SELECT, с которыми мы имели дело до сих пор,представляли собой простые запросы: посредством отдель-ных операторов извлекались данные из отдельных таблицбазы данных.

Запрос

Какой-либо оператор SQL. Однако этот термин обыч-но используется по отношению к операторам SELECT.

Язык SQL позволяет также создавать подзапросы: запро-сы, которые вложены в другие запросы. Их также называютвложенные запросы, или подчиненные запросы. Почему воз-никает необходимость в подзапросах? Лучший способ объяс-нить эту концепцию — рассмотреть несколько примеров.

Поддержка в MySQL

Если вы используете MySQL, знайте, что подзапросыподдерживаются этой СУБД начиная с версии 4.1.Более ранние версии MySQL запросы не поддержи-вают.

Page 115: SQL Without Assistance

114 Урок 11

Фильтрация посредствомподзапросов

Таблицы баз данных, используемые во всех уроках этойкниги, являются реляционными таблицами (см. приложе-ние А, в котором описана каждая из таблиц и отношениямежду ними). Заказы хранятся в двух таблицах. ТаблицаOrders (заказы) содержит по одной строке для каждого за-каза; в ней указываются номер заказа, идентификатор кли-ента и дата заказа. Предметы отдельного заказа хранятся всоответствующей таблице O r d e r l t e m s . Таблица Orders несодержит информацию о клиентах. Она хранит толькоидентификатор клиента. Информация о клиентах хранитсяв таблице Customers (клиенты).

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

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

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

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

Каждый из этих шагов можно выполнить в виде отдель-ного запроса. Делая это, вы используете результаты, воз-вращенные одним оператором SELECT, чтобы заполнитьпредложение WHERE для следующего оператора SELECT.

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

Первый оператор SELECT выбирает столбец order_numдля всех продуктов заказа, у которых в столбце p r o d _ i dзначится RGAN01. Результат представляет собой номерадвух заказов, содержащих этот предмет:

Page 116: SQL Without Assistance

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

ВВОДSELECT order_numFROM OrderIternsWHERE prod_id = 'RGAN01

1

ВЫВОДorder_num

2000720008

Следующий шаг состоит в выборке идентификаторовклиентов, связанных с заказами 20007 и 20008. Используяпредложение IN, о котором говорилось в уроке 5, "Расши-ренная фильтрация данных", вы можете создать такой опе-ратор SELECT:

ВВОДSELECT cust_idFROM OrdersWHERE order num IN (20007,20008);

ВЫВОДcust_id

10000000041000000005

Теперь объединим эти два запроса путем превращенияпервого из них (того, который возвращает номера заказов)в подзапрос. Посмотрите на следующий оператор SELECT:

ВВОДi dSELECT c u s t _

FROM O r d e r sWHERE order_num IN (SELECT order_numFROM O r d e r l t e m sWHERE p r o d _ i d = 'RGAN01');

ВЫВОДcust_id

10000000041000000005

Page 117: SQL Without Assistance

1 1 6 Урок 11

АнализПодзапросы всегда обрабатываются, начиная с самого

внутреннего оператора SELECT в направлении "изнутри на-ружу". При обработке предыдущего оператора СУБД в дей-ствительности выполняет две операции.

Вначале она выполняет подзапрос:SELECT order_nura FROM o r d e r i t e m s WHERE prod_id='RGAN01'

В результате выполнения этого запроса возвращаетсядва номера заказа, 20007 и 20008. Эти два значения затемпередаются в предложение WHERE внешнего запроса в фор-мате с разделителем в виде запятой, необходимом для опе-ратора IN. Теперь внешний запрос становится таким:SELECT cust_id FROM orders WHERE order_num IN (20007,20008)

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

Форматируйте ваши SQL-запросы

Операторы S E L E C T , содержащие подзапросы, могут

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

Теперь у нас есть идентификаторы всех клиентов, зака-завших продукт RG7AN01. Следующий шаг состоит в получе-нии клиентской информации для каждого из этих иденти-фикаторов клиентов. Оператор SQL, осуществляющий вы-борку двух столбцов, таков:

ВВОДSELECT cust_name, cust_contactFROM CustomersWHERE cust_id IN ('1000000004', 4000000005');

Вместо жесткого указания идентификаторов клиентоввы можете превратить данное предложение WHERE в подза-прос:

Page 118: SQL Without Assistance

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

ВВОДSELECT cust_name, cust_contactFROM CustomersWHERE cust_id IN (SELECT cust_idFROM OrdersWHERE order_num IN (SELECT order_numFROM OrderltemsWHERE prod_id = 'RGAN01'));

ВЫВОДcust name cust contact

Denise L. StephensKim Howard

Fun4All

The Toy Store

Чтобы выполнить вышеприведенное выражение SELECT,СУБД должна в действительности выполнить три оператораSELECT. Самый внутренний подзапрос возвращает переченьномеров заказов, который затем используется как предло-жение WHERE для подзапроса, внешнего по отношению кданному. Этот подзапрос возвращает перечень идентифика-торов клиентов, которые используются в предложенииWHERE запроса более высокого уровня. Запрос верхнегоуровня возвращает искомые данные.

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

Только один столбец

Операторы SELECT подзапроса могут выбирать толь-ко один столбец. Попытка произвести выборку не-скольких столбцов приведет к появлению сообщенияоб ошибке.

Подзапросы и производительность

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

Page 119: SQL Without Assistance

118 Урок 11

просы — не всегда наиболее эффективный способвыборки данных такого типа. Более подробно об этомрассказано в уроке 12, "Объединение таблиц", в ко-тором повторно будет рассмотрен этот же самыйпример.

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

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

Чтобы выполнить эту операцию, необходимо сделатьследующее.

1. Выбрать перечень клиентов из таблицы Customers.2. Для каждого выбранного клиента посчитать число его

заказов в таблице Orders.Как следует из предыдущих двух уроков, вы можете ис-

пользовать оператор SELECT COUNT (*) для подсчета строк втаблице, а используя предложение WHERE для фильтрацииидентификатора конкретного клиента, вы можете подсчи-тать заказы только этого клиента. Например, посредствомследующего кода можно подсчитать количество заказов,сделанных клиентом 1000000001:

ВВОДSELECT COUNT(*) AS ordersFROM OrdersWHERE cust_id = '1000000001';

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

ВВОДSELECT cust_name,cust state,

Page 120: SQL Without Assistance

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

(SELECT COUNT(*)FROM OrdersWHERE Orders.cust_id = Customers.cust_id) AS ordersFROM CustomersORDER BY cust name;

ВЫВОДcust name

Fun4AllFun4AllKids PlaceThe Toy StoreVillage Toys

Анализ

cust state

INAZOHILMI

orders

110

2

Этот оператор SELECT возвращает три столбца для каж-дого клиента из таблицы Customers: cust_name,cus t_s ta te и 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, но это не тот результат, который вам нужен:

Page 121: SQL Without Assistance

120 Урок 11

ВВОДSELECT cust_name,cust_state,(SELECT COUNT(*)FROM OrdersWHERE cust_id = cust_id) AS ordersFROM CustomersORDER BY cust name;

ВЫВОДcust name

Fun4AllFun4AllKids PlaceThe Toy StoreVillage Toys

cust state

INAZOHILMI

orders

55555

Подзапросы чрезвычайно полезны при подготовке опера-тора SELECT такого типа, однако внимательно следите ЗЕтем, чтобы были правильно указаны неоднозначные именгстолбцов.

Всегда есть несколько решений

Хотя простой код, представленный в этом уроке, иработоспособен, зачастую он оказывается не самымэффективным способом выборки данных такого типа.Мы еще раз рассмотрим этот пример в одном из сле-дующих уроков.

РезюмеВ этом уроке вы узнали, что такое подзапросы и как и?

можно использовать. Чаще всего подзапросы используют iоператорах IN предложения WHERE и для заполнения вычисляемых столбцов. Были представлены примеры операций обоих названных типов.

Page 122: SQL Without Assistance

Урок 12

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

Что такое объединенияОдной из самых мощных особенностей реализаций языка

SQL является возможность "на лету" объединять таблицыпри выполнении запросов на выборку данных. Объедине-ния — это самые мощные операции, которые можно выпол-нить с использованием оператора SELECT языка SQL, поэто-му тщательное изучение объединений и их синтаксиса явля-ется чрезвычайно важной частью процесса освоения SQL.

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

Что такое реляционные таблицыПонять, что представляют собой реляционные таблицы,

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

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

Page 123: SQL Without Assistance

122 Урок 12

мацию о поставщике (такую как имя, адрес и контактнаяинформация)? Не рекомендуется хранить эти данные вместес данными о его продуктах по нескольким причинам.

• Потому что информация о поставщике одна и та жедля всех его продуктов; повторение этой информациидля каждого продукта приведет к напрасной потеревремени и места на диске.

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

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

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

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

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

В таблице Products хранится только информация опродуктах, и никакой конкретной информации о постав-щиках, за исключением их идентификаторов (первичногоключа таблицы Vendors). Этот ключ связывает таблицуVendors с таблицей Products. Благодаря применению это-

Page 124: SQL Without Assistance

Объединение таблиц 123

го идентификатора поставщика вы можете использоватьтаблицу Vendors для поиска информации о соответствую-щем поставщике.

Что это дает? Давайте рассмотрим следующие моменты.• Информация о поставщике никогда не повторяется,

благодаря чему экономится время и место на диске.• Если информация о поставщике изменяется, бывает

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

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

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

Масштабирование

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

Для чего используют объединенияРаспределение данных по многим таблицам обеспечивает

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

Если данные хранятся во многих таблицах, как их мож-но извлечь с помощью одного оператора SELECT? Ответ та-ков: посредством объединения данных. Проще говоря, объ-единение представляет собой механизм, используемый дляобъединения таблиц внутри оператора (отсюда термин"объединение"). Используя особый синтаксис, можно объе-динить несколько таблиц таким образом, что будет возвра-щаться один результат, и это объединение будет "на лету"связывать нужные строки из каждой таблицы.

Page 125: SQL Without Assistance

124 Урок 12

Использование интерактивных инструментовСУБД

Важно понимать, что объединение не является "фи-зическим объектом" — другими словами, оно не су-ществует как реальная таблица в базе данных. Объе-динение создается СУБД в случае необходимости исохраняется только на время выполнения запроса.Многие СУБД предлагают графический интерфейс,который может быть использован для интерактивногоопределения отношений таблицы. Эти инструментымогут оказаться чрезвычайно полезными для под-держания целостности ссылочных данных. При ис-пользовании реляционных таблиц важно, чтобы толь-ко достоверные данные содержались в реляционныхстолбцах. Вернемся к нашему примеру: если в табли-це Products хранится недостоверный идентифика-тор поставщика, его продукты окажутся недоступны-ми, поскольку они не будут относиться ни к одномупоставщику. Во избежание этого база данных должнаразрешать пользователю вводить только достовер-ные значения (т.е. такие, которые представлены втаблице Vendors) в столбце идентификаторов по-ставщика таблицы Products. Целостность на уровнессылок (целостность ссылочных данных) означает,что СУБД обязывает пользователя соблюдать прави-ла, обеспечивающие целостность данных. И соблю-дение этих правил часто обеспечивается при посред-стве интерфейсов СУБД.

Создание объединенияСоздание объединения — очень простая процедура.

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

Page 126: SQL Without Assistance

Объединение таблиц 125

ВВОДSELECT vend_name, prod_name, prod_priceFROM Vendors, ProductsWHERE Vendors.vend id = Products.vend i d ;

ВЫВОДvend name

IDoll House Inc.Doll House Inc.Doll House Inc.Bears R UsBears R UsBears R UsDoll House Inc.Fun and GamesFun and Games

Анализ I

prod_name

Fish bean bag toyBird bean bag toy-Rabbit bean bag toy8 inch teddy bear12 inch teddy bear18 inch teddy bearRaggedy AnnKing dollQueen doll

prod_j?rice

3.49003.49003.49005.99008.990011.99004.99009.49009.4900

Рассмотрим представленный выше код. Оператор 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, которое указывает СУБД связывать идентификаторпоставщика vend_id из таблицы Vendors со значениемvend_id таблицы P r o d u c t s .

Обратите внимание на то, что эти столбцы указаны какVendors .vend_id и P r o d u c t s . v e n d _ i d . Такие полностьюопределенные имена необходимы здесь потому, что, есливы укажете только vend_id, СУБД не сможет понять, накакие именно столбцы vend_id вы ссылаетесь. (Их два, поодному в каждой таблице). Как можно видеть из представ-ленного результата, один оператор SELECT возвращает дан-ные из двух разных таблиц.

Page 127: SQL Without Assistance

126 Урок 12

Полностью определенные имена столбцов

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

Важность предложения WHEREМожет показаться странным использование предложе-

ния WHERE для установления отношения в объединении, нона это есть существенная причина. Вспомните: когда таб-лицы объединяются в операторе SELECT, это отношениесоздается "на лету".

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

Декартово произведение

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

Для того чтобы разобраться в этом, посмотрите на сле-дующий оператор SELECT и результат его применения.

Page 128: SQL Without Assistance

Объединение таблиц 127

ВВОДSELECT vend_name, prod_name, prod_priceFROM Vendors, Products;

ВЫВОДvend name

Bears R UsBears R UsBears R UsBears R UsBears R UsBears R UsBears R UsBears R UsBears R UsBear EmporiumBear EmporiumBear EmporiumBear EmporiumBear EmporiumBear EmporiumBear EmporiumBear EmporiumBear EmporiumDoll House Inc.Doll House Inc.Doll House Inc.Doll House Inc.Doll House Inc.Doll House Inc.Doll House Inc.Doll House Inc.Doll House Inc.Furball Inc.Furball Inc.Furball Inc.Furball Inc.Furball Inc.Furball Inc.Furball Inc.Furball Inc.Furball Inc.Fun and GamesFun and GamesFun and GamesFun and GamesFun and GamesFun and GamesFun and Games

prod_name

8 inch teddy bear12 inch teddy bear18 inch teddy bearFish bean bag toyBird bean bag toyRabbit bean bag toyRaggedy AnnKing dollQueen doll8 inch teddy bear12 inch teddy bear18 inch teddy bearFish bean bag toyBird bean bag toyRabbit bean bag toyRaggedy AnnKing dollQueen doll8 inch teddy bear12 inch teddy bear18 inch teddy bearFish bean bag toyBird bean bag toyRabbit bean bag toyRaggedy AnnKing dollQueen doll8 inch teddy bear12 inch teddy bear18 inch teddy bearFish bean bag toyBird bean bag toyRabbit bean bag toyRaggedy AnnKing dollQueen doll8 inch teddy bear12 inch teddy bear18 inch teddy bearFish bean bag toyBird bean bag toyRabbit bean bag toyRaggedy Ann

prod_price

5.998.9911.993.493.493.494.999.499.495.998.9911.993.493.493.494.999.499.495.998.9911.993.493.493.494.999.499.495.998.9911.993.493.493.494.999.499.495.998.9911.993.493.493.494.99

Page 129: SQL Without Assistance

128 Урок 12

Fun and GamesFun and GamesJouets et oursJouets et oursJouets et oursJouets et oursJouets et oursJouets et oursJouets et oursJouets et oursJouets et ours

King dollQueen doll8 inch teddy bear12 inch teddy bear18 inch teddy bearFish bean bag toyBird bean bag toyRabbit bean bag toyRaggedy AnnKing d o l lQueen d o l l

9 .499.495.998.9911 .993.493.493.494 . 9 99.499.49

АнализКак видно из представленного результата, декартово

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

Не з а б у д ь т е у к а з а т ь п р е д л о ж е н и е WHERE

Проверьте, включили ли вы в оператор предложениеWHERE, иначе СУБД возвратит намного больше дан-ных, чем вам нужно. Кроме того, убедитесь в том, чтопредложение WHERE сформулировано правильно. Не-корректное предложение фильтрования приведет ктому, что СУБД выдаст вам неверные данные.

Перекрестное объединение

Иногда объединение, которое возвращает декартовопроизведение, называют перекрестным объединением.

Внутренние объединенияОбъединение, которое мы до сих пор использовали, на-

зывается объединение по эквивалентности — оно основанона проверке эквивалентности двух таблиц. Объединение та-кого типа называют также внутреннее объединение. Дляэтих объединений можно использовать несколько иной син-таксис, явно указывающий на тип объединения. Следую-щий оператор SELECT возвращает в точности такие же дан-ные, как и в предыдущем примере.

Page 130: SQL Without Assistance

Объединение таблиц 1 2 9

ВВОДSELECT vend_name, prod_name, prod_priceFROM Vendors INNER JOIN ProductsON 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 .

Объединение многих таблицSQL не ограничивает число таблиц, которые могут быть

объединены посредством оператора SELECT. Основные пра-вила для создания объединения остаются теми же. Вначалеперечисляются все таблицы, затем определяются отноше-ния между ними. Вот пример.

SELECT prod_name, vend_name, prod_price, quantityFROM Orderltems, Products, VendorsWHERE Products.vend_id = Vendors.vend_idAND Orderltems .prod_id = Products .prod__idAND order num = 20007;

ВЫВОДprod_name

18 inch teddy bearFish bean bag toy

vend name

Bears R UsDoll House Inc.

prod_price quantity

11.99003.4900

50100

Page 131: SQL Without Assistance

130 Урок 12

Bird bean bag t o yRabbit bean bag t o yRaggedy Ann

Dol l House I n c . 3.4900Dol l House I n c . 3.4900Dol l House I n c . 4.9900

10010050

АнализВ этом примере выводятся предметы заказа номер

20 007. Предметы заказа хранятся в таблице Order Items.Каждый продукт хранится в соответствии с идентификато-ром продукта, который ссылается на продукт в таблицеProducts. Эти продукты связаны с соответствующими по-ставщиками в таблице Vendors по идентификатору постав-щика, который хранится вместе с каждой записью о про-дукте. В предложении FROM этого примера перечисляютсятри таблицы, а предложение WHERE определяет оба назван-ных предложения объединения. Дополнительное предложе-ние WHERE используется затем для фильтрации толькопредметов заказа 2 0 007.

К вопросу о производительности

СУБД обрабатывают объединения, тратя время наобработку каждой указанной таблицы. Этот процессможет оказаться очень ресурсоемким, поэтому неследует использовать объединения таблиц без осо-бой на то необходимости. Чем больше таблиц вы объ-единяете, тем ниже производительность.

Максимальное число таблиц в объединении

Хотя SQL не накладывает каких-либо ограничений начисло таблиц в объединении, многие СУБД на самомделе имеют такие ограничения. Обратитесь к доку-ментации своей СУБД чтобы узнать, какие ограниче-ния такого рода она налагает (если они есть).

Теперь самое время пересмотреть следующий пример изурока 11, "Использование подзапросов", где операторSELECT возвращает список клиентов, заказавших продуктRGAN01:

Page 132: SQL Without Assistance

Объединение таблиц 131

ВВОДSELECT cust_name, cust_contactFROM Customers, Orders, OrderltemsWHERE Customers . cust__id = Orders . cust_idAND Orderltems.order_num = Orders.order_numAND prod_id • 'RGANOl

1;

ВЫВОДcust name cust contact

Denise L. StephensKim Howard

Fun4AllThe Toy Store

АнализКак уже говорилось в уроке 11, возвращение необходи-

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

Только экспериментально

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

Page 133: SQL Without Assistance

132 Урок 12

РезюмеОбъединения — одна из самых важных и востребован-

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

Page 134: SQL Without Assistance

Урок 13

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

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

Ранее, в уроке 7, "Создание вычисляемых полей" вы уз-нали, как можно использовать псевдонимы в качестве ссы-лок на выбираемые столбцы таблицы. Синтаксис псевдони-мов столбцов выглядит следующим образом:

ВВОДSELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country)

%+ ' ) ' AS vend_titleFROM VendorsORDER BY vend_name;

Помимо возможности применения псевдонимов для именстолбцов и вычисляемых полей, SQL позволяет также ис-пользовать псевдонимы вместо имен таблиц. На то есть двеосновных причины:

• более короткий синтаксис SQL;• это позволяет много раз использовать одну и ту же

таблицу в операторе SELECT.Обратите внимание на следующий оператор SELECT.

В основном он такой же, как в примерах предыдущего уро-

Page 135: SQL Without Assistance

134 Урок 13

ка, но здесь этот оператор был модифицирован для исполь-зования псевдонимов:

ВВОДSELECT cust_name, cust_contactFROM Customers AS C, Orders AS O, Orderltems AS 01WHERE C.cust_id = O.cust_id

AND OI.order_num = O.order_numAND prod_id = 'RGAN011;

АнализЗаметьте, что все три таблицы в предложениях FROM

имеют псевдонимы. Выражение Customers AS С задает С вкачестве псевдонима для таблицы Customers и т.д., что по-зволяет использовать сокращение С вместо полного словаCustomers. В этом примере псевдонимы таблиц были ис-пользованы только в предложении WHERE, но псевдонимыможно применять и в других случаях. Их можно использо-вать в списке SELECT, предложении ORDER BY, а также влюбой другой части этого оператора.

Никаких AS в Oracle

СУБД Oracle не поддерживает ключевое слово AS.

Для того чтобы использовать псевдонимы в СУБДOracle, просто укажите их без ключевого слова AS(т.е. укажите Customers С вместо Customers AS С).

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

Использование объединенийдругих типов

До сих пор вы использовали только простые объедине-ния, которые называют внутренние объединения или объе-динения по эквивалентности. Теперь мы рассмотрим тридополнительных типа объединения: самообъединение, есте-ственное объединение и внешнее объединение.

Page 136: SQL Without Assistance

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

СамообъединенияОдна из основных причин для использования псевдони-

мов таблиц состоит в возможности обращения к одной итой таблице несколько раз в одном операторе SELECT. По-кажем это на примере.

Предположим, вы хотите послать письма по всем кон-тактным адресам клиентов, которые работают с той жекомпанией, с которой работает Джим Джонс. Такой запростребует, чтобы вначале вы выяснили, с какой компаниейработает Джим Джонс, а затем — какие клиенты работаютс этой же компанией. Вот один из способов решения этойзадачи.

ВВОДSELECT cust_id, cust_name, cust_contactFROM CustomersWHERE cust_name • (SELECT cust_nameFROM CustomersWHERE cust contact = 'Jim Jones');

ВЫВОДcust id cust name cust contact

1000000003 Fun4All1000000004 Fun4All

Jim JonesDenise L. Stephens

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

ний оператор SELECT выполняет простую выборку, чтобывозвратить имя компании (cust_name), с которой работаетДжим Джонс. Только это имя используется в предложенииWHERE внешнего запроса, так что выбираются имена всехслужащих, работающих с этой компанией. (Все о подзапро-сах читайте в уроке 11, "Использование подзапросов".

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

ВВОДSELECT cl.cust_id, cl.cust_name, cl.cust_contactFROM Customers AS cl, Customers AS c2WHERE cl.cust_name = c2.cust_nameAND c2.cust contact = 'Jim Jones';

Page 137: SQL Without Assistance

136 Урок 13

ВЫВОДcust id

10000000031000000004

cust name cust contact

Fun4AllFun4All

Jim Jones

Denise L. Stephens

Никаких AS в СУБД Oracle

Пользователи Oracle, не забывайте убирать из своихоператоров ключевое слово AS.

АнализДве таблицы, необходимые для выполнения запроса, на

самом деле — одна и та же таблица, поэтому таблицаCustomers появляется в предложении FROM дважды. Хотяэто совершенно законно, некоторые ссылки на таблицуCustomers могли бы оказаться неоднозначными, потомучто СУБД "не знает", на какую именно таблицу Customersвы ссылаетесь.

Для решения этой проблемы используются псевдонимы.Первый раз для таблицы Customers назначается псевдонимС1, второй — псевдоним С2. Теперь эти псевдонимы можноприменять в качестве имен таблиц. Например, операторSELECT использует префикс С1 для однозначного указанияполного имени нужного столбца. Если этого не сделать,СУБД возвратит сообщение об ошибке, потому что имеетсяпо два столбца с именами cust_id, cust_name иcust_contact. СУБД не может знать, какой именно стол-бец вы имеете в виду (даже если в действительности этоодин и тот же столбец). Первое предложение WHERE объеди-няет эти таблицы, а затем оно фильтрует данные второйтаблицы по столбцу cust_contact, чтобы возвратить толь-ко нужные данные.

Самообъединения вместо подзапросов

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

Page 138: SQL Without Assistance

Создание расширенных объединений 137

много быстрее* чем подзапросы. Стоит поэкспери-ментировать с тем и другим/чтобы определить, какойзапрос работает быстрее.

Естественные объединенияВсякий раз, когда объединяются таблицы, по крайней

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

Естественное объединение — это объединение, в которомвы выбираете только не повторяющиеся столбцы. Обычноэто делается при помощи метасимвола (SELECT *) для од-ной таблицы и указания явного подмножества столбцов длявсех остальных таблиц. Вот пример:

ВВОДSELECT С.*, О.order_num, O.order_date, OI.prod_id,

Ч>01 .quantity, OI. item_j?riceFROM Customers AS C, Orders AS O, Orderltems AS OIWHERE C.cust_id = O.cust_idAND OI.order_num = О.order_numAND prod_id = 'RGAN01

1;

Никаких A S в Oracle

Пользователи Oracle, не забывайте выбрасывать изкода ключевое слово AS.

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

первой таблицы. Все остальные столбцы указаны явно, по-этому никакие дубликаты столбцов не выбираются.

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

Page 139: SQL Without Assistance

138 Урок 13

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

Внешние объединенияБольшинство объединений связывают строки одной таб-

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

• подсчета количества заказов каждого клиента, вклю-чая клиентов, которые еще не сделали заказ;

• составления перечня продуктов с указанием количе-ства заказов на них, включая продукты, которые ни-кто из клиентов не захотел заказывать;

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

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

Разница в синтаксисе

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

Следующий оператор SELECT позволяет выполнить про-стое внутреннее объединение. С его помощью выбираетсясписок всех клиентов и их заказы:

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers INNER JOIN OrdersON Customers.cust id = Orders.cust id;

Page 140: SQL Without Assistance

Создание расширенных объединений 139

Синтаксис внешнего объединения похож на этот. Длявыборки имен всех клиентов, включая тех, которые еще несделали заказов, можно сделать следующее.

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers LEFT OUTER JOIN OrdersON Customers.cust id = Orders.cust id;

ВЫВОДcust id

10000000011000000002100000000310000000041000000005

order num

20005NULL200062000720008

АнализАналогично внутреннему объединению, которое мы рас-

сматривали на прошлом уроке, в этом операторе SELECTиспользуются ключевые слова OUTER JOIN для указаниятипа объединения (вместо указания его в предложенииWHERE). Но, в отличие от внутренних объединений, которыесвязывают строки двух таблиц, внешние объединениявключают в результат также строки, не имеющие связан-ных с ними строк. При использовании синтаксиса OUTERJOIN вы должны использовать ключевое слово RIGHT илиLEFT, чтобы указать таблицу, все строки которой будутвключены в результат (RIGHT для таблицы, имя которойстоит справа от OUTER JOIN, LEFT — для той, имя которойзначится слева).

В предыдущем примере используются ключевые словаLEFT OUTER JOIN для выборки всех строк таблицы, ука-занной в левой части предложения FROM (таблицыCustomers). Чтобы выбрать все строки из таблицы, ука-занной справа, используйте правое внешнее объединение(RIGHT OUTER JOIN), как показано в следующем примере.

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers RIGHT OUTER JOIN OrdersON Orders.cust id = Customers.cust id;

Page 141: SQL Without Assistance

140 Урок 13

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

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers, OrdersWHERE Customers.cust id *= Orders.cust id;

cust id

100000000110000000011000000002100000000310000000041000000005

order_num

2000520009NULL200062000720008

АнализЗдесь предложение объединения указано в предложении

WHERE. Вместо проверки на равенство с помощьюоператора = используется оператор *= для указания того,что в результат должна быть включена каждая строка таб-лицы Customers. Оператор *= представляет собой операторлевого внешнего объединения. С его помощью выбираютсявсе строки левой таблицы.

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

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers, OrdersWHERE Orders.cust_id =* Customers.cust_id;

Еще одна форма внешнего объединения (используемаятолько в СУБД Oracle) требует использования оператора( + ) после имени таблицы, как показано ниже.

Page 142: SQL Without Assistance

Создание расширенных объединений 141

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers, OrdersWHERE Customers.cust id (+) = Orders.cust id

Типы внешнего объединения

Независимо от формы используемого внешнего объ-единения всегда существуют только две его основ-ные формы— левое внешнее объединение и правоевнешнее объединение. Единственная разница междуними состоит в порядке указания таблиц, которыесвязываются. Другими словами, левое внешнее объ-единение может быть превращено в правое внешнееобъединение просто за счет изменения порядка ука-зания имен таблиц в предложении FROM или WHERE.

А раз так, то эти два типа внешнего объединения мо-гут заменять друг друга, и решение о том, какоеименно из них нужно использовать, определяется су-губо удобством выполнения операции.

Существует и другой вариант внешнего объединения — этополное внешнее объединение, которое извлекает все строки изобеих таблиц и связывает между собой те, которые могут бытьсвязаны. В отличие от левого внешнего и правого внешнегообъединений, которые включают в результат несвязанныестроки только из одной таблицы, полное внешнее объединениевключает в результат несвязанные строки из обеих таблиц.Синтаксис полного внешнего объединения таков:

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Orders FULL OUTER JOIN CustomersON Orders.cust id = Customers.cust id;

Поддержка полного внешнего объединения

Синтаксис полного внешнего объединения не под-держивается в СУБД Access, MySQL, SQL Server иSybase.

Page 143: SQL Without Assistance

142 Урок 13

Использование объединений состатистическими функциями

Как вы узнали из урока 9, "Суммирование данных", ста-тистические функции применяют для получения статисти-ческих сведений о данных. Хотя во всех до сих пор рас-смотренных примерах посредством статистических функцийполучались данные только для одной таблицы, эти функ-ции можно использовать также по отношению к объедине-ниям.

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

ВВОДSELECT Customers.cust_id, COUNT(Orders.order_num) AS

FROM Customers INNER JOIN OrdersON Customers.cust_id = Orders.cust_idGROUP BY Customers.cust id;

ВЫВОДcust_id num_ord

1000000001 21000000003 11000000004 11000000005 1

АнализВ этом операторе SELECT используются ключевые слова

INNER JOIN для связи таблиц Customers и Orders междусобой. Предложение GROUP BY служит для получения ито-говых данных по клиентам, и, таким образом, обращение кфункции COUNT (Orders.order_num) позволяет подсчитатьколичество заказов каждого клиента и возвратить резуль-тат в виде столбца num_ord.

Статистические функции можно использовать с объеди-нениями других типов:

Page 144: SQL Without Assistance

Создание расширенных объединений 143

ВВОДSELECT Customers.cust_id, COUNT(Orders.order_num) AS

FROM Customers LEFT OUTER JOIN OrdersON Customers.cust_id = Orders.cust_id

GROUP BY Customers.cust id;

Никаких A S в Oracle

Еще раз напоминаем пользователям Oracle о необхо-

димости удаления AS из кода запроса.

ВЫВОДcust id num ord

10000000011000000002100000000310000000041000000005

АнализВ этом примере используется левое внешнее объединение

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

Использование объединенийи условий объединения

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

• Будьте внимательны при выборе типа объединения,которое собираетесь использовать. Возможно, что ча-ще вы будете использовать внутреннее объединение,хотя в зависимости от ситуации это можно такжесказать и о внешнем объединении.

Page 145: SQL Without Assistance

144 Урок 13

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

РезюмеЭтот урок был продолжением предыдущего урока, по-

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

Page 146: SQL Without Assistance

Урок 14

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

Что такое комбинированныезапросы

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

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

• для возвращения одинаковым образом структуриро-ванных данных из различных таблиц посредствомодного запроса;

• для выполнения многократных запросов к одной таб-лице и возвращения данных в виде результата одногозапроса.

Page 147: SQL Without Assistance

146 Урок 14

Комбинированные запросы и многократные ус-ловия WHERE

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

Создание комбинированныхзапросов

Запросы в языке SQL комбинируются с помощью опера-тора UNION. Оператор UNION позволяет многократно указы-вать оператор SELECT, и по завершении их работы можетбыть выведен один набор результатов.

Использование оператора UNIONИспользовать оператор UNION довольно просто. Все, что

вы должны сделать, — это указать каждый необходимыйвам оператор SELECT и разместить ключевое слово UNIONмежду ними.

Рассмотрим пример. Допустим, вам необходим отчет, со-держащий сведения обо всех клиентах из штатов Иллинойс,Индиана и Мичиган. Вы также хотите включить в него дан-ные о клиенте Fun4All независимо от штата. Конечно, мож-но создать условие WHERE, благодаря которому будет выпол-нено требуемое, но в данном случае гораздо удобнее исполь-зовать оператор UNION.

Как уже говорилось, применение оператора UNION под-разумевает многократное использование операторов SELECT.Вначале рассмотрим отдельные операторы:

Page 148: SQL Without Assistance

Комбинированные запросы 147

ВВОДSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust state IN (•IL

1,'IN

1,"MI');

EHcust_name

Village ToysFun4AllThe Toy Store

cust_contact

John SmithJim JonesKim Howard

cust email

[email protected] j [email protected]

ВВОДSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust name = 'Fun4All';

cust_contact

Jim Jones

Denise L. Stephens

cust_email

j j [email protected]

ВЫВОДcust name

Fun4AllFun4All

АнализПервый оператор SELECT выбирает все строки, относя-

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

Чтобы скомбинировать эти два запроса, выполните сле-дующее.

ВВОДSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust_state IN ('IL','IN','MI')UNIONSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust name = 'Fun4All';

Page 149: SQL Without Assistance

148 Урок 14

ВЫВОДcust_name

Fun4AllFun4AllVillage

cust_contact

Denise L.StephensJim JonesToys John Smith

The Toy Store Kim Howard

cust_email

[email protected] [email protected]

АнализОператоры предыдущего примера состоят из обоих

предшествующих операторов SELECT, разделенных ключе-вым словом UNION. Оператор UNION указывает СУБД вы-полнить оба оператора SELECT и вывести результаты в видеодного набора результатов запроса.

Для сравнения приводим тот же самый запрос, исполь-зующий не оператор UNION, а несколько предложенийWHERE:

ВВОДSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust_state IN ('IL

1,'IN

1,'MI')

OR cust_name = •Fun4All';

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

О г р а н и ч е н и я о п е р а т о р а U N I O N

В стандартном SQL не существует ограничений начисло операторов S E L E C T , которые могут быть с к о м -бинированы посредством операторов U N I O N . Однаколучше все же обратиться к документации СУБД и убе-диться в том, что она не накладывает каких-либо ог-раничений на максимально допустимое число опера-торов.

Page 150: SQL Without Assistance

Комбинированные запросы 149

Проблемы, связанные с производительностью

В большинстве хороших СУБД используется внутрен-ний оптимизатор запросов, комбинирующий опера-торы SELECT, прежде чем СУБД начинает их обработ--ку. Теоретически это означает, что, с точки зренияпроизводительности, нет реальной разницы междуиспользованием многих предложений WHERE и опера-тора UNION. Мы говорим "теоретически", потому чтона практике многие оптимизаторы запросов не все-гда выполняют свою работу так хорошо, как следова-ло бы. Лучшим вариантом было бы протестироватьоба метода и посмотреть, какой из них вам лучшеподходит.

Правила применения запросов UNIONКак видите, запросы UNION очень просты в использова-

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

• Запрос UNION должен включать два или более опера-торов SELECT, отделенных один от другого ключевымсловом UNION (таким образом, если в запросе исполь-зуется четыре оператора SELECT, должно быть ис-пользовано три ключевых слова UNION).

• Каждый запрос в операторе UNION должен содержатьодни и те же столбцы, выражения или статистиче-ские функции (кроме того, столбцы должны быть пе-речислены в одном и том же порядке).

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

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

Page 151: SQL Without Assistance

150 Урок 14

Включение или исключениеповторяющихся строк

Возвратимся к одному из предыдущих разделов "Ис-пользование оператора UNION" и рассмотрим использован-ные в нем простые операторы SELECT. Вы можете заметить,что, когда они выполняются отдельно, первый операторSELECT возвращает три строки, второй — две. Однако когдаэти два оператора SELECT комбинируются с UNION, возвра-щаются только четыре строки, а не пять.

Запрос UNION автоматически удаляет все повторяющиесястроки из набора результатов запроса (иными словами, онведет себя точно так же, как вели бы себя несколько пред-ложений WHERE в одном операторе SELECT). Поэтому здесьприсутствует запись о клиенте Fun4All из штата Индиа-на — эта строка была возвращена обоими операторамиSELECT. Когда же использовался запрос UNION, повторяю-щаяся строка была удалена.

Таково поведение запроса UNION по умолчанию, но прижелании вы можете изменить его. Если бы требовалось,чтобы возвращались все вхождения соответствий, вам сле-довало бы использовать UNION ALL вместо оператора UNION.

Рассмотрим следующий пример:

ВВОДSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust_state IN ('IL','IN

1,'MI')

UNION ALLSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust name = 'Fun4All';

ВЫВОДcust_name

Village ToysFun4AllThe ToyFun4AllFun4All

cust_contact

John SmithJim JonesStore Kim HowardJim Jones

cust_email

[email protected]@[email protected]

Denise L.Stephens [email protected]

Page 152: SQL Without Assistance

Комбинированные запросы 151

АнализПри использовании запроса UNION ALL СУБД не удаляет

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

UNION ИЛИ WHERE

В начале этого урока мы говорили, что операторU N I O N выполняет то же самое, что и несколько усло-

вий WHERE. Оператор U N I O N A L L является формой

запроса U N I O N , которая делает то, что не способны

выполнить предложения WHERE. Если вы хотите полу-чить все вхождения соответствий для каждого уело -вия (включая дубликаты), вам следует использоватьо п е р а т о р U N I O N A L L , а н е W H E R E .

Сортировка результатовкомбинированных запросов

Результат применения оператора SELECT сортируется спомощью предложения ORDER BY. При комбинировании за-просов посредством UNION только одно предложение ORDERможет быть использовано, и оно должно появиться послезаключительного оператора SELECT. Практически не имеетсмысла сортировать часть набора результатов одним спосо-бом, а часть — другим, поэтому несколько предложенийORDER BY применять не разрешается.

В следующем примере сортируются результаты, полу-ченные предыдущим запросом UNION:

ВВОДSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust_state IN ('IL

1,•IN

1,'MI•)

UNIONSELECT cust_name, cust_contact, cust_emailFROM CustomersWHERE cust_name =

cFun4All'

ORDER BY cust name, cust contact;

Page 153: SQL Without Assistance

152 Урок 14

ВЫВОДcust_contact

Denise L.StephensJim JonesKim HowardJohn Smith

cust_email

[email protected]@fun4all.comNULLsalesOvillagetoys.cor

cust_name

Fun4AllFun4AllThe Toy StoreVillage Toys

АнализЭтот запрос UNION использует одно предложение ORDEI

BY после заключительного оператора SELECT.Несмотря на то что ORDER BY является частью толькс

последнего оператора SELECT, на самом деле СУБД буде!использовать его для сортировки всех результатов, возвращенных всеми операторами SELECT.

Другие типы запроса на соединение

Некоторые СУБД поддерживают два дополнительныхзапроса типа U N I O N . Оператор E X C E P T (иногда назы-

ваемый M I N U S ) может быть использован только для

чтения строк, которые существуют в первой таблице,но не во второй, а оператор INTERSECT МОЖНО ис-

пользовать ДЛЯ чтения строк, которые имеются в обе-их таблицах. Однако на практике такие запросыU N I O N используются редко, поскольку те же самыерезультаты могут быть получены посредством объе-динений.

РезюмеВ этом уроке вы узнали, как можно комбинировать за-

просы SELECT посредством оператора UNION. Используяоператор UNION, вы можете вернуть результаты несколькихзапросов в виде одного комбинированного запроса, вклю-чающего или исключающего дубликаты. За счет использо-вания оператора UNION можно значительно упроститьсложные предложения WHERE и одновременно выбиратьданные из многих таблиц.

Page 154: SQL Without Assistance

Урок 15

Добавление данныхВ этом уроке вы узнаете, как можно добавлять данные втаблицы, используя оператор INSERT языка SQL.

Что такое добавление данныхНесомненно, SELECT является наиболее часто исполь-

зуемым оператором языка SQL (именно поэтому мы посвя-тили его рассмотрению 14 уроков). Но помимо него в SQLчасто применяются еще три оператора, которыми вам необ-ходимо уметь пользоваться. Первый из них — операторINSERT. (О двух других мы расскажем в следующем уроке.)

Как следует из названия, оператор INSERT используетсядля ввода (добавления) строк в таблицу базы данных. До-бавление можно осуществить несколькими способами:

• добавить одну полную строку;• добавить часть одной строки;• добавить результаты запроса.Далее мы рассмотрим все эти варианты.

Оператор I N S E R T И безопасность системы

Для использования оператора I N S E R T могут потре-боваться особые права на доступ в СУБД со структу-рой клиент-сервер. Прежде чем применять операторI N S E R T , убедитесь в т о м , что у вас есть на это право.

Добавление полных строкПростейший способ добавления данных в таблицу может

быть реализован при использовании основного синтаксисаоператора INSERT. Для этого нужно указать имя таблицы и

Page 155: SQL Without Assistance

154 Урок 15

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

ВВОДINSERT INTO CustomersVALUES('1000000006 ' ,

1 Toy Land',

423 Any Street1 ,

1New York','NY

1 ,

'Hill' ,1 USA',NULL,NULL);

В этом примере в таблицу добавляются сведения о новомклиенте. Данные, которые должны быть сохранены в каж-дом столбце таблицы, указываются в условии VALUES, зна-чения должны быть приведены для каждого столбца. Еслидля какого-то столбца не имеется соответствующего значе-ния (например, как это произошло для столбцовcust_contact и cust_email в данном примере), следуетиспользовать значение NULL (предполагается, что для дан-ной таблицы разрешено не указывать значения в этихстолбцах). Столбцы должны заполняться в порядке, в кото-ром они появились в определении таблицы.

К л ю ч е в о е с л о в о I N T O

В некоторых реализациях SQL вслед за операторомINSERT опционально указывается ключевое словоI N T O . Однако хорошим тоном считается указаниеэтого ключевого слова даже в случаях, когда это неявляется необходимым. Поступая таким образом, выобеспечите переносимость своего кода между СУБД.

Этот синтаксис довольно прост, но он не вполне безопа-сен, поэтому его применения следует всячески избегать. Ре-зультаты применения вышеприведенного оператора SQLвесьма чувствительны к порядку, в котором столбцы опре-делены в таблице. Они также зависят от того, соблюдаетсяли в действительности этот порядок. Однако даже если вданный момент порядок соблюдается, нет гарантий, чтостолбцы будут расположены в том же самом порядке, когдатаблица будет реконструироваться в следующий раз. След о-

Page 156: SQL Without Assistance

Добавление данных 155

вательно, использовать оператор SQL, результаты примене-ния которого зависят от порядка следования столбцов,весьма небезопасно. Если вы будете пренебрегать этим сове-том, вас ждут неприятности.

Безопасный (и, к сожалению, более громоздкий) способзаписи оператора INSERT таков:

ВВОДINSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,

cust_state,cust_ZIP,cust_country,cust_contact,cust_email)

VALUES(•1000000006',1 Toy Land•,423 Any Street

1 ,

1New York•,'NY' ,•11111' ,•USA

1 ,

NULL,NULL) ;

АнализВ этом примере делается в точности то же самое, что и в

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

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

Page 157: SQL Without Assistance

156 Урок 15

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

ВВОДINSERT INTO Customers(cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,cust_ZIP,

VALUES('1000000006•,NULL,NULL,1 Toy Land',

'123 Any Street1,

1 New York','NY' ,

111111',

Всегда используйте список столбцов

Как правило, оператор I N S E R T не используется без

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

Аккуратно используйте п р е д л о ж е н и е V A L U E S

Независимо от синтаксиса, используемого для опе-ратора INSERT, должны быть правильно указаны зна-чения в предложении VALUES. Если имена столбцовне указываются, должно быть указано значение длякаждого столбца таблицы. Если имена столбцов ука-зываются, должно наличествовать какое-то значениедля каждого столбца, включенного в список. Если что-то не указано, будет сгенерировано сообщение обошибке, и строка не будет вставлена.

Page 158: SQL Without Assistance

Добавление данных 157

Добавление части строкиРекомендуемый в предыдущем разделе способ использо-

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

Рассмотрим следующий пример:

ВВОДINSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_ZIP,cust_country)

VALUES('1000000006 ' ,1 Toy Land',

4 2 3 Any S t r e e t 1 ,1 New York','NY1 ,' 11111 ' ,1 USA') ;

АнализВ примере, приведенном ранее в этом уроке, значения не

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

Попуск столбцов

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

• Этот столбец определен как допускающий значе-ния N U L L (отсутствие какого-либо значения).

Page 159: SQL Without Assistance

158 Урок 15

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

Если вы пропускаете столбец таблицы, которая не до-пускает появления в своих строках значений NULL и неимеет значения, определенного для использования по умол-чанию, СУБД выдаст сообщение об ошибке, и эта строка небудет добавлена.

Добавление выбранных данныхОбычно оператор INSERT служит для добавления строки

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

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

Инструкции для следующего примера

В следующем примере данные импортируются изтаблицы CustNew в таблицу Customers. Сначала соз-дайте и наполните таблицу CustNew. Формат таблицыCustNew должен быть таким же, как и таблицыCustomers, описанной в приложении А. После запол-нения CustNew удостоверьтесь в том, что не были ис-пользованы значения c u s t _ i d , которые уже приме-нялись в таблице Customers (последующая операцияI N S E R T потерпит неудачу, если значения первичногоключа будут повторяться).

Page 160: SQL Without Assistance

Добавление данных 159

ВВОД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_countryFROM CustNew;

АнализВ этом примере для импорта всех данных из таблицы

CustNew в таблицу Customers используется операторINSERT SELECT. Вместо того чтобы перечислять значения,которые должны быть добавлены, оператор SELECT выбира-ет их из таблицы CustNew. Каждый столбец в оператореSELECT соответствует столбцу в списке указанных столбцов.Сколько же строк добавит этот оператор? Это зависит от то-го, сколько строк содержится в таблице CustNew. Если таб-лица пуста, никакие строки добавлены не будут (и никакоесообщение об ошибке не будет выдано, поскольку эта опе-рация остается правомерной). Если таблица содержит дан-ные, все они будут добавлены в таблицу Customers.

И м е н а с т о л б ц о в в о п е р а т о р е I N S E R T S E L E C T

В этом примере были использованы одинаковыеимена столбцов в операторах I N S E R T И SELECT. Учти-

те, ЧТО к именам столбцов не предъявляются никакиетребования. В действительности СУБД вообще не об-ращает внимания на имена столбцов, возвращаемыхоператором SELECT. Точнее, ею используется поло-жение столбца, так что первый столбец в SELECT (не-зависимо от имени) будет использован для заполне-ния первого указанного столбца таблицы и т.д.

Page 161: SQL Without Assistance

160 Урок 15

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

Добавление нескольких строк

Оператор I N S E R T обычно добавляет только одну стро-

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

несколько операторов I N S E R T . Исключением из этого

правила является оператор INSERT SELECT, который

может быть использован для добавления многих строкпосредством одного оператора — какие бы данные нивозвратил оператор SELECT, ОНИ могут быть добавленыв таблицу посредством оператора INSERT.

Копирование данных из однойтаблицы в другую

Это — другая форма добавления данных, при использо-вании которой оператор INSERT вообще не применяется.Чтобы скопировать содержимое какой-то таблицы в новую(которая создается "на лету"), можно использовать операторSELECT INTO.

Не поддерживается в DB2

СУБД DB2 не поддерживает использование операто-

ра S E L E C T I N T O описанным выше способом.

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

Разница между INSERT SELECT И SELECT INTO

Одно из отличий между операторами SELECT I N T O ИI N S E R T S E L E C T с о с т о и т в т о м , ч т о п е р в ы й о п е р а т о рэкспортирует данные, а второй — импортирует.

Page 162: SQL Without Assistance

Добавление данных 161

Следующий пример демонстрирует способ примененияоператора SELECT INTO:

ВВОДSELECT *INTO CustCopyFROM Customers;

АнализЭтот оператор SELECT создает новую таблицу с именем

CustCopy и копирует в нее все содержимое таблицыCustomers.

Поскольку был использован оператор SELECT *, каждыйстолбец таблицы Customers будет создан в таблицеCustCopy (и соответственно заполнен). Чтобы скопироватьтолько часть доступных столбцов, следует явно указатьимена столбцов, а не использовать метасимвол * (звездоч-ка).

В СУБД MySQL и Oracle используется несколько инойсинтаксис:

ВВОДCREATE TABLE CustCopy ASSELECT *FROM Customers;

АнализПри использовании оператора SELECT INTO нужно об-

ращать внимание на следующие моменты.• Можно использовать любые опции и предложения

оператора SELECT, включая WHERE и GROUP BY.• Для добавления данных из нескольких таблиц можно

использовать объединения.• Данные можно добавить только в одну таблицу неза-

висимо от того, из скольких таблиц они были извле-чены.

Page 163: SQL Without Assistance

162 Урок 15

Создание копий таблиц

Оператор SELECT I N T O является прекрасным сред-

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

Больше примеров

Вам нужны еще примеры использования оператораI N S E R T ? Ознакомьтесь со сценариями заполнениятаблиц, описанными в приложении А.

РезюмеВ этом уроке вы узнали о том, как можно добавлять

строки в таблицу базы данных. Вы познакомились с не-сколькими способами использования оператора INSERT иузнали, почему желательно явно указывать имена столб-цов. Вы научились использовать оператор INSERT SELECTдля импорта строк из другой таблицы и применять опера-тор SELECT INTO для экспорта строк в новую таблицу.В следующем уроке мы расскажем о том, как для манипу-лирования данными таблиц следует использовать операто-ры UPDATE И DELETE.

Page 164: SQL Without Assistance

Урок 16

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

Обновление данныхДля обновления (модификации) данных какой-либо таб-

лицы используется оператор UPDATE. Этот оператор можноиспользовать двумя способами:

• для обновления определенной строки таблицы;• для обновления всех строк таблицы.Рассмотрим каждый из названных способов.

Не пропускайте п р е д л о ж е н и е WHERE

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

О п е р а т о р U P D A T E И безопасность

Для использования оператора U P D A T E в СУБД со

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

Page 165: SQL Without Assistance

164 Урок 16

Оператор UPDATE очень прост в использовании, он состо-ит из трех основных частей:

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

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

1000000005 появился адрес электронной почты, поэтомуего запись нужно обновить. Такое обновление можно вы-полнить посредством следующего оператора:

ВВОДUPDATE CustomersSET cust_email = '[email protected]'WHERE cust_id = '1000000005';

Оператор UPDATE всегда начинается с имени таблицы,подлежащей обновлению. В нашем примере это таблицаCustomers. Затем используется команда SET, чтобы вве-сти в столбец новое значение. В нашем случае предложе-ние SET устанавливает определенное значение для столбцаcust_eraail:SET cust_email = '[email protected]'

Заканчивается оператор UPDATE предложением WHERE,которое сообщает СУБД, какая строка подлежит обновле-нию. При отсутствии предложения WHERE СУБД обновилабы все строки таблицы Customers, введя в них новый(причем один и тот же!) адрес электронной почты; это, ко-нечно, не то, что требовалось.

Для обновления нескольких столбцов необходим инойсинтаксис:

ВВОДUPDATE CustomersSET cust_contact = 'Sam Roberts',cust_email • '[email protected]'WHERE cust_id = '1000000006';

Для обновления нескольких столбцов используется толькоодна команда SET, и каждая пара столбец-значение отделяетсяот другой запятой (после имени последнего столбца запятая неставится). В нашем примере оба столбца, cust_contact иcust email, будут обновлены для клиента 1000000006.

Page 166: SQL Without Assistance

Обновление и удаление данных 165

Использование подзапросов в операторе UPDATE

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

Ключевое слово FROM

Некоторые реализации SQL поддерживают предло-жение FROM в операторе UPDATE, оно может быть ис-

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

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

ВВОДUPDATE CustomersSET cust_email = NULLWHERE cust_id = '1000000005';

Здесь ключевое слово NULL используется для хранения"никакого" значения в столбце cust email.

Удаление данныхДля удаления данных из таблицы применяется оператор

DELETE.Его можно использовать двумя способами:• для удаления из таблицы определенных строк;• для удаления из таблицы всех ее строк.

Page 167: SQL Without Assistance

166 Урок 16

Не забывайте указывать предложение WHERE

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

О п е р а т о р D E L E T E и б е з о п а с н о с т ь

Д л я и с п о л ь з о в а н и я о п е р а т о р а D E L E T E в С У Б Д с о

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

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

пользовании. Хорошая (и вместе с тем плохая) новость со-стоит в том, что оператор DELETE еще проще.

Следующий оператор удаляет одну строку из таблицыCustomers:

ВВОДDELETE FROM Customers

WHERE cust_id = '1000000006';

Оператор DELETE FROM требует, чтобы вы указали имятаблицы, из которой должны быть удалены данные. Пред-ложение WHERE фильтрует строки, определяя, какие из нихдолжны быть удалены. В нашем примере должна быть уда-лена строка, относящаяся к клиенту 1000000006. Если быпредложение WHERE было пропущено, этот оператор удалилбы все столбцы таблицы.

К л ю ч е в о е с л о в о F R O M

В некоторых реализациях SQL за D E L E T E может о п -

ционально следовать ключевое слово FROM. Однако

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

Page 168: SQL Without Assistance

Обновление и удаление данных 167

Оператор DELETE не принимает имена столбцов или ме-тасимволы. Он удаляет строки целиком, а не отдельныестолбцы. Для удаления определенного столбца следует ис-пользовать оператор UPDATE.

Содержимое таблиц, но не сами таблицы

Оператор D E L E T E удаляет из таблицы отдельные

строки или даже все строки за один раз, но он нико-гда не удаляет саму таблицу.

Более быстрое удаление

Если необходимо удалить значения из всех строк таб-лицы, не используйте оператор DELETE. Вместо негонужно применить оператор TRUNCATE TABLE, кото-

рый выполняет ТО же самое, но делает это намногобыстрее (потому что изменения данных не регистри-руются).

Советы по обновлениюи удалению данных

Все операторы UPDATE DELETE, рассмотренные в преды-дущем разделе, сопровождались предложениями WHERE, ина это есть очень веская причина. Если вы пропуститепредложение WHERE, оператор UPDATE или DELETE будетприменен по отношению ко всем строкам таблицы. Други-ми словами, если вы выполните оператор UPDATE без пред-ложения WHERE, каждая строка таблицы будет заменена но-выми значениями. Аналогичным образом, если вы выпол-ните оператор DELETE без предложения WHERE, будетудалено все содержимое таблицы.

Далее перечислены правила хорошего тона, которымследуют программисты SQL.

• Никогда не выполняйте оператор UPDATE или DELETEбез предложения WHERE, если только вы на самом де-ле не хотите обновить или удалить каждую строку.

Page 169: SQL Without Assistance

168 Урок 16

Убедитесь в том, что каждая таблица имеет первич-ный ключ (вернитесь к уроку 12, "Объединение таб-лиц", если забыли, что это такое), и используйте егов предложении WHERE всякий раз, когда это оказыва-ется возможным. (Вы можете указать отдельные пер-вичные ключи, несколько значений или диапазонызначений.)

Прежде чем использовать предложение WHERE с опе-ратором UPDATE или DELETE, сначала проверьте его соператором SELECT, чтобы убедиться в том, что оноправильно фильтрует записи, — можно ошибиться исформулировать неправильное предложение WHERE.

Используйте средства принудительного обеспеченияссылочной целостности данных (см. урок 12), чтобыСУБД не позволяла удалять строки, для которых вдругих таблицах имеются связанные с ними данные.

Некоторые СУБД позволяют администраторам баз дан-ных устанавливать ограничения, препятствующие вы-полнению операторов UPDATE или DELETE без предло-жения WHERE. Если ваша СУБД поддерживает эту осо-бенность, рассмотрите возможность ее использования.

Используйте операторы удаления с осторожностью

Основной момент состоит в том, что SQL не имееткнопки возврата в предыдущее состояние. Будьтеочень внимательны, используя операторы UPDATE иDELETE, иначе вы вдруг обнаружите, что удалили илиобновили не те данные.

РезюмеВ этом уроке вы узнали, как нужно применять операто-

ры UPDATE и DELETE для манипулирования данными таб-лиц. Вы познакомились с синтаксисом каждого из этихоператоров, а также с опасностями, которыми чревато ихприменение. Вы также узнали, почему столь важно исполь-зовать предложение WHERE в операторах UPDATE и DELETE,и познакомились с основными правилами, которым нужноследовать, чтобы по неосторожности не повредить данные.

Page 170: SQL Without Assistance

Урок 17

Создание таблици работа с нимиВ этом уроке вы познакомитесь с основными правиламисоздания, перестройки и удаления таблиц.

Создание таблицЯзык SQL используется не только для манипуляций с

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

Существует два способа создания таблиц.• Большинство СУБД сопровождается инструментарием

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

• Таблицами можно также манипулировать посредст-вом операторов языка SQL.

Для создания таблиц программным способом используютоператор SQL CREATE TABLE. Стоит отметить, что, когда выиспользуете интерактивный инструментарий, в действи-тельности вся работа выполняется операторами SQL. Одна-ко вам не приходится писать эти операторы; интерфейссоздает и выполняет их незаметно для вас (то же самоесправедливо и для процедуры изменения существующихтаблиц).

Page 171: SQL Without Assistance

170 Урок 17

Разница в синтаксисе

Т о ч н ы й с и н т а к с и с о п е р а т о р а C R E A T E T A B L E м о ж е т

быть несколько различным для разных реализацийSQL. Обязательно обратитесь к документации своейСУБД за дополнительной информацией и выясните,какой в точности синтаксис для нее необходим и ка-кие возможности она поддерживает.

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

Примеры для конкретных СУБД:. . .

Операторы CREATE TABLE для конкретных СУБД приве-

дены в примерах сценариев создания таблиц (см. при-ложение А, "Сценарии демонстрационных таблиц").

Основы создания таблицЧтобы создать таблицу с помощью оператора CREATE

TABLE, нужно указать следующие данные:• имя новой таблицы; оно вводится после ключевого

слова CREATE TABLE;• имена и определения столбцов таблицы, разделенные

запятыми;• в некоторых СУБД также требуется, чтобы было ука-

зано место размещения таблицы.Посредством следующего оператора SQL создается таб-

лица Products, часто используемая в нашей книге:

ВВОДCREATE TABLE Products(prod_id CHAR(10) NOT NULL,vend_id CHAR(10) NOT NULL,prod_name CHAR(254) NOT NULL,prod_price DECIMAL(8,2) NOT NULL,

Page 172: SQL Without Assistance

Создание таблиц и работа с ними 171

prod_desc VARCHAR(1000) NULL

АнализКак видите, имя таблицы указывается сразу же после

ключевых СЛОВ CREATE TABLE.Определение таблицы (все ее столбцы) заключается в

круглые скобки. Имена столбцов разделяются запятыми.Приведенная в примере таблица состоит из пяти столбцов.Определение каждого столбца начинается с имени столбца(которое должно быть уникальным в пределах данной таб-лицы), за ним указывается тип данных. (Обратитесь к уро-ку 1, "Что такое SQL", чтобы вспомнить, что такое типыданных. Кроме того, в приложении Г, "Использование ти-пов данных SQL", приведен перечень часто используемыхтипов данных и сведения об их совместимости.) Оператор вцелом заканчивается символом "точка с запятой", следую-щим после закрывающей круглой скобки.

Ранее уже говорилось, что синтаксис оператора CREATETABLE весьма различен для разных СУБД, и только чтопредставленный нами простой сценарий доказывает это.В СУБД Oracle, PostgreSQL, SQL Server и Sybase представ-ленный оператор будет работать в той форме, в которой онпредставлен в примере, а вот в MySQL тип VARCHAR долженбыть заменен типом t e x t . В DB2 значение NULL следуетудалить из последнего столбца. Именно поэтому нами былипредложены различные сценарии создания таблиц SQL длякаждой СУБД (см. приложение А).

Форматирование оператора

Пробелы игнорируются операторами SQL. Операторможно ввести в одной длинной строке или разбить еена несколько строк, разницы между ними не будет.Это позволяет форматировать выражения SQL так,как вам удобно. Показанный выше оператор CREATETABLE — хороший пример форматирования операто-ра SQL. Код разбит на несколько строк, определениястолбцов разнесены для удобства чтения и редакти-рования. Форматировать выражения SQL подобнымобразом не обязательно, но все же настоятельно ре-комендуется.

Page 173: SQL Without Assistance

172 Урок 17

Замена существующих таблиц

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

Работа со значениями NULLВ уроке 4, "Фильтрация данных", рассказывалось о том,

что такое значение NULL. Использование этого значенияподразумевает, что в столбце не должно содержаться ника-кое значение или неизвестно значение, которое должнобыть в столбце. Столбец, в котором разрешается присутст-вие значения NULL, позволяет также добавлять в таблицустроки, в которых не предусмотрено значение для данногостолбца. Столбец, в котором не разрешается присутствиезначения NULL, не принимает строки с отсутствующим зна-чением. Иными словами, для этого столбца всегда потребу-ется вводить какое-то значение при добавлении или обнов-лении строк.

Каждый столбец таблицы может быть или пустым(NULL), или не пустым (NOT NULL), и это его состояние ого-варивается в определении таблицы во время ее создания.Рассмотрим следующий пример:

ВВОДCREATE TABLE Orders(order_num INTEGER NOT NULL,order_date DATETIME NOT NULL,cust id CHAR(10) NOT NULL

АнализПосредством этого оператора создается таблица Orders,

неоднократно использованная в книге. Таблица Orders со-стоит из трех столбцов: номер заказа (order number), дата

Page 174: SQL Without Assistance

С о з д а н и е таблиц и работа с н и м и 1 7 3

заказа (order d a t e ) и идентификатор клиента (customerID). Все три столбца являются необходимыми, каждый со-держит ключевое слово NOT NULL, которое будет препятст-вовать добавлению в таблицу столбцов с отсутствующимзначением. При попытке добавления такого столбца будетвозвращено сообщение об ошибке, и добавить такую записьне удастся.

В следующем примере создается таблица, в которой мо-гут быть столбцы обеих разновидностей, NULL и NOT NULL:

ВВОД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, поэтому для них не указано требование NOTNULL. Значение NULL является значением по умолчанию,поэтому, если не указано требование NOT NULL, предполага-ется разрешение на использование значения NULL.

У к а з а н и е з н а ч е н и я N U L L

Во многих СУБД отсутствие ключевых слов NOT N U L L

трактуется как N U L L . Однако не во всех. В СУБД DB2

наличие ключевого слова N U L L является обязатель-

ным; если оно не указано, генерируется сообщение

об ошибке. Обратитесь к документации своей СУБД,чтобы получить исчерпывающую информацию о син-таксисе.

Page 175: SQL Without Assistance

174 Урок 17

Первичные ключи и значения N U L L

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

Что такое NULL

Не удивляйтесь, увидев значения NULL В пустых стро-ках. Значение NULL означает отсутствие значения; этоне пустая строка. Если вы указали в коде ' ' (двеодинарных кавычки, между которыми ничего нет), это"значение" можно было бы ввести в столбец типа NOTNULL. Пустая строка является допустимым значени-ем; это не означает отсутствие значения. ЗначенияN U L L указываются посредством ключевого словаN U L L , н о н е пустой строкой.

Определение значений по умолчаниюЯзык SQL позволяет определять значения по умолча-

нию, которые будут использованы в том случае, если придобавлении строки какое-то ее значение не указано. Значе-ния по умолчанию определяются с помощью ключевогослова DEFAULT в определениях столбца оператора CREATETABLE.

Рассмотрим следующий пример:

ВВОДCREATE TABLE Orderltems(order_num INTEGER NOT NULL,order_item INTEGER NOT NULL,prod_id CHAR(10) NOT NULL,quantity INTEGER NOT NULL DEFAULT 1,item_j>rice DECIMAL (8 ,2) NOT NULL

Page 176: SQL Without Assistance

Создание таблиц и работа с ними 175

АнализПосредством этого оператора создается таблица

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 . Получение значения даты из системы

СУБД Функция/переменная

AccessDB2MySQLOraclePostgreSQLSQL ServerSybase

NOW()CURRENT_DATE

CURRENT_DATE()

SYSDATE

CURRENT_DATE

GETDATE()

GETDATE()

Использование значений DEFAULT вместо значе-ний N U L L

Многие разработчики баз данных используют значе-ния DEFAULT вместо столбцов NULL. Часто значенияDEFAULT применяются в столбцах, которые будут ис-пользованы в вычислениях или при статистическойобработке данных.

Page 177: SQL Without Assistance

176 Урок 17

Обновление таблицДля того чтобы обновить определения таблицы, следует

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

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

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

• Многие СУБД не позволяют удалять или изменятьстолбцы в таблице.

• Большинство СУБД разрешают переименовыватьстолбцы.

• Многие СУБД налагают серьезные ограничения наизменения, которые могут быть сделаны по отноше-нию к заполненным столбцам, и несколько мень-шие — по отношению к незаполненным.

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

Чтобы изменить таблицу посредством оператора ALTERTABLE, нужно ввести следующую информацию.

• Имя таблицы, подлежащей изменению, после ключе-вых слов ALTER TABLE. (Таблица с таким именемдолжна существовать, иначе будет выдано сообщениеоб ошибке.)

• Список изменений, которые должны быть сделаны.Поскольку добавление столбцов в таблицу — единст-венная операция, поддерживаемая всеми СУБД,именно ее мы рассмотрим в качестве примера.

Page 178: SQL Without Assistance

Создание таблиц и работа с ними 177

ВВОДALTER TABLE VendorsADD vend_j>hone CHAR(20);

АнализПосредством этого оператора в таблицу Vendors добав-

ляется столбец, названный vend_phone. Должен быть оп-ределен тип данных.

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

ВВОДALTER TABLE VendorsDROP COLUMN vend_phone;

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

• Создание новой таблицы с новым расположениемстолбцов.

• Использование оператора INSERT SELECT (см.урок 15, "Добавление данных," в котором подробнорассмотрены вопросы применения этого оператора)для копирования данных из старой таблицы в новую.При необходимости используются функции преобра-зования и вычисляемые поля.

• Проверка того факта, что новая таблица содержитнужные данные.

• Переименование старой таблицы (или удаление ее).• Присвоение новой таблице имени, которое ранее при-

надлежало старой таблице.• Восстановление триггеров, хранимых процедур, ин-

дексов и внешних ключей, если это необходимо.

Page 179: SQL Without Assistance

178 Урок 17

А к к у р а т н о и с п о л ь з у й т е о п е р а т о р A L T E R T A B L E

О п е р а т о р A L T E R T A B L E с л е д у е т и с п о л ь з о в а т ь с о с о б о й

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

Удаление таблицУдаление таблиц (имеется в виду удаление именно таб

лиц, а не их содержимого) — очень простой процесс. Таблицы удаляются с помощью оператора DROP TABLE:

ВВОДDROP TABLE CustCopy;

АнализЭтот оператор удаляет таблицу CustCopy (которую вы

создали в ходе изучения материалов урока 15). В данномслучае не требуется никакого подтверждения, невозможнсвозвратиться к прежнему состоянию — в результате приме-нения этого оператора таблица будет безвозвратно удалена.

Использование реляционных правил для предот-вращения ошибочного удаления

Во многих СУБД применяются правила, препятст-вующие удалению таблиц, связанных с другими таб-лицами. Если эти правила действуют и вы применяе-те оператор DROP T A B L E ПО отношению к таблице,

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

Page 180: SQL Without Assistance

Создание таблиц и работа с ними 179

Переименование таблицВ разных СУБД переименование таблиц осуществляется

по-разному. Не существует жестких, устоявшихся стандар-тов на выполнение этой операции. Пользователи СУБДDB2, MySQL, Oracle и PostgreSQL могут применять дляэтого оператор RENAME. Пользователи SQL Server и Sybaseмогут использовать хранимую процедуру sp_rename. Ос-новной синтаксис для всех операций переименования тре-бует указания старого и нового имен. Однако существуютразличия, зависящие от реализации. Обратитесь к докумен-тации своей СУБД, чтобы узнать подробности относительноподдерживаемого ею синтаксиса.

РезюмеВ этом уроке вы познакомились с несколькими новыми

операторами SQL. Оператор CREATE TABLE применяется длясоздания новых таблиц, ALTER TABLE — для изменениястолбцов таблицы (или других объектов, таких как ограни-чения или индексы), а оператор DROP TABLE позволяетполностью удалить таблицу. Все эти операторы нужно ис-пользовать с особой осторожностью и только после созданиярезервных копий базы данных. Поскольку точный синтак-сис этих операторов варьируется в зависимости от СУБД,вам придется обратиться к документации своей СУБД задополнительной информацией.

Page 181: SQL Without Assistance
Page 182: SQL Without Assistance

Урок 18

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

Что такое представленияПредставления — это виртуальные таблицы. В отличие

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

Поддержка в MySQL

К моменту выхода этой книги СУБД MySQL еще неподдерживала представления (их поддержку плани-ровалось осуществить в версии MySQL 5). Поэтомуприведенные нами примеры в настоящее время ра-ботать не будут.

Лучший способ объяснить, что такое представления, —рассмотреть конкретный пример. Возвратимся к уроку 12,"Объединение таблиц", в котором был использован сле-дующий оператор SELECT для выборки данных сразу изтрех таблиц:

ВВОДSELECT cust_name, cust_contactFROM Customers, Orders, OrderltemsWHERE Customers.cust id = Orders.cust id

Page 183: SQL Without Assistance

182 Урок 18

AND Orderltems .order__num = Orders . order_numAND prod_id = 'RGAN01

1;

Этот запрос был использован для извлечения информции о клиентах, которые заказали указанный продукВсякий, кому необходимы эти данные, должен был бы рзобраться в структуре таблицы, а также в методике создния запроса и объединения таблиц. Чтобы извлечь аналгичные данные для другого продукта (или для несколькопродуктов), последнее предложение WHERE придется мод]фицировать.

Теперь предположим, что вы могли бы сохранить ве<этот запрос в виртуальной таблице с именеProductCustomers. Затем для выборки тех же самых да]ных нужно было бы просто сделать следующее:

ВВОДSELECT cust_name, cust_contactFROM ProductCustomersWHERE prod_id = 'RGAN01';

Это как раз тот случай, когда в игру вступают предста]ления. Таблица ProductCustomers является представлен!ем, поэтому она не содержит каких-либо столбцов или да!ных. Вместо них хранится запрос — тот самый запрос, К(торый был использован выше для объединения таблиц.

Постоянство СУБД

Синтаксис создания представлений одинаков длявсех основных СУБД.

Для чего используют представленияВы только что познакомились с одним случаем испол!

зования представления. Довольно часто они применяютсдля выполнения следующих операций:

• для повторного использования операторов SQL;• для упрощения выполнения сложных операций. Пс

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

Page 184: SQL Without Assistance

Использование представлений 183

• для вывода частей таблицы вместо вывода ее полно-стью;

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

• для изменения форматирования и отображения дан-ных. Представления могут возвращать данные, от-форматированные и отображенные иначе, чем онихранятся в таблицах.

После того как представления созданы, их можно ис-пользовать точно так же, как таблицы. Вы можете выпол-нять операции SELECT, фильтровать и сортировать данные,объединять представления с другими представлениями илитаблицами и, возможно, даже добавлять в них данные либообновлять их. (На последнюю операцию накладываются не-которые ограничения. Ниже мы расскажем о них.)

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

Проблемы производительности

Поскольку представления не содержат данных, каж-дый раз, когда используется представление, для вы-полнения запроса приходится проводить некоторыйпоиск. Если вы создали сложное представление с не-сколькими объединениями и фильтрами или еслибыли использованы вложенные представления, про-изводительность СУБД резко снизится. Рекоменду-ется провести тестирование, прежде чем использо-вать приложения, в которых интенсивно используют-ся представления.

Представления: правила и ограниченияПрежде чем создавать представления, следует ознако-

миться с некоторыми накладываемыми на них ограниче-

Page 185: SQL Without Assistance

184 Урок 18

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

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

• Представления, так же как и таблицы, должны име!уникальные имена. (Они не могут быть названы таже, как какая-нибудь другая таблица или предста]ление.)

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

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

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

• Во многих СУБД запрещается использование предлсжения ORDER BY в запросах к представлениям.

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

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

• В некоторых СУБД представления трактуются ка]запросы, предназначенные только для чтения. Эт(означает, что из представлений можно выбирать данные, но их нельзя вносить в таблицы, на основе которых было создано представление. Обратитесь к до

Page 186: SQL Without Assistance

Использование представлений 185

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

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

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

Создание представленийИтак, вы знаете, что такое представления (а также от-

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

Представления создаются с помощью оператора CREATEVIEW. Аналогично оператору CREATE TABLE, операторCREATE VIEW можно использовать только для созданияпредставления, которого до сих пор не существовало.

Удаление представлений

Для удаления представления используется опера-тор DROP. Его синтаксис прост: DROP V I E Wимя представления;.

Page 187: SQL Without Assistance

186 Урок 18

Чтобы перезаписать (или обновить) представление,вначале нужно применить по отношению к нему опе-ратор DROP, а потом заново создать представление.

Использование представлений дляупрощения сложных объединений

Чаще всего представления используются для упрощенияработы с SQL, и нередко это относится к объединениям.Посмотрите на следующий оператор:

ВВОДCREATE VIEW ProductCustomers ASSELECT cust_name, cust_contact, prod_idFROM Customers, Orders, OrderltemsWHERE Customers.cust_id = Orders.cust_idAND Orderltems.order num = Orders.order num;

АнализПосредством этого оператора создается представление,

названное ProductCustomers, которое объединяет три таб-лицы с целью возвращения списка клиентов, заказавшихкакой-то продукт. Если бы был использован операторSELECT * FROM ProductCustomers, в список был бывключен любой клиент, который сделал заказ.

Создание представлений и SQL Server

В отличие от большинства операторов SQL, MicrosoftSQL Server не поддерживает использование точки сз а п я т о й п о с л е о п е р а т о р а C R E A T E V I E W .

Для выборки списка клиентов, заказавших продуктRGAN01, нужно выполнить следующее:

ВВОДSELECT cust_name, cust_contactFROM ProductCustomersWHERE prod_id = 'RGAN01';

Page 188: SQL Without Assistance

Использование представлений 187

ВЫВОДcust name cust contact

Denise L. StephensKim Howard

Fun4AllThe Toy Store

АнализЭтот оператор возвращает указанные данные из пред-

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

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

Создание повторно используемых представлений

Хорошей идеей является создание представлений, непривязанных к конкретным данным. Например, пред-ставление, созданное в предыдущем примере, возвра-щает имена клиентов, заказавших все продукты, а нетолько продукт RGANOI (для которого представлениепервоначально и создавалось). Расширение возможно-стей представления позволяет многократно использо-вать его, тем самым устраняется также необходимостьсоздавать и хранить много похожих представлений, чтоделает представление еще более эффективным.

Использование представлений дляпереформатирования выбранныхданных

Как уже говорилось выше, другим наиболее частым слу-чаем использования представлений является переформати-рование выбранных данных. Следующий оператор SELECT(см. урок 7, "Создание вычисляемых полей") возвращаетимя поставщика и его местонахождение в одном комбини-рованном вычисляемом столбце:

Page 189: SQL Without Assistance

188 Урок 18

ВВОДSELECT RTRIM(vend_name) + ' (' + RTRIM(vend__country)

Ь+ ' )' AS vend_titleFROM VendorsORDER BY vend name;

ВЫВОДvend title

Bear Emporium (USA)Bears R Us (USA)Doll House Inc. (USA)Fun and Games (England)Furball Inc. (USA)Jouets et ours (France)

Следующий оператор такой же, но в нем применяетсясинтаксис | | (его мы рассматривали в уроке 7):

ВВОДSELECT RTRIM(vend_name) j | ' (' |

•^RTRIM(vend_country) || ' )' AS vend_titleFROM VendorsORDER BY vend name;

ВЫВОДvendtitle

Bear Emporium (USA)Bears R Us (USA)Doll House Inc. (USA)Fun and Games (England)Furball Inc. (USA)Jouets et ours (France)

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

ВВОДCREATE VIEW VendorLocations AS SELECT RTRIM(vend_name)

(' + RTRIM(vend_country)

Page 190: SQL Without Assistance

Использование представлений 189

Ь+ ')' AS v e n d _ t i t l eFROM Vendors;

Здесь также применяется оператор, использующий син-таксис I I:

ВВОДCREATE VIEW VendorLocations ASSELECT RTRIM(vend_name) || ' (' | |^RTRIM(vend_country) || ' ) ' AS vend_titleFROM 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)

Все ограничения о п е р а т о р а S E L E C T сохраняются

Ранее в этом уроке говорилось, что синтаксис, при-меняемый для создания представлений, различен вразных СУБД. Но почему так много версий синтаксисаоператоров? Представление просто скрывает опера-тор SELECT, и синтаксис этого оператора SELECTдолжен четко соответствовать правилам и ограниче-ниям используемой СУБД.

Page 191: SQL Without Assistance

190 Урок 18

Использование представлений дляфильтрации нежелательных данных

Представления могут также оказаться полезными для при-менения общих предложений WHERE. Например, вам можетпонадобиться определить представление CustomerEMailListтаким образом, чтобы оно отфильтровывало клиентов, неимеющих адреса электронной почты. Для того чтобы добитьсяэтого, следует применить такой оператор:

ВВОДCREATE VIEW CustomerEMailList ASSELECT cust_id, cust_name, cust_emailFROM CustomersWHERE cust email IS NOT NULL;

АнализОчевидно, отправляя сообщение в соответствии со спи-

ском адресов e-mail, следовало бы пропустить клиентов, укоторых нет адреса электронной почты. ПредложениеWHERE отфильтровывает здесь строки, имеющие значенияNULL в столбцах cust_eraai l , так что соответствующие за-писи не будут выбираться.

Теперь представление CustomerEMailList можно ис-пользовать подобно любой другой таблице.

ВВОДSELECT *FROM CustomerEMailList;

ВЫВОДcust id cust name cust email

100000000110000000031000000004

Village ToysFun4AllFun4All

[email protected]@[email protected]

П р е д л о ж е н и я W H E R E

Если предложение WHERE используется при выборке

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

Page 192: SQL Without Assistance

Использование представлений 191

Использование представленийс вычисляемыми полями

Представления чрезвычайно полезны для упрощения ис-пользования вычисляемых полей. Далее приведен операторSELECT, впервые использованный нами в уроке 7. Он из-влекает предметы указанного заказа и вычисляет суммар-ную стоимость для каждого предмета:

ВВОДSELECT prod_id,

quantity,item_price,quantity*item_jprice AS expanded_price

FROM OrderItemsWHERE order num = 20008;

ВЫВОДprod_id quantity

RGAN01BR03BNBG01BNBG02BNBG03

55101010

item_price

4.990011.99003.49003.49003.4900

expanded_price

24.950059.950034.900034.900034.9000

Для превращения его в представление необходимо вы-полнить следующее:

ВВОДCREATE VIEW OrderltemsExpanded ASSELECT order_num,prod_id,quantity,item_price,quantity*item_price AS expanded_priceFROM Orderltems;

Чтобы получить информацию относительно заказа 2 0008(она была выведена выше), необходимо сделать следующее:

ВВОДFROM SELECT *OrderltemsExpandedWHERE order num = 20008;

Page 193: SQL Without Assistance

192 Урок 18

ВЫВОДorder_num prod_id quantity item_price expanded_price

2000820008200082000820008

RGAN01BR03BNBG01BNBG02BNBG03

55101010

4.9911.993.493.493.49

24.9559.9534.9034.9034.90

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

РезюмеПредставления — это виртуальные таблицы. Они не со-

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

Page 194: SQL Without Assistance

Урок 19

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

Что такое хранимыепроцедуры

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

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

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

• Товары, отсутствующие на складе, должны быть зака-заны, для этого нужно связаться с их поставщиком.

• Клиенту необходимо сообщить, какие товары есть наскладе (и могут быть отгружены немедленно) и заказна какие товары выполнен быть не может.

Page 195: SQL Without Assistance

194 Урок 19

Очевидно, это не полный список примеров, но cyriдолжна быть вам ясна. Решение подобной задачи потребуепприменения многих операторов SQL по отношению ко многим таблицам. Помимо того что сами SQL-операторы, подлежащие выполнению в подобных случаях, и их порядок н<постоянны, они могут (и будут) изменяться в зависимости очтого, какие товары имеются на складе, а каких там нет.

Как бы вы написали этот код? Можно было бы написат!каждый из операторов SQL отдельно и выполнить другиеоператоры в зависимости от полученных результатов. Вакпришлось бы делать это каждый раз, когда возникала бь:необходимость подобной обработки данных (и для каждогсприложения, которое в ней нуждается).

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

Access и MySQL

Хранимые процедуры не поддерживаются в Access.Кроме того, когда эта книга готовилась к печати,СУБД MySQL v4.x (текущая версия) также не поддер-живала хранимые процедуры (их поддержку планиро-валось осуществить в версии MySQL 5).

Гораздо больше информации

Хранимые процедуры— тема довольно сложная,полностью ее рассмотреть можно только в отдельнойкниге. Этот урок не научит вас всему, что необходимознать о хранимых процедурах. Скорее это введение вданную тему, призванное познакомить вас с тем, чтособой представляют хранимые процедуры и что с ихпомощью можно делать. По существу, представлен-ные здесь примеры соответствуют только синтаксисуOracle и SQL Server.

Page 196: SQL Without Assistance

Работа с хранимыми процедурами 195

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

Теперь, когда вы знаете, что такое хранимые процедуры,возникает другой вопрос: для чего их использовать? На этосуществует множество причин, ниже приведены лишь ос-новные.

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

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

• Побочным эффектом этого является предотвращениеошибок. Чем больше шагов необходимо выполнить,тем выше вероятность появления ошибок. Предот-вращение ошибок обеспечивает целостность данных.

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

• Поскольку хранимые процедуры обычно сохраняютсяв компилированном виде, СУБД тратит меньше вре-мени на обработку их команд. Это приводит к повы-шению производительности.

• Существуют элементы языка SQL и некоторые воз-можности, реализуемые только в хранимых процеду-рах. Хранимые процедуры, таким образом, можноиспользовать для написания более гибкого и мощногокода.

Page 197: SQL Without Assistance

196 Урок 19

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

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

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

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

Не можете написать хранимые процедуры? Тогдапросто используйте их

Во многих СУБД различаются меры безопасности иправа доступа, необходимые для написания храни-мых процедур, и меры безопасности и права доступа,необходимые для их выполнения. И это хорошо. Есливы не намерены писать свои хранимые процедуры,используйте готовые, если они вам подходят.

Page 198: SQL Without Assistance

Работа с хранимыми процедурами 197

Выполнение хранимыхпроцедур

Хранимые процедуры выполняются намного чаще, чемпишутся, поэтому мы начнем именно с их выполнения.Оператор 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, которыйявляется первичным ключом таблицы. Почему это значениене передается в хранимую процедуру в виде атрибута? Длятого чтобы идентификаторы генерировались правильно,безопаснее сделать этот процесс автоматизированным (и неполагаться на конечного пользователя). Именно поэтомухранимая процедура используется в этом примере, она вы-полняет следующие действия.

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

Page 199: SQL Without Assistance

198 Урок 19

• Генерирует уникальный идентификатор, который бу-дет использован в качестве первичного ключа.

• Добавляет данные о новом продукте в таблицуProducts, сохраняя созданный первичный ключ кпередавая данные в соответствующие столбцы.

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

• Опциональные параметры со значениями по умолча-нию, присваиваемыми в случае, если параметр непредложен пользователем.

• Нестандартные параметры, указываемые в виде парпараметр^ значение.

• Выходные параметры, позволяющие хранимой про-цедуре обновлять параметр для использования его Евыполняемом приложении.

• Значение даты, выбираемое оператором SELECT.• Возвращаемые коды, позволяющие хранимой процеду-

ре возвращать значение в выполняемое приложение.

Создание хранимых процедурКак уже говорилось, создание хранимой процедуры —

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

Вот версия для СУБД Oracle:

ВВОДCREATE PROCEDURE MailingListCount(ListCount OUT NUMBER)ISBEGINSELECT * FROM CustomersWHERE NOT cust_email IS NULL;ListCount := SQL%ROWCOUNT;

END;

Page 200: SQL Without Assistance

Работа с хранимыми процедурами 199

АнализЭта хранимая процедура принимает один параметр, на-

зываемый ListCount. Вместо того чтобы передавать значе-ние в хранимую процедуру, этот параметр передает значе-ние из нее. Ключевое слово OUT указывает ей вести себя по-добным образом. СУБД Oracle поддерживает параметрытипов IN (которые передаются в хранимые процедуры), OUT(они передаются из хранимых процедур) и INOUT (они ис-пользуются для передачи параметров в хранимые процеду-ры и из них). Собственно код хранимой процедуры заклю-чен между BEGIN и END, и здесь для выборки клиентов,имеющих адреса электронной почты, выполняется простойоператор SELECT. Затем передаваемому выходному пара-метру ListCount присваивается значение, равное количест-ву строк в выборке.

А вот версия для Microsoft SQL:

ВВОДCREATE PROCEDURE MailingListCountASDECLARE @cnt INTEGERSELECT @cnt = COUNT(*)FROM CustomersWHERE NOT cust_email IS NULL;RETURN @cnt;

АнализЭта хранимая процедура вообще не принимает парамет-

ров. Вызываемое приложение выбирает нужное значение,пользуясь тем, что в СУБД SQL Server поддерживается воз-вращение кода. Здесь посредством оператора DECLARE объ-явлена локальная переменная @cnt (имена всех локальныхпеременных в SQL Server начинаются с символа @). Эта пе-ременная затем используется в операторе SELECT, так чтоон содержит значение, возвращаемое функцией COUNT ().Наконец, оператор RETURN используется для возвращениярезультатов подсчета в вызывающее приложение — RETURN@cnt.

Приведем еще один пример, на этот раз мы будем добав-лять новый заказ в таблицу Orders. Этот пример подходиттолько для SQL Server, но он хорошо показывает, как нуж-но использовать хранимые процедуры:

Page 201: SQL Without Assistance

200 Урок 19

ВВОДCREATE PROCEDURE NewOrder @cust_id CHAR(10)AS-- Объявление переменной для номера заказаDECLARE @order_num INTEGER-- Получение текущего наибольшего номера заказаSELECT @order_num=MAX(order_num)FROM OrdersDetermine next order numberSELECT @order_num=@order_num+l-- Добавление нового заказаINSERT INTO Orders(order_numVALUES(@order_num, GETDATE()-- Возвращение номера заказаRETURN ©order nura;

order_date, cust_id)@cust id)

АнализЭта хранимая процедура создает новый заказ в таблице

Orders. Она принимает один параметр — идентификаторклиента, сделавшего заказ. Два других столбца таблицы,номер и дата заказа, генерируются автоматически в самойхранимой процедуре. Вначале в коде объявляется локаль-ная переменная для хранения номера заказа. Затем выби-рается текущий наибольший номер заказа (посредствомфункции МАХ ()) и увеличивается на единицу (с помощьюоператора SELECT). После этого добавляется заказ посредст-вом оператора INSERT с использованием только что сгене-рированного номера заказа, выбирается текущая системнаядата (с помощью функции GETDATE ()) и передается иден-тификатор клиента. Наконец, номер заказа (необходимыйдля обработки предметов заказа) возвращается как RETURN@order_nura. Отметим, что код снабжен комментариями, этовсегда следует делать при написании хранимых процедур.

Комментируйте ваш код

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

Page 202: SQL Without Assistance

Работа с хранимыми процедурами 201

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

Вот несколько различных версий одного и того же кодадля SQL Server:

ВВОДCREATE PROCEDURE NewOrder @cust_id CHAR(10)AS-- Добавление нового заказаINSERT INTO Orders(cust_id)VALUES(@cust_id)-- Возвращение номера заказаSELECT order num = ©©IDENTITY;

АнализЭта хранимая процедура также создает новый заказ в

таблице Orders . На этот раз СУБД сама генерирует номерзаказа. Большинство СУБД поддерживают такой тип функ-циональности; SQL Server обращается к этим автоинкре-ментируемым столбцам как к полям I d e n t i t y (другиеСУБД используют такие имена, как Auto Number илиSequences). Опять же, передается только один параметр:идентификатор клиента, сделавшего заказ. Номер и дата за-каза не указываются вообще — СУБД использует значениепо умолчанию для даты (функция GETDATE ()), а номер зака-за генерируется автоматически. Как можно узнать, кокойидентификатор пользователя был сгенерирован? В СУБД SQLSerer для этого используется глобальная переменная©©IDENTITY, возвращаемая в вызывающее приложение (наэтот раз с использованием оператора SELECT).

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

Page 203: SQL Without Assistance

202 Урок 19

РезюмеВ этом уроке вы узнали, что такое хранимые процедуры

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

Page 204: SQL Without Assistance

Урок 20

Обработка транзакцийВ этом уроке вы узнаете, что такое транзакции и как ис-пользовать операторы COMMIT и ROLLBACK для их обработки.

Что такое обработкатранзакций

Обработка транзакций обеспечивает сохранение целост-ности базы данных за счет того, что пакеты операций SQLвыполняются полностью или не выполняются вовсе.

Как объяснялось в уроке 12, "Объединение таблиц", ре-ляционные базы данных организованы таким образом, чтоинформация в них хранится во многих таблицах. Благода-ря этому облегчается манипулирование, управление данны-ми, а также их повторное использование. Не вдаваясь вподробности, как и почему именно так устроены реляцион-ные базы данных, следует заметить, что схемы всех хорошоспроектированных баз данных можно в какой-то степениотнести к реляционным.

Таблица Orders, которую мы использовали в последних18-ти уроках, — хороший пример. Заказы хранятся в двухтаблицах, в таблице Orderltems хранится информация оботдельных предметах заказов. Эти две таблицы связаны (со-отнесены) между собой с помощью уникального идентифика-тора, который называется первичный ключ (см. урок 1, "Чтотакое SQL"). Эти таблицы, кроме того, связаны и с другимитаблицами, содержащими информацию о клиентах и про-дуктах.

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

1. Проверка, содержится ли информация о клиенте в базеданных. Если нет, такая информация добавляется.

Page 205: SQL Without Assistance

204 Урок 20

2. Выборка идентификатора клиента.3. Добавление строки в таблицу Orders, связывающую

ее (строку) с идентификатором клиента.4. Выборка идентификатора нового заказа, присвоенного

ему в таблице Orders.5. Добавление одной строки в таблицу Orderltems для

каждого заказанного предмета, соотнесение его с таб-лицей Orders посредством выбранного идентифика-тора (и с таблицей Products посредством идентифи-катора продукта).

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

Что случится с данными?Хорошо, если ошибка произойдет после добавления ин-

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

Но что если ошибка произойдет после того, как была до-бавлена строка в таблицу Orders, но до того, как будут до-бавлены строки в таблицу Orderltems? Теперь в вашей ба-зе данных будет присутствовать пустой заказ.

Еще хуже: что если система сделает ошибку в процесседобавления строк в таблицу Orderltems? В таком случае ввашу базу данных заказ будет внесен лишь частично, и выдаже не будете знать об этом.

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

Page 206: SQL Without Assistance

Обработка транзакций 205

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

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

1. Проверка, содержится ли информация о клиенте в базеданных. Если нет, такая информация добавляется.

2. Фиксация информации о клиенте.3. Выборка идентификатора клиента.4. Добавление строки в таблицу Orders.5. Если во время добавления строки в таблицу Orders

происходит ошибка, операция отменяется.6. Выборка идентификатора нового заказа, присвоенного

ему в таблице Orders7. Добавление одной строки в таблицу Orderlteras для

каждого заказанного предмета.8. Если в процессе добавления строк в таблицу

Order Items происходит ошибка, добавление всехстрок в таблицу Orderltems отменяется.

При работе с транзакциями вы часто будете сталкивать-ся с одними и теми же терминами:

• Транзакция (Transaction). Блок операторов SQL.• Отмена (Rollback). Процесс аннулирования указан-

ных операторов SQL (такой процесс иногда называют"откат").

• Фиксация (Commit). Запись несохраненных операто-ров SQL в таблицы базы данных.

• Точка сохранения (Savepoint). Временное состояниев ходе выполнения транзакции, в которое можновернуться после отмены части операций пакета (в от-личие от отмены всей транзакции). Иногда это со-стояние называют "точка отката".

Page 207: SQL Without Assistance

206 Урок 20

Действие каких операторов можно отменить?

Обработка транзакций используется в ходе управле-ния действием операторов INSERT, UPDATE И DELETE.Вы не можете отменить действие оператора S E L E C T .(В выполнении такой отмены вообще нет смысла.) Выне можете отменить операции CREATE ИЛИ DROP. ЭТИоператоры можно использовать в блоке операторовтранзакции, но если вам понадобится выполнить от-мену (откат), действие этих операторов аннулированоне будет.

Управляемые транзакцииТеперь, когда вы знаете, что такое обработка транзак-

ций, перейдем к управляемым транзакциям.

Различия в реализациях

Точный синтаксис, используемый для обработкитранзакций, для разных СУБД различен. Прежде чемзаняться такой обработкой, обратитесь к документа-ции своей СУБД.

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

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

ВВОДBEGIN TRANSACTION

COMMIT TRANSACTION

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

BEGIN TRANSACTION И COMMIT TRANSACTION, ДОЛЖНЫ бытьили выполнены, или не выполнены.

Эквивалентный код для MySQL таков:

Page 208: SQL Without Assistance

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

ВВОДSTART TRANSACTION

ВВОД

вводВ СУБД PostgreSQL используется синтаксис ANSI SQL:

BEGIN;

В других СУБД используются вариации на указаннуютему.

Использование оператора ROLLBACKОператор ROLLBACK используется для отмены (аннулиро-

вания) операторов SQL, как показано ниже:

ВВОДDELETE FROM Orders;ROLLBACK;

АнализВ этом примере выполняется и сразу же, посредством

оператора ROLLBACK, аннулируется операция DELETE. Хотяэто и не самый полезный пример, он все равно показывает,что, будучи включенными в блок транзакции, операцииDELETE (а также INSERT и UPDATE) не являются оконча-тельными.

Использование оператора COMMITОбычно после выполнения операторов SQL результаты

записываются непосредственно к таблицы баз данных. Этоназывается неявная фиксация — операция фиксации (со-хранения или записи) выполняется автоматически.

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

Page 209: SQL Without Assistance

208 Урок 20

Для безусловного выполнения неявной фиксации ис-пользуется оператор COMMIT. Вот соответствующий примердля SQL Server:

ВВОДBEGIN TRANSACTIONDELETE Orderltems WHERE order_num = 12345DELETE Orders WHERE order_num = 12345COMMIT TRANSACTION

АнализВ этом примере для SQL Server заказ номер 12345 пол-

ностью удаляется из системы. Поскольку это приводит кобновлению двух таблиц базы данных, Orders иOrderltems, блок транзакции применяется для того, чтобызаказ не мог быть удален лишь частично. Конечный опера-тор COMMIT записывает изменения только в случае, если непроизошло ошибки. Если первый оператор будет выполнен,а второй, из-за ошибки, не выполнен, удаление не будетзафиксировано.

Чтобы выполнить то же самое в СУБД Oracle, нужносделать следующее:

ВВОДDELETE Orderltems WHERE order_num = 12345;DELETE Orders WHERE order_num = 12345;COMMIT;

Использование точек сохраненияПростые операторы ROLLBACK и COMMIT позволяют запи-

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

Например, процесс добавления заказа, описанный выше,представляет собой одну транзакцию. Если произойдетошибка, вы просто вернетесь в состояние, когда строка втаблицу Orders еще не была добавлена. Но вы вряд ли за-хотите отменить добавление данных в таблицу Customers(если оно было сделано).

Для отмены части транзакции вы должны иметь воз-можность размещения меток в стратегически важных точ-

Page 210: SQL Without Assistance

Обработка транзакций 209

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

В языке SQL эти метки называются точками сохранения(savepoints). Для создания такой точки в СУБД MySQL иOracle применяется оператор SAVEPOINT:

ВВОДSAVEPOINT deletel;

В SQL Server и Sybase нужно сделать следующее:

ВВОДSAVE TRANSACTION deletel;

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

ВВОДROLLBACK TRANSACTION deletel;

В MySQL и Oracle можно сделать так:

ВВОДROLLBACK TO deletel;

А вот полный пример для SQL Server:

ВВОДBEGIN TRANSACTIONINSERT 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, 'BR01

1, 100, 5.49);

IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;INSERT INTO Orderltems(order_num, order_item,

4>prod_id, quantity, item_price)VALUES(20010, 2, 'BR03

1, 100, 10.99);

Page 211: SQL Without Assistance

210 Урок 20

IF @@ERR0R <> 0 ROLLBACK TRANSACTION StartOrderjCOMMIT TRANSACTION

АнализЗдесь имеется набор, состоящий из четырех операторо!

INSERT, включенных в блок транзакции. Точка сохраненияопределена после первого оператора INSERT, так что еслккакая-то из последующих операций INSERT закончится не-удачей, отмена транзакции произойдет лишь до этой точкиВ SQL Server для контроля успешности завершения какойлибо операции может быть использована переменная с име-нем @@ERROR. (В других СУБД используются иные функцияили переменные для возвращения такой информации.) Ес-ли переменная @@ERROR возвращает значение, отличное oiО, значит, произошла ошибка и транзакция отменяется дсточки сохранения. Если обработка транзакции в целом за-вершается успешно, выполняется операция COMMIT для со-хранения данных.

Чем больше точек сохранения, тем лучше

Вы можете создать столько точек сохранения в ва-шем SQL-коде, сколько захотите, и чем больше, темлучше. Почему? Потому что чем больше у вас точексохранения, тем большая гибкость вам доступна вуправлении отменами.

РезюмеТранзакции представляют собой блоки из операторов

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

Page 212: SQL Without Assistance

Урок 21

ИспользованиекурсоровВ этом уроке вы узнаете, что такое курсоры и как имипользоваться.

Что такое курсорыОперации выборки SQL работают с наборами строк, ко-

торые называются результирующие множества. Все воз-вращаемые строки являются строками, соответствующимипримененному SQL-оператору, их может быть нуль илибольше. При использовании простых операторов SELECT не-возможно получить первую строку, последнюю строку илипредыдущие 10 строк. Это объясняется особенностямифункционирования реляционной СУБД.

Результирующее множество

Результаты, возвращаемые в ответ на SQL-запрос.

Иногда бывает необходимо просмотреть строки в прямомили обратном направлении один или несколько раз. Именнодля этого используются курсоры. Курсор представляет со-бой запрос к базе данных, хранящийся на сервере СУБД, —это не оператор SELECT, но результирующее множество,выборка, полученная в результате действия оператораSELECT. После того как курсор сохранен, приложения мо-гут "прокручивать" (просматривать) данные в прямом илиобратном направлении, как только возникает такая потреб-ность.

Page 213: SQL Without Assistance

212 Урок 21

Поддержка в MySQL

В то время, когда эта книга готовилась к печати, СУБДMySQL еще не поддерживала курсоры (поддержкудля них планируется ввести в MySQL 5).

Различные СУБД поддерживают разные опции и возможности курсоров. Наиболее часто обеспечиваются еледующие из них.

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

• Возможность управлять направлением выполняемы:операций (вперед, назад, первая, последняя, абсолютное положение, относительное положение и т.д.).

• Возможность помечать некоторые столбцы как редактируемые, а другие — как нередактируемые.

• Указание области видимости, благодаря чему курсо]может быть доступен или для запроса, посредствомкоторого он был создан (например, для хранимо!процедуры), или для всех запросов.

• Указание СУБД скопировать выбранные данньи(в противоположность работе с "живыми" данными ]таблицах), чтобы они не изменялись в промежуто!времени между открытием курсора и обращением iнему.

Поведение реляционных СУБД становится похо-жим на поведение нереляционных

В качестве сравнения отметим, что организация дос-тупа и просмотр строк в такой форме в действитель-ности соответствует применению индексно-последо-вательного метода доступа (Indexed Sequential AccessMethod, ISAM) в базах данных (таких как Btrieve иdBASE). Курсоры как часть спецификации SQL инте-ресны тем, что с их помощью можно заставить реля-ционную базу данных вести себя подобно базе дан-HbixTnnalSAM.

Page 214: SQL Without Assistance

Использование курсоров 213

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

Курсоры и Web-приложения

Курсоры практически бесполезны, если их применятьк приложениям, основанным на Web-технологиях (на-пример, таких как ASP, ColdFusion, PHP и JSP). Курсо-ры предназначены для использования в течение се-анса связи между клиентским приложением и серве-ром, но эта модель "клиент-сервер" не годится длямира Web-приложений, потому что сервер приложе-ний является клиентом базы данных, а не конечнымпользователем. А раз так, то большинство разработ-чиков приложений избегают использования курсорови добиваются выполнения нужных функций, если этонеобходимо, своими силами.

Работа с курсорамиРаботу с курсором можно разделить на несколько четко

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

дует объявить (определить). В ходе этого процессавыборка данных не производится, просто определяет-ся оператор SELECT, который будет использован, инекоторые опции курсора.

• После объявления курсор может быть открыт для ис-пользования. В ходе этого процесса уже производитсявыборка данных согласно предварительно определен-ному оператору SELECT.

• После того как курсор заполнен данными, могут бытьизвлечены (выбраны) отдельные необходимые строки.

• После того как это сделано, курсор должен быть за-крыт и, возможно, должны быть освобождены ресур-сы, которые он занимал (в зависимости от СУБД).

Page 215: SQL Without Assistance

214 Урок 21

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

Создание курсоровКурсоры создаются с помощью оператора DECLARE, сив

таксис которого различен для разных СУБД. ОператоDECLARE дает курсору имя и принимает оператор SELEdдополненный при необходимости предложением WHERE :другими. Чтобы показать, как это работает, мы создадимкурсор, который будет делать выборку всех клиентов, нимеющих адресов электронной почты, в виде части прилсжения, позволяющего служащему вводить недостающие адреса.

Приведенная версия подходит для DB2, SQL Server iSybase:

ВВОДDECLARE CustCursor CURSORFORSELECT * FROM CustomersWHERE cust email IS NULL

А вот версия для Oracle и PostgreSQL:

ВВОДDECLARE CURSOR CustCursorISSELECT * FROM CustomersWHERE cust email IS NULL

АнализВ обеих версиях для определения имени курсора исполь

зуется оператор DECLARE — в данном случае это будет им*CustCursor. Оператор SELECT определяет курсор, содержащий имена всех клиентов, которые не имеют адрес*электронной почты (соответствующее значение равно NULL).

Теперь, после того как курсор определен, его можно открыть.

Page 216: SQL Without Assistance

Использование курсоров 215

Использование курсоров

Курсоры открываются с помощью оператора OPENi JRSOR, синтаксис которого настолько прост, что его под-{ерживают большинство СУБД:)PEN CURSOR CustCursor

При обработке оператора OPEN CURSOR выполняется за-ipoc, и выборка данных сохраняется для последующихфосмотра и прокрутки.

Теперь доступ к данным этого курсора может быть по-гучен с помощью оператора FETCH. Оператор FETCH указы-вает строки, которые должны быть выбраны, откуда онищ ж н ы быть выбраны и где их следует сохранить (имя пе-ременной, например). В первом примере используется син-таксис Oracle для выборки одной строки курсора (первой).

ВВОДDECLARE TYPE CustCursor IS REF CURSOR

Ь RETURN Customers%ROWTYPE;DECLARE CustRecord Customers%ROWTYPE3EGINOPEN CustCursor;FETCH CustCursor INTO CustRecord;CLOSE CustCursor;

END;

АнализВ данном примере оператор FETCH используется для вы-

борки текущей строки (автоматически он начнет с первойстроки) в переменную, объявленную с именем CustRecord.С выбранными данными ничего не делается.

В следующем примере (в нем вновь используется син-таксис Oracle) выбранные данные подвергаются цикличе-ской обработке от первой строки до последней:

ВВОДDECLARE TYPE CustCursor IS REF CURSOR• RETURN CuStomers%ROWTYPE;DECLARE CustRecord Customers%ROWTYPEBEGINOPEN CustCursor;LOOPFETCH CustCursor INTO CustRecord;EXIT WHEN CustCursor%NOTFOUND;

Page 217: SQL Without Assistance

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 CustCursorFETCH NEXT FROM CustCursorINTO @cust_id, @cust_name, @cust_address,@cust_city, @cust_state, @cust_ZIP,@cust_country, @cust_contact, @cust_emailWHILE @@FETCH_STATUS = 0BEGIN

FETCH NEXT FROM CustCursorINTO @cust_id, @cust_name, @cust_address,@cust_city, @cust_state, @cust_ZIP,@cust_country, @cust_contact, @cust_email

ENDCLOSE CustCursor

Page 218: SQL Without Assistance

Использование курсоров 217

АнализВ этом примере переменные объявляются для каждого

из выбираемых столбцов, а операторы FETCH осуществляютвыборку строки и сохранение значений в этих переменных.Цикл WHILE используется для организации цикла по стро-кам, а условие WHILE @@FETCH_STATUS = 0 обеспечиваетзавершение обработки (выход из цикла) после того как всестроки будут извлечены. И вновь этот пример ничего насамом деле не обрабатывает. В реальном коде нужно заме-нить . . . вашим собственным кодом.

Закрытие курсоровКак следует из предыдущих примеров, после использо-

вания курсоров их нужно закрывать. Кроме того, в некото-рых СУБД (таких как SQL Server) требуется, чтобы ресур-сы, занятые курсором, были освобождены явным образом.Вот соответствующий синтаксис для СУБД DB2, Oracle иPostgreSQL:

ВВОДCLOSE CustCursor

А это синтаксис для Microsoft SQL Server:

ВВОДCLOSE CustCursorDEALLOCATE CURSOR CustCursor

Для закрытия курсора используется оператор CLOSE; по-сле того как курсор закрыт, его нельзя использовать, неоткрыв перед этим вновь. Однако его не нужно объявлятьзаново при повторном использовании, достаточно оператораOPEN.

РезюмеВ этом уроке вы узнали, что такое курсоры и как их ис-

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

Page 219: SQL Without Assistance
Page 220: SQL Without Assistance

Урок 22

Расширенныевозможности SQLВ этом уроке мы рассмотрим несколько расширенных воз-можностей манипулирования данными: ограничения, ин-дексы и триггеры.

Что такое ограниченияБыло разработано много версий языка SQL, прежде чем

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

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

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

Чтобы реляционная база данных работала должным обра-зом, необходимо удостовериться в том, что данные в ее таб-лицы введены правильно. Например, если в таблице Ordersхранится информация о заказе, а в Order Items — его де-тальное описание, вы должны быть уверены, что все иденти-фикаторы заказов, упомянутые в таблице Orderltems, су-ществуют и в таблице Orders. Аналогично, каждый кли-ент, упомянутый в таблице Orders, не должен быть забыти в таблице Customers.

Хотя вы можете проводить соответствующие проверки,прежде чем вводить новые строки (выполняя оператор

Page 221: SQL Without Assistance

220 Урок 22

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

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

• Вам придется принудительно ввести правила для вы-полнения операций UPDATE И DELETE.

• Выполнение проверок на клиентской стороне — про-цесс, отнимающий много времени.

Заставить СУБД выполнять эти проверки — метод на-много более эффективный.

„Ограничения

Правила, регламентирующие ввод данных в базу дан-ных и манипуляцию ими.

СУБД принудительно обеспечивают целостность науровне ссылок за счет ограничений, налагаемых на табли-цы базы данных. Большинство ограничений вводится в оп-ределениях таблиц (с помощью операторов CREATE TABLEили ALTER TABLE, об этом рассказывалось в уроке 17,"Создание таблиц и работа с ними").

Предупреждение

Существует несколько типов ограничений, и каждаяСУБД обеспечивает свой собственный уровень ихподдержки. Следовательно, примеры, приведенныениже, могут работать не так, как вы предполагаете.Обратитесь к документации своей СУБД, прежде чемвыполнять их.

Первичные ключиО первичных ключах мы рассказывали в уроке 1, "Что

такое SQL". Первичный ключ — это особое ограничение,применяемое для того, чтобы значения в столбце (или на-

Page 222: SQL Without Assistance

Расширенные возможности SQL 221

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

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

• Никакие две строки не могут иметь одно и то же зна-чение первичного ключа.

• Каждая строка должна иметь какое-то значение пер-вичного ключа. (В таких столбцах не должно бытьразрешено использование значений NULL.)

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

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

Одним из способов определения первичных ключей яв-ляется их создание:

ВВОДCREATE TABLE Vendors

(vend_id CHAR(10) NOT NULL PRIMARY KEY,vend_name CHAR(50) NOT NULL,vend_address CHAR(50) NULL,vend_city CHAR(50) NULL,vend_state CHAR(5) NULL,vend_ZIP CHAR(10) NULLvend_country CHAR(50) NULL

АнализВ этом примере в определение таблицы добавлено клю-

чевое слово PRIMARY KEY, так что столбец vend_id стано-вится первичным ключом.

Page 223: SQL Without Assistance

222 Урок 22

ВВОДALTER TABLE VendorsADD CONSTRAINT PRIMARY KEY (vend id);

АнализЗдесь в качестве первичного ключа определен тот же са-

мый столбец, но использован синтаксис CONSTRAINT. Этотсинтаксис может быть использован в операторах CREATETABLE И ALTER TABLE.

Внешние ключиВнешний ключ — это столбец одной таблицы, значения

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

Таблица Orders содержит единственную строку для ка-ждого заказа, зафиксированного в базе данных. Информа-ция о клиенте хранится в таблице Customers. Заказы втаблице Orders связаны с определенными строками в таб-лице Customers за счет идентификатора клиента. Иденти-фикатор клиента является первичным ключом в таблицеCustomers; каждый клиент имеет уникальный идентифи-катор. Номер заказа является первичным ключом в табли-це Orders; каждый заказ имеет свой уникальный номер.

Значения в столбце таблицы Orders, содержащем иден-тификаторы клиентов, не обязательно уникальные. Есликлиент сделал несколько заказов, может быть несколькострок с тем же самым идентификатором клиента (хотя ка-ждая из них будет иметь свой номер заказа). В то же времяединственные значения, которые могут появиться в столбцеидентификаторов клиента таблицы Orders, — это иденти-фикаторы клиентов из таблицы Customers.

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

Page 224: SQL Without Assistance

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

Вот один из способов определения внешнего ключа:

ВВОДCREATE TABLE Orders(order_num INTEGER NOT NULL PRIMARY KEY,order_date DATETIME NOT NULL,cust_id CHAR(10) NOT NULL REFERENCES

"^Customers (cust id)

АнализЭто определение таблицы, использующее ключевое слово

REFERENCES для утверждения того факта, что любое значе-ние в столбце cust_id должно быть также и в столбцеcust_id таблицы Customers.

Того же результата можно было бы добиться с использо-ванием синтаксиса CONSTRAINT в операторе ALTER TABLE:

ВВОДALTER TABLE CustomersADD CONSTRAINTFOREIGN KEY (cust id) REFERENCES Customers (cust id)

Внешние ключи могут воспрепятствовать слу-чайному удалению данных

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

Page 225: SQL Without Assistance

224 Урок 22

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

Ограничения уникальностиОграничения уникальности обеспечивают уникальность

всех данных в столбце (или в наборе столбцов). Такиестолбцы похожи на первичные ключи, но имеются и важ-ные отличия.

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

• Столбцы с ограничением уникальности могут содер-жать значения NULL.

• Столбцы с ограничением уникальности можно моди-фицировать и обновлять.

• Значения столбцов с ограничением уникальностиможно использовать повторно.

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

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

Поскольку идентификатор служащего является первич-ным ключом, вы можете быть уверены в том, что он уни-кален. К примеру, для того чтобы СУБД проверила уни-

Page 226: SQL Without Assistance

Расширенные возможности SQL 225

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

Синтаксис ограничения на уникальность похож на син-таксис других ограничений: при определении таблицы ука-зывается ключевое слово UNIQUE или отдельно используетсяограничение CONSTRAINT.

Ограничения на значения столбцаОграничения на значения столбца используют для того,

чтобы данные в столбце (или наборе столбцов) соответство-вали ряду определенных вами критериев. Наиболее частоиспользуемыми из них являются следующие:

• Ограничение максимального и минимального значе-ний — например, для предотвращения появления за-казов на 0 (нуль) предметов (хотя 0 и является до-пустимым числом).

• Указание диапазонов — например, ограничение нато, чтобы дата отгрузки наступала позже или соот-ветствовала текущей дате и не отстояла от нее боль-ше, чем на год.

• Разрешение только определенных значений — на-пример, разрешение вводить в поле "пол" только бук-вы М или F.

Типы данных (см. урок 1) ограничивают типы данных,которые могут храниться в столбце. Ограничения на значе-ния столбца предъявляют дополнительные требования ужек данным определенного типа.

В следующем примере накладывается ограничение назначения столбцов таблицы Order I t ems с тем, чтобы длявсех предметов указывалось количество, большее 0:

CREATE TABLE Orderltems

order_num INTEGER NOT NULL,order_item INTEGER NOT NULL,prod_id CHAR(10) NOT NULL,

Page 227: SQL Without Assistance

226 Урок 22

quantity INTEGER NOT NULL CHECK4> (quantity > 0) ,item_jjrice MONEY NOT NULL

АнализПосле применения этого ограничения каждая добавляе-

мая (или обновляемая) строка будет проверяться на пред-мет того, что количество предметов больше нуля.

Чтобы проконтролировать тот факт, что в столбце с на-именованием пола может содержаться только буква М илиF, можно сделать следующее в операторе ALTER TABLE:

ВВОДADD CONSTRAINT CHECK ( g e n d e r LIKE ' [MF] ' )

Пользовательские типы данных

Пользователи некоторых СУБД могут определятьсобственные типы данных. Обычно это весьма про-стые типы данных, определенные с контрольными(или другими) ограничениями. Например, вы можетеопределить свой тип данных, назвав его gender (пол);он будет представлять собой тип данных, состоящихиз одной буквы с ограничением на значения столбца,допускающим для этих данных только два значения, мили F (и, возможно, NULL, если пол служащего неиз-вестен). Вы могли бы использовать этот тип данных вопределениях таблиц. Преимущество пользователь-ских типов данных состоит в том, что такие ограниче-ния могут быть определены только один раз (в опреде-лении типа данных), а потом они будут автоматическиприменяться каждый раз, когда будет использованпользовательский тип данных. Посмотрите в доку-ментации своей СУБД, поддерживает ли она пользо-вательские типы данных.

Page 228: SQL Without Assistance

Расширенные возможности SQL 227

Что такое индексыИндексы используются для логической сортировки дан-

ных с целью повышения скорости поиска и выполнения впоследующем операций сортировки. Лучший способ понять,что такое индексы — взглянуть на предметный указатель(по-английски — "index") в конце этой книги.

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

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

Что делает предметный указатель эффективным средст-вом поиска? Попросту говоря, тот факт, что он правильноотсортирован. Трудность поиска слов в книге обусловленане тем, что ее объем может быть слишком велик, скорееэто обусловлено тем, что ее содержимое не отсортировано валфавитном порядке. Если бы оно было отсортировано по-добно тому, как это делается в словарях, в предметном ука-зателе не было бы необходимости (именно поэтому словарине снабжаются предметными указателями).

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

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

Page 229: SQL Without Assistance

228 Урок 22

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

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

Однако прежде чем создавать множество индексов, при-мите во внимание следующее.

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

• Для хранения данных индекса требуется много местана жестком диске.

• Не все данные подходят для индексации. Данные,которые не являются по своей сути уникальными(как, например, названия штатов в столбцеcust_state), не дадут такого выигрыша от индекса-ции, как данные, которые имеют больше возможныхзначений (как, например, имя и фамилия).

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

• В качестве индекса можно определить несколькостолбцов (например, с названием штата и названиемгорода). Такой индекс можно использовать, только ес-ли данные будут отсортированы в порядке "штат плюсгород". (Если вы захотите отсортировать данные по на-званию города, такой индекс использован не будет).

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

Page 230: SQL Without Assistance

Расширенные возможности SQL 229

ления эффективности индексов, ими следует регулярнопользоваться.

Индексы создаются с помощью оператора CREATE INDEX(синтаксис которого весьма различен для разных СУБД). По-средством следующего оператора создается простой индексдля столбца с наименованием продукта таблицы Products:

ВВОДCREATE INDEX prod_name_indON PRODUCTS (prod_name);

АнализКаждый индекс должен иметь уникальное имя. В данном

случае оно определено как prod_name_ind после ключевыхслов CREATE INDEX. Ключевое слово ON используется дляуказания таблицы, которая должна быть проиндексирована,столбцы, включаемые в индекс (в нашем примере он один),указываются в круглых скобках после имени таблицы.

Пересмотр индексов

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

лярно пересматривать индексы и при необходимостиосуществлять их точную настройку;

Что такое триггерыТриггеры — это особые хранимые процедуры, автомати-

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

Page 231: SQL Without Assistance

230 Урок 22

Поддержка в MySQL

Когда эта книга готовилась к печати, СУБД MySQLеще не поддерживала триггеры (их поддержку плани-ровалось ввести в версии MySQL 5.1).

В отличие от хранимых процедур (которые представля-ют собой просто хранимые операторы SQL) триггеры привя-заны к отдельным таблицам. Триггер, ассоциирующийся соперациями INSERT по отношению к таблице Orders , будетвыполняться только в том случае, если строка добавляетсяв таблицу Orders . Аналогично, триггер, относящийся коперациям INSERT и UPDATE для таблицы Customers, будетвыполняться только в случае выполнения названных опе-раций по отношению к указанной таблице.

Будучи примененным в триггере, ваш код может иметьдоступ к следующим данным:

• ко всем новым данным в операциях INSERT;

• ко всем новым и старым данным в операцияхUPDATE;

• к удаляемым данным в операциях DELETE.

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

Чаще всего триггеры используются:

• для обеспечения непротиворечивости данных (напри-мер, для преобразования всех названий штатов вверхний регистр во время выполнения операцийINSERT ИЛИ UPDATE);

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

• для выполнения дополнительной проверки и отменывведения данных (например, чтобы удостовериться втом, что разрешенная для клиента сумма кредита непревышена, в противном случае операция блокируется);

• для подсчета значений вычисляемых полей или об-новления меток даты/времени.

Page 232: SQL Without Assistance

Расширенные возможности SQL 231

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

В следующем примере создается триггер, преобразую-щий значения столбца cus t_s ta te в таблице Customers вверхний регистр при выполнении любых операций INSERTИ UPDATE.

Вот версия для SQL Server:

ВВОДCREATE TRIGGER customer_stateON CustomersFOR INSERT, UPDATEASUPDATE CustomersSET cust_state = Upper(cust_state)WHERE Customers.cust_id = inserted.cust_id;

А вот версия для Oracle и PostgreSQL:

ВВОДCREATE TRIGGER customer_stateAFTER INSERT OR UPDATEFOR EACH ROWBEGINUPDATE CustomersSET cust_state = Upper(cust_state)WHERE Customers.cust_id = :OLD.cust_idEND;

Ограничения работают быстрее, чем триггеры

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

Безопасность баз данныхНет ничего более ценного для организации, чем ее дан-

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

Page 233: SQL Without Assistance

232 Урок 22

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

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

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

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

• ограничение доступа к отдельным базам данных илитаблицам;

• ограничение типа доступа (только для чтения, доступк отдельным столбцам и т.д.);

• организация доступа к таблицам только через пред-ставления или хранимые процедуры;

• создание нескольких уровней безопасности, вследст-вие чего обеспечивается различная степень доступа иконтроля на основе регистрационного имени пользо-вателя;

• ограничение возможности управлять учетными запи-сями пользователей.

Управление системой безопасности осуществляется по-средством операторов SQL GRANT и REVOKE, хотя большин-ство СУБД предлагает интерактивные утилиты админист-рирования, в которых используются те же операторы GRANTИ REVOKE.

РезюмеВ этом уроке вы узнали, как можно реализовать некото-

рые расширенные возможности SQL. Ограничения — важ-ная часть системы принудительного обеспечения целостно-сти ссылочных данных, индексы могут улучшить характе-

Page 234: SQL Without Assistance

Расширенные возможности SQL 233

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

Page 235: SQL Without Assistance
Page 236: SQL Without Assistance

Приложение А

Сценариидемонстрационныхтаблиц

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

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

Что такое демонстрационныетаблицы

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

• взаимодействие с поставщиками;• работа с каталогами продуктов;• работа со списками клиентов;• ввод заказов клиентов.Для выполнения всех этих задач требуется пять таблиц

(тесно связанных между собой и являющихся частью реля-

Page 237: SQL Without Assistance

236 Приложение А

ционной базы данных). В следующих разделах описана ка-ждая из таблиц.

Упрощенные образцы

Таблицы, используемые в книге, нельзя назвать пол-ными. Реальная система регистрации заказов храни-ла бы множество других данных, не включенных впредставленные таблицы (например, платежи и дан-ные учета, сведения об отгрузке и многие другие).Однако с помощью этих таблиц будет наглядно пока-зано, как организовываются данные и отношения ме-жду таблицами в реальных условиях. Вы сможетеприменить эти методы и технологии по'отношению квашим собственным базам данных.

Описания таблицДалее будут представлены каждая из пяти таблиц с ука-

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

Таблица VendorsВ таблице Vendors хранятся данные о поставщиках,

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

Таблица. А.1. Столбцы таблицы columns

Столбец Описание

vend_id "Уникальный идентификатор (ID) поставщика

vend_name Имя поставщика

vend_address Адрес поставщика

vend_city Город поставщика

vend_state Штат поставщика

vend_ZIP ZIP-код поставщика

vend_country Страна поставщика

Page 238: SQL Without Assistance

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

• Для всех таблиц должны быть определены первичныеключи. Для данной таблицы в качестве первичногоключа следует использовать ее столбец vend_id.

Таблица ProductsТаблица Products содержит каталог продуктов, по од-

ному продукту в строке. Каждый продукт имеет уникаль-ный идентификатор (в столбце prod_id) и связан с соответ-ствующим поставщиком через vend_id (уникальный иден-тификатор поставщика).

Таблица А.2. Столбцы таблицы Products

Столбец Описание

prod_id Уникальный идентификатор (ID) продуктаvend_id Идентификатор поставщика продукта (соответст-

вует столбцу vend_id таблицы Vendors)prod_name Название продуктаprod_price Цена продуктаprod_desc Описание продукта

• Для всех таблиц нужно определить первичные клю-чи. Для этой таблицы в качестве первичного ключаследует использовать столбец prod_id.

• Для обеспечения целостности ссылочных данных сле-дует определить внешний ключ на основе столбцаvend_id, связав его с vend_id в таблице Vendors.

Таблица CustomersВ таблице Customers хранится информация обо всех

клиентах. Каждый из них имеет уникальный идентифика-тор (столбец cust_id).

Таблица А.З. Столбцы таблицы Customers

Столбец Описание

cust_id Уникальный идентификатор клиентаcust_name Имя клиентаcust_address Адрес клиентаcust_city Город клиента

Page 239: SQL Without Assistance

238 Приложение А

Окончание табл. А.З

Столбец Описание

cust_state Штат клиентаcust_ZIP ZIP-код клиентаcust_country Страна клиентаcust_contact Контактное имя клиентаcust_email Контактный адрес электронной почты клиента

• Для всех таблиц следует определить первичные клю-чи. Для этой таблицы в качестве первичного ключаследует использовать столбец cust_id.

Таблица OrdersВ таблице Orders хранится информация о заказах кли-

ентов (без подробностей). Каждый заказ пронумерован с со-блюдением правила уникальности (столбец order_num). За-казы связаны с соответствующими клиентами через столбецcust_id (который связан с уникальным идентификаторомклиента в таблице Customers).

Таблица А.4. Столбцы таблицы Orders

Столбец Описаниеorder_num Уникальный номер заказаorder_date Дата заказаcust_id Идентификатор клиента, сделавшего заказ (свя-

зан со столбцом cust_id таблицы Customers)

• Для всех таблиц следует определить первичные клю-чи. Для этой таблицы в качестве первичного ключаследует использовать столбец order_nura.

• Для обеспечения целостности ссылочных данных сле-дует определить внешний ключ на основе столбцаcust_id, связав его с cust_id в таблице Customers.

Таблица OrderltemsВ таблице Orderltems хранятся предметы каждого за-

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

Page 240: SQL Without Assistance

Сценарии демонстрационных таблиц 239

одна или несколько строк в таблице Orderltems. Каждыйпредмет заказа идентифицирован уникальным образом по-средством номера заказа в совокупности с предметом заказа(первый предмет заказа, второй предмет заказа и т.д.).

Предмет заказа связан с соответствующими ему заказа-ми через столбец order_num (который соотносит его с уни-кальным идентификатором заказа в таблице Orders). Кро-ме того, каждая запись о предмете заказа содержит иден-тификатор продукта (который опять связывает предмет стаблицей Products).

Таблица А.5. Столбцы таблицы Orderltems

Столбец Описаниеorder_num Номер заказа (связан со столбцом order_num в

таблице Orders)order_item Номер предмета заказа (последовательно присваи-

ваемый внутри заказа)prod_id Идентификатор продукта (связан со столбцом

prod_id в таблице Products)quant i ty Количество предметовitem_price Цена предмета

• Для всех таблиц следует определить первичные ключи.В качестве первичных ключей для этой таблицы сле-дует использовать столбцы order_num и order_item.

• Для обеспечения целостности ссылочных данных сле-дует определить внешние ключи на основе столбцаorder_num, связав его с order_num в таблице Orders,и prod_id, связав его с prod_id таблицы Products.

Получение демонстрационныхтаблиц

Чтобы попрактиковаться в выполнении представленныхв книге примеров, вам нужен будет набор заполненныхтаблиц. Все, что вам необходимо получить и испытать,можно найти на Web-странице этой книги по адресуhttp://www.forta.com/books/0672325675/.

Page 241: SQL Without Assistance

240 Приложение А

Загрузка готового к работе MDB-файладля Microsoft Access

Вы можете загрузить полностью готовый MDB-файл дляMicrosoft Access с вышеуказанной страницы. Если вы вос-пользуетесь этим файлом, вам не придется выполнять ка-кие-либо сценарии создания и заполнения.

MDB-файл Access можно использовать с любыми кли-ентскими утилитами ODBC, а также с интерпретаторамиязыков сценариев, таких как ASP и ColdFusion.

Загрузка SQL-сценариев СУБДБольшинство СУБД хранят данные в форматах, которые не

позволяют распространять файлы баз данных (в отличие отAccess). Для таких СУБД вы можете загрузить SQL-сценариисо страницы http://www.forta.com/books/0672325675/.

Для каждой СУБД имеется два файла.• Файл c r e a t e . t x t , содержащий SQL-операторы, не-

обходимые для создания пяти таблиц базы данных(включая определения всех первичных ключей и ог-раничений внешних ключей).

• Файл populate . tx t , содержащий SQL-операторыINSERT, используемые для заполнения этих таблиц.

Операторы SQL, содержащиеся в этих файлах, весьмаразличны для разных СУБД, поэтому следует убедиться,что вы выполняете именно тот, который соответствует ва-шей СУБД. Эти сценарии предназначены для удобства чте-ния книги, и никакая ответственность за возможные про-блемы при их использовании не предполагается.

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

• IBM DB2;• Microsoft SQL Server;• MySQL;• Oracle;• PostgreSQL;• Sybase Adaptive Server.

Page 242: SQL Without Assistance

Сценарии демонстрационных таблиц 241

При необходимости этот список может быть пополнендругими СУБД.

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

Вначале создать, потом заполнять

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

Page 243: SQL Without Assistance
Page 244: SQL Without Assistance

Приложение Б

Работа с популярнымиприложениями

Как говорилось в уроке 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. for ta .com/books/0672325667/.

Любая из названных утилит будет хорошим выбором. Задополнительными рекомендациями обратитесь к Web-стра-нице этой книги.

Page 245: SQL Without Assistance

244 Приложение Б

Использование Aqua DataStudio

Aqua Data Studio — это бесплатный SQL-клиент, основан-ный на технологии Java. Он выполняется на всех главныхплатформах и поддерживает все наиболее распространенныеСУБД (а также ODBC1). Чтобы выполнить какой-нибудь SQL-оператор в Aqua Data Studio, сделайте следующее.

1. Запустите Aqua Data Studio.2. Прежде чем СУБД можно будет использовать, ее не-

обходимо зарегистрировать. Выберите в меню Selectпункт Register Server.

3. Выберите СУБД, которую вы используете, в отобра-женном на экране списке (выберите Generic ODBC дляиспользования Microsoft Access или произвольнуюбазу данных ODBC — для этого требуется, чтобы былопределен источник данных ODBC, о чем будет сказа-но в конце данного приложения). На основании вы-бранной СУБД вам будет предложен путь к файлуили информация относительно регистрации. Запол-ните форму и щелкните на кнопке ОК. После завер-шения регистрации этот сервер будет появляться всписке слева.

4. Выберите сервер в списке зарегистрированных серве-ров.

5. Запустите Query Analyzer, выбрав команду QueryAnalyzer в меню Server или нажав <Ctrl+Q>.

6. Введите свой SQL-код в окне запроса (верхнее окно).7. Чтобы выполнить SQL-код, выберите команду Execute

в меню Query, или нажмите <Ctrl+E>, или щелкнитена кнопке Execute (кнопке с зеленой стрелкой).

8. Результаты появятся в нижнем окне.

1 ODBC (сокр. от Open DataBase Connectivity) — открытый интер-фейс доступа к базам данных, встроенный в Windows и Windows NT,определяет набор функций, которые можно использовать для доступак любой реляционной СУБД. — Прим. ред.

Page 246: SQL Without Assistance

Работа с популярными приложениями 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.

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

ColdFusion компании Macromedia представляет собойплатформу для разработки Web-приложений.

ColdFusion использует для создания сценариев язык, ос-нованный на дескрипторах (тегах). Чтобы протестироватьваш SQL-код, создайте простую страницу, которую вы смо-жете отобразить, вызвав ее посредством своего Web-брау-зера. Выполните следующие шаги:

1. Прежде чем вы сможете обращаться к каким-либо ба-зам данных из ColdFusion, должен быть определен ис-точник данных (Data Source). Программа ColdFusionAdministrator обеспечивает Web-интерфейс для опре-деления источников данных (обратитесь за помощью кдокументации ColdFusion, если это необходимо).

Page 247: SQL Without Assistance

246 Приложение Б

2. Создайте новую страницу ColdFusion (с расширениемCFM).

3. Используйте дескрипторы CFML <CFQUERY> и</CFQUERY> для создания блока запроса. Назовитеего, используя атрибут NAME, и определите источникданных в атрибуте DATASOURCE.

4. Введите свой SQL-оператор между дескрипторами<CFQUERY> и </CFQUERY>.

5. Используйте цикл <CFDUMP> или <CFOUTPUT> дляотображения результатов запроса.

6. Сохраните страницу в каком-нибудь каталоге испол-няемых файлов корневого каталога Web-сервера.

7. Отобразите страницу, вызвав ее из Web-браузера.

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

Microsoft Access обычно используется интерактивно длясоздания баз данных, управления, манипулирования ивзаимодействия с данными, a Access предлагает еще и кон-структор запросов (Query Designer), который можно ис-пользовать для интерактивного построения операторов SQL.Зачастую остающаяся невыявленной возможность конст-руктора запросов состоит в том, что он также позволяетвводить SQL-код для немедленного выполнения. Благодаряэтому Access можно использовать для передачи операторовSQL любому источнику данных ODBC, хотя больше всегоэта программа подходит для выполнения SQL-кода в ужеоткрытой базе данных. Для того чтобы использовать на-званную возможность, сделайте следующее.

1. Запустите Microsoft Access. Вам предложат открыть(или создать) базу данных. Откройте базу данных,которую вы собираетесь использовать.

2. Выберите меню Запросы в окне с названием вашейбазы данных, а затем дважды щелкните на ссылкеСоздание запроса в режиме конструктора (либо щелк-ните на кнопке Создать и выберите в появившемсяокне пункт Конструктор).

Page 248: SQL Without Assistance

Работа с популярными приложениями 247

3. Появится диалоговое окно Добавление таблицы. За-кройте его, не выбрав ни одну из таблиц.

4. Выберите команду Режим SQL в меню Вид.5. Введите ваш оператор SQL в окне запроса.6. Чтобы выполнить оператор SQL, щелкните на кнопке

Запуск (она помечена восклицательным знаком). Ре-зультаты будут отображены в этом же окне, но в ре-жиме таблицы.

7. Переходите при необходимости от режима ввода за-просов (вам нужно будет повторно выполнить коман-ду Режим SQL для изменения вашего SQL-кода) к ре-жиму отображения их результатов. Вы можете такжеиспользовать режим Создание запроса с помощьюмастера для интерактивного построения операторовSQL.

Microsoft Access также поддерживает режим запроса ксерверу, который позволяет использовать Access для от-правки SQL-операторов любому источнику данных ODBC.Эту возможность следует использовать для взаимодействияс внешними базами данных, и никогда — для непосредст-венного взаимодействия с Access. Чтобы воспользоватьсяэтой возможностью, выполните следующее.

1. Microsoft Access для взаимодействия с базами данныхиспользует ODBC, так что в системе должен присут-ствовать источник данных ODBC. Только в этом слу-чае можно будет начать обработку запросов (см. пре-дыдущие инструкции).

2. Запустите Microsoft Access. Вам предложат открыть(или создать) базу данных. Откройте какую-нибудьбазу данных.

3. Выберите меню Запросы в окне с названием вашейбазы данных, а затем дважды щелкните на ссылкеСоздание запроса в режиме конструктора (либо щелк-ните на кнопке Создать и выберите в появившемсяокне пункт Конструктор).

4. Появится диалоговое окно Добавление таблицы. За-кройте его, не выбрав ни одну из таблиц.

5. В меню Запрос выберите подменю Запрос SQL, а за-тем — команду К серверу.

Page 249: SQL Without Assistance

248 Приложение Б

6. В меню Вид выберите команду Свойства, чтобы ото-бразить диалоговое окно Свойства запроса.

7. Щелкните в поле Строка подключения ODBC, а за-тем — на кнопке с многоточием (...), чтобы отобра-зить диалоговое окно Выбор источника данных, кото-рое вы будете использовать для выбора источникаданных ODBC.

8. Выберите ваш источник данных и щелкните на кноп-ке ОК, чтобы вернуться в диалоговое окно Свойствазапроса.

9. Щелкните в поле списка Возврат записей. Если вывыполняете оператор SELECT (или другой оператор,возвращающий результаты), выберите Да. Если жевы выполняете оператор SQL, который не возвращаетданные (например, INSERT, UPDATE или DELETE), вы-берите Нет.

10. Введите свой оператор SQL в окне запроса к серверу.11. Чтобы выполнить этот оператор SQL, щелкните на

кнопке Запуск (на ней изображен восклицательныйзнак красного цвета).

Использование режима запроса к серверу

Режим запроса к серверу лучше работает при под-ключении к СУБД, отличной от Access. Если устанав-ливается связь с MDB-файлом Access, лучше исполь-зовать какие-то другие клиентские средства, о кото-рых говорилось выше.

Использование Microsoft ASPMicrosoft ASP — это платформа подготовки сценариев,

ориентированная на создание Web-приложений.Для того чтобы протестировать ваши операторы SQL на

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

Page 250: SQL Without Assistance

Работа с популярными приложениями 249

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

2. Создайте новую страницу ASP (с расширением ASP),используя любой текстовый редактор.

3. Используйте метод Server.CreateObject для созда-ния экземпляра объекта ADODB. Connection.

4. Используйте метод Open для открытия нужного ис-точника данных ODBC.

5. Передайте ваш оператор SQL методу Execute в каче-стве аргумента. Метод возвратит результирующеемножество. Используйте команду Set для сохраненияполученных данных.

6. Чтобы отобразить эти результаты, воспользуйтесьциклом <% Do While NOT EOF %>.

7. Сохраните эту страницу в любом каталоге исполняе-мых файлов корневого каталога Web-сервера.

8. Откройте страницу, вызвав ее посредством Web-браузера.

Использование MicrosoftASP.NET

Microsoft ASP.NET — это платформа подготовки сцена-риев для создания Web-приложений с использованием тех-нологии .NET. Чтобы протестировать операторы SQL настранице ASP.NET, создайте страницу, которую можно ото-бразить, вызвав ее посредством браузера. Это можно сде-лать разными способами, ниже описан один из них.

1. Создайте новый файл с расширением . aspx.2. Создайте подключение к базе данных, используя

функцию SqlConnectionO или OleDbConnectionO .

3. Используйте функцию SqlCommand () илиOleDbCommand () для передачи оператора в СУБД.

Page 251: SQL Without Assistance

250 Приложение Б

4. Создайте объект DataReader, используя методExecuteReader.

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

6. Сохраните эту страницу в любом каталоге исполняе-мых файлов корневого каталога Web-сервера.

7. Откройте страницу, вызвав ее посредством Web-браузера.

Использование Microsoft QueryMicrosoft Query — это стандартный инструмент подго-

товки SQL-запросов, он является идеальной утилитой длятестирования операторов SQL с использованием источниковданных ODBC. Утилита Microsoft Query опционально уста-навливается вместе с другими программами Microsoft, aтакже с программами других фирм.

Получение MS-Query

MS-Query часто устанавливается на компьютер вме-сте с другими программами Microsoft (например,Office), хотя это происходит только при полной уста-новке пакета. Если она не присутствует в меню Пуск,воспользуйтесь командой Пуск^Найти^Файлы и пап-ки, чтобы найти эту утилиту в своей системе.(Утилита часто присутствует в системе, однако вы обэтом можете не знать.) Файл, который нужно искать,называется MSQRY32.EXE или MSQUERY.EXE.

Для использования Microsoft Query необходимо выпол-нить следующее.

1. Microsoft Query использует ODBC для взаимодействияс базами данных, поэтому прежде чем вы начнете ра-боту, на компьютере должен быть создан источникданных ODBC (дополнительную информацию можнонайти в конце данного приложения).

2. Прежде чем вы сможете использовать утилитуMicrosoft Query, она должна быть установлена на ва-

Page 252: SQL Without Assistance

Работа с популярными приложениями 251

шем компьютере. Просмотрите список программ ва-шего компьютера, открывающийся после щелчка накнопке Пуск, и найдите утилиту.

3. В меню Файл утилиты выберите команду Выполнитьзапрос SQL. Откроется окно Выполнение запроса SQL.

4. Щелкните на кнопке Источники, чтобы выбрать ис-точник данных ODBC. Если нужный вам источник от-сутствует в списке, щелкните на кнопке Обзор, чтобынайти его. После того как будет выбран нужный ис-точник данных, щелкните на кнопке ОК.

5. Введите ваш оператор SQL в поле Инструкция SQL.6. Щелкните на кнопке Выполнить, чтобы выполнить

оператор SQL и отобразить полученные данные.

Использование Microsoft SQLServer

Microsoft SQL Server предлагает основанный на Windowsинструментарий анализа запросов, называемый SQL QueryAnalyzer. Хотя это средство создания запросов в основномпредназначено для анализа процесса выполнения операто-ров SQL и их оптимизации, оно идеально подходит для тес-тирования SQL-операторов и экспериментирования с ними.

Ниже даны пошаговые инструкции по использованиюSQL Query Analyzer.

1. Запустите приложение SQL Query Analyzer (его мож-но найти в группе программ Microsoft SQL Server).

2. Вам будет представлена информация о сервере ипредложено зарегистрироваться. Зарегистрируйтесь впрограмме SQL Server (запустив сервер, если это ещене сделано).

3. После того как отобразится экран запросов, выберитебазу данных в раскрывающемся списке.

4. Введите свой SQL-код в большом текстовом окне изатем щелкните на кнопке Execute Query (с зеленойстрелкой), чтобы выполнить его. (Вы можете такженажать клавишу <F5> или выбрать команду Execute вменю Query.)

Page 253: SQL Without Assistance

252 Приложение Б

5. Результаты будут отображены на отдельной панелипод окном SQL.

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

Использование 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. Нижерассказано, как им нужно пользоваться.

Page 254: SQL Without Assistance

Работа с популярными приложениями 253

1. Запустите SQL*Plus Worksheet (или напрямую, илииз Oracle Enterprise Manager).

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

3. Экран SQL Worksheet разделен на две панели. Введи-те ваш SQL-код в верхней.

4. Чтобы выполнить оператор SQL, щелкните на кнопкеExecute (на ней изображена молния). Результаты бу-дут отображены в нижней панели.

Использование РНРРНР — это популярный язык написания Web-сценариев.

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

Использование PostgreSQLPostgreSQL поставляется с утилитой командной строки,

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

1. Введите psql, чтобы запустить утилиту. Чтобы загру-зить конкретную базу данных, укажите ее в команд-ной строке как psql база_данных (PostgreSQL неподдерживает команду USE).

2. Введите ваш SQL-код в ответ на приглашение =>,убедившись в том, что каждый оператор заканчивает-ся точкой с запятой (;). Результаты будут отображе-ны на экране.

Page 255: SQL Without Assistance

254 Приложение Б

3. Введите \?, чтобы отобразить список команд, кото-рые вы можете использовать.

4. Введите \h, чтобы получить справку по SQL, \h —чтобы получить справку относительно конкретногооператора SQL (например, \h SELECT).

5. Введите \q, чтобы выйти из утилиты psql.

Использование Query ToolQuery Tool — это стандартный инструмент запросов,

созданный Джорджем Пулосом (George Poulose). Этот инст-румент является идеальной утилитой для тестированияоператоров SQL при использовании источников данныхODBC. (Существует также версия для ADO2.)

Получение Query Tool

Утилита Query Tool может быть загружена черезInternet. Чтобы получить ее копию, перейдите на Web-страницу книги по ссылке: h t t p : / / w w w . f o r t a . c o m /books/0672321289/.

Чтобы воспользоваться утилитой Query Tool, выполнитеследующее:

1. Query Tool использует ODBC для взаимодействия сбазами данных, поэтому источник данных ODBCдолжен уже иметься на компьютере, прежде чем выначнете работу (см. инструкции, которые были данывыше).

2. Прежде чем вы начнете использовать Query Tool, этаутилита должна быть установлена на вашем компью-тере. Просмотрите список установленных на нем про-грамм и найдите ее.

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

2 ADO (сокр. от ActiveX Data Objects) — технология доступа кданным, включающая набор высокоуровневых интерфейсов, которыепозволяют разработчикам обращаться к данным на любом языке про-граммирования. — Прим. ред.

Page 256: SQL Without Assistance

Работа с популярными приложениями 255

ске не представлен, щелкните на кнопке New, чтобысоздать его. После того как будет правильно выбранисточник данных, щелкните на кнопке ОК.

4. Введите ваш оператор SQL в правом верхнем окне.5. Щелкните на кнопке Execute (на ней изображена го-

лубая стрелка), чтобы выполнить оператор SQL иотобразить возвращаемые данные в нижней панели.(Вы можете также нажать клавишу <F5> или выбратькоманду Execute в меню Query.)

Использование SybaseSybase Adaptive Server поставляется с Java-утилитой

SQL Advantage. Данная утилита очень похожа на QueryAnalyzer, поставляемую вместе с СУБД Microsoft SQLServer (эти продукты имеют общее прошлое). Для того что-бы воспользоваться SQL Advantage, выполните следующее:

1. Вызовите приложение SQL Advantage.2. Получив предложение зарегистрироваться, введите

свое регистрационное имя и пароль.3. После того как появится окно для ввода запроса, вы-

берите базу данных в раскрывающемся списке.4. Введите в появившемся окне ваш SQL-код.5. Чтобы выполнить запрос, щелкните на кнопке

Execute, выберите команду Execute Query в менюQuery или нажмите <Ctrl+E>.

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

Конфигурирование источниковданных ODBC

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

Page 257: SQL Without Assistance

256 Приложение Б

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

ODBC сам по себе не является базой данных. СкорееODBC представляет собой оболочку для баз данных, позво-ляющую всем базам данных вести себя непротиворечивым ичетко выраженным образом. Он добивается этого за счетиспользования программных драйверов, выполняющих двеосновные функции. Во-первых, они инкапсулируют некото-рые характерные для отдельных баз данных особенности искрывают их от клиента. Во-вторых, они обеспечивают об-щий язык для взаимодействия с этими базами данных (принеобходимости выполняя нужное преобразование). Язык,используемый ODBC, — это SQL.

Клиентские приложения ODBC не взаимодействуют с ба-зами данных непосредственно. Вместо этого они взаимодей-ствуют с источниками данных ODBC (ODBC Data Sources).Источник данных ODBC представляет собой логическую ба-зу данных, которая включает в свой состав драйвер (базаданных каждого типа имеет свой собственный драйвер) иинформацию о том, как нужно подключаться к этой базеданных (пути к файлам, имена серверов и т.д.).

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

Различия в реализации

Существует много версий системных модулей ODBC,поэтому невозможно дать четкие инструкции, приме-нимые ко всем версиям. Обращайте внимание наприглашения, когда будете устанавливать свои ис-точники данных.

Источники данных ODBC определяются с помощьюODBC-модуля панели управления Windows. Чтобы устано-вить какой-либо источник данных ODBC, выполните сле-дующее.

Page 258: SQL Without Assistance

Работа с популярными приложениями 257

1. Откройте ODBC-модуль панели управления Windows.2. Большинство источников данных ODBC должны быть

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

3. Щелкните на кнопке Добавить, чтобы добавить новыйисточник данных.

4. Выберите драйвер, который будет использоваться.Обычно по умолчанию доступен набор драйверов,обеспечивающих поддержку большинства продуктовкомпании Microsoft. В вашей системе могут быть ус-тановлены другие драйверы. Вы можете выбратьдрайвер, соответствующий типу базы данных, к кото-рой вы собираетесь подключаться.

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

Page 259: SQL Without Assistance
Page 260: SQL Without Assistance

Приложение В

Синтаксис операторовSQL

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

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

При рассмотрении синтаксиса операторов помните сле-дующее:

• Символ " | " служит для выбора одного из несколькихвариантов, поэтому NULL | NOT NULL означает указа-ние NULL ИЛИ NOT NULL.

• Ключевые слова или предложения, заключенные вквадратные скобки, [например, так], являются оп-циональными.

• Представленный ниже синтаксис подходит почти длялюбой СУБД. Рекомендуем обращаться к документа-ции вашей СУБД за подробностями относительновозможных изменений в синтаксисе.

ALTER TABLEОператор ALTER TABLE используется для обновления

схемы существующей таблицы. Чтобы создать новую таб-лицу, используйте оператор CREATE TABLE. За более де-тальной информацией обратитесь к уроку 17, "Созданиетаблиц и работа с ними".

ВВОДALTER TABLE имя таблицы

Page 261: SQL Without Assistance

260 Приложение В

ADD|DROP имя_столбца тип_данных [NULL|NOT

^NULL] [CONSTRAINTS] ,

ADD|DROP имя_столбца тип_данных [NULL|NOT

^NULL] [CONSTRAINTS] ,

COMMITОператор COMMIT используется для создания запросов к

базе данных в виде транзакций. За более детальной инфор-мацией обратитесь к уроку 20, "Обработка транзакций".

ВВОДCOMMIT [TRANSACTION];

CREATE INDEXОператор CREATE INDEX используется для создания ин-

декса одного или нескольких столбцов. За более детальнойинформацией обратитесь к уроку 22, "Расширенные воз-можности SQL".

ВВОДCREATE INDEX название_индекса

ON имя_таблицы (имя_столбца, . . . ) ;

CREATE PROCEDUREОператор CREATE PROCEDURE используется для создания

хранимых процедур. За более детальной информацией об-ратитесь к уроку 19, "Работа с хранимыми процедурами".В СУБД Oracle используется синтаксис, отличный от опи-санного в этом уроке.

ВВОДCREATE PROCEDURE имя_процедуры [параметры]t> [опции]

ASSQL statement;

Page 262: SQL Without Assistance

Синтаксис операторов 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 имя_представления ASSELECT имена_столбцов, ...FROM t a b l e s , . . .[WHERE . . . ][GROUP BY . . . ][HAVING . . . ] ;

DELETEОператор DELETE удаляет одну или несколько строк таб-

лицы. За более детальной информацией обратитесь к уро-ку 16, "Обновление и удаление данных".

ВВОДDELETE FROM имя_таблицы[WHERE . . . ] ;

Page 263: SQL Without Assistance

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 [ ТО точка_сохранения];

Page 264: SQL Without Assistance

Синтаксис операторов 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 . . . ] ;

Page 265: SQL Without Assistance
Page 266: SQL Without Assistance

Приложение Г

Использование типовданных SQL

Как уже говорилось в уроке 1, "Что такое SQL", типыданных представляют собой основные правила, определяю-щие, какие данные могут храниться в столбцах и в какомвиде эти данные в действительности хранятся.

Типы данных используются по нескольким причинам.• Типы данных позволяют ограничить разновидности

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

• Типы данных позволяют более эффективно организо-вывать хранение. Числовые значения и значения да-ты/времени могут храниться в более компактномформате, чем текстовые строки.

• Типы данных позволяют изменять порядок сортиров-ки. Если все данные трактуются как строки, то 1предшествует 10, а 10 предшествует 2.

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

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

Изменение типов данных уже имеющихся и заполнен-ных столбцов — задача нетривиальная. (Кроме того, при еевыполнении возможна потеря данных.)

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

Page 267: SQL Without Assistance

266 Приложение Г

Не существует двух одинаковых СУБД

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

Строковые данныеЧаще всего используются данные типа строки, или стро-

ковые данные. К ним относятся хранимые в СУБД строки,например, имена, адреса, номера телефонов и ZIP-коды.

Вам придется использовать строковые данные в основ-ном двух типов — строки фиксированной длины и строкипеременной длины (табл. Г.1).

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

Например, вы можете разрешить ввод 30 символов встолбец, предназначенный для хранения имен, или 11 сим-волов в столбец с номером карточки социального страхова-ния. В столбцы для строк фиксированной длины нельзявводить больше символов, чем разрешено. Столбцы такжевыделяют для хранения именно столько места, сколькоразрешено. Так, если имя Бен сохраняется в поле столбцаимен, рассчитанном на ввод 30 символов, будет сохраненоровно 30 символов (при необходимости текст дополняетсяпробелами или нулями).

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

Если тип данных переменной длины обладает такой гиб-костью, зачем вам использовать типы данных фиксирован-

Page 268: SQL Without Assistance

Использование типов данных SQL 267

ной длины? Ответ прост: для повышения производительно-сти. СУБД способна сортировать столбцы с данными фик-сированной длины и манипулировать ими намного быстрее,чем столбцами с данными переменной длины. Кроме того,многие СУБД не способны индексировать столбцы с данны-ми переменой длины (или переменную часть столбца). (Заподробностями относительно индексов вам следует обра-титься к уроку 22, "Расширенные возможности SQL".)

Таблица Г. 1. Строковые данные

Тип данных ОписаниеCHAR Строка фиксированной д л и н ы , состоящая из

1-255 символов. Ее размер д о л ж е н быть оп-ределен во время создания

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

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

TEXT ( т а к ж е на- Текст переменной д л и н ызывается LONG,и л и MEMO, и л иVARCHAR)

Использование кавычек

Независимо от формы используемых строковых дан-ных значение строки должно быть всегда заключено водинарные кавычки.

Когда числовые значения не являются таковыми

Вы можете подумать, что номера телефонов и ZIP-коды должны храниться в числовых полях (ведь онисодержат только числовые данные), но поступать такнецелесообразно. Если вы сохраните ZIP-код 01234 вчисловом поле, будет сохранено число 1234. Вы по-теряете одну цифру.

Page 269: SQL Without Assistance

268 Приложение Г

Основное правило таково: если число предназначенодля вычислений (сумм, средних значений и т.д.), егоследует хранить в столбце, предназначенном для число-вых данных. Если оно используется в качестве строково-го литерала (пусть он и сострит только из цифр), его ме-сто — в столбце с данными строкового типа.

Числовой тип данныхЧисловые типы данных предназначены для хранения

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

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

В табл. Г.2 представлены наиболее часто используемыеразличные типы данных. Не все СУБД следуют соглашениямо наименовании и описаниям, перечисленным в таблице.

Таблица Г.2. Числовые типы данных

Типы данных Описание

BIT

DECIMAL (также на-зывается NUMERIC)

FLOAT (также назы-вается NUMBER)

INT (также называ-ется INTEGER)

REAL

SMALLINT

TINYINT

Одноразрядное значение, 0 или 1, исполь-зуется в основном для битовых флагов

Значения с фиксированной или плаваю-щей запятой различной степени точности

Значения с плавающей запятой

4-разрядные целые значения, поддержи-ваются числа от -2147483648 до2147483647

4-разрядные значения с плавающей за-пятой

2-разрядные целые значения, поддержи-ваются числа от -32768 до 32767

1-байтовые целые значения, поддержи-ваются числа от 0 до 255

Page 270: SQL Without Assistance

Использование типов данных SQL 269

Кавычки не используются

В отличие от строковых типов данных, числовые нико-гда не заключаются в кавычки.

Денежные типы данных

В большинстве СУБД поддерживается особый число-вой тип данных для хранения денежных значений.Обычно он называется MONEY ИЛИ CURRENCY. ЭТИ ТИПЫ

данных обычно относятся к типу DECIMAL, НО СО спе-цифическими диапазонами, делающими их удобнымидля хранения денежных значений.

Типы данных даты и времениВсе СУБД поддерживают типы данных, разработанные

для хранения значений даты и времени (табл. Г.З). Анало-гично числовым значениям, большинство СУБД поддержи-вают многие типы данных даты и времени, каждый со сво-им диапазоном и степенью точности.

Таблица Г.З. Типы данных даты и времени

Тип данных Описание

DATE Значения даты

DATETIME (также на- Значения даты и временизывается TIMESTAMP)

SMALLDATETIME Значения даты и времени с точностьюдо минуты (без значений секунд илимиллисекунд)

TIME Значение времени

Page 271: SQL Without Assistance

270 Приложение Г

Указание дат

Не существует стандартного способа указания даты,который подходил бы к любой СУБД. В большинствереализаций приемлем формат типа 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, убедитесь втом, что значения даты и времени отформатированыподобным образом.

Двоичные типы данныхДвоичные типы данных относятся к числу наименее со-

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

Page 272: SQL Without Assistance

Использование типов данных SQL 271

Таблица Г.4. Двоичные типы данных

Тип данных ОписаниеBINARY

LONG RAW

RAW (в некоторыхреализациях назы-ваются BINARY)

VARBINARY

Двоичные данные фиксированной длины(максимальная длина может быть от255 байт до 8000 байт, в зависимости отреализации)

Двоичные данные переменной длины объ-емом до 2 Гбайт

Двоичные данные фиксированной длиныобъемом до 255 байт

Двоичные данные переменной длины(обычно максимальный объем варьируетсяот 255 байт до 8000 байт, в зависимости отреализации)

Сравнение типов данных

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

Page 273: SQL Without Assistance
Page 274: SQL Without Assistance

Приложение Д

Зарезервированныеслова SQL

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

В данном приложении содержится перечень зарезерви-рованных слов, наиболее часто встречающихся в основныхСУБД. Обратите внимание на следующие моменты.

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

• Во многих СУБД используется расширенный пере-чень зарезервированных слов SQL; в него включаютсятермины, специфичные для данной реализации. Мно-гие из специфичных для отдельных СУБД ключевыхслов не представлены ниже.

• Чтобы обеспечить совместимость и переносимость,следует избегать любого из зарезервированных слов,если даже некоторые из них не относятся к числу за-резервированных в вашей СУБД.

ABORT

ACTIVE

ALL

ANALYZE

ARE

ASCENDING

AUTHORIZATION

AUTOINC

ABSOLUTE

ADD

ALLOCATE

AND

AS

ASSERTION

AUTO

AVG

ACTION

AFTER

ALTER

ANY

AS С

AT

AUTO-INCREMENT

BACKUP

Page 275: SQL Without Assistance

274 Приложение Д

BEFORE

BIGINT

BLOB

BREAK

BY

CALL

CASE

CHANGE

CHARACTER_LENGTH

CLOSE

COALESCE

COLUMNS

COMMITTED

CONDITIONAL

CONNECTION

CONTAINING

CONTINUE

COPY

CROSS

CURRENT

CURRENTJTIMESTAMP

DATABASE

DATETIME

DEALLOCATE

DECIMAL

DELETE

DESCENDING

DISK

DIV

DOUBLE

DUMP

ENCLOSED

ERROREXIT

EXCEPT

BEGIN

BINARY

BOOLEAN

BROWSE

BYTES

CASCADE

CAST

CHAR

CHECK

CLUSTER

COLLATE

COMMENT

COMPUTE

CONFIRM

CONSTRAINT

CONTAINS

CONTROLROW

COUNT

CSTRING

CURRENT_DATE

CURRENTJJSER

DATABASES

DAY

DEBUG

DECLARE

DENY

DESCRIBE

DISTINCT

DO

DROP

ELSE

END

ESCAPE

EXCEPTION

BETWEEN

BIT

BOTH

BULK

CACHE

CASCADED

CATALOG

CHARACTER

CHECKPOINT

CLUSTERED

COLUMN

COMMIT

COMPUTED

CONNECT

CONSTRAINTS

CONTAINSTABLE

CONVERT

CREATE

CUBE

CURRENT_TIME

CURSOR

DATE

DBCC

DEC

DEFAULT

DESC

DISCONNECT

DISTRIBUTED

DOMAIN

DUMMY

ELSEIF

ERRLVL

ESCAPED

EXEC

Page 276: SQL Without Assistance

Зарезервированные слова SQL 275

EXECUTE

EXPLAIN

EXTRACT

FIELD

FILLFACTOR

FLOPPY

FOREIGN

FREETEXTTABLE

FUNCTION

GLOBAL

GRANT

HOLDLOCK

IF

INDEX

INNER

INSENSITIVE

INTEGER

INTO

JOIN

LANGUAGE

LEFT

LIKE

LINES

LOCAL

LONG

MATCH

MESSAGE

MIRROREXIT

MONTH

NATIONAL

NEXT

NOCHECK

NOT

NUMERIC

EXISTS

EXTEND

FALSE

FIELDS

FILTER

FOR

FOUND

FROM

GENERATOR

GO

GROUP

HOUR

IN

INDICATOR

INOUT

INSERT

INTERSECT

IS

KEY

LAST

LENGTH

LIMIT

LISTEN

LOCK

LOWER

MAX

MIN

MODULE

MOVE

NATURAL

NEW

NONCLUSTERED

NULL

OF

EXIT

EXTERNAL

FETCH

FILE

FLOAT

FORCE

FREETEXT

FULL

GET

GOTO

HAVING

IDENTITY

INACTIVE

INFILE

INPUT

INT

INTERVAL

ISOLATION

KILL

LEADING

LEVEL

LINENO

LOAD

LOGFILE

MANUAL

MERGE

MINUTE

MONEY

NAMES

NCHAR

NO

NONE

NULLIF

OFF

Page 277: SQL Without Assistance

276 Приложение Д

OFFSET

ONCE

OPTION

OUTER

OVERFLOW

PAGE

PARTIAL

PERM

PLAN

PREPARE

PRIOR

PROCEDURE

PUBLIC

READ

REFERENCES

RENAME

REPLICATION

RESERVING

RESTRICT

RETURNS

ROLLBACK

RULE

SCHEMA

SEGMENT

SEPARATOR

SET

SHARED

SINGULAR

SNAPSHOT

SPACE

SQLERROR

STARTS

SUM

TABLES

OFFSETS

ONLY

OR

OUTPUT

OVERLAPS

PAGES

PASSWORD

PERMANENT

POSITION

PRIMARY

PRIVILEGES

PROCESSEXIT

PURGE

READTEXT

REGEXP

REPEAT

REQUIRE

RESET

RETAIN

REVOKE

ROLLUP

SAVE

SECOND

SELECT

SEQUENCE

SETUSER

SHOW

SIZE

SOME

SQL

STABILITY

STATISTICS

SUSPEND

TAPE

ON

OPEN

ORDER

OVER

PAD

PARAMETER

PERCENT

PIPE

PRECISION

PRINT

PROC

PROTECTED

RAISERROR

REAL

RELATIVE

REPLACE

RESERV

RESTORE

RETURN

RIGHT

ROWCOUNT

SAVEPOINT

SECTION

SENSITIVE

SESSIONJJSER

SHADOW

SHUTDOWN

SMALLINT

SORT

SQLCODE

STARTING

SUBSTRING

TABLE

TEMP

Page 278: SQL Without Assistance

Зарезервированные слова SQL 277

TEMPORARY

THEN

TO

TRAN

TRIGGER

TRUNCATE

UNIQUE

UPDATETEXT

USE

VALUE

VARIABLE

VIEW

WAITFOR

WHILE

WRITE

YEAR

TEXT

TIME

TOP

TRANSACTION

TRIM

UNCOMMITTED

UNTIL

UPPER

USER

VALUES

VARYING

VOLUME

WHEN

WITH

WRITETEXT

ZONE

TEXTSIZE

TIMESTAMP

TRAILING

TRANSLATE

TRUE

UNION

UPDATE

USAGE

USING

VARCHAR

VERBOSE

WAIT

WHERE

WORK

XOR

Page 279: SQL Without Assistance

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

ANSI SQL, 26Aqua Data Studio, 243, 244

QQuery Designer, 246Query Tool, 243, 254

ColdFusion, 245Command Center, 245

DData Source ODBC, 255DB2, 245

EEnterprise Manager, 252

MMacromedia, 245Microsoft ASP, 248Microsoft ASP.NET, 249Microsoft Query, 243, 250Microsoft SQL Server, 251MySQL, 252

ОODBC, 256Oracle, 252

PHP, 253PostgreSQL, 44, 253psql, 253

SQL, 25ANSI, 26расширения, 26стандартный, 26

SQL Advantage, 255Structured Query Language, 25Sybase Adaptive Server, 255

АргументALL, 96DISTINCT, 97

ББаза данных

безопасность, 231основные понятия, 20реляционная, 122типа ISAM, 212

ВВнешнее объединение, 138Внешний ключ, 222Внутреннее объединение, 128Выборкавсех столбцов, 33нескольких столбцов, 32отдельных столбцов, 30

Вычисляемое поле, 69, 70

Page 280: SQL Without Assistance

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

Группа, 102фильтрующая, 104

Групповой символ, 34

ДДанные

двоичные, 270добавление, 153итоговые, 101неотсортированные, 31распределение по столбцам,

22сортировка, 35строковые, 266тип, 23форма представления, 33числовые, 268

Декартово произведение, 126Добавление

выбранных данных, 158данных, 153нескольких строк, 160полных строк, 153части строки, 157

ЕЕстественное объединение, 137

3

Запись, 24Запрос, 113

вложенный, 113комбинированный, 145подчиненный, 113сложный, 145

Зарезервированное слово, 273

И

Индексно-последовательныйметод доступа, 212

Источник данных ODBC, 256Итоговые данные, 101

ККавычки, 47Каскадное удаление, 224Ключ

внешний, 222первичный, 24, 122, 220

Ключевое слово, 29, 273AND, 52, 87AS, 74, 134ASC, 41BETWEEN, 48DEFAULT, 174DESC, 41FROM, 166IN, 56, 57INTO, 154NOT, 57, 58ON, 229OR, 53OUT, 199PRIMARY KEY, 221REFERENCES, 223UNIQUE, 225

Код переносимый, 80Комбинированный запрос, 145Копирование данных, 160Критерий поиска, 43Курсор, 211

закрытие, 217открытие, 215создание, 214

ЛЛевое внешнее объединение,

140

Индекс, 227создание, 229

Page 281: SQL Without Assistance

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

мМасштабирование, 123Метасимвол, 62

знак процента, 62квадратные скобки, 66символ подчеркивания, 65

Модуль ODBC, 256

нНеявная фиксация, 207

ООбновление данных, 163Объединение, 121внешнее, 138внешнее левое, 140внешнее полное, 141внешнее правое, 140внутреннее, 128естественное, 137многих таблиц, 129перекрестное, 128по эквивалентности, 128

Ограничение, 219на значения столбца, 225уникальности, 224

ОператорALTER TABLE, 176, 259CLOSE, 217COMMIT, 207, 260CREATE INDEX, 229, 260CREATE PROCEDURE, 260CREATE TABLE, 169, 259,

261CREATE VIEW, 185, 261DECLARE, 214DELETE, 165, 261DROP, 185, 262DROP TABLE, 178EXCEPT, 152EXECUTE, 197FETCH, 215

GRANT, 232INSERT, 153, 262INSERT SELECT, 158, 262INTERSECT, 152LIKE, 61MINUS, 152OPEN CURSOR, 215RENAME, 179REVOKE, 232ROLLBACK, 207, 262SAVEPOINT, 209SELECT, 29, 263SELECT INTO, 160SQL, синтаксис, 259TRUNCATE TABLE, 167UNION, 146UNION ALL, 150UPDATE, 163, 263в предложении WHERE, 51завершение, 31левого внешнего

объединения, 140независимость от регистра,

32правого внешнего

объединения,140условный, 45

Операция!=, 47о, 47

Откат, 205Отмена, 205

пПервичный ключ, 24, 122, 220

создание, 221Переименование таблиц, 179Перекрестное объединение,

128Подзапрос, 113Поле, 70

вычисляемое, 69, 70таблицы, 22

Page 282: SQL Without Assistance

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

Полное внешнее объединение,141

Полностью определенноеимя, 126

Пользовательский типданных, 226

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

Правое внешнее объединение,140

Предикат, 62, 98Предложение, 36

ALL, 103FROM, 43GROUP BY, 102HAVING, 105ORDER BY, 36SET, 164VALUES, 156WHERE, 43фильтрации, 43

Представление, 181методика создания, 185удаление, 185

Проверкана диапазон значений, 48на несовпадения, 46на отсутствие значения, 48на равенство, 44одного значения, 46

Псевдоним, 74, 133столбца, 133таблицы, 134

Реляционная таблица, 121

Самообъединение, 135Символ

групповой, 34звездочка, 34

Скобки, 55

Словозарезервированное, 273ключевое, 273

Сложный запрос, 145Создание

индекса, 229курсора, 214таблицы, 169хранимой процедуры, 198

Сортировкав указанном направлении,

39данных, 35по невыбранным столбцам,

37по нескольким столбцам, 37по положению столбца, 38результатов

комбинированныхзапросов, 151

Статистическая функция, 142Статистические вычисления,

96Столбец, 22, 70

полностью определенноеимя, 126

производный, 76Строка, 23

переменной длины, 266фиксированной длины, 266

СУБД, 20Схема, 22

тТаблица, 21

переименование, 179реляционная, 121создание, 169создание копии, 162схема, 21удаление, 178уникальное имя, 21

Тип данных, 23, 265даты и времени, 269

Page 283: SQL Without Assistance

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

двоичный, 270денежный, 269переменной длины, 266пользовательский, 226совместимость, 23фиксированной длины, 267числовой, 268

Точкаотката, 205сохранения, 205, 209

Транзакция, 203управляемая, 206

Триггер, 229

УУдаление

данных, 165таблиц, 178

ФФиксация, 205

неявная, 207частичная, 208

Фильтрацияв SQL, 44в приложении, 44посредством подзапросов,

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

расширенная, 51Функция, 79

AVGQ, 90

COUNT(), 92DATAPART(), 87LTRIM(), 74МАХ(), 93MIN(), 94RTRIM(), 73SOUNDEX, 82SUM(), 95TRIM0, 74UPPER0, 82итоговая, 90манипулирования датой и

временем, 84манипулирования текстом,

82манипулирования числами,

87статистическая, 90

X

Хранимая процедура, 179,193

шШаблон поиска, 62

ЯЯзык структурированных

запросов, 25

Page 284: SQL Without Assistance

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

Бен Форта

Освой самостоятельно SQL,10 минут на урок

Литературный редактор П.Н. МачугаВерстка АЛ. Полинчик

Художественный редактор В.Г. ПавлютинКорректор Л. В. Пустовойтова

Издательский дом "Вильяме".101509, Москва, ул. Лесная, д. 43, стр. 1.

Подписано в печать 29.04.2005. Формат 84ХЮ8/32.Гарнитура Times. Печать офсетная.Усл. печ. л. 15,1. Уч.-изд. л. 9,9.Тираж 3000 экз. Заказ № 1645.

Отпечатано с диапозитивов в ФГУП "Печатный двор"Министерства РФ по делам печати,

телерадиовещания и средств массовых коммуникаций.197110, Санкт-Петербург, Чкаловский пр., 15.

Page 285: SQL Without Assistance

M y S Q L

Учебное пособиеЛюк Веллинг и Лора Томсон

Книга представляет собой крат-кое, но ясное изложение какосновных теоретических прин-

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

ISBN: 5-8459-0769-1В продаже

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

Page 286: SQL Without Assistance

M Y S Q L .

РУКОВОДСТВОАДМИНИСТРАТОРА

Компания MySQL AB

MySQL-

ОфМЦМ-ЯДЬИС!? РУКОВОДСТВО ПО ¥С!3*Ю&К&,

www.williamspublishing.com

MySQL занимает лидирующиепозиции среди множествасистем управления базамиданных с открытым исходнымкодом. Благодаря высокойпроизводительности и простотенастройки, богатому выборуAPI-интерфейсов, а такжефункциональным средствамработы с сетями, сервер MySQLстал одним из наиболее удачныхвариантов для разработки Web-приложений, взаимодействующихс базами данных.В этой книге предложенвсеобъемлющий подход кустановке, обслуживанию иадминистрированию серверабаз данных MySQL. Являясь,фактически, официальнойдокументацией, книгапокрывает весь спектр вопросов,касающихся администрирования,а также предлагает информацию,ориентированную наопытных пользователейи администраторов.Книга рассчитана наадминистраторов иразработчиков Web-приложенийлюбой квалификации, а такжена студентов и преподавателейсоответствующих дисциплин.

ISBN 5 - 8 4 5 9 - 0 8 0 5 - 1 в продаже

Page 287: SQL Without Assistance

M Y S Q L

СПРАВОЧНИК ПО ЯЗЫКУ

Компания MySQL AB

т шшшц

"шШтш

MySQLСправочник по языку

www.williamspublishing.com

Эта книга, написаннаяспециалистами компанииMySQL AB, является всеобъемлющимсправочником по языку SQL, которыйиспользуется для организациизапросов к базам данных, а такжеособенностях реализации стандартаSQL в сервере MySQL. По сути — этоофициальная документация фирмы-производителя. В книге рассмотренвесь спектр вопросов, касающихсяязыковой структуры, допустимыхтипов столбцов, операторов,операций и функций, а такжесуществующих расширений MySQL;также представлена информация,предназначенная для опытныхпрограммистов и администраторов.Как известно, MySQL занимаетлидирующие позиции средимножества систем управлениябазами данных с открытымисходным кодом. Благодарявысокой производительности ипростоте настройки, богатомувыбору API-интерфейсов, а такжефункциональным средствам работыс сетями, сервер MySQL стал однимиз наиболее удачных вариантовдля разработки Web-приложений,взаимодействующих с базами данных.Книга рассчитана на разработчиковWeb-приложений и администраторовлюбой квалификации, а такжена студентов и преподавателейсоответствующих дисциплин.

I S B N 5 - 8 4 5 9 - 0 8 0 4 - 3 в продаже