1

Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

  • Upload
    max

  • View
    38

  • Download
    7

Embed Size (px)

DESCRIPTION

fdg

Citation preview

Page 1: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание
Page 2: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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

уро

Page 3: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

SAMS

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

Бен Форта

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

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

Page 5: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

ББК 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. 10 Минут На Урок, 3-е Издание

Оглавление

Введение 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. 10 Минут На Урок, 3-е Издание

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

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

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

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

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

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

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

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

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

Резюме

Page 8: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Содержание 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Содержание 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Содержание 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. 10 Минут На Урок, 3-е Издание

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

нии 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. 10 Минут На Урок, 3-е Издание

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

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

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

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

Page 15: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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

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

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

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

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

Page 16: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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

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

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

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

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

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

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

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

Page 17: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

16 Введение

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

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

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

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

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

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

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

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

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

Page 18: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Введение 17

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

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

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

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

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

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

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

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

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

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

Page 19: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание
Page 20: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 1

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

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

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

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

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

Page 21: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

20 Урок 1

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

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

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

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

База данных

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

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

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

Page 22: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Что такое SQL 21

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

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

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

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

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

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

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

Имена таблиц

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

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

Page 23: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

22 Урок 1

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

Схема

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

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

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

Столбец

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

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

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

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

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

Page 24: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Что такое SQL 23

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

Тип данных

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

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

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

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

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

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

Page 25: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

24 Урок 1

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

Строка

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

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

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

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

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

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

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

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

Page 26: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Что такое SQL 25

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

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

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

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

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

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

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

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

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

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

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

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

Page 27: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Что такое SQL 27

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

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

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

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

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

Page 29: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание
Page 30: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 2

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

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

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

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

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

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

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

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

Page 31: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

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

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

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

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

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

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

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

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

Page 33: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

вывод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. 10 Минут На Урок, 3-е Издание

34 Урок 2

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

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

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

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

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

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

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

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

Page 36: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

УрокЗ

Сортировка выбранныхданныхНа этом уроке вы узнаете, как использовать предложение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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Сортировка выбранных данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

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

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

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

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

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

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

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

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

Page 43: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

42 УрокЗ

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

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

Page 44: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Фильтрация данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Фильтрация данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Фильтрация данных 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. 10 Минут На Урок, 3-е Издание

50 Урок 4

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

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

Page 52: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 5

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

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

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

Оператор

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

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

Page 53: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Расширенная фильтрация данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Расширенная фильтрация данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Расширенная фильтрация данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Расширенная фильтрация данных 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. 10 Минут На Урок, 3-е Издание
Page 62: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 6

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

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

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

Page 63: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

62 Урок 6

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

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

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

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

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

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

Предикат

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

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

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

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

Page 64: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Использование метасимволов для фильтрации 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование метасимволов для фильтрации 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование метасимволов для фильтрации 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. 10 Минут На Урок, 3-е Издание

68 Урок 6

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

Внимание!

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

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

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

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

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

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

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

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

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

Page 70: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 7

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

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

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

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

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

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

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

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

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

Page 71: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

70 Урок7

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

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

Поле

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

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

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

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

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

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

Page 72: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Создание вычисляемых полей 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание вычисляемых полей 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание вычисляемых полей 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание вычисляемых полей 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. 10 Минут На Урок, 3-е Издание

78 Урок7

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

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

Page 80: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 8

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

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

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

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

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

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

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

Page 81: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

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

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

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

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

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

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

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

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

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

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

Page 83: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование функций манипулирования данными 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование функций манипулирования данными 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

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

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

Даты в Oracle

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

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

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

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

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

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

Page 89: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

88 Урок 8

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

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

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

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

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

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

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

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

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

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

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

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

Page 90: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 9

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

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

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

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

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

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

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

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

Page 91: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Суммирование данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Суммирование данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Суммирование данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Суммирование данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Суммирование данных 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. 10 Минут На Урок, 3-е Издание
Page 102: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Итоговые данные 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Итоговые данные 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Итоговые данные 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Итоговые данные 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Итоговые данные 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. 10 Минут На Урок, 3-е Издание
Page 114: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 11

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

Что такое подзапросыОператоры SELECT представляют собой запросы SQL. Все

операторы SELECT, с которыми мы имели дело до сих пор,представляли собой простые запросы: посредством отдель-ных операторов извлекались данные из отдельных таблицбазы данных.

Запрос

Какой-либо оператор SQL. Однако этот термин обыч-но используется по отношению к операторам SELECT.

Язык SQL позволяет также создавать подзапросы: запро-сы, которые вложены в другие запросы. Их также называютвложенные запросы, или подчиненные запросы. Почему воз-никает необходимость в подзапросах? Лучший способ объяс-нить эту концепцию — рассмотреть несколько примеров.

Поддержка в MySQL

Если вы используете MySQL, знайте, что подзапросыподдерживаются этой СУБД начиная с версии 4.1.Более ранние версии MySQL запросы не поддержи-вают.

Page 115: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование подзапросов 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование подзапросов 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование подзапросов 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Урок 12

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

Что такое объединенияОдной из самых мощных особенностей реализаций языка

SQL является возможность "на лету" объединять таблицыпри выполнении запросов на выборку данных. Объедине-ния — это самые мощные операции, которые можно выпол-нить с использованием оператора SELECT языка SQL, поэто-му тщательное изучение объединений и их синтаксиса явля-ется чрезвычайно важной частью процесса освоения SQL.

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

Что такое реляционные таблицыПонять, что представляют собой реляционные таблицы,

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

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

Page 123: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

122 Урок 12

мацию о поставщике (такую как имя, адрес и контактнаяинформация)? Не рекомендуется хранить эти данные вместес данными о его продуктах по нескольким причинам.

• Потому что информация о поставщике одна и та жедля всех его продуктов; повторение этой информациидля каждого продукта приведет к напрасной потеревремени и места на диске.

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

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

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

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

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

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

Page 124: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Объединение таблиц 123

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

Что это дает? Давайте рассмотрим следующие моменты.• Информация о поставщике никогда не повторяется,

благодаря чему экономится время и место на диске.• Если информация о поставщике изменяется, бывает

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

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

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

Масштабирование

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

Для чего используют объединенияРаспределение данных по многим таблицам обеспечивает

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

Если данные хранятся во многих таблицах, как их мож-но извлечь с помощью одного оператора SELECT? Ответ та-ков: посредством объединения данных. Проще говоря, объ-единение представляет собой механизм, используемый дляобъединения таблиц внутри оператора (отсюда термин"объединение"). Используя особый синтаксис, можно объе-динить несколько таблиц таким образом, что будет возвра-щаться один результат, и это объединение будет "на лету"связывать нужные строки из каждой таблицы.

Page 125: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

124 Урок 12

Использование интерактивных инструментовСУБД

Важно понимать, что объединение не является "фи-зическим объектом" — другими словами, оно не су-ществует как реальная таблица в базе данных. Объе-динение создается СУБД в случае необходимости исохраняется только на время выполнения запроса.Многие СУБД предлагают графический интерфейс,который может быть использован для интерактивногоопределения отношений таблицы. Эти инструментымогут оказаться чрезвычайно полезными для под-держания целостности ссылочных данных. При ис-пользовании реляционных таблиц важно, чтобы толь-ко достоверные данные содержались в реляционныхстолбцах. Вернемся к нашему примеру: если в табли-це Products хранится недостоверный идентифика-тор поставщика, его продукты окажутся недоступны-ми, поскольку они не будут относиться ни к одномупоставщику. Во избежание этого база данных должнаразрешать пользователю вводить только достовер-ные значения (т.е. такие, которые представлены втаблице Vendors) в столбце идентификаторов по-ставщика таблицы Products. Целостность на уровнессылок (целостность ссылочных данных) означает,что СУБД обязывает пользователя соблюдать прави-ла, обеспечивающие целостность данных. И соблю-дение этих правил часто обеспечивается при посред-стве интерфейсов СУБД.

Создание объединенияСоздание объединения — очень простая процедура.

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

Page 126: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Объединение таблиц 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. 10 Минут На Урок, 3-е Издание

126 Урок 12

Полностью определенные имена столбцов

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

Важность предложения WHEREМожет показаться странным использование предложе-

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

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

Декартово произведение

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

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

Page 128: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Объединение таблиц 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Объединение таблиц 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Объединение таблиц 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. 10 Минут На Урок, 3-е Издание

132 Урок 12

РезюмеОбъединения — одна из самых важных и востребован-

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

Page 134: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 13

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

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

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

ВВОДSELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country)

%+ ' ) ' AS vend_titleFROM VendorsORDER BY vend_name;

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

• более короткий синтаксис SQL;• это позволяет много раз использовать одну и ту же

таблицу в операторе SELECT.Обратите внимание на следующий оператор SELECT.

В основном он такой же, как в примерах предыдущего уро-

Page 135: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание расширенных объединений 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание расширенных объединений 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. 10 Минут На Урок, 3-е Издание

138 Урок 13

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

Внешние объединенияБольшинство объединений связывают строки одной таб-

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

• подсчета количества заказов каждого клиента, вклю-чая клиентов, которые еще не сделали заказ;

• составления перечня продуктов с указанием количе-ства заказов на них, включая продукты, которые ни-кто из клиентов не захотел заказывать;

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

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

Разница в синтаксисе

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

Следующий оператор SELECT позволяет выполнить про-стое внутреннее объединение. С его помощью выбираетсясписок всех клиентов и их заказы:

ВВОДSELECT Customers.cust_id, Orders.order_numFROM Customers INNER JOIN OrdersON Customers.cust id = Orders.cust id;

Page 140: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Создание расширенных объединений 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание расширенных объединений 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание расширенных объединений 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. 10 Минут На Урок, 3-е Издание

144 Урок 13

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

РезюмеЭтот урок был продолжением предыдущего урока, по-

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

Page 146: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 14

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

Что такое комбинированныезапросы

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

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

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

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

Page 147: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

146 Урок 14

Комбинированные запросы и многократные ус-ловия WHERE

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

Создание комбинированныхзапросов

Запросы в языке SQL комбинируются с помощью опера-тора UNION. Оператор UNION позволяет многократно указы-вать оператор SELECT, и по завершении их работы можетбыть выведен один набор результатов.

Использование оператора UNIONИспользовать оператор UNION довольно просто. Все, что

вы должны сделать, — это указать каждый необходимыйвам оператор SELECT и разместить ключевое слово UNIONмежду ними.

Рассмотрим пример. Допустим, вам необходим отчет, со-держащий сведения обо всех клиентах из штатов Иллинойс,Индиана и Мичиган. Вы также хотите включить в него дан-ные о клиенте Fun4All независимо от штата. Конечно, мож-но создать условие WHERE, благодаря которому будет выпол-нено требуемое, но в данном случае гораздо удобнее исполь-зовать оператор UNION.

Как уже говорилось, применение оператора UNION под-разумевает многократное использование операторов SELECT.Вначале рассмотрим отдельные операторы:

Page 148: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Комбинированные запросы 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Комбинированные запросы 149

Проблемы, связанные с производительностью

В большинстве хороших СУБД используется внутрен-ний оптимизатор запросов, комбинирующий опера-торы SELECT, прежде чем СУБД начинает их обработ--ку. Теоретически это означает, что, с точки зренияпроизводительности, нет реальной разницы междуиспользованием многих предложений WHERE и опера-тора UNION. Мы говорим "теоретически", потому чтона практике многие оптимизаторы запросов не все-гда выполняют свою работу так хорошо, как следова-ло бы. Лучшим вариантом было бы протестироватьоба метода и посмотреть, какой из них вам лучшеподходит.

Правила применения запросов UNIONКак видите, запросы UNION очень просты в использова-

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

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

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

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

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

Page 151: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Комбинированные запросы 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Урок 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Добавление данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Добавление данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Добавление данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Добавление данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Урок 16

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

Обновление данныхДля обновления (модификации) данных какой-либо таб-

лицы используется оператор UPDATE. Этот оператор можноиспользовать двумя способами:

• для обновления определенной строки таблицы;• для обновления всех строк таблицы.Рассмотрим каждый из названных способов.

Не пропускайте п р е д л о ж е н и е WHERE

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

О п е р а т о р U P D A T E И безопасность

Для использования оператора U P D A T E в СУБД со

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

Page 165: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Обновление и удаление данных 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Обновление и удаление данных 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. 10 Минут На Урок, 3-е Издание

168 Урок 16

Убедитесь в том, что каждая таблица имеет первич-ный ключ (вернитесь к уроку 12, "Объединение таб-лиц", если забыли, что это такое), и используйте егов предложении WHERE всякий раз, когда это оказыва-ется возможным. (Вы можете указать отдельные пер-вичные ключи, несколько значений или диапазонызначений.)

Прежде чем использовать предложение WHERE с опе-ратором UPDATE или DELETE, сначала проверьте его соператором SELECT, чтобы убедиться в том, что оноправильно фильтрует записи, — можно ошибиться исформулировать неправильное предложение WHERE.

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

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

Используйте операторы удаления с осторожностью

Основной момент состоит в том, что SQL не имееткнопки возврата в предыдущее состояние. Будьтеочень внимательны, используя операторы UPDATE иDELETE, иначе вы вдруг обнаружите, что удалили илиобновили не те данные.

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

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

Page 170: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 17

Создание таблици работа с нимиВ этом уроке вы познакомитесь с основными правиламисоздания, перестройки и удаления таблиц.

Создание таблицЯзык SQL используется не только для манипуляций с

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

Существует два способа создания таблиц.• Большинство СУБД сопровождается инструментарием

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

• Таблицами можно также манипулировать посредст-вом операторов языка SQL.

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

Page 171: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание таблиц и работа с ними 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

С о з д а н и е таблиц и работа с н и м и 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание таблиц и работа с ними 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. 10 Минут На Урок, 3-е Издание

176 Урок 17

Обновление таблицДля того чтобы обновить определения таблицы, следует

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

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

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

• Многие СУБД не позволяют удалять или изменятьстолбцы в таблице.

• Большинство СУБД разрешают переименовыватьстолбцы.

• Многие СУБД налагают серьезные ограничения наизменения, которые могут быть сделаны по отноше-нию к заполненным столбцам, и несколько мень-шие — по отношению к незаполненным.

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

Чтобы изменить таблицу посредством оператора ALTERTABLE, нужно ввести следующую информацию.

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

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

Page 178: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Создание таблиц и работа с ними 177

ВВОДALTER TABLE VendorsADD vend_j>hone CHAR(20);

АнализПосредством этого оператора в таблицу Vendors добав-

ляется столбец, названный vend_phone. Должен быть оп-ределен тип данных.

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

ВВОДALTER TABLE VendorsDROP COLUMN vend_phone;

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

• Создание новой таблицы с новым расположениемстолбцов.

• Использование оператора INSERT SELECT (см.урок 15, "Добавление данных," в котором подробнорассмотрены вопросы применения этого оператора)для копирования данных из старой таблицы в новую.При необходимости используются функции преобра-зования и вычисляемые поля.

• Проверка того факта, что новая таблица содержитнужные данные.

• Переименование старой таблицы (или удаление ее).• Присвоение новой таблице имени, которое ранее при-

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

дексов и внешних ключей, если это необходимо.

Page 179: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Создание таблиц и работа с ними 179

Переименование таблицВ разных СУБД переименование таблиц осуществляется

по-разному. Не существует жестких, устоявшихся стандар-тов на выполнение этой операции. Пользователи СУБДDB2, MySQL, Oracle и PostgreSQL могут применять дляэтого оператор RENAME. Пользователи SQL Server и Sybaseмогут использовать хранимую процедуру sp_rename. Ос-новной синтаксис для всех операций переименования тре-бует указания старого и нового имен. Однако существуютразличия, зависящие от реализации. Обратитесь к докумен-тации своей СУБД, чтобы узнать подробности относительноподдерживаемого ею синтаксиса.

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

операторами SQL. Оператор CREATE TABLE применяется длясоздания новых таблиц, ALTER TABLE — для изменениястолбцов таблицы (или других объектов, таких как ограни-чения или индексы), а оператор DROP TABLE позволяетполностью удалить таблицу. Все эти операторы нужно ис-пользовать с особой осторожностью и только после созданиярезервных копий базы данных. Поскольку точный синтак-сис этих операторов варьируется в зависимости от СУБД,вам придется обратиться к документации своей СУБД задополнительной информацией.

Page 181: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание
Page 182: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование представлений 183

• для вывода частей таблицы вместо вывода ее полно-стью;

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

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

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

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

Проблемы производительности

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

Представления: правила и ограниченияПрежде чем создавать представления, следует ознако-

миться с некоторыми накладываемыми на них ограниче-

Page 185: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

184 Урок 18

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

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

• Представления, так же как и таблицы, должны име!уникальные имена. (Они не могут быть названы таже, как какая-нибудь другая таблица или предста]ление.)

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

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

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

• Во многих СУБД запрещается использование предлсжения ORDER BY в запросах к представлениям.

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

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

• В некоторых СУБД представления трактуются ка]запросы, предназначенные только для чтения. Эт(означает, что из представлений можно выбирать данные, но их нельзя вносить в таблицы, на основе которых было создано представление. Обратитесь к до

Page 186: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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

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

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

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

Создание представленийИтак, вы знаете, что такое представления (а также от-

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

Представления создаются с помощью оператора CREATEVIEW. Аналогично оператору CREATE TABLE, операторCREATE VIEW можно использовать только для созданияпредставления, которого до сих пор не существовало.

Удаление представлений

Для удаления представления используется опера-тор DROP. Его синтаксис прост: DROP V I E Wимя представления;.

Page 187: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование представлений 187

ВЫВОДcust name cust contact

Denise L. StephensKim Howard

Fun4AllThe Toy Store

АнализЭтот оператор возвращает указанные данные из пред-

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

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

Создание повторно используемых представлений

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

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

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

Page 189: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование представлений 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Использование представлений 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Урок 19

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

Что такое хранимыепроцедуры

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

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

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

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

• Клиенту необходимо сообщить, какие товары есть наскладе (и могут быть отгружены немедленно) и заказна какие товары выполнен быть не может.

Page 195: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

194 Урок 19

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

Как бы вы написали этот код? Можно было бы написат!каждый из операторов SQL отдельно и выполнить другиеоператоры в зависимости от полученных результатов. Вакпришлось бы делать это каждый раз, когда возникала бь:необходимость подобной обработки данных (и для каждогсприложения, которое в ней нуждается).

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

Access и MySQL

Хранимые процедуры не поддерживаются в Access.Кроме того, когда эта книга готовилась к печати,СУБД MySQL v4.x (текущая версия) также не поддер-живала хранимые процедуры (их поддержку планиро-валось осуществить в версии MySQL 5).

Гораздо больше информации

Хранимые процедуры— тема довольно сложная,полностью ее рассмотреть можно только в отдельнойкниге. Этот урок не научит вас всему, что необходимознать о хранимых процедурах. Скорее это введение вданную тему, призванное познакомить вас с тем, чтособой представляют хранимые процедуры и что с ихпомощью можно делать. По существу, представлен-ные здесь примеры соответствуют только синтаксисуOracle и SQL Server.

Page 196: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Работа с хранимыми процедурами 195

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

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

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

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

• Побочным эффектом этого является предотвращениеошибок. Чем больше шагов необходимо выполнить,тем выше вероятность появления ошибок. Предот-вращение ошибок обеспечивает целостность данных.

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

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

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

Page 197: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

196 Урок 19

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

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

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

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

Не можете написать хранимые процедуры? Тогдапросто используйте их

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

Page 198: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Работа с хранимыми процедурами 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Работа с хранимыми процедурами 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. 10 Минут На Урок, 3-е Издание

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. 10 Минут На Урок, 3-е Издание

Работа с хранимыми процедурами 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. 10 Минут На Урок, 3-е Издание

202 Урок 19

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

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

Page 204: Освой Самостоятельно SQL. 10 Минут На Урок, 3-е Издание

Урок 20

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

Что такое обработкатранзакций

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

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

Таблица Orders, которую мы использовали в последних18-ти уроках, — хороший пример. Заказы хранятся в двухтаблицах, в таблице Orderltems хранится информация оботдельных предметах заказов. Эти две таблицы связаны (со-отнесены) между собой с помощью уникального идентифика-тора, который называется первичный ключ (см. урок 1, "Чтотакое SQL"). Эти таблицы, кроме того, связаны и с другимитаблицами, содержащими информацию о клиентах и про-дуктах.

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

1. Проверка, содержится ли информация о клиенте в базеданных. Если нет, такая информация добавляется.