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

Линн Бейли

Изучаем
Приведи
в порядок
свои
отношения
с данными
Освой концепцию
и синтаксис SQL
максимально
эффективно

Прекрати путать Перестань


первичные смуш;аться
и внешние ключи команды
ALTER

Будь готов Проверь свои


объяснить суть знания SQL
нормализованной на интересных
таблицы упражнениях
Head First SQL
Lynn Beighley

Wouldn't it be dreamy
if there was Q book that
could teach me SQL without making
me want to relocate to a remote island
in the Pacific where there are
no databases? It's probably
nothing but a fantasy...

O ’REILLY
Beijing • Cambridge • Farnham • Köln • Sebastopol • Tokyo
И зучаем SQL
Л инн Бейли

С ^^П П Т Е Р '
М осква • С анкт-Петербург ■Нижний Новгород • Воронеж
Ростов-на-Дону ■Екатеринбург - Самара • Новосибирск
Киев • Харьков • М инск
2012
ББК 32.973.2-018.1
УДК 004.434
Б41

Бейли Л.
Б41 Изучаем SQL. — СПб.: Питер, 2012. — 592 с.: ил.

ISBN 978-5-459-00421-2

В современном мире наивысшую ценность имеет информация, но не менее важно уметь этой
информацией управлять. Эта книга посвящена языку запросов SQL и управлению базами данных.
Материал излагается, начиная с описания базовых запросов и заканчивая сложными манипуляци­
ями с помощью объединений, подзапросов и транзакций. Если вы пытаетесь разобраться в органи­
зации и управлении базами данных, эта книга будет отличным практическим пособием и предо­
ставит вам все необходимые инструменты. Особенностью данного издания является уникальный
способ подачи материала, выделяющий серию «Head First» издательства O ’Reilly в ряду множе­
ства скучных книг, посвященных программированию.

ББК 32.973.2-018.1
УДК 004.434

Права на издание получены по соглашению с O’Reilly. Все права защищены. Никакая часть данной книги не
может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских
прав.

ISBN 978-0596526049 англ. © Authorized Russian translation of the English edition of


Head SQL © O'Reilly Media, Inc. This translation is pub­
lished and sold by permission of O'Reilly Media, Inc., the
owner of all rights to publish and sell the same.
ISBN 978-5-4594)0421-2 © Перевод на русский язык
ООО Издательство «Питер», 2012
Ф Издание на русском языке, оформление
ООО Издательство «Питер», 2012
Посвящается нашему миру, изобилующему данными.
И вам, желающим управлять этими данными.
Автор

\ Л и н и беЙАМ

Линн — писатель-беллетрист, занявшийся написанием тех­


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

После получения ученой степени магистра в области ком­


пьютерных технологий Линн работала в лабораториях NRL
и LANL. Затем она открыла для себя Flash и написала свой
первый бестселлер.

Ей не повезло с выбором момента —она переехала в Крем­


ниевую Долину как раз перед крахом. Линн несколько лет
В и д м3 о к н а Л и н н .
проработала в Yahoo!, писала другие книги и разрабатывала
учебные курсы. Наконец, поддавшись своим творческим на­
клонностям, она переехала в Нью-Йорк для получения сте­
пени магистра искусств в области писательского мастерства.

Ее дипломная работа, написанная в стиле серии Head First,


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

Линн любит путешествия, любит готовить и выдумывать


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

8
Введение 25
1 Д гм н ы е и таблицы: Всему свое местпо 37
2 Команда SELECT; Выборка данных 87
3 D ELETE и UPDATE: О пользе гименений 153
4 П р о ек т и р о в а н и е тлблиц: К а к важ но быть нормальным 193
5 ALTER: К ак изменить прошлое 231
6 Расширенные возможности SELECT: Взглянуть на данные
под другим углом 267
7 Многотабличные базы данных: Когда в одной таблице тесно 311
8 Соединения и многотабличные операции;
Не могли бы м ы остаться в одиночестве ? 373
9 Подзапросы: Запросы внутри запросов 409
10 Внешние соединения, самосоединения и союзы:
Новые приемы 445
11 Ограничения, представления и транзакции: Усаим мякяс 481
12 ЪезопАсность: Защ ита данных 519
Приложение I: Прочее 549
Приложение II: Установка MySQL 567
Приложение III; Список инструментов 575

(^ о Д е ]^ ж а н и е ( н а с т о я щ е е )

Введение
Настройте свой мозг на 80Ь. Вот что вам понадобится, когда
вы пытаетесь что-то выучить, в то время как ваш мозг не хочет вос­
принимать информацию. Ваш мозг считает: «Лучше уж я подумаю о
более важных вещах, например об опасных диких животных или почему
нельзя голышом прокатиться на сноуборде». Как же заставить свой мозг
думать, что ваша жизнь зависит от овладения 301?

Для кого написана эта книга? 26


Мы знаем, о чем вы думаете 27
Метапознание: наука о мышлении 29
Заставить свой мозг повиноваться 31
Примите к сведению 32
Технические рецензенты 34
Благодарности 35

9
а н н ы е u tt»«f>.IIuUbi

Всему свое место


Разве не обидно потерять? Что угодно — ключи от машины,
купон на скидку в 25%, данные приложения... Нет ничего хуже, чем не­
возможность найти то, что вам нужно... и именно тогда, когда нужно.
А в том, что касается приложений, для хранения важной информации не
найти места лучше, чем таблица. Так что переверните страницу и при­
соединяйтесь к нашей прогулке по миру реляционных баз данных.

Определение данных 38
Рассматриваем данные по категориям 43
Что такое «база данных»? 44
Посмотрим на базу данных через волшебные очки... 46
В базах данных хранится логически связанная информация 48
Таблицы под увеличительным стеклом 49
Командуйте! 53
Создание таблицы: команда CRE1ATE TABLE 55
Создание более сложных таблиц 56
Посмотрите, как просто пишется код SQL 57
Наконец-то создаем таблицу my_contacts 58
Таблица готова 59
Знакомство с типами данных 60
Описание таблицы 64
Нельзя заново создать существующую таблицу или базу данных! 66
Долой старые таблицы! 68
Для добавления данных в таблицу используется команда INSERT 70
Создание команды INSERT 73
Модификации команды INSERT 77
Столбцы без значений 78
Команда SELECT читает данные из таблицы 79
Управление N U LL в таблицах 81
NOT N U LL в выходных данных DESC 83
DEFAULT и значения по умолчанию 84
Новые инструменты 85

10
К ом анда ^ ] Д

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

Трудный поиск 88
Улучшенная команда SELECT 91
Что это за * ? 92
Как запрашивать разные типы данных 98
Проблемы со знаками препинания 99
Непарный апостроф 100
Апострофы как спех^иальные символы 101
Команда INSERT с внутренним апострофом 102
Выборка ограниченного набора столбцов 105
Отбор столбцов ускоряет получение результатов 107
Объединение условий 114
Поиск числовых значений 117
Операторы сравнения 120
Операторы сравнения при поиске числовых данных 122
Операторы сравнения при поиске текстовых данных 125
Быть ИЛЬ не быть 127
Чем AND отличается от OR 130
Испольование IS N U LL для поиска N U LL 133
LIKE: слово для экономии времени 135
Специальные символы 135
Проверка диапазонов с использованием AND
и операторов сравнения 139
Только МЕЖДУ нами... Есть и другой способ 140
Условие IN 143
Ключевые слова NOT IN 144
Другие применения NOT 145
Новые инструменты 150

11
ш ш - т ж

о пользе и зм енений
Никак не можете прийти к окончательному решению? И ладно!
Команды, с которыми вы познакомитесь в этой главе — DELETE и UPDATE, —
избавят вас от возни с данными, которые вы ввели полгода назад. Команда
UPDATE изменяет данные, а команда DELETE удаляет из таблицы данные,
которые вам больше не нужны. Но мы не только рассмотрим новые инструменты;
в этой главе вы узнаете, как избирательно применять новые возможности и как
предотвратить случайное удаление полезных данных.

Клоуны вокруг нас 154


Информация о клоунах 155
Перемещения клоунов 156
Как вводятся сведения о клоунах 160
Бонзо, у нас проблема 162
Уничтожение записей командой DELETE 163
Использование команды DELETE 165
Правила DELETE 166
Танцы INSERT-DELETE 169
Будьте внимательны при выполнении DELETE 174
Проблемы с неточными условиями DELETE 178
Изменение данных командой UPDATE 180
Правила UPDATE 181
UPDATE как замена INSERT-DELETE 182
UPDATE в действии 183
Обновление цен 188
Достаточно одной команды UPDATE 190
Новые нструменты 192

12
U j^oeKm uj^oBaH ue т а б л и ц

К а к важно быть нормальным


L До настоящего момента мы не особо задумывались при
создании таблиц. Работают — и ладно; в конце концов, с ними можно
выполнять команды s e le c t , in s e r t , d e le t e и u p d a te . Ho при увеличении
объема данных постепенно становится ясно, что следовало бы сделать при
создании таблицы для упрощения условий WHERE: ее следовало бы сделать
более нормальной.

Две таблицы 194


Логические связи как суть таблицы 198
Атомарные данные 202
Атомарные данные и таблицы 204
О пользе нормализации 208
Преимущества нормализованных таблиц 209
Ненормализованные клоуны 210
На полпути к ШФ 211
Правила первичных ключей 212
Как прийти в НОРМУ 215
Исправление таблицы Грега 216
Старая команда CRILATE TABLE 217
Сначала покажи дЪ*и5^и таблицу 218
Команда для экономии времени 219
Команда CREATE TABLE с назначением
первичного ключа 220
М м4утку. у м ен й п о л н о е т а б л и ц а д о « ы х . И « ы х о т и т е , L 2, 3 и так далее 222
ч то б ы яу д а л и л е е иоамндой№ 0 Р ТА В1£, коквг л а ­
в е 1, и м « л в с е д а ж ы е с н о в о — т о л ь к о д л я то г о , ч то б ы
с о э д о т ь п ер в и ч н ы й к л ю ч в к а ж д о й э о п и си ?
Добавление первичного ключа в существующую таблицу 226
ALTER TABLE и добавление первичного ключа 227
Новые инструменты 228

13
ALIHl
К а к изм енить прошлое
Вам никогда не хотелось исправить прошлые ошибки?
Что же, теперь у вас есть такая возможность. Благодаря команде ALTER
вы сможете применить свои новые знания к таблицам, созданным много дней,
месяцев и даже лет назад. А самое замечательное, что это никак не повредит
существующим данным! К настоящему моменту вы уже знаете, что означает
понятие нормализованный, и можете применять его ко всем таблицам —
как прошлым, так и будущим.

Нужно внести пару изменений 232


Изменение таблиц 237
Кани гальный ремонт таблицы 238
Переименование таблицы 239
Грандиозные планы 241
Перепланировка столбцов 242
Структурные изменения 243
ALTER и CHANGE 244
Изменение двух столбцов одной командой SQL 245
Стоп! Никаких лишних столбцов! 249
Неатомарный столбец location 256
В поисках закономерности 257
Удобные строковые функции 258
Заполнение нового столбца существующими данными 263
Пришло врелля превратить вашу ста­
рую, скучную таблицу в настоящую Как работает комбинация UPDATE с SET 264
«бомбу». Вы и не подозревали, что
Новые инструменты 266
такие превращения возможны!

14
I^ C fflu J’ eHHbie В о з м о ж н о с т и

Взглянуть на данны е под другим углом


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

Перестройка в видеотеке 268


Недостатки существующей таблицы 269
Классификация существующих данных 270
Заполнение нового столбца 271
UPDATE с выражением CASE 274
Похоже, у нас проблемы 276
Трудности с таблицами 281
Упорядочение результатов выборки 282
ORDER BY 285
Упорядочение по одному столбцу 286
ORDER с двумя столбцами 289
ORDER с несколькими столбцами 290
Da t a v iu q Упорядоченная таблица 291

V lD Q d DESC и изменение порядка данных 293


Проблемы с печеньем 295
SUM сложит числа за нас 297
Суммирование с использованием GROUP BY 298
Функция AVG с GROUP BY 299
MIN и MAX 300
COUNT и подсчет дней 301
Команда SELECT DISTINCT 303
LIMIT и ограничение результатов 306
LIMIT и второе место 307
Новые нструменты 310

15
]^ н о Го тп аел и Ч н ь1е б а З ы Д ан н ы х

Когда в одной таблице тесно


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

Как найти Найджелу подружку 312


Одной таблицы недостаточно 324
Многотабличная база данных с информацией о клоунах 325
Схема базы данных clown_tracking 326
Как из одной таблицы сделать две 328
Связывание таблиц 333
Что нужно знать о внешних ключах 334
Связи между таблицами 339
Типы связей: один-к-одному 339
ЬН»_1и1ЬИ1«. Когда используются таблицы со связями
1— типа «один-к-одному» 340
аД|уЦу_к1|^ ..1 ас(1у|1у
Типы связей: «один-ко-многим» 341
Типы связей: «многиеко-многим» 342
к10“^ -н
пате Нам нужна соединительная таблица 345
дегк1ег 1еь_1е*т* Типы связей: «многие-ко-многим» 346
(^е$СГ1р1ЮП • 1оса1кю_1с1
1—
1оса110п_1<^ ^\ 1 1оса!)ол Исправляем таблицу Грега 349
Наконец-то — 1НФ... 351
Составные ключи состоят из нескольких столбцов 352
Сокращенная запись 354
Супергеройские зависимости 355
Частичные функциональные зависимости 355
Транзитивные функциональные зависимости 356
Вторая нормальная форма 360
Возможно, таблица уже находится в 2НФ... 361
Третья нормальная форма (наконец^о!) 366
Что делать с таблицей гпу_соп1ас15? 367
Новые инструменты 370

16
^оединения и МноГотпабЛиЧные опер*аЦии

Не могли бы мы остаться в одиночестве?


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

И все равно повторения, повторения... 374


Заполнение таблиц 375
Проблемы с нормализацией 377
Особые увлечения (столбец) 378
Разделение увлечений 379
Обновление столбцов 380
Вывод списка 381
Дороги, которые мы выбираем 382
(Почти) одновременное выполнение CREATE, SELECT
и INSERT 382
Одновременное выполнение CRE1ATE, SELECT и INSERT 383
Зачем нужно AS? 384
Псевдонимы столбцов 385
Кому нужны псевдонимы таблиц? 386
Все, что вы хотели знать о внутренних соединениях 387
Перекрестное соединение .388
Открой свое внутреннее соединение 393
Внутреннее соединение в действии: эквисоединение 394
Внутреннее соединение в действии: неэквивалентное
соединение 397
Последнее внутреннее соединение: естественное
соединение 398
Встроенные запросы? 405
Новые инструменты 407

17
Ц од зал р о сь!

Запросы внутри запросов


Мне, пожалуйста, запрос из двух частей. Соединения — хорошая
штука, но иногда возникает необходимость обратиться к базе данных сразу
с несколькими вопросами. Или взять результат одного запроса и исполь­
зовать его в качестве входных данных другого запроса. В этом вам помогут
подзапросы, также называемые подчиненными запросами. Они предотвра­
щают дублирование данных, делают запросы более динамичными и даже
помогут вам попасть на вечеринку в высшем обществе. (А может, и нет —
но два из трех тоже неплохо!)
Грег бере гся за нож кн рабо ты 410
В списке Грега пояшиио 1ч я 11о т )1(' таблицы 411
Грег использует ипутрсмик с (о с д т к пис 412
Но он хочет опробовать другие запросы 414
Подзапросы 416
Два запроса преобразуются в запрос с подзапросом 417
Подзапросы; если одного .запроса педостаточно 418
Подзапрос в действии 419
Правила для подзапросов 421
Построение подзапроса 424
Подзапрос как столбец 8ЕГЕСГГ 427
Другой пример: подзапрос с естес гвеииым соединением 428
Некоррелированный подзапрос 429
Некоррелированный подзапрос с несколькими
значениями: IN, NOT IN 43.S
Коррелированные подзапросы 438
ВНЕ ШН и й запрос Коррелированный подзапрос с NOT EXISTS 439

ВНУТРЕННий запрос EXISTS и NOT EXISTS 440


Служба поиска раб()ты i'pera принимает заказы 442
По дороге на вечеринку 443
Новые инструменты 444
Внешним .
запрос

. BHytv\peHHULi
запрос
WHERE co lu m n = ГЧРТРг-т i ^
(SELECT co lu m n FROM t a b l e )

18
^НеШНие соединения, СаМ°СоеДиНеНиЯ и CoI°3bi

Новые приемы
Пока вы знаете только половину того, что необходимо знать
о соединениях. Вы видели перекрестные соединения, которые возвращают все
возможные комбинации записей, и внутренние соединения, которые возвращают
записи обеих таблиц при наличии совпадения. Однако существуют еще и внеш­
ние соединения, которые возвращают записи, не имеющие совпадений в другой
таблице, самосоединения, которые (как ни странно) соединяют таблицу саму
с собой, и союзы, которые объединяют результаты запросов. Освоив эти при­
емы, вы сможете получить все данные точно в том виде, в котором они вам нужны.
(И узнаете правду о подзапросах, как мы и обещали!)
Уничтожение старых данных 446
Левое, правое... 447
Пример левого внешнего соединения 448
Внешние соединения и множественные совпадения 453
Правое внешнее соединение 454
Пока мы занимались внешними соединениями... 457
Создание новой таблицы 458
М есто новой таблицы в схеме 459

/ Рефлексивный внешний ключ 460


Соединение таблицы с ней самой 461
Потребуется самосоединение 463
Другой способ получения многотабличной информации 464
Союзы 465
Ограничения союзов 466
Правила союзов в действии 467
UNION ALL 468
г)дИ1’.и'^’ ______ Ванные job. deiired Создание таблицы на основе союза 469
У
INTERSECT и EXCEPT 470
С союзами разобрались, пора переходить к... 471
Сравнение подзапросов и соединений 471
Преобразование подзапроса в соединение 472
0'Л\ор(у,^’ Д пннм е. б стр еча кичиеся

в тадлшч 6 оЬеМ тй(5личях. исключи Самосоединение как подзапрос 477


Компания Грега растет 478
Новые инструменты 480

19
^аниЧения, 1 ]|='еДстаБления u т р а н з а к ц и и
O rfs

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

Грег нанимает помощников 482


Первый день: вставка данных нового клиента 483
Джим не хочет использовать N U LL 484
Три месяца спустя 485
Добавление ограничения CHECK 486
Ограничение CHECK для столбца gender 487
Однообразная работа Фрэнка 489
Создание представления 491
Просмотр представлений 492
Как работает представление 493
Что такое представление 494
Вставка, обновление и удаление в представлениях 497
Обновление данных через представление 498
Представление с CHECK OPTION 501
Представление может быть обновляемым, если... 502
Удаление представлений 503
Когда хорошая база данных плохо ведет себя 504
dataville Что произошло с банкоматом 505
Savin gs & loan
Новые неприятности с банкоматами 506
Это не мечты, а транзакции 508
Свойства транзакций 509
SQL помогает работать с транзакциями 510
Как должен был работать банкомат 511
Как работать с транзакциями в MySQL 512
Теперь попробуйте сами 513
Новые инструменты 516

20
1)
еЗоГШСНосШЬ

Защ ита данны х


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

Проблемы с пользователями 520


Предотвращение ошибок в базе данных 521
Защита учетной записи root 523
Создание нового пользователя 524
Решите, что необходимо каждому пользователю 525
Простая команда GRANT 526
Разновидности GRANT 529
Команда REVOKE 530
Отзыв использованной привилегии GRANT OPTION 531
Проблема общих учетных записей 536
Использование роли 538
Удаление ролей 538
Конструкция WITH ADMIN OPTION 540
Объединение CREATE USER с GRANT 545
Оглушительный успех! 546
Новые инструменты 547
Присоединяйтесь! 548
Используйте SQL в своих проектах... и возможно,
вас тоже ожидает успех 548

а її

bashful doc
1
dopey grumpy
A
happy sleepy
J L
sneezy

21
Десять важ нейш их тем
(о которых мы не р а сс ка за л и )
Но даже после всего сказанного беседа еще
чена1 Есть еще кое-что, о чем вы должны знать. Мы реп
неправильно просто проигнорировать эти темы — они за(
бы краткого упоминания. Итак, прежде чем откладывать к
тесь с этими короткими, но важными разделами. А ког,/;
те и эту главу, останется еще пара приложений... и может
рекламы... и ничего больше. Честное слово!

1. Используйте графический интерфейс к свое


2. Зарезервированные слова и специ;1льные с^
3. ALL, ANY и S01V1E
4. Подробнее о типах данных
5. Временные таблицы
6. Преобразование типа
7. Имя пользователя и текущее время
8. Полезные числовые функции
8. Полезные числовые функции (продолжение
9. Индексирование для ускорения операций
10. PH P/M ySQ L за две минуты
BEFORI BES1H BIHMY BIT ВЫ» BOOUUM ВОТЯ BRUDTH ВТ
Е CASCADED CASE CAST CATALOG CBAR СНАМСТКН С X CLASS CLOe CLOn COLLATK
ГНГ13ГТЯ35ГЯС”
DATA DATE DAT DEALLOCATE DEC DECIMAL DECLARE DEFAOLT DBFEBMBLB DERRKXD DELETE БЕРТЯ
DEREF DESC DESCRIBE DESCRIPTCA DESTROX DESTTOCTOH ОГШЮМШХС DICTICMAIIT DlAOlOeTICS
DISCOMMECT DISTINCT DCMAIM DOUBLE DROP DTNMDC
С EQOALS ESCAPE EVERT EXCEPT ЕЯСЕРТ10Н КЯС К
FALSE FBTCH FIRST FLOAT FOR FOREIG» FOUWD РНШ ШЕЕ FÜLL ГОНСТЮН

BAVUW ROST »3ÜR

NAP ИАТСВ ЮНиТЕ IKCIFIES MXIFT МХЯЛД ИСМТН


NAMES NATIONAL NATURAL ttCHAB NCLC» tIBH N
08JICT o r OFF OLD ON ONLY ORM OPBRkllOM 0РТ1СЯ Ot СЮЕХ CflDIMU.ITT ОШ ООПЯ ООПОТ

SAVEPOINT SCHEMA SCROLL SCOPE SEARCH SECOND SECTIO« SELECT SEgOEHCE SESSION
SESSIOM_USER SIT SETS SIZE SMAU.INT SOME SPACE SPECIFIC 8РЕС1ПСТГРВ SQL SQLEZCEPTICM
SgLSTATE SQUIARMIMS START STATE 8TATS»MT STATIC STW CTCM ET»THI_PHOt
n_KD R TIMBtQ(IE_NIMOTE T
TRAILING TRAMSACTtON TRAMSLATIOM TREAT TRIGGER TRUE
UNDER mttOM qMIQOE___________________________
VALOE VALOES VAtCHAR VARIABLE УАКТШб VIEW
NHEM NHXMBVER NHERZ ПТВ ПТВООТ МОКК NRITE

!2
У стан овка

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

Задело! 568
Инструкции и устранение проблем 568
Установка MySQL в системе Windows 569
Установка MySQL в Мае OS X .572

^ п и со К и н с т р у м е н т о в

Полный инструментарий 8 0 Ь
в этом приложении перечислены все инструменты 80Ь,
упоминавшиеся в книге. Не жалейте времени, просмотрите весь
список и возрадуйтесь — ведь вы изучили их все!

23
Введение

на насу1МН^й бо^ ^ рос.

. т а к . о и е м у они бкА ^ и м ли
Т А К -О Е б к н и гу об $ ^ и ? »
Для кого написана эта книга?
Если вы ответите «да» на все следующие вопросы.

У вас имеется доступ к компьютеру с установленной


РСУБД — Oracle, MS SQL или MySQL? Или
компьютер, на котором вы ее сможете установить?
Мы п о м о ж ем ваАЛ иацч 1.л-'ль
Вы хотите изучить, понять и запомнить принципы концепции и синтаксис
создания таблиц, баз данных и написания запросов SQL чтобы по в о з­
по самым лучшим и современным стандартам? можности у п р о с т и т ь его
*^онимание и практ иче -
Вы предпочитаете оживленную беседу сухим, ское применение.
скучным академическим лекциям?

...то эта книга для вас.

Кому эта книга не подойдет?


Если вы ответите «да» на любой из следующих вопросов...

Но если вам нужно по ­


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

...эта книга не для вас.

[З ам ет ка о т отдела продаж-
воо6и^е-то эт а книга для любого
у кого е с т ь деньги.] '

26 введе н и е
Мы знаем, о чем Вы думаете
«Разве серьезные книги но такие?»
«И почему здесь столько рисунков?»
«Можно ли так чему-нибудь научиться?»
Мозг

и мы знаем, о чем думает Ваш тзг


Мозг жаждет новых впечатлений. Он постоянно ищет, ана­
лизирует, ожидает чего-то необычного. Он так устроен, и это
помогает нам выжить.
Как наш мозг пос тупает со всеми обычными, повседневными ве­
щами? Он всеми силами пытается оградиться от них, чтобы они
не мешали его настоящей работе —сохранению того, что дей­
ствительно важ но. Мозг не считает нужным сохранять скучную
информацию. Она не проходит фильтр, отсекающий «очевидно
несущественное».
Но как же м озг узнает, что важно? Представьте, что вы выехали
на прогулку и вдруг прямо перед вами появляется тигр. Что про­
исходит в вашей голове и теле?
Активизируются нейроны. Вспыхивают эмоции. Происходят Замечательно.
химические реакции. Еще 592 сухие,
И тогда ваш мозг понимает... скучные страницы.

Конечно, это важно! Не забывать!


А теперь представьте, что вы находитесь дома или в библиотеке Г . " - - ’ “" '
в теплом, уютном месте, где тигры не водятся. Вы учитесь — го­
товитесь к экзамену. Или пытаетесь освоить сложную техниче­
скую тему, на которую вам выделили неделю... максимум десять
дней.
и тут возникает проблема; ваш мозг пытается оказать вам услугу.
Он старается сделать так, чтобы на эту очевидно несущественную
информацию не тратились драгоценные ресурсы. Их лучше
потратить на что-нибудь важное. На тигров, например. Или на
то, что к огню лучше не прикасаться. Или что на лыжах не стоит
кататься в футболке и шортах.
Н ет простого способа сказать своему мозгу; «Послушай, мозг,
я тебе, конечно, благодарен, но какой бы скучной ни была эта
книга и пусть мой датчик эмоций сейчас на нуле, я хочу запом­
нить то, что здесь написано».

аапьил 27
'^тпа книГа дяя ш е * , тсш° хоЧ еш учигпься.

Как мы что-то узнаем? Сначала нужно это «что-то» понять, а потом не забыть. Затол­
кать в голову побольше фактов недостаточно. Согласно новейшим исследованиям в об­
ласти когнитивистики, нейробиологии и психологии обучения, для усвоения материала
требуется что-то большее, чем простой текст на странице. Мы знаем, как заставить ваш
мозг работать.

Основные принципы серии «Head First»:

Наглядность. Графика запоминается гораздо лучше,


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

Разговорный стиль изложения. Недавние


исследования показали, что при личном
разговорном стиле изложения материала
(вместо формальных лекций) улучшение ре­
зультатов на итоговом тестировании составляло до 40%. Расска­
зывайте историю, вместо того чтобы читать лекцию. Не относитесь к себе слишком
серьезно. Что скорее привлечет ваше внимание; занимательная беседа за столом
или лекция?

Активное участие читателя. Пока вы не начнете напрягать извилины, в вашей


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

Привлечение (и сохранение) внимания читателя. Ситуация, знакомая каждому;


«Я очень хочу изучить это, но засыпаю на первой странице». Мозг обращает внимание на
интересное, странное, притягательное, неожиданное. Изуче­
ние сложной технической темы не обязано быть скуч­
ным. Интересное узнается намного быстрее.

Обращение к эмоциям. Известно, что наша способ­


ность запоминать в значительной мере зависит от эмо­
ционального сопереживания. Мы запоминаем то, что нам небезразлично.
Мы запоминаем, когда что-то чувствуем. Нет, сентименты здесь ни
при чем: речь идет о таких эмоциях, как удивление, любопытство,^
интерес, и чувство «Да я крут!» при решении задачи, которую
окружающие считают сложной — или когда вы понимаете, что
разбираетесь в теме лучше, чем всезнайка-Боб из технического
отдела.

28 введе ни е
Метапозиаиие: наука о мышлении
Если вы действительно хотите быстрее и глубже усваивать новые зна­
ния —задумайтесь над тем, как вы задумываетесь. Учитесь учиться.
Как бы теперь
Мало кто из нас изучает теорию метапознания во время учебы. Нам ио- заставить мой
ложеко учиться, но нас редко этому учат. мозг все это
запомнить...
Но раз вы читаете эту книгу, то, вероятно, вы хотите изучить и по
возможности быстрее. Вы хотите запомнить прочитанное, а для этого
абсолютно необходимо сначала понять прочитанное.
Чтобы извлечь максимум пользы из учебного процесса, нужно заставить
ваш мозг воспринимать новый материал как Н ечто Важное. Критичное
для вашего существования. Такое ж е важное, как тигр. Ина­
че вам предостоит бесконечная борьба с вашим мозгом,
который всеми силами уклоняется от запоминания новой
информации.

Как же УБЕДИТЬ мозг, что язык SQL не менее важен,


чем тигр?
Есть способ медленный и скучный, а есть быстрый и эф­
фективный. Первый основан на тупом повторении. Всем
известно, что даже самую скучную информацию можно
запомнить, если повторять ее снова и снова. При достаточном коли­
честве повторений ваш мозг прикидывает: «Вроде бы несущественно, но раз
одно и то же повторяется столько раз... Ладно, уговорил».
Быстрый способ основан на повы ш ении акти вн ости м озга и особенно
сочетании разных ее видов. Доказано, что все факторы, перечисленные на
предыдущей странице, помогают вашему мозгу работать на вас. Например,
исследования показали, что размещение слов внутри рисунков (а не в подпи­
сях, в основном тексте и т. д.) заставляет мозг анализировать связи между
текстом и графикой, а это приводит к активизации большего количества
нейронов. Больше нейронов — выше вероятность того, что информация
будет сочтена важной и достойной запоминания.
Разговорный стиль тож е важен: обычно люди проявляют больше внимания,
когда они участвуют в разговоре, так как им приходится следить за ходом
беседы и высказывать свое мнение. Причем мозг совершенно не интересует,
что вы «разговариваете» с книгой! С другой стороны, если текст сух и фор­
мален, то мозг чувствует то же, что чувствуете вы на скучной лекции в роли
пассивного участника. Его клонит в сон.
По рисунки и разговорный стиль — это только начало.

да л ьш е ► 29
Bom что сделали МЫ:
Мы использовали рисунки, потому что мозг лучше приспособлен для восприя­
тия графики, чем текста. С точки зрения мозга рисунок стоит 1024 слов. А когда
текст комбинируется с графикой, мы внедряем текст прямо в рисунки, потому
что мозг при этом работает эффективнее.
Мы используем избы точн ость: повторяем одно и то же несколько раз, приме­
няя средства передачи информации, обращаемся к разным чувствам —
и все для повышения вероятности того, что материал будет закодирован в не­
скольких областях вашего мозга.
Мы используем концепции и рисунки несколько неож иданным образом, по­
t o y s . to y b e y s .b
тому что мозг лучше воспринимает новую информацию. Кроме того, рисунки
bey
и идеи обычно имеют эмоцгитальное содержание, потому что мозг обращает
hula hoop % ------ ^ Davey
внимание на биохимию эмоций. То, что заставляет нас чувствовать, лучше запо­ balsa glider ^ ^ Bobby
минается — будь то шутка, удивление или интерес. toy soldiers Beaver

harmonica Ricliie
Мы используем разговорный стиль, потому что мозг лучше воспринимает инфор baseball cards >
мацию, когда вы участвуете в разговоре, а не пассивно слушаете лекцию. Это
происходит и при чтении.
В книгу включены многочисленные упражнения, потому что мозг лучше запо­
минает, когда вы что-то делаете. Мы постарались сделать их непростыми, но
интересными —то, что предпочитает большинство читателей.
Беседа у камина
Мы совместили несколько стилей обучения, потому что одни читатели предпочи­
тают пошаговые описания, другие стремятся сначала представить «общую кар­
тину», а третьим хватает фрагмента кода. Независимо от ваших личных предпо­
чтений полезно видеть несколько вариантов представления одного материала.
Мы постарались задействовать оба полуишрия вашего мозга, это повышает веро­
ятность усвоения материала. Пока одна сторона мозга работает, другая часто
имеет возможность отдохнуть; это повышает эффективность обучения в тече­ КЛЮЧЕВЫЕ
ние продолжительного времени. МОМЕНТЫ
А еще в книгу включены истории и упражнения, отражающие другие точки
зрения. Мозг глубже усваивает информацию, когда ему приходится оценивать
и выносить суждения.
в книге часто встречаются вопросы, на которые не всегда можно дать простой
ответ, потому что мозг быстрее учится и запоминает, когда ему приходится что-
то делать. Невозможно накачать мышцы, наблюдая за тем, как занимаются дру­
гие. Однако мы позаботились о том, чтобы усилия читателей были приложены
в верном направлении. Вам не придется ломать голову над невразумительными
примерами или разбираться в сложном, перенасыщенном техническим жарго­
ном или слишком лаконичном тексте.
В историях, примерах, на картинках используются лю ди — потому что вы тоже
человек. И ваш мозг обращает на людей больше внимания, чем на неодушевлен­
ные предметы.

30 введени е
что можете сделать ш , чтоьы
заетабить сбои мозг побиноВаться
^ ь ір е ж ь т е Мы свое дело сделали. Остальное за вами. Эти советы стану ч
^ > ^ рт реп и т е отправной точкой; прислушайтесь к своему мозгу и определи­
«я холодильник те, что вам подходит, а что не подходит. Пробуйте новое.

Не торопитесь. Чем больше вы поймете, Говорите вслух.


тем меньше придется запоминать. Речь активизирует другие участки моз­
Просто-чмтеат недостаточно. Когда га. Если вы пытаетесь что-то поня ть или
книга задает вам вопрос, не переходите получше запомнить, произнесите вслух.
к ответу. Представьте, что кто-то дей­ А еще лучше — попробуйте объяснить
ствительно задает вам вопрос. Чем глуб­ кому-нибудь другому. Вы будете быстрее
же ваш мозг будет мыслить, тем скорее усваивать материал и, возможно, открое те
вы поймете и запомните материал. для себя что-то новое.

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


Мы включили упражнения в книгу, но Следите за тем, когда ваш мозг начинае т
выполнять их за вас не собираемся. И не уставать. Если вы начинаете поверхностно
разглядывайте у п р аж н ен и я . Берите ка­ воспринимать материал или забываете
рандаш и пишите Физические действия только что прочитанное — пора сдела чь
во время учения повышают его эффектив­ перерыв.
ность.
Чувствуйте\
Читайте врезки. Ваш мозг должен знать, что материал
Это значит: читайте псе. Врезки —часть книги действительно важен. Перенсивайте
основного м ат ериала! Не пропускайте их. за героев наших историй. Придумг.шайте
собственные подписи к фотографиям. По­
Не читайте другие книги после этой перед сном. морщиться над неудачной шуткой все равно
лучше, чем не почувствовать ничего.
Часть обучения (особенно перенос
информации в долгосрочную память) про­
исходит посл£то\'0 , как вы откладываете Творите!
книгу. Ваш мозг не сразу усваивает инфор­ Попробуйте применить новые знания
мацию. Если во время обработки посту­ в своей повседневной работе. Просто
пит новая информация, часть того, что сделайте хоть что-нибудь, чтобы приобрес! и
вы узнали ранее, может быть потеряна. практический опыт за рамками упражне­
ний. Все, что для этого нужно — это ка|заи-
Пейте воду, и побольше. даш и подходящая задача... задача, в ко­
Мозг лучше всего работает и условиях вы­ торой изучаемые методы и инс трумеп 1ы
сокой влажности. Дегидратация (которая могут принести поль:(у.
может наступить еще до того, как вы по­
чувствуете жажду) снижает когнитивные
функции.

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

Мы начинаем с основного синтаксиса SQL, а затем переходим


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

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


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

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


Существует много разных РСУБД; Standard SQ L, MySQL, O racle, MS SQ L Server,
PostgreSQL, DB2... и это еще не все. Если бы мы стали описывать все различия
в синтаксисе всех команд, то книга стала бы во много раз толщее, поэтому в книге
основное внимание уделяется стандартному синтаксису SQ L с небольшим укло­
ном в сторону MySQL. В се примеры книги будут работать в MySQL. Кроме того,
большинство из них будет работать во всех перечисленных выше РСУБД. Пом­
ните, ранее мы советовали купить справочник? Так вот, купите специализирован­
ный справочник для той РСУБД, с которой вы работаете.

Упражнения ОБЯЗАТЕЛЬНЫ.
Упражнения являются частью основного материала книги. Одни упражнения спо­
собствуют запоминанию материала, другие помогают лучше понять его, третьи
ориентированы на его практическое применение. Н е пропускайте упражнения.

32 вве де н и е
Повторение применяется намеренно.
У книг этой серии есть одна принципиальная особенность; мы хотим, чтобы вы
действительно хорошо у св ои л и материал. И чтобы вы запомнили все, что узнали.
Большинство справочников не ставит своей целью успешное запоминание, но это
не справочник, а учебник, поэтому некоторые концепции излагаются в книге по
нескольку раз.

Примеры кода были сделаны по возможности компактными.


Наши читатели не любят просматривать по 200 строк кода, чтобы найти две нуж­
ные строки. Большинство примеров книги приводится в минимальном контексте,
чтобы та часть, которую вы непосредственно изучаете, была понятной и простой.
Не ждите, что весь код будет стопроцентно устойчивым или даже просто завер­
шенным — примеры написаны в учебных целях и не всегда являются полнофунк­
циональными.
Многие команды доступны в Интернете, чтобы вы могли скопировать их для
выполнения в своем терминале или рабочей программе. Их можно загрузить
по адресу h t t p : //www. h e a d f ir s tla b s . com/books/ h fsq l/

Упражнения «Игры разума» не имеют ответов.


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

Установка сервера SQL.


Чтобы создавать базы данных и таблицы средствами SQ L, а также работать
с ними, вам понадобится доступ к серверу SQ1. Возможно, на вашем веб-сервере
уже имеется установленная и настроенная РСУБД, а если нет —установите ее на
споем домашнем компьютере. В приложении Ü приведены инструкции по установ­
ке MySQL (популярная бесплатная реализация SQL) для Мае и Windows.

SQL для ленивых.


Ксли вам не хочется возиться с установкой РСУБД на своем компьютере
и иы просто хотите самостоятельно проверить примеры, приведенные в книге,
нам повезло! Мы создали специальную «SQL-песочницу», в которой вы можете
поиграть и поэкспериментировать с большинством примеров. П осетите страницу
но адресу h t t p : //www. h e a d f ir s tla b s . сот/sql_hands_on/
Технические рецензенты Риме

Джейллм Хбндерсон
^ э р и К оА лет и л

Стив Милана

Л у -Э н и Мйззй

Ч осер т о ж е
^ ^ oм oгaл.

Н а ш и за м е ч а т ел ь н ы е р ец ен зен т ы
Мы бесконечно благодарны нашим техническим Flavored Rings в плохо проветриваемых подвалах
рецензентам, вылавливавшим бесчисленные по всей стране, обычно он сидит дома со своими
грубые ляпсусы, коварные ошибки и банальные котами Ральфом и Сквиком.
опечатки. Без них материал книги не был бы
«Шелли» Мойра Мишель Риме, магистр педа­
и наполовину таким четким и правильным. Они
гогических наук, обладательница сертификатов
отлично справились со своей работой.
м е р и MCSE, ведет образовательные программы
К эри Коллетт применил 15 лет практического для детей младшего возраста в общественном
опыта, полученного во время работы в начинаю­ колледже Дельгадо (Нью-Орлеан). В настоящее
щих фирмах, правительственных лабораториях время она переводит свои учебные курсы в ин­
и финансовом секторе, в ходе рецензирования тернет-формат, чтобы обеспечить изменившиеся
этой книги. Сейчас он надеется вернуться к дру­ потребности населения Нью-Орлеана после ура­
гим приятным занятиям, не связанным с рабо­ гана «Катрина». Мы благодарны ей за то, что она
той, — кулинарии, туризму, чтению книг и развле­ смогла выбрать для нас время в своем плотномО
чениям с собаками. графике.
Лу-Энн Мазза выкроила немного времени из своей Джейми Хендерсон — ведущий специалист по
занятой профессиональной жизни программиста системным архитектурам. Ее волосы выкрашены
и аналитика для написания исключительно точных в фиолетовый цвет, а свободное время делит­
и актуальных рецензий. Мы рады, что теперь она ся между виолончелью, книгами, видеоиграми
сможет уделять больше времени своим увлече­ и фильмами на DVD.
ниями —велоспорту, фотографии, компьютерам,
Благодаря этой замечательной группе код
музыке и теннису.
и упражнения в книге делают именно то, что им
Когда Стив Милано не программирует на по­ положено делать, а читатель, перевернув послед­
лудюжине разных языков, не пишет рецензии нюю страницу, начнет вполне уверенно програм­
по книгам и не играет в группе панк-рока O nion мировать на SQL.

34 введе н и е
Благодарности
Р едакт оры
Прежде всего хочу поблагодарить своего редактора Б ретта Маклаф­
лина за целых два учебных курса по серии Head First. Бретт не просто
редактор —умение выслушать собеседника сочетается с готовностью
помочь. Б ез его руководства, поддержки и интереса эта книга никогда
не была бы написана. Он не только понял меня с первого собеседова­
ния, но и благожелательно относился к моему (порой чрезмерному)
юмору. В результате эта книга стала самым лучшим из всех моих автор­
ских проектов. Бретт дал мне много полезных советов, и благодаря
ему я узнала много полезного в ходе работы. Спасибо, Бретт!

Редактор Кэтрин Нолан наверняка потеряла немало 5рем т


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

Г-Э1''лрин Н о л а н

С от рудн и ки и зд а т ел ь с т в а O ’R eilly
Художественный редактор Луиза Барр была для нас хорошим другом и талантли-
ным дизайнером. Каким-то образом ей удалось преобразовать мои безумные идеи
по впечатляющие художественные образы, которые предельно ясно передают са­
мые сложные концепции. Вся работа по дизайну была выполнена ей, и я уверена,
что на многих страницах книги вам захочется поблагодарить ее вместе со мной.

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


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

Наконец, я хочу поблагодарить Кэти Сьерра и Берта Бэйтса за создание этой


замечательной серии и за самый лучший и напряженный учебный курс, который
мне довелось пройти за свою жизнь. Если бы не эти три дня —даже не хочу думать,
насколько сложнее мне было бы работать над книгой. Завершающие комментарии
liep 'Ta отличались беспощадной точностью и значительно улучшили эту книгу.

35
1 ]^аннь10ища^ЛиДы

Всему свое место

Разве не обидно потерять? Что угодно — ключи от маши­


ны, купон на скидку в 25% , данные приложения... Нет ничего хуже,
чем невозможность найти то, что вам нужно... и именно тогда,
когда нужно. А в том, что касается приложений, для хранения
важной информации не найти места лучше, чем таблица. Так что
переверните страницу и присоединяйтесь к нашей прогулке
по миру реляционных баз данных.
Определение данных
У Грега много друзей. Он обожает знакомить их
друг с другом, но, конечно, для этого ему нужно
помнить, кто чем увлекается. Грег аккуратно запи­
сывает подробную информацию на листочках:

Грег уже очень давно использует свою систему.


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

38 глава 1
Нет ли более разумного способа хранения этой
информации? А что бы сделали ВЫ на его месте?

39
Как насчет базы данных?
Ведь книга написана о базах
данных, верно?

Абсолютно верно. База данных —


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

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

Энн бренсон Ажейми гамил 1>тон


Д ата рождения, Дйтд рождения: ХС>/'?/1 Чб4
ГГрогрлММмС!^ СисмемныИ администратп.ор
Не замужем^ Не женат
ио ее1^ 1’ Алане!
Саннивейл, СА
Мацнтин-Вы<>1 СЬ
‘^оп±ЬоЬ1лег&Ьгеакпескр1гга.
сом
увлечения: книги,
прогулки, домашнее пиво Увлечения: туризм, литера­
тура
Ище^-. новая работа
Ищет: друзья, женщины
Л __

'^ ан Скуп

^ ен ат

-Антонио, тХс

і^<Мет: ничего

Анджелина Мендоса
Дата рождения:

Системный
администратор
\ Замужем
\ Сан-Франциско, СА
\ an3elina@starbuzzcoltee.com

\ д Увлечения: театр, танцы


Ищет: новая работа

а и /ь ш е » 41
^ ьозьми в руку карандаш
йшение Перед вами несколько карточек из каталога Грега. Найдите
сходные данные, собранные Грегом о каждом человеке. При­
свойте таким данным метку, описывающую категорию инфор-
мации, и запишите эти метки в отведенных полях.

Имя
К а т его р и и ,
I которые ллы
о пр ед ели м ,
.....^..имл{?то.._ будут и с п о л ь ­
П рограм м ист Д ата рождения: 1 0 / ^ 1 ^?б4
Системный администратор зоваться для
не замужем, но е с т ь планы упорядочения
С татус Не женат
М ацн^пин-Вью , СА данных.
З е@ Ь о а г^ 5 -г-и 5 .со т Саннивейл, СА
d■ontbothertSbreakneckpizг.a.
увлечения: книги, *геидие сот
прогулки, до/ламне.6
Увлечения: туризм, литера­
ищет: нобля работа тура
Ищет: друзья, женщины

Мы разделили полное
Ллан Скуп
имя на имя и ф ам илию.
Такое деление позднее П роф есси я^
пригодится нам при
сортировке данных. М ест о .— ^
имя ж и т ел ьст ва > Сан -Антонио, ТХ
Э лект ронной
Ф ш лия
почта
Дата ро^^ения Ищет: ничего

Профессия
Аяджелина МенЭоса
С т а т у с ................................... Д ата рождения:
х я / в / г ‘17й
Место ......... Системный администра­
тор
Э л е ^ р о ш я . Ш т а ............. Замужем
Грег уже записал
у в д е н ш я ................................. на своих карточках
[||Д0^ Увлечения: т еат р ,^ Н Ц Ы названия некоторых
категорий: « Д а т а
Ищет: новая работа
рож дения», « У в л еч е­
ния» и « И щ е т » .

42 :п.1вгі 1
Рассматриваем данные по категориям
Давайте взглянем на данные с новой точки зрения. Если разрезать
каждый листок па полоски, а затем разложить их по горизонтали,
вот что у вас получится:

im p , т а н ц ы
|новяя
А н Э ж е ли н а 1 4 /8 /1 4 7 4 Системный Заму^е-м ' с л н -Ф р л н ц и с к о , СА ррлбота
---- — адттимратйр ^ ^

Если теперь разрезать еще один листок с названиями этих категорий


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

Имя Увлечения ь Ищет


J fc foZnu^ I — У || I J

Ангжелмна і^іенЗоса г ч /г /г Ч 7 Ч Системний Зйлдажем j с«н-Франциско, СА /»«agliiaaSstarfenzzeoffee.cow fcpafoma


д ії I ""— II ' адм инист рат ор „,л ,)и „ц ц (и [

А вот как выглядит га же информация в виде ТАБЛИЦЫ из строк и столбцов.

А я уже видел такое представление дан­


ных в Excel. Чем таблицы SQL отличаются
от него? И что это за столбцы и строки?

II.
Ч*
имя »лектр ои и а я ноте проф осси я м осто статус увлечения ищ ет
почта рож дения ж итояьства

Бренсон Энн annie@boards- 1-7-1962 программ ист М аунтин-Вью , не замуж ем, ролевые игры, новая
r-us.com СА но е а ь п р о гр а м м и ­ работа
планы рование

Гамильтон Дж ейми dontbother@ 10-9-1964 систем ны й а д ­ Саннивейл, С А не ж е нат туризм, ли те­ друзья,
breakneck министратор ратура ж енщ ины
pizza.conn

Скуп Алан soukup@ 1-7-1966 инженер Сан-Антонио, женат ролевые игры, ничего
breakneck ТХ п р о гр а м м и ­
pizza.com рование

М ендоса Анджелина angelina@ 19-8-1979 системный а д ­ Сан-Ф ран- замуж ем театр, танцы новая
5tarbuzzcoffee.com министратор циско, С А работа

д п л ьш е > 43
Уур По базам данных
Что такое «база данных»?
Прежде чем переходить к подробному рассмотрению таблиц,
строк и столбцов, давайте сделаем шаг назад и попробуем пред­
ставить общую картину. Первая структура SQL, о которой вы
должны знать, — контейнер, в котором хранятся все ваши табли­
цы. Она-то и называется базой данных.

Базой данных называется контейнер,


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

Каждый раз, когда вы выполняете поиск в Интернете, обращае­


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

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

44 глава 1
да п ы и е 45
п° базам данных
К^оД Ц о Д м и к р о с к о п о м

Посмотрим на базу данных


через Волшебные очки...
/ Х у м а ы т е о б азе
д а нны х как о к о н -
т ем пере, в к от о -
р ом хранит ся
информация.

\лии,а

База данных состоит из таблиц.

Таблицей называется структура, в ко­


/\^ругля торой хранятся данные,упорядочен­
ные по столбцам и строкам.
Помните категории из предыдущего
примера? Каждая категория соответ­
ствует столбцу таблицы. Например,
столбец может содержать одно из зна­
чений: Не женат. Женат, Разведен.
Тоже т аблица. Строка таблицы содержит всю инфор­
И ещ е одна
мацию об одном объекте таблицы.
1^ аблица.
В новой таблице Грега строка содер­
жит полное описание одного челове­
ка. Например, в одной строке могут
Информация в базе храниться следующие данные: Джон,
Джексон, не женат, писатель,
данных делится ]У@Ьоагс15-г-и.8.сот.
на таблицы.

46
цр базам Данных
а А Ш ) т а б л и ц е й

[|иже Вы найдете несколько ка|»п1оЧек и хпаелииу. ^аШ а


Задача — п]=еДона Бишь се^я на Месте частично заполнен­

ной таблиЦы, заполнить п усты е М еста и До­


с т и ч ь п]=*осВетЛения. ^ о Г д а Вы сг^аВитесь

с уп|>ажнением, пер*еВе]=*ните страницу и п р о -


Бер*ьте, удал°сь Ли БаМ Достичь духоБноГо
единения с шаёлиЦей.

Starhuzx Coffee

2 .3 /4

Ouncan's Donuts с вареньШ

s q
2.SM ТАЗ

С вареньем у^оч\ми идеально


с вареньем
8 :s&
вчерашние, но вкусные
^ ‘^рноваты 6

Кп5ру
2 6 /4

2 1 :3 4

о с в- о й т е п о л я м
Прмб
осААЖ леииы е и м ен а.

shop

2 5 /4 5

мало варенья

д а л ьш е к 47
Уур Пр базам двннь1*
а А Ш ) та б л и ц е й . ОшБеш
5ы ДоДЖНь! были т)реДсгпаБи1Г1ь се^я на Месте По содерж им ом у карточек
п о н я т н о , что р еч ь идет
частично Заполненной таблиДы и Заполнить о пончиках с вареньем
пустые места.
j e lly _ d o u g h n u ts

«hop lime dale rating с в т т е п !« ^3


Starbuzz Coffee 7 :4 3 2 -5 /4 9 почти
идеально
Duncan's Donuts g :5 6 4/25 5 жирноваты
Если ваши и м ен а
с т о л б ц о в не с о в п а л и Krispy King Я :ЗЯ p m 4 /Я 6 6 вчерашние^
с н а ш и м и — н и ч ег о но вкусные
ст раш ного. мало варенья
Duncan's Donuts 1 -0 :3 5 p m 4 /Я 4 7

6 базах данных хранится логически связанная информация


Все таблицы в базе данных должны быть так или иначе свя­
заны между собой. Например, база данных с информацией 5аза данных с и м ен ем
о съеденных пончиках может состоять из следующих таблиц: 'i^y^snacks' со ст о и т
из т р е х таблиц.
Имена базы данных и таблиц
обычно записывают ся с и м ­ my_snacks
волами нижнего р егист ра.

Таблица с и н ф о р ­
м ацией о пончиках Таблица с и н ф о р ­
с вареньем . м ацией о пончи­
к ах с г л а з у р ь ю .

У
Таблица с инфор
мацией о других М * м к*
кекс с корицеи
•«й*»
6
Stvbuzz Coffee 22:35 24/4 пряностей
блюдах. V__ 8
Starbuzz Coffee -7-43 23/4
26/4 4
KrtspyKmg 2V39
25/4 простое печенье 9
Є;56

48 г л а в а ,!
1^ ИР базам данных
a S j ju U b i Ц оД у В е Л и Ч и ш е Л ь Н ь Ш с т е К Ц о М

Столбец —фрагмент данных, хранящихся в таблице. Стро­


ка (или запись) —набор столбцов, описывающих атрибуты
одного объекта. Столбцы и строки образуют таблицу.

Перед вами пример таблицы для хранения данных адрес­


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

Ст олбиЫ

----------- 1/ N . ^
fir s f_ n a m e la s f_ n a m e |1 a d d re s s 1 c ity 1 s ta le 1 id _ n u n i 1

Дж о Эппс данные 1 данные 1 данные 1 данные 1

Эл Джонс данные данные данные 1 данные


Строки ■
(записи).
Мэри М оррис 1 данные 1 данные 1 данные 1 данные 1

Лу Грин 1 данные 1 данные 1 данные 1 данные 1

столбцы со ст ро ка м и -
и получаем таблицу. ^

ff ir s t_ n a m e 1аз1_пате a d d re s s С ||у s la te id .n u ln
Дж о Эппс данные данные данные данные

Эл Джонс данные данные данные данные


Мэри М оррис данные данные данные данные

Лу Грин данные данные данные данные

да л ьш е у 49
Выходит, данные с моих карточек
можно преобразовать в таблицу?

Вот именно. Сначала информация о каждом


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

К-атегории (с. 43)

г л
Имй . Профессия ^ Место Ублеч&ния
Фамилия
J J
А ‘>та I Смаилус
I —■■■и .......„ „ I
жительства I: Электронная
----- у^нта f ’......
Ц

Ан Э ж глиН й , - , м т еат р , танирі І^ обйЯ


^ МенЗоса 1Ч/8/1-Ч7Ч Системный За/иужем сан-Ф ранциско, СА an3elina@starhuz7Co{tee. fc Швабот а
ттштят адм инист рат ор

^ Данные одной к а р -
п^очки образуют
строку.
~ s r : = = - “

last_name firsl_name email birthday profession Іосаііоп status interests seeking


Бренсон Энн annie@boards- 1-7-1962 Программист Маунтин- Не заму­ Книги, пешие Новая
г-us.com Вью, СА жем, но прогулки, до­ работа
есть планы машнее пиво
Гамильтон Джейми dontbother® 10-9-1966 Системный Саннивейл, Не женат Туризм, лите­ Друзья,
yahoo.com администратор СА ратура женщины
Скуп Алан fprose® 2-12-1975 Инженер Сан- Женат Ролевые игры Ничего
yahoo.com Антонио, IX
Мендоса Анджелина angel79@ 19-8-1979 Системный Сан-Фран­ Замужем Театр, танцы Новая
gmail.com администратор циско, СА работа

■и что данные каждой


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

50 глава 1
Перед вами несколько баз данных и таблиц. Подумайте, какие категории

Щщдшгтг данных вы бы включили в каждую таблицу.

lib ra ry _ d b
Ьаза данных библиотеки.

books (кншти) :
books
library_patron
(посетители):
libraryJpatron

bank db
5>аза данных банка. ^

customer_info
(клиенты):

bank_account
(с ч е т а ):

bank a cco u n t

o n lin e s to r e db

5аза данных и н т ер н ет -м а га зи н а .
p r o d u c t_ _ in fo

product_info
(товары):

= h ^ « g ,_ o a r t shopping_cart
(корзина):

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

lib ra ry _ d b
Ваза данных библиотеки.

с: books (книт^) : название, автор-, цена,


books номер по каталогу

library_patron
(посетители) : ...

1 i b r а гу _ р а t r o n

bank db
даза данных банка.

customer_info
(клиенты) : ...
''номер 'счета ...........................
bank account
(счета): баланс, депозиты, снятие
средств
bank acco u n t

o n lin e s to r e db

Ваза данных и нт ер нет -м а гази на .


product__info
product info
(товары)” название, р а зм е р , цена
s h o p p in g
r^cart shopping_cart
(корзина) : с у м м а , код клиента

52 глава 1
КоАмидуйте!
Запустите свою систему управления реляционной базой данных SQ L (РСУБД).
Откройте окно командной строки или графическую оболочку для работы с РСУБД.
Наше окно терминала после запуска MySQL выглядит так:

I File Edit Window Help Command^^

Welcome t o th e SQL m o n ito r. Commands end w ith ; o r \g.

Type ' h e l p ; ' o r '\ h ' f o r h e lp . Type '\ c ' to c l e a r th e b u f f e r .

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

Введите следующую команду для создания базы данных с именем g r e g s _ l i s t .

CREATE
CREATE DATABASE gregs_list; Команда д о л ж ­
p a ta b a s e на заверш ат ься
символом « ; »
^<мя б а з ы (точка с запя ­
той).
1 File Edit Window Help CommandMeBaby 1
> CREATE DATABASE g r e g s _ l i s t ;
Query OK, 1 row a f f e c t e d ( 0 .0 1 s e c )

Сообщение от
Р С У 5Д показыва­
е т , что запрос был
ь А вы прочитали Введение?
успеш но выполнен.
Й ды пе Мы используем MySQL для управления
o C lIlo P o JK H b l!
своими базами данных, поэтому команды
вашей системы управления базами дан­
ны х (СУБД) могут выглядеть немного иначе. Инструкции
по установке MySQL на сервере приведены в приложении II.

да л ьш е ► 53
Теп ерь н ео б хо д и м о п р и к азать Р С У Б Д и с п о л ь з о в а т ь
тол ьк о ч то создан н ую базу дан н ы х:
Теп ер ь все последующ ие
операции будут вы пол­
USE gregs_list; няться с базой данных
g r e g s JlS t!
I File Edit Window Help USEful

> USE g r e g s _ l i s t ;
D a ta b a se ch an g ed

_ Чаоцо
_ ЧаДаБаеМые ----------------
БоЦрэСь!

Зачем создавать базу данных, Как выбираются имена баз данных, Разве не правильнее было бы на­
если таблица всего одна? таблиц и столбцов? звать базу данных дгед'з_И81? Почему
в имени нет апострофа?

О Язык SQL требует, чтобы все таблицы


находились в базах данных. Для такого
• Старайтесь выбирать содержатель­
ные имена. Иногда для этого приходится • Апострофы имеют особый смысл
требования имеются веские причины. строить имя из нескольких слов. Пробелы в SQL. Теоретически апостроф можно
В частности SQL позволяет управлять до­ в именах запрещены, но они обычно включить в имя таблицы, но проще обой­
ступом к таблицам со стороны нескольких заменяются символами подчеркивания. тись без него.
пользователей. Предоставить или запре­ Несколько распространенных вариантов:
тить доступ ко всей базе данных обычно
проще, чем управлять доступом для
g r e g s _ lis t
я также заметил символ «;» в кон­
каждой из множества таблиц. д г е д з ііз і це команды CREATE DATABASE. Для
G r e g s lis t чего он нужен?
g r e g s L is t
Команда CREATE DATABASE за­ • Символ «;» является признаком конца
писана символами верхнего регистра. команды.
Это обязательно?
А если я лредпочитаю имя
• В некоторых системах ключевые «gregsList» без подчеркиваний?
слова должны записываться в верхнем Регистр символов
регистре, но в SQL регистр игнорируется. Нет проблем. Здесь важно вы­
Это означает что записывать команды
в верхнем регистре не обязательно, но
брать один стиль и придерживаться его.
Если вы присвоили базе данных имя
и подчеркивания
это считается признаком хорошего стиля.
Взгляните на только что введенную нами
g r e g s L is t без подчеркиваний, а второе
слово начинается с буквы верхнего
упрощают работу
команду: регистра, применяйте эту схему ко всем
CREATE DATABASE g r e g s _ l i s t ; таблицам базы данных — например, программиста
Регистр символов позволяет легко отде­ назовите другую таблицу m yC o n ta cts,
лить команду (CREATE DATABASE) чтобы не нарушать выбранную схему (хотя для 80,1
от имени базы данных ( g r e g s _ l i s t ) .
они не нужны!).
54 рпава 1
Создание таблицы: команда CREATE TABLE
Давайте посмотрим, как создаются
таблицы, на примере данных с описа­
ниями пончиков. Предположим, вы
часто забываете, что означает то или doughnut_li s t
иное название. П росто создайте та­
блицу, и вам не придется ничего запо­ dou9hnel_name doaghnal_lype
минать. Введите приведенную ниже Blooberry с начинкой
команду в консольном окне, а потом Cinnamondo пышки
нажмите ЫЕТиКЫ, чтобы РСУБД вы­
Rockstar хворост
полнила эту команду.
Carameller хворост
Appleblush с начинкой

Имя таблицы
записывается
созЭлкиЯ в ныжнел! р е г и ­
ст ре и может ст роки ^ ^-<0 ^
содерж ат ь ^ У дет п р о щ е
символы подчер
кивания. си се. си н т ак­
Левая круглая скобка ^ .
открывает список ^ ^ ^
столбцов в созда- CREATE TABLE doughnut_list Уи м е н а столбце
оаемой таблице. разаеляЮ 1^ся
зап я т ы м и .
^ (
И м я первого
столбца таблицы. doughnut_name VARCHAR(IO)
И мя второго
doughnut_type VARCHAR(6)
столбца.
)
■ч

А э т о ТИ П Д А Н Н Ы Х . В с т о л б ц а х т .ипа
Правая круглая
V A R C И A R (VA R ІaЫ e С Н А К а с Ы г ) х р а н и т с я
скобка зав ер ш а ет Символ « ; »
т е к с т о в а я ' ^ о р м а ц и я . ^ З а п и с ь ( 6 ) озна -
список столбцов. сообщает Р С У 5Д
ч а ет , что длина т ек ст а не превы ш ает
о завершении
команды. 6 символов.

55
Эй, а как же я? Как создать таблицу для
моей базы данных gгegs_list?

г .

Создание ббАе1‘слоЯ(НЬ1Х таблиц


Помните столбцы таблицы Грега? Мы записали
их на карточке. Эта информация понадобится la s t najvie
вам для построения команды CREATE TABLE. fir s t n a m e
em a il
(birthday
profession
КолАлнЗа C R E A T E T A B L E
п р & в р л т и т эт о ... location
status
interests
seeking
.воил в э т о

/
lasl_name firsf_iiame email birthday prefcssion iocalien •talus interests seelcing

ШТУРМ
Найдите два важных отличия между именами столбцов
на карточке и в таблице. Почему они важны?

56 г пава
Посмотрите, как просто пишется код $01
Иы уже знае те, что для создания таблицы данные необхо­
димо разбить на категории. Затем вы подбираете подхо-
Д Я 1 Ц И Й тип данных и длину каждого столбца. После этого

написать код будет совсем несложно.

Р Во 1ьми В руку карандаш


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

CREATE TABLE my_contacts

las t_name V A R C H A R (30),

first_name V A R C H A R (20),

email V A R C H A R (50),

birthday DATE,

profession V A R C H A R (50),

location V A R C H A R (50),

status V A R C H A R (20),

interests V A R C H A R (100),

seeking VARC H A R (100)

57
- возьми в руку карандаш
Ниже приведены описания каждой строки команды C R E A T E
Решение T A B L E и примеры данных для каждого типа столбца.

CREATE TABLE my_contacts Создаем таблицу с и м ен е м 'my_contacts'

( Начинает список столбцов

last_name VARCHAR(30), Добавляет ст олбец с и м е н е м ’last_name', 'Андерсон'


вмеш,аюш}ли до ЪО символов

first_name V A R C H A R (20), Добавляет, столбец с и м е н е м 'firsts 'Джиллиан'


п ат е', вллеи.4,а'гои4ий до 2-0 символов

email V A R C H A R (50), Добавляет ст олбец с и м е н е м 'email', ']Ш_апсСег5оп@


в м е 1цаюи. 1,ий до 5 0 символов Ьгеакпескр 1т^а.сот'

birthday DATE, Добавляет ст олбец с и м е н е м 'birtWday', '1 Я 2 0 -0 5 -0 Й '


в кот ором хранится дата

profession V A R C H A R (50), Д обавляет ст олбец с и м е н е м 'profession', 'Писатель'


вм ещ а ю щ и й до SO символов

location V A R C H A R (50), Добавляет ст олбец с и м е н е м 'location', 'П а ло -А ль т о ,


6меш,а 1-ош,ий до 5 0 символов Калифорния'

status V A R C H A R (20), Добавляет столбец с и м е н е м 'status', 'Не з ам у ж ем '


вллещающий до 20 символов

interests V A R C H A R (100), Д обавляет ст олбец с и м е н е м 'interests', 'Каяк, т ер р а р и у м '


вм ещ а ю щ и й до 1-00 символов
seeking VARC H A R (100) Д обавляет ст олбец с и м е н е м 'seeking', 'Друзья'
в м ещ аю щ и й до 10 0 символов

) ; Заверилает список столбцов,


а «-,» заверилает команду

/
/ Наконец-то создаем таблицу my.contacts
Теперь вы гочно знаете, что делает каждал строка,
\ и можете ввести команду CREATE TABLE для созда-
' ния таблицы. Команду можно вводить по строкам,
копируя ее из приведенного выше определения.

А можно ввести все в одной длинной строке:


1ХАТБ ТАВ1£ ■ B y _ c o n t« e ta (l« e t_ n a M VARCHAR (ЭО) , f ir e t _ n A M УАЯСШи((гО), « M i l VARCHAR (5 0 ) , b i r t h d a y DATE, p r o C « a a i« o VAROIAA(SO), iM M tle n VAROIAR(SO), a tA tu a VARCBAR(20) , i n t « n a t a (100) . амк1|ц

Какой бы способ вы ни выбрали, прежде чем нажимать П о вер ьт е, это т а самая


RETU RN после «;», убедитесь в том, что вы не пропустили команда. Просто мы записали
ни одного символа: ее ОЧЕНЬ М Е Л К И М ш р и ф ­
l a s t _ n a m e VARCHAR (3 ) — совсем не то же самое, что т о м , чтобы она п ом ест ил а сь
la s t n a m e VARCHAR( 3 0 ) ! на странице!

58
Таблица готова
I h ie td il Window Help AIIDone

> CREATE TABLE my c o n ta c ts

-> la s t_ n a m e VARCHAR( 3 0 ) ,
-> f ir s t _ n a m e VARCHAR( 2 0 ) ,
-> e m a il VARCHAR( 5 0 ) ,
-> b i r t h d a y DATE,
—> p r o f e s s io n VARCHAR( 5 0 ) ,
-> l o c a t i o n VARCHAR( 5 0 ) ,
О б р а м и т е вни­
-> s t a t u s VARCHAR( 2 0 ) ,
мание: нажатие
RETURN после -> i n t e r e s t s VARCHAR( 1 0 0 ) ,
символа « ; » за - \ -> s e e k in g VARCHAR(1 0 0 )
верилает ввод ^ -> ) ;
команды и п р и - Q u e ry OK, 0 row s a f f e c t e d ( 0 . 0 7 sec)
казывает РСУ5/\
выполнить ее.

И что же, все данные должны храниться


в столбцах VARCHAR или DATE?

Вообще-то вам понадобится еще несколько типов


для других видов данных — например для чисел.
Предположим, в нашу таблицу добавляется столбец с ценой
пончиков. Хранить числовые данные в столбце V A R C H A R
неудобно. Значения таких столбцов интерпретируются как
текст, и с ними нельзя будет выполнять математические опе­
рации. Однако существуют и другие типы данных, с которы­
ми мы пока не сталкивались...

Прежде чем двигаться дальше, приведите пару


примеров данных, для хранения которых недоста­
точно типов VARCHAR ИЛИ DATE.

да л ьш е 59
Зиакометбо е типами данных
Перед вами еще несколько полезных типов данных. Их рабо­
та —хранить ваши данные без искажения. С VARCHAR и DATE
вы уже знакомы; пора познакомиться с остальными.

CHAR /W T (или INTEGER) с ч и т а ­


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

™ зн аем .
D K (или peCIMAL> Ki^o эт о ... Так, с л ц ~
o lc c U « e » e w x p o « ^^<лно затесался.
Hue иисел с за д а н н о й
^V^OИHOC^WІЗ^^•
J3LOI3 р а б о т а ем
с бoльuAuл^u б л о ­
ками т екст овы х
Зо вем ся DATETIME данных.
или TIMESTAMP
в зависим ост и
о т РСУВД. Х р а ­
DA ГЕ х р а н и м
нит дату и врем(Г.
дамы - но не 0(5-
Ее родственник
раицает внимания
TIME р а б о т а ет
на время.
только с в р ем енем
без дать 1.

VARCHAR х р й н м т 1ллек-
с то б ы е данные ЗАмиои^
Эо Я 5 5 с и м в о л о в . О м
л и т е м с я ги бкосм ьн^ ,
легко
СЯ к в р е м е н н о « йлине
Эднных. В вашей РСУБД могут исполь­
зоваться другие имена типов!
^Удьщ е
оС щ ороЖ Н ь! К сожалению, о6ш,епринятой си­
стемы имен типов не существует.
В вашей конкретной РСУБД некоторые типы могут
называться по-другому. За информацией о правильных
именах обращайтесь к документации РСУБД.

60 гл ава 1
Выбери 1 С наиболее подходящий гип данных для каждого Количество цифр в ц е л о й
столбца... А заодно заполните другие недостающие данные. и дробной части.

11мя столбца Описание Пример Наиболее яодходящий тип


Цена продаваемого
p r ic e 5678.39 DE C{ 6 , 2 ) ^ ^
товара
zip code О т 5 до 10 символов
atom ic Атомный вес элемента
w eight (с точностью до 6 цифр)
Джо, я на собрании акционеров. В демоверсии
Большой блок т е к и а
comments по экрану летают резиновые утки. Это что, шут­
(длиннее 255 символов) ка такая? На премию можешь не рассчитывать...

Количество единиц
q u a n tity
товара на складе
ta x r a t e Ставка налога 3.755
book t i t l e Название книги Head First SQ L
gender Один символ —М или Ж CHAR(1 )

phone Десять цифр без знаков


number 2105552367
препинания
Двухсимвольное сокра­
s ta te Т Х ,С А
щение штата
a n n iv e rsa ry Дата рождения 11/ 22/ 2006 D ATE

(james won Количество побед в игре IN T

m eeting
Время (и день) встречи 10:30 a.m. 4/ 12/ 2020
t. i me

Част'
'^ а Д а Б а е М ь :.10
Боцр>Сь1

Почему мы не храним все тексто- доступные для VARCHAR и CHAR (но об Это все? Других типов нет?
йые данные в столбцах типа BLOB? этом позднее).
Есть, но эти типы самые важные.
(, • По соображениям эффективности. Конкретный набор поддерживаемых
Столбец VARCHAR или CHAR имеет фик- Зачем нужны разные числовые типов данных также зависит от РСУБД,
( ированный размер, не более 256 сим- типы INT и DEC? поэтому за дополнительной информацией
иолов. Столбец BLOB занимает намного следует обращаться к документации. Так­
Польше памяти. С увеличением объема ! Опять же по соображениям эффек­ же рекомендуем книгу «SQL in а Nutshell»
f)ti:ibi данных может кончиться место тивности. Оптимальный выбор типа (O'Reilly) — это отличный справочник,
ИИ жестком диске. Кроме того, со эначе- данных для каждого столбца таблицы в котором описаны основные различия
ииими BLOB нельзя выполнять неко- уменьшает ее размер и ускоряет работу между разными РСУБД.
|п()ып важные строковые операции, сданными.

61
KT9 И Н В индексе м о ж е т быть
м ен ьш е 1 0 циф р, п о э т
мы использовали VARCH
для экономии м е с м а . Таї
Можно было выбрамь) im,l
Выберите наиболее подходящий тип данных для каждого
CHAR с фиксированной
столбца... А заодно заполните другие недостающие данные.
длиной значения.

Uam cmoA6i(a Описание Промер Н аоб ом е м^ходяцаЗ тип


Цена продаваемого
p ric e 5678.39 DEC(5,2)
товара
z ip _ c o d e О т 5 до 10 символов Я О Я Ю -О О Ю V A R C H A R ( I O ) < ------ ^
a to m ic Атомный вес элемента
4 -.O O Z (b O Z Р Е С (1 0 , 6 )
w e ig h t (с точностью до 6 цифр)
Д ж о, я на собрании акционеров. В демо­
Большой блок текста версии по экрану летаю т резиновы е
comments утки. Это ч то, шутка такая? На премию BLOß
(более 255 символов)
можеш ь не рассчиты вать...

Количество единиц
q u a n tity ЯЗЙ INT
товара на складе
ta x r a te Ставка налога 3.755 Р Е С (4 , Z )
b o o k _ title Название книги Head First SQL V A R C H A R (S O )
gender Один символ —М или Ж М CHAR(1)

phone Десять цифр без знаков


2105552367 C H A R (IO )
number препинания
Двухсимвольное сокра­
s ta te Т Х , СА C H A R (Z )
щение штата
a n n iv e r s a r y Дата рождения 22/ 11/ 2006 D A TE

games won Количество побед в игре 1 S IN T

m e e tin g
Время (и день) встречи 10:30 4/ 12/ 2020 PATETIME /
tim e

Г Телефонный ном ер име


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

62
МОМЕНТЫ

Прежде чем создавать таблицу, разбейте дан­ Таблицы создаются командой c re a te ta b le


ные на категории. Уделите особое внимание с указанием имен столбцов и их типов данных.
выбору типа каждого столбца.
Основные типы данных столбцов: CHAR,
Создайте базу данных, в которой будут хра­ VARCHAR, BLOB, INT, DEC, DATE И DATETIME.
ниться все ваши таблицы, командой c re a te Каждый тип устанавливает свои ограничения
DATABASE. для хранящихся в нем данных.

Используйте команду USE database, чтобы


получить доступ к базе данных и перейти
к созданию таблиц.

Минутку, а где таблица, котору я только что


создала в базе данных дгедз_\'\5^? Хочу убе­
диться в том, что все было сделано верно.

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


Ч тобы п о см о тр е ть , как выглядит создан н ая вами табл и ц а
m y _ c o n t a c t s , восп ол ьзуй тесь ком ан дой DESC для вы во­
д а ее оп и сан и я :

DESC my_contacts;

П о п р о б у й те вы полнить эту команду.

I File Edit Window Help DescTidy

> DESC my c o n t a c t s ;

0<1ЛЫи1г >■ 63
Описание таблицы
На э т и а т р и б у т ы п о к а
Резул ьтат вы полнения команды DESC
не о б р а и ^ а й т е в н и м а н и я ;
вы глядит п р и м ер н о так:
вскоре м ы в е р н ем с я к ним.

Г'П 1 е "Ё ьТ 'window Help DescTidy

> DESC my c o n t a c t s ;

I Column I N u ll I K ey I D e f a u l t I E x tra
+ ------------------------ ---------------------- ■+------------+ — ---- + -------------- ------------+
1 la s t_ n a m e 1 v a rc h a r(3 0 ) 1 YES 1 1 NULL 1 I
1 fir s t name 1 v a rc h a r(2 0 ) 1 YE S 1 1 NULL 1 1
1 e m a il 1 v a rc h a r(5 0 ) 1 YE S 1 1 NULL 1 1
1 b ir th d a y 1 d a te 1 YE S 1 1 NULL 1 1
1 p r o f e s s io n 1 v a r c h a r (S O ) i YE S 1 1 NULL 1 1
1 lo c a t io n 1 v a r c h a r (S O ) 1 YE S 1 1 NULL 1 1
1 s ta tu s 1 v a rc h a r(2 0 ) 1 YE S 1 1 NULL 1 1
1 in t e r e s t s 1 v a r c h a r ( lO O ) 1 YES 1 I NULL 1 1
1 s e e k in g 1 v a r c h a r (1 0 0 ) 1 YES 1 1 NULL 1 1

9 row s i n set (0 .0 7 s ec )

Я забыл включить
в таблицу один важ­
ный столбец. Это еще
не поздно сделать?

y T V P M

А что думаете об этом вы? Какие про­


блемы могут возникнуть при добавле­
нии нового столбца?

64 главд 1
м аГниты с КоДаМи
Код создания базы данных и таблицы с новым столбцом g e n d e r полностью
перепутаны. Сможете ли вы расставить фрагменты в правильном порядке?
Некоторые круглые скобки и символы «;» упали на пол. Они слишком малы,
чтобы их подбирать — добавьте их по своему усмотрению!

b irth d a y da te

USE gregs_list

first_name V3^RCHAR(20)

last name VAR CHAR (30)

in t e r e s t s VARCHAR(100)

seekin g VARCHAR(100)

p ro fe s s io n VARCHAR( 50 )

lo c a tio n VARCHAR( 50 )

CREATE TABLE niY_con t a c t s ^

Когда работа будет закончена, попробуйте ввести новую


команду CREATE TABLE в консоли SQL для создания
таблицы с новы м столбцом gender!

да л ьш е > 65
г .
^ а Г н и т ы с к°ДаМи f^ T E DATABASE '
Вы должны были восстановить .
код создания базы данных / USE gregs_li3 t ^
и таблицы с новым уже
contacts ^
столбцом gencier. сущ ест вует .

“ читайте Залошс...

Нельзя заново создать


существующую таблицу
или базу данных! profession VARCHAR(50)

location VARCHAR(50 ),
Л 6ь! !лог^ь.глалмсь вбеа^ли коМДнЗу
V 'R E A TE TABL-B'^ Тогда вы, иаверног,
status
иже знасп^,е что коллаи?а ыз этого
сцлражнеиия не fyai'^'-vo interests VARCHAR(100),
иовьи< стслд&Оу
seeking VARCHAR(100)
---- ----
Е-сли вь! ввели ко.\'\аидс1 в свосй ) ;
консоли, вероятно, р е з у л ь т а т
выглядел приА^.ерно т а к :

I File Edit Window Help OhCrapI

> CREATE TABLE m y _ c o n ta c ts


-> (
-> la s t_ n a m e VARCHAR( 3 0 ) ,
-> f ir s t _ n a m e VARCHAR( 2 0 ) ,
-> e m a il VARCHAR( 5 0 ) ,
Новый
-> g e n d e r C H A R ( l) ,
столбец
g en d er. —> b i r t h d a y DATE,
-> p r o f e s s io n VARCHAR( 5 0 ) ,
-> l o c a t i o n VARCHAR( 5 0 ) ,
-> s t a t u s VARCHAR( 2 0 ) ,
Ой' П о л учаем co -
-> i n t e r e s t s VARCHAR( 1 0 0 ) ,
общеиме об ошибке.
-> s e e k in g VARCHAR(1 0 0 )
Похоже, таблица
не создалаО}. -> ) ;
ERROR 1 0 5 0 ( 4 2 S 0 1 ) : T a b le 'm y _ c o n t a c t s ' a l r e a d y e x i s t s

66 глава 1
Задаваем ы е -

BoTljoCbi

Почему в упражнении «Развлечения с магнитами»


я получаю ошибку?
5: Можно ли добавить в таблицу забытый столбец или
все придется делать заново?

1 Нельзя создать заново уже существующую таблицу


И после того как база данных будет создана, ее не нужно
О Придется делать заново, но прежде чем создавать та­
блицу с добавленным столбцом gender, необходимо сначала
создавать повторно. Еще одна часто встречающаяся ошиб­ удалить старую таблицу Так как в таблице пока нет данных,
ка — пропущенный завершитель «;». Таюке проверьте, нет просто удалите старую таблицу и начните заново.
ли опечаток в ключевых словах 301.

Почему после определения столбца «seeking А если у меня есть таблица с данными и в нее нужно
^RCHAR(IOO)» нет запятой, как у других столбцов? добавить столбец? Можно ли сделать это без удаления
всей таблицы и повторения ввода?

! Сразу за определением «seeking» следует закрывающая


круглая скобка. Она сообщает РСУБД о том, что список за­ Хороший вопрос! Да, таблицу можно изменить без уни­
вершен, поэтому запятая здесь не нужна. чтожения хранящихся в ней данных. 1\У1ыеще рассмотрим
эту возможность, а пока наша таблица пуста, проще удалить
ее и создать заново.

--------^ ^
Так команду CREATE TABLE придется
набирать повторно? Если бы команды SQL мож­
но было вводить в текстовом редакторе (скажем,
Блокнот или T extE d it), это сэкономило бы нам
немало времени и сил.

Очень правильная мысль. Мы рекомендуем


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

о а л ьш е > 67
Долой старые таблицы!
О Уничтожить старую таблицу куда проще, чем
создать новую. Введите простую команду:

Команда удаления .U имя уЗйляеМои


>ма5лицы
илй(5лмць>1-
...^
И не забудьте
DROP TABLE my_contacts; 'за в ер ш и т е л ь «

I File Edit Window Help ByeByeTabie

> DROP TABLE m y _ c o n ta c ts ;


Q u e ry OK, 0 row s a f f e c t e d (0 .1 2 sec)

К ом анда DROP TABLE работает независимо от


то го , есть в таблице данны е или нет, поэтому Команда DROF
использовать ее следует О Ч ЕН Ь В Н И М А Т Е Л Ь ­
НО. Удаленная таблица пропадает навсегда вме­ TABLE удаляет
сте со всеми данными, которые в ней были.
таблицу со всей
О Теперь можно ввести новую команду CREATE TABLE:
данными!
1File Edit Window Help Success

> CREATE TABLE m y _ c o n ta c ts


-> (
-> la s t_ n a m e VARCHAR( 3 0 ) ,
-> f ir s t _ n a m e VARCHAR( 2 0 ) ,
-> e m a il VARCHAR(SO),
—> g e n d e r C H A R ( l) ,
-> b i r t h d a y DATE,
-> p r o f e s s io n VARCHAR( 5 0 ) ,
-> l o c a t i o n VARCHAR( 5 0 ) ,
-> s t a t u s VARCHAR( 2 0 ) ,
—> i n t e r e s t s VA R C H A R (IO O ),
—> s e e k in g VARCHAR(1 0 0 )
Ня э т о т ряз
1
бее ^олуиилос(?^
-> )
Q u e ry OK , 0 row s a f f e c t e d (0.05 sec)

68 глава 1
Компания ключевых слов и типов данных SQL, облаченных
в маскарадные костюмы, развлекается игрой «Кто я?». Игрок
дает подсказку, а остальные на основании сказанного им пы­
таются угадать, кого он изображает Будем считать, что игроки
всегда говорят правду о себе. Если сказанное ими может
относиться сразу к нескольким персонажам, перечислите всех,
к кому может относиться их высказывание. Заполните пропуски
справа именами одного или нескольких участников.
Сегодняшние участники:
CREATE DATABASE, USE DATABASE, CREATE TABLE, DESC,
DROP TABLE, CHAR, VARCHAR, BLOB, DATE, DATETIME,
DEC, INT
11мя
Поможем с хранением чисел.

Занимаюсь устранением нежелательных таблиц.

Специализируюсь на вопросах Да/Нет.

Помогу запомнить день рождения знакомого.

Во мне хранятся все таблицы.

Числа — это хорошо, но я ненавижу дроби.

Люблю длинные, подробные объяснения.

Место для хранения ВСЕГО.

Без меня таблица не могла бы существовать.

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

Сохранить денежную сумму? Без проблем.

Вывожу описание формата таблицы.

Без нас вы вообще не сможете создать таблицу.

О гоБеты на с. ^ б -

да л ьш е * 69
і^ о Д Ц оД M u K p *o C K °n o M

Ладно, моя таблица готова. И как


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

Для добавления данных б таблицу


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

Ниже приведена не реальная команда, а «заготовка» —


условный шаблон, демонстрирующий формат команды
INSERT.

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


деленных запят ы ми. К-дк бы Имена други
уже з н а ет е, в списке Грега столбцов (за
кмочевы)< слов содержатся столбцы с и м е ­ тая после п(
-JS E R T т О. га Гре^.. нами first_name, last_name, следнего сто
не нужна).
\ ^^Я-C on tacts) email и т. д.

\
INSERT INTO имя_та6лицы (столбеці, столбец2,...)
VALUES ( 'значениеі' 'значение2
Еще одно ключевое
слово-, сообщ ает,
Список значении,
Л Текстовые данные
; А р у г и е зна ч е-
что дальше с л ед у ­ ния (запят ая
разделенных з а п я ­ всегда заклю чаю т ся
ет список зн а ч е- после п о след -
тыми. В базе дан­ в апост роф ы , даже
ним столбцов.
ных Грега список него значения /
отдельные символы
содерж ит данные не нужна).
(н а п р и м ер , 'М '). ^ лоМ
с карточек.

ВАЖНО: значения должны следовать в т о м


же порядке, что и имена столбцов.

70
кто
Прежде чем составлять команду IN S E R T , необходимо устано­
вить соответствие между именами столбцов и значениями.

СТОЛБЦЫ ЗНАЧЕНиЯ

first name 'Д р у з ь я '

status ' Андерсон'

seeking '1980-05-09'

gender ' Писатель'

birthday ' Джиллиан'

last name ' He замужем'

location 'Ж '

interests 'П а л о -А л ьто , Калифорния'

profession ' j ill_ a n d e rs o n @ b re a k n e c k p iz z a . com'

email 'К а я к, террариум'

aa n h iu e f 71
кто
Прежде чем составлять команду INSERT, необходимо устано­
вить соответствие между именами столбцов и значениями.

СТОЛБЦЫ ЗНАЧЕНиЯ

first name 'Д рузья'

Значения т ипа DATE


' Андерсон' должны задаваться
status
в определенном форма
те. За подробностями
обращайт есь к докумеь
seeking '1 9 8 0 - 0 5 - 0 9 '
тации РСУ5/\.

gender 'Писатель'

birthday ' Джиллиан'

last name ' Не замужем'

Не забудьте: даже отдельные


Гж- символы должны заклн^чаться
location
^ ^ в апострофы.

interests 'Пало-Альто, СА'

profession ' j ill_ a n d e rs o n @ b re a k n e c k p iz z a . com'

email 'Каяк, террариум'

72 гл ава 1
Создание команды INSERT
Н аж м ит е RETURN п ер ед о т к р ы ­
вающей скобкой - э т о у п р о с т и т
Ю1^ся за^яте71Мм. чт ение кода в окне консоли

/ INSERT INTO my__contacts ^


______ ______
(last_name, first^name, email, gender, birthday,
profession, location, status, interests,
seeking)
C!A £»1r4 n r r \

VALUES ■ лучше читается.

('Андерсон', 'Джиллиан', 'jill__anderson@


breakneckpizza.com', 'Ж',
breakneckpizza.com' , 'Ж -, '1980-05-09',
■xi^ou-иэ-и» •,
'Писатель', 'Пало-Альто, СА', 'Не замужем'
'Каяк, терра^ум', 'Друзья') ; ^
Значения столбцов п ер е Эиачст« с^:ол1-лов VARCHAR.
или R LO B заключаются в апострофы.
числяются во второй
>^аре скобок и р а з д е л я ­
ю т ся запятыми.

Порядок важен!

У д ь т ц1с
Р пд*»тг Є I Порядок перечисления значений дол-
оСтоорож Ны ' точно совпадать с порядком
^ ’ перечисления столбцов.

По п р о б у й т е Г с а м й

Мы рассмотрели один из способов добавления строк в таблицу. Попробуйте выполнить


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

Оалыие * 73
Вы только что сказали, что значения
CHAR, VARCHAR, DATE и BLOB заключа­
ются в апострофы в командах INSERT. Значит,
для числовых значений (таких, как DEC и IN T )
апострофы не нужны?

Совершенно верно.
Ниже приведена команда INSERT для таблицы
с данными о покупке пончиков. Обратите вни­
мание: числовые значения столбцов d o zen s
и p r i c e записываются без апострофов.

Столбец price и м е е т ти
Столбец dozens и м е е т EC(4,Z ): это означает
іт ип д а н н ы х INT. ч т о его значения состояв
f из чет ы рех цифр с двумя
циф рами в дробной чаете

INSERT INT0\^oughnut_purchase« ^
(donut_type, dozens, topping, price)
VALUES
C c вареньем \ 3 f 'sprinkles', 3.50);

Значения столбцов dozens


и price записывают ся
без апострофов!

74 гпава 1
Возьми в руку карандаш
Ваша РСУБД сообщает об ошибках в командах, но эти сообщения по­
рой выглядят весьма туманно. Взгляните на каждую из приведенных
ниже команд IN SER T. Попробуйте найти ошибку в каждой из ко­
манд, затем введите ее и посмотрите, что скажет РСУБД.

INSERT INTO my_contacts


(last_name, first_name, email, gender, birthday, profession, location, status,
interests, seeking) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson@breakneckpizza.com',
'Ж', '1980-05-09', 'Писатель', 'Не замужем', 'Каяк, террариум', 'Друзья');

Где ошибка?

Что говорит РСУБД:

INSERT INTO my_contacts


(last_name, first_name, gender, birthday, profession, location, status, interests,
seeking) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson0breakneckpizza.com', 'Ж',
'1980-05-09', 'Писатель', 'Пало-Альто, СА', 'Не замужем', 'Каяк, террариум', 'Друзья');

Где ошибка?

Что говорит РСУБД:

INSERT INTO my_contacts


(last_name, first_name, email, gender, birthday, profession, location, status.
Interests, seeking) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson@breakneckpizza.
com', 'Ж', '1980-05-09', 'Писатель' 'Пало-Альто, СА', 'He замужем', 'Каяк, рептилии',
'Друзья');

Где ошибка?

Что говорит РСУБД:

INSERT INTO my_contacts


(last_name, first_name, email, gender, birthday, profession, location, status,
interests, seeking) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson@breakneckpizza.
com', 'Ж', '1980-05-09', 'Писатель', 'Пало-Альто, СА', 'He замужем', 'Каяк, террариум',
'Друзья);

Где ошибка? ...................................................................................... Если на этой команде Р С У 5А

...................................................................
............................................................................... основного кода команды.

да л ьш е ► 75
Р ^ о з ь м и в руку карандаш
V 6Ш6НИ0 Ваша РСУБД сообщает об ошибках в командах, но эти сообщения по­
рой выглядят весьма туманно. Взгляните на каждую из приведенных
ниже команд IN S ER T. Попробуйте найти ошибку в каждой из команд,
затем введите ее и посмотрите, что скажет РСУБД.

INSERT INTO niy_contacts


(last_name, first_name, email, gender, birthday, profession, location, status,
interests, seelcing) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson0brea]cneckpizza.com',
'Ж', '1980-05-09', 'Писатель', 'He замужем', 'Каяк, террариум', 'Друзья');
13 первом списке ecivit> с 1глол5&ц location, а во б т о -
Где ошибка? Н ет значения location. ^ Р^м списке н е т значения э т о г о столёца.

Что говорит РСУБД: О Ш И Б К А 1 1 3 6 ( Z 1 S 0 1 ) : Количество стол6ы,о8 не соответствуе!^


количеству значений Для р а з и ш ошибок выдаются одинако-
.U сообщения. В^дьте вныматбльны:
INSERT INTO my_contacts найти опечатку бывает очень сложно.
(last_name, first_name, gender, birthday, profession, location, status, interests7^\\
seeking) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson@breakneckpizza.com', 'Ж',
'1980-05-09', 'Писатель', 'Пало-Альто, СА', 'Не замужем', 'Каяк, террариум', 'Друзья');
На этот раз все значения заданы, но про-
_ , ,, г 7 пуилен столбец email в списке столбцов.
Где ошибка? Н ет cmoAOi^a e m a i l . ^

Что говорит РСУБД: О Ш И 5 К Л 1 1 3 6 ( Z 1 5 0 1 ) : Количество столбцов не с о о т в е т - ' ^ ^


ст в у е т количеству значений (ст рока 1).
INSERT INTO my_contacts
(last_name, first_name, email, gender, birthday, profession, location, status,
interests, seeking) V7LLUES ('Андер сон', 'Дхошлиан', 'jill_anderson0breakneckpizza.
com', 'Ж', '1980-05-09', 'Писатель' 'Пало-Альто, СА', 'Не замужем', 'Каях, рептилии',
'Д р у з ь я ') ; запятой между значениями столбцов
гт profession и location.
Где ошибка? Пропущена запятая. ^

Что говорит РСУБД: О Ш И 5 К А 1 1 3 6 (2 .1 S 0 1 ): Количество столбцов не с о о т ­


в ет с т в у е т количеству значений (ст рока 1),
INSERT INTO my_contacts
(last_name, first_name, email, gender, birthday, profession, location, status,
interests, seeking) VALUES ('Андерсон', 'Джиллиан', 'jill_anderson0breakneckpizza.
com', 'Ж', '1980-05-09', 'Писатель', 'Пало-Альто, СА', 'He замужем', 'Каяк, террариум'
'Друзья);
Где ошибка? Последнее значение не заверш ает ся апост роф ом.

Что говорит РСУБД: С>Ш И5КА Ю 6 4 (4ZOOO): Ошибка в синтаксисе SQL. О б р а т и т е а


к документации по вашей версии сервера MySQL за описанием син
т аксиса, который должен использоваться рядом с " в ст ро ке 4

76 глава 1
Модификации команды INSERT
У синтаксиса INSERT существует ряд модификаций, о которых следует знать.

О Изменение порядка столбцов


Порядок столбцов можно изменить — при условии, что зна­
чения будут перечисляться в соответствующем порядке!
Порядок перечисления
столбцов изменился.
INSERT INTO ny_contacts
А теперь посм о­
(interests, first_name, last_naine, gender, email, birthday, т р и т е НСХ ЗН ЙЧ ЙН М Я.
profession, location, status, seeking) они перечисляю т ся
в т о м ж е порядке.
VALUES

('Каяк, террариум', 'Джиллиан', 'Андерсон', 'Ж',


'jill_anderson@breakneckpizza.com', '1980-05-09', 'Писатель'
'Пало-Альфо, С А ', 'Не замужем', 'Друзья');

0 Не указаны имена столбцов


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

Имена столбцов можно


INSERT INTO my_contacts
не указы ват ь, но тогда
VALUES необходимо задат ь ВСЕ
значения в ТОЧНОМ
('Андерсон', 'Джиллиан', 'jill_anderson@breakneckpizza. П О Р Я Д К Е их следо-
com', ' Ж ' , '1 9 8 0 - 0 5 - 0 9 ', 'Писатель', 'Пало-Альто, СА',
вания в таблице!
'Не замужем', 'Kasnc, те^^ариум', 'Друзья');

9 Не указаны некоторые значения


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

INSERT INTO my_contacts

(last_name, first_name, email)

^VALUES Ш ТУР М

/ ('Андерсон', 'Джиллиан', 'jill_anderson@


I breakneckpizza.com'); Как вы думаете, что
хранится в столбцах,
которым не были при­
своены значения?
I И'
iCHuu ’необходимо указать имена столбцов.
WIM*

да л ьш е > 77
Столбцы без значений
Давайте вставим п базу данных m y _ c o n ta c ts VALUES:
данные из неполной карточки: ___
Н ет данных о ф а ~
'Пэт'
лАилиы и д а т е р о ж -
Пэил 'деиыя, да и с п о л о м 'patpost@breakneckpizza
н ет особой у в е р е н -
посты. '
flo4yv\aAt>oH
Тйкхе
Ст6аК>»« 3HA4WW, 'Почтальон'
Лринсу^\ои, NJ
patpostShreakneckpizzAiXOVVK - U o A « H » e 5“ «“ '
'Принстон, NJ '

Так как на карточке часть данных отсутствует,


Грегу придется ввести неполную информацию.
Но в этом нет ничего страшного, недостающие f t ? " “ “ « а « ™ « е с р с и , Ш 51
с неполны м н а бо р о м зт ч ен и й
сведения можно будет добавить позже.
Ц Ц о л я ю щ а я з а д а т ь m oZ T o
и звест н ы е значения столбцов.

INSERT INTO my_contacts /


(first_name, email, profession, location)
VALUES
('Пэт', 'patpost0breakneckpizza.com',
'Почтальон', 'Принстон, NJ ');

I File Edit Window Help MoreDataPlease

> INSERT IN TO m y _ c o n ta c ts ( f i r s t _ n a m e , e m a i l , p r o f e s s i o n ,
l o c a t i o n ) VALUES ( ' П э т ' , 'p a t p o s t 0 b r e a k n e c k p iz z a .c o m ',
'Почтальон', 'Принстон, N J ');
Q u e ry OK, 1 ro w a f f e c t e d (0.02 sec)

78 гла ва 1
Команда SELECT читает данные
из таблицы
Хотите посмотреть, что у вас получилось? Команда DESC
уже не подойдет —она выводит только структуру таблицы,
но не хранящуюся в ней информацию. А для вывода дан­
ных, хранящихся в таблице, используется команда выборки
SELECT.

Мы х о т и м вы­
брат ь все дан­
ные из таблицы... .. збезЗоика им енно
эт о м означает:
^ выбрать ВСЕ- таблицы.

SELECT * FROM my__contacts;

Для нас пока несуще­


Ж Л Ш ТЕ О ) ственно, как работает
команда SELECT.
Эта команда будет подробно рассмотрена в гла­
ве 2. А пока просто расположитесь поудобнее и
насладитесь красотой созданной вами таблицы.

Попробуйте сами. Вероятно, для просмотра результатов


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

ШТУРМ
Итак, в столбцах, которым не присвоены
значения, выводится n u l l . Как вы думаете,
что это значит?

дальш е > 79
СЗБ SG jj-
Интервью недели:
/ Т Признания NULL

Head First: Добро пожаловать, N ULL. Чест­ Head First: Успокойтесь и давайте разберем­
но говоря, немного странно видеть вас здесь. ся. Вы не равны нулю, вы не равны пустой
Мы даже не думали, что вы действительно строке. И вы даже не равны самому себе! Как-
существуете. По слухам, вы — просто нуль, то это странно, вы не находите?
то есть вообще ничто.
NULL: Знаю, это нелегко понять. Считайте,
NULL: И вы поверили этой грязной лжи? Да, что я не определен. Я — как содержимое за­
я здесь, и я абсолютно реален! А вы, значит, крытой коробки, в которой может лежать
думаете, что я — ничто, пустое место? все что угодно. Сравнивать одну закрытую
коробку с другой нельзя, потому что вы не
Head First: Спокойно, спокойно... Просто
знаете, что лежит в этих коробках. Они во­
вы всегда появляетесь там, где нет значения...
обще могут быть пустыми. Что внутри — неиз­
NULL: Еще бы —уж лучше я, чем нуль или, вестно.
скажем, пустая строка.
Head First: Говорят, иногда ваше присутствие
Head First: Пустая строка?.. нежелательно. В некоторых ситуациях NULL
создает проблемы.
NULL: Значение из двух апострофов, между
которыми нет ни одного символа. Оно все NULL: Признаю, бывали и неприятные си­
равно рассматривается как текстовая строка, туации. Н екоторые столбцы всегда должны
но имеющая нулевую длину. Скажем, как иметь определенное значение — например,
если бы столбцу f i r s t name в таблице столбец фамилии. Бессмысленно создавать
my c o n ta c ts было присвоено значение ". в таблице описание человека с неопределен­
ной фамилией.
Head First: Выходит, вы не просто хитроум­
ный синоним для «ничто»? Head First: Так вы не будете появляться там,
где вас не должно быть?
NULL: Говорю же, я не «ничто»! Я есть! Про­
сто мое состояние немного... неопределен­ NULL: Точно! Только скажите! При создании
ное. таблицы и определении столбцов укажи­
те: в этом столбце N ULL быть не должно.
Head First: Выходит, если сравнить вас
И я там не появлюсь.
с нулем или пустой строкой, вы не будете им
равны? Head First: Вообще-то вы не похожи на за­
крытую коробку.
NULL: Н ет! Я никогда не равен нулю. Более
того, я даже не равен какому-нибудь другому NULL: С меня хватит. Извините, мне пора —
NULL. Сравнивать два N U LL между собой у меня куча дел.
нельзя. Столбец может содержать N ULL, но
его значение никогда не равн о NULL, по­
тому что N ULL —неопределенное значение!
Понимаете?

80 глава 1
Управление NULL 6 таблицах
11екоторые столбцы в таблице всегда должны иметь определенное зна­
чение. Помните неполную карточку, в которой стояло только имя П эт
без фамилии? Когда в вашей таблице еще два десятка записей с N ULL
вместо фамилии, найти такую запись будет трудновато. К счастью,
иы можете легко запретить присваивание N ULL столбцам таблицы.

Просто добавьте слова


CREATE TABLE my__contacts
/
NOT NULL после т ипа
данных.
(
Значение такого
last_name VARCHAR (ЗО) NOT NULL, столбца должно быть
указано в команде
first name VARCHAR (20) NOT NULL IN S E R T. В противноЛ'\
случае РСУВА выдаст
) ; сообш,ение об оилибке.

Возьми в руку карандаш


Взгляните на столбцы таблицы
my_contacts в команде CREATE
CREATE TABLE m y _ c o n ta c ts TABLE. Какие из них следует снабдить
условием NOT NULL? Подумайте,
( какие столбцы никогда не должны со­
держать NULL, и обведите их кружком.
last_name VARCHAR(30) NOT NULL,
Мы уже выделили два таких столбца;
first name V A R C H A R (20) NOT NULL, разберитесь с остальными. Обращайте
VARCHAR (50) особое внимание на столбцы, которые
позднее будут использоваться для
gender CHAR(l), поиска или содержащие уникальные
значения.
birthday DATE,

profession V A R C H A R (50),

location V A R C H A R (50),

C^ggEus VARCHAR (2dT7l:>

interests V A R C H A R (100),

seeking VA R C H A R (100)

) ;

да л ьш е * 81
Р Возьми в руку карандаш
Взгляните на столбцы табли­
цы m y _ c o n t a c t s в команде
CREATE TABLE my_contacts CREATE TABLE. Какие из них следует
снабдить условием NOT NULL? Поду­
( майте, какие столбцы никогда не должны
содержать NULL, и обведите их кружком.
'last_name V A R CHAR(30) NOT NU L L >
Мы уже выделили два таких столбца;
first_name V A R C H A R (20) NOT NULL, разберитесь с остальными. Обращайте
email VARCHAR(50), особое внимание на столбцы, которые
позднее будут использоваться для поиска
gender CHAR(l), или содержащие уникальные значения.

birthday DATE,
profession V A R C H A R (50),
Все столбцы должны быть
location V A R C H A R (50),
объявлены с ключевыми с л о ­
status V A R C H A R (20), вами NOT NULL.

interests VARCHAR(IOO),

seeking V A R C H A R (100) 8 6 £ столбцы таблицы будут и с п о л ь ­


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

НП er.Au в таблице е с т ь столбцы, к о т о ­


рые будут заполняться позднее, для
ст.олбцов с т о и т р а з р е ш и т ь значения N U L L .

82
NOT NULL 6 Выходных данных DESC
Л нот как будет выглядеть таблица my c o n t a c t s , если объявить все
( голбцы с ключевыми словами NOT NULL:
I File Edit Window Help NoMoreNULLs

CREATE TABLE m y _ c o n ta c ts

(
la s t_ n a m e VARCHAR(3 0 ) NOT NULL,

f ir s t _ n a in e VARCHAR(2 0 ) NOT NULL,

e m a il VARCHAR(5 0 ) NOT NULL,

g e n d e r C H A R (l) NOT NULL,


Команда созда­
ст. таблицу, b i r t h d a y DATE NOT NULL,
Ч Которой
p r o f e s s io n VARCHAR(5 0 ) NOT NULL,
(^се с т о л б ­
цы объявлены l o c a t i o n VARCHAR(5 0 ) NOT NULL,
с NOT NULL
s t a t u s VARCHAR(2 0 ) NOT NULL,

i n t e r e s t s VARCHAR(IOO) NOT NULL,

s e e k in g VARCHAR(1 0 0 ) NOT NULL

Q u e ry OK, О row s a f f e c t e d (0.01 sec)

> DESC my c o n t a c t s ;
------------------ .+---------------------- - + ----
Column 1 Type 1 Nu
N u ll I Key I D e fa u lt ! E x tra |
.X
T ——
la s t_ n a m e 1 v a r c h a r (3 0 ) 1 NO
Описание f ir s t _ n a m e 1 v a rc h a r(2 0 ) 1 NO
>маблицы. e m a il 1 v a rc h a r(5 0 ) 1 NO
О брат ит е gender 1 c h a r (1 ) 1 NO
вним ание b ir th d a y 1 d a te 1 NO
ка слово NO
p r o f e s s io n 1 v a rc h a r(5 0 ) 1 NO
в столбце
null. lo c a t io n 1 v a rc h a r(5 0 ) 1 NO
s ta tu s 1 v a r c h a r (2 0 ) 1 NO
in te r e s ts 1 v a r c h a r ( lO O ) 1 NO
s e e k in g 1 v a r c h a r ( lO O ) 1 NO

10 row s i n set (0.02 sec)

дал ьш е > 83
DEFAULT u значения no умолчанию
Если в столбце часто хранится какое-то одно конкретное значе­
ние, ему можно присвоить значение по умолчанию при помощи
ключевого слова DEFAULT. Значение, следующее за DEFAULT, ав­
томатически заносится в таблицу при каждом добавлении новой
записи — если не задано другое значение. Значение по умолчанию
должно соответствовать типу данных столбца.
Э т о м ст олбец В С Е Г Д А
должен содерж ат ь значение.
Д л я этого мы не т оль ­
CREATE TABLE d o u g h n u t _ li s t ко объявляем его с к л ю ч е ­
выми словами NOT NULL,
( но и присваиваем значение
по умолчанию 1 .
doughnut_name VARCHAR(10) NOT NULL,
doughnut_type VARCHAR(6) NOT NULL,
doughnut_cost DEC(3,2) NOT NULL DEFAULT 1.00
);
Значение м о ж е т содерж ат ь
/
Это значение сохраняется
до 3 цифр: одна до и две после в ст олбце doughnut_cost, если
запятой. в команде INSERT не указано
другое значение.

d o u g h n u t_ lі s t

doHghnuf_name deughnul^type deughiiHl.cosf


Blooberry с начинкой 2.00
Cinnamondo пышки 1.00
Rockstar хворост 1,00 Условие DEFAULT
Carameller
Appleblush
хвороа
с начинкой / ' / 1.40
заполняет пустые
7 столбцы заданным
Так будет выглядеть таблица, если при значением.
вставке данных пончиков Cinnam ondo,
Rockstar и Caram eller не указывать
значение столбца doughnut_cost-

84 -■.лава 1
КЛЮЧЕВЫЕ
МОМЕНТЫ
У Новые инструменты
Мы подошли к концу главы 1.
Для вывода описания структуры таблицы
Вы научились создавать
используется команда desc .
базы данны х и таблицы
Команда d ro p ta b le уничтожает таблицу и вставлять в них данные некоторых
со всем содержимым. Будьте внимательны!
распространенных типов. Кроме того,
Для сохранения данных в таблице исполь­ вы знаете, как обеспечить наличие
зуется команда in s e r t , которая существу­ определенного значения у столбца.
ет в нескольких вариантах.

NULL — неопределенное значение, которое


не равно нулю или пустой строке. Для
столбца, содержащего n u ll, выполняется CREATE TABLE
условие IS NULL, но при этом он не равен
NULL. « Я Й Л « !«
НО для ее выполнения н е ­
Столбцы, значение которых не указано обходимо знат ь ИМЕНА ,
в команде in s e r t , по умолчанию инициа­
лизируются NULL.

Чтобы запретить хранение n u l l в столбце,


используйте ключевые слова NOT NULL
при создании таблицы.

Условие DEFAULT определяет знэчение по


умолчанию — если при заполнении табли­ d ro p ta b le
цы значение столбца не указано, он авто­
матически заполняется этим значением.

n u ll U NOT NULL
При создании, базы данных следует «««S
in s e r t
tХоманд
зн а т ь , какие столбцы не должны
пш ним ат !? значение n u l l — э т о
ипрост ит сортировку и поиск дан
HWX. Условие NOT NULL здЭлется а л я
б азу
столбцов при создании таблицы.
Y~oM<
DEFAULT
О пределяет значение по умолча­
нию для столбца; оно использует ся
в т ом случае, если значение столбца
не указано при вставке строки.

д а л ь ш е *■
Компания ключевых слов и типов данных SQL, облаченных
в маскарадные костюмы, развлекается игрой «Кто я?». Игрок
дает подсказку, а остальные на основании сказанного им пы­
таются угадать, кого он изображает. Будем считать, что игроки
всегда говорят правду о себе. Если сказанное ими может
относиться сразу к нескольким персонажам, перечислите всех,
к кому может относиться их вьюказывание. Заполните пропу­
ски справа именами одного или нескольких участников.
Сегодняшние участники:
CREATE DATABASE, USE DATABASE, CREATE TABLE,
DESC, DROP TABLE, CHAR, VARCHAR, BLOB, DATE,
DATETIME, DEC, INT
11мя
Поможем с хранением чисел. P E C , INT

Занимаюсь устранением нежелательных таблиц. PROP TABLE


............................ '^.'.^''Аополнип
Специализируюсь на вопросах Да/Нет CHARf%)
...........'^ö'Siявцл Гг
Помогу запомнить день рождения знакомого. РА JE ^•

Во мне хранятся все таблицы. CREATE DATABASE

Числа — это хорошо, но я ненавижу дроби. INT

Люблю длинные, подробные объяснения. BLOß

Место для хранения ВСЕГО. CREATE TABLE

Без меня таблица не могла бы существовать. CREATE DATABASE

Точно знаю, когда вам нужно явиться к врачу на следующей неделе. ETIME

Сохранить денежную сумму? Без проблем. РЕС

Вывожу описание формата таблицы. PESC

Без нас вы вообще не сможете создать таблицу CREATE PATABASE,


U S E P Ä T A B Ä S E .......................
PROP TABLE

86
2 Команда m j

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

При работе с базами данны х операция выборки обычно


выполняется чаще, чем операция вставки данных в базу. В этой
главе вы познакомитесь с могущественной командой SE L E C T
и узнаете, как получить доступ к важной информации, которую
вы сохранили в своих таблицах. Также вы научитесь использовать
условия W H E R E , A N D и OR для избирательной выборки данных
и предотвращения вывода ненужных данных.
трудный поиск
Грег наконец-то перенес все данные из своей картотеки
в таблицу m y _ c o n ta c ts . Теперь ему хочется отдохнуть.
Он раздобыл два билета на концерт и хочет пригласить
одну из своих знакомых —девушку из Сан-Франциско.

Чтобы найти ее адрес электронной почты, Грег просматри­


вает содержимое таблицы командой SELECT из главы 1.

SELECT * from my__contacts ;

Даниіне хранятся
в таблице Грега...
где -mo.

( Т А Ш )

епер*ь П о с т а в ь т е се^я на М еоп» jj^ e f a . ]=осм°ііір*иігіе

наЧаЛо т а б л и Д ь ! m iJ_coii(acIs на сЛелуї^Щей c m j’anuile

U Л о>л|>оЄушііЄ
т наш ци Б ней ^ н н из «^ранЦисКо.

88 г.Пг1ва 2
лишь> начало таолиць!-
\

,, ещ е не конец! у Г р « . ^
, , ( | Е Н Ь М Н О Г О карточек.

дальш е > 89
ш а н ь J p e ro M . Q n iB e ïïi

Д°лжнь1 были т1реДапаБилзь Тот, Энн: Anne_Toth@leapinlimos.co,


ce^ff на М е сте ]"р*еГа, п р о —
Харди, Энн: anneh@ bO ttO m sup.com
сМотпр’етпь наЧаЯо таблиДы
тпу_сог]1ас1в, н а й т и Всех "^hh
Паркер. э„„: «>^пер&иагЬ^;^со(есе.со^
и з (^ан—с Э|>анЦисКо и За­

п и с а т ь и х имена, «фами­
5 л а н т , Энн: anneЫunt@дhreakneckpizza.co^^
лии U a A j’ e ca эЛeкm J^ннoй

поЧты.

Р азн о е Энн и адреса их


электронной nonmi^i.

ищем контакт
Поиск занял с л и шком много времени
и был исключительно нудным. Также
существует весьма реальная опасность того, То: Тот, Энн <Anne_Toth@leapinlimos.com>
что Грег пропустил пару-тройку подходя­ From: Грег <greg@gregslist.Gom>
щих Энн, включая ту, которую он ищет.
Subject: Мы встречались в Starbuzz?
Зпая адреса электронной почты, Грег рас­
сылает сообщения и получает ответы... Я сейчас встречаюсь с отличным парнем, его
зовут Тим Вудман. Мы встретились на студенче-
ской вечеринке.
То; Блант, Энн <anneblunt@breakneckpizza.com>
То: Харди, Энн <anneh@bOttOmsup.com>
From: Грег <greg@gregslist.com> From: Грег <greg@gregslist.com>
Subject: Мы встречались в Starbuzz? Subject: Мы встречались в Starbuzz?

Ковбой, ты-то мне и нужен! Заедь за мной в пять Я не та Энн, которую ты ищешь, но я уверена,
зайдем куда-нибудь перекусить. что она того стоит. Если что-то не срастется —
напиши мне.

То: Parker, Anne <annep@starbuzzcoffee.com>


From: Greg <greg@gregslist.com>
Subject: Мы встречались в Starbuzz?

ÜJTVPM Конечно, я тебя помню! Жаль, что ты не написал


раньше. Я уже договорилась с моим бывшим па[
Сможете ли вы написать запрос 8 0 1
нем, который хочет начать все заново.
для выборки только тех записей,
у которых столбец f ir s t _ n a m e
содержит строку «Энн»?

90
Улучшенная команда SELECT
( 1л<!лующая команда SELECT поможет Грегу отыскать данные Энн намного
Лы( трее, чем при дотошном просмотре всей огромной таблицы. В этой
команде мы используем условие WHERE, кот орое уточняет критерий от бора
мписей для РСУБД. Условие сужает результаты поиска, а команда возвра-
|||яст только те записи, для которых это условие выполняется.

Mii.iK = в условии WHERE означает, что каждое значение столбца


I 1 I . ;t_nam e проверяется на равенство с текстом ' Э нн '. Если два значе­
нии равны, то вся запись включается в результат выборки. Если нет —
|.1 мись пропускается.

[/ІДДЯ т аблиці?!
Поставьте с и м ­
/ вол « : » и нажлли-
^ е RETURN, чтобь,
SELECT * FROM my contacts выполните,' з а п р о с :
. « Е сл и ст олбец first
п а т е содерж ит
IRE first__name = 'Энн'; имя « Э н н » , пока ~
за т ь запись>'-.
ч
|. лючебое слово
в условии WHERE - н а языке
это означает, SQL это Значение столбца first^namx.
I I'VBA, что команда п р о ­ означает Не забудьте, что т е к с т о ­
веряет значения «равно вые значения должны заклю ­
I, і іллаблицм п о д
столбца с и м ен ем чаться в апострофы.
м н о ж е с т в о за^-o.ceu.
tirst^ n am .e.

И ;г1()м окне консоли показан результат запроса — подмножество


|.итсей, у которых столбец £ ir s t_ n a m e содержит значение ' Энн '.

IГ*1 I СІІІ Window Неїр' моОа^^

SELECT * FROM niy_contacts WHERE first_name = 'Anne' ; ,

I l»«t_nanie i first_name I email 1 gender | birthday | location I


Тот і Энн 1 Anne Toth@leapinlimos.com | Ж 1 NULL 1 Сан-Франциско, СА|
Мэнсон 1 Энн 1 am86@objectville.net 1 Ж i NULL 1 Сиэтл, WA 1
Харди І Энн 1 anneh@bOttOmsup.com | Ж i NULL 1 Сан-Франциско, CA1
Паркер 1 Энн 1 annep@starbuzzcoffee.соті Ж 1 NULL I Сан-Франциско, CA1
ВланФ 1 Энн і anneblunt@breakneckpizza.ccm| Ж I NULL 1 Сан-Франциско, СА|
Джейкобс 1 Энн I anne99@objectville.net | Ж 1 NULL 1 Сан-Хосе, СА 1
_ + ---------------------------------
rows in set (3.67 sec)
/1^ Р езульт ат выполнения
команды SELECT

91
Минутку, вы же не думали, что я не замечу
знак * ? Что он здесь делает?

Что это за * ?
Звездочка ( * ) приказывает РСУБД вернуть зна­
чения всех столбцов таблицы.

SELECT * FROM my_contacts


WHERE fi ^ t name = 'Энн';

Когда вы видите S E L E C T *
сч и т а й т е, что эта к о н - '

Р ^ У б Д вернут ь ^
ВСЕ СТОЛБЦЫ.

Часто
_ ЧаДаБаеМые ---------------
Бо1]|оСь1
узнаете, как ограничить выборку частью
А если я не хочу включать столбцов, чтобы с результатом было про­ yj- В SQL есть и другие специальные
в выборку все столбцы? Можно ли ще работать. зарезервированные) символы. Мы ей
использовать что-то другое вместо встретимся с ними позднее в этой КНИІ
звездочки? А пока вам достаточно знать только о^
Есть ли другие символы, которые, специальный символ — звездочку. То;
Да, можно. Звездочка выбирает все как и звездочка, имеют специальное этот специальный символ используете
столбцы, но через несколько страниц вы значение? в части SELECT команды SQL.

92 глава 2
Бар Head First Lounge включает в свое меню фруктовые коктейли. Используя то,
что вы узнали в главе 1, создайте таблицу и вставьте в нее приведенные ниже данные.
ажнение
Таблица входит в базу данных с именем drinks. База данных содержит таблицу
easy_drinks с рецептами напитков, состоящих всего из двух ингредиентов.

e a s y d r in k s

гігіпк_пате main amounti second amounts directions


Терновник тоник 1.5 ананасовый сок 1 взболтать со льдом, разлить по б ока­
лам, украсить лимонной цедрой
Голубая луна содовая 1.5 черничный сок 0.75 взболтать со льдом, разлить по б ока­
лам, украсить лимонной цедрой

Вот тебе на персиковый 1 ананасовый сок 1 взболтать со льдом,


нектар разлить по стаканам
Лаймовый Спрайт 1.5 сок лайма 0.75 взболтать со льдом,
физз разлить по бокалам
Поцелуй вишневый 2 абрикосовый 7 подавать со льдом и соломинкой
сок нектар
Горячее золото персиковый 3 апельсиновый 6 влить в круж ку горячий апельсино­
нектар сок вый сок, добавить персиковый нектар
Одинокое содовая 1.5 вишневый сок 0.75 взболтать со льдом,
дерево разлить по бокалам
Борзая содовая 1.5 грейпфрутовый 5 подавать со льдом,
сок тщательно взболтать
Бабье лето яблочный 2 горячий чай 6 налить сок в кружку,
сок добавить горячий чай
Лягушка холодный 1.5 лимонад 5 подавать на льду с ломтиком лайма
чай
Сода плюс содовая 2 виноградный 1 взболтать в бокале, подавать без льда
сок

Знаиени.я a m o u n t i u а т о и ^ іг
з а д а ю т с я в унцыях.

-------------------------^ OmBero на с. ]§|.

Не жалейте времени на планирование.


5У Д Ьіц Є Тщательно выбирайте типы данных
о С 2 ї1 о ]= Ь ж Н ь і! и не забывайте о n u l l . Затем проверьт е
свой ко д на с. 151.

93
Р ьозьми в руку карандаш
Подучите сбой напиток
в запросах Воспользуйтесь только что созданной таблицей
£cAW о [goAfcii — не ОССлОК easy_drinks и проверьте эти запросы на своем
CW/^ lл.0CM0^^P^^ ' компьютере. Запишите, какие напитки вернет каждый
зап р ос,

SELECT * FRC»1 easy_drinks WHERE main = 'Спрайт';

Какие напитки?...................................................................................

SELECT * FROM easy_drinks WHERE main = содовая;

Какие напитки?...................................................................................

SELECT * FROM easy_drinks WHERE amount2 = 6;

Какие напитки?...................................................................................

SELECT * FROM easy_drinks WHERE second = "апельсиновый сок";

Какие напитки?...................................................................................

SELECT * FRCM easy_drinks WHERE amounti < 1.5;

Какие напитки?...................................................................................

SELECT * FROM easy_drinks WHERE amount2 < '1';

Какие напитки?...................................................................................

SELECT * FROM easy_drinks WHERE main > 'содовая';

Какие напитки?

SELECT * FROM easy_drinks WHERE amounti = '1.5';

Какие напитки?

94 глава 2
Один момент... Вы говорите: «Проверьте
эти запросы». Значит, предполагается,
что все они работают. И я вам поверила!
Но один запрос вообще не работает,
а еще несколько выглядят сомнительно.

Да, вы абсолютно правы.


Один запрос вообще не работает.
А несколько других работают, хотя
ироде бы и не ДОЛЖ1П.1.

Вопрос на повышенную оценку: напишите, какой запрос не работает.

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

95
возьми в руку карандаш- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Решение Получите сбой напиток
Итак, вы воспользовались таблицей еазу_с1г±пкз,
проверили запросы на своем компьютере и записали
какие напитки вернет каждый запрос.

SELECT * F R ^ easy^drinks WHERE main = 'Спрайт';


/V "V ___________ . o S p a m u ^ e вним ание
Какие напитки? Л ( { Ш 0 . 6 т . ф и ^ . З .......................... ____________________ _a nOCmpo<pt?i-

SELECT * FROM easy_drin]cs WHERE main = содовая;


Xm... П о х о ж е , э т о т з а п р о с _________----------
Какие н а п и т к и ? . . ..................бь(полняться_^н^^ ■

SELECT * FROM easy drinks WHERE amount2 = 6; A .L,^г^CЯ К --


дденная OIA
Какие напмткм?. .ГарЯНС£. залошо.. 3.аб.(?.е.ле>У[0................... 1л О Э тО ^У

SELECT * FROM easy_drinks WHERE second = "апельсиновый сок";

Какие напитки? Г о р я ч е е з о л о т о

SELECT * FRCM easy_drinks WHERE amounti < 1.5;

Какие напитки?..S o m т е б е н а ...................................................

SELECT * FROM easy_drinks WHERE amount2 < '1';

Какие напитки? Голс^(5ая л^на, Лдй/Ирбы дерево

SELECT * FROM easy_drinks WHERE main > 'содовая'; ^ щ е однО правильно


^ сф орм улированное
Какие напитки? Т е р н о в н и к , Л а й м о в ы й ф и з з у с л о в и е WHERE-

SELECT * FROM easy_drinks WHERE amounti = '1.5';

Какие напитки? Т е р н о в н и к . Г о л у б а я л у н а , Л а й м о в ы й ф и з з , О д и н о к о е д е р е в о , Е>орзая, Л я г у 1

96 глава 2
Вопрос на повышенную оценку: напишите, какой запрос не работает...

« « < ^ о ст р с ф 1
WHERE main = содовая;

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

WHERE second = "апельсиновый сок";

у и Ьставке значения использовались


апост роф ы вм ест о кавычек..

WHERE amount2 < '1';


р б Г н е и а *и о “ К Л К .« - »
б й1аОС1Алроф^.

WHERE amounti = Ч . 5 Ч тожеммое'

Последние два запроса работают, потому что РСУБД обычно прощают


незначительные ошибки пользователей. Они игнорируют апострофы
и рассматривают значения DEC и I N T как числа, хотя апострофы определяют
их как текст. Эти запросы НЕПРАВИЛЬНЫ, но РСУБД исправляет вашу ошибку.

да л ьш е ► 97
Как запрашивать разные типы данных
Чтобы написать правильное условие W HERE, необходимо правильно от­
форматировать каждый из входящих в него типов данных. Ниже пред­
ставлены правила форматирования для всех основных типов.

(или in t e c :;e r )
никогЭд не закльочается
агр.р.да злкл
ßce-zda в апострофы.

>^ак /V
ПЕС (с о к р а м е н и е .
PEC 1M A Ü нм -
^^огда не з а к л ю и а -
е т с я б кавычки
BLOß всегда
заключается
в апострофы.

• '^ 1 Е , Л М г'
■ 'nM ESJA ^■;p
заклю - Зйключде ил
ч а ьо т ся 6 а-ло - СЯ в ^1^0СИЛрофы.
'■'^'’'Лрофь!

VARCHAR всегда
заключается
в апост роф а'- Типы данных УАКСШ
CHAR, BLOB, DATE
Мы ^ апострофы A MW нет и TIME записываются
CHAR PEC в апострофах.
1 1
VARCHAR INT
PATE
Числовые типы DEC
PATETIME, TIME, TIMESTAMP и INT записываются
BLOß без апострофов.
98 глзва 2
проблемы со знаками препинания Фанион
рождения,
Грег нашел еще нескольких знакомых. Он пытается Панк
ик.;1 ючить одного из них в свою таблицу; Не жеилт

2 ^ ^ io n fla v o r e d r in g B .c o ^

увлечения: букилйрстбо

и щ е т : едииомышлеитки,
INSERT INTO my_contacts гил^арисі^і^і

VALUES
(’Фанион’,’Стив', ’steve0onionflavoredrings.com’,'М',
'1970-01-04\ 'Панк Гровер' Милл, NJ', 'Не женат',
'бунтарство', 'единомышленники, гитаристы');

11<) его РСУБД почему-то не отвечает. Грег вводит несколько символов


пытаясь завершить обработку запроса. Безуспешно.

I File Edit Window Help AliensI

> INSERT INTO m y _ c o n ta c ts VALUES ( ' Ф а н и о н ' , ' С т и в ' , ' s te v e 0


o n i o n f l a v o r e d r i n g s . c o m ', ' M ' , ' 1 9 7 0 - 0 4 - 0 1 ' , ' П а н к ' , 'Г р о в е р '
Милл, NJ ' , 'H e ж е н а т ' , ' Б у н т а р с т в о ' , ' Единомышленники,
ги та р и с ты ' ) ;

Г^\
Р а згл а ш ен и е: '> •: X *
WTVPM
Как вы думаете, что происходит?

99
Хм, а почему перед приглашением постоянно вы­
водится апостроф? Наверняка какие-то проблемы
с anocTpoqpoMH в команде INSERT...

Непарный апостроф
Точно! Когда Грег попытался вставить запись, РСУБД ожидала уви
четное число апострофов —по одному до и после каждого значени
VARCHAR, CHAR и DATE. Название города Гровер' Милл породило п;
вицу, потому что в нем содержится лишний апостроф. РСУБД хож
получить еще один закрывающий апостроф.

грр/-™ вернуть консоль под свой контролі


1 Іліліа" ИЛ-У" аЬЧаV
Завершите команду — введите апостроф
и точку с запятой. РСУБД получает допол
РСУВД выдаст со - нительный апостроф, который ожидает получить.
общение об ошибке,
но попробовать все Правда, при этом будет выдано сообщение об ошибке, и вам при
равно ст оит . дется вводить команду INSERT заново.

I File Edit Window Help TakeTwo

> INSERT IN TO m y _ c o n ta c ts VALUES ( ' Ф а н и о н ' , ' С т и в ' , ' Steve@


o n io n f l a v o r e d r i n g s . c o m ', ' M ' , ' 1 9 7 0 - 0 1 - 0 4 ' , ' П а н к ' , 'Г р о в е р '
М илл, NJ ' , 'He ж е н а т ' , ' Б у н т а р с т в о ' , ' Единомьшшенники,
А п о ст р о ф с сим ги тар и сты ' ) ;
волом « : » з а в е р ш а ­
ет некорректную
кол^аиду (NSERT.<

’>
ERROR 1064 ( 4 2 0 0 0 ) : You h a v e an e r r o r i n y o u r SQL s y n t a x ;
c h e c k t h e m a n u a l t h a t c o r re s p o n d s t o y o u r SQL s e r v e r v e r s io n ;
f o r t h e r i g h t s y n t a x t o u s e n e a r ' Милл, Н ь ю -Д ж е р с и ', 'H e
ж е н а т ' , ' Б у н т а р с т в о ' , ' Единомышленники, г и т а р и с т ы ' ) ;

' a t lin e 1

Запись не была вставлена, но РСУЬД хотя бы


снова р еа г и р у ет на ваши действия.

100 глава 2
Апострофы как специальные символы
1',<ли пы вставляете в таблицу значение VARCHAR, CHAR или BLOB, содержащее внутрен­
ний апостроф, необходимо сообщить РСУБД, что этот апостроф не заверш ает текст,
<1 ниляется его част ью и его необходимо включить в строку. Для этого можно поставить

перед апострофом обратную косую черту.

INSERT INTO my_contacts


(location)
VALUES
('ГроверХ' Милл');

А п о ст р оф входит в число
символов SQL
<^0 означает, что в языке он

о н сообщает РСУЬД, где


. з< .к » н и „ в« ется
ф р а г м е н т текста.
Часш'
{а Д а Б а е М ы е -
Б оП р оС ь!
Какие типы данных должны заклю­ Значит, апострофы используются А не проще различать их, заключая
чаться в апострофы? только в текстовых столбцах? текстовые значения в кавычки вместо
апострофов?
Текстовые типы данных — а проще • Да. Проблема в том, что текстовые
(оворя, значения VARCHAR, CHAR, столбцы могут содержать пробелы. При Нет, не проще. Дело в том, что коман­
Ml,OB и TIM ED ATE. Короче, все, что не наличии апострофов в данных это созда­ ды SQL позднее могут использоваться
ипляется числом. ет проблемы. 801 не знает, как отличить в языках профаммирования (например,
внугренний апостроф в тексте от апо­ РНР). В языке программирования кавыч­
строфа, начинающего или завершающего ки означают «здесь приводится команда
Нужны ли апострофы в столбцах значение столбца. SQL» — таким образом апострофы рас­
DEC и INT? познаются как часть команды SQL, а не
как часть конструкций языка программи­
рования.
Нет Числовые столбцы не содержат
пробелов; РСУБД понимает, где кончает-
I и число и начинается следующее слово
п команде.

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

Экранирование обратной косой чертой


Чтобы peuiHTb эт)' проблему (и одновременно испра­
вить команду i n s e r t ), поставьте перед апострофом
в тексте обратную косую черту: Когда вы спхлвите, перед
а по ст роф ом преф икс \ ,
указываюи^ий, что а п о ­
INSERT INTO my_contacts ст ро ф является част ью
т ек ст а , эт.о называется
VALUES «экранированием».

('Фанион', 'Стрів ’,'steve0onionf lavoredrings^__^-^


com', 'М', '1970-01-04', 'П а н к ГроверХ' мілл,
NJ ','Не женат', 'Бунтарство','Единомьшшенники,
гитаристы');

Экранирование удвоением апостроф а


Апостроф также можно «экранировать» другим способом —
поставив перед ним дополнительный апостроф.
А построф ьі также м о ж ­
но «э к р ан и ро ва т ь»
INSERT INTO my_contacts
енм ем, т о
одного апост роф а двумя.
VALUES
('Фанион','Стив ', 'steve@onionf lavoredrings^.^^
com', 'М', '1970-01-04', 'П а н к Г р о в е р ’’ милл,
NJ','Не женат','Бунтарство','Единомышленники,
гитаристы');

W lA iT V P M
с какими ещ е символами могут возникнуть анало­
гичные проблемы?

102 гп а вя 2
------------------------------------------------------------------------------------------------------------------
Если таблица содержит данные с апострофами, вероятно, в какой-то момент вам noi|)*i
- у у .- буется искать их с условием w h e r e . Чтобы включить в выборку данные с апострофами,
J\\уатп<.пп< экранируйте их, как это делалось при вставке.

Перепишите следующую команду с использованием двух разных способов экраниропп


ния внутреннего апострофа.

SELECT * FROM my_contacts


WHERE
location = ’Гровер’ Милл, N J ’;

Какой способ вы предпочитаете?

ч.ш е * 103
Если таблица содержит данные с апострофами, вероятно, в какой-то момент вам потре-
_ буется искать их с условием w h e r e . Чтобы включить в выборку данные с апострофами,
экранируйте их, как это делалось при вставке.
I '1 - Перепишите следующую команду с использованием двух разных способов экранирова­
ния внутреннего апострофа.

SELECT * FROM my_contacts


WHERE
location = 'Гровер' Милл’;

SELECT FROM my_contacts

Первый способ: обратная


WHERE косая черта.

location = 'Гровер \ \ Милл, NJ';

S ELECT * FROM my_contacts

Вт орой способ: удвоение


WHERE апост роф а

II
location = Т р о в ер Милл, N J ‘;

104 snaGci 2
Выборка ограниченного набора столбцов
Итак, вы знаете, как написать команду SELECT для выборки любых
типов данных — в том числе и содержащих апострофы.

Вывод SELECT * получается слишком


длинным. А если меня интересует толь­
ко адрес электронной почты? Нельзя ли
скрыть лишние столбцы?

Команда s e l e c t может включить в выборку


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

l1o n p o 6 v u m 'e T ca M u

w uo Livre Прежде чем вводить следующий запрос SELECT, прикиньте, как будет выглядеть таблица
ТУпражненке
П раЖ Н С Н И б результатов.
(Структура таблицы easy drinks показана на с. 93)

Символ * зам еняет ся именами


столби,ов.

SELECT drink^name, main, second


FROM easy_drinks
WHERE main = 'содовая';

105
выборка с 1г,слбц'

П е п р о 6 VU і п е ї с а м й

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

d r in k n a m * m c iiii •e c e n d
Голубая луна содовая черничный сок
О динокое дерево содовая вишневый сок
Борзая содовая грейпфрутовый сок
Сода плюс содовая виноградный сок

При выводе всех столбцов р е з у л ь ­


Старый способ т а т ы не п о м ещ а ю т ся в окне т е р ­
минала. Данные переносятся на
SELECT * FROM easy__drinks; следующ ую строку и разобраться
в них довольно сложно.

I File Edit Window Help MessyD^p^y"

> SELECT * FROM e a s y _ d rin k s ;


------------------------ +---------- -----------------Г“!"*"“! ! -------- ------------------------------------- ----------------- +-------------------
drink name I amounti I second amount2 d ir e c tio n s
+------------------------------- +----------------------------------+----------------+----------------------------------+----------------+-------------------
------------------------------------------------------------------------------ +
I Поцелуй I вишневый сок I 2 .0 1 абрикосовый нектар] 7 . 0 0 | подавать
со льдом и соломинкой I
I Горячее золото I персиковый нектар | 3 .0 | апельсиновый сок | 6 . 000
0 | влить в
кружку горячий апельсиновый с ок, добавить персиковый нектар |
I Одинокое дерево 1 содовая | 1 .5 | I вишневый сок | 0 . 7 5 | взболтать
со льдом, разлить по бокалам |
I
I Борзая I содовая | 1 .5 | I грейпфрутовый сок 1 5 . 0 0 | подавать
со льдом, тщательно взболтать |
I
I Бабье лето I яблочный сок | 2 .0 | I горячий чай | б
6 . 00 | налить сок
в кружку, добавить горячий чай |
I
I Лягушка I холодный чай i 1 .5
-5 | I лимонад | 5 . 0 0 | подавать
на льду с ломтиком лайма |
I
I Сода плюс I содовая | 2 .0
.О | I виноградный сок | 1 . 000
0 | взболтать
в бокале, подавать без льда |
I
I Терновник I тоник I 1 .5 I ананасовый сок | 1 . 000
0 | взболтать
со льдом, разлить по бокалам, украсить лимонной цедрой |
I Голубая луна I содовая | 1■5 | черничный сок | 0 . 7 5 | взболтать
со льдом, разлить по бокалам, украсить лимонной цедрой 1
I Вот тебе на 1 персиковый нектар | 1 .0 1 ананасовый сок | 1 . 0 0 | взболтать
со льдом, разлить по стаканам 1
I Лаймовый физз | Спрайт | 1 .5 | лаймовый сок | 0 . 7 5 | взболтать
со льдом, разлить по бокалам |
'*'ZZZZ~~ZZ------------- Z~*~~ZZ'Z-----Z~~ZZt~Z~ZZZ~Z~'*’--------------------------------------------------- ------------------------------
I I rows in s e t ( 0 . 0 0 sec)

106
ко м а н д а Vti

Отбор конкретных столбцов


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

...M w м о ж е м c y s u m b
SELECT drink_name, main, second р е з у л ь т а т ы выборки,
FROM easy_drinks; включая в них т о л ь ­
ко и и т е р е с у ю и і и е нас
ст олбцы.

ГЙІе Edit Window Help JustEnough

> SELECT drink_name, m ain, second FROM e a sy _ d rin k s;

I drink name I I second


+-----------------------------
1 Поцелуй 1 вишневый сок 1 абрикосовый нектар |
1 Горячее золото 1 персиковьш нектар 1 апельсиновый сок |
1 Одинокое дерево 1 содовая 1 вишневый сок 1
1 Борзая 1 содовая 1 грейпфрутовый сок 1
і Бабье лето 1 яблочньш сок 1 горячий чай 1
1 Лягушка 1 холодный чай 1 лимонад 1
1 Сода плюс 1 содовая 1 виноградный сок |
1 Терновник 1 тоник 1 ананасовый сок |
I Голубая луна 1 содовая 1 черничный сок 1
1 Вот тебе на 1 персиковый нектар 1 ананасовый сок |
1 Лаймовый физз 1 Спрайт 1 сок лайма |
+----------------------------- _+ ----------------------------- .+----------------------------------- +
11 rows in s e t ( 0 . 0 0

Отбор столбцов ускоряет получение результатов


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

107
возьми в руку карандаш

^ о з ь м и в руку карандаш - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Несколько способов получить «Поцелуй»


Помните нашу таблицу e a s y _ d r inks? Следующая команда
SELECT вернет коктейль «Поцелуй»:

SELECT drink_name FROM easy_drinks


WHERE
main = 'вишневый сок';

Допишите четыре команды SELECT на следующей странице, чтобы они тоже воз-
вращали «Поцелуй».
e a s y _ d r in k s

4 г іп к _ п а п і« m a in ан 1« н п 11 se co n d a m « u n l2 d ir • c li в n •
Терновник тоник 1.5 ананасовый 1 взболтать со льдом, разлить по б ока­
сок лам, украсить лимонной цедрой
Голубая луна содовая 1.5 черничный сок 0.75 взболтать со льдом, разлить по б ока­
лам, украсить лимонной цедрой
Вот тебе на персиковый 1 ананасовый 1 взболтать со льдом,
нектар сок разлить по стаканам
Лаймовый Спрайт 1.5 сок лайма 0.75 взболтать со льдом,
физз разлить по бокалам
Поцелуй вишневый 2 абрикосовый 7 подавать со льдом и соломинкой
сок нектар
Горячее персиковый 3 апельсиновый 6 влить в круж ку горячий апельсино­
золото нектар сок вый сок, добавить персиковый нектар
Одинокое содовая 1,5 вишневый сок 0.75 взболтать со льдом,
дерево разлить по бокалам
Борзая содовая 1.5 грейпф руто­ 5 подавать со льдом,
вый сок тщательно взболтать
Бабье лето яблочный 2 горячий чай 6 налить сок в кружку,
сок добавить горячий чай
Лягушка холодный 1.5 лимонад 5 подавать на льду с ломтиком лайма
чай
Сода плюс содовая 2 виноградный 1 взболтать в бокале, подавать без льда
сок

108 глава 2
команда SELECT

SELECT

WHERE

SELECT

WHERE

SELECT

WHERE

SEL E C T .

WHERE

Теперь запишите три команды SELECT, которые возвращают коктейль «Лягуш­


ка».

d.3/ib!ue » 109
возьми в руку карандаш, р е ш е н и е

Возьми В руку карандаш


!'Е Ш £ Н И б Допишите четыре команды SELECT на следующей странице, чтобы они
тоже возвращали «Поцелуй».

SELECT dirink^name FROM easy_drinks

WHERE second = 'аб]аикосовый. нектар';

SELECT dnnk_na\me FROM easy_drinks

WHERE a m ountZ = 7;

SELECT drink_nam e FROM easy_dhnks

WHERE directions - 'подавать со льдом и соломинкой']

Эта ф орма в с т р е ч а е т ­
d rink_nam e FROM easy_drinks ся редко. И сп ол ьзу йт е ее,
SELECT
если вы п олн ост ью уве~
WHERE d n n k _ n a m e = 'Поцелуй'; ^ т о м . что столбец
.................................................................................................. ^'^"^к_пате .записан без
ошибок.

Теперь запишите три команды SELECT, которые возвращают коктейль «Лягуш­


ка».

SELECT drink_nam e FROM easy_drinks

WHERE main = 'холодный чай';

SELECT drink^name FROM easy_dnnks

WHERE second = 'лимонад';

S ELECT drink_nam e FROM easij_drinks

WHERE directions = 'подавать на льду с л о м т и к о м лайма'-,

110 алавэ2
команда S E l E C T

КЛЮЧЕВЫЕ
МОМЕНТЫ

Используйте апострофы в условии Если вы ввели запрос, а РСУБД


WHERE при ссылке на значения не может завершить его обработку,
текстовых столбцов. проверьте, нет ли в нем непарных
апострофов.
Не используйте апострофы при ссыл­
ке на значения числовых столбцов. По возможности используйте выборку
конкретных столбцов таблицы (вме­
Используйте * в команде s e le c t для
сто конструкции SELECT *, включащей
выборки всех столбцов таблицы.
все столбцы).

Част°
^аД аВаеМ ы е
Бо1]р>Сь1
другой смысл для 501. Вставка в текстовый редактор — один из
А если запрос должен вернуть все столбцы таблицы? способов выявления и удаления символов-«невидимок». Так что
Перечислять их в SELECT или использовать * ? в подобных ситуациях лучше всего вставить запрос в текстовый
редастор и повнимательнее присмотреться к нему

О Если вам действительно нужны все столбцы — конечно, ис­


пользуйте *. Перечисление столбцов хорошо работает только тог­
да, когда вас интересует ограниченное подмножество столбцов. Например, в Microsoft Word?

Я скопировал запрос из Интернета, но когда пытаюсь


выполнить его на своем компьютере — происходит ошибка.
о • Нет, Word — не лучший вариант Эта программа не показы­
вает скрытое форматирование, которое может присутствовать
в тексте. Попробуйте использовать Блокнот (PC) или TextEdit
Я делаю что-то не так? в режиме простого текста (Мае).

Запросы, вставленные из браузера, часто содержат невиди­


мые символы, внешне неотличимые от пробелов, но имеющие

111
МММ, пончики...

Пончики U таблицы...
Чтобы найти в таблице лучшие пончики с глазурью, нам понадо­
бятся минимум две команды SELECT. Первая выбирает записи
с пончиками нужного типа, а вторая —записи с оценкой 10.

Хочу
лучшие пончики с глазурью,
и побыстрее — не хочу копаться doughnut_ratings
в сотнях записей.
lin e date »№ • rating с е т т е п 1*
Starbuzz Coffee 7:43 2 3 /4 с корицей 6 слишком много
пряностей

Duncan's Donuts 8:56 2 5 /8 с глазурью 5 жирноваты

Duncan's Donuts 19:58 2 6 /4 с вареньем 6 вчерашние, но вкусные

Storbuzz Coffee 22:35 2 4 /4 с глазурью 7 теплые, но не горячие

Krispy King 21:39 2 6 /9 с вареньем 6 мало варенья

Starbuzz Coffee 7:48 2 3 /4 шоколадный кекс 10 с зефиром!

Krispy King 20:56 25/11 . с гл о зу р ^ 8 |^еновый сироп

V.

содерж ит ООО з а п и с е й .

Можно провести поиск по типу пончиков:


В выборку включается ст о л б г 1^
rating для поиска высшей оценки,
а также столбеи, location с н а ­
званием заведения.
SELECT location, rating FROM doughnut_ratings
m iE R E

type = ’С глазурью'; Все выбранные записи будут


■и м е т ь нужное значение type.

location rating
Duncan's Donuts 5
Р езульт ат ы первого Starbuzz Coffee 7
запроса... П редст авьт е, Krispy King 8
что дальше идут еш,е
Storbuzz Coffee 10
несколько сотен записей.
^ u n ( ^ ' s Dj^nutji^ ^ 8

112 гпдва 2
команда S tL E C T

...Таблицы u пончики
А можно выполнить поиск по оценке:

SELECT location, type FROM doughnut_ratings


WHERE ^ X
\ ^ 8 выборку включается с т о л б е ц
rating = 10; _ 3 ^^ проверки т и п а , a т а к -

ж е столбеи, location с названием


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

location »yp*
Второй запрос снова
Starbuzz Coffee шоколадный кекс
возвраш,ает сотни
Krispy King с глазурью записей.
Starbuzz Coffee с глазурью

D m can^D cM utS y. _ шрцоладуый Keijc

Маловато пользы от таких запро­


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

Ш ТУРМ

На какой вопрос мы хотим получить ответ


в этих запросах?

да л ьш е ► 113
объединениеуся

Объединение условий
Два условия поиска —тип «с глазурью» и оценка 10 —
можно объединить в один запрос при помощи ключево­
го слова A N D . Результаты такого запроса будут удовлет­
ворять обоим условиям.
Теперь достаточно 8bidpamt>
только столбеа, locatioyi-
SELECT location
FROM doughnut_ratings
WHERE type = 'c глазурью’
T
AND слово AND
ycAoßi"ия WHERE. объединяет

rating = 10;

Ре.зультат запроса A N D . Даже если запрос вернет


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

Запрос обш ди н яет р е з у л ь т а т 1.-с


location rating
выборки по условиям « с г.лазурью»
Duncan's Donuts

Starbuzz Coffee
5

7
и оценкой го
и находит записи,
удовлетворяющие обоим условиям.
Krispy King 8

Starbuzz Coffee 10

location
AND
Starb u zz C o ffe e
location type
Starbuzz Coffee шоколадный

Krispy King с глозуры

Starbuzz Coffee

114 элявa 2
команда Зсг

Так значит, я мог найти


пражнсние Энн при помощи АМЬ?

Используя таблицу my_contacts, напишите несколько запросов для


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

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


граммистов.

Напишите запрос для получения имени и места жительства всех людей,


у которых дата рождения совпадает с вашей.

да л ьш е ^ 115
упражнение, р е ш е н и е

Используя таблицу my c o n t a c t s , напишите несколько запросов для Грега. Включите


ЛЖ НРНИР ® выборку только те столбцы, которые необходимы для получения ответа. Обратите особое
внимание на апострофы.
]4:ШсНИС

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

Нам нуж ен
С1АЛ0Л^еЦ еилД!

SELECT email
\^HERE profession - 'cqmpu^^

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

S ELECT last_name, first_name, location


FROM my_contacts
WHERE birthday - '1 Я 7 5 - О Я -OS';

Здесь должна быть


ваша дата рождения.

Напишите запрос, при помощи которого Грег мог бы найти всех Энн из Сан-Франциско.

SELECT last^namCj first_name, email


FROM ,<(^!^-Cpntacts
WHERE location = [Сан-Франциску
AND firstjnam e - 'Энн';

116 глава 2
команда SELECT

Поиск числовых значений


Предположим, вы хотите найти в таблице e a s y d r in k s все напит­
ки, содержащие более одной унции содовой, и сделать это в одном
запросе. Сложное решение с двумя запросами выглядит так:

Нам нужны назва


кия напитков. SELECT drink_naine FRCM easy_drinks
WHERE
\-\anuw\Ku,
main = 'содовг1я '
содерж ащ и е.
1 , 5 унцмм содовой AND
amounti = 1.5;
I File Edit Window Help MoreSoda

> SELECT d rin k _ n a m e FROM e a s y _ d r in k s WHERE m a in = ' с о д о в а я ' AND


a m o u n ti = 1 . 5 ;

I d r i n k name

I Го л убая л у н а i
I Одинокое дер ево I
I Б о рзая I
+--------------------------------- +
3 rows i n set ( 0 . 0 0 sec)

SELECT drink_name FRCM easy_drinks


Hanm^v\KUj ^— WHERE
содерж ащ и е main = 'содовая'
-2- унции содовой. AND
V __ ^ amounti = 2;

I File Edit Window Help EvenMoreSoda

> SELECT d rin k _ n a m e FROM e a s y _ d r in k s WHERE m a in = 'с о д о в а я ' AND


a m o u n ti = 2 ;

d r i n k name

Сода плюс

1 ro w i n set (0.00 sec)

дал ьш е I* 117
операторы срае
'у ^
А как было бы здорово, если
бы в одном запросе можно было най­
ти все напитки из таблицы еазу_с1ппкз,
содержащие более 1 унции содовой...
Но я знаю, что это всего лишь мечты...

e a s y _ d rin k s

4гіпк_пате main атонпН second атвнпІЗ directions


Терновник тоник 1.5 ананасовый 1 взболтать со льдом, разлить по бокалам,
сок украсить лимонной цедрой
Голубая луна содовая 1.5 черничный 0.75 взболтать со льдом, разлить по бокалам,
сок украсить лимонной цедрой
Вот тебе на персиковый 1 ананасовый 1 взболтать со льдом, разлить поааканам
нектар сок
Лаймовый физз Спрайт 1.5 сок лайма 0.75 взболтать со льдом, разлить по бокалам
Поцелуй вишневый сок 2 абрикосо­ 7 подавать со льдом и соломинкой
вый нектар

Горячее золото персиковый 3 апельсино­ 6 влить в кружку горячий апельсиновый сок,


нектар вый сок добавить персиковый нектар
Одинокое дерево содовая 1.5 вишневый 0.75 взболтать со льдом, разлить по бокалам
сок
Борзая содовая 1.5 грейпфруто­ 5 подавать со льдом, тщательно взболтать
вый сок

Бабье лето яблочный сок 2 горячий чай 6 налить сок в кружку, добавить горячий чай
Лягушка холодный чай 1.5 лимонад 5 подавать на льду с ломтиком лайма

Сода плюс содовая 2 виноград­ 1 взболтать в бокале, подавать без льда


ный сок

118 :::; і в а 2
команда St.

Одного достаточно
Однако использовать два запроса вместо одного неэффективно;
к тому же вы рискуете упустить напитки, в которые входит 1.75 или
3 унции содовой. Лучше воспользоваться оператором сравнения
«больше»:

SELECT drink__name FROM easy__drinks


WHERE
main = ’содовая'
AND с оп ерат ором > эт о услови е
в е р н е т в с е н а п и т к и ,^ с о д е р ж а ш ,и е
1 ; унции с о д о в о й .

I File Edit Window Help DoltOnce

> SELECT d rin k _ n a m e FROM e a s y _ d r in k s WHERE m a in = ' с о д о в а я ' AND


a m o u n ti > 1 ;

d rin k _ n a m e

Го л уб ая луна
Одинокое дерево
Б орзая
Сода плюс

4 row s i n set ( 0 . 0 0 sec)

ШТУРМ
A почему первые два запроса нельзя объединить дополнитель­
ным оператором AND?

д .т ь ш е '>■ 119
подробнее об о п е р а т о р а х сравнении

Операторы сравнения
Ранее в наших условиях WHERE использовался только
оператор =. Вы только что увидели пример исполь­
зования оператора >, сравнивающего одно значение
с другим. Ниже приведена полная сводка операторов
сравнения.

Оператор = проверяет только точные совпаде­ Этот странный знак означает «не равно». Его
ния. Он не поможет, если вы хотите проверить, результат прямо противоположен результату
что некоторое значение меньше или больше знака =. Два значения либо равны, либо не
другого. равны —третьего не дано.

\
всем известный знак
равенства. m Z ““ " РАВНО». Условие
все записи, у которых
два значения не совпадают.

ШТУРМ
А вы заметили, что в каждом рассмотренном нами условии w h e re
имя столбца располагалось слева? Будет ли условие работать,
если имя столбца будет указано справа?

120 глава 2
команда S E L E C T

Оператор «меньше» сравнивает значение Оператор «больше» по смыслу противополо­


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

О п ер а т о р « м е н ь ш е »
возвращает все значения
м ен ьш и е заданного.

И конечно, с у щ е с т в у ­
е т парный операт ор
«б ольш е».

Оператор «меньше или равно» отличается То же и с оператором «больше или равно».


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

Возвращаются все. записи со значением О п ер а т о р


столбца, М Е Н Ь Ш И М И Л И РАВНЫМ
ПОЛЬШ Е И Л И РАВНО.
заданному.

дал ьш е > 121


ищем ч и с л о в ы е да нн ы е

Операторы сравнения при поиске числовых данных


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

При помощи операторов сравнения он ищет в таблице d r i n k _ i n f о напитки с це­


ной более .$3.50, содержащие не более 50 калорий.

К-оличестбо углйбоЭоб
грам м лУ -)- K.aAopuuHocmt>
d r in k in f o
__Е:_____
гігіпк_пате cost carbs color ice calories
Терновник 3 8.4 желтый д 33
Голубая луна 2.5 3.2 синий д 12
Вот тебе на 3.5 8.6 оранжевый д 35
Лаймовый физз 2.5 5.4 зеленый д 24
Поцелуй 5.5 42.5 фиолетовый д 171
Горячее золото 3.2 32.1 оранжевый н 135
Одинокое дерево 3.6 4.2 красный д 17 .
Борзая 4 , 14 желтый д 50
Бабье лето 2.8 7,2 коричневый н ■30
Лягушка 2.6 21.5 бронзовый д 80
Сода плюс 3.8 • 4.7 красный н 19

ELEC T d r i n k nam e FROM d r i n k in f o


WHERE Э т о значит; «Напитки с ценой
^3.5-0 и более». Сюда входят
cost > = 3 .5 напитки, стоящие ровно $ ъ . 5 0 .
AND
Это значит: «Н а п и т к и , с о ­
c a lo r ie s < 50; держащие м е н е е SO калорий».

Запрос возвращает только напитки, удовлетворяющие обоим усло­


виям — потому что два результата объединяются ключевым словом
AND. Запрос возвращает напитки «Вот тебе на», «Одинокое дерево»
и «Сода плюс».

122 ;л а в а 2
команда ЛГ^гГСТ

- ^ о з ь м и в руку карандаш
А теперь ваша очередь. Напишите запросы, которые возвращают ука­
занную информацию. Также запишите результат каждого запроса.

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


33 калорий.

Результат:

Названия и цвета напитков, содержащих не более 4 граммов


углеводов, в которые кладется лед.

Результат: .................................................................

Цены напитков, содежащих 80 и более калорий.

Результат:

Напитки «Борзая» и «Поцелуй», с цветом и информацией об использова­


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

Результат:

^'.v;>ь/пe ■> 123


возми в руку карандаш, решение

- ^ В о зь м и в руку карандаш
Решение А теперь ваша очередь. Напишите запросы, которые возвращают ука­
занную информацию. Также запишите результат каждого запроса.

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


33 калорий.
S ELECT cost FROM d n n k j n f o
............................................. W H E R E ' i c e ...............................
............................................. A N D .......................................................
color = 'yedovj'
"AND......................
cäföWes > 3 3 ;'

Результат: $4 0 0

Названия и цвета напитков, содержащих не более 4 граммов


углеводов, в которые кладется лед.

SELECT ärink_nam e, color FROM d r in k jn fo


W HERE
carhs < = 4
.................. AND ......................................................................................
............... ..................................................................................

Результат:...........

Цены напитков, содежащих 80 и более калорий.

S ELECT cost FROM d r in k jn fo


............... WHERE ..................................................
.C(]lorjes >= 8 0 ; .................................................................. ^ Ho ведь это работает только
с числами, верно? А если мне
понадобится найти все напит­
Результат: fS .S O , $ 3 .Z O , fZ .& O ки, названия которых начина­
ются с конкретной буквы?
Напитки «Борзая» и «Поцелуй», с цветом и информацией об исполь­
зовании льда, но без указания названий напитков в запросе!

SELECT drink_nam e, color, ice FROM d r in k jn fo


""w h e r e ................................................ .............. ..........................................
" c o s t >= ' з :8 - ........^ 5 ^ :::::::::"............ в о п р о с ... в ы
.................................................................... должны были п р о с м о т -
..................................................................... /таблицу и найти
....................................................................с т о л б е ц , по которому
Поцелуй, фиолетовый, Д Можно было бы отобрат ь
Результат: дор зая, ж е л т ы й , Д эт и — и т о л ь ко э т и ! _
........................................................... напитки.

124 глава 2
команда SELECT

Операторы ерабнения при поиске текстовы х данных


Сравнение данных текстовых столбцов (CHAR и VARCHAR) происходит аналогич­
ным образом. Операторы сравнивают значения в алфавитном порядке. Допу­
стим, вас интересуют все напитки, названия которых начинаются с буквы «Г»;
следующий запрос выбирает напитки, удовлетворяющие этому критерию.

drink info

г іг іп к _ п а т е coat carb s c o lo r ІСО c a lo r ie s

Терновник 3 8,4 желтый Д 33


Голубая луна 2.5 3.2 синий Д 12
Вот тебе на 3.5 8.6 оранжевый Д 35
Лаймовый физз 2.5 5,4 зеленый д 24
Поцелуй 5.5 42.5 фиолетовый д 171
Горячее золото 3.2 32.1 оранжевый н 135
Одинокое дерево 3.6 4,2 красный д 17
Борзая 4 14 желтый д 50
Бабье лето 2.8 7,2 коричневый н 30
Лягушка 2.6 21,5 бронзовый д 80
Сода плюс 3.8 4,7 красный н 19

SELECT drink_name
FROM drink_info
WHERE
drink_name >= 'Г ' Запрос возвращает напитки,
AND начинающиеся с буквы Г и сл ед у ­
ющ их букв, но при э т о м nepM^fi
drink name < 'Д '; буква п р ед ш ест в у ет Д .

Пока не беспокойтесь о порядке


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

125
это или то

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

I File Edit Window Help..

> SELECT d rin k _n am e FROM e a s y _ d r i n k s WHERE m ain = 'вишневый с о к '


+ -------------------------+
I drink_nam e |
+ ------------------------- +
I Поцелуй I
+------------------------- +
1 row i n s e t (0.02 sec)

> SELECT d r in k name FROM e a s y d r in k s WHERE se co n d = 'вишневый с о к ' ;

d r in k name

Одинокое дерево

1 row i n s e t ( 0 .0 1 sec)
Два запроса? Неэффективно
Наверняка их можно как-
нибудь объединить.

drink info
|1г 1п к _ п а т е <0 * 1 сагЬ а c o lo r ІСО c a lo r lo s

Терновник 3 8,4 желтый д 33


Голубая луна 2,5 3.2 синий д 12
Вот тебе на 3.5 8.6 оранжевый д 35
Лаймовый физз 2,5 5.4 зеленый д 24
Поцелуй 5,5 42.5 фиолетовый д 171
Горячее золото 3.2 32.1 оранжевый н 135
Одинокое дерево 3,6 4.2 красный д 17
Борзая 4 14 желтый д 50
Бабье лето 2,8 7.2 коричневый н 30
Лягушка 2.6 21,5 бронзовый д 80
Сода плюс 3,8 4,7 красный н 19

126 ::пйва 2
команда StFi.bCi

Быть иль не быть


Для объединения двух запросов используется связка ОК. С этим условием запрос
возвращ ает записи, у которых выполняется лю бое из указанных условий. Таким
образом, из двух отдельных запросов строится один комбинированный запрос.

eetr'.hAm/Pie
> SELECT d rin k _n am e fro m e a s y _ d r in k s
WHERE m ain = 'вишневый с о к '

s e c o n d = 'вишневый с о к '

I d r in k name

I Поцелуй I
1 Одинокое д ер ево I
+ +
2 row s i n s e t (0.02 sec)

^озьм и в руку карандаш


Вычеркните лишние части двух команд SELECT и добавьте
связку OR, чтобы превратить их в одну команду SELECT:

SELECT d r in k _ n a m e FROM e a s y _ d r in k s WHERE


m a in = ' апельсиновы й с о к ' ;

SELECT d r in k _ n a m e FROM e a s y _ d r in k s WHERE


m a in = ' яб л о чн ы й с о к ' ;

Запишите здесь полученную команду SELECT.

127
еще один ответ

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

SELECT d r in k _ n a m e FROM e a s y _ d r in k s WHERE


m a in = -а п е л ь с и н о в ы й с о к
/ не заве.рме-на.

m a in = 'я б л о ч н ы й с о к ' ;
Эту ст року м о ж н о прос
^0 связкой OR запрос веюнрт в^,Лркнуть, все необходи­
напитков, глав- м ое е с т ь в первой т с т и
^1У^гредиентом которь,х запроса (присоединениои
ключевым словом ОК)-

Запишите здесь полученную команду SELECT.

SELECT dn'nk_name FROM easy_dnnks


WHERE
m ain - 'апельсиновый сок'
OR
main = ‘яблочный сок'; Запрос, который
У нас получился.

128 гл ава 2
команда SbLECT

Оператор OR действительно
полезен, но я не понимаю, поче­
му мы не воспользовались AND?

Не путайте AND с 0R!


Если истинными должны быть В С Е условия, исполь­
зуйте AND.
Если истинным должно быть Х О Т Я Б Ы О Д Н О
из условий, используйте 0R.
Так и не разобрались? Переверните страницу.

АШ) OR
_ Часто
_____ задаваем ы е ______
B o I lp jC b i

Можно ли использовать более одной


связки AND или OR в одном условии
WHERE?

Конечно, связок может быть сколько


угодно. Также в одном условии AND может
использоваться вместе с OR.

да л ьш е ► 129
AND I’m: OR?

Чем AND отличается om OR


('.лсдующие примеры демонстрируют возможные комби­
нации Д 1 » у х условий, объединенных связками AND и OR.

d o u g h n u t_ r a tin g s

location lime date type rating comments


Krispy King 8:50 27/9 с глазурью 10 почти идеально
Duncan's Donuts 8:59 25/8 NULL 6 жирноваты
Starbuzz Coffee 19:35 24/5 с корицей 5 вчерашние, но вкусные
Duncan'sponuts 19:03 26/4 с вареньем 7 мало варенья

SELECT ty p e FROM d o u g h n u t_ ra tin g s РЕЗУЛЬТАТЫ


Д а , ест ь совпадение. Aa

WHERE l o c a t i o n = 'K r is p y K in g ' AND r a t i n g = 1 0 ; с глазурью

WHERE l o c a t i o n = 'K r is p y K in g ' OR r a t i n g = 1 0 ; с глазурью

WHERE l o c a t i o n = 'K r is p y K in g ' AND r a t i n g = 3 ; нет

WHERE l o c a t i o n = 'K r is p y K in g ' OR r a t i n g = 3 ; с глазурью


^ ^ ^ ^ o 6 n a d eH u u,

WHERE l o c a t i o n = 'S nappy B a g e l ' AND r a t i n g = 1 0 ; нет

WHERE l o c a t i o n = ' Snappy B a g e l ' OR r a t i n g = 1 0 ; с глазурью

WHERE l o c a t i o n = ' Snappy B a g e l ' AND r a t i n g = 3 ; нет

WHERE l o c a t i o n = ' Snappy B a g e l ' OR ra tin g = 3 ; нет

130 илава 2
команда SELECT

аАШ ) усл о в и ем

ЦиЖе П|»иВеДена cejnifi усЛоВий ^VUERE


связками Д^|]) U 01^. Ц оопаВыпс се^я на
М есто э т и х ijcjioBuu и onj>eAejiuine, какой р»е-
зультатп Вер>ну1Г1 т а к и е запросы.

SELECT ty p e FROM d o u g h n u t_ ra tin g s P63y

WHERE l o c a t i o n - 'K r is p y K in g ' AND r a t i n g <> 6 ;

WHERE l o c a t i o n = 'K r is p y K in g ' AND ra tin g = 3 ;

WHERE l o c a t i o n = 'S nappy B a g e l ' AND r a t i n g >= 6 ;

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g > 5 ;

WHERE l o c a t i o n - 'K r is p y K in g ' OR ra tin g = 3 ;

WHERE l o c a t i o n = 'S nappy B a g e l ' OR ra tin g = 6 ;

| л я улучш ения сВоей карМ ы н ал и Ш и те, ЧеМ ДВа

J*e3yjlbmaina отлиЧаготся ощ остальных.

дальш е ► 131
условия, от вет

Ди ) у сЛ оБ и еМ . QmBem
Уиже лр*иРеДена cej»uff усЛоБий ^
связками U QJ^. ЦостаВьтпе се^я
на М е ст о э т и х усЛоВий и ол^>еДеЛите,

какой р езу л ьтат Вернут


т а к и е загдзосы.

SELEC T t y p e FROM d o u g h n u t _ r a t i n g s Р езул ьтат:

WHERE l o c a t i o n = 'K r is p y K in g ' AND r a t i n g <> 6 ;

WHERE l o c a t i o n = 'K r is p y K in g ' AND ra tin g = 3 ; нет

WHERE l o c a t i o n = ' Snappy B a g e l ' AND r a t i n g >= 6 ;

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g > 5 ; с глазурью J NULL,


с вареньелл

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g = 3 ; с глазурью

WHERE l o c a t i o n = ' Snappy B a g e l ' OR ra tin g = 6; NULL

]^Ля улучш ения сВоей карМ ы н ал и Ш и те, Чем ДВа р е з у л ь т а т а

о тЛ и Ч акгтся ощ о ст а л ь н ы х .

Два запроса возвращ ают NULL.

Эти значения N U L L могут создать проблемы в будущих запросах. В столбце табли­


цы лучше ввести какое-либо определенное значение, чем оставлять в нем N U L L ,
потому что прямая выборка NULL из таблицы невозм ож на.

132 глава 2
команда SELECT

использование IS NULL для поиска NULL


^пытался выполнить поиск по столбцом, содер­
жащим NULL, но у меня ничего не получилось. Как
найти NULL в таблице?
V ._____ ____

d r in k in f o
d riiik .n a iM * cost carbc ««1er ім ca le rie s
Выходной NULL 14 NULL д 50
Дыхание дракона 2.9 7.2 коричневый Н NULL

Прямая выборка NULL невозможна. Однако NULL можно найти


при помощи ключевых слов.
SELECT d r in k _ n a m e FROM d r i n k _ i n f o
WHERE ^ He р а б о т а ет , п от ом у что
c a lo r ie s = '> 4 ; никакоб значение не равно
\ M U L L — неопределенному
SELECT d rin k _ n a m e
значению. FROM d r in k _ in f o
SELECT d r in k _ n a m e FROM d r i n k _ i n f o WHERE Прямая выборка
™ e re ui' ' /-/e работ ает ; NULL
c a lo r ie s IS NULL; значении NULL
c a lo r ie s a нуль — это разные p ^ в о зм о ж н а только
значения. К-лючевые слова — с использованием
не т екстовые дан- ключевых слов
SELECT d r in k _ n a m e FROM d r i n k _ i n f o
ные, они не з а к л ю - 15 NULL,
WHERE ^ ----- "Тоже не р а б о т а ет , NULL чаются в кавычки.
c a lo r ie s = не является тскстовой
^ строкой.

чааро
ЧадаБаеМые ---------------------------------------------------
B o I^ C b i

Вы говорите, что «прямая выборка» NULL невозможна и как будет выглядеть результат этого запроса?
без использования IS NULL. Значит, возможна, непрямая?
Он будет выглядеть так:
J Верно. Если вы хотите получить значение из этого столбца,
можно воспользоваться условием WHERE для других столбцов.
Например, следующий запрос вернет N U LL; I calories
SELECT c a l o r i e s FROM d r i n k _ i n f o +----------------
WHERE d rin k _ n a m e = 'Д ы х а н и е д р а к о н а '; I NULL
+ --------------

д а л ьш е ► 133
однообразные з а п р о с ы

Тем Временем 6 доме Грега...


Грег пытается найти в таблице m y _ c o n ta c ts всех
людей, нсивущих в Калифорнии. Часть запроса, над
которым он работает, выглядит так:

SELECT * FROM i t ^ _ c o n t a c t s
Набирать все эти
WHERE
OR так утомительно!
-v_ lo c a tio n = 'С а н -Ф р а н ц и с к о , CA'
OR -----
lo c a tio n = 'С а н - Х о с е , CA'
OR
lo c a tio n = 'С а н -М а т е о , CA'
OR
lo c a tio n = 'С а н н и в е й л , CA'
OR
lo c a tio n = 'М арин, CA'
OR
lo c a tio n = 'О к л е н д , CA'
OR
lo c a tio n = 'П а л о -А л ь т о , CA'
OR
lo c a tio n = 'С а к р а м е н т о , CA'
OR
lo c a tio n = 'Л о с -А н д ж е л е с , CA'
OR
И т а к д а л е е ...

134 глава 2
команда SELECT

LIKE: сАобо для экономии бремени


В Калифорнии слишком много городов. Если Грег
попытается перечислить их все в запросе, объединяя
связкой OR, это займет у него слишком много времени,
к счастью, существует полезное ключевое слово LIKE,
которое в сочетании со специальными символами ищет
часть текстовой строки и возвращ ает совпадения.
Грег может использовать L IK E следующим образом:

SELECT * FROM my_contacts


WHBKE location LIKE '%CA<
- \ ^ ^‘^острофах
указывает вашей п р о ­
г р а м м е, что вас и н -
у р е с у ю т все значения
Специальные символы столбца location, ко-
^ о р ы е заканчиваются
L IK E обычно используется в сочетании с двумя спе­ сокращ^ением « С А » .
циальными символами — «.заместителями», которые
представляют фактическое содержимое строки.
Специальные символы, словно джокер в карточных
играх, равны любому символу (или последователь­
ности сим волов)строки.

ШТУРМ
Какие еще специальные символы
встречались вам в этой главе?

да л ьш е * 135
LIKE и специальные символы

Я LIKE это
L IK E используется со специальными симво­
лами. Первый —знак % —обозначает любое
количество произвольных символов.

SELECT f ir s t _ n a m e FROM m y _ c o n ta c ts
WHERE f ir s t _ n a m e L IK E '% и м '

' П р е д с т а в л я е т л ^ ю 5 о ^ к о л и ч г -

ство неизвестных символов.


Запрос возвращает и м е ­
на, которые сост оят из
любого количества с и м ­
волов и заканчиваются на
« и м » — Эф раим , Д ж м м ,
Т и м и т. д.

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


встречающийся в компании L IK E , — знак
подчеркивания (_) — представляет ровно
один произвольный символ.

SELECT f ir s t _ n a m e FROM m y _ c o n ta c ts
WHERE f ir s t _ n a m e L IK E им

^ З ам еняет ровно один произволь-


Запрос возвращает
ный символ.
имена, которые с о ­
с т о я т из одной буквы
и « и М » — K'UM^ ТиМ
и т. д.

136 глава 2
команда S E L E C T

аГншпь! с КоДаМи
Условия WHERE с ключевым словом L IK E и их результаты
1 полностью перепутались. Сможете ли вы восстановить соответ­
ствие? Некоторые условия могут возвращать несколько резуль­
татов. Напишите собственные условия L IK E со специальными
символами для лишних результатов.

WHERE

WHERE title LIKE 'SQL%';

l ik e '% е н ^

дал ьш е * 137
решение с магнитами

аГнхипь! с КоДаМи
Условия WHERE С ключевым словом L IK E и их результаты
полностью перепутались. Сможете ли вы восстановить соответ­
ствие? Некоторые условия могут возвращать несколько резуль­
татов. Напишите собственные условия L IK E со специальными
символами для лишних результатов.

flHEBE s t a t e l ik e 'Нью-%'

cow _nam e L IK E ' s i e ';

ЭЛСИ

WHERE t i t l e L IK E ' SQL%' ;

SQL для начияажафос

W H E R E word LIKE

Стремительный Стрелу

rh y iiie _ w o rd L IK E ■% в н д в р . ;

I WHERE f i r s t nam e
Джон
Джон 1 Л *о"^*

WHERE word LIKE

138 гл ава 2
команда S E t £ C )

Проберка диапазонов с использованием AND


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

d r in k in f o
4 г1 п к_ п а те cost carbs св1ог ice ca lo rie s
Терновник 3 8.4 желтый д 33
Голубая луна 2.5 3.2 синий д 12
Вот тебе на 3.5 8.6 оранжевый д 35
Лаймовый физз 2.5 5.4 зеленый д 24
Поцелуй 5.5 42.5 фиолетовый д 171
Горячее золото 3,2 32.1 оранжевый н 135
Одинокое дерево 3.6 4.2 красный д 17
Борзая 4 14 желтый д 50
Бабье лето 2.8 7.2 коричневый н 30
Лягушка 2.6 21.5 бронзовый д 80
Сода плюс 3.8 4.7 красный н 19

SELEC T d r in k _ n a m e FROM d r in k _ in fo

W HERE

c a lo r ie s > = 30 ^ ^ Р езульт ат з а п р о ­
са в к л ю ч а е т н а п и т к и ,
AND у к о т о р ы х калорийност :
больш е или равна 3 0 ,
^ ^ но меньыАС или равн а <ЬО
c a lo r ie s <= 60;

дйпьш е ► 139
ключевое слово BETW EEN

Только МЕЖДУ нами... Есть и другой способ


Также для проверки вхождения значений в диапазон можно
воспользоваться ключевым словом BETWEEN. Такая форма
записи короче предыдущего запроса, но возвращает те же
результаты. Обратите внимание: BETWEEN включает границы
диапазона (30 и 60). Конструкция BETWEEN эквивалентна ис­
пользованию операторов <= и >=, но не < и >.

SE L E C T d r i n k _ n a m e F R O M d r i n k _ i n f o
M IE IŒ

calories BETWEEN 30 AND 60; ■Д а е т т о ч н о т а к о й же резуАЬ


т а т , как и запрос на предыду­
щей ст ранице, но вводится
В к л ю и л е т н ап и тк и намного б ы ст р ее’.
с 3 0 и &0 калориями.

[ pile Edit Window Help MediumCalories

> SELECT drink_name FROM drink_info


raERE
calories BETWEEN 30 AND 60;

дг1пк_пате

Терновник
Вот тебе на
Борзая
Бабье лето
Сода плюс

140 глава 2
команда SELECT

Измените запрос на предыдущей странице так, чтобы он воз­


вращал названия всех напитков, содержащих более 60 или
менее 30 калорий.

Попробуйте использовать BETWEEN с текстовыми столбцами. Напишите запрос, который


возвращает названия всех напитков, начинающиеся с букв от «Д» до «О».

Как вы думаете, какой результат вернет следующий запрос?

SELECT d r in k _ n a m e FROM d r i n k _ i n f o WHERE


c a lo r ie s BETWEEN 60 AND 3 0 ;

дальш е > 141


возьми в руку карандаш, решение

- ^ В о з ь м и В руку карандаш
'0Ш6НИ6 Измените запрос на предыдущей странице так, чтобы он воз­
вращал названия всех напитков, содержащих более 60 или
менее 30 калорий.

SELEC T drink_nam e FROM d r in k jn fo


Названия напитков, содержащих
............. ........................................... ^^,^.<ггг:ттттт:.^<?лее. бо. .кйлр/?.^.^.-.

calories < 3 0 OR calories > 6С ;

___ Напитки, содержащие


м е н е е 3 0 калорий.
Попробуйте использовать BETWEEN с текстовыми столбцами. Напишите запрос,
который возвращает названия всех напитков, начинающиеся с букв от «Д» до «О».

SELECT drink_nam e FROM d r in k jn fo

WHERE

drink_nam e BETWEEN 'Д ' AND 'O';


Запрос возвращ ает названия
всех напитков, начинающихся
с /\, О и всех букв между ними.

Как вы думаете, какой результат вернет следующий запрос?

SELECT d rin k _ _ n a in e FROM d r i n k _ i n f o WHERE


c a lo r ie s BETNEEM 6 0 AND 3 0 ;

Порядок указания границ важен, поэт о м у э т о т запрос


.':^.'^..Р.дной записи. .................................................................

Запрос ищет значения, находящиеся в диапазоне от 60 до 30. Одна­


ко в этом диапазоне значений нет, потому что 60 больше 30. Чтобы
ключевое слово BETWEEN работало так, как положено, меньшее число
всегда должно указываться первым.

142 глава 2
команда SELECT

Условие IN
Аманда, подруга Грега, использует список контактов Грега для
поиска парней. Она уже побывала на нескольких свиданиях, за­ b la c k b o o k
вела собственную таблицу со своими впечатлениями.
с1а 1 е_11а т е га11п9
Аманда назвала свою таблицу Ы а с к _ Ь о о к . Она хочет получить Алекс оригинально
список удачных свиданий, поэтому отбирает значения к положи­
Джеймс скучно
тельным оценкам.
Иэн потрясающе

SELECT d a te _ n a m e Борис так себе


Мелвин пресно
FROM Ы а с к _ Ь о о к
П олож и т ельн ы е Эрик убого
WHERE
оценки Энтони восхититель­
r a tin g = ' о р и ги н а л ь н о но

OR Сэмми неплохо
условие
Айвен ужасно
каждой п о л о ж и -
' . ^ : ^ ^ ь н о й оценки. Вик смехотворно
OR

Вместо того чтобы строить длинные цепочки ОК, мы можем


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

3a ключевым словом iN
SELECT d a te _ n a m e след у ет набор допусти
FROM b l a c k b o o k мыж значений.

WHERE
r a t in g IN ( ' о р и ги н а л ь н о ' ,
' п оф р ясаю щ е' ,
' ВО С Х И Ф И Ф еЛ ЬН О ' ,
*н е п л о х о ' ) ;

Набор положительных
оценок.

143
ключевы е слова N O T IN

Ключевые слова NOT IN


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

Чтобы получить имена знакомых, получивших низкие


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

SELECT date_name
Ключевые слова NOT IN
FROM black book означают, что р е з у л ь -
'mam не входит в задан-
WHERE иый набор.
r a t in g NOT IN
(' оридтинально'
' потрясающе'
' восхитоотельно’
,, Запрос NOT IN воз­
вращ ает список з н а ­
комых, не получивших
’неплохо’ ) ; положит ельных о це­
нок, а следовательно,
не и м ею щ и х шанса на
второе свидание.
I File Edit Window Help BadDates

> SELECT date_name FROM black_book


WHERE

rating NOT IN {'оригинально',


'потрясающе', 'восхитительно', 'неплохо');

I d ate name I ШТУРМ


Когда NOT IN удобнее IN?

6 rows in s e t ( 2 . 4 3 sec)

144 глава 2
команда SELECT

Другие применения NOT


Ключевое слово NOT может использоваться не толь­
ко с IN , но и с BETWEEN и L IK E . Однако необходимо
помнить, что NOT следует сразу ж е после WHERE.
Рассмотрим несколько примеров.

SELECT d r in k _ n a m e FROM d r i n k _ i n f o
WHERE NOT c a r b s BETWEEN 3 AND 5 ;

Если к л ю ч е в о е SELECT d a t e nam e fr o m b la c k b o o k


слово NOT и сп о л ь- — —
з у е т с я с A N P или WHERE NOT d a te _ n a m e L IK E 'A%'
n u c J a Z Z после a n d NOT d a t e nam e L IK E 'E%'
AMP или OR.-
Часгро

^аД аБаеМ ы е
Б о ц р )С ь 1

Вы же только что сказали, что NOT записывается после Как NOT работает с NULL?
WHERE. А как насчет NOT IN?
Так; как и следовало ожидать. Например, чтобы выбрать все
• Это исключение, и даже если поставить NOT после WHERE, записи, у которых столбец не содержит NULL, можно воспользо­
команда все равно будет работать. Следующие две команды ваться следующим запросом:
возвращают одинаковые результаты:
SELECT * FROM easy_drinks
SELECT * FROM easy_drinks WHERE NOT main IS NULL;
WHERE NOT main IN ('с о д о в а я х о л о д н ы й чай');
Однако следующий запрос тоже подойдет:
SELECT * FROM easy_drinks
WHERE main NOT IN ('содовая', 'холодный чай'); SELECT * FROM easy_drinks
WHERE main IS NOT NULL;

Будет ли NOT работать с О (оператор «не равно»)?


A как насчет AND и OR?

О ' Будет, но это будет двойное отрицание. Намного логичнее


заменить эту конструкцию знаком =. Следующие два запроса 0:. При использовании с AND и OR ключевое слово NOT ставит­
возвращают одинаковые результаты: ся после них:
SELECT * FROM easy_drinks SELECT * FROM easy_drinks
WHERE NOT drink_name <> 'Терновник'; WHERE NOT main = 'содовая'
AND NOT main = 'холодный чай';
SELECT * FROM easy_drinks
WHERE drink name = 'Терновник';

дапьш е ► 145
операторы .еравнения. упрат нение

Перепишите каждое из условий w h e r e так, чтобы они были как можно проще. Используйте
AND, OR, NOT, BETWEEN, LIKE, IN, IS NULL И оперэторы сравнения. Структура и содержи­
ажнение мое таблиц приводились в этой главе.

SELECT d rin lc _ n a m e fr o m e a s y _ d r in k s

WHERE NOT a m o u n ti < 1 .5 0 ;

SELECT d r in k _ n a m e FROM d r i n k _ i n f o

WHERE NOT i c e = 'Д ';

SELECT d r in k _ n a m e FROM d r i n k _ i n f o

WHERE NOT c a l o r i e s < 20;

146 глава 2
упражнение, р е ш е н и е

Перепишите каждое из условий w h e r e так, чтобы они были как можно проще. Используйте
AND, OR, NOT, BETWEEN, LIKE, IN, IS NULL И оперзторы сравнения. Структура и содержи­
ажнение мое таблиц приводились в этой главе.

SELECT d r in k _ n a m e fr o m e a s y _ d r in k s

WHERE NOT a m o u n ti < 1 .5 0 ;

SELECT dn'nk_name FROM easy_dn'nks

WHERE amounti- >= l.S O ;

SELECT d r in k _ n a m e FROM d r i n k _ i n f o

WHERE NOT i c e = ' ' ;

SELECT dn'nk_name FROM d r in k jn fo

WHERE ice = 'H';

SELECT d r in k _ n a m e FROM d r i n k _ i n f o

WHERE NOT c a l o r i e s < 20;

SELECT drink_nam e FROM d r in k jn fo

WHERE calories >= 2 0 ;

148 глава 2
команда SELECT

SELECT d r in k _ n a m e FROM e a s y _ d r in k s

WHERE m a in = 'п е р с и к о в ы й н е к т а р '

OR m a in = ' содовая';
Р абот ает , пот ом у что
....................................................................................... 6 с т о л б ц е main н е т д р у г и х м н -
SBLECT d r i n k п а т е FROM e a s y _ d r i n k s г р е д и е и т о в , уЭоблетборяизщм
........................ .................................... ........... ............ а « Л к . , д л я 2 ^ 4 «
WHERE m a i n BETWEEN 'ГГ' AND ‘Г ; R с м н ож ест в ом записеи т а к
...............................................................................р е ш е н и е н е п о д о й д е т .

SELECT d r in k _ n a m e FROM d r i n k _ i n f o

WHERE NOT c a l o r i e s = 0;

select d M ^ ............... К алорийност ь не бывает

.....................

SELECT d r in k _ n a m e FROM d r i n k _ i n f o

WHERE NOT c a r b s BETWEEN 3 AND 5 ;


S ELECT drink_nam e FROM d r in k jn fo
WHERE carbs < 3
■■■■■OR.........................................................................................................
....carhs,>,St .......................................................................................

SELECT d a te _ n a m e fr o m b la c k _ b o o k

WHERE NOT d a te _ n a m e L IK E 'A%'

AND NOT d a te _ n a m e L IK E ' B% ' ;


SELECT date_nam e FROM black_hook

WHERE date_nam e NOT BETWEEN 'A ' AND '5';

дал ьш е ► 149
крат кий о а зо р s q l

Новые инструменты
Мы подошли к концу главы 2, а ваш инструментарий
пополнился несколькими новыми операторами
GNJ и ключевыми словами. Полный список инструментов
приведен в приложении III.

* еЯ ЭАЯ
= < > < > < = > =

беек В блшем распоряжении


полный набор операторов
сравнения.

\ эаккы^^ У с в о е н и е м a^v I S NULL


\ бо лоМ \
Условие для проверки значе­
\ С1ллроФ^- ния NULL.

1 ^Й) VI о *-
^ЕТШ е ц

yvO
-в » » " "
,бо1рл-
0 '^ '
hO-

,^ £ г > I
L ik e
с % лип

. р
Новые инст рум ент ы :
операторы'

150 глава 2
команда SELECT

Бар Head First Lounge включает в свое меню фруктовые коктейли. Используя то, что вы
а Ж Н еН И б Узиэли в главе 1, создайте таблицу и вставьте в нее приведенные ниже данные.
Со с. 93 Таблица входит в базу данных с именем drinks. База данных содержит таблицу
рСШ 2 НИ2 easy drinks С рецептами напитков, состоящих всего из двух ингредиентов.

CREATE DATABASE d rin k s; Желательно выделить несколь­


USE d rin k s ; ко лишних симбоАоб на слс^яи^
если 1^ ам когда-т Ьф поябит
CREATE TABLE easy_d rin k s СЯ более Элинное назбате.
(drink_name VARCHAR( 1 6 ) , main V3ACHAR(20), amounti D E C (3,1),
second VARCHAR(20), amount2 DEC( 4 , 2 ) , d i r e c tio n s VARCHAR(250)} ;

INSERT INTO easy_d rin k s


He забудьте: числовые данные
VALUES / о кавычки не заключаются!
('Терновник', ' Фоиих', 1 . э , ' ананасовый с о к ’ > 1 , 'взболфата» со льдшс, раэяйФЬ
по бокалам, украсиФь лимонной цедрой’ ) , ('Голубая л у н а', 'с о д о в а я ', 1 . 5 ,
'черничный с о к ' , . 7 5 , 'взболфать со льдом, разлифь по бокалам, украсить
лимонной цедрой' ) ,
('ВоФ Фебе на', 'персиковый некФар', 1, 'ананасовый сок', 1, 'взболФаФЬ
со льдом, разлифь по сфаканам'),
('Лаймовый физз' , 'Сщ>айф', 1 . 5 , 'сок лайма', . 7 5 , 'взболФаФь со льдом, разяиФь
по бокалам') ,
( ' Поцелуй' , ' виогаевый с о к ' , 2 , ' абрикосовый некФар' , 7 , ' подайаФЬ со льдом
и соломинкой' ) ,
(Тор51чее золоФо', 'персиковый некФар', 3, 'апельсиновый сок', 6, 'алиФЬ
в кружку хюрячий апельсиновый сок, добавиФь персиковый некФар'),
('Одинокое д ер ев о ', 'с о д о в а я ', 1 . 5 , 'вишневый с о к ' , . 7 5 , 'взболФа«^ со льдсж,
разлиФь по бокалам' ) ,
('Б о р з а я ', 'с о д о в а я ', 1 . 5 , ' грейпфруфовый с о к ' , 5, 'подаваФь со яьдбм,
ст(аФельно взболФаФЬ' } ,
('Бабье лвФо', 'яблочный сок', 2 , 'горячий чай', 6, 'налиФЬ сок в 1фужку,
добавиФь горячий чай'),
('Дйп'ушка', 'холодный чай' , 1 . 5 , 'лимонад', 5 , 'подаваФЬ на Мьку с ломфикон

2 , 'винохрадный сок', 1 , 'взболФаФЬ в бокале подаваФь ,

Напитки разделяю т ся
запятыми.

дальш е ► 151
Никак не можете прийти к окончательному решению?
И ладно! Команды, с которыми вы познакомитесь в этой главе —
DELETE и UPDATE, — ИЗбаВЯТ ВаС ОТ ВОЗНИ с данными, которые вы
ввели полгода назад. Команда u pdate изменяет данные, а команда
DELETE удаляет данные из таблицы, которые вам больше не нуж­
ны. Но мы не только рассмотрим новые инструменты; в этой главе
вы узнаете, как избирательно применять новые возможности и как
предотвратить случайное удаление полезных данных.
информация о клоунах

Клоуны вокруг нас


Предположим, мы хотим хранить информацию о клоунах, работаю­
щих в городке Дейтавиль. Данные хранятся в таблице c l o w n _ i n f о,
а текущее местонахождение клоунов содержится в столбце l a s t se e n .

©1пасу“5
ЕАИ.'5
МК '^Ве1топ1^
Чспюг С :стсг

154 глава 3
d e le te и up d a te

информация о клоунах
Вот как выглядит наша таблица. Информацию, которой мы пока не располага­
ем, можно пропустить — она будет введена позднее. Каждый раз, когда в городе
появляется новый клоун, в таблицу добавляется новая запись. Чтобы содержи­
мое таблицы оставалось aк■гy^uIьным, его придется часто изменять.

Место, где каждого кд OLjHa


биделы в послсднии раз c lo w n in f o

nam e ^ 1а81_веен арр аагап м a c t i v i t ie s


Элси Дом престарелых Черри Хилл Ж, рыжие волосы, зеленый костюм, огромные ботинки шарики, машинки

Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, огромные ботинки мим

Снаглз Болмарт ж, желтая рубашка, красные штаны рожок, зонтик

Мистер Хобо Цирк ВС М, сигара, черные волосы, маленькая шляпа скрипка

Кларабелл Дом престарелых Бельмонт Ж, розовые волосы, большой цветок, синее платье кричалки, танцы

Скутер Больница Окленд М, синие волосы, красный коаюм, большой нос шарики

Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы

Бэйб Автошкола ЭpJy Ж, розовый костюм с блестками эквилибристика,


машинки
Бонзо М, женское платье в горошек пение, танцы

Снифлз Заве;1ениеТрэ1^и Ч, М, зелено-фиолетовый костюм, длинный нос


L ^ _ ------------ 1

OAKLAND
HOSPITAL

MILLSTONE
M ALL

Dickson
1 % Park
1
5

Otracy- s
Eywt's
Mim f Belmon t'^
Senior Center

m tr

да л ьш е ► 155
возьми в руку карандаш

- ^огьт в руку карандаш


Перемещения клоунов
Напишите команды SQL для занесения текущей информации о клоунах
в таблицу clown in f о. Учтите, что часть информации остается неиз­
менной; за полными сведениями обращайтесь к таблице на с. 155.

INSERT INTO clownJnFo


VALUES
('Зиппо', 'Торговый цент р Милстоун', 'Ж,
оранжевый костюм^ штаны', 'танцы, пение'):

Снаглз носит INSERT INTO clown jnfo


синие штаны. VALUES
('Снаглз', 'д о л м а р т ', 'Ж , ж елт ая рубашка, синие
штаны', 'рожок, зонтик');

^ОНЗО видели
о <^лрке /\UKC0H.

СнмфАЗ рлз-ьезжа-
еил на маминке.

Мистера Хобо
видели на вече­
ринке Эрика Грея

156 глава 3
d e le te и up d a te

Как будет выглядеть таблица c l o w n _ i n f о после выпол­


нения команд INSERT? Допишите новые записи.

nam e 1а81_8ееа a ppearance a c tiv itie s


Элси Дом престарелых Ж, рыжие волосы, зеленый костюм, шарики, машинки
Черри Хилл огромные ботинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, мим
огромные ботинки
Снаглз Болмарт ж , желтая рубашка, красные штаны рожок, зонтик
М иаер Хобо Цирк ВО М, сигара, черные волосы, маленькая скрипка
шляпа
Кларабелл Дом престарелых Ж, розовые волосы, большой цветок, кричалки, танцы
Бельмонт синее платье
Скутер Больница Окленд М, синие волосы, красный костюм, шарики
большой нос
Зиппо Торговый центр ж , оранжевый костюм, штаны танцы
Милстоун
Бэйб Автошкола Эрла Ж, розовый костюм с блеаками эквилибристика,
машинки
Бонзо М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длин­
ный нос

да л ьш е > 157
eo3b«fu в думу нарамдаш. решение

-озьми в руку карандаш


Решение Перемещения клоунов
Напишите команды SQL для занесения текущей информации
о клоунах в таблицу clo w n _in f о. Допишите в таблицу записи,
которые появятся в ней после выполнения команд INSERT.

VALUES
('Зиппо', ‘Торговый центр Милстоун'j 'Ж.
оранжевый кост ю м , штаны', 'танцы, пение');

Снаглз носит INSERT INTO clow njnfo


синие штаны. VALUES
('Снаглз'. 'болм арт '. 'Ж. желтая рубашка,
синие штаны', 'рожок, зонтик'};

JNSERr iNTO cIpwnJ.K^fo.


^онзо видели VALUES
о ушрке Диксон.
в горошек', 'пение, танс^ы');

INSERT INTO clow njnfo


Сниф лз |зазт?езжа- VALUES
еил нл маш инке.
('Снифлз'. 'Заведение Трэйси', 'М. зелено-
фиолетовый кост ю м , длинный нас'.
'разъезж ает на машинке');

Мистера Хобо VALUES


видели на вече­
ринке Эрика Грея. ^.9.^9'.;. .O ’.??!;. 'М
j^a. черные волосы, маленькая шляпа', 'скрипка').

1 58 г ла ва 3
d e le te и upd a te

nam e 1ав1_аееп a ppearance a c tiv itie s


Элси Дом престарелых Ж, рыжие волосы, зеленый костюм, шарики, машинки
Черри Хилл огромные ботинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, мим
огромные ботинки
Снаглз Болмарт ж, желтая рубашка, красные штаны рожок, зонтик
Мистер Хобо Цирк ВО М, сигара, черные волосы, маленькая скрипка
шляпа
Кларабелл Дом престарелых Ж, розовые волосы, большой цветок, кричалки, ханцы
Бельмонт синее платье
Скутер Больница Окленд М, синие волосы, красный костюм, шарики
большой нос
Зиппо Торговый центр ж, оранжевый костюм, штаны танцы
Милстоун
Бэйб Автошкола Эрла Ж, розовый костюм с блестками эквилибристика,
машинки
Бонзо М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длин­
ный нос

Зиппо Торговый центр ж . оранжевый кост ю м, танцы, пение


Милстоун штаны

Снаглз болм арт Ж. желтая рубашка, крас­ рожок, зонтик


ные штаны

Б'ОНЗО Парк Диксон М, женское плат ье в горо­ пение, танцы


шек

Снифлз Заведение Трэйси Mj зелено -фиолетовый разъезж ает на


кост ю м, длинный нос машинке

М ист ер Цирк 8£7 М, сигара, черные волосы, скрипка


Хобо маленькая шляпа

у V ШТУРМ
Как узнать текущее местонахождение конкретного клоуна?

д а л ьш е > 159
можно ли получать данные в хронологическом порядке?

Как Вводятся сведения о клоунах


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

I File Edit Window Help CalchTheClown

SELECT * FROM clown info WHERE name = 'З и п п о ';

пат* арреагаяс«
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы,пение
Зиппо Больница Окленд Ж, оранжевый коаю м , штаны танцы,пение
Зиппо Заведение Трэйси ^ Ж, оранжевый костюм, штаны танцы,пение
Зиппо Болмарт \ Ж, оранжевый костюм, штаны танцы, жонглирование
Зиппо Торговый центр Милстоун \ж , оранжевый костюм, штаны танцы,пение
Зиппо Больница Окленд \Ж, оранжевый костюм, штаны танцы,пение

Абсолютно одина­ Эти записи тоже


ковые записи. полностьн) совпа­ И н ф о р м а ц и я п овт ор я­
дают. ется снова и снова.

Можно ли обратиться к данным с запросом и получить


только последние сведения о Зиппо? Можно ли опреде­
лить, где этот клоун выступал в последний раз?

160 гпава3
d e le te и u p d a te


Конечно,это
очень просто. Достаточно
обратиться к последней записи.

К сожалению, ничто не гарантирует, что


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

Существует целый ряд внутренних факторов, кото­


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

Ничто не гарантирует, что последняя


запись таблицы была добавлена
позднее других записей.

д а л ьш е ► 161
о структуре таблицы

Бонзо, у нас проблема


Так как мы не можем быть уверены в том, что последняя запись была добавлена позже
остальных, возникает серьезная проблема. Из таблицы можно получить информацию
о том, где находились клоуны в тот или иной момент времени. Н о сама таблица создава­
лась для получения и н ф о р м а ц и и о том, где каждого клоуна видели в последний раз!
И это не все. Обратили внимание на одинаковые записи? Две записи содержат информа­
цию о том, что Зиппо видели в одном и том же месте, за одним и тем же занятием. Дубли­
каты занимают место и замедляют работу РСУБД с увеличением объема таблиц. В табли­
це не должно быть дубликатов. В одной из следующих глав мы поговорим о том, почему
дубликаты нежелательны и как предотвратить их появление. Вы узнаете, как создать
таблицы, в которых дубликаты в принципе невозможны. А пока исправим существующую
таблицу так, чтобы она содержала полезные данные.

Часто
ДаДаБаеМые
БоЦ р>С ь 1

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

О Порядок следования записей в таблице не гарантирован:


к тому же скоро вы узнаете, как изменить порядок записей
Безусловно. Возьмем текущий пример: таблица в своем
текущем виде хранит не только последнее местонахождение
в полученных результатах. Нет полной уверенности в том, каждого клоуна, но и историю его перемещений. Вполне воз­
что последняя запись действительно была вставлена можно, что эта информация окажется полезной. Проблема
последней. Кроме того, порядок следования записей может в том, что запись не содержит информации о том, когда про­
быть нарушен из-за «человеческого фактора». Предполо­ изошло данное событие. Если добавить в таблицу столбец
жим, мы вводим две команды INSERT для одного клоуна. с датой и временем, мы получим возможность отслеживать
Если не хранить в таблице информацию о том, в каком перемещения клоунов с гораздо большей точностью.
порядке делались эти наблюдения, мы не будем знать, какое
Но сначала необходимо как-то избавиться от дубликатов,
из них произошло первым.
чтобы упростить содержимое таблицы.

Допустим, мы помним порядок наблюдений. Так по­


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

о Немного расширим пример. Информация о клоунах


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

^ Плохо спроектированные таблицы встречаются сплошь


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

162 глава 3
d e le te и u p d a te

Уничто)кение записей командой DELETE


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

Удаление записей из таблиг; осуществляется командой D E L E T E . В этой


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

Снова приведем .записи Зиппо.

nam e 1а81_вееп a ppearance a c tiv itie s


Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы,пение
Зиппо Больница Окленд Ж, оранжевый костюм, штаны танцы,пение
Зиппо Заведение Трэйси Ж, оранжевый костюм, штаны танцы,пение
Зиппо Болмарт Ж, оранжевый костюм, штаны танцы, жонглирование
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы,пение
Зиппо Больница Окленд Ж, оранжевый костюм, штаны танцы,пение

шаГнишы с Кодами
Мы написали простую команду для уничтожения одной из
записей о клоуне Зиппо, но магниты с фрагментами команды
полностью перепутались. Соберите фрагменты и укажите, что,
по вашему мнению, делает каждая часть новой команды.

WHERE Jll

паше
С
А по ст р оф ы , запятые пение
знаки равенства и с и м - FROM
олы слишком Малы^
чтоды подбирать их.
Зиппо
Р асставьт е их по своеми
усм от рению .
[

дальш е ► 163
магнит ы с командой DELETE от вет

а Г н и щ ь 1 с К оД аМ и
Мы написали простую команду для уничтожения одной из записей
о клоуне Зиппо, но магниты с фрагментами команды полностью пе­
репутались. Соберите фрагменты и укажите, что, по вашему мнению,
делает каждая часть новой команды.

В отличие от команды S ELEC T ика^ы-


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

d elete
<?- Таблица, из которой
удаляется запись.

FROM
Аобавьте операт ор
^ р ав ио ». апостро(^ы по
Jbe стороны о т магнит а
« т а н ц ы » и символ

и
WHEBE

ю
И не забудьте доба^^ главу) о пределяет , какая именно
имени.
вить условие W H E R E , запись удаляется командой DELETE
а то команда удалит
все з а п и си ’.

Эти м агнит ы в команде

Условие WHERE в командах DELETE


работает точно так же,
как в командах SELECT.

164 глава 3
d e le te и up date

использование команды DELETE


Взгляните на построенную нами команду DELETE. Она работает
именно так, как и следовало ожидать: все записи, соответствую­
щие условию WHERE, удаляются из таблицы.

DELETE FROM clown_info


WHERE
a c t i v i t i e s = 'танцы';

nam e 1а81_зееп ас11уЖ«>


Элси Дом престарелых Ж, рыжие волосы, зеленый костюм, огромные шарики,
Черри Хилл ботинки машинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, мим
огромные ботинки 0 X

Снаглз Болмарт ж , желтая рубашка, красные штаны рожок, зонтик 1<


М иаер Хобо Цирк ВО М, сигара, черные волосы, маленькая шляпа скрипка
Кларабелл Дом престарелых Ж, розовые волосы, большой цветок, кричалки,
Бельмонт синее платье танцы
'S 3-)
Скутер Больница Окленд М, синие волосы, красный коаю м , большой нос шарики CO
Зиппо Тортовь1Й центр Милстоун . Ж, оранжевый костюм, штаны ■ ' танцы.
Бэйб Автошкола Эрла Ж, розовый коаю м с блеаками эквилибриаика,
машинки
Бонзо М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос
Зиппо Торговый центр М илаоун ж , оранжевый костюм, штаны пение
Снаглз Болмарт Ж, желтая рубашка, красные штаны рожок, зонтик
Бонзо Парк Диксон М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый коаю м , длинный нос разъезжает
на машинке
М иаер Хобо Вечеринка Эрика Грея М, сигара, черные волосы, маленькая шляпа скрипка

Как вы думаете, может ли команда d e l e t e


удалить только один столбец из записи?

да л ьш е > 165
правила DELETE

Правила DELETE

Команда d e le te не позволяет удалить значение одного столбца


или группы столбцов.

Команда d e le te удаляет из таблицы одну или несколько запи­


сей (в зависимости от условия where).

Мы рассмотрели пример удаления одной записи из таблицы.


Также возможно удаление сразу нескольких записей. Для этого
критерий выбора удаляемых записей определяется при помощи
условия WHERE. СиНТаКСИС условия WHERE полностью совпада­
ет с синтаксисом where в команде s e l e c t (см. главу 2); в нем
могут использоваться все конструкции из главы 2, в том числе
l i k e , i n , between и операторы сравнения.

Будьте осторожны — следующая команда удаляет из таблицы


все записи:
DELETE FROM your t a b l e

_ Чаагю
--------- ДаДаБаеМые ---------------------
БоТ)р>Сь 1

Условие NHEBE в команде DELETE чем-нибудь


отличается от WHERE в команде SELECT?

• Ничем. Условия WHERE одинаковые, но сами


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

166 глава 3
d e le te u upd a te

^тоан ь Ш Ш с усЛоБиеМ WIPE


|j»eAciriaBbJiie на М е сте rj^yimbi Команд

Ш П Т с условиями Щ Ж - О предели те,

у д а л я т ли э т и КоМанды к а к и е -л и б о

Записи из таб Л и Ц ы .

У р>оБедшпе Лини1о о т к а ж ­
DELETE FROM d o u g h n u t _ r a t i n g s
до го усЛоВия к удаляемой

Записи (или Записям).

WHERE l o c a t i o n = 'K r is p y K in g ' AND r a t i n g <> 6 ;

WHERE l o c a t i o n = 'K r is p y K in g ' AND ra tin g = 3 ;

WHERE l o c a t i o n = ' Snappy B a g e l ' AND r a t i n g >= 6 ;

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g > 5 ;

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g = 3 ;

WHERE l o c a t i o n = ' Snappy B a g e l ' OR ra tin g = 6;

doughnut_ratings

le c a li« n lim e d a le ty p e r a tin g ‘ cem m ent«


Krispy King 8:50 27/9 с глазурью 10 почти идеально
Duncan's Donuts 8:59 25/8 NULL 6 жирноваты
Starbuzz Coffee 19:35 24/5 кекс с корицей 5 вчерашние, но вкусные
Duncan's Donuts 19:03 26/4 с вареньем 7 мало варенья

д а л ьш е > 167
стань DELETE, ответ

хпань ШШ сусЛоБиеМ
у р*еДС111аБьте себя на М е сте Грч^апы Команд

Ш .ПТ с условиями WIEfiE- О т ^ д е л и т е ,


у д а л я т ли э т и КоМандь! к а к и е -л и б о записи

из т а б л и Д ь !.

f J’oBeAume Лини1о o m к а ж ­
D ELETE FROM d o u g h n u t r a t in g s
дого усЛоВия к удаляемой

Записи (иЛи зап и сям ):

WHERE l o c a t i o n = 'K r is p y K in g ' AND r a t i n g <> 6 ;

Н е т совпадений,
WHERE l o c a t i o n = 'K r is p y K in g ' AND ra tin g = 3 ; не удаля­
ются.

WHERE l o c a t i o n = 'S nappy B a g e l ' AND r a t i n g >= 6 ; H em совпадении.


^ записи не удаля­
ются.

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g > 5 ;

WHERE l o c a t i o n = 'K r is p y K in g ' OR ra tin g = 3 ;

H em совпадений.
WHERE l o c a t i o n = ' Snappy B a g e l ' OR ra tin g 6 ; записи не у да ­
ляются.
doughnut_ratings
Iocalien lime d al* type rating с в т т * п 1а /
Krispy King 8:50 27/9 С глазурью 10 почти идеально ^
Duncan's Donuts 8:59 25/8 NULL б жирноваты
Starbuzz Coffee 19:35 24/5 кекс с корицей 5 вчерашние, но вкусные
Duncan's Donuts 19:03 26/4 с вареньем 7 мало варенья

З ^ н и я N U L L м о гу т создать проблемы при будуи^их запросах А ичш е


ввести какое-нибудь значение, чем ост авлят ь N U L L в столбие п п т п -
му что N U L L не находится по условию «равно».

168 глава 3
d e le te и up date

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

Наша задача — сохранит ь эт у


инф орм ацию в таблице. Д ля эко­
е о л о с . больш ой номии м е с т а в таблице на с. 1 (Ь5
приведена всего одна запись
цвсгмж, синеа
У
nam* аррмгаш с* actlvili««
Кларабелл Дом престарелых Ж, розовые волосы, большой кричалки, танцы
Бельмонт цветок, синее платье

Сначала команда IN SE R T добавляет новую информацию (и старую тож е),


тхтетзот тхттл 1 ■ При вставке использую т ся исход-
IN S E R T IN T O c lo w n _ in f o с/и ги
^ изм еняет ся только
VALUES
УАЬи1!:£> обновленный столбец.
( ' К л а р а б е л л ' , ' Дом п р е с т а р е л ы х Бельмоно?' , ' Ж , роз<
р о зо в ы е
в о л о с ы , больш ой ц в е т о к , с и н е е п л а т ь е ' , ' т а н ц ы ' ) ;

nam e last_*e en appearance a c tiv ltie s


Кларабелл Дом престарелых Ж, розовые волосы, большой цве- кричалки, танцы
INSERT
Кларабелл Дом престарелых Ж, розовые волосы, большой цве­ танцы
Бельмонт ток, синее платье

Затем старая запись удаляется командой DELETE с условием WHERE.

D ELETE FROM c lo w n _ in f o
Д л я поиска и удаления
WHERE ст арой записи и с п о л ь ­
a c t i v i t i e s = 'к р и ч а л к и , тан ц ы ' зу ет ся условие WHERE.
AND nam e = ' К л а р а б е л л ' ;

и в таблице остается только одна —новая — запись.

nam e ia *l_ se e n a ppearance a c liv ilie s


Кларабелл Дом престарелых Ж, розовые волосы, большой цве­ танцы
Бельмонт ток, синее платье

да л ьш е ► 169
возьми в руку карандаш

- ^ В о з ь м и В руку карандаш
Используйте команды INSERT и DELETE и внесите в таблицу
d r in k i n f о необходимые изменения. Затем запишите
измененные данные в пустой таблице справа.

d r in k in f o

4 гіп к _ п а ііі« cesi carba « •lo r U*


Терновник 3 8.4 желтый д 33
Голубая луна 2.5 3,2 синий д 12
Вот тебе на 3.5 8.6 оранжевый д 35
Лаймовый физз 2.5 5.4 зеленый д 24
Поцелуй 5.5 42.5 фиолетовый д 171
Горячее золото 3.2 32.1 оранжевый н 135
Одинокое дерево 3.6 4.2 красный д 17
Борзая 4 14 желтый д 50
Бабье лето 2.8 7.2 коричневый н 30
Лягушка 2.6 21.5 бронзовый д 80
Сода плюс 3.8 4.7 красный н 19

Уменьшите калорийность «Поцелуя» до 170.

Замените желтый цвет «золотистым».

170 гл ава 3
de le te и up d a te

drinkjnfo
<ігіпк_пате cost carbs color ісе calories
Терновник
Голубая луна
Вот тебе на
Лаймовый физз
Поцелуй
Горячее золото
Одинокое дерево
дорзая
Ьабье лето
Лягушка
Сода плюс

-v.

Очередное каверзное упражнение?


____ _________ __ >—

Для всех напитков, стоящих $2.50, поднять цену


до $3.50, а для напитков с ценой $3.50 — до $4.50.

дальш е ► 171
возьми в руку карандаш, решение

- ^ о з ь м и в руку карандаш
V Решение Используйте команды I N S E R T и D E L E T E и внесите в таблицу
d r i n k _ i n f o необходимые изменения. Затем запишите
измененные данные в пустой таблице справа.

d r in k i n f o

4 г ііік _ я а ііі* cesf carbs c» l« r ice ca le rie s


Терновник 3 8.4 желтый д 33
Голубая луна 2.5 3.2 синий Д 12
Вот тебе на 3.5 8.6 оранжевый Д 35
Лаймовый физз 2.5 5.4 зеленый Д 24
Поцелуй 5.5 42.5 фиолетовый Д 171
Горячее золото 3.2 32,1 оранжевый н 135
Одинокое дерево 3.6 4.2 красный Д 17
Борзая 4 14 желтый Д 50
Бабье лето 2.8 7.2 коричневый н 30
Лягушка 2.6 21.5 бронзовый Д 80
Сода плюс 3.8 4.7 красный н 19

Уменьшите калорийность «Поцелуя» до 170.

INSERT INTO d r in k jn fo VALUES ('Поцелуй', S .S , 4Я.5-,


'фиолетовый'J 'Д'^ 1 7 0 ) ;

DELETE FROM d r in k jn fo WHERE calories - 1 7 1 ;

Замените желтый цвет «золотистым».

INSERT INTO d r in k jn fo
VALUES ('Терновник', 3, 8 .4 , 'золот истый', Д ' , 3 3 ) ,
('дорзая', 4 , 1 4 , 'зо лот ист ы й ', 'Д',, SO):

DELETE FROM d r in k jn fo WHERE color = 'желтый';

172 гл ава З
de le te и up date

dnnkjnfo
dr^nk_name cost carbs color ice calories
Терновник 3 8.4 золотистый А 33
Голубая луна 3.5 3.2 синий Д 12
Вот тебе на 4.5 8.6 оранжевый Д 35
Лаймовый физз 3.5 5.4 зеленый Д 24
Поцелуй 5.5 4Z .S фиолетовый Д 170
Горячее золото 3.2. 3 2 .1 оранжевый н 135
Одинокое дерево 3.6 4.2 красный Д 17
Ворзая 4 14 золотистый Д 50
Вабье лето 2..S 7.2 коричневый н 30
Лягушка 2.6 2 1 .5 бронзовый Д 20
Сода плюс 3.8 4.7 красный н 19

X
T„K Э сл ж и . в « г л я г е « “ Х з 7 э.“ к » х
Не такое уж каверзное, но п о -
ду м ат ь придется. Если сначала
To ii' ^ o i^ .S O
^ '^0‘^ОМ с $3.SO до
HO это совершенно неважно.
ро
р ож
ж аает
е т ^дважды.
й Зм ест о^т ого
н у ж н о С Н .Ч .Л . и зм ен и т ь б Т л,
Очередное каверзное упражнение? цену (с $ 3 . 5 0 до H S O )
« меньилую («Голибая
^Уна» - с $ z . s o до $ 3 .s o ) .
Для всех напитков, стоящих $2.50, поднять цену до I
$3.50, а для напитков с ценой $3.50 — до $4.50. j

INSERT INTO d r in k jn fo VALUES ([Вот т ебе на', 4 .5 , 8 ,6 ,


'оранжевый', 'Д ', 3 S );

DELETE FROM d r in k jn fo WHERE cost = 3,5-;

INSERT INTO d r in k jn fo VALUES ('Голубая луна', 3 .5 , З .Я , 'синий',, 'Y', 1 Я ).


('Лаймовый физз', 3 .5 , 5 .4 , 'зеленый', 'У , 2 4 ) ;

DELETE FROM 'd rin k jn fo '\л1Ш^Е cost = 'z. 's; .................................................

Дополнительные баллы, если вы объединили две команды i n s e r t в одну!

дал ьш е > 173


осторожно с уда л е н и е м

Будьте Внимательны при выполнении DELETE


При выполнении команды DELETE всегда существу­
ет опасность случайного удаления записей, которые Будьте внимательны при ис­
вы удалять не собирались. Допустим, в таблицу была
добавлена новая запись о М истере Хобо; пользовании DELETE.
/Добавляемая
информация Мистера Хобо Убедитесь в том, что условие
и команда видели в заве­ WHERE точно описывает уда­
INSERT для дении Трэйси.
ее добавления.
ляемые записи и не включает
^ IN S E R T IN T O c lo w n _ in f o ничего лишнего.
VALUES
( ' № 1СФер Х о б о ' , ' Заведение Т р э й с и ' , 'М , с и га р а ,
ч ер н ы е в о л о с ы , м а л е н ь к а я ш л я п а ' , ' скрипка') ;

nam e 1а>1_>ееп a ppearance a c liv ilie s


Элси Дом престарелых Ж, рыжие волосы, зеленый костюм, шарики,
Черри Хилл огромные ботинки машинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, мим
огромные ботинки
Снаглз Болмарт ж , желтая рубашка, красные штаны рожок, зонтик
Мистер Хобо Цирк ВС М, сигара, черные волосы, маленькая шляпа скрипка
Кларабелл Дом престарелых Бельмонт Ж, розовые волосы, большой цветок, синее платье кричалки, танцы
Скутер Больница Окленд М, синие волосы, красный костюм, большой нос шарики
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы, пение
Бэйб Автошкола Эрла Ж, розовый костюм с блестками эквилибриаика,
машинки
Бонзо М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос
Зиппо Торговый центр Милстоун ж , оранжевый костюм, штаны пение
Снаглз Болмарт Ж, желтая рубашка, красные штаны рожок, зонтик
Бонзо Парк Диксон М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос разъезжает
на машинке
DELET3
Мистер Хобо Парк Диксон М, сигара, черные волосы, маленькая шляпа скрипка
ЧШ1СтерХобо 1 Заведение Трэйси | М, сигара, черные волосы, маленькая шляпа j скрипка ^

А теперь станьте командой DELETE.


174 глава 3
d e le te и u p d a te

^ ш а н ь ш е К о м а н д о й } jj Y
ЦиЖе т^Беден ы усЛоБия Щ. ддя cefuu к°Манд ])n , U l ;
К°тп°р*ые Должны удалишь Лишние записи из щавлиЦы
clown_mC> takle на предыдущей <3nj>aHuUe. Опре­
делите, какие условия действительно цоЛеЗНы,
а какие ЛиШь соада1<>т ноВые т^*°влеМы.

]^°Манда полезна/ ГсЛ и н е т — у к а ж и т е , поЧему.


DELETE FROM clow n i n f o

VIHERE last seen = 'Больница Окленд' ;

WHERE activities = 'скршиса';

WHERE last_seen = 'Парк Диксон'


AND name = 'Мистер Х о б о ';

WHERE last_seen = 'Больница Окленд' AND


last_seen = 'Парк Диксон';

WHERE last_seen = 'Больница Окленд' OR


last_seen = 'Парк Диксон';

WHERE name = 'Мистер Хобо'


OR last seen = 'Больница Окленд';

Д menefb напи Ш ите °Дну К°Манду


К о т о р а я у д а л и т Лишние записи М и стер а

не З а т р а г и в а я д руги х записей.

да л ьш е ► 175
ст аньт е командой DELETE, от вет

^шаньше К о м а н д о й )][J . Qm^eiii


]|иж е Т ^ веден ы усЯоБиЯ W UEfiE серии Команд ])П ,1Т1. К°Ц1°рые
Д°ЛЖНы удалишь ЛиШние Записи из шабЛиДы clov^i_ш£> taUe на
предыдущей сшраниДе. Определише, Какие усЛ°Бия дейсшВи-
шеЛьЯо Полезны, а какие ЛиШь соЗДа1ош ноВые 1^^*овлеМы.

К^оМанда п о л езн а? £сЯ и неш ----- укаЖ иш е, ПоЧеМу.


DELETE FROM clovm_info
^ Запись Скутера т о ж е у до влет -
>С воряет э т о м у условию.
WHERE last_seen = 'Больница Окленд'; .^ 9 А ‘? .к о о д н у
.......
Новая запись не должна
удаляться.
WHERE activities = 'скрипка'; Удаляет все записи М ист ера Хобо,
в, тр_мчиеле и новую. .................................

WHERE last_seen = 'Парк Диксон' Удаляет только одну из ст арых записей


AND name = 'Mr. H o b o '; М и ст ер а Хобо.
Связка AND означает, что o5a уело
^ вия должны быть истинными.
V WHERE last_seen = 'Больнш;а Окленд' .... .Нмч^.?р.не. у.дяАяе.т.........................................
AND last seen = 'Парк Дик с о н ';

WHERE last_seen = 'Больница Окленд' В м е с т е со ст ары м и записями М ист ера


OR last_seen = 'Парк Дик с о н '; Хобо удаляет записи донзо и Скутера.

WHERE name = 'Мистер Хобо' Удаляет все записи М ист ера Хобо,
OR last seen = 'Больница Окленд'; числе и ,нову ю, Я также запись
Скутера.

Д ш еп ер ь напиШише одну Команду ) П р ELETE FROM clow njnfo


К ош орая удаЛиш Лишние Записи Мисшера WHERE n a m e = ‘М и ст ер Хобо'
не Заш раГиВая друГих записей. AND last_seen <> 'Заведение Трэйси';

176 г л ава 3
d e le te и up d a te

Похоже, вы удалили что-то


лишнее? Возможно, стоило сначала
выполнить команду SELECT и по­
смотреть, какие записи будут удалены
с конкретным условием WHERE.

Точно! Если у вас нет полной


уверенности относительно ТОГО, что
условие Ш1ЕНЕ удалит только нужные
записи, сначала выполните команду
SELECT.
Так как обе команды используют одинаковые
условия WHERE, то команда SELECT вернет
записи, которые будут удалены командой DELETE
с этим же условием WHERE.

Этот нехитрый прием предотвратит случайное


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

дл-пыче > 177


горест и нєт очног-о у д а л е н и я

Проблемы с неточными условиями DELETE


Правильно написать команду DELETE сложно.
Сл'оит допустить малейшую неточность, и команда Чтобы не удалить посторонние
уд;ілит посторонние данные. Для предотвращения
уд;иіения лишних данных в схему INSERT-DELETE записи, сначала выполните
включается дополнительный шаг.

Вот как выглядит новый план ИЗ Т Р Е Х Ш АГОВ:


команду SELECT.

Слшч^ша произведите выборку удаляемой записи командой S E L E C T . Убе­


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

SELECT FROM c lo v m _ in f o
WHERE
a c t iv it ie s = ' танцы ';

1^. паш » a ppearance a c tiv itie s


1 '^ Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы

© Теперь добавьте новую запись командой INSERT.


И з м е н и т е т о л (?
ко т о т столбцы,,
IN S E R T IN T O c lo w n _ in f o Komopt’iii нужно
Iл,і АЛей и m b.
VALUES
( ' З и п п о ’ , ' Т о р го в ы й ц е н т р М и л с т о у н ' ,
' Ж , о р ан ж ев ы й к о с т ю м , ш та н ы ' , ' тан ц ы , пение' );

паш е la s t.s e e n appearance a c tiv itie s


Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
З и г^ [Торговьій центр М илстоун|^Ж , оранжевый костюм, штань! | танцы, пение ^

/ті
178 j
de le te a up date

Наконец, удалите старые записи командой DELETE с тем же


условием WHERE, которое использовалось в команде SELECT
на первом шаге.

И сп ользу йт е условие
D ELETE FROM c lo w n _ in f o HERE из команды
WHERE ^ ■ (илаг 1 ) для
поиска и удаления
a c t i v i t i e s = 'т а н ц ы ;
ст арой записи.

пат* а р р м га п с » ■ c tiv ilie *

Зиппо Торговый центр Милстоун ж , оранжевый костюм, штаны танцы,пение

В таблице остается только новая запись.

Ш
Ш
пат* ia s l_ s *c n а р р *а га п с * a c tlv ili* « X
X
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы,пение го
Q.

А как было бы здорово,


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

д а л ьш е * 179
UPDATE в д е й с т в и и

изменение данных командой UPDATE


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

Но вместо того чтобы вставлять в таблицу новую запись и удалять старую, можно об­
новить существующую запись, изменив в ней значения только тех столбцов, которые
требуется изменить.
Для этой цели используется команда SQ L UPDATE. Она обновляет столбец (или столб­
цы) новыми значениями. Как и в случае с командами SELECT и DELETE, для выбора
обновляемой записи (или записей) можно задать условие WHERE.

Пример использования команды UPDATE:

UPDATE d o u g h n u t _ r a t in g s Знакомое уело-


SET
КЙК U 6 коллйи-
Здесь задается . ■ •
Элх SE L E C T
новое значение. = ' гл а зи р о в а н н ы е '
м PE LE T E .
WHERE t y p e = ' с глазурью ';

Ключевое слово SET сообщает РСУБД о том, что в столбце, имя которого указано
перед знаком =, должно быть сохранено значение, указанное после знака =. В при­
веденном примере в столбец type записывается текст ' глазированные '. Условие
WHERE указывает, что изменения вносятся только в строках, у которых столбец type
содержит значение ' с глазурью'.

d o u g h n u t _ r a t in g s
locotien tiM« dat* lyp« гаНп9 cemment*
Krispy King 8:50 27/9 с глазурью 10 почти идеально
Duncan's Donuts 8:59 25/8 NULL 6 жирноваты
Starbuzz Coffee 19:35 24/5 кекс с корицей 5 вчерашние, но вкусные
Duncan’s Donuts 19:03 26/4 ■\ св^|»?ньем 7 мало варенья

d o u g h n u t _ r a t in g s
location time date type rating commeiits
Krispy King 8:50 27/9 глазированные 10 почти идеально
Duncan's Donuts 8:59 25/8 NULL 6 жирноваты
Starbuzz Coffee 19:35 24/5 кекс с корицей 5 вчерашние, но вкусные
Duncan's Donuts 19:03 26/4 с вареньем 7 мало варенья

180 глава 3
delete и update

Правила UPDATE
Команда u p d a te может использоваться для изменения
значения одного столбца или группы столбцов. Включи­
те дополнительные пары столбец = значение в усло­
вие SET и поставьте запятую после каждой пары:
UPDATE your_table
SET первый_столбец= 'новое_значение ',

второй_столбец = 'старое_значение';

Команда u p d a te может изменять одну запись или


несколько записей в зависимости от условия w here.

Чаошо
аДаБаеМые
BoTjJbC bi

Что произойдет, если условие WHERE не задано? Да, можете. Команда внесет те же изменения в ту же запись.
Для таблицы из четырех записей это нормально, но при работе
Каждый столбец, указанный в условии SET, будет обновлен с таблицей, содержащей сотни и тысячи записей, вам пришлось
новым значением. бы изменять по отдельности каждую запись, относящуюся
к Krispy King.

В запросе SQL на предыдущей странице два операто­


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

Абсолютно. Оператор = в условии SET означает «присвоить Как и в случае с командой DELETE, если вы не уверены
столбцу указанное значение», а оператор = в условии WHERE в том, что условие WHERE определяет только нужные записи —
проверяет, равно ли текущее значение столбца значению, ука­ сначала выполните команду SELECT!
занному после знака.

Может ли команда содержать более одной секции SET?


Могу ли использовать следующую команду для выпол­
нения той же операции? yj Нет, но это и не нужно. Все столбцы с новыми значениями
могут перечисляться в одном условии SET, как показано выше.
UPDATE doughnut_ratings SET type = 'глазиро­
ванные ' WHERE location = 'Krispy King';

д а л ьш е > 181
без INSERhVELETE

UPDATE как замена INSERT-DELETE


При выполнении команды UPDATE из таблицы ничего не удаляется. Вместо
удаления старая запись обновляется н о в ы м и данными.

К-оМйнЭй ^ ..-далее идет имя таблицы, с о ­


левого слоба UKU’ ■■■ держащей обновляемую запись.
V ^
S £ T определя- UPDATE table_name
и зм ен ен ия,
вноси. '\л.ые
пись.
SET имя^столбца = новое__значение
WHERE имя__столбца = старое^значение;
Условие WHERE определяет записи,
в которые вносятся изменения^
Команда UPDATE
заменяет комбинацию
Рассмо'грим на примере команды, рабо-
•гак)1цей с таблицей clown in fo . INSERT/DELETE.
Обновляется запись
X 1^аблицы clown info

^ I
''толбец
UPDATE cl0wn__inf0
>'‘‘'^исывается
.т р о к а 'Заве­ SET last__seen = 'Заведение Трэйси’
рь кие Трэйси'.
WHERE name = ’Мистер Хобо’
AND last seen = ’Парк Диксон’;
в н о с ,.:г

182
delete и update

UPDATE e действии
Команда UPDATE заменяет текущее значе­
ние столбца l a s t _ s e e n ('Парк Диксон') М истера Хобо
значением 'Заведение Трэйси'.
видели в « З а в е­
дении Трэйси».

U P D A T E c l o w n info t :
SET l a s t _ s e e n = 'Заведение Т р э й с и добавления.
W H E R E n a m e = 'вістер Хобо'
A N D l a s t _ s e e n = 'Вечеринка Э р и к а Г р е я ' ;

name last seen appearanc* aclivilies


Элси Дом престарелых Черри Ж, рыжие волосы, зеленый костюм, огромные шарики,
Хилл ботинки машинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, огромные мим
ботинки
наглз Болмарт Ж, желтая рубашка, красные штаны рож ок, зонтик
Цирк BG М, сигара, черные волосы, маленькая шляпа скрипка
Дом престарелых Бельмонт Ж, розовые волосы, большой цветок, синее платье кричалки, танцы
Больница Окленд М , синие волосы, красный костюм, большой нос шарики
Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
школа Эрла Ж, розовый костюм с блестками эквилибристика,
машинки
М , женское платье в горошек пение, танцы
М, зелено-фиолетовый костюм, длинный нос

на м е с 1^ е»_, что исклю чает о п а с-


(УО^Я ‘п осторонних данных
(хотя п ер еза п и сь су щ ест в ую щ и х
данных п о -п р еж н ем у возможна).

дальше >
во зьм и в р у ку карандаш

184 глгв а 3
delete и update

■tame 1ав1_аеен appearance activities


Элси Дом престарелых Ж, рыжие волосы, зеленый костюм, ш арики, машинки
Черри Хилл огромные ботинки
Пиклз Вечеринка Джека Грина М , оранжевые волосы, синий костюм, мим
огромные ботинки
Снаглз Болмарт ж, желтая рубашка, красные штаны рожок, зонтик
Мистер Хобо Цирк ВС М, сигара, черные волосы, маленькая шляпа скрипка
Кларабелл Дом престарелых Ж, розовые волосы, большой цветок, кричалки, танцы
Бельмонт синее платье
Скутер Больница Окленд М, синие волосы, красный костюм, шарики
большой нос
Зиппо Торговый центр Милстоун ж, оранжевый костюм, штаны танцы
Бэйб Автошкола Эрла Ж, розовый костюм с блестками эквилибристика,
машинки
Бонзо М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос

name ^лst_seen appearance activities


Элси Дом прест арелых Ж, рыжие волосы, зеленый кост ю м, шарики, м а ­
Черри Хилл огромные ботинки шинки
Пиклз Вечеринка Джека М., оранжевые волосы, синий м им
Грина кост ю м, огромные ботинки
Снаглз
М истер
Хобо
Кларабелл Д ом прест арелых Ж, розовые волосы, большой кричалки,
Вельмонт цветок, синее плат ье танцы
Скутер Вольница Окленд М, синие волосы, красный кост ю м, шарики
большой нос
Зиппо
Вэйд Автошкола Эрла Ж, розовый кост юм с блестками эквилибристи­
ка, машинки
Вонзо
Снифлз

дальше * 185
в о з ь м и в р у к у к а р а н д а ш , решение

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

..... .....................................................U,
W HERE name = 'Зиппо': „ „ „ о ара^а»
............................................................мач«к> М3 cmoAi«-»

..................................................... не
СЯ п р и озноблении.
Снаглз носит
синие штаны. SET appearance = ‘Ж. желтая рубашка,
синие штаны'
WHERE пате = 'Snuggles';

^онзо видели .{J.FPATE . с {ownJnfo


О парке Аиксон.
WHERE плте = 'Ьонзо';

p!p.yy.4)Ji^fp.
Снифлз рдз-ьезжл- SET activities = 'разтуезжает на машинке'
е т на мличинке.
WHERE пате = 'Снифлз';

UPDATE clownjnfo
Мистера Хобо SET last_seen = 'Вечеринка Э^?ика Грея'
видели на вече­
WHERE пате = 'Мистер Хобо';
ринке Эрика Грея.

186 глава 3
delete и update

na m e la s t se e n a p p e a ra n c e a c tiv itie s
Элси Дом престарелых Черри Ж, рыжие волосы, зеленый костюм, шарики, машинки
Хилл огромные ботинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, мим
огромные ботинки
Снаглз Болмарт Ж, желтая рубашка, красные штаны рож ок, зонтик
Мистер Хобо Цирк BG М, сигара, черные волосы, маленькая шляпа скрипка
Кларабелл Дом престарелых Бель­ Ж, розовые волосы, большой цветок, кричалки, танцы
монт синее платье
Скутер Больница Окленд М, синие волосы, красный костюм, шарики
большой нос
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
Бэйб Автошкола Эрла Ж, розовый костюм с блестками эквилибристика,
машинки
Бонзо М , женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос

Серые записи о ст а ю т ся 1^еизл'\ениыми


пат е 1а$Ь_$ееп \ appearance activities
Элси Дом прест арелы х^ Ж, рыжие волосы, зеленый кост ю м, шарики,
Черри Хилл огромные ботинки машинки
Пиклз Вечеринка Джека М, оранжевые волосы, синий м им
Грина кост ю м , огромные ботинки
Снаглз Волмарт Ж, желтая рубаш ка,(сиш еуит аны рожок, зонтик
М ист ер ( Ъечеринка Э рика^ М, сигара, черные волосы, м а лен ь­ скрипка
Хобо ^ ■Грея _______ _ кая шляпа
Кларабелл Дом прест арелых Ж , розовые волосы, большой кричалки,
В ел ш о н т цветок, синее плат ье танцы
Скутер Вольница Окленд М, синие волосы, красный кост ю м, шарики
большой нос
Зиппо Торговый центр Ж, оранжевый кост ю м , штаны ^ "пение^
Милстоун
Вэйб Автошкола Эрла Ж, розовый кост ю м с блестками эквилибристи­
ка, машинки
Вонзо Парк Диксо!^ М, женское плат ье в горошек пение, танцы
Снифлз З авёШ ш еТ рэйсо\ М, зелено-фиолетовый кост ю м , Г разъезж ает j
длинный нос V на м а ш и н к & ^

UPDATE. Наконец-то мы заполнили пробелы в таблице на с. 1 5 5 .

дальше > 187


другие примеры UPDATE

Обновление цен
Помните, как мы обновляли цены в таблице d r i n k i n f о? Напитки
с ценой $2.50 подорожали до $3.50, а напитки с ценой $3.50 —до $4.50.

drink info
4 г іп к _ п а ін « COSI c a rb s c o lo r ІС* c a lo rie s
Терновник 3 8.4 желтый Д 33
Голубая луна 2.5 3.2 синий Д 12
Вот тебе на 3.5 8.6 оранжевый Д 35
Лаймовый физз 2.5 5.4 зеленый Д 24
Поцелуй 5,5 42.5 фиолетовый Д 171
Горячее золото 3.2 32.1 оранжевый Н 135
Одинокое дерево З.б 4.2 красный Д 17
Борзая 4 14 желтый д 50
Бабье лето 2.8 7.2 коричневый н 30
Лягушка 2.6 21.5 бронзовый Д 80
Сода плюс 3.8 4.7 красный н 19

Как подойти к решению этой задачи? Один из возможных способов


с использованием команды UPDATE —перебрать все записи по отдель­
ности и написать серию команд UPDATE следующего вида:

UPDATE drink_info Цена увеличивает.ся на $!■


SET cost = 3.5
WHERE drink^name = ’Голубая луна’;
Z '
Условие WHERE однозначно
иден т и ф и ци р ует обновляе­
мы е записи.

188 глава 3
delete и update

P Возьми в руку карандаш

дальше ► 189
обновление нескольких записей

Достаточно одной команды UPDATE


В столбце c o s t хранится число. В SQL с числовыми столбцами можно выпол­
нять основные математические операции. Так, значение столбца c o s t можно увели­
чить на 1 для каждой записи в таблице, которую требуется изменить. Вот как это
делается:

UPDATE drink_info
У в е л и ч и т ь н а 1 цену в кдж
SET cost = cost + 1 ; дой из т р е х з а п и с е й , к о т о ­
рые т ребует ся изм енит ь
WHERE ( н а п и т к и з а $Z■SO и $ 3 . 50 )-

drink_name='Голубая луна'
OR
drink_name='Вот тебе на'
OR
drink name= 'Лаймовый физз'
Часгп'
'^ а Д а Б а е М ы е
БоТ1р>Сь1

Можно ли использовать вычита­ Какие еще операции можно вы­


Команда UPDATE мо­
ние? А какие еще олерации? полнять с данными, кроме простых
математических?
жет работать с груп­
yj- Умножение, деление, вычитание —
можете использовать любые из них. И ко­ ! Их довольно много. Позднее вы
пами записей таблицы.
нечно, в операциях могут использоваться узнаете, что можно сделать с текстовыми
другие числа, не только 1. столбцами и какие еще операции могут Используйте ее с основ­
выполняться с числовыми столбцами.
ными математическими
Можно привести пример с исполь­
зованием умножения? Ну например? Хотя бы намекните. операторами для обнов­
• Конечно. Допустим, имеется таблица
со списком товаров, каждый товар имеет
Ладно — например, функция
UPPER () преобразует все значение
ления числовых данных.
свою цену Вы можете воспользоваться текстового столбца в таблице к верхне­
командой UPDATE и умножить цену каж­ му регистру. А функция LOWER (), как
дого товара на фиксированную величину нетрудно догадаться, преобразует текст
чтобы вычислить цену с налогом. к нижнему регистру

190 алава 3
delete и update

Хорошо, что данные можно


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

Данные изменяются, поэтому


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

191
крат кий обзо р sq l

Нобые нструменты
Глава 3 скоро останется в прошлом.
Ниже приведена краткая сводка новых
команд SQL, которые вы узнали в этой
главе. Полный список инструментов
приведен в приложении III.

DELETE

Команда удаляет за-


у^иси данных из табли­
цы. Используйте усло­
вие WHERE для точного
определения удаляемых
записей.

SET

I значения Си,

192 :::пава 3
]=*ое]сшир»оБание ща^ЛиЦ

Как важно быть нормальным

До настоящего момента мы не особо задумывались


при создании таблиц. Работают — и ладно; в конце кон­
цов, с ними можно выполнять команды S E L E C T , IN S E R T , D E L E T E

И UPDATE. Но при увеличении объемэ данных постепенно стано­


вится ясно, что следовало бы сделать при создании таблицы для
упрощения условий w here : ее следовало бы сделать более нор­
мальной.
данны е для рыболова

Дбе таблицы
Джек и Марк создали таблицы для хранения информации о рекордах
рыбной ловли. В таблице Марка имеются столбцы для бытового и на­
учного названия рыбы, ее веса и места, где она была поймана. Столб­
ца для имени человека, поймавшего рыбу, в этой таблице нет. со ст о -
« чет ы рех
^/^олдцов. Сра-
fis h in fo с т а б ли -
чей F,sk r e c o r d ,
свттон species 1вса11ой w eiglil <^Ледуюіцеи
большеротый окунь м. salmoides М онтгомери Лейк, 6А 22 ф т 4 у н ц ^‘^ ранице. _____
судак S. vitreus Олд Хикори Лейк, ТЫ 25 фт 0 унц
лосось Кларка 0 . Clarki Пирамид Лейк, МУ 41 фт 0 унц
желтый окунь P. Flavescens Бордентаун, N1 4 фт 3 унц
синежаберник L.Macrochirus Кетона Лейк, А1 4 ф т 12унц
панцирник L. Osseus Тринити Ривер, ТХ 50 фт 5 унц
белый краппи P. annularis Дамба Энид, М5 5 фт 3 унц
красноперая щука E. americanus Дьюарт Лейк, 1М 1 фт 0 унц
серебристый карась C. auratus Л ейк Ходжес, СА 6 фт 10 унц
чавыча 0 . Tshawytscha Кенай Ривер, АК 97 фт 4 унц

Я ихтиолог, в своей таблице я буду


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

194 глава 4
проект ирование таблиц

В таблице Джека тоже хранятся бытовые и научные назва­


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

fis h re c o rd s

Игв1_пате 1ав1_пате соттоп 1оса11оп sla t* weight date


Д ж ордж Перри большеротый окунь М онтгомери Лейк GA 22 ф т 4 у н ц 2 /6 /1 9 3 2
М абри Харпер судак Олд Хикори Лейк TN 25 ф тО унц 2 /8 /1 9 6 0
Д жон Скиммерхорн лосось Кларка Пирамид Лейк NV 41 фт 0 унц 1/12/1925
С.С. Эббот желтый окунь Бордентаун NJ 4 фт 3 унц 1/5/1865
Т.С. Хадсон синежаберник Кетона Лейк AL 4 ф т 12 унц 9 /4 /1 9 5 0
Таунсенд Миллер панцирник Тринити Ривер ТХ 50 фт 5 унц 3 0 /7 /1 9 5 4
Фред Брайт белый краппи Дамба Энид MS 5 фт 3 унц 31/7/1957
М айк Берг красноперая щука Д ью артЛ ейк IN 1 фт 0 унц 9 /6 /1 9 9 0
Флорентине Абена серебристый карась Л ейк Ходжес CA 6 фт 10 унц 17/4/1996
Лес Андерсон чавыча Кенай Ривер AK 97 фт 4 унц 17/5/1985 /

Напишите запрос для каждой таблицы,


возвращающий все записи для штата Нью-Джерси.

дальше ► 195
в о з ь м и в р у к у к а р а н д а ш , реш ение

- ^Jomvi в руку карандаш


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

Мне почти никогда не приходится


искать записи по штату. Я храню
название штата в однолл столбце
Д л я получения р езу л ьт а т о в с названием города.
из ст роки «город, илт ат »
приходится использовать
ключевое слово LIKE.

SELEC T * FROM fishjnfo

WHERE location LIKE '7oNJ‘;

common species iocatien w eiglil


желтый окунь p. Flavescens Бордентаун, NJ 4 фт 3 унц

А мне часто при­


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

SELECT FROM fisi^_records

WHERE state = 'N J';

firsl name iasl_name common iocalien stale weigiit d ale


C.C. Эббот желтый окунь Бордентаун NJ 4 фт 3 унц 1/5/1865

196 глава 4
проект ирование таблиц

Часш°
- ЧадаБаеМые --------------
БопТЪ Сь!

Выходит, таблица Джека лучше, Почему короткие запросы лучше Допустим, в записи хранится по­
чем таблица Марка? длинных? чтовый адрес. Почему бы не создать
один столбец для хранения полного
Нет. Это разные таблицы с разными • Чем проще запрос, тем лучше. адреса и несколько других столбцов
целями. Марку редко приходится про­ С увеличением объема базы данных для хранения его составных частей?
водить поиск по штату, потому что его и добавлением новых таблиц запросы
интересуют только названия (бытовое
и научное) выловленных рыб и их вес.
усложняются. Начинайте с самых про­
стых запросов, позднее вы их оцените.
0: Дублирование данных поначалу
может показаться вполне разумной
мерой, но подумайте, сколько лишнего
С другой стороны, Джеку потребу­
пространства будет расходоваться
ется искать данные по штату в своих
Значит, в моих столбцах всегда на жестком диске, если база данных
запросах. Именно поэтому он создал
должны храниться как можно мень­ вырастет до значительных размеров.
в своей таблице отдельный столбец,
шие фрагменты данных? А еще при дублировании данных
чтобы было удобнее указывать штат
в команду UPDATE должно включаться
в запросах.
0: Не обязательно. Как показывает
пример с таблицами Марка и Джека,
дополнительное лишнее условие, и вы
должны помнить о нем при каждом из­
все зависит от использования цанных. менении данных.
Следует пи избегать оператора
LIK E в запросах? Что в нем плохо­ Для примера представьте таблицы со Давайте более подробно разберемся
го? списком машин, предназначенные для в том, как спроектировать оптимальную
автомеханика и продавца. Механику структуру таблицы для ваших целей,.
необходима подробная информация
В операторе LIKE нет ничего
о каждой машине, а продавцу может
плохого, но он усложняет структуру
быть достаточно фирмы-производителя,
запроса и повышает риск получения
посторонних результатов. Если столбцы
модели и номера. Структура таблицы за­
содержат сложную информацию, LIKE
не позволяет легко и однозначно опре­ висит от того, как вы
делить критерий поиска.
собираетесь использо­
вать свои данные.

МОЗГОВОЙ
ШТУРМ
3 0 1 — язык, используемый реляцион­
ными базами данных. Как вы думаете,
что означает термин «реляционный»
в контексте баз данных 5 0 1 ?

да л ьш е ► 197
рекомендации по проект ированию структуры таблиц

Логические связи как суть таблицы


SQL известен как язык Реляционных Систем Управления Базами
Данных (РСУБД). Термин запоминать не обязательно, нас интересу­
ет только слово «РЕЛЯЦИОННЫХ*». Для нас оно означает, прежде
всего, одно: чтобы правильно спроектировать таблицу, необходимо
продумать, как столбцы связываются друг с другом для описания не­
которого объекта.
Ваша задача —описать объект при помощи столбцов так, чтобы по
возможности упростить получение необходимой информации. Ко­
нечно, выбор во многом зависит от ваших требований к таблице, но
существуют некоторые общие меры, которые следует принять при
выборе структуры таблицы.

t :r
Какой основной объект
1. Выберите ОДИН объект, который описывает баша таблица^
должна описывать таблица.

2. Составьте список того, что необходимо


знать об этом объекте при работе
с таблицей.

3. Используя список, разбейте необ­


ходимую информацию об объекте К й к п р оиле всего запро
на фрагменты, которые могут ^ с и т '^ а н н ы е из таблицы.
использоваться для определения
структуры таблицы.

* В стречается мнение, что термин «РЕЛ ЯЦ И О Н Н Ы Й » отно­


сится к логическим связям между т аблицами. Это неверно.

198 глава 4
проект ирование таблиц

Сможете ли вы определить столбцы таблицы по тем словам, которыми ихтиолог


Марк описывает выборку данных из таблицы? Запишите имена столбцов в прямо­
ажнение угольниках.

Я провожу поиск по бытовому


или научному названию рыбы и хочу
узнать вес и место вылова.

Теперь ваша очередь. Напишите аналогичную фразу для Джека, автора


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

да л ьш е ^ 199
упражнение, реш ение

Сможете ли вы определить столбцы таблицы по тем словам, которыми ихтиолог


Марк описывает выборку данных из таблицы? Запишите имена столбцов в прямо­
ажнение угольниках.

бы товое
иам ание

/
г
я провожу поиск по бытовому или \
научному названию рыбы и хочу У
узнать вес и место вылова. ^
±_ Ф ..----------

вес
м есто вы яова

Теперь ваша очередь. Напишите аналогичную фразу для Джека, автора


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

200 глава 4
проект ирование таблиц

Но почему мы остановились на таблице


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

Да, можно, но такой уровень детализации


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

ШТУРМ
Как вы думаете, что означает
термин атомарный в контексте
данных 8 0 1 ?

далы ив > 201


атомарные данные

Атомарные данные
Что такое «атом»? Маленький блок информации, который невозможно (или нежелательно)
разделить на составные части меньшего размера. Это определение относится и к данным:
АТОМАРНЫЕ данные были разделены на наименьшие компоненты, дальнейшее деление
которых невозможно или нежелательно.

Д о ста вь за 30 минут, или Пицца бесплатно


Для примера возьмем курьера, доставляющего
пиццу юшептам. Чтобы выполнить свою работу,
ему достаточно знать улицу и номер дома в одном
столбце. Для пего эти данные являются атомарны­
ми: курьеру никогда не приходится искать номер
дома отдельно от названия улицы.
Более того, разбиение адреса доставки на назва­
ние улицы и номер дома только усложнит его
рабо1 у, а клиентам придется дольше дожидаться
своих заказов. < ^
Ддя одном
няк^щ им ул ицу ^ Н р

I File Edit Window Help SimplePizzaFactoty

o rd e r number 1 address

246 1 59 N. A jax Rapids


247 1 849 SQL S t r e e t
248 1 2348 E. PMP P laza
249 1 1978 HTML H eights
250 1 24 S. S e r v le ts Springs
251 1 807 I n f i n i t e C ir c le
252 1 32 Design P a tte rn s P laza
253 i 9208 S . Jav a Ranch
254 1 4653 W. EJB E s ta te
255 1 8678 OOA&D Orchard
-+■
> SELECT address FROM p iz z a d e l iv e r ie s WHERE o rd er num = 2 5 2 ;

address

32 Design P a tte rn s Plaza

1 row in s e t ( 0 . 0 4 sec)

202 глава 4
проект ирование таблиц

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

Д л я агента по торговле не.дви-


ж имост ьи) ситуаи,ия выглядит HOUSE
иначе. От деление номера дома
от названия улии,ы позволит
легко получит ь список дсмов,
FOR SALE
BY APP O IN TM E N T ONLY
продаваемых на заданной улице.

I File Edil Window Help IWanlMyCommission


V ' ^ ^ ,гт

-+
s tre e t_ n u m b e r 1 s tre e t_ n a m e I p ro p e r ty _ ty p e 1 p r ic e
-+ ------------------------------------------------- _ + ------------------------+ -------------
59 1 N. A ja x R a p i d s 1 condo 1 189000
849 1 SQL S t r e e t 1 a p a rtm e n t
1 109000
2348 1 E . PMP P l a z a 1 h o u se1 355000
1978 1 HTML H e i g h t s 1 a p a rtm e n t
1 134000
24 1 S . S e r v l e t s S p rin g s 1 h o u se1 355000
807 1 I n f in it e C ir c le 1 condo 1 143900
32 1 D e s ig n P a t t e r n s P l a z a 1 h o u se 1 465000
9208 1 S . J a v a R an ch 1 h o u se 1 699000
4653 i SQL S t r e e t 1 a p a rtm e n t 1 115000
8678 1 OOA&D O r c h a r d 1 h o u se 1 355000
.+------------------------------------ _+------------------------+-
> SELECT p r i c e , p r o p e r t y _ t y p e FROM r e a l _ e s t a t e WHERE s t r e e t nam e = 'S Q L S t r e e t '

I p r ic e I p ro p e r ty _ ty p e j

I 1 0 9 0 0 0 .0 0 I a p a rtm e n t |
I 1 1 5 0 0 0 .0 0 I a p a rtm e n t 1
+ + -----------------------
2 ro w s i n set (0.01 sec)

дальш е k 203
проект ирование атомарных данных

Атомарные данные и таблицы


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

Что описывает ваша


1 .Какой один объект таблица: клоунов, коров,
пончики, лю дей?
описывает ваша таблица?

2. Как вы предполагаете
ИСПОЛЬЗОВЭТЬ таблицу
для получения информации С п ро ек т и ру й т е таблицу
о ее объекте? т ак, чтобы запросы были
прост ыми!

столбцы таблицы
3. Содержат ли
атомарные данные,
чтобы запросы были короткими
и конкретными?

Часто
ЧадаБаеМые -
БоТ1р)Сь1

5:.Атомы совсем крошечные, верно? Значит ли это, что


данные нужно разбить на мельчайшие фрагменты?
Как атомарность данных упростит мою работу?

Атомарность упрощает контроль за правильностью данных


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

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

204 гпааа 4
проект ирование таблиц

- ф^огьт в руку карандаш - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


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

ПРАВИЛО 1. Столбец, содержащий атомарные данные,


не может состоять из нескольких однотипных элементов.
Столбец, interests таблицы
Грега my_contacts н аруш ает
это правило.

ПРАВИЛО 2. Таблица с атомарными данными


не может содержать несколько однотипных столбцов.
Таблица о
н а р у ш а е т э т о правило.

d jn irU ie > 205


в о зь м и в р у к у карандаш , решение

Возьми в руку карандаш


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

ПРАВИЛО 1. Столбец, содержаищй атомарные данные,


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

^оис^ превраи^ался
fooO am e ingredients ^‘^ояи^ий коилмар!

хлеб мука, молоко, яйца, gpoMu, масло Здесь то же самое:


п р е д с т а в ь т е , что
вам пот ребует ся
ш ат огурцы, помидоры, з^ень найти помидорь!
в списке ингреди -^
ентов.

ПРАВИЛО 2. Таблица с атомарными данными


не может содержать несколько однотипных столбцов.
Сли'мком много одно-
1^ и п н ы х столбцов!
tr
teacher studenti student2 ^ Students ^

Миссис Мартини
Д)ко ' Рон Келли
___ -—---- --------------- \------------—_____

^ u cm ep ГоВард Санд)кая Тим Д)кулия

206 глава 4
проект ирование т абл иц

Теперь, когда вы знаете «официальные» правила атомарности и три этапа создания атомар-

Т ш р^а ж н (
4 таблиц, взгляните на каждую таблицу, приведенную ранее в книге, и объясните, почему
она является (или не является) атомарной.

Таблица Грега, с. 83

Таблица с оценками пончиков, с. 112

Таблица с клоунами, с. 155

Таблица с описаниями напитков, с. 93

Информация о рыбах, с. 194

да л ьш е > 207
н орм ализация таблиц

О пользе нормализации
Ваша фирма по проектированию данных заработала,
вы наняли новых проектировщиков баз данных SQL. Атомарность данных — пер­
И конечно, вам не хотелось бы целыми часами объ­
яснять им, как работают ваши таблицы. вый шаг на нуги создания
Если ваши таблицы будут НОРМАЛИЗОВАНЫ, то
они будут соответствовать стандартным правилам,
НОРМАЛИЗОВАННОЙ
понятным для новых проектировщиков. К счастью,
наши таблицы с атомарными данными уже наполови­
таблицы.
ну нормализованы!

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

Таблица Грега, с. 83 и ^<seeking>> н а р у ш а ю т ...........


правило 1 .

Таблица с оценками пончиков, с. 112 А т о м а рна . В от личие от т аблицы easy_dn'nksj


ст олбцах хранит ся разндти^^^
И в от личие от ст олбца <<acti'^ip'es>> т а каж дом ст олбце хранится т о л ь ­
ко один информационный элем ен т .

Таблица с клоунами, с. 155 Не ат ом арна. В некот орых записях ст олбец «activities»


" " со д ер ж и т списо)< из нескбл 61<1Ах 'заня1т ииУа
еууу^ п^авилд^ 1..........................................................................................

Таблица с описаниями напитков, с. 93 Не ат ом арна. Таблица содерж ит более одного


'столбца ингредйёнтбб', а э т о ' н а р у ш а ет ...........
правило Z. .........................................................................

Информация о рыбах, с. 194 А т о м а рна . В разны х ст олбцах хранит ся разнот ипная


инф орм ация, и 6 каждом ст олбце содерж ит ся толИко
......................................................................... один информациднный^ РЛемент. .........................................................

208 глава 4
проект ирование таблиц

Преимущества нормализованных таблиц

1. Нормализованные таблицы не содер­


жат дубликатов данных, а это сокра­
щает размер базы данных. Отсутствие
дубликатов экономит
дисковое пространство

2. Уменьшение объема данных, по ко­


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

Мои таблицы не так


уж велики. Зачем мне
тратить время на их
нормализацию?

Потому что даже в небольших


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

дальше > 209


норм ализация и 1НФ

Ненормализованные клоуны
Помните таблицу с информацией о клоунах? Сбор информа­
ции о клоунах неожиданно превратился в национальное увле­
чение, и старая таблица уже не справляется с потоком инфор­ Запросы с поиском к этим
мации, потому что столбцы a p p earan ce и a c t i v i t i e s дви м с т о л б ц а м п о л у ч а ю т с я
содержат слишком много данных. Для наших целей эта табли­ очен(7 сл о ж н ы м и - ст о л б ц ы
ца не является атомарной. с о д е р ж а т сл и ш к о м м н о г о
данных!
c l o w n info
nam e 1м 1_««вп a p p e a ra n c e ас1|1гШ е*
Элси Дом престарелых Черри Ж, рыжие волосы, зеленый костюм, шарики,
Хилл огромные ботинки машинки
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, мим
огромные ботинки
Снаглз Болмарт ж, желтая рубашка, синие штаны рож ок, зонтик
Мистер Хобо Цирк ВС М, сигара, черные волосы, маленькая шляпа скрипка
Кларабелл Дом престарелых Бельмонт Ж, розовые волосы, больш ой цветок, кричалки, танцы
синее платье
Скутер Больница Окленд М , синие волосы, красный костюм, большой нос шарики
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
Бэйб Автошкола Эрла Ж, розовый костюм с блестками эквилибристика,
машинки
Бонзо Парк Диксон М, женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос разъезжает
на машинке

Р о ^ о зь м и в руку карандаш
Давайте сделаем таблицу более атомарной. Предположим, по­
иск должен вестись по столбцам ap p earan ce и a c t i v i t i e s , СГ)
GX1
GXI
а также по столбцам l a s t seen. Запишите более правильную
структуру столбцов.

210
проект ирование т а о ли ц

На полпути к 1НФ
Даже когда таблица содержит атомарные данные, пройдена только половина пути.
Полоностью нормализованная таблица находится в ПЕРВОЙ НОРМАЛИЗОВАН­
НОЙ ФОРМЕ, или сокращенно ШФ.
Таблица, находящаяся в форме Ш Ф, должна выполнять следующие два правила.

IV!ыужеъна&М, Каждая запись должна содержать


ется.
атомарные значения.

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

ШТУРМ
Как вы думаете, какие столбцы
хорошо подойдут на роль первич­
ного ключа?

дальше ►
правила первичных ключей

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


Столбец таблицы, который станет ее первичным
ключом, назначается при создании таблицы. Через
несколько страниц мы создадим таблицу и назначим
первичный ключ, но сначала давайте повнимательнее
разберемся с тем, какими свойствами должен обладать Первичный ключ —
первичный ключ.
столбец таблицы,
имеющий .уникальное
Первичный ключ используется
для однозначной идентификации значение для каждой
записей.
Это значит, что данные в столбце первично­
записи.
го ключа не могут повторяться. Для примера
возьмем следующую таблицу; как вы думаете,
какие из ее столбцов хорощо подойдут на роль
первичного ключа?

(номер 1а»1_пате Пга1_иатв рЬопе_питЬег


«•циамьмвг» (фамилия) (имя) (¥ея«ф«и)
страховаимя)

т
Каждому человеку назна­
V
8 эт и.
7 ^
с т о л и ц » ; б.соко и
чается уникальный номер
социального страхования;
э т о т ст олбец м о ж е т
с т а т ь первичным ключом.
Г е “ 'е Г ф » и 1 , 8 е р о я « и „ , Н. Л .и с ... каиЭ и-
даты на роль первичного ключа.

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


Руды пе социального страхования в базах данных.
>сщ орэжНь1 Количество краж личных данных только увеличивается, и люди
неохотно сообщают свои коды социального страхования —
и вполне обоснованно. Эти данные слишком важны, чтобы рисковать ими. Мо­
жете ли вы гарантировать, что ваша база данных защищена на 100%? Если
нет — номера социального страхования могут быть похищены вместе с личны­
ми данными ваших клиентов.

212 глава 4
проект ирование таблиц

Первичный ключ не может


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

Значение первичного ключа


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

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


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

Значения первичного ключа


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

ШТУРМ
Сможете ли вы предложить хороший первичный ключ с учетом всех
этих правил?

Еще раз просмотрите таблицы, встречавшиеся нам в книге. Есть ли


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

дальше ► 213
ещ е чут ь-чуть о первичных ключах

Погодите, если я не могу использовать


номер социального страхования, но при этом первичный
ключ должен быть компактным, отличным от NULL
и неизменным — то что же использовать?

Лучшим первичным ключом может быть новый


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

id ia s t_ iia in « ffirs l_ iia m e n ic k _ n a m e Д Ж о к а Брауна.


1 Браун Джон Д ж он
2 Эл су орт Ким Ким
3 Браун Джон Д ж он
4 Петрильо Мария Мария
Т о ж е запись Джона 5 р а у -
5 Ф ранкен Эсме Эм на, но с т о л б е ц 1Р показы
ваепл, что эта у никаль­
ная запись относит ся
к другому Джону 5рауну.
Jiff Л 1°бо5н атеЛ ьН ь1х

В мире SQL идут ожесточенные споры по поводу использова­


ния синтетических (то есть искусственно созданных, как стол­
бец 1 0 в этом примере) и естественных ключей — данных,
уже хранящихся в таблице (номер машины, номер социаль­
ного страхования и т. д.). Мы не будем становиться на ту или
иную сторону; в главе 7 первичные ключи будут рассмотрены
более подробно.

214 глава 4
проект ирование т абл иц

част°
Задаваем ы е
БоТ1|ЪСь1

Вы упоминаете о «первой» нормальной фор­ Столбец coInments в таблице с описаниями


ме. Значит, есть и вторая? И третья? пончиков мне не кажется атомарным. Другими
словами, я не вижу, как удобно провести поиск
! Да, вторая и третья нормальные формы дей­ по этому столбцу
ствительно существуют; они определяются более
жесткими правилами. Вторая и третья нормальные Совершенно верно. Поле не особенно атомарно,
формы рассматриваются в главе 7. но структура нашей таблицы этого и не требует Если
бы мы захотели ограничить комментарии заранее
определенным набором слов, то поле могло бы
Мы изменили свои таблицы, чтобы в них стать атомарным. С другой стороны, тогда поле не
хранились атомарные значения. Какая-нибудь содержало бы искренние комментарии в произволь­
из этих таблиц находится в 1НФ? ной форме.

Нет До настоящего момента ни одна из создан­


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

Как прийти в НОРМУ


Пришло время отступить на шаг и нормализовать наши табли­
цы. Для этого необходимо сделать данные атомарными и назна­
чить первичные ключи. Создание первичного ключа —один из
стандартных этапов написания кода команды C R E A T E T A B L E .

UJTVPM

A вы помните, как добавить столбец


в существующую таблицу?

дальше ► 215
и с п р а в л е н и е т аблицы грега

исправление таблицы Грега


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

Исправление таблицы Грега, шаг 1. Выполнить выборку всех


данных командой SELECT и как-то сохранить их.

Исправление таблицы Грега, шаг 2. Создать новую нормализо­


ванную таблицу.

Исправление таблицы Грега, шаг 3. Вставить все старые


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

Теперь старую таблицу можно удалить.

Минутку, у меня полная таблица данных. И вы


хотите, чтобы я удалил ее командой DROP TABLE, как
в главе 1, и ввел все данные снова — только для того,
чтобы создать первичный ключ в каждой записи?

Конечно, таблица Грега не совершенна.


Она не атомарна и в ней нет первичного ключа.
Но Грегу повезло: ему не придется пользоваться
старой таблицей и не придется удалять данные.
Чтобы назначить в таблице Грега первичный ключ
и сделать столбцы более атомарными, достаточно
всего одной команды. Но сначала небольшое от­
ступление...

216 глава 4
проект ирование таблиц

Старая команда CREATE TABLE


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

CREATE TABLE my_contacts

last_name VARCHAR(30),
first_name VARCHAR(20)
email VARCHAR(50),
gender CHAR(l), Иедк^зя AU

birthday DATE,
profession VARCHAR(50) созЗакии
location VARCHAR(50),
‘^одхо -
status VARCHAR(20),
роль
На interests VARCHAR(100)
ного
^льоча. seeking VARCHAR(100)

ШТУРМ
А если старая команда c r e a t e t a b l e нигде не была
записана? Как получить доступ к коду создания таблицы?

дальше ► 217
в ы в о д кода CREATE

таблицу
Сначала noka)ku д ш < и
Может, для просмотра кода создания таблицы восполь­
зоваться командой D E S C R I B E m y c o n t a c t s ? Результат
ее выполнения будет выглядеть примерно так:

I File Edit Window Help GregsListAgain


+----------------- .+--------------------------+ -----------+--------- +---------------- +------------
I Coluunn I Type I Null I Key I D efau lt I E x tra
+--------------------
1 last_nam e 1 v a rc h a r(3 0 ) 1 YES 1 1 NULL
1 f i r s t name i v a rc h a r(2 0 ) 1 YES 1 1 NULL
1 email 1 v a rc h a r(5 0 ) 1 YES 1 1 NULL
1 gender 1 ch a r(l) 1 YES 1 1 NULL
1 b irth d a y 1 d ate 1 YES 1 1 NULL
1 p ro fe s s io n 1 varchar(SO ) 1 YES 1 1 NULL
j lo c a tio n 1 v a rc h a r(5 0 ) 1 YES 1 1 NULL
1 s ta tu s 1 v a rc h a r(2 0 ) 1 YES 1 1 NULL
1 in te re s ts 1 varchar(lO O ) 1 YES i 1 NULL
1 seeking 1 varchar(lO O ) 1 YES 1 1 NULL
+------------------ .+ --------------------- -+----------+------- +----------- —+

Ho нас интересует код CREATE, a не описания полей таблицы.


И нам хотелось бы узнать, как должна выглядеть исходная команда,
не вводя ее заново.
Команда SHOW CREATE_TABLE возвращает команду CREATE TABLE,
которая была использована для создания таблицы (до занесения
в таблицу первых данных). Попробуйте ввести следующую команду:

SHOW CREATE TABLE my_contacts;

218 глава 4
проект ирование таблиц

Команда для экономии бремени


Взгляните на код, который использовался для создания таблицы на с. 217,
и приведенный ниже результат выполнения команды SHOW CREATE
TABLE m y _ c o n ta c ts . Эти фрагменты не идентичны, но если вставить
этот код в команду CREATE TABLE, результат будет тем же. Удз1лять обрат­
ные апострофы или параметры данных не нужно, но если вы это сделаете,
команда получится более компактной.

Эт и ^ обратные а у с т р о фы
CREATE
SQL сч и т а ет , что
столбцы по у м о л -
CREATE TABLE 'm y _ c o n t a c t s ' анию инициализи­
( р ую т ся значением
NULL (если явно не
la s t_ n a m e ' v a rc h a r(3 0 ) d e fa u lt N U LL, задано другое з н а ­
f ir s t_ _ N a m e ' v a rc h a r(2 0 ) d e fa u lt N U LL, чение).

e m a il' v a rc h a r(5 0 ) d e fa u lt N U LL, При создании т а ­


g e n d e r' c h a r ( l) d e fa u lt N U LL, блицы ж елат ельно
указывать, м о ­
b ir th d a y ' d a te d e fa u lt N U LL, ж е т ли столбец
p r o fe s s io n ' v a rc h a r(5 0 ) d e fa u lt N U LL, содерж ат ь NULL.

lo c a tio n ' v a rc h a r(5 0 ) d e fa u lt N U LL,


s ta tu s ' v a rc h a r(2 0 ) d e fa u lt N U LL,
in te r e s t s ' v a r c h a r ( lO O ) d e fa u lt N U LL,
s e e k in g ' v a r c h a r ( lO O ) d e fa u lt N U LL,
) E N G IN E = M y IS A M DEFAU LT C H A R S E T = c p l2 5 1

T
He обращайте внимания на т е к ст
после закрываюш,ей круглой скобки.
Он описывает м ехан и зм хранения
данных и и сп ользу ем у ю кодировку
символов. Пока нас у ст р о ят значения
по умолчанию
Если скопировать и выпол­
нить этот код, он создаст
Если исходная таб.лиця не была
удалена: то этой т'.адлшА^е п р и ­
дется присвоит ь новое имя.
^ таблицу.

дальш е > 219


CREATE TABLE и первичные ключи

Команда CREATE TABLE с назначением первичного ключа


Перед вами код, полученный при выполнении команды SHOW
CREATE TABLE. Мы удалили из него обратные апострофы
и последнюю строку. В начало списка столбцов был добавлен
столбец c o n t a c t i d с условием NOT NULL, а в конце списка Помнит е, что с т о л -
появилось условие PRIMARY KEY, в котором новый столбец 5еы, первичного кл ю ча
c o n t a c t _ i c i назначается первичным ключом. не м о ж е т содерж ат ь
N U L L ! П рисут ст вие
NULL в столбце п е р ­
вичного ключа не п о ­
зволит однозначно
CREATE TABLE my_contacts идентиф ицировать
( каждую запись
в таблице.
^ c o n ta c t_ id IN T NOT N U LL,

Мы создали новый la s t_ n a m e v a rc h a r(3 0 ) d e fa u lt NULL,


ст олбец contact_ f ir s t_ n a m e v a rc h a r(2 0 ) d e fa u lt NULL,
id, который с т а ­
н ет первичным e m a il v a rc h a r(5 0 ) d e fa u lt NULL,
ключом таблицы. g e n d e r c h a r ( l) d e fa u lt NULL,
Хранящиеся в нем
целые числа у н и ­ b ir th d a y d a te d e fa u lt NULL,
кальны для каждой p r o fe s s io n v a rc h a r(5 0 ) d e fa u lt NULL,
записи, а таблица
становится а т о ­ lo c a tio n v a rc h a r(5 0 ) d e fa u lt NULL,
марной. s ta tu s v a rc h a r(2 0 ) d e fa u lt NULL,
in te r e s t s v a r c h a r ( lO O ) d e fa u lt NULL,
s g te J fe irn g v a r c h a r ( j r ^ O L j u ^ ^ g g a u l t NULL,
(m iM M C £ K E Y ( c o n ta c t_ ld M
) У
Здесь назначается п ер в и ч ­
ный ключ таблицы. Синтаксис
п ро ст : за ключевыми словами
PRIMARY K EY в круглых скоб­
ках указывается имя с т о л б ­
ца, который будет первичным
ключом — в наш ем п р и м е р е
эт о новый ст олбец contact id.

220 глава 4
проект ирование таблиц

Часто
даДаБаеМые -
Бо1^ЪСь1

столбцах и типах индексов. До настоящего момента


Вы говорите, что первичный ключ не может со­ из индексов нам встречались только первичные ключи,
держать NULL. Что еще предотвращает появление но скоро вы лучше поймете смысл этой команды.
в нем дубликатов?
и еще одна ОЧЕНЬ полезная команда:

! Прежде всего вы сами. При вставке значений в та­ SHOW WARNINGS;


блицу столбцу c o n ta c t _ id присваиваются уникальные Если на консоли выводится сообщение о том, что
значения. Например, в первой команде INSERT столбцу выполнение команды SQL привело к выдаче предупре­
c o n ta c t i d присваивается значение 1, во второй — ждений, то для просмотра предупреждений используется
команда SHOW WARNINGS.
значение 2 и т д.
Существуют и другие разновидности команды SHOW.
Мы рассмотрели лишь те, которые имеют прямое от­
Присваивать новое значение столбцу PRIMARY ношение к интересующим нас темам.
KEY при каждой вставке новой записи весьма хло­
потно. Нет ли более простого способа?
Для чего нужны обратные апострофы в резуль­
• Есть два таких способа. Первый — использование татах SHOW CREATE TABLE? Вы уверены, что без
в качестве первичного ключа заведомо уникального них можно обойтись?
столбца таблицы. Мы уже упоминали о том, что этот
способ может создать проблемы (как, например, при ис­ • РСУБД в некоторых ситуациях не может определить,
пользовании номеров социального страхования). что имя столбца действительно является именем столб­
Второй, более простой способ заключается в создании ца. Например, если имена столбцов будут заключаться
нового столбца с уникальными идентификаторами — как, в обратные апострофы, вы сможете использовать в ка­
честве имен зарезервированные ключевые слова SQL
например, c o n ta c t _ id на предыдущей странице. Вы
можете приказать своей РСУБД автоматически генери­ (хотя это крайне неудачная мысль).
ровать его значения при помощи специальных ключевых Допустим, по каким-то непостижимым причинам вы хоти­
слов (подробности на следующей странице). те включить в таблицу столбец с именем s e le c t. Такое
объявление столбца недопустимо:

Для чего еще можно использовать SHOW, кроме s e le c t v a rc h a r (5 0 )


вывода команды CREATE? А такое объявление сработает:

• Команда SHOW может использоваться для вывода ' s e l e c t ' v a rc h a r(5 0 )


информации о столбцах таблицы:

SHOW COLUMNS FROM ta b le n a m e ; А почему ключевые слова нельзя использовать


Команда выводит описания всех столбцов таблицы в именах столбцов?
с типами данных, а также другими сведениями, относя­
щимся к конкретным столбцам. Можно, но нежелательно. Только представьте, каки­
SHOW CREATE DATABASE databasenam e; ми запутанными станут ваши запросы и сколько хлопот
По аналогии с командой SHOW CREATE <таблица>, будет с вводом обратных апострофов, когда можно
эта команда выводит код команды создания базы данных. обойтись без них. Кроме того, s e le c t — неудачное
имя столбца: оно ничего не сообщает о данных, которые
SHOW INDEX FROM ta b le n a m e ; в нем хранятся.
Команда выводит информацию об индексируемых

дальш е ► 221
ключевое слово AUTO INCREM ENT

1, 2, 3 u так оалее Вот оно: в ооАЬ-


Если снабдить столбец c o n t a c t i d ключевым словом ш инст ве реализаций
AUTO INCREMENT, то РСУБД будет автоматически заполнять SQL прост о добавь­
его значениями: 1 для записи 1, 2 для записи 2 и т. д. т е ключевое слово
A U TO JN CREM EN T
(Пользователи M S SQL
указывают ключевое
CREATE TA B LE m y _ c o n ta c ts слово INPEX с началь­
ным значением и п р и ­
(
ращением- З а кон-
c o n ta c t id I N T N O T N U L L A U T O I N C R E M E N T , Третной информацией
о6раш,айтесь к с п р а ­
la s t_ n a m G v a r c h a r ( 3 0 ) d e fa u lt N U LL,
вочному руководству
fir s t_ n a m e v a r c h a r ( 2 0 ) d e fa u lt N U LL, по M S SQL).
e m a il v a rc h a r(5 0 ) d e fa u lt NU LL,
g e n d e r c h a r ( l) d e fa u lt N U LL, У первой записи
b ir th d a y d a te d e fa u lt N U LL, в э т о м столбце
сохраняется з н а ­
p r o f e s s io n v a rc h a r(5 0 ) d e fa u lt N U LL, чение 1 . З а т е м
lo c a tio n v a rc h a r(B O ) d e fa u lt N U LL, значение столбца
авт омат ически
s ta tu s v a rc h a r(2 0 ) d e fa u lt NU LL, увеличивается
на 1. при каждой
in te r e s ts v a r c h a r ( lO O ) d e fa u lt N U LL,
вставке новой
s e e k in g v a r c h a r ( lO O ) d e fa u lt N U LL, записи.
P R IM A R Y KEY (c o n ta c t id )

Пока все достаточно просто.


Но как должна выглядеть команда
INSERT, если этот столбец заполняет­
ся автоматически? Могу ли я случайно
присвоить ему другое значение?

Как вы думаете, что произойдет?


А еще лучше — попробуйте и посмотрите сами.

222 гл ава 4
проект ирование таблиц

Напишите команду create t a b l e для создания приведенной ниже таблицы, в которой


ажнение хранятся имена и фамилии. Таблица должна содержать столбец первичного ключа с клю­
чевым AUTO_iNCREMENT И два атомарных столбца.

2 - Откройте терминал SQL или графический интерфейс, выполните команду


CREATE TABLE.

Попробуйте выполнить каждую из приведенных ниже команд in s e r t . Обведите


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

IN S E R T IN T O y o u r_ ta b le (id , firs t_ n a m e , la s t_ n a m e )
VALUES (N U LL, 'М а р с и я ', ' Б рэди') ;

IN S E R T IN T O y o u r_ ta b le (id , firs t_ n a m e , la s t_ n a m e )
VALUES (1 , 'Д ж е н ', 'Б р э л и ') ;

IN S E R T IN T O y o u r_ ta b le
VALUES ( ' ' , ' Б о б б и ', ' Б рэди') ;

IN S E R T IN T O y o u r_ ta b le (firs t_ n a m e , la s t_ n a m e )
VALUES ( ' С инди', ' Брэди') ;

IN S E R T IN T O y o u r_ ta b le (id , firs t_ n a m e , la s t_ n a m e )
VALUES (9 9 , 'П и т е р ', 'Б р э д и ') ;

Все ли команды были выполнены успешно? Напишите, как будет


выглядеть содержимое таблицы после выполнения команд in s e r t .

your_tabie

id First_name last_name

д а л ьш е > 223
у п р а ж н е н и е , решение

Напишите команду create t a b l e для создания приведенной ниже таблицы, в которой


ажнение хранятся имена и фамилии. Таблица должна содержать столбец первичного ключа с клю­
чевым AUTO INCREMENT И два атомарных столбца.

CREATE TABLE your_table


(
id INT NOT NULL AUTOJNCREM ENT,
fin t _ n a m e VARCHAR(ZO),
iast_name V A R C H A R (3 0 ),
PRIMARY KEY (id)
);
2* Откройте терминал SQL или графический интерфейс, выполните команду
CREATE TABLE.

Попробуйте выполнить каждую из приведенных ниже команд in s e r t . Обведите


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

IN S E R T IN T O y o u r_ ta b le (id , firs t_ n a m e , la s t_ n a m e )
siA LU E S (N U L L , 'М а р с и я ', 'Б р э д и ') ;

IN S E R T IN T O y o u r_ ta b le (id , firs t_ n a m e , la s t_ n a m e )
VALUES (1 , ' Д ж ен', ' Б рэди') ;

Г IN S E R T IN T O y o u r_ ta b le
V ^^^U E S ( ' ' , 'Б о б б и ', 'Б р э д и ') ^

IN S E R T IN T O y o u r_ ta b Ie (firs t_ n a m e , la s t^ n a rm
ALUES ( ' С инди', ' Б рэди') ;

ÇJNSERT IN T O y o u r _ L d b i ü — f± tt7 Iirs t_ n a m e , la s t_ n a m e


w w jjE s fq q , 'п и Ф е р ', ' В р э д и ' ) ; ____________________________

Последняя команда
« p a 5omae.w\»j [ все ли команды были выполнены успешно? Напишите, как будет выглядеть
ко з а м е и я е !^ содержимое таблицы после выполнения команд in s e r t .

Ljourjtahie

id first_name last_name
г Марсия Брэди Похоже, м ы пот еряли
запись Д ж е н , когда
Z добби 5рэди попы т ались н азна­
3 Синди Ърэди чит ь ей индекс, уже
назначенный Марсии!
Питер Врэди

224 гл ава 4
проект ирование таблиц

_ Часто
--------- ЧадаБаеМые --------------------
. Б о ц р )С ь 1

Почему первый запрос (с NULL в столбце id )


вставляет запись, хотя для id установлено офаниче-
ние NOT NOLL?

• Хотя на первый взгляд команда выполняться не долж­


на, с AUTO_INCREMENT значение NULL просто игнориру­
ется. С другой стороны, без AUTO_INCREMENT ВЫ полу­
чите сообщение об ошибке, а запись вставлена не будет.
Убедитесь в этом сами.

Знаете, это не обнадеживает. Конечно, я могу


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

Вводить данные заново


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

дальш е ► 225
д о б а в л е н и е первичного ключа

Добавление первичного Ьюча 6 еуи^еетвующую таблицу


Перед вами код добавления первичного ключа AUTO INCREMENT
в таблицу m y _ c o n ta c ts . (Команда получается довольно длинной,
так что книгу придется развернуть.)

ти §
'^1 ц
’5 I ■р о
^ 5 о Q и
03
л о ^ Q 4J
с и
S ^5 5I
Y ^ о 03
I-
и m
f I (D 03
ю
U 5
§
о VO
m S с^.
X J3
S
Q.
О)
m
R
с
(U р
S m
- с ^
л ю та
S га i*;


S

0
03
J]
Ct 0Q
О
J3 Ш X
m СО m
ь: к о:
5

226 гл ава 4
проект ирование таблиц

ALTER TABLE u добавление первичного ключа


Проверьте, как работает этот код. Откройте терминал SQL, вы­
полните команду U S E для базы данных g r e g s _ l i s t и введите
следующую команду:

Гр й е E d ™ w J n d W Help A it^rätiön

> ALTER TABLE m y_contacts


Сообщает, - > ADD COLUMN c o n ta c t_ id INT NOT NULL AUTO_INCREMENT FIRST,
что ст олбец - > ADD PRIMARY KEY (c o n ta c t i d ) ;
был добавлен
Query OK, 50 rows a f f e c t e d ( 0 . 0 4 sec)
в 5 0 записях,
R ecord s: 50 D u p lic a te s : 0 W arnings: 0
уже хранящихся
в нашей таблице.
У вас их будет
меньш е.
Здорово! У меня появился первичный
ключ, заполненный данными. Может
ли команда ALTER TABLE добавить
столбец с номером телефона?

Чтобы увидеть, что произошло


Столбец c o n t a c t jd с таблицей, выполните команду
бключен в таблица SELECT * from my_contacts;
первым, до всех
остальных File Edit Window Help Alterations
столбцов.
1 c o n ta c t_ id 1 last_nam e
, 1_ _
1 first_n am e 1 em ail rк
1 1 1 Андерсон 1 Джиллиан j jill_anderson@ yahoo •Я1
1 2 1 Иоффе 1 Кевин 1 к j 0 s imuduck. com r
1 3 1 Ньюсам 1 Аманда 1 aman21uv0yahoo.com 1
CO
1
1
4
5
1
1
Гарсиа
Раундтри
1
1
Эд
Джо-Энн
1
1
ed990mysoftware.com
jojo@yahoo.com
f
k.

Hй^^0мнuм, что
При следую щ ей вставке новой
c o ^ t a c t M Sydem ^p uceo m o tLl сы ол5^у
это еще. не конец
таблицы; у Грегд
Ц^' Если у последнрй злм, ^ ^ c t j d 0 т а б ли - м ного знакомых.

содерж ит значение 2 3 тп co n tactjd


ои будет равен 2 4 . ' ^ записи

Получит ли Грег свой столбец с номером телефона? Об этом вы узнаете в главе 5.

дальш е * 227
крат кий о б з о р s q t

Нобые инструменты
Вы взяли на вооружение материал главы 4. Только
посмотрите, сколько у вас появилось новых
инструментов! Полный список инструментов приведен
в приложении III.

Атомарные данные

ваю т ся ат омарны м и
^сли они разбиты на '

Силодбец. не м ож е^
‘ АДариие З " ”"' ;<.кол»№Х Одно-
= = • * = -
■г г - : л е м е к ^ 08- I create ta b le

^ м а н д а выводит и г а -
! вилшыа синтаксис

Первичный ключ
^^Жна
СтоАбщ или набор ст олб­ I рочения, и
цов, значение которого
однозначно идентифици­
рует запись в таблице. ‘^ о р о м . *

, ''“» -w c r a w a w

/ ^ ‘^т.ически p
У^^^кальное
значение.

228 ;:/їі;еа 4
проект ирование таблиц

Возьми в руку карандаш


Решение Давайте сделаем таблицу клоунов более атомарной. Предположим,
поиск должен вестись по столбцам a p p e a r a n c e и a c t i v i t i e s ,
а также по столбцам l a s t s e e n . Запишите более правильную
структуру столбцов.

Здесь н ет единственного правильного ответ а.

фактически лучш ее, что м о ж н о сд ела т ь —


это выделить в отдельные столбцы такие
ат рибут ы , как пол, цвет к о ст ю м а , цвет
илтанов, т и п илляпы, музыкальный и н с т р у м ен т ,
шарики (д а /н ет ), пение (д а /н е т )? танцы
(д а /н ет ) и т. д.

Чтобы таблица была атомарной разные виды


действий и эл ем ен т ы внешнего вида н уж н о
р а зд ел и т ь по разным столбцам.

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


вы р еш или р а зд ел и т ь ст олбец м е с т о н а ­
хождения на ш т а т , город и улицу!

дальше * 229

Как изменить прошлое ★

Вам никогда не хотелось исправить прош лы е ош иб­


ки? Что же, теперь у вас есть такая возможность. Благодаря команде
A L TE R вы сможете применить свои новые знания к таблицам, создан­
ным много дней, месяцев и даже лет назад. А самое замечательное,
что это никак не повредит существующим данным! К настоящему мо­
менту вы уже знаете, что означает понятие нормализованный, и мо­
жете применять его ко всем таблицам — как прошлым, так и будущим.
модификация т а б л и ц ы грега

Ну)кно Внести пару изменений


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

Значит, я все-таки могу до­


бавить столбец с номером
телефона?

Да, он легко добавляется


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

232 глява 5
ALTER

Взгляните повнимательнее на команду ALTE R TABLE, использо­


ванную для добавления первичного ключа в главе 4. Удастся ли вам
составить свою команду ALTER TABLE для добавления столбца
с номером телефона из 10 цифр? Учтите, что в новой команде не
обязательно использовать все ключевые слова из приведенного
примера.
ALTER TABLE my_contacts
ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact i d ) ;

Запишите свою команду ALTER TABLE:

Вы также можете задать местонахождение нового столбца в таблице при помощи ключевого слова
AFTER. Попробуйте определить, где должно находиться это ключевое слово, чтобы новый столбец
был добавлен после столбца f i r s t name.

Запишите новую версию своей команды ALTER TABLE:

аальш е > 233


в о з ь м и в р у к у к а р а н д а ш , реш е ни е

- ^ о з ь м и в руку карандаш
Взгляните повнимательнее на команду ALTER TABLE, использо­
ванную для добавления первичного ключа в главе 4. Удастся ли вам
составить свою команду ALTER TABLE для добавления столбца
с номером телефона из 10 цифр? Учтите, что в новой команде не
обязательно использовать все ключевые слова из приведенного
примера.
ALTER TABLE my_contacts
ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (contact_id) ; J

Ключевые слова NOT NULL,


Запишите свою команду ALTE R TABLE: A U TO JN CREM EN T и FIRST
в новой команде не используются.
И зм ен ен и я , как и преж де, вносятся
в таблицу my_contacts.
................................................V ...................................................
.............................................................................................Будем сч и т а т ь, что
APD COLUP^N pkone VARCHAR(IO); ^лина телефонного
..............— ..................................... ................................................. ном срй не превы -
^ ‘^ о т ф р а г м р - ^ х нобого ш ает г о цифр. Грег
команде ALTER столбца. не подумал о т е л е -
изменения ^
вносятся в таблицу.

Вы также можете задать местонахождение нового столбца в таблице при помощи ключевого слова
AFTER. Попробуйте определить, где должно находиться это ключевое слово, чтобы новый столбец
был добавлен после столбца f i r s t _ n a m e .

Запишите новую версию своей команды ALTER TABLE:

ALTER TABLE my_contacts

A P P COLUMN p^one, y A R C H A R C lO )

AFTER first_name;
................... j ............. ^ ........................................................
Ключевое слово AFTER с именелл Условие AFTER не с’<5я зд ^ ел ь
- 7 с л и оно
довать новый столбец. Таким об- сто.лбец добавляе
разом , ст олбец ркопе в таблице ^ конец таблицы.
следует за столбцом Пг51 ^пате.

234 глава 5
ALTER
Наряду с ключевыми словами FIRST и AFTER при
вставке столбцов могут использоваться ключевые
слова BEFORE и LAST. сД еной

А также SECOND, THIRD И так далее.

аГниш ы с Кодами
Измените позицию добавляемого столбца p h o n e при помощи магни­
тов с ключевыми словами. Создайте как можно больше разных команд,
запишите состояние столбцов после их выполнения. Конструкция
BEFORE в MySQL не работает; довольствуйтесь F IR S T и AFTER.

phene contact id last name first name •m ail


a lt e r TA BLE m y _ c o n ta c ts
ADD C O LU M N p h o n e VAR C H AR (1 0 )

centactJii last name first name email liiiene

ALTER TABLE m y _ c o n ta c ts
ADD C O LU M N p h o n e VAR C H AR (1 0 )

centact_ld phene 1 last_name first_name email

ALTER TABLE m y _ c o n ta c ts
ADD C O LU M N p h o n e VAR C H AR (1 0 )

centact id last name phene firstn am e email

ALTER TA BLE m y _ c o n ta c ts
ADD CO LU M N p h o n e VAR C H AR (1 0 )

Д о б а в ь т е свои
м а г н и т ы в коней,
ком анды .

И сп о л ь зу й т е си м в ол « ; »
в е з д е , гд е п о т р е б у е т с я .

дальше ► 235
развлечения с магнитами, ответ

^ а Г н и т ы с к°ДаМи
I Измените позицию добавляемого столбца phone при помощи магни­
тов с ключевыми словами. Создайте как можно больше разных команд,
запишите состояние столбцов после их выполнения. Конструкция
BEFORE в MySQL не работает; довольствуйтесь F IR S T и AFTER.
С ключевым словом F fR S T
с т о л б е ц phone р а з м е щ а ­
ALTER TABLE m y _ co n ta cts ет ся перед всеми о с т а л ь ­
ADD COLUMN phone VARCHAR ( 1 0 ) | ными стол6и,ами.

phoa* CMtMct id la«l nam* I ffini nam* •m ail

ALTER TABLE m y _ co n ta cts С ключевым с л о ­


ADD COLUMN phone VARCHAR ( 1 0 ) f LAST | |~T~| вом L A S T столбец,
p ho n e р а зм е щ а -
ет ся после всех
ALTER TABLE n ^ _ c o n ta c ts
остальных ст о л б -
ADD COLUMN phone VARCHAR( 1 0 ) L нов. То же п р о и с ­
ходит при и с п о л ь ­
ALTER TABLE m y _ co n ta cts зовании ключевого
ADD COLUMN phone VARCHAR(10) слова FIFTH и без
указания позиции.

c»nlacl id Iasi first n« •m ail phene

С ключевым словом
ALTER TABLE iiQ r_contacts SECOND ст олбец
p h o n e р а з м е щ а ет ся
ADD COLUMN phone VARCHAR (10)
во второй позиции;
ALTER TABLE in y _ co n ta cts то же происходит
при использовании
ADD COLUMN phone VARCHAR(10) ключевого слова
BKFORE BEFORE (с и м ен ем
_name J столбца last_name).

c«ntact_id I phen^ | last_nam^ | first_nam^ •m ail

Конструкция A F T E R last_name
ALTER TABLE n iy _ co n ta cts р а з м е щ а е т ст олбец phone
ADD COLUMN phone VARCHAR(10) в т р е т ь е й позиции. Если бы
в наборе был м а г н и т THIRD,
то он сделал бы то же самое.

phan^ first.nam a •m ail

236 глава 5
ALTER

изменение таблиц
Команда ALTER
позволяет изме­
нить практически
Dataville Alterations
любые атрибу­
О бслуж и ван и е сущ ествую щ их та б л и ц :
ты таблицы без
необходимости
повторной встав­
ки данных. Будьте
CHANGE - и зм ен ен и е и м ен и и т и п а д ан н ы х ст о л б ц о в *

осторожны: изме­
нение типа данных
MO 0 IDY - и зм ен ен и е т и п а д ан н ы х и л и позииз^и

столбца может сто л б ц о в *


привести к потере
данных.
ADD - д о б а в л ен и е ст о л б ц о в в т а б л и ц у (тш х д а н н ь к
п о вы бор у за к а зч и к а ) ^
Одно мапеньн
изменение,это
DROP- у д а л е н и е ст о л б ц о в и з таб л и ц ы *
совсем не больно.

* В о зм о ж н а п о т е р я д а н н ы х , ааранхшхя
не п р е д о с т а в л я е т с я .

ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ

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


(Ф олько при и с п о л ь з о в а н и и ADD)

Projekts
Какие изменения могут потре­
боваться в этой таблице? nw m ber
1 покраска дома Мэрфи
2 перестройка кухни Вальдес
3 укладка паркета Келлер
4 кровельные работы Джексон

OculhiUe у 237
к а п и т а л ь н ы й ремонт

Капитальный ремонт таблицы Служба ремонта таблиц к ва­


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

Не содерж ит и н ­
ф ормации о т о м ,
какие данные д о л ж ­
ны храниться
Н а з в а н и е ст олб' в этой таблице.
С парой символов
ца ничего не /
^подчеркивания имя
г о в о р и т
о его 1
столбца ст а н ет
содержимом- ^
более П 0ЧЯНа.(1Ь/Л'1
Projekts

num ber «1е8СГ| р|1опо1 р го { c o n lra c te r o n fo b


1 покраска дома Мэрфи
2 перестройка кухни Вальдес
3 укладка паркета Келлер
4 кровельные работы Джексон

И мена таблицы и столбцов


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

I File Edit Window Help BadtablePesign

— > D E SC R IBE P r o j e k t s ;
+------------------------------+-------------------- +--------- +--------+--------------+---------- +
I F ie ld 1 Type I Null i Key I D efau lt | E x tr a |
+------------------------------+-------------------- +--------- +------- +-------------- +-----------+
I number I int(ll) I YES | I NULL | |
I d e s c rip tio n o fp ro j I v a rc h a r(5 0 ) | YES | I NULL | |
I co n tra cto ro n jo b | v a rch ar(lO ) | YES | I NULL | |

3 rows in s e t ( 0 . 0 1 sec)

238 глава 5
ALTER

Переименование таблицы
У таблицы в ее текущем состоянии имеются свои недостатки,
но с помощью команды A L T E R мы сделаем ее пригодной для
хранения списка работ по ремонту дома. Начнем с присваивания
таблице осмысленного имени командой A L T E R T A B L E .

« p ro jek ts» — ст а р о е
и м я т аблицы .

ALTER TA B LE p r o je k ts

RENAM E TO p r o je c t_ lis t;
-------
/ « P ^ o je c t _ li5 t» - новое и мя ,
Т аблицу ниж но кот орое м ы п рисваиваем
Пь РЕ И М Е Н О 13ЛТЬ т аблице.

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

Чтобы таблица стала НОРМ АЛИЗОВАННОЙ, мы добавим


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

дальш е у 239
упражнение, реш ение

Что еще следует сделать для улучшения таблицы? Найдите в описании клю­

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


названия столбцов.
Реш ение

Не огорчайтесь, если ваши


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

г
Чтобы табл»^а стопа НОРМАЛИЗОВАННОЙ, мы добавим
con^name \ в иее^ е^ \ лчи^ клю^ьс уникальным идентификатором
проекта. Также нам понадобятся столбцы дл<р п и сан и ^
каждого проекта(дат^ачала сюбот<31Бимерной с то и м о с т^
(^ в а н '^ к о м п а н и ^ -подрядчика иС^ м е р а т е л е ф о ^

___________ J
est cost \
startjate \
con^phone I

240 глава 5
ALTER

грандиозные планы

project_list

n um ber 4 е а < г1 р 11е п е 1р г о | c e n tra c le re n ie b


1 покраска дома Мэрфи
2 перестройка кухни Вальдес
3 укладка паркета Келлер
4 кровельные работы Джексон

Данные трех новых столбцов уже хранятся в таблице.


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

ШТУРМ
Какой из существующих столбцов станет
хорошим кандидатом на роль первичного
ключа?

а а л ьш е ^ 241
изменение столбцов

Лерепланиробка столбцов
Итак, план действий составлен. Теперь мы можем изменить
существующие столбцы командой ALTER и привести их в соот­
ветствие с новой схемой назначения имен:
[>=>> number преобразуется в первичный ключ pro j_id
ОФ d e s c r ip t i o n o f p r o j преобразуется в столбец с описа­
нием проекта pro j_desc
c o n tr a c to r o n j ob преобразуется в столбец с названи­
ем компании-подрядчика con_name

Остается добавить в таблицу три столбца с именами e s t _ c o s t ,


con phone и s t a r t d ate.

го\j-'deiC-
ваться p ro
projeCt_list j

n um ber d escri p lio n o fp r« ! c o n lra c le ro n io b

Первый стол5еи, п е р е ­
именовывается в p ro jjd .
Столбцу с названием
Он ст а н ет первичным
ключом таблицы.
fc orn пдкле.
x z ttr
project_list

p re L W p ro L d e s c con_name

242 - j ’. ni ab
ALTER

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

I File Edit Window Help BadTableDesIgn

— > D E SC R IBE p r o j e k t s ;
+------------------------------+-------------------- +--------- +--------+--------------+-----------+
I F ie ld I Type I N u ll I K ey I D e fa u lt | E x tra |
+------------------------------+-------------------- +--------- +--------+--------------+-----------+
I num ber I in t(ll) I YES | | NULL | |
I d e s c r ip tio n o fp r o j I v a rc h a r(S O ) | YES | | NULL I |
I c o n t r a c t o r o n jo b | v a r c h a r (lO ) | YES | 1 NULL | |
+------------------------------+-------------------- +--------- +------- +--------------+-----------+
3 ro w s i n set (0.01 sec)

üiTVPM
Проверьте типы столбцов и решите, соответ­
ствуют ли они тем данным, которые мы соби­
раемся хранить в таблице.

дальше ► 243
команды ALTER и CHANGE

ALTER u CHANGE
Ha следующем шаге мы присвоим столбцу number новое имя p ro j _ i d и устано­
вим для него атрибут AUTO INCREMENT. Затем столбец будет назначен первичным
ключом. Описание звучит устрашающе, но на самом деле все очень просто. Более
того, задача решается всего одной командой.

На эт о т р аз и сп о л ь зу ет -
СЯ конструкция CHANCE Не забудьт е,
COLUMN, п от ом у чт о мы что т аблице
изм ен яем как им я, т ак ■м ст олбец зап о лн я ­
было присвоено
« p r o j j d » — но­ ет ся а в т о м а т и ч е­
и т и п данных ст олбца, новое имя. вое им я, ко т о ­ ски ген ерируем ы м и
( который ран ее назывался )
«n u m b er». рое присваива­ целыми числам и, без
ет ся столбцу. значений NULL.
ALTER TABLE project_list ^
CHANGE COLUMN пгдшЬег proj_id INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY ('proj_id') ;

Эт а част ь команды приказы вает


Р С У 5Д использоват ь ст олбец
с новым и м ен ем p r o jjd
в качест ве первичного ключа.

Р ^^Возьми в руку карандаш - - - - - - - - - - - - - - ^- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


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

I/O
GX1

244 гл ава 5
ALTER

изменение двух столбцов одной командой SQL


А сейчас мы изменим не один, а целых два столбца всего одной командой. Столбцы
d e s c r ip t i o n o f p r o j и c o n t r a c t o r o n jo b будут переименованы одновременно
с изменением их типов данных. Все, что для этого потребуется —включить в коман­
ду ALTER TABLE две строки CHANGE COLUMN, разделив их запятой.

^^^^scriptionofproi» - У величиваем к о ли ­
^ у р о е имя ст олбца, чест во символов,
кот орое изм ен яет ся чтобы в т аблице
э т о й командой. «p roj^ desc» м о ж н о было х р а ­
новое имя н ит ь более дли н ­
столбца... ные описания.
A LTER TABLE p r o j e c t _ l i s t
\ «Г
CHANGE COLUMN d e s c r i p t i o n o f p r o j p r o j _ d e s c VARCHAR( 1 0 0 ) ,
CHANGE COLUMN c o n t r a c t o r o n j o b con__name VARCHAR( 3 0 ) ;
T /'
Д ругое ст ар о е
имя ст олбца, ...новым и м ен ем соп_пат е,
« co n tra cto ro n jo b » , а эт о новый т и п данных.
тоже, будет заме--
немо...

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


5удьш е привести к потере информации.
оСцю роЖ Ны Если новый тип данных несовместим со старым, то команда не вы­
полняется, а РСУБД сообщает об ошибке в команде.
Но что ещ е хуже, если старый и новый типы совместимы, может произойти усече­
ние данных.
Например, при преобразовании столбца ^агсЬафО) к типу сЬаг(1) значение столбца
Ъонзо' превратится в Ъ'.
То же относится и к числовым типам. Тип столбца можно сменить, но данные
будут преобразованы к новому типу, а это может привести к частичной потере
информации!

да л ьш е ► 245
ключевое слово MODIFY

А если я хочу изменить тип данных столбца (например,


чтобы в нем помещалось больше символов), но при этом оставить ему
прежнее имя — я могу просто повторить имя столбца, верно? Вот так:
ALTER TABLE т у Т а Ы е
CHANGE COLUMN myColumn myColumn NEWTYPE;

Конечно, такой способ работает,


но есть и более простой путь.
Воспользуйтесь командой MODIFY. Она меня­
ет только тип данных столбца, оставляя неиз­
менным его имя.
Допустим, вы хотите увеличить длину столб­
ца для хранения данных pro j des с до
VARCHAR (120 ). Это делается так:

A LTER TABLE p r o j e c t _ l i s t
M O D IF Y COLUMN p r o j _ d e s c VARCHAR( 1 2 0 ) ;

Иовый т и п даииь1Х_
изм еняем о г о
И не з а б у д ь т е п р о с л е д и т ь з а т е м ,
ч т о б ы новый т и п не прибел
к у с е ч е н и ю с у щ е с т в у ю щ и х данных!
1
Чаат '=
Задаваем ы е -
Бо1]ТЬсь1

5 :^А если я захочу


я выполнить
в
изменить порядок столбцов? Могу ли
команду: ALTER TABLE MODIFY COLUMN
5не :'создаст
I
Но разве хранение столбцов в неправильном порядке
проблем?
p ro j_ d e s c AFTER con_name;
РГ'
0: I Нет, потому что в команде SELECT можно указать порядок
0:
^• После того как таблица будет создана, порядок столбцов
изменить невозможно. Фактически лучшее, что можно сделать —
вывода столбцов в результатах запроса. Неважно, в каком
порядке хранятся данные на жестком диске; вы всегда можете
добавить новый столбец в нужной позиции и удалить старый, использовать запись вида:
но тогда все данные в старом столбце будут потеряны.
SELECT columns, columnl FROM your_table;
или:

SELECT columnl, column3 FROM your_table;


или получить столбцы в любом другом порядке.

246
ALTER

Я говорю по телефону со
своим агентом. Добавьте
остальные столбцы само­ p r o je c t_ lis t
стоятельно, хорошо?
p re iJ d proi_d*8c con_nam»
1
2
3

В таблицу необходимо добавить еще три столбца: для хранения телефо­


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

p r o je c t_ lis t

дальше » 247
упражнение, решение

я говорю по теледюну со
своим агентом. Добавьте
/пражнение остальные столбцы само­ p r o je c t_ lis t
'Р е ш е н и е стоятельно, хорошо?
p ro i_ id pro|_<ies< свя_паш *
1
2
3

в таблицу необходимо добавить еще три столбца: для хранения телефо­


на, начальной даты и примерной стоимости работ.
Напишите одну команду alte r t a b le , которая добавит эти столбцы;
обратите внимание на типы данных. Затем заполните приведенную ниже
таблицу

ALTER TABLE projectjtabie

А Р Р COLUMN con_phone VARCHAR(IO),


J/
Мы добавляем
новые ст олбцы, A P P COLUMN start^date PATE.
поэт ом у и сп о л ь ­
зует ся А Р Р - ^ A P P COLUMN est_coSt PECIM AL(7,Z):

Н апом ним , что эт о поле


PEC со ст ои т из 7 циф р,
с Z циф рам и в дробной части.

p r o je c t_ lis t

p r« U < i proj_dl*sc cen^nam e con _ p h o n * « le rl_ d e t* •e t.c e « !


1
2
3

248 глава 5
ALTER

Стоп!
Никаких лишних столбцов!
Только что выяснилось, что наш проект вре­
менно приостановлен. В результате столбец
s t a r t _ d a t e можно удалить из таблицы. Нет
смысла хранить в базе данных лишнюю ин­
формацию, которая только попусту занимает
место.
В таблицах рекомендуется держать только
те столбцы, с которыми вы действительно
работаете. Если столбец не используется,
удалите его. Если он вдруг снова понадобится
вам в будущем, его можно будет легко добавить
командой ALTER.
Чем больше столбцов в таблице, тем большую
работу придется проделать РСУБД при обра­
ботке запросов и тем больше места занимает
база данных. Возможно, при малом объеме
данных это незаметно, но с увеличением
объема таблицы задержка при получении
результатов становится более ощутимой.

Р Возьми В руку карандаш


Напишите команду 501 для удаления столбца s t a r t _ d a t e .
Мы еще не описывали ее синтаксис, но вы все равно попы­
тайтесь.

да л ьш е > 249
возьми в руку карандаш, р еш ение

- |^ о з ь м и в руку карандаш
Решение Напишите команду 501 для удаления столбца s t a r t _ d a t e .
Мы еще не описывали ее синтаксис, но вы все равно попы­
тайтесь.

И мя таблицы

ALTER TABLE projectJable


DROP COLUMN startjate;
Столбцы удаляют ся
командой PR O P. Прош,е Имя удаляемого
простого'. столбца.

ь Все данные, хранившиеся


)Удьтп6 I в удаленном столбце, теряются!
Будьте очень внимательны при исполь­
o C u io J b ^ K H b il
зовании DROP COLUMN. Возможно, сначала
стоит выполнить выборку данных из столбца, который вы
собираетесь удалить, и убедиться в том, что в нем дей­
ствительно нет ничего нужного! Лучше хранить в табли­
це лишние данные, чем лишиться жизненно необходимой
информации.

250 глава 5
ALTER

Пришло время превратить вашу ста­

ажнение рую, скучную таблицу в настоящую


«бомбу». Вы и не подозревали, что

i такие превращения возможны!

С
Итак, мы возьмем жалкую второсортную таблицу с данными подержанных
автомобилей и командой alter преобразуем ее в новенькую и сверкаю­
щую. Задача усложняется тем, что хранящиеся в таблице данные должны
остаться неповрежденными. Готовы к испытанию?
Дополнительные баллы, если вам удастся все сделать в одной команде
ALTER TABLE.

h o o p t ie

color year m ake mo how m uch


серебристый 1998 Porsche Boxter 17992.540
NULL 2000 Jaguar XJ 15995
красный 2002 Cadillac Escalade 40215.9

c a r ta b le

c a r jd VIN m ake m odel co lo r year p rice


1 RNKLK66N33G213481 Porsche Boxter серебристый 1998 17992.54
2 SAEDA44B175B04113 Jaguar XJ NULL 2000 15995.00
3 3GYEK63NT2G280668 Cadillac Escalade красный 2002 40215.90

251
упражнение, р е ш е н ие

Пришло врелля превратить вашу ста­

ажненке рую, скучную таблицу в настоящую


«бомбу». Вы и не подозревали, что
такие превращения возможны!

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


автомобилей и командой alter преобразуем ее в новенькую и сверкаю­
щую. Задача усложняется тем, что хранящиеся в таблице данные должны
остаться неповрежденными. Готовы к испытанию?
Дополнительные баллы, если вам удастся все сделать в одной команде
ALTER TABLE.

hooptie

co lo r уоаг тако mo howmwch


серебристый 1998 Porsche Boxter 17992.540
NULL 2000 Jaguar XJ 15995
красный 2002 Cadillac Escalade 40215.9

саг table

car id VIN m ake m odel co lo r yoar p rice


1 RNKLK66N33G213481 Porsche Boxter silver 1998 17992.54
2 SAEDA44B175B04113 Jaguar XJ NULL 2000 15995.00
3 3GYEK63NT2G280668 Cadillac Escalade red 2002 40215.90

252 глава 5
ALTER

^^bC K IB E и п ро вер ьт е т ипы


Данных всех с т о л б о в
Это п ом ож ет избеж ат ь
возможной п от ер и инф ормации
ALTER TABLE hooptie ^ ^ "
RENAME ТО carjable,
ALTER TABLE carjable
ADD COLUMN carJd INT NOT NULL AUTOJNCREMENT FIRST,
ADD PRIMARY KEY (carjd),
С т олбец « т о » п е р е и м е -
ALTER TABLE carjable и овывает ся 6 « m o d e l» ,
"" п о с л е чего с т о л б ц ы
« co lo r» м « и е а г » р а з м е -
ADD COLUMN VIN VARCHAR(I6) SECOND, ьцак>тся з а нилА.

CHANGE COLUMN mo model VARCHAR(20),<


Переименованному столбцу

MODIFY COLUMN color AFTER model, т и п данных.


Т а к ж е М ож но б ы л о и с 1^ользо~
MODIFY COLUMN year SIXTH, ^ конст рукцию « y e a r AFTER
m o d el» или « y e a r BEFORE p rice».

CHANGE COLUMN howmuch price DECIMAL(7,2);

да л ьш е >• 253
часто задаваемые вопросы

Часто«»

^аД аБ аеМ ы е
Б оТ )|оС ь 1

Ранее вы говорили, что я не могу изменить порядок сле­ А если я случайно создам первичный ключ, а затем
дования столбцов командой MODIFY, а моя РСУБД позволя­ передумаю и захочу использовать другой столбец? Можно
ет мне переставить столбцы. Как она это делает? ли удалить атрибут первичного ключа без изменения дан­
ных, хранящихся в столбце?
^ J Ваша РСУБД незаматно для вас выполняет сразу несколько
операций. Она копирует значения из перемещаемого столбца, Можно, притом очень просто:
сохраняет их во временной таблице, удаляет перемещаемый
ALTER TABLE your_table DROP PRIMARY KEY;
столбец, изменяет таблицу и создает новый столбец с таким же
именем, как у старого, копирует в него данные из временной
таблицы и удаляет ее.
Как насчет атрибута AUTO INCREMEOT?
Если столбцы уже содержат данные, а ваши программные
инструменты SQL не выполняют все эти действия за вас, лучше • Его можно назначить столбцу у которого этого атрибута нет,
оставить столбцы на старом месте. Вы всегда можете получить следующим образом:
столбцы командой SELECT в любом нужном порядке.
ALTER TABLE your_table CHANGE your_id your_id
INT(11) NOT NULL AUTO_INCREMENT;
Получается, легко изменить порядок следования столб­
цов можно только при добавлении нового столбца?
A удаление выполняется следующим образом:

* Правильно. Лучше всего заранее продумать порядок столб­ ALTER TABLE your_table CHANGE your_id your_id
цов в ходе проектирования таблицы. INT(11) NOT NULL;
Помните, что в таблице может быть только одно поле AUTO_
INCREMENT, оно должно относиться к типу данных INTEGER
и не может содержать NULL.

КЛЮЧЕВЫЕ
МОМЕНТЫ

Команда change позволяет изменить как Для определения порядка столбцов ис­
имя, так и тип данных столбца. пользуются ключевые слова first ,last ,
BEFORE имя_столбца, AFTER имя_столбца,
Команда modify используется для измене­
SECOND, THIRD, FOURTH И T Д.
ния только типа данных.
В некоторых РСУБД порядок столбцов
Команда drop column удаляет столбец
может изменяться только при добавлении
с заданным именем из таблицы.
их в таблицу
Команда rename изменяет имя таблицы.

254 >/7363 5
ALTER

^ ----------
Теперь в моей табли­
це есть первичный ключ и столбец
с номером телефона, но с атомарностью
по-прежнему проблемы. Некоторые запросы
остаются слишком сложными — как, на­
пример, запрос по названию штата в поле
location.

------ ^

Команда ALTER TABLE помогает улучшить


структуру таблицы.
Используя ALTER TABLE вместе с командами
SELECT и UPDATE, мы можем преобразовать гро­
моздкие, неатомарные столбцы в точные и удоб­
ные атомарные столбцы. Для этого нужно лишь
правильно скомбинировать уже известные вам
команды SQL.
Рассмотрим команду CREATE TABLE для таблицы
Грега m y _ c o n ta c ts .

CREATE TABLE m y _ c o n t a c t s
(
c o n ta c t_ id IN T NOT NU LL AUTO_INCREM ENT
la s t _ n a m e VARCHAR( 3 0 ) d e f a u l t NULL,
fir s t_ n a m e VARCHAR( 2 0 ) d e f a u l t NULL,

две
e m a i l VARCHAR( 5 0 ) d e f a u l t NULL,
<^pOKu созда - g e n d & r C H A R (l) d e f a u l t NULL,
4aZ m T e pT u4- b i r t h d a y DATE d e f a u l t N U L L ,
Э т и ч ет ы ­
ный ключ. p r o f e s s i o n VARCHAR( 5 0 ) d e f a u l t N U L L , ре. столбца
lo c a tio n VARCHAR( 5 0 ) d e f a u l t NULL, ^ не атоАЛарны;
мы подправим
s ta tu s VARCHAR( 2 0 ) d e f a u l t NULL, их колАаидой
in te r e s ts VARCHAR( 1 0 0 ) d e f a u l t NULL, ALTER TABLE.

s e e k i n g VARCHAR( 1 0 0 ) d e f a u l t NULL,
PRIM ARY KEY (c o n ta c t id )

ди.пыиа > 255


разбиение д а н н ы х

Неатомарный столбец location


Иногда Грег хочет узнать лишь то, в каком штате или городе живет
его знакомый, поэтому информацию l o c a t i o n логично разбить
на два столбца. Давайте посмотрим, как выглядят данные в этом
столбце:
I File Edit Window Help LocationLocationLocation

— > SELECT l o c a t i o n FROM m y _ c o n t a c t s ;

lo c a tio n

С и э т л , WA
Н а т ч е з , MS
J Ia c В е г а с , NV
П ало А л ь т о , CA
Н ью -Й орк, NY
Ф

Ч аст ь данных
ст олбца «location-
С и э т л , WA & А в м б у к в & н н о е
таблицы
сокращ ение ш т ат а.
my^contacts.
Н а т ч е з , MS
Л а с - В е г а с , NV
П а л о - А л ь т о , СА
Название
города. Н ь ю -Й о р к , NY
Запятая-

Д анны е построены по четко определенной схеме;


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

Какую пользу принесет отделение города


от штата?

Как вы думаете, что мы будем делать дальше?

256 глава 5
ALTER

В поисках закономерности
Все значения столбца l o c a t i o n в таблице my c o n t a c t s построены
по одной схеме: название города, запятая и двухбуквенное сокраще­
ние штата. Наличие четко определенного формата упростит разбие­
ние и переход к атомарным данным.

сокращ енное обо столбец


город,
ЭОАЖИ« S « “

Запят
м п я т аая,
я , которая всегда ст о и т у о д и т о с я 6 н е м .

п ер ед сокращ енным обознобозначением


ш т а т а , т ож е м о ж ет пригодит ься

Сначала выделяем все данные до запятой Затем берем два последних символа столбца
и переносим их в столбец с названием города. l o c a t i o n и переносим их в столбец s t a t e .

City Name XX

Нам понадобится функция,


функция, к о т о ­
которая возвращ ает все
рая возвращ ает два последних
символы до запят ой.■■ симоола.

Напишите команду ALTER TABLE, которая добавляет


в таблицу m y _ c o n ta cts столбцы c i t y и s t a t e .

■ (.z)iivH j n n s n h d i o d a a v
'(os)hlV H J^IVA
N i^ m o D a a v
sq.?v^viov-B\M 313V J. H3J-1V

да л ьш е ► 257
строковые фуушции

Удобные строковые функции


Мы обнаружили две закономерности в формате данных. На
следующем шаге мы выделим сокращенное обозначение штата
и вставим его в новый столбец state. Все символы, стоящие
Текстовые значения,
до запятой, необходимо перенести в столбец city. Вот как бу­
дет происходить выделение данных после того, как в таблице
хранимые в столбцах
будут созданы новые столбцы.
CHAR и VARCHAR,
Выборка двух последних символоб тоже называются
Для выделения заданного количества символов в столбце использу­
ются функции RIGHT () и LEFT () ; строками.

SELECT R IG H T ( l o c a t i o n , 2) FROM m y _ _ c o n ta c ts ;
Z' \ \
Выделение символов И спользуем ы й К оличест во символов,
от П РАВО ГО края выделяемых от правого
столбец,.
значения (функция края значения.
LEFT выделяет с и м -
волы от левого края).
Строковые функции
Выборка Всех символов до запятой выделяют часть
Функция SUBSTRING_INDEX () находит все символы тексто­ значения текстового
вого значения, предшествующие заданному символу или
подстроке. Запятая заключается в апострофы, а функция столбца.
ЗиВЗТН1ЫО_1ЫОЕХ () возвращает все символы, стоящие
перед запятой.

SELECT SU B S TR IN G I N D E X ( l o c a t i o n . 1) FROM my__cont a c t s ;

И снова имя Запят ая, « 1 » , п от ом у что ищ ет ся


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

258 глава 5
ALTER

П опробуй т еТ сам и

w uoijvro ® существует ряд функций для работы со строковыми значениями в таблицах.


)аЖг12лг1С Строковые значения хранятся в текстовых столбцах, обычно с типом данных varchar
или CHAR.
Ниже перечислены наиболее распространенные и полезные строковые функции.
Опробуйте каждую функцию, введя соответствующую команду select .

Функция SUBSTRING (текст, начало, длина) возвращает часть строкового значения текст, начиная
с буквы в позиции начало. Параметр длина определяет длину возвращаемой строки.

SELECT SUBSTRING{'Сан-Антонио, ТХ', 5, 3);

Функции UPPER (текст) и LOWER (текст) преобразуют все символы строки к верхнему или нижнему
регистру соответственно.

SELECT UPPER('сШа');

SELECT LOWER('спаГЕтти');

функция REVERSE (текст) переставляет символы строки в обратном порядке.

SELECT REVERSE('спаГЕтти');

функции LTRIM(TeKCT) и RTRlM(TeKCT) возвращают строку, полученную удалением лишних пробе­


лов в начале (у левого края) или в конце (у правого края) строки.

SELECT LTRIMC собака ') ;

SELECT RTRIMC кошка ') ;

функция LENGTH (текст) возвращает количество символов в строке.

SELECT LENGTH('Сан-Антонио, ТХ ');

ВАЖНО: С троковы е ф ункции НЕ изм еняю т д ан н ы е, хранящ иеся в таблице;


они п р о с то возврацдают текст, сген ер ир о в ан н ы й в р е зу л ь т а те запроса.

да л ьш е ► 259
кт о и чт о оепает ''

KTQ
Мы хотим извлечь данные из столбца l o c a t i o n и переме­
стить ее в два новых столбца, c i t y и s t a t e .
Ниже перечислены операции, которые необходимо для этого
выполнить. Свяжите операции с ключевыми словами SQL,
которые в них используются.

SUBSTRING__INDEX ()
SELECT

1. Просмотреть данные столбца, чтобы найти


в них закономерность.
LE F T
ADD COLUMN

2. Добавить в таблицу пустые столбцы.

AD JU ST

R IG H T
3. Извлечь часть данных из текстового столбца.

A LTER TABLE
4. Переместить данные, полученные на шаге 3,
DELETE
в один из пустых столбцов.

IN S E R T
UPDATE

QmBeipbi Ha c. 262.

260 елаеа 5
ALTER

Я знаю, как использовать каждую из частей, но


еще не уллею Эффективно объединять их друг с дру­
гом. Может, попробовать включить эти строковые
функции в команду UPDATE...

Если пользоваться только тем, что


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

д а л ьш е ► 261
кт о и чт о аолает -

+ с - Т і
4"
к т о и Н Т -Ч Г А Е А Р ^ Т ?

Мы хотим извлечь данные из столбца lo c a t i o n и переме­


стить их в два новых столбца, c i t y и s t a t e .
Ниже перечислены операции, которые необходимо для этого
выполнить. Свяжите операции с ключевыми словами SQL,
которые в них используются.

SUBSTRING__INDEX ( )
SELECT

1. Просмотреть данные столбца, чтобы найти


в них закономерность.
LEFT
ADD COLUMN

2. Добавить в таблицу пустые столбцы.

adjust

R IG H T
3. Извлечь часть данных из текстового столбца.

alter TABLE
4. Переместить данные, полученные на шаге 3,
DELETE
в один из пустых столбцов.

IN S E R T
UPDATE

262 гл ава 5
ALTER

Заполнение нового столбца сущест6уюи4ими данными


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

Команда заполняет ст олбец


UPDATE t a b le _ n a m e
заданным значением во веек
записях таблицы.
SET с т о л б е ц = н о в о е з н а ч е н и е ;

Чтобы заполнить данными новые столбцы c i t y и s t a t e ,


мы включим вызов функции RIGHT () в команду UPDATE.
Функция выделяет два последних символа из старого
столбца l o c a t i o n и помещает их в новый столбец s t a t e .

UPDATE my_contacts
SET state = RIGHT(location, 2);

Новый ст олбец для


сокраи^енного обо­
значения ш т ат а. них CU
locatioi^-


Г Но как работает эта
команда? В ней нет условия
( WHERE, определяющего о6-
новляемые записи.

Команда работает без условия


WHERE. Переверните страницу
и посмотрите.

да л ьш е * 263
объединение к о м а н д s q l

Как работает комбинация UPDATE с SET


Ваша РСУБД последовательно применяет команду к каждой
записи таблицы до тех пор, пока все сокращенные обозначения
штатов не будут перенесены в новый столбец s t a t e .

my c o n t a c t s

lo c a lio ii c ity • ta le
1 Чеаер, NJ Упрощенная версия
2 Кейти,ТХ нашей |лд(Я(5лмць>|-
3 Сан-Матео, СА

UPDATE m y _ c o n t a c t s Команда SQL.

SET s t a t e = R IG H T (lo c a tio n , 2 );

Строковые функции
Давайте посмотрим, как работает этот процесс, на приме­
ре упрощенной таблицы. Сначала команда берет значение Moiyr использоваты;я
l o c a t i o n из первой записи и обрабатывает его.
Затем команда начинает перебор сначала, находит значение в командах SELECT,
l o c a t i o n во второй строке, обрабатывает его —и так далее,
пока столбец не будет разбит во всех записях, а в таблице не UPDATE и DELETE.
останется записей, которые еще не были обработаны.

Первая UPDATE my_contacts ^


Команда обрабатыва­
и т ер ац и я . SET state = RIGHT(*4ecTep, NJ’,2) ет ст олбец «lo ca tio n»
первой записи.
Вт орая UPDATE my contacts
итерация. 'Т е п е р ь для второй записи.
SET state = Р1СНТ(*Кейти, ТХ',2)

И т ерация
т р ет ья _ ^ UPDATE my_contacts ^ ^ наконец, для т р е т ь е й .
^ последняя SET state = RIGHTCCaH-Mareo, СА',2)
(в таблице
всего т ри
записи).

264 глава 5
ALTER

P ^ о з ь м и в руку карандаш
ешение Изобразите структуру таблицы после выполнения команды на с. 244.
Со с. 210.
p r o je c t_ lis t

Столбе-u,
« n u m b e r » л р ев р а -
^roj^ld deserij^tionofproj contractoronjob
т ился в « p r o j j d » ;
в нем хранят ся 1 покраска дома Мэрфи
авт ом ат ически
увеличиваемые 2 перестройка кухни Вальдес
значения п ер вич ­
ного КЛИЗЧЙ.
3 укладка паркета Келлер
4 кробельные работы Д)кексон

да л ьш е > 265
краткий об зо р sqi

Нобые инструменты
Поздравляем — глава 5 осталась позади,
а в вашем арсенале появилась команда
ALTER. Полный список инструментов
приведен в приложении III.

älter table
К -о т н д а к^озбол яет « з -
м енчиос им я
ее структуру оез

Заннь1Х-
a lte r с

alter с add
H CHANGE

Доблбление столбцов
в таблицу в заданном r !r f= «
порядке.
alter с drop

Удаление столбцов из
таблицы.

Строковые функции

ФyHKЦUUJ изменяющие
копии содержимого илек-
<^^овык столбцов, воз­
вращаемые запросом.
Исходные данные о ст а ­
ю т ся неизменными.

266 глава 5
%
Взглянуть наданные
поддругим углом ^

Пора обзавестись более точными инструментами.


Вы уже знаете, как выполнять выборку данных, и умеете работать
с условиями WHERE. Но В некоторых ситузциях нужна точность,
на которую SELECT и WHERE не способны. В ЭТОЙ глэве вы научитесь
упорядочивать и группировать свои данные, а также выполнять
математические операции с полученными результатами.
упорядочиваем с у щ е с т в у ю щ и е д а н н ы е

Перестройка б бидеотеке
В видеотеке городка Дейтавиль дело орга­
низовано из рук вон плохо. Фильмы могут -Го; Персоналу видеотеки
оказаться на разных полках в зависимости от
From; _ новые категории!
того, кто из работников занимается их рас­ Subject: Новым полкам
становкой. Владелец заказал новые полки,
и он думает, что пришло время распределить
фильмы по категориям.
Гв порядок
Г —наши фильмы, мы оум
вать следующие категории.
Боевики и приключения
Драма
V ID 9 Q Комедия
Семейное кино
Ужасы
Фантастика и Фэнтези
Разное

А мне пора на обед.


в текущей версии системы типы фильмов обозна­ Директор
чаются флагами «да/нет», из-за чего классифика­
ция становится весьма затруднительной. Напри­
мер, на какую полку ставить фильм, у которого
установлены флаги категорий «Комедия» и «Фан­
тастика»?
«Д » и «Н» - сокращ ений Д й т а приобрет ения
для « Д й » « Н е т^ ф ильм а.
m o v ie t a b l e

n e v i v jd № !• rating 4гама camscly action ■•IW •cm far.itid^ саП м п pnrclracnci


1 Корпорация монстров G Н д Н н н д Д 6-3-2002
2 Креаный отец R Н н д Д н н н 5-2-2001
3 Унесенные ветром G д н н н н н н 20-11-1999
4 Американский пирог R н д н н н н н 19-4-2003
5 Кошмар на улице Вязов R н н Д д н н н 19-4-2003
6 Касабланка PG д н н н н н н 5-2-2001

Все эт и столбцы су щ ест в у ю т для т ого, чтобы


работники м огли от вечат ь на вопросы о со д ер ­
жании конкрет ных фильмов.

268 iifi с) C.Vс»


fiaciuupeиue еол\ю>нности ЗЕЬЕСТ

Недостатки существующей таблицы


Ниже перечислены основные недостатки существующей таблицы.

Когда посетители Возбраи^ают фильмы,


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

Посетителям непонятно, к какому )канру относится


фильм.
Посетителей сбивают с толку кровавые обложки в разделе
«Комедия». В текущей версии все флаги «Д/Н» равноправны
при размещении фильмов на полках.

Правка данных занимает много Времени


и часто приводит к ошибкам.
Каждый раз, когда в видеотеке появляется новый фильм, его
необходимо занести в базу, и расставить все флаги «Д/Н».
И чем больше фильмов хранится в таблице, тем больше оши­
бок. Иногда в столбце, в котором должен стоять флаг «Д», слу­
чайно ставится «Н», и наоборот. Столбец с категорией фильма
поможет проверить содержимое столбцов «Д/Н» —а со време­
нем и вовсе избавиться от них.

Новый столбец с информацией о категории ускорит расстановку,


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

--------------------------------------------------------------------

Как бы вы преобразовали текущий набор столбцов в новые категории?


Возможна ли в новой классификации ситуация, когда один фильм при­
надлежит сразу к нескольким категориям?

даль,ше >■ 269


обработка сущ ествую щ их данных

Классификация сущестбуюи^их данных


Вы уже знаете, как добавить в таблицу новый столбец c a te g o ry ,
но с его заполнением дело обстоит сложнее. К счастью, категорию
каждого фильма можно определить по данным, уже хранящимся
в таблице, и нам не придется просматривать все фильмы подряд.
Давайте сформулируем отнощение в виде набора простых условий

Если 'Д' в столбце: I в столбец category заносится д|

Если 'Д' в столбце: cooiedy | в столбец category заносится 'комі

Если 'Д' в столбце: 0


{ dtoi в столбец category заносится 'i

Если 'Д' в столбце: в столбец category заносится ’’

Если 'Д' в столбце: в столбец category заносится 'фантастика'

Если 'Д' в столбце: [ |ог_кМ » д в столбец category заносится 'сгмешог'

Если 'Д' в столбце: и 'б в столбце': ^ category заносится 'семейное'

Если 'Д' в столбце: c a r te e n ^ ^ ^ ® столбце: ra tin g | в столбец category заносится 'разное'


тятт

н е т . Еслм ф м А .м у , к атего р и и « р а зн о е» ,
рии « с е м е й н о е » , а если нет

270 шлеа 6
р а с ш и р е н и е в о зм о ж н о с т и SELECT

Заполнение ноВого столбца


Теперь эти условия преобразуются
в команды SQL UPDATE:

UPDATE m o v ie t a b l e SET c a t e g o r y == ' д р а м а ' w h e re dram a = 'Д ';

UPDATE m o v ie t a b l e SET c a t e g o r y = ' комедия' w h e re comedy = 'Д ';

UPDATE m o v ie t a b l e SET c a t e g o r y = ' боевик' w h e re a c t i o n = 'Д';

UPDATE m o v ie t a b l e SET c a t e g o r y = 'у ж а с ы ' w h e re g o re = 'Д ';

UPDATE m o v ie t a b l e SET c a t e g o r y = ' ф а н та с а м к а ' w h e re s c i f i = 'Д ';

UPDATE m o v ie t a b l e SET c a t e g o r y *= 'семейное' w h e re f o r _ k i d s = 'Д ';

UPDATE m o v ie t a b l e SET c a t e g o r y = 'семейное' w h e re c a r t o o n = 'Д ' AND r a t i n g = '6';

UPDATE m o v ie t a b l e SET c a t e g o r y = 'разное' w h e re c a r t o o n « 'Д ' AND r a t i n g <> 'G ';

Р ейт инг от личен от 'Q'.


- ^ В о зь м и в руку карандаш
Заполните столбец c a t e g o r y для следующих фильмов;
V m o v ie t a b l e

title rating drama comedy action gore sclfi for_l(id* cartoon category
Большое приключение G H H H H H Д H
Грег: Неизвестные PG H H Д H H H H
истории
Безумные клоуны R H H H Д H H H
Па раскеведекатриа- R Д Д Д H Д H H
фобия
Крыса по имени Дарси G H H H H H Д H
Конец очереди R Д H H Д Д H Д
Блестящие вещи PG Д H H H H H H
Заберите обратно R H Д H H H H H
Наживка для акул G H H H H H Д H
Разгневанный пират PG H Д H H H H Д
Планета пригодна PG H Д H H Д H H
для жизни

Зависит ли результат от порядка проверки столбцов Д/Н?

;Лг/'7Ь'(.'е * 271
возьми в руку карандаш, решение

- ^ о з ь м и в руку карандаш
Решение Заполните столбец c a t e g o r y для следующих фильмов;

m o v ie t a b l e

t ill* ratiag drflMM coMedy Mction Bor* •cifi fe rv id « cartoen « л *а * гу


Большое приключение G H H H H H Д H сем ей н ое
Грег: Неизвестные PG H H Д H H H H боевик
истории
Безумные клоуны R H H H Д H H H ужасы
Параскеведекатриа- R Д Д Д H Д H H ?
фобия
Крыса по имени Дарси G H H H H H Д H сем ей н ое
Конец очереди R Д H H Д Д H Д разное
Блестящие вещи PG Д H H H H H H драма
Заберите обратно R H Д H H H H H комедия
Наживка для акул G H H H H H Д H ?
Разгневанный пират PG H Д H H H H Д разное
Планета пригодна PG H Д H H Д H H р
для жизни

В опросит ельны м знаком помечены ст олбцы , и з м е - ^


одной командой U P P A T E . Значение
ненные долее чем
ст олбца зависит от порядка выполнения UPDATE.

Зависит ли результат от порядка проверки столбцов Д/Н? ^ а , зависит

Порядок 6а)кен Результат зависит от порядка


Например, если столбцы будут пере­
бираться последовательно, фильм проверки.
«Параскеведекатриафобия» попадет
в категорию фантастики, хотя умест­ Две команды UPDATE мог^т
нее было бы отнести его к комедиям.
Если мы не знаем, к какой категории изменять содержимое одного
относится тот или иной фильм, воз­
можно, лучше зачислить его в катего­ столбца.
рию «Разное».

272 глава 6
р а сш и р е н и е в о :ш о ж н о с т и SELECT

Для маленькой таблицы этот


способ подойдет, а если таблица содержит
сотни столбцов? Можно ли как-то объединить
все эти команды UPDATE в одну большую
____ _ команду?

Да, можно написать одну большую команду


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

Э т ом у столбцу
у присваивает ся одно
UPDATE m y _ t a b l e
из перечисленны х
^ -------- ^
н и ж е значении.
SET н овы й__стол бец =
Начало вы раж е­
ния CASE. V
CASE
Е С Л И выполняется
/ э т о условие... ^ - > ‘WHEN с т о л б е ц ! = з н а ч е н и е !
. Т С ст олбцу «новый_ О т ст упы
/ ст о л б ец » присваива­ THEN новое__ з н а ч е н и е ! не влияю т
ет ся ЭГО значение. на обработку
WHEN с о 1 ш п п 2 = з н а ч е н и е 2 У выражения:
ЕСЛ И вы полняет ­ они всего лиш ь
ся другое условие... THEN н о в о е _ э н а ч е н и е 2 у пр о щ а ю т
ТО ст олбцу ^ чт ение кода.
« новый_столбец» E LS E з н а ч е н и е З
присваивает ся
другое значение. ^ EN D; ■Е с л и ни одно из условий
L выполняется т о ст о л б -
З аверш ает выражение ии «новы й_ст олбец»
CASE и всю команду Тваивается ЭТО значение.
^-^PDATE (заверш аю щ ий
символ « ;» ).

да л ьш е ► 273
UPDATE с CASE

UPDATE e выражением CASE


Давайте посмотрим, как выражение CASE работает
с таблицей m o v ie t a b le .
То же самое, что U P P A T E
UPDATE m o v i e _ t a b l e movie table S E T category =
---- 'драма' W H E R E d ra m a -
SET c a t e g o r y = iC HO намного комг^актнее.
CASE
WHEN d ra m a = ' Д ’ THEN 'д р а м а *
WHEN c o m e d y = ' Д ’ THEN 'к о м е д и я '
WHEN a c t i o n = ' Д ' THEN 'б о е в и к '
WHEN g o r e = 'Д ' THEN 'у ж а с ы '
WHEN s c i f i = 'Д ' THEN 'фантастика'
WHEN f o r _ k i d s = ' Д ' THEN 'семейное'
WHEN c a r t o o n = ' Д ' THEN 'семейное'
ELSE ' разное '
Значения, которые оставались н е -
END; ^ определенными 1^ри заполнении ново-
всем не оидЭельнммы командами
одно us перечисленных условии, назна ин'илЧЕ, т е п е р ь определены.
ется категория «разное»- Но также обрат ит е внимание на
новые значения для фильмов « Р а з г н е ­
ванный п и р а т » и « К о н е ц очереди»-
m o v ie t a b l e
\
title rating drama comedy action gore scifi for.kids category

Большое приключение PG H H H H H H Д семейное

Грег: Неизвестные истории PG H H Д H H H H боевик

Безумные клоуны R H H H Д H H H ужасы

Параскеведекатриафобия R Д Д Д H Д H H драма

Крыса по имени Дарси G H H H H H Д H семейное

Конец очереди R Д ■ H H Д Д H Д драма

Блестящие вещи PG Д H H H H H H драма

Заберите обратно R H Д H H H H H комедия

Наживка для акул G H H H H H Д H семейное

Разгневанный пират PG H Д H H H H Д комедия

Планета пригодна для жизни PG H T H H T H H комедия

274 глава 6
р а с ш и р е н и е в о з м о ж н о с т и SELECT

В процессе обработки значений «Д/Н» каждого фильма выражением CASE


РСУБД ищет первый столбец с «Д», чтобы установить по нему категорию.
Давайте посмотрим, как происходит обработка данных фильма «Большое при­
ключение»:

UPDATE movie_table
НЕТ: к атего р и я
S ET c a t e g o r y = 1Л0КЙ н е м ^ е с т н а
CASE пока неизвест на
W H E N d r a m a = 'Д' T H E N 'драма
НЕТ: кат егория
W H E N c o m e d y = 'Д' T H E N 'комедия' пока неизвест на
W H E N a c t i o n = 'Д' T H E N 'боевик' НЕТ: кат егория
пока неизвест на
W H E N go r e = 'Д' T H E N 'ужасы'
■НЕТ: кат егория
W H E N scifi = 'Д' T H E N 'ф а н т а с т и к а
пока неизвест на
W H E N f o r _ k i d s = 'Д' T H E N 'с е м е й н о е ',
~~ НЕТ: кат егория
W H E N c a r t o o n = 'Д' T H E N 'с е м е й н о е '
пока неизвест на
E L S E 'р а з н о е '
Д А : в столбеи,
END; « c a te g o ry » заносит ся
значение 'сем ейное';
Теперь рассмотрим запись с совпадениями в нескольких категориях. Как управление п ер ед а ­
и в предыдущем случае, категория фильма определяется первым найден­ ет ся END, вы полне­
ным столбцом, содержащим «Д». ние команды за в е р ­
Вот что происходит при обработке записи фильма «Параскеведекатриа­ ш ает ся.
фобия»:

UPDATE movie_table
SET c a t e g o r y =
Д А ; ф ильм у назна­
CASE чает ся кат егория
W H E N d r a m a = 'Д' T H E N 'драма' «драма»-, управление
передает ся END, вы ­
W H E N c o m e d y = 'Д' T H E N 'к о м е д и я '
полнение кода за в е р ­
W H E N a c t i o n = 'Д' T H E N 'б о е в и к ' ш ает ся. О ст альные
W H E N g o r e = 'Д' T H E N 'ужасы' значения Д игнорирц-
ют ся.
W H E N scifi = 'Д' T H E N 'фантастика'
W H E N for _ k i d s = 'Д' T H E N 'семейное'
W H E N c a r t o o n = 'Д' T H E N 'семейное'
E L S E 'р а з н о е '
END;

да л ьш е * 275
п р о б л е м ы с CASE

Похоже, унас проблемы


« Г ^ р о ' с Т Г " Р > " - о - е н „ е . -
«сем ей н о го кино». каким-то о б р а зо м попал в к атегор и ю

Сообщение
Дата Сегодня Time 13.41
Кому

За время вашего отсутствия


Очень сердитр1и клиент

Звонил '"Просил перезвонить


Хотел говорить с вами Будет звонить снова
Хочет встретиться Отвечал на ваш звонок

Сообщение Одна }^р>килая леди >калуется^


что ее вну к .« ^ р с м р т р е л

выражений — л теперь бегает за


своей сестрой и называет ее % # / @
Принял............. ^ ..............................Срочно

276 глава 6
р а с ш и р е н и е в о зм о ж н о с т и SELECT

- ^ о з ь м и в руку карандаш
Измените выражение CASE так, чтобы мультфильмы (столбец
cartoon) попадали в категорию 'разное', а не 'семейное'. Только
если мультфильму присвоен рейтинг G, он помещается в катего­
рию семейного кино.

ШТУРМ
Как использовать рейтинг К , чтобы подоб­
ные инциденты не происходили в буду­
щем?

д а л ьш е > 277
возьми в руку карандаш, решение

Р Возьми в руку карандаш - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


PoijliPUMp Измените выражение CASE так, чтобы мультфильмы (столбец
■ c a r to o n ) попадали в категорию'разное', а не 'семейное'.
Только если мультфильму присвоен рейтинг G, он помещается
в категорию семейного кино.

UPDATE movie_table
S E T category =
CASE
WHEN d ra m a - 'Д ' THEN 'драма'
WHEN com edy = 'Д ' THEN "комедия'
WHEN action = Д ' THEN 'боевик'
WHEN g o re = Д ' THEN 'ужасы'
WHEN sclfi - Д ' THEN 'ф ант аст ика'
WHEN for_kids = Д ' THEN ‘сем ейное'
WHEN cartoon = Д ' AND rating = '<5' THEN семейное'
ELSE 'mise'
END; Условие М ожет сост оят ь ■.I.,-
^евое слово AND ^ р о в е р я е ^ : " ~ 1 : : ; ~
И он и м ее т р ей т и н г Если со ст а в н Л и см в и е бГ,'
полняет ся. ф ильм у назначает ся кат егория 'семейное!

Часш»

даД аБ аеМ ы е -
BoT lJoC bl

• Обязательно ли использовать ELSE? ^•А если я хочу использовать выражение CASE толь­
ко для некоторых значений столбцов? Например, если
Нет, не обязательно. Не включайте это условие, если оно выражение CASE должно применяться только в случае
не требуется, но обычно бывает удобно предусмотреть способ c a te g o ry = ' р а зн о е '. Могу ли я использовать WHERE?
обновления столбца, если ни одно условие не выполняется,
в такой ситуации лучше заполнять столбец каким-то значени­ • Да, после ключевого слова END можно добавить условие
ем, отличным от ыиьь. WHERE. Выражение САЗЕ будет применяться только при вы­
полнении условии WHERE.

Что произойдет, если ни одно из условий WHEN


не подходит, а ELSE отсутствует? Можно ли использовать выражение CASE с другими
командами, кроме UPDATE?

О Обновляемый столбец не изменяется.


• Да. Выражение CASE может использоваться с командами
SELECT, INSERT, DELETE — и, как вы уже видели, UPDATE.

278 глава 6
pacunipeHi'e- в о з м о ж н о с т и SELECT

Персоналу видеотеки
То; Директор
К О М А Н Д Ы С CASE From; Новые категории
Subject:
Беспокойному директору видеотеки пришла в голову
очередная «гениальная идея». Прочтите его сообщение
Дорогие коллеги!
и напишите одну команду SQL, которая делает то, что ему
Н РСКО ЛЬКО новых разделов,
нужно. я решил создать несколь оейтингом В
мне кажется, что
должны находиться
от фильмов с рейтингами р С ^и Р 6 Давайте
РО. да
создадим 5 новых категории.

ужасы-г
боевик-г
драма-г
комедия-г
фаитастика-г

рию семейного кино.

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

Наконец, удалите столбцы Д/Н, которые нам больше не нужны.

да л ьш е ► 279
решение задачи с case

Персоналу видеотеки
То; Директор
К О М А Н Д Ы С CASE From; Новые категории
Subject;
Беспокойному директору видеотеки пришла в голову
очередная «гениальная идея». Прочтите его сообщение Дорогие колпеги!
и напишите одну команду SQL, которая делает то, несколько новых разделов.
что ему нужно.

UPDATE movietable
SET cate.gory =
создадим 5 новых категории.
CASE
ужасы-г
WHEN dratma = 'Д’ AND rating = 'R' THEN 'драл’\а-г'
боевик-г
VJHEN comedy = 'Д’ AND rating - 'R’ THEN 'комедия-r' драма-г
WHEN action = 'Д' AND rating = 'R' THEN ‘боевик-г' комедия-г
WHEN gore = 'Д' AND rating - 'R' THEN 'ужасы-г' фантастика-г

WHEN scifi = Д ’ AND ra tin g = 'R' THEN ' ф антастика- r ’


WHEN category = 'разное' AND rating = 'Q' THEN 'семейное'
END; рию семейного кино.

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

UPDATE movietable
S E T category -
CASE
WHEN category = 'д р а м а -г' THEN 'драм а’
WHEN category = 'к о м ед и я -г’ THEN 'комедия’
WHEN category = 'боевик-г' THEN 'боевик'
WHEN category - 'уж асы -г' THEN 'ужасы'
WHEN category = 'ф а н т а ст и к а -r' THEN 'ф ант аст ика'
END;

Наконец, удалите столбцы Д/Н, которые нам больше не нужны.


A L T E R TABLE movietable
DROP COLUMN d ra m a ,
DROP COLUMN co m edy ,
DROP COLUMN action,
DROP COLUMN g o re,
DROP COLUMN scifi.
DROP COLUMN for_kids,
DROP COLUMN cartoon;

280 глава 6
р а с ш и р е н и е в о зм о ж н о с т и SELECT

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

m o v ie t a b l e

m o v ie id I t it le
1^ у\ ^ УК ^
83 Большое приключение G семейное 6-3-2002
84 Грег: Неизвестные истории PG боевик 5-2-2001
85 Безумные клоуны R ужасы 20-11-1999
86 Параскеведекатриафобия R боевик 19-4-2003 Небольшая часть
КЗ 5 0 0 0 с лиш н им
87 Крыса по имени Дарси G семейное 19-4-2003
ф ильмов, Х)ЗЙНЯ-
88 Конец очереди R разное 5-2-2001
щыхся в видеотеке.
89 Блестящие вещи PG драма 6-3-2002
90 Заберите обратно R комедия 5-2-2001
91 Наживка для акул G разное 20-11-1999
92 Разгневанный пират PG разное 19-4-2003
93 Планета пригодна для жизни PG фантастика 5-2-2001
'—

ШТУРМ
Как упорядочить данные по алфавиту
с использованием команды 8 0 1 ?
перегрузка SELECT

Упорядочение результатов Выборки


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

SELECT title, category FROM movie_table WHERE title LIKE 'A%' AND category = 'семейное';
SELECT title, category FROM movie_table WHERE title LIKE 'Б%' AND category = 'семейное';
SELECT title, category FROM movie_table WHERE title LIKE 'B%' AND category = 'семейное';
SELECT title, category FROM movie_table WHERE title LIKE 'Г%' AND category = 'семейное';
SELECT title, category FROM movie_table WHERE title LIKE 'Д%' AND category = 'семейное';
SELECT title, category FROM movie_table WHERE title LIKE 'E%' AND category = 'семейное';

SELECT title, category FROM movie_table WHERE title LIKE 'Ж%' AND category = 'семейное';
T T T
м иж но ъ н а т ь нязбанме. ч т о Ь ы Буква, с кот орой /кат егория, в ко-
Н уж н о кат егорию ,
начинает ся назва- т орой о су щ ест -
ние ф ильм а. вляет ся поиск.
дост авит ь на полку.
А еще не за б у д ь т е о ф и л ь м а х , названия к о т о р ы х н а ч и н а ю т
СЯ с ц и ф р ы ( « ю г далм ат ин» или « 3 0 0 сп а р т а н ц ев » ).

Ш ТУРМ

Как вы думаете, где в этом списке будут


находиться фильмы, названия которых
начинаются с цифры или неалфавитного
символа (например, с восклицательного
знака)?
р а с ш и р е н и е в о зм о ж н о с т и SELECT

^ о з ь м и в руку карандаш
Чтобы определить правильный порядок записей, нам все равно
придется вручную упорядочивать названия фильмов по буквам,
следующими за начальной «А».
Перед вами результаты одного из 200 (или около того) запросов.
Попробуйте расставить названия фильмов по алфавиту вручную.

SELECT title, category FROM movie_table WHERE title LIKE 'A%' AND category = 'семейное'

Част ь р езу л ьт а т о в запроса

title category

Авиаторы семейное

Алый рассвет семейное

Арахисовое масло семейное

Американская мечта семейное

Аквалангисты семейное

Абракадабра семейное

Асфальтовые дороги семейное

Аписа в стране чудес семейное

Арбузная косточка семейное

Апельсиновый джем семейное

А когда я вырасту? семейное

Ааргх! семейное

Античный мир семейное

Аляска: Страна лососей семейное

Ангелы семейное

Анна переживает семейное

Авантюрный роман семейное

Астронавты семейное

Акулий зуб семейное

Ааргх! 2 семейное

дальше * 283
возьми в руку карандаш, р е ш е н и е

- ^ о з ь м и в руку карандаш
Решение Чтобы определить правильный порядок записей, нам все равно
придется вручную упорядочивать названия фильмов по буквам,
следующими за начальной «А».

Перед вами результаты одного из 200 (или около того) запросов.


Попробуйте расставить названия фильмов по алфавиту вручную.

SELECT title, category FROM movie_table WHERE title LIKE 'A%' AND category = 'семейное',

t it le ca te g o ry

АкогдаяВырасту? семейное

Аархг! семейное

Ааргх!2 семейное
Сколько времени вам
потребовалось на то,
Абракадабра семейное чтобы упорядочить эти
Авантюрныйроман семейное 20 фильмов?

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


Аквалангисты семейное долго придется возиться,
Акудийзуб семейное если фильмов будет

Алисавстранечудес семейное
более 3000?

Алыйрассвет семейное

Аляска:Страналососей семейное

Американскаямечта семейное

Ангелы семейное

Аннаперевивает семейное

Античныймир семейное

Апельсиновыйд)кем семейное

Арахисовоемасло семейное

Арбузнаякосточка семейное

Астронавты семейное

Асфальтовыедороги семейное

284 глава 6
р а сш и р е н и е в о зм о ж н о с т и SELECT

ORDER BY
Хотите упорядочить результаты своего запроса? Это совсем не­
сложно — включите в команду SELECT ключевые слова ORDER
BY и имя столбца таблицы.

П'окй никаких с ю р ­
призов - все так
SELECT title, category
>^е, как 6 только FROM movie_table
что выполненной
кол^анде SELECT. WHERE
title LIKE ’A%'
А вот этого раньш е не AND
было... Эта част ь о зн а­
чает , что запрос должен
category = 'семейное'
вернут ь данные упоря - ^ ^ ORDER BY title;
доченныАЛи 6 а лф а ви т ­
ном порядке по значению
ст олбца « title» .

Хотите сказать, что это единственный


способ упорядочения результатов?
Да я НИ ЗА ЧТО не стану этим заниматься
для каждой буквы алязавита.

Г в руку карандаш
и верно. Что следует убрать из этого
запроса, чтобы расширить его воз­
можности?

СТОП' ^ьлолнише э т ° уі^ажнение


До щоГо, как перевернете сгораниіД).

да л ьш е ► 285
ключевые слова ORDER B Y

Упорядочение no одному столбцу


Рхли включить в запрос условие ORDER BY title, нам уже ORDER BY позволяет
не придется отбирать названия, начинающиеся с опреде­
ленной буквы — запрос сам вернет данные, выстроенные
в алфавитном порядке по значению столбца title.
отсортировать данные
Для этого нужно лишь исключить из запроса условие любого столбца.
titleLIKE,a ORDER BY title сделает все остальное.

Возьми в руку карандаш вык кйзбйним на


Что следует убрать из это­
го запроса, чтобы расши­
lit!* са1едвгу
рить его возможности?
1 безу^ІНБІЇГпрЙІуелец семейное
SELECT t i t l e , c a t e g o r y 10 жуков \ семейное
FROM m o v i e _ t a b l e / 101 овчарка \ семейное
/ 13-й день рождения \ семейное
WHERE
/ 2-Ь2=5 \ семейное
001 способ потерпеть неудач^ семейное
M m t- 8 рук лучше 2 1 семейное
c a te g o ry = ' сем ейное' А когда я вырасту? / семейное
\ Ааргх! / семейное
ORDER BY t i t l e ; \ Ааргх! 2 у' семейное
Г
Y
'> А б р а када семейное
Авантюрный роман семейное
Авиаторы семейное
Аквалангисты семейное
Акулий зуб семейное
SELECT title, category Алиса в стране чудес семейное
FROM movie_table Алый рассвет семейное
Аляска: Страна лососей семейное
WHERE Американская мечта семейное
category = 'семейное' Ангелы
Анна переживает
семейное
семейное
ORDER BY title; Античный мир семейное
Апельсиновый джем семейное
Ha эт о т раз б у ­
И что ещ е лучш е, в список б у ­ Арахисовое масло семейное
дет выведен полный
дут включены ф ильм ы , названия Арбузная косточка семейное
Список ф ильм ов из
которых начинают ся с цифры. Ааронавты семейное
кат егории « с е м е й ­ семейное
Они будут находиться в сам о м Асф^льто^ь1^опло^ ^
ного кино».
начале списка.
; нам

все названия до буквы «Я »- ^

286 глава 6
р а с ш и р е н и е в о з м о ж н о с т и SELECT

Создайте простую таблицу, состоящую из единственного столбца char (1)


с именем «test_chars».

ажнение Вставьте в нее числа, буквы (верхнего и нижнего регистра) и не-алфавитные


символы, приведенные ниже (каждый символ вставляется в отдельную
запись). Вставьте пробел и оставьте одну запись со значением n u ll .
Примените к столбцу запрос на выборку с новой конструкцией order b y .
Заполните пустые места в книге.

0123ABCDabcd! ©#$%''&* () -_+=[]

Правила SQL
Правила SQL ппНИТе запрос ORDER BY
Выполните запрос o r d e r b y и запол/у;,^ ^ асставьте эти символы в по-
те пустые места, руководствуясь поряп ^ ® оезультг
ком символов в результатах выборка,
+ = !
Не-алфавитные символы следуют

Цифры следуют текстовых


символов.

Значения NULL следуют цифр

да л ьш е > 287
упражнение, р е ш е н ие

Создайте простую таблицу, состоящую из единственного столбца char (1)


с именем «test_chars».
Вставьте в нее числа, буквы (верхнего и нижнего регистра) и не-алфавитные
символы, приведенные ниже (каждый символ вставляется в отдельную за­
ажнение пись). Вставьте пробел и оставьте одну запись со значением n u ll .
Примените к столбцу запрос на выборку с новой конструкцией order by .
Заполните пустые места в книге.
_____ _ в о з м о ж н ы й п о р я д о к с л е д о -
' вания с и м в о л о в в р е з у л ь ­
т а т а х выборки. О б р а т и т е
в н и м а н и е на п р о б е л в н а ­
!"#$%&' ()*+,-./0123: ;<=> чале. В а ш п о р я д о к м о ж е т
?0ABCD[\]'- abcd{|}~ б ы т ь н ем ного другим в
з а в и с и м о с т и о т Р С У 5Д .
Важ но п о н и м а т ь , чт о
порядок СУЩ ЕСТВУЕТ —
и з н а т ь ег о для в аш ей
Р С У 5Д .

Правила SQL
Правила SQL О.^попните запрос ORDER BY
Выполните запрос ORDER BY и запол/,^^ ^ асставьте эти символы в поряд-
ш следования в результатах.
те пустые места, руководствуясь ПОПял.
ком символов в результатах выбор^^,
+ = ! ( &
Не-алфавитные символы следуют
* 0 ?
до и п о с л е цифр.

Цифры следуют... .... текстовых


символов. & ' (

Значения NULL следуют Эо цифр.

Значения NULL следуют.. Эо „. алфа­


витных символов.

Символы верхнего регистра следуют Эо


символов нижнего регистра.

«А 1» будет следовать до «Д1».

288 cj'iaea б
расш ирение возможности SELECT

ORDER е двумя столбцами


Похоже, все идет прекрасно: мы можем расставить фильмы по алфа­
виту и построить алфавитный список для каждой категории.
К сожалению, директор придумал
для вас еще кое-что... Персоналу видеотеки
То; Директор
From: Долой старый хлам
Subject:

Всем привет,

монете составить список фильмов


ХГо^^категории. улорядочеиный ло дате
приобретения?
Жду с нетерпением.
К счастью, в одной команде Ваш директор
можно упорядочить данные
сразу по нескольким столбцам. Д а т а п р и о б р ет е­
ния включается
в р езу л ьт а т
выборки.

SELECT title, category, purchased


FROM movie__table
ORDER BY category, purchased;
Лч

Ст олбец первичной сортировки. A ^0 эт ом у столбцу будет вы-


Мы получим список веек ф ильм ов
о М агазине, упорядоченный
? г;г;г
по ст олбцу « ca teg o ry » . «ca tego ry »-

Ш ТУРМ

Где будут находиться самые старые фильмы —


в начале или конце каждой категории? И что
произойдет, если два фильма в одной категории
имеют одинаковую дату приобретения? Какой
из них окажется на первом месте?

да л ьш е ► 289
сортировка по нескольким столбцам

ORDER С несколькими столбцами


Возможности сортировки не ограничиваются всего двумя столбцами.
Вы можете выполнить сортировку по любому количеству столбцов, Данные МОЖНО
чтобы получить нужную информацию.
Взгляните на следую1цую конструкцию ORDER BY с тремя столбцами.
отсортировать
Ниже показано, как происходит сортировка.
но любому
SELECT * FROM m o v i e _ t a b l e
ORDER BY c a t e g o r y , p u rc h a s e d , title ;
количеству
столбцов.
"e Z Z T , 3»^e« (‘" 'Т а Г Г л ;
пот ом у ч т о он находится на э „ т Г начиная с
п е р в о м м е ст е в списке ORDER сор т и ру ю т ся всегда
SY. К ат егории упорядочиваю т - ст ары х дат ^ А
СЯ о т А д о Я . с о р т и р у ю т с я п о гоО у, Наконец, р е з у л ь ­
месяцу и в завершение по дням. т ат ы у п о р я ­
дочиваются по
К атегор и и названию ф ильм а,
т акж е в порядке
А от А до Я.
Даты
приобретения I
Названия
20-11-1999 - - ---------- >

Названия
19-4-2003 -- ---------- >

Даты
приобретения
T itle s
20-11-1999 - - — >
s ta rtin g w itli
290 глава 6
расш ирение возможности SELECT

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

m o v ic jd t it le r a tl« g ^9 ц е гу p » rs h « .d _
к о -- '— ’
Исходная / ] 1^ /Ч У К ^
таблица 83 Большое приключение G семейное 6-3-2002
moviejtable. 84 Грег: Неизвестные истории PG боевик 5-2-2001
85 Безумные клоуны R ужасы 20-11-1999
Н икакого п о - ^ > 86 Параскеведекатриафобия R боевик 19-4-2003
р я д к а зЭ есь 87 Крыса по имени Дарси G семейное 19-4-2003
нет ] (рилЬ’Мк’! 88 Конец очереди R разное 5-2-2001
1лереиисля- ^
> 89 Блестящие вещи PG драма 6-3-2002
ю т ся в п о ­
рядке в ст а в ­ 90 Заберите обратно R комедия 5-2-2001
ки з а п и с е й 91 Наживка для акул G разное 20-11-1999
в т а 6 л и и ,у . ^ 5, 92 Разгневанный пират PG разное 19-4-2003
93 Планета пригодна для жизни PG фантастика 5-2-2001

.U упорядоченные результаты нашего запроса:


Первичная вт оричная
ЗaвepuAaк>u^aя сорт ировка сортировка
сорт ировка
I I
M o v ie jd tille га11н0 c a te g o ry purchased
84 Грег: Неизвестные истории PG боевик 5-2-2001
86 Параскеведекатриафобия R боевик 19-4-2003
89 Блестящие вещи PG драма 6-3-2002
90 Заберите обратно R комедия 5-2-2001
91 Наживка для акул G разное 20-11-1999
88 Конец очереди R разное 5-2-2001
92 Разгневанный пират PG разное 19-4-2003
83 Большое приключение G семейное 6-3-2002
87 Крыса по имени Дарси G семейное 19-4-2003
Безумные клоуны / ^ ужасы 20J1-199X

дальше ► 291
обратный п о р я д о к

Не люблю старое кино... А если я захочу


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

В SQL есть ключевое слово для изменения


направления сортировки.
По умолчанию SQL упорядочивает столбцы ORDER
BY по возрастанию: от А к Я, от 1 к 99999 и т. д. Если
вы предпочитаете получить данные в обратном
порядке, укажите после имени столбца ключевое
слово DESC.

Часш°
"^аД аБ аеМ ы е
Бо1]р)Сь1

Но мы использовали ключевое слово DESC для полу­ Я могу использовать в своих запросах полные слова
чения ОПИСАНИЯ таблицы. Вы уверены, что оно может )ESCRIBE и DESCENDING, чтобы избежать путаницы?
использоваться для изменения порядка?

О Да. все зависит от контекста. Если поставить DESC перед


именем таблицы — например, DESC m o v ie _ ta b le ;- то вы
• Вы можете использовать DESCRIBE, но DESCENDING
работать не будет

получите описание таблицы. В этом случае оно интерпретирует­


ся как сокращение от DESCRIBE.
Ключевое слово DESC после
В условии ORDER оно интерпретируется как сокращение
от DESCENDING, и определяет порядок результатов. имени столбца в условии
ORDER BY упорядочивает
результаты по убыванию.

292 глава 6
ра сш и р е н и е в о зм о ж н о с т и S ELE C T

DESC u изменение порядка данных


Представьте, что ваши данные стоят на ступеньках

Следующий запрос возвращает список фильмов, упо­


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

SELECT t i t l e , p u r c h a s e d
FROM m o v i e _ t a b l e
ORDER BY t i t l e A S C , p u r c h a s e d D E SC ;
7 '
Здесь можно указат ь к л ю ­
чевое слово ASC, но эт о не Чтобы данные были
от сорт ированы от Я
обязательно. Д ост ат очно
п о м н и т ь, что по умолчанию до А (или о т я до г ) ,
исп ользу йт е ключеЬое
данные со р т и ру ю т ся по в о з­
раст анию . слово DBSC.

да л ьш е ► 293
фильмов н печенью

То: Персоналу видеотеки


From: Директор
Subject: Налетай!

Всем привет!

Все просто прекрасно! Фильмы стоят на нуж­


ных местах, и благодаря этим вашим хитро­
умным условиям ORDER BY каждый клиент
может легко найти именно то, что ему нужно.

Чтобы наградить вас всех за примерную ра­


боту, завтра в моем доме состоится вечерин­
ка с пиццей. Собираемся к 18:00.

И не забудьте принести отчеты!


Ваш директор

Р. S. И не слишком наряжайтесь, мне тут


нужно передвинуть кое-какую мебель...

294 глава 6
р а с ш и р е н и е в о зм о ж н о с т и S ELE C T

Проблемы е печеньем Девочка,


Заработанная
Руководитель местной группы девочек- у^родавшай сум м а
скаутов пытается разобраться, кто из ее печенье ^ cookie sales v f продажи
подопечных продал больше всего пече­
нья. Пока у нее есть таблица с данными ID 11га1_пам* >al«s •a l*_ d a t«
о продажах каждой девочки за день. 1 Линдси 32.02 6-3-2007
2 Пэрис 26.53 6-3-2007
3 Бритни 11.25 6-3-2007
4 Николь 18.96 6-3-2007
Я должна как можно
5 Линдси 9.16 7-3-2007
скорее определить J
6 Пэрис 1.52 7-3-2007
победителя. )
7 Бритни 43.21 7-3-2007
8 Николь 8.05 7-3-2007
9 Линдси 17.62 8-3-2007
10 Пэрис 24.19 8-3-2007
11 Бритни 3.40 8-3-2007
12 Николь 15.21 8-3-2007
13 Линдси 0 9-3-2007
14 Пэрис 31.99 9-3-2007
15 Бритни 2.58 9-3-2007
16 Николь 0 9-3-2007
17 Линдси 2.34 10-3-2007
18 Пэрис 13.44 10-3-2007
19 Бритни 8.78 10-3-2007
20 Николь 26.82 10-3-2007
21 Линдси 3.71 11-3-2007
22 Пэрис 0.56 11-3-2007
Эдвина, руково­ 23 Бритни 34.19 11-3-2007
дит ель группы Николь 7.77 11-3-2007
24
25 Линдси 16.23 12-3-2007
26 Пэрис 0 12-3-2007
27 Бритни 4.50 12-3-2007
28 Николь 19.22 12-3-2007
- л^Возьми в руку карандаш
Девочка, продавшая больше всего печенья, награждается бесплатными
уроками верховой езды. Все девочки хотят победить, поэтому Эдвине
очень важно побыстрее определить победителя, пока дело не дошло
до ссоры.
Используйте свои навыки обращения с ORDER BY и напишите запрос,
который поможет Эдвине узнать имя победителя.

дальш е > 295


возьми в руку карандаш, реш ение

- ^ В о зьм и в руку карандаш


'ешение Девочка, продавшая больше всего печенья, награждается бесплатными
уроками верховой езды. Все девочки хотят победить, поэтому Эдвине
очень важно побыстрее определить победителя, пока дело не дошло
до ссоры.
Используйте свои навыки обращения с ORDER BY и напишите запрос,
который поможет Эдвине узнать имя победителя.

S E L E C T F;Vst_nflme, sales

FROM cookie_sales
ORDER BY First_name;
Эт о запрос...

^ э т о его результ ат ы .
11г«1_пап1е ■а1«с
Николь 19.22
Николь 0.00
Николь 8.05
Николь 26.82
Николь 7.77
Николь 15.21
Николь 18.96
Бритни 3.40
Бритни 2.58 Чтобы о пр ед ели т ь п о ­
Бритни 4,50 бедит еля, нам все равно
Бритни 11.25 придет ся складывать
Бритни 8.78 данные о продажах ка ж ­
Бритни 43.21 дой девочки вручную.
Бритни 34.19
Линдси 17.62
Линдси 9.16
Линдси 0.00
8 1 .0 8
Линдси 32.02
Линдси 2.34
Линдси 3.71
Линдси 16.23
Пэрис 26.53
Пэрис 0,00
Пэрис 0.56
Пэрис 1.52 98.23
Пэрис 13.44
Пэрис 24.19
Пэрис 31.99

296 глава 6
р а с ш и р е н и е в о зм о ж н о с т и SELECT

SUM C A o ik u m числа за нас

Ставки высоки. Мы не можем допустить ошибку и рассердить девочек-скау'гов. Одна­


ко числа не обязательно складывать вручную —«черную работу» можно поручить SQL.
В языке SQL есть специальные ключевые слова, называемые функциями. Каждая
функция выполняет некоторую операцию с одним или несколькими значениями.
Первая функция, которую мы вам покажем, выполняет математическую операцию
со столбцом. Функция SUM суммирует значения столбца, указанного в круглых скобках.
Давайте посмотрим, как она работает.
Функция SUM су м м и р у ет
значения ст олбца «sales». S U M — Фчнкция, mo ecmt? эт о
ключевое слоЬо дыполняет one -
i V рацию со столбцОАЛ, указанным
SELECT SUM (sales) в круглых скобках.
FROM cookie sales
WHERE first name = 'Николь
Это условие ограничивает, зап р ос, чтобы он ск л а ­
дывал т олько данные продаж Николь, без него запрос
п р о су м м и р у ет все содерж им ое столбца «sales>
5» .

I File Edit Window Help TheWinnerlT

> SELECT S U M (s a le s ) FROM c o o k ie _ s a le s


- > WHERE f i r s t name = 'Н и к о л ь ';

S U M (s a le s ) I

96.03 I

1 r ow i n s e t ( 0 . 0 0 sec)

Теперь осталось вычислить еще три суммы, и наша работа


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

n o n p o 6 v u m e y c a M u

Попробуйте сделать это самостоятельно. Создайте таблицу, похожую на соок1е_за1ез,

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

да л ьш е > 297
GROUP BY хорошо работ ает с SUM и AVG

СуАлмироВание е использованием GROUP BY


Д а н н ы е о прод аж ах печенья всем и д евочкам и м о ж н о п р о сум м и ­
р о в а т ь в о д н о м з а п р о с е — д л я э т о г о в к о м а н д у SUM в к л ю ч а е т с я
у с л о в и е GROUP BY. Т а ка я ко м а н д а г р у п п и р у е т все з а п и с и с и м е н е м
к а ж д о й д е в о ч ки и сум м и р уе т д а н н ы е п р о д а ж в к а ж д о й гр у п п е .
С ум м ирует данные
ст о л б ц а «sales»-
SELECT f ir s t _ n a m e , SUM ( s a l e s )
FROM c o o k i e _ s a l e s Г р у п п и р у е м зн ач ени я
GROUP BY f ir s t _ n a m e ^ ст ол бц а « first_ n am e» .

ORDER BY S U M ( s a le s ) D E S C ; Зн ач ен ия д о л ж н ы в ы вод Ui/'ЛЬСЯ


1^0 yOt^ieanuK), ч т о б ы иалл было
Упорядочение по т ой же ф унк
ции SUM, к о т о р а я u c n 0 A t? 3 0 6 a -
пройде о п р е д е л и т ь победит .еля.
л а с ь для выборки. ,,,ш ю и ет все з н а -

« « « » 6 г р а .«
Г а Г з и « и „ я

fir s l name sales


firs t •а1*а
Бритни 3.40
Николь 19.22 f ir s l nam e sales
fin i •alas Бритни 2.58
Николь 0.00 Линдси 17.62
Пэрис 26 .5 3 Бритни 4.50
Николь 8.05 Линдси 9.16
Пэрис 0.00 Бритни 11.25
Николь 26.82 Линдси 0.00
Пэрис 0.56 Бритни 8 ,78
Николь 1.77 Линдси 32 .0 2
Пэрис 1.52 Бритни 43.21
Николь 15.21 Линдси 2.34
Пэрис 1 3 .4 4 Бритни 3 4.19
Николь 1 8 .9 6 Линдси 3.71
Пэрис 24 .19 Линдси 16.23
Пэрис 31 .99

I Fils Edit Window Help TheWinnerReellyls

> SELECT first_ n a m e , S U M (sa le s)


-> FROM c o o k i e _ s a l e s GROUP B Y first_ n a m e
-> ORDER B Y S U M ( s a l e s ) ;
+-------------------- +---------------------+
f ir s t nam e 1 su m (sa les)
П обеж дает ... -+-
дритни! ' — > -| Бритни 1 107.91
Пэрис 1 98.23
Николь 1 96.03
Линдси 1 81.08

4 row s in set (0.00 sec)

298 глава 6
расш ирение возможности SELECT

Функция AV6 е 6R0UP BY


Другие девочки были огорчены, поэтому Эдвина решила вручить
второй приз за высший средний объем продаж за день. Для его вы­
числения она использует функцию AV G .
К аж д ая д е во чка продавала пе чен ье сем ь д не й. Д л я ка ж д о й д е в о ч ки
ф у н к ц и я A V G с у м м и р у е т е е п р о д а ж и , а з а т е м д е л и т и х н а 7.

HO н а э т о т раз вычисляет ся
И снова данные гр у п п и
не с у м м а , а среднее значение.
рую т ся по значению
fiyst_nam .e

SELECT f i r s t п а ш е , A V 6 ( s a l e s )
FROM c o o k i e s a l e s
A Va сум м ирует все зн ач ен ия
GROUP BY f i r s t n a m e ; группы и делит сумму на
количест во значений, чт обы
о п р ед ели т ь среднее значение
для группы . .

/ vL
ч/ flrsl_naine sales
flra l.m in i* М ІМ
Бритни 3.40
Николь 19.22 11п1_яая|* sal«*
П г*#_яам * saUs Бритни 2.58
Николь 0.00 Линдси 17.62
Пэрис 26.53 Бритни 4.50
Николь 8.05 Линдси 9.16
Пэрис 0.00 Бритни 11.25
Николь 26.82 Линдси 0.00
Пэрис 0.56 Бритни 8.78
Николь 1Л Линдси 32.02
Пэрис 1.52 Бритни 43.21
Николь 15.21 Линдси 2.34
Пэрис 13.44 Бритни 34.19
Николь 18.96 Линдси 3.71
Пэрис 24.19 Линдси 16.23
Пэрис 31.99 1

I РИв EdK Window Help TheWmnerReallyls

> SELECT first_ n a m e , A V G (sa le s)


И снова п о б е ­
дила дрит ни... -> FROM c o o k i e sa le s GROUP B Y f i r s t nam e;
Нужно п р и ­
думат ь другой I f ir s t nam e і A V G (sa le s) |
способ о п р ед е­
ления вт орого
I Н иколь 13.718571 I
мест а. _____ _
I Бритни 15.415714 I
I Линдси 11.582857 I
I П эрис 14.032857 I

4 row s in set (0.00 sec)

дальш е ► 299
MIN и MAX e де й с т ви и

MIN u MAX
He желая сдаваться, Эдвина применяет к своей таблице функ­
ции MIN и МАХ. Она хочет узнать, не было ли у других девочек
более высоких продаж за день —а может, в свой худший день
Бритни заработала меньше других?
Для определения наибольшего значения в столбце исполь­
зуется функция МАХ, а для определения нанменьшего значе­
ния —функция MIN.

M A X возвращает
наибольшее значение
S E L E C T ü r s t _ n a me^ Ш Х (sales) из каждой группы.
FROM cookie_sales
G R O U P B Y first name;

Сюрприз! f i n i nam» saie*


Самая боль­ Николь 26.82
шая выручка Бритни 43.21
за день снова Линдси 32.02
у бритни. Пэрис 31.99

S E L E C T first_name, M I N (sales) ^ MIN возвраи^ает


наименьш ее значение
FROM cookie_sales из каждой группы.
G R O U P B Y first name;

f ir s l name sales
Николь 0.00
Похоже, у всех Бритни 2.58
остальных де- Линдси 0.00
бочек был хотя Пэрис 0.00
бы один выходной,
а у Бритни даже
в худший день
был заработок.
Это уже серьезно. Может, дать приз
девочке, которая продавала печенье
больше дней, чем другие?

300 глава 6
р а с ш и р е н и е в о зм о ж н о с т и S ELE C T

COUNT u подсчет дней


Ч то б ы узнать, ка ка я и з д е во че к продавала пе чен ье больш е д ней,
ч е м д р у ги е , Э д в и н а п ы т а е тс я и с п о л ь з о в а ть для п о д с ч е та ф у н к ц и ю
C O U N T. Ф у н к ц и я C O U N T в о з в р а щ а е т к о л и ч ест в о з а п и с е й в ст о л б ц е.

---------_ Функция COUNT возвращает


^ ------------ количество записей в столбце
S E L E C T C O U N T (sale_date) ^-^sale_date». Если запись со-
F R O M co o k i e sales; n u l l , она не включа-
— ется в подсчет.

— ^ В о зьм и В руку карандаш


c o o k ie s a le s

ID 11га1_пам* sales sal*_dat* Перед вами исходная таблица. Как вы думаете,


какой результат вернет запрос?
1 Линдси 32.02 6-3-2007
2 Пэрис 26.53 6-3-2007
3 Бритни 11.25 6-3-2007
4 Николь 18.96 6-3-2007
5 Линдси 9.16 7-3-2007
6 Пэрис 1.52 7-3-2007
7 Бритни 43.21 7-3-2007
8 Николь 8,05 7-3-2007
9 Линдси 17.62 8-3-2007 Представляет ли это число количество дней,
10 Пэрис 24.19 8-3-2007 в течение которых продавалось печенье?
11 Бритни 3,40 8-3-2007
12 Николь 15.21 8-3-2007
13 Линдси 0 9-3-2007
14 Пэрис 31.99 9-3-2007
15 Бритни 2.58 9-3-2007
16 Николь 0 9-3-2007
17 Линдси 2.34 10-3-2007 Напишите запрос, который будет возвращать
18 Пэрис 13.44 10-3-2007 количество дней, в течение которых каждая
девочка продавала печенье.
19 Бритни 8.78 10-3-2007
20 Николь 26.82 10-3-2007
21 Линдси 3.71 11-3-2007
22 Пэрис .56 11-3-2007
23 Бритни 34,19 11-3-2007
24 Николь 7.77 11-3-2007
25 Линдси 16.23 12-3-2007
26 Пэрис 0 12-3-2007
27 Бритни 4.50 12-3-2007
28 Николь 19.22 12-3-2007

да л ьш е > 301
возьми в руку карандаш, ре ш е ни е

- ^ В о зьм и в руку карандаш


V ‘ ешение
Перед вами исходная таблица. Как вы думаете, какой
результат вернет запрос?

Я 8 дней

Представляет ли это число количество дней, в течение


которых продавалось печенье?

Нет. Оно предст авляет количество


значений в столбце <<sale_date».

Напишите запрос, который будет возвращать количе­


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

SELECT flrst_name, COUNT(sale^date)


FROM cookie^ales
ROUP BY first_name;

Чтобы узнать, сколько дней


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

В о о б щ е -то нет. М ы не м о ж ем б ы ть
у в е р е н ы в то м , ч то м е ж д у п ер в о й
и последней датой не бы ло пропущ енны х
дней.
С ущ е ств уе т го р а зд о бол ее п р о с т о й с п о с о б узн а ть ,
в те че н и е ско л ь ки д ней продавалось печенье.
Задача реш ается п р и п о м о щ и кл ю ч е в о го слова
D ISTIN CT. О н о п о м о ж е т н а м н е т о л ь к о в ы ч и с л и т ь
н у ж н о е з н а ч е н и е COUNT, н о и п о л у ч и т ь с п и с о к д а т,
н е с о д е р ж а щ и й д уб л и ка то в.

302 глава б
р а с ш и р е н и е в о зм о ж н о с т и SELEC T

Команда SELECT DISTINCT Так как DISTINCT - ключевое


слово, а не функция, имя столб^
Д ля начала п о см о тр и м , ка к работает кл ю ч е ­ ца «saie^date» не нужно заклю ^
в о е с л о в о D IS T IN C T без ф у н к ц и и COUNT. чат ь в круглые скобки.

SELECT D IS T IN C T s a l e _ d a t e
FROM c o o k i e _ s a l e s Условие ORDER BY у п р о щ а ет поиск
ORDER BY s a l e d a t e ; < ~ первой и последней даты продажи.

I File Edit Window Help NoDupes

> SELECT D IST IN C T sa le _ d a te


FROM c o o k i e _ s a l e s
-> ORDER B Y s a le d a te ;

I s a le d ate

С м о т р и т е:
ни одного л
дубликата!

7 ro w s in s e t (0 .0 0 sec)

Т е п е р ь п о п р о б у е м в ы п о л н и т ь к о м а н д у с ф у н к ц и е й COUNT: о б р а т и т е внимание: DISTINCT


заклю чает ся в круглые скобки
в м е с т е с «s.ale_date»).

SELECT C O U N T (D IS T IN C T s a l e _ d a t e )
FROM c o o k i e s a l e s ;

Условие ORDER BY не нужно, ШТУРМ


п от ом у что COUNT вернет
одно число. Упорядочивать Попробуйте выполнить этот запрос.
здесь нечего. Кто из девочек продавал печенье в
течение большего количества дней?

yiHwndg

да л ьш е > 303
кто я?

Компания функций и ключевых слов SQL, облаченных в ма­


скарадные костюмы, развлекается игрой «Кто я?» Игрок дает
подсказку, а остальные на основании сказанного им пытаются
угадать, кого он изображает. Будем считать, что игроки всегда
говорят правду о себе. Заполните пропуски справа именами
одного или нескольких участников. Таюке для каждого участ­
ника укажите, является ли он функцией или ключевым словом.
Сегодняшние участники:
COUNT, DISTINCT, AVG, MIN, GROUP BY, SUM, MAX

функция или
11мя
ключевое слово
Мой результат не выглядит большим.

Мой результат больше любого из входных значений.

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

Я скажу сколько здесь было значений.

Используйте меня при вычислении суммы.

Меня интересуют только большие числа.

Как дела? Да так, средне.

304 глава 6
р зс и т р е н и е в о зм о ж н о с т и SELECT

4 a cm °

^адаБаеМ ы е
БоЗТ^ЬСь!
записей, а вы просто хотите просмотреть уникальные
А могли ли мы добавить условие ORDER BY при значения вместо длинного списка дубликатов.
поиске средних/наиболыиих/наименьших значений
с использованием AVG, МАХ и MIN?

О Могли — более того, это была бы очень хорошая


идея. Мы не стали включать ORDER BY, чтобы не ус­
Запрос с M IN О никак не помог бы Эдвине опре­
делить победителя, верно?

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

Раз уж мы заговорили о M IN — что произойдет,


Ключевое слово D IS T IN C T выглядит весьма если в столбце встречаются NULL?
полезным. Его можно использовать с любым
столбцом?
Хороший вопрос. Нет, ни одна из этих функций
никогда не возвращает NULL, потому что NULL — это
Да, с любым. Оно особенно удобно, когда один отсутствие значения, а не нуль.
столбец содержит одинаковые значения у нескольких

Хм... AVG, МАХ и COUNT


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

ШТУРМ
Представьте, что в таблице хранятся
данные не четырех, а сорока девочек. Как
использовать зим для определения второго
места?

да л ьш е У 305
ограничение результатов

LIMIT u ограничение результатов


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

SELECT £ i r s t _ n a m e , SUM ( s a l e s )
FROM c o o k i e _ s a l e s
GROUP BY f i r s t _ n a m e
ORDER BY S U M (s a le s )D E S C ; Нас интересуют
т о л ь к о первые
О ч е к 1, в о ж н с « с -'О А М о б а т е
firstjp em * — два результата.
зЗесР услобие O R P E R 8Y,
в противном случае ре ХВритни 107.91' У
..цльтаты будут слг^о 'v Пэрис
впть в случайном порядке. Николь 96.03 \ ио вт.сром
Линдси 81.08 .'■леспла' Николь с
ней до.льше не раЗ'
С ч е т ы р ь м я р е зул ь та та м и н е т р у д н о у в и д е ть , к т о о ка за л ся н а в т о р о м м есте. говаривает.
Н о если вы х о т и т е д е й ств о в а ть ещ е то ч н е е , о гр а н и ч ь те с п и с о к д а н н ы м и двух
д е во ч е к с н а и б о л ь ш и м и объ ем ам и п р о д а ж . К л ю ч е в о е слово L IM IT по зво л я е т
указать ко л и ч е с тв о за пи се й , во звращ аем ы х за п р о со м и з и т о го в о го набора.

SELECT f ir s t _ n a m e , SUM ( s a l e s )
FROM c o o k i e _ s a l e s
GROUP BY f i r s t nam e
ORDER BY SUM ( s a le s ) D E S C ^
Э т о т Элинн^и запрос в о з­
L IM IT 2 ;
вращ ает всего два числа.

Означает, что список


^ ^ Р ^ И Ч И В Л Е Т С Я п ер вы ­
м и двумя р езу л ьт а т а м и .
sales
Бритни 107.91
Пэрис 98.23

В т а б л и ц е х р а н я т с я д а н н ы е в с е го ч е т ы р е х д е в о ч е к, и о гр а н и ч е н и е и х д о д в ух о с о ­
б о й п о л ьзы не п р и н е се т. Н о представьте, ч то вы работаете с о гр о м н о й та б л иц е й.
Д о п у с т и м , в та б л и ц е х р а н я тс я о п и с а н и я 1000 са м ы х п о п у л я р н ы х пе се н, а вы х о т и ­
те о т о б р а т ь и з н и х п е р в ы е 100 в п о р я д к е п о п у л я р н о с т и . У с л о в и е L IM IT п о з в о л и т
п о л у ч и т ь т о л ь к о н у ж н ы е в а м п е с н и , а о с т а л ь н ы е 9 0 0 о с т а н у т с я « за к а д р о м » .

306 ?лава 6
расш ирение возможности SELEC T

LIMIT u второе место


L I M I T д а ж е п о зв о л и т нам сразу о п р е д е л и ть в то р о е м е сто , бе з в ы ­
вода п е р в о го м еста. Д л я э т о го L I M I T п е р е д а ю тс я два п а р а м е тр а :

Если вы п о п ы т а ет есь угадать


смысл этого условия, то скорее
всего, ouAuSemecb. С двумя п а р а ­
м е т р а м и LIMIT работ ает совсем
first.nam e sales
не так, как прежде.
\ Бритни
Пэрис
107.91
98.23
Бритни — о .
Пэрис — 1 ,
L IM IT 0 ,4 Николь 96.03 Николь — Z,
Линдси 81.08 Линдси — 3

Номер начальной ^соличество возвраща


записи. 8 SQL иуме емыу. результатоЬ.
рация начинается С О.

Е щ е н е за б ы л и н а ш п р и м е р с о 100 п е с н я м и ? Д о п у с т и м , м ы х о т и м
п о л у ч и т ь п е с н и с 20 п о 30. Э т о м о ж н о сд е л а ть п р и п о м о щ и L IM IT
с д о п о л н и те л ь н ы м парам етром . У п о р я д о ч и те п е сн и п о п о п у л я р н о с ти
и добавьте усл о ви е L IM IT 19, 10. П а р а м е т р 19 у к а з ы в а е т , ч т о в ы в о д
н а ч и н а е т с я с 2 0 п е с н и (р а з в S Q L н у м е р а ц и я н а ч и н а е т с я с 0 ), а п а р а ­
м е т р 10 — ч т о з а п р о с д о л ж е н в е р н у т ь 10 з а п и с е й .

Р g J o 3bMM в руку карандаш


Напишите запрос, который вернет второй результат — и только
второй результат. В запросе должно использоваться условие
L IM IT с двумя параметрами.

дальше ► 307
возьми в руку карандаш, р еш е н и е

- ^ о з ь м и в руку карандаш
Решение Напишите запрос, который вернет второй результат — и только
второй результат. В запросе должно использоваться условие
L IM IT с двумя параметрами.

SELECT first^name, SUM(sales)


FROM cookie_iales
GROUP BY first_name
ORDER BY SUM(5ales) DESC
LIMIT

He iaSydotne, что в SOL u ,,„


н т и и а ет ся с о. Так
нд СДЛ/І0Л1 деле 2.. эило

с этими новыми ключевыми словами


мои команды ЗРЬ стали такими длинны­
ми и сложными... Все это хорошо, конечно,
но нельзя ли их как-нибудь упростить?

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

308 глава 6
р а с ш и р е н и е в о з м о ж н о с т и S ELE C T

Компания функций и ключевых слов SQL, облаченных в ма­


скарадные костюмы, развлекается игрой «Кто я?» Игрок дает
подсказку, а остальные на основании сказанного им пытаются
угадать, кого он изображает Будем считать, что игроки всегда
говорят правду о себе. Заполните пропуски справа именами
одного или нескольких участников. Также для каждого участ­
ника укажите, является ли он функцией или ключевым словом.
Сегодняшние участники:
COUNT, DISTINCT, AVG, MIN, GROUP BY, SUM, MAX

функция UAU
11мя
ключевое слово

Мой результат не выглядит большим. М1Ы функция

Мой результат больше любопз из входных значений. SUM функция

Мои результаты единственные и неповторимые. DISTINCT к л ю ч е в о е сл о в о

COUNT функция
Я скажу, сколько здесь было значений.

GROUP BY к л ю ч е в о е сл о в о
Используйте меня при вычислении суммы.

Меня интересуют только большие числа. МАХ функция

Как дела? Да так, средне. Ava функция

д а л ьш е у 309
краткий обзор sql

Новые нструменты
Глава 6 осталась позади. Теперь вы с легкостью
управляетесь с функциями, ключевыми словами
и расширенными запросами SELECT. Полный
t- O
список инструментов приведен в приложении III.

COUNT

С1ЛЛ0лбцУ- Сообщает, сколько за-

GR0T3P о

C yvxO A dt^

DISTINCT
AVg
Возвращает только
уникальные значенияj без
дубликатов. ______ _
^'^олбцс(.. ‘^^^'^ового

SUM
Сум мирует числовые и M IN
значения в столбце.

LIM IT _________ >^‘>‘^ м е н ы и е е.

Г О у с д е л я е м , ск о л ь к о
именно записеЯ должен
Вайли новые и н с т р у ­ запрос, и с и -
мент ы : функции, к л ю ­ кои записи следует на­
чинать. У на
чевые слова и расили -
рснные запросы SELECT'

310 глава 6
7 ^[ноГотаблиЧные ба5ь1 Данных

Когда в одной таблице тесно

Иногда в одной таблице становится попросту тесно.


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

Как найти Найд)келу nogpyikky


Б л и ж а й ш и й д р у г Г р е га — Н а й д ж е л — п о п р о с и л
ему п о д о б р а ть п о д р у ж ку с п о х о ж и м и и н те р е са ­
м и . Д л я начал а Гр е г и зв л е ка е т и з базы д а н н ы х
запись Н айджела. Нлйджел

В о т к а к о н а в ы гл я д и т :

contact_id: 341
last_name: Мур
first_name: Найджел
phone: 5552311111
e mail: nigelmoore@ranchersrule.com
gender: M
birthday: 1975-28-08
profession: Фермер
city: Остин
state: TX
status: He женат
interests: животные, лошади, кино
seeking: Незамужняя женщина

С тол бец in t e r e s t s не является а том арны м ;


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

Грег вклю чает просьбу Н айдж ела в свой сп и ­


с о к т е к у щ и х дел.

т
'Текущие с)елз

ИзйЭжелз: запрос Золжеи


поднять поиск по столбцу mXertsXs. Что-то сложно, ЬроЪе нужно
использобзть ИК^, но на оЭин раз сойЭет... ’

312 глава 7
м н о г о т а б л и ч н ы е базы данных

Зачем что-то менять?


Грег р е ш ил не и зм е н я ть стол бец in t e r e s t s . О н пр е д ­
п о ч и т а е т п и с а ть с л о ж н ы е за п р о с ы , п о т о м у ч т о ему
ка ж е тс я , ч то э то п р и д е т с я д елать н е т а к ч а сто .

Грег испо л ьзуе т поле даты р о ж д е н и я для п о и с ка ка н д и ­


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

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

SELECT * FROM m y _ c o n t a c t s
WHERE g e n d e r = 'Ж '
AND s t a t u s = 'H e з а м у ж е м '
AND s t a t e = ' T X '
AND s e e k i n g L IK E ' % Мужчина% '
AND b i r t h d a y > ' 1 9 7 0 - 2 8 - 0 8 '
AND b i r t h d a y < ' 1 9 8 0 - 2 8 - 0 8 '
AND i n t e r e s t s L IK E .........................
A N D ..................................................................
A N D ..................................................................

дальш е ► 313
возьми в руку карандаш, реш ение

Г ® РУ*^ карандаш
\ш ение Допишите запрос Грега, чтобы он находил женщин, разде­
ляющих все интересы Найджела. Укажите, что делает каждая
строка кода.

Выдрать из таблицы my^contacU


осе записи, удовлетворяющие с л е ­
дую щ им условиям.

SELECT * FROM m y _ c o n t a c t s
_ И щ е м женщину...
WHERE g e n d e r = 'Ж ' '—
AND s t a t u s = 'H e з а м у ж е м ' ■незамужнюю...
AND S t a t e = ' T X ' ...чтобы жила в т о м ж е ш т ат е...
AND s e e k i n g L IK E ' %Мужчина% ' <f— хот ела познакомиться
с мужчиной...
AND b ir th d a y > '1 9 7 0 - 2 8 - 0 8 ' ^
AND b ir th d a y < '1 9 8 0 - 2 8 - 0 8 ' Не более чем на S л е т м л а д ­
AND i n t e r e s t s L I K E ..... 7 ?.><И‘^Р.1^ные%' ше или ст а р ш е Найджела...
and . interests,LIKE '%лошади%' .................... x

AND "" interests'LI K E '% kuho%']....................... \ A здесь ищутся


для увлечении Н аиджела.Также
м о ж н о было использоват ь OR,
но мы хо т и м H a i i m u совпаде­
ние по всем увлечениям.

Запрос прекрасно сработал...


Грег н аход и т идеальную пару для Н айдж ела:

contact_id: 1854
last_name: Фиоре
first_name: Карла ^арла
phone: 5557894855 Триггер
e mail: cfioregfioreanimalclinic.com
gender: Ж т л
birthday: 1974-01-07-^-- под>!.одит
profession; Ветеринар ^ , хорошая профессия
city: Раунд-Рок
да ж е Живет неподалекц
status: Не замужем ^
interests: лошади, >сино, животные, детективы,
туризм
seeking: single М со в п а д а ю т !

314 глава 7
м н о г о т а б л и ч н ы е базы данных

...да)ке слишком хорошо!


У Н а й д ж е л а и К а р л ы все с р о с л о с ь , и Г р е г
с т а л ж е р т в о й с о б с т в е н н о г о у с п е х а : все
н е ж е н а т ы е д р узья п р о с я т е го н а й т и и м
п о д р у г у ж и з н и . А д р у з е й у Г р е га м н о г о ...

Всю <<черную работу» должна


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

Написание запросов зан и м а ет слиш


ком много времени. Грег включает
в свой список дел новую запись.

'Текущие с)елз

Но
испоДьзо&ашь МК^, но на оЭцн р а з сЙ1с)егс Ш '

кзк'«и<5у£)ь обойтись ^ез cmo^S\xa


1пгеге5{5.

сшпьше > 315


без столбца in te res ts

игнорировать проблему — не выход


Д р у г о й д р у г, Р е д ж и , п р о с и т Г р е га н а й т и е м у п а р у Е м у н у ж н а
ж е н щ и н а , ко то р а я о тл и ч а е тся о т н е го п о в о зр а сту не более
ч е м н а 5 лет. Р е д ж и ж и в е т в К е м б р и д ж е , ш т а т М а с с а ч у с е тс ,
а е го ув л е ч е н и я о тл и ч а ю тс я о т ув л е ч е н и й Н а й д ж е л а .

Грег реш ает вообщ е не обращ ать в н и м а н и я на стол бец


Реджи
in t e r e s t s , что б ы не усл ож н ять запросы .

Напишите для Реджи запрос, не использующий столбец interests.


ажнение

contact_id: 873
last_name: Салливан
first_name: Реджи
phone: 5552311122
email: me@kathieleeisaflake.com
gender: М
birthday: 1955-20-03
profession: Комик
city: Кембридж
state: MA
status: He женат
interests: животные, коллекционные карточки, геопоиск
seeking: Женщина

ОшВелі на с. 372
-

SI 6 глава 7
м н о г о т а б л и ч н ы е базы данных

Слишком много лишних Вариантов О О Нельзя полностью


Грег отдает Р ед ж и д л и н н ы й с п и с о к в а р и а н то в . Н е ­
игнорировать увлечения.
с к о л ь к о н е д е л ь с п у с т я Р е д ж и з в о н и т Г р е гу и го в о р и т ,
Должен быть другой, лучший
ч т о о т е го с п и с ка н е т н и к а к о го п р о ку : н и од на и з к а н ­
способ...
д и д а т о к н е и м е е т с н и м н и ч е го о б щ е го .

• ТёкушиеЭгла

ублсиенм я В А Ж Н Ь .
И х нельзя мгнорм^
робать, это цен-
^ р о& ерять только пер&ое у&лечеиие, а на остальные U инф орм ация.
не оораш ать Внимания.

использовать только первое увлечение


Т е п е р ь Г р е г знает, ч т о и гн о р и р о в а т ь все у в л е ч е н и я н е л ьзя. О н п р е д п о ­
л а га е т, ч т о л ю д и п е р е ч и с л я ю т у в л е ч е н и я в п о р я д к е в а ж н о с т и , и р е ш а ­
е т, ч т о о н б у д е т п р о в е р я т ь т о л ь к о п е р в о е и з н и х . З а п р о с ы п о - п р е ж н е м у
о с та ю тс я с л о ж н ы м и , н о н е н а с то л ь ко , к а к п р и в к л ю ч е н и и L IK E для
всех увл е че н и й из столбца in t e r e s t s .

Используйте функцию SUBSTRING_INDEX для выделения


первого увлечения из столбца i n t e r e s t s .

дал ьш е ► 317
возьми в руку карандаш, решение

- ^ В о зьм и в руку карандаш


Решение Используйте функцию SUBSTRING_INDEX для выделения
первого увлечения из столбца i n t e r e s t s .

SUBSTRING JN P E X (in terests,


« 1 » Эля поиска первой запятой.
. ----------------------------Л ------" . С п а р а м е т рlna|yumcyv\fyu/vi
о м « Я » функция выде-
Вызов функции выделяет все Искомый с и м - символы до второй з а -
символы, предш ест вую щ и е __ пятой, то ест ь т е к ст пердых т ух
запятой в столбце «lnterests»■ ' увлечений.

Затем Грег п и ш е т за пр о с, ко т о р ы й п о м о ж е т Р е д ж и н а й т и сво ю


пару. В за п р о с е и с п о л ь зу е тс я ф у н к ц и я SUBSTRING INDEX,
а п е р в ы м у в л е ч е н и е м д о л ж н ы б ы т ь ' ж и в о т н ы е '.

SELECT * FROM m y _ c o n t a c t s
WHERE g e n d e r = 'Ж ' 3 запросах будут о т о б ­
AND s t a t u s = 'H e з а м у ж е м ' раж ат ься только ж е н ­
AND s t a t e = ' M A ' щины, у которых в спи -
ске увлечений на первом
AND s e e k i n g L IK E ' % Мужчина% ' м е с т е ст о я т 'животные'.
AND b i r t h d a y > ' 1 9 5 0 - 2 8 - 0 8 '
AND b i r t h d a y < ' 1 9 6 0 - 2 8 - 0 8 '
AND S U BSTRING I N D E X ( i n t e r e s t s ^ 1 ) = 'ж и в о т н ы е ';

Пара для Peg)ku


Н а ко н е ц -т о ! Г р е г наш ел п а р у для Р ед ж и;

contact_id: 459
last_name: Фергюсон
first_name: Алексис
phone; 5550983476
email: alexangel@yahoo.com
подходит
birthday: 19Ъ(,-\9-09<ег^^
profession: Художник
ci ty; Пфлвгервиль
state: MA ж и вет близко
status: He замужем
interests: животные <— p. ,
seeking: Мужчина ^ООЯщие увлечения

318 глава 7
м н о г о т а б л и ч н ы е базы данных

Трагическое несоответствие
Р е д ж и д о го в о р и л с я с А л е кс и с о с в и д а н и и , и Г р е г с н е те р п е н и е м
ж д а л е го р а сска за . О н уж е н а ча л п р е д с та в л я ть себе н о в у ю т а б л и ц у
my c o n ta c ts , ко то р а я ста н е т началом н о в о й со ц и а л ьн о й сети.

а с Я е д у і° Щ и й д е н ь у Д Б е ] ^ ^ У е Г а с з р о и т п | ^ е Д Ж и — и т і|:> ш ц о М о Ч е н ь

сердиты й.

^еДЖи криЧищ : «К^онеЧно, она инше]=>ес:уеіііся ЖиБощньШи. ||о щ ы



не сказал Мне, Чщо она деЛает из них чуЧеЛа! ]аМ тюВдоду Ме]=тпБые

Ж иБощ ны е!»

® 'Т ^ у ш и е с ) е л з

,пО
ucno/<b3o6'3mb М К^, но на оЭин р аз сбйЭет;.. ' !у
ІУ В таблице была
идеальная пара
для Реджи,
но Грег не нашел
ее, пот ом у что
ее увлечения п е р е ­
числялись в дру -
Созї)зть несколько стол^цо& ї)ля хрзнадия у&ле' гам порядке.
Ч е « и й , потому ч то хранение Всек/Влечений Ь ої)ном столбце С"
усложняет запросы. <v,cmoAoue
Гр ег р е ш а е т
и зм ен и т ь
ст ру кт у р у
своей таблицы.

fe rW T V P M
Как будет выглядеть следующий запрос
Грега после создания нескольких столб­
цов увлечений?

да л ьш е * 319
создание четырех ст о л б ц о в in ie ra s t

Создание новых столбцов interest


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

Н о Грег ум еет пользоваться ко м а н д о й ALTER д л я и з м е н е н и я


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

- ф|озьми в руку карандаш


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

c o n ta c t_ id
la s t_ n a m e
fir s t_ n a m e
phone
e m a il
gender
b ir th d a y
p r o fe s s io n
c ity
s ta te
s ta tu s
in te r e s tl
in te r e s t2
in te r e s ts
in te r e s t4
s e e lc in g

ОшВешы на с. 371'

320 глава 7
м н о г о т а б л и ч н ы е базы данных

Начинаем заново
Г р е г ч у в с т в у е т се б я в и н о в а т ы м за н е уд а чу Р е д ж и и р е ш а е т п о п р о б о ­
в а ть ещ е раз. Д л я н а ча л а о н и зв л е ка е т и з т а б л и ц ы з а п и с ь Р е д ж и :

contact_id: 872
last_name: Салливан
first_name: Реджи
phone: 5554531122
email : regis@каthieleeisaflake.com
gender: Ж
birthday: 1955-20-03
profession: Комик
city: Кембридж
state: MA
status: He женат
interestl: животные ^ и з м е н е н н о й т абли ц е 1ЛНфор~
interest2: коллекционные карточки L мация об увлечениях хранится
„Х..д.
interest3: геопоиск J о чет ы рех столбцах.
interest4: NULL
seeking: Женщина

Грег пишет запрос, который должен вернуть Реджи подходящую пару. Ои начинает с про­
стых столбцов — gender, status, state, seeking И birthday — И ТОЛЬКО ПОТОМ берется
ажнение за столбцы interest.
Запишите его запрос.

да л ьш е >• 321
упражнение, реш ение

Грег пишет запрос, который должен вернуть Реджи подходящую пару Он начинает с про­
стых столбцов — gender, status, state, seeking И birthday — и только потом берется
ажнение за столбцы interest.
Реш ение
Запишите его запрос.

S ELEC T * FROM my_contacts

WHERE g e n d e r = 'Ж '


AND status = 'H e зам уж ем ' Реджи иш,ет н е з а м у ж ­
AND state='M A нюю жени^ину, родив­
ш уюся в заданный период
AND seeking LIKE '% М уж чинд% '
ANP birthday > ' г Я 5 0 ~ г 0 ~ 0 Ъ '
> времени, которая ж ивет
в Массачусетсе и хочет
AND birthday < 'X 4 (2> 0-Z 0-03' вст речат ься с н еж ен а ­
ANP т ы м Мужчиной.
У
(
in t e r e s t ! = 'животные'
OR in teres ts - "животные'
OR in teres ts = 'животные'
OR interest‘d - 'животные' Чтобы найти совпаде­
)
ния с увлечениями Реджи,
Грег вынужден п р о в е ­
AN P
р и т ь все чет ы ре н о ­
( вых столбца « in t e r e s t » ,
in t e r e s t l = 'коллекционные карточки' пот ом у что в каждом
OR in teres ts = 'коллекционные карточки' из нмх м о ж е т найтись
OR in teres ts - 'коллекционные карточки' совпадение.
OR in teres ts = 'коллекционные карточки'
)
AN P
(
in t e r e s t l = 'геопоиск'
Столбец « i n t e r e s t ^ »
OR in teres ts - 'геопоиск' у Реджи содержипл
OR in teres ts = 'геопоиск' NULL, п оэт о м у п р о ­
OR in t e r e s ts - 'геопоиск' веряют ся только
увлечения в м е ­
ст о четырех.

322 глава 7
м н о г о т а б л и ч н ы е базы данных

Все без толку...


Д обавление новы х
столбцов н и ка к не по­
м о гл о р е ш и т ь о с н о в ­ 'Текущие с)елз
ную проблем у: стр укту­
ра таб л иц ы усл ож н яет
запрос
написани е запросов к
ней. О братите вним а­ испоАзобзть M fi, ноиа
ние: в каж дой версии
та б л и ц ы наруш ается
правило атом арности
данны х.

Я-Йа-
\Сазалось Styh
т а к о е хорошее
pe-LUeHWe.-- С о>Ззт^ « Т о л ь к о
Но с н и м з а ­
просы с т а л и
еще сложнее.

...OguH момент!

А если создать отдельную таблицу,


в которой хранится только инq^op/иa-
0 0 ция об увлечениях?______

Ш ТУРМ

Какую пользу принесет создание новой таблицы?


И как связать данные из новой таблицы с существу­
ющей таблицей?

да л ьш е ► 323
создание д о п о л н и т е л ь н ы х т а бл иц

Одной таблицы недостаточно


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

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

Неатомарные столбцы из существующей


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

I File Edit Window Heip^ MessyTable

> DESCRIBE m y _ c o n t a c t s ;

1 F ie ld i T yp e I N u l l I K ey I D e f a u l t | E x t r a |
+ -------------------------- + -----------------------------+ ------------ + ---------- + ------------------ + --------------------------------- +
1 c o n ta c t_ id 1 in t(ll) 1 NO 1 PRI 1 NULL 1 a u t o in c r e m e n t |
I l a s t name | v a r c h a r (3 0 ) 1 YES 1 1 NULL 1 1
1 f i r s t name | v a r c h a r (2 0 ) 1 YES 1 1 NULL 1 1
1 phone 1 v a r c h a r (1 0 ) 1 YES 1 1 NULL 1 1
1 e m a il i v a r c h a r (5 0 ) 1 YES 1 1 NULL 1 1
1 gender 1 c h a r (1 ) 1 YES 1 1 NULL 1 1
1 b ir th d a y 1 d a te 1 YES 1 1 NULL 1 1
1 p r o f e s s io n 1 v a r c h a r (5 0 ) 1 YES 1 1 NULL 1 1
1 c ity 1 v a r c h a r (5 0 ) 1 YES 1 1 NULL I 1
1 s ta te 1 v a r c h a r (2 ) 1 YES 1 1 NULL 1 i
1 s ta tu s 1 v a r c h a r (2 0 ) 1 YES 1 1 NULL 1 1
1 in t e r e s t s 1 v a r c h a r (1 0 0 ) 1 YES 1 1 NULL 1 1
1 s e e k in g 1 v a r c h a r (1 0 0 ) 1 YES 1 1 NULL 1 I
+ -------------------------- + _+ -------- _ + ----------+ ------------ — + ---------------------------------+
13 row s i n set (0.01 sec) >

324 >пэеа 7
м н о г о т а б л и ч н ы е базы данных

Многотабличная база данных с информацией о клоунах


П о м н и т е н а ш у т а б л и ц у с и н ф о р м а ц и е й о к л о у н а х и з г л а в ы 3?
П р о б л е м с к л о у н а м и с т а н о в и т с я все б о л ь ш е , п о э т о м у м ы
преоб разовал и од ну таб л иц у в более уд о б ны й наб ор и з не­ Так выглядела ст арая
с ко л ь ки х таб л иц . '^адлица ciownjtracking
clown_tracking
CtOMTN^iMf« «ом* a c tiv H ie c
Э лси Д о м п р е с т а р е л ы х Ч ер р и Ж , р ы ж и е в о л о с ы , зе л е н ы й <остю м . ш а р и к и , м аш и н к и
Х и лл б оти н к и
П иклз BftsepHHKa Д ж е к а Грима \ ^ ) а н ж о в ы е в о л о с ы , син ий мим
\ ^ :т ю м , о г р о м н ы е боти н к и
С наглз Б о л м ар т |л т а я ру6аи.1ка, к р а с н ы е ш таны р о ж о к , зонтик

таблица бы ла разбита и м е н н о та к,
а не и н а ч е и ч т о о з н а ч а ю т все э т и
с тр е л ки и кл ю ч и . А после э т о го
вы см о ж е те п о те м ж е п р и н ц и п а м
ÜiTVPM
р а з б и т ь т а б л и ц у Г р е га .
Как вы думаете, что означают линии
со стрелками? А изображения ключей?

да л ьш е ► 325
построение схе м ы б а зы д а н н ы х

Схема базы данных clownJracking


Старая
П р е д ста в л е н и е всех с тр у кту р базы д а н ­
^ т а5 л и іА ,а.
н ы х ( т а б л и ц , с т о л б ц о в и т. д .) и л о г и ­ clown_tгac]cing
ч е с к и х связей м еж ду н и м и назы вается
я««* 1а * | « ••в а с # І у іН « «
Э лси Д о м п р е с т а р е л ы х Чі^рри Ж , р ы ж и е в о л о с ы , зел ен ы й к о с гю м , ш а р и к и , м аш и н к и
схемой. Х и ял о г р о м н ы е боти н к и
П иклз В оч ер и н к а Д ж е к а Грина М ,М , оранжеоь!в волосы, синий мим
костюм, ОГрС;МНЫС боГИНКИ
Н а гл я д н о е п р е д с та в л е н и е б а зы д а н н ы х
С наглз Б о ;ім а р г )4^ ^ ^ * " " * 5 В а ш к а , к р а с н ы е ш таны р о ж о к , зонтик
п о м о ж е т вам п р е д с та в и ть , к а к свя за н ы
м еж ду с о б о й к о м п о н е н т ы б азы д а н н ы х ,
о д н а ко схем а та кж е м о ж е т б ы ть за писа ­
на и в виде те кста .

Описание данных (столбцов и таблиц)


вашей базы данных, включая все взаи-
мосвязанные объекты и связи между
ними, называется СХЕМОЙ.

326 глава 7
м н о г о т а б л и ч н ы е базы данных

Упрощенное представление таблиц


В ы ви дел и, к а к бы ла п р е об ра зо в а н а та б л и ц а с и н ф о р м а ц и е й о кл оунах.
Т е п е р ь д а ва й те п о п р о б у е м сд елать т о ж е сам ое с та б л и ц е й m y c o n ta c ts .

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

Н и ж е по ка за н о упр о щ е н н о е представление таб л иц ы my c o n ta c ts .

Имя my_contacts О значает , что


таблицы. ст олбец является
contact id первичным ключом.

last name

first name

phone

email

gender 0 с е столбцы
U . слеэо-
birthday бяния 6 таблице,.

profession

city

state

status
Диаграмма помогает отде
interests лить структуру таблицы
seeking от храняпщхся в пей
данных.

да л ьш е * 327
разбиение таблицы

Как из одной таблицы сделать две


М ы зн аем , ч т о н а п и са ть за п р о с для п о и с ка и н ф о р м а ц и и в сто л б ц е 1Иу_СОИ|ЯС#»
i n t e r e s t s в е го те ку щ е м ви д е д о в о л ь н о з а т р у д н и т е л ь н о , п о т о м у contact id
ч т о в о д н о м сто л б ц е м о гу т х р а н и ть с я сразу н е с ко л ь ко зн а ч е н и й . last name
Та6лиі4,а
В п р о ч е м , созд ание н е с ко л ь ки х р а зд ел ьны х сто л б ц о в не о со б е н н о first name
c o n t a c t s е^це
у п р о с т и л о н а ш у за д а ч у . phone
не
С права и зоб раж ена таблица my c o n t a c t s в ее т е ку щ е м с о с т о я ­ email

н и и . С то л бе ц i n t e r e s t s не ато м а р е н, и сущ ествует т о л ь ко о д и н gender

д е й с тв и т е л ь н о х о р о ш и й с п о с о б сд елать е го а то м а р н ы м : нам п о н а ­ birthday

д о б и тс я н о в ая та б л и ц а , в к о т о р о й будут х р а н и т ь с я все ув л е че н и я . profession


city
Д л я н а ча л а н а р и с у е м н е с к о л ь к о д и а гр а м м , к о т о р ы е п о ка ж у т , к а к state
будут в ы гл я д е ть н о в ы е т а б л и ц ы . Т о л ь ко п о с л е т о г о к а к будет г о т о ­ status
ва н о в а я с хе м а , м о ж н о б уд е т п е р е х о д и т ь к с о з д а н и ю н о в ы х т а б л и ц interests
или м од иф икации данны х. seeking

У д а л я е м с то л б е ц in te re s ts и р а з м е щ а е м
е го в о тд е л ь н о й та б л и ц е .
С т о л б е ц in t e r e s t s п е р е м е щ а е т с я в н о в у ю т а б л и ц у .

Добйбленме поля
id г а р а н п \ ы р у в п \ ,
чпло в т аб ли ц е.
не б у д е т дубли­
катов.

Ст олбец «interest»
т ипа VARCHAR содер­
ж ит факт ическое о п и ­
сание увлечения. В нем
хранят ся ст роки вида
‘Т у р и з м ' и л и ‘к у л и н а -

рия'.

В н о в о й та б л и ц е i n t e r e s t s будут х р а н и т ь с я
все у в л е ч е н и я и з т а б л и ц ы m y _ c o n ta c ts (о т ­
д е л ьн а я з а п и с ь д ля к а ж д о го у в л е ч е н и я ).

328 глава 7
м н о г о т а б л и ч н ы е базы данных

О Д о б а в л я е м с то л б ц ы , по ко то р ы м м о ж н о б уд ет
у з н а т ь , к а ки е у в л е ч е н и я п р и н а д л е ж а т т о м у или
и н о м у ч е л о в е к у из т а б л и ц ы m y _ c o n ta c ts .
М ы вы несл и увлечения из та б л и ц ы m y _ c o n ta c ts , н о ка к
о пред ел ить, ком у ка ки е увлечения принад леж ат. Н е о б хо д и м о
использовать и н ф о рм а ц и ю из табл ицы my c o n t a c t s и раз­
м е с т и т ь ее в т а б л и ц е i n t e r e s t s т а к , ч т о б ы э т и две т а б л и ц ы
б ы л и связаны м еж ду собой.

Н а п р и м е р , для э т о го м о ж н о в кл ю ч и т ь сто л б ц ы f i r s t nam e


и la s t_ n a m e в т а б л и ц у i n t e r e s t s .

my_c»wtw€ts
contact id
last name
first name Interests По э т и м ЭбуМ столЬ
int_id ц я м МОЖНО уънать.
phone
email interest кто какими у вл еч е­
gender first_name ниями обладает.
birthday last name
profession
city
state
Если эти значения совпадают
значит , человек обладает
status
seeking
данным увлечением. Таблица
interests содерж ит несколько
записеи с совпадением эт их
значений, что позволяет
связать с одним человеком
сразу несколько увлечений.

ШТУРМ
Мы двигаемся в верном направлении, но f i r s t n a m e
и l a s t _ n a m e — не лучшие столбцы для связывания
таблиц.

Почему?

iHbUie * 329
добавление связей на диаграмме

Связывание таблиц на диаграшах


К таблице my c o n ta c ts сто и т присм о­
тр е ться повним ательнее.

В о т ее и с х о д н ы й в а р и а н т. А в о т к а к в ы гл я д и т н о в а я схем а.

ту_с»и1я«1«
таблица irtUrests: contact id
кажЭзя запись last name
ссйеркит first name inter«*!«
(ir5t_name
phone int id 0=~w
Last_name
email last name
таблица rtw_corTtads irtkrest
CSe^столбца irtUrests) gender first name
birthday interest
profession
city
state Линиями обозначаю т ­
status ся совпадения в данных
- о 9 в -« н и я -
seeking Линии не обязательно
дли о б л а Э л е т. '^Роводить под прям ым
у гло м , но так их прощ е
01^слеживать.
О б р а ти те вн им ани е на л и н и и м еж ду таблицам и: о н и
об означаю т стол бцы с совпадаю щ им и зн ачени ям и.
Д и а гр а м м а , п р е д с та в л е н н а я в т а ко м ви д е , будет п о ­
н я т н а д л я л ю б о го S Q L -р а з р а б о т ч и к а , п о т о м у ч т о
в ней использую тся стандартны е обозначени я.

А в о т к а к в ы гл я д и т с е р и я ко м а н д SELEC T, ко то р а я
п о зв о л и т нам испо л ьзо ва ть да нны е и з о б е и х табл иц.

SELECT f i r s t name, l a s t name SELECT i n t e r e s t FROM i n t e r e s t s


FROM m y_contacts WHERE fir s t_ n a m e = 'Имя'
WHERE {условгхя) ; AND l a s t name = 'Фамилия ' ;

330 глава 7
м н о г о т а б л и ч н ы е базы данных

- ^ В о зь м и в руку карандаш
Какие еще таблицы стоит добавить в базу данных д гед з_1 1зЪ
для хранения информации о нескольких увлечениях?

Не старайтесь нарисовать аккуратную схему; сейчас время со­


бирать идеи. Одна идея уже изображена на рисунке, но у нее
есть недостаток.

таблица ігЛ€ге5Іу.
кажЗзя запись
С(Х>е|9жит;
іґ5І_пате
а5І_пате
Таблица ту согЛаЛ ігЛт.'Л
(ЙЄ5 столЛлз ігЛеігс5І0

Гениям б ст ол ^ опре,-

дли обладает.

да л ьш е у 331
возьми в руку карандаш, реш ение

- ^ о з ь м и в руку карандаш
Решение Какие еще таблицы стоит добавить в базу данных g r e g s _ l i s t
для хранения информации о нескольких увлечениях?
Не старайтесь нарисовать аккуратную схему; сейчас время со­
бирать идеи. Одна идея уже изображена на рисунке, но у нее
есть недостаток.

Однако связывание таблиц по имени


Та^лииа irfterests;
м ф ам илии ~ не самый лучший способ
кажЗзА запись В списке m y_contacU м о г у т о к а з а т ь -
сойеркитл;
|ir5t_name
и м ен ем
и ф ам или еи , в р е з у л ь т а т е чего м о ж е т
Last_name
inferest б о зн и к н у те , путаница с увлечениями.
Лучш е использоват ь для связывания
1^ а д л и ц первичный ключ.

T a iA U C ,« с б я з ы в « « ^
Эениям в

э е : ! г " ; к . к „ м . « в л е .е и и я -

MU обладает.

в м е с т о того, чтобы использоват ь «first^ n am e»


и <<lait_name», которые м о г у т оказаться
не уникальными, для связывания таолиц
лучше взять « c o n t a c t j d » :

/^'маёлыца
interests:
каждая за пи сь
содерж и т int id
in terest
c o n t a c t jd

n^a5лuu,a
m ijjco ntacti
Столбец « c o n t a c t j d » с о ­
(5ез ст олбца
« in t e re s ts » ) держ ит заведомо у ни ка ль­
ные значения. Мы м о ж е м
быть твердо уверены в т о м ,
что увлечения с некоторым
« c o n t a c t j d » принадлежат
со о т в ет ст в у ю щ ей записи
из таблицы «m y _co n tacts».

332 глава 7
м н о г о т а б л и ч н ы е базы данных

Связывание таблиц
У пе р во й версии связан ны х табл иц бы л о д и н серьезны й не­
д о ста то к: м ы п ы тал и сь испол ьзовать для связы ва н и я поля
f ir s t _ n a m e и la s t_ n a m e . А е с л и в т а б л и ц е m y _ c o n ta c ts
п о я в я тся за п и с и с о д и н а ко в ы м и зн а ч е н и я м и f ir s t_ n a m e
и la s t nam e?

Л таблица irfkresty.
кзж З а я запись
соЗержит;
|?rst_name - у двух лю дей зна -
La5t_name чения полей first_name
таблица rm_cxiritacts friterest
((fe, стоЛ(5ца irrto-ests) совпадают
>^0 их и нт ересы п е р е - ‘
‘кут аю т ся!

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


бец. К счастью , п о ско л ь ку м ы уж е занял ись норм а л и за ц и е й ,
в m y _ c o n ta c ts та ко й стол бец уж е им еется: это первичный
ключ.

М ы м ож ем хр а н и ть зн аче н и я п е р в и ч н о го кл ю ча и з таб л иц ы
m y _ c o n ta c ts в та б л иц е in t e r e s t s . И ч то ещ е л учш е, п о
э то м у сто л б ц у м о ж н о будет о п р е д е л и ть , ка ки е у в л е ч е н и я п р и ­
над л еж ат то м у и л и и н о м у чел овеку и з та б л и ц ы m y _ c o n ta c ts .
Т а ко й спо со б связы ван ия назы вается в н е ш н и м ключом.

Чтобы новая таблица coom-- ВНЕШНИМ КЛЮЧ


ветствовала п равилам ^Т^во

c o n ta c t id O “
нормальной ф ормы, каждой
записи назначается у никаль-
столбец таблицы,
la s t
f ir s t
nam e
nam e
первичного ключа в котором хранятся
phone
e m a il
inl*r*sls
in t id
значения ПЕРВИЧ­
gender
b irth d a y
in te re s t
НОГО КЛЮЧА
p ro fe s s io n c o n ta c t id
c ity
й и р т н и й кл к^ч
другой таблицы.
s ta te
о пределяет , какие
s ta tu s
увлечения п ри н а д л е­
s e e kin g
ж а т т ом у или и н о ­
му человеку из т а 5 -
лии,ы my_contacts■

о а льш е ► 333
знакомство с в н е ш н и м и к л ю ч а м и

Что ну)кно знать о Внешних ключах


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

Первичный ключ, используемый внешним ключом, также


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

Внешний ключ может использоваться для установления


соответствия между записями двух таблиц.

Внешний ключ может содержать значения NULL, хотя


в первичном ключе они запрещены.

Значения внешнего ключа не обязаны быть


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

Понимаю, внешний ключ


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

З н а ч е н и е N U L L во в н е ш н е м кл ю ч е
о зн ач ает, что в р о д и те л ь с к о й та б л и ц е
не с у щ е с тв у е т с о о тв е тс тв у ю щ е го
з н а ч е н и я п е р в и ч н о го кл ю ч а.
О д н а ко м ы м о ж е м сд елать т а к , ч т о б ы в н е ш н и й
кл ю ч пр и ни м а л то л ь ко осм ы сленны е зн ачени я,
сущ ествую щ ие в р о д и те л ь ско й табл ице. Д л я это ­
го следует в о сп о л ьзо ва ться ограничением.

334 глава 7
м н о г о т а б л и ч н ы е базы данных

Ограничение Внешнего ключа


Х о тя вы м о ж е те создать та б л и ц у со сто л б ц о м , к о т о р ы й
будет в ы п о л н я т ь ф у н к ц и и в н е ш н е го кл ю ч а , т а к о й с то л ­ Создание ВНЕШНЕГО
бец д ействител ьно станет вн еш ним кл ю чо м то л ько в том
сл уча е , е с л и в ы н а з н а ч и т е е го т а к о в ы м в ко м а н д е CREATE КЛЮЧА как ограни­
и л и ALTER. К л ю ч созд ается в с тр у кту р е , н а зы ва е м о й
ограничением. чения таблицы дает
э т о своего рода
О гр ан и че н ы . -
правило, которое должно в а м А
определенные преиму­
н я т ь с я та б л и ц е й -
щества.
При вставке внешний ключ будет принимать
только значения, существующие в первичном При попытке наруше­
ключе родительской таблицы. Это требование
называется ц е л о с т н о с т ь ю д а нны х. ния правила вы полу­
чите сообщение об
Исходная таблица m y contacts с т а -
обит ельско й т а олицсй, пот ом у ошибке; таким образом
част ь ее данных была п е р е м е -
в новую таблицу, называемую... предотвращаются слу­
my_cowta«t«
c o n ta c t id O — ...дочерней
чайные нарушения свя­
^ п\аЗлицей.
la st
f ir s t
nam e
nam e
зей между таблицами.
phone ii
e m a il in t id
gender
in te re s t Терм ин « ц ел о с т н о с т ь данных»
b ir th d a y
c o n ta c t id означаепл, что во внешнем ключе
p ro fe s s io n
дочерней таблицы м о г у т с о ­
c ity
храняться только т е значения
s ta te
которые уже су щ ест в у ю т
s ta tu s
о родит ельской таблице.
se e kin g

Внешний ключ должен быть связан с уникальным


значением из родительской таблицы.

Это значение может и не быть значением


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

да л ьш е * 335
зачем нужны вн е ш н и е к л ю ч и

Стоит ли Возиться е Внешними ключами?

-Г "
Итак, упростить получение информации об
увлечениях можно только одним способом: убрав
их из таблицы my_contacts. И Реджи нужно по­
добрать нормальную пару... Осталось понять, КАК
создать таблицу с внешним ключом.

Внешний ключ можно назначить


при создании таблицы.
В н е ш н и е кл ю ч и та кж е м о ж н о добавлять п р и
в ы п о л н е н и и ко м а н д ы ALTER TABLE. С и н т а к­
сис прост, но вы д о л ж н ы знать им я п е р в и ч ­
н о го кл ю ч а в р о д и те л ь с ко й табл ице, а та кж е
и м я р о д и т е л ь с к о й та б л и ц ы . Д а в а й т е созд а­
дим таблицу in t e r e s t s с вн еш ним кл ю чо м
c o n ta c t_ id из табл ицы т у c o n ta c ts .

Чаопо
----------------------- <аДаВаеМые -----------------------------------
БоГ1р)Сь1

Как написать запрос на выборку увлечений после того, как они будут из­
влечены из m y _ c o n ta c ts ?

J Этим мы займемся в следующей главе. И вы увидите, что написать запрос на


выборку данных из нескольких таблиц не так уж сложно. А пока необходимо изме­
нить структуру ту contacts, чтобы запросы были простыми и эффективными.

336 глава 7
м н о г о т а б л и ч н ы е базы данных

Соззаиие таблицы с Внешним ключом


Т е п е р ь в ы зн а е те , зачем с о зд а ю тс я в н е ш н и е к л ю ч и ,
и м ы м ож ем п е р ей ти непосредственно к способу и х
созд ания. О б р а ти те в н и м а н и е на им я, на зн а че н но е
Вклю чение команді?! P R IM A R Y
о г р а н и ч е н и ю ( C O N S T R A IN T ): п о н е м у м о ж н о л е г к о
K E Y 6 строку с определением —
о пред е л ить, и з ка ко й та б л и ц ы берется кл ю ч.
другой (более быстрый) способ
назначения первичного ключа.
CREATE TABLE i n t e r e s t s (
I
in t id IN T NOT NU LL AUTO INCREM ENT PRIM ARY K E Y ,
Ограничению присваивается имя,
i n t e r e s t VARCHAR( 5 0 ) NOT N U L L , по которому можно о п р е д е л и т ь ,
из какой таблицы взят ключ
(my_contacts), как он называется
- ^ c o n t a c t i d IN T NOT N U L L , (c o n t a c t jd ) и что ключ является
Внешний ____ внешним (fk.)-
клю ч созда- C O N STR AINT m y ~ c o i r t i c t s ^ c o n t a e t ^ i d ^ f i e Если позднее мы з а ­
ет ся т о ч - — — — — х о т и м и зм ен и т ь
но т ак же, свое р еш ен и е, то
как любой FO R E IG N KEY ( c o n t a c t ^ i d )
исп ользу ем эт о имя.
индексный Строго говоря, эта
столбец: REFERENCES m y _ c o n t a c t s ( c o n t a c t _ _ id ) ст рока не обяза­
с типом т ельна, но ее р е к о ­
данных IN T r мендует ся включать
и условием ) ...и как он на - в команду.
Указывает, из к а ­
М О Т NULL. зывался в этой
кой таблицы взят 13 скобках указывается
внеиАний ключ... таблице.
имя внешнего ключа. Вы
м о ж е т е назвать его так,
как со ч т ет е нужным.

А теперь попробуйте сами. Откройте окно консоли и введите приведенный


выше код создания таблицы in te re s ts .
ажнение
Когда таблица будет создана, просмотрите описание ее структуры. Какая новая
информация в описании сообщает о наличии офаничения?

да л ьш е ► 337
упражнение, реш е ни е

А теперь попробуйте сами. Откройте окно консоли и введите приведенный выше код
создания таблицы in te re s ts .
ажнение
Когда таблица будет создана, просмотрите описание ее структуры. Какая новая инфор­
мация в описании сообщает о наличии ограничения?
I File Edit Window Help

> DESC i n t e r e s t s ;

F ie ld I Typ e N u l l I Key 1 D e f a u l t I E x t r a
+ ------------------------ + ---------------------------+ ------------ + ---------- + ------------------ + --------------------------------- +
in t_ id I i n t (1 1 ) I NO I PRI I NULL I a u t o in c r e m e n t |
in te r e s t I v a r c h a r (5 0 ) | NO | I
c o n ta c t_ id I i n t (1 1 ) I NO | MUL |
+ ---------------------

« M U L » о з н а ч а е т , ч т о одно зн а че н и е м о ж е т х р а н и т ь с я в ст о л б ц е
0 нескольких экзем плярах. Э т о т ф а к т позволяет н ам х р а н и т ь несколь­
к о у в л е ч е н и й для к а ж д о г о зн а ч е н и я c o n t a c t j d из т а б л и ц ы m y _ c o n ta c ts .
Часто»
'^ а Д а Б а е М ы е
Б о Ц ЪС ь 1

Зачем столько хлопот с созданием всегда имела соответствующую запись А почему нельзя просто оставить
ограничения внешнего ключа? Разве в другой таблице). Если вы попытаетесь эти записи в таблице i n t e r e s t s ?
нельзя использовать ключ из другой удалить запись в таблице с первичным
таблицы в качестве внешнего ключа ключом или изменить значение первич­ ! Они снижают эффективность работы
без создания ограничения? ного ключа, задействованного в ограни­ сданными. Со временем такие записи
чении внешнего ключа другой таблицы, накапливаются, и обработка запросов
О Можно, но при создании ограниче­
ния в таблицу будут вставляться только
будет выдано сообщение об ошибке. замедляется из-за необходимости поиска
в бесполезной информации.
значения, уже существующие в родитель­
ской таблице. Ограничение гарантирует Выходит, что я никогда не смогу
корректность связи между таблицами. удалить из m y _ c o n t a c t s запись с Ладно, убедили. Какие еще бывают
первичным ключом, который при­ ограничения?
сутствует в таблице i n t e r e s t s в каче­
«Гарантирует корректность свя­ стве внешнего ключа?
' Вы уже видели ограничение первич­
зи»? Что это значит?
ного ключа. Ключевое слово UNIQUE
• Сможете, но сначала придется (при создании столбца) тоже считается
• Ограничение внешнего ключа обе­ удалить запись внешнего ключа. В кон­ ограничением. Таюке существует огра­
спечивает целостность данных (иначе це концов, если вы удаляете запись из
ничение CHECK, не поддерживаемое
говоря, оно следит за тем, чтобы запись my_contacts, знать увлечения этого в MySQL. В нем можно задать условие,
с внешним ключом в одной таблице человека вам уже не обязательно.
которое должно выполняться для вставки
значения в столбец. За дополнительной
информацией о CHECK обращайтесь
к документации своей РСУБД.

338 глава 7
м н о г о т а б л и ч н ы е базы данных

Связи ме)к у таблицами 9


И т а к , вы зн аете, к а к связать та б л и ц ы че р е з в н е ш н и й кл ю ч , н о м ы по-
п р е ж н е м у д о л ж н ы разобраться в сути связей м еж ду табл ицам и . В табл и­
це m y _ c o n ta c ts проблем а закл ю чается в то м , ч то многих людей нуж ­
н о связать с многими интересами.
Э то о д и н и з тр е х в о зм о ж н ы х т и п о в связей, ко то р ы е п о с то я н н о встр е­
ча ю тся п р и работе с д а н н ы м и : «один-к-одному», «один-ко-многим» и
«многие-ко-многим». К о гд а вы зн аете, к ка ко м у т и п у о тн о с я тс я ваш и
д а н н ы е , р а зр а б о тка с т р у кт у р ы и з н е с ко л ь ки х та б л и ц (т о е сть схемы)
ста н о в и тся д о с та то чн о п р о с ты м делом.

Типы связей: «один-к-одному»


Н а ч н е м с п е р в о го ти п а , «один-к-одному», и посм о­
тр и м , к а к о н пр и м е н я е тся на п р а кти ке . В связях
э т о го т и п а за п и с ь и з та б л и ц ы А м о ж е т б ы т ь связана
Таблица А Таблица В
Н Е Б О Л Е Е Ч Е М С О Д Н О Й з а п и с ь ю в т а б л и ц е В.

Д о п у с т и м , в та б л и ц е А х р а н и тс я ваш е и м я , а в та б л и ­
це В — и н ф о р м а ц и я о д о ход а х и н о м е р а с о ц и а л ь н о го
с т р а х о в а н и я ( т а к а я и зо л я ц и я п о в ы ш а е т б е з о п а с н о с т ь сВязыВается
д а н н ы х ).
РОВНО О Д Н А - С РОВНО одной
В обеих таблицах присутствует поле епр1оуее_±<1 U3 этих записей из этих записей
П о л е е тр 1 о уе е _ 1 с1 р о д и те л ь с ко й та б л и ц ы явл яется
п е р ви чны м кл ю чо м , а поле етр1оуее_1с1 дочерней
таб л иц ы — вн еш ним кл ю чом .

В с х е м е т а к а я с в я з ь о б о з н а ч а е т с я п р о ст о й с о е д и н и ­
тел ьной л и н и е й .

у каждого человека в таблице employees м о ж е т быть только


Один ном ер социального страхования, а каждый номер м о ж е т
принадлеж ат ь только одному человеку. Следовательно дан­
ная сЬязь от носит ся к т и п у « о д и н -к -о д н о м у »

•ni|iloyee_id
enployees
0~*1Г first_Bame iast_name
г
SSH С~яг
salary
salary_l*v«l • m p le y e e jd

1 Бейонс Ноулз 234567891 2 6


2 Шон Картер 345678912 5 35
3 Шакира Риполл Ч23456789 7 1

о 1ллпже связаны о т нош ением « о Э м н -к одном у», ^


т ш Так первичный ключ таблицы em ployee
в к а ч е с т в е внешнего, ключа таблицы .alary.

да л ьш е У 339
связи типа « о ди н -к-о дн о м у»

Когда используются таблицы со связями


типа «один-к-одному»
Выходит, все данные
со связями «один-к-одному»
следует выделять в новые
таблицы?

Вообще-то нет. Таблицы со связями «один-


к-одному» используются не так уж часто.
Е сть н е с ко л ь ко п р и ч и н для у ста н о в л е н и я связей
т и п а « о д и н -к -о д н о м у » м е ж д у т а б л и ц а м и .

Когда используются связи типа «один-к-одному»


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

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

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

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

4. Б о л ь ш и е б л о к и д а н н ы х (н а п р и м е р , т и п BLOB) т о ж е л у ч ш е
х р а н и ть в о тд е л ьной таблице.

<<Один-к-одному>>: ровно одна запись


родительской таблицы связывается
с одной записью дочерней таблицы.
340 глава 7
м н о г о т а б л и ч н ы е базы данных

Типы ебязей: «один-ко-многим»


В с в я з я х т и п а « о д и н -к о -м н о ги м » з а п и с ь в т а б л и ц е м о ­
ж е т б ы ть связана со м н о ги м и за п и ся м и в та б л иц е В, <<Один-ко-многим>>:
н о ка ж д а я за п и с ь в та б л и ц е В м о ж е т б ы т ь связана
т о л ь ко с о д н о й за п и сью в табл ице А . запись в таблице А
Одна запись в т а б ­ может быть связана
Таблица В лице А Может
бли1й А
-► быть связана со с МНОГИМИ запи­
МНОГИМИ зап и ­
■>
сями в таблице В, сями в таблице В,
но любая запись
сВязыВаетея в таблице В м о ­ но запись в табли­
ОДНА ----- С — многими ж е т быть связана
только с ОД^НОЙ це В может быть
из этих из этих зап и сью в т а б ­
записей записей лице А , связана только
о
С ОДНОЙ записью
Д а н н ы е о пр о ф е сси и в таб л иц е my c o n ta c ts
явл яю тся хо р о ш и м п р и м е р о м связей ти п а «один-
в таблице А.
к о -м н о г и м » . Ч е л о в е к в с е гд а и м е е т т о л ь к о о д н у
пр оф ессию , н о н е ско л ько человек и з таб л иц ы
p fto « « lo in
my c o n t a c t s м о гу т и м е ть о д и н а ко в ы е п р о ф е сси и .
p ro f id
В этом п р и м е р е м ы вы не сл и стол бец p r o fe s s io n p ro fe s s io n
c o n ta c t id
в н о в ую д о ч е р н ю ю та б л иц у и зам е ни л и стол бец
la s t nam e
p r o fe s s io n вн е ш н и м кл ю ч о м p r o f _ id . Д л я свя­
fir s t nanne
зы ва н и я та б л иц испо л ьзуе тся стол бец p r o f _ id ,
phone
п р и сутствую щ и й в о б еих таблицах.
ennail
С о е д и н и т е л ь н а я л и н и я п о м е ч е н а т р еу го л ьн о й gender
ст р ел к о й н а о д н о м и з к о н ц о в ; э т о о з н а ч а е т , ч т о b ir th d a y
о д н а за п и сь связы вается со м н о ги м и за писям и.

К аж д а я запись та б л и ц ы p r o f e s s io n s м о ж е т б ы ть c ity
связана со м н о ги м и за п и ся м и m y _ c o n ta c ts , но s ta te
каж дая за пи сь my c o n t a c t s в с е гд а с в я з а н а т о л ь к о s ta tu s
с о д н о й за пи сью в табл ице p r o fe s s io n s . se e kin g

Н априм ер, значение p r o f i d для пр о ф е сси и


« П р о гр а м м и с т» м о ж е т в с тр е ти ть с я в m y _ c o n ta c ts
н е с к о л ь к о раз, н о у к а ж д о го ч е л о в е ка в та б л и ц е
my c o n ta c ts м о ж е т б ы ть указан то л ь ко о д и н ко д другой
p r o f_ id .

да л ьш е ► 341
связи <шногие-:<о-многим»

Типы связей: «MH Ue-k -MH U№> 02 0 02


М н о г и е ж е н щ и н ы д е р ж а т в сво е м га р д е р о б е м н о г о
п а р о б уви . Е сл и м ы созд аем две т а б л и ц ы с и н ф о р м а ц и ­
блица А Таблица В
1
ей о ж е н щ и н а х и м а р ка х о б уви , т о м еж ду э т и м и двум я 4
т а б л и ц а м и буд е т с у щ е с тв о в а ть с в я зь т и п а « м н о ги е -ко -
м н о ги м » , п о то м у ч т о обувь н е к о т о р о го т и п а м о ж е т
п р и н а д л е ж а ть м н о ги м ж е н щ и н а м .
связываются
П ред полож им , К э р р и и М иранда куп и л и ш лепанцы MHOrUE ------ С - - - - - - - многими
и туф л и «П рада», у С а м а н ты и М и р а н д ы есть санд али и,
а у Ш а р л о т т ы е с ть вся эта о б увь. С в я зь м е ж д у та б л и ц а ­
из этих из этих
м и w om en и s h o e s будет в ы гл я д е ть т а к. записей записей

w o m a n _ id w om an shoe_id shoe_nam e
о—ж
1 Кэрри f % 1 Сандалии
2 Саманта 4 > 2 Сабо
3 Шарлотта 4 Ь 3 Шлепанцы
4 Миранда 4 4 4 Туфли «Прада»

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

w om an s h o e jd shoe^nam e
0—)г
1 Кэрри i ¥ 1 Сандалии
2 Саманта 4 # 2 Сабо
3 Шарлотта 4 і 3 Шлепанцы
4 Миранда 4 # 4 Туфли «Прада»

ÜiTVPM
Как изменить структуру таблиц без хранения нескольких значений в одном столбце
(чтобы не столкнуться с теми же проблемами, что и Грег в своих запросах для Реджи)?

342 -я'лавд /
м н о г о т а б л и ч н ы е базы данных

- ^ З о зь м и в руку карандаш
Взгляните на первую пару таблиц. Мы попытались ре­
шить проблему, включая столбец зЬое_1с1 в таблицу
с информацией о женщинах в качестве внешнего ключа.

w o m a n jd 0 ~ w «гв тяя s h o e jfl she«_M sho«_iiame


1 Кэрри 3 \ ^ 1 Сандалии
2 Саманта 1 / 2 Сабо
/ у > 3 Шлепанцы
3 Шарлотта 1 ^
4 Миранда 1 ■/ Туфли «Прада»
5 Кэрри 4 ^
6 Шарлотта 2 / /
7 Шарлотта 3 ____ таблицы связаны
8 Шарлотта 4 ^ через столдеи, « i h o e j d :
9 Миранда 3 //
10 Миранда 4 /

А теперь изобразите структуру таблиц, но на этот


раз включите столбец wom an_id в таблицу shoes
в качестве внешнего ключа.
Когда это будет сделано, нарисуйте связи между
таблицами.

да л ьш е У 343
возьми в руку карандаш, реш е ни е

Г ® карандаш
Решение Взгляните на первую пару таблиц. Мы попытались ре­
шить проблему, включая столбец з Ь о е _ 1 с 1 в таблицу
с информацией о женщинах в качестве внешнего ключа.

w o m a n jc l 0 —w «1Гвтап sh«e • h e e jd sho*_nam*


1 Кэрри 3 Г 1 Сандалии
2 Саманта 1 Z_____ 2______ Сабо
у Шлепанцы
3 Шарлотта 1 / / ; 3
4 1 / 4 Туфли «Прада»
Миранда 1
5 Кэрри 4
б Шарлотта 2 / ///
7 Шарлотта 3 / Л/ __ /хре тадлицы связаны
8 Шарлотта 4 / Ч через ст олбец sk o ejd .
9 ^ Миранда 3 / '
10 / Миранда,^- 4 /

О б р а т и т е внимание А теперь изобразите структуру таблиц, но на этот


на дубликаты в столбцах раз включите столбец w o m a n _ id в таблицу s h o e s
«w om an» и « 5(лое_^лте». в качестве внешнего ключа.

Когда это будет сделано, нарисуйте связи между


таблицами.

shoe_id 0 — W $Ьов_яат« w jtm a n jd woman_id wom an


1 \ Сандалии 1 Кэрри
3 'v
2 Саманта

// ^1
2 ^ Сабо
3 Шлепанцы ? 3 Шарлотта
4 Туфли «Прада» ^ 1 / / 4 Миранда
5 Сабо 3 /
6 Шлепанцы 3 /
7 Туфли «Прада» 3 /
8 Сандалии 4 /
9 Шлепанцы 4 /,
10 Туфли «Прада» 4 /

344 глава 7
м н о г о т а б л и ч н ы е базы данных

Нам ну)кна соединительная таблица


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

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


б о й э т и д ве та б л и ц ы и у п р о с т и т с в я зи « м н о ги е -ко -м н о ги м » д о « о д и н -
к о - м н о г и м » . В э т о й т а б л и ц е б у д у т х р а н и т ь с я в с е з н а ч е н и я w o m a n _ id
вм есте со з н а ч е н и я м и s h o e _ id . Н а м п о н а д о б и т с я с о е д и н и т е л ь н а я
та б л и ц а со зн а ч е н и я м и п е р в и ч н ы х кл ю ч е й двух связы ва е м ы х та бл иц.

Прямог связыбаныг э т и х двух таблиц


н еэф ф ект ивно, п от ом у что и з-за
связей « м н о г и е - к о - м н о г и м » в данных
появляется много дубликатов.

w om anjd О—тг woman shoe_idl C™sr вЬое_пате


1 Кэрри 1 Сандалии
2 Саманта «многие-ко-многим» 2 Сабо
3 Шарлотта 3 Шлепанцы
4 Миранда — _____ ^ 4 Туфли «Прада»

ЪеюеМ первичный' ключ - другой первичный /


из э т о м таблицы... этой...

_ и р а з м е щ а е м их в соедини-
Г т ельной таблице. «один-ко-многим»
«один-ко-многим» woman_id
1
shoo_id
3
г 1 4
в соединительной 2 1
плаЬлице хранятся 3 1
первичные ключи двух 3 2 <<Многие-ко-многам>>:
связываемых таблиц. 3 3

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

дальше ► 345
подробнее о связях « м н огие-ко-м ногим »

Типы связей: «многие-ко-ААНогим»


Т е п е р ь вам и зв е с те н гл а в н ы й с е к р е т с в я зе й «многие-ко-многим»: об ы чно они состоят
и з д ву х с в я зе й « о д и н -к о -м н о ги м », о б ъ е д и н е н н ы х п р и п о м о щ и со ед и н и т е л ь н о й т а б л и ц ы .
О Д И Н чел овек из таб л иц ы my c o n t a c t s связы вается со М Н О Г И М И увл е ч е н и я м и
и з н о в о й та б л иц ы in t e r e s t s . Н о та к ка к каж дое увл ечение м о ж е т пр ина д л е ж а ть не­
с ко л ь ки м л ю дям , та ка я связь о тн о с и тс я к т и п у «многие-ко-многим».

В с о о тв е тс тв и и с э т о й с хе м о й сто л б е ц i n t e r e s t s м о ж е т б ы ть п р е о б р а зо в а н в связь
« м н о ги е -ко -м н о ги м » . У к а ж д о го ч е л о в е ка м о ж е т б ы т ь н е с к о л ь к о у в л е ч е н и й , и ка ж д о е
увлечение м ож ет принадлеж ать нескол ьким лю дям:

М ежЭа э т и м « Эбамя т » « л и ч а м и
" с у щ ест в у е т сбяз» ^
n te re rts , « « р »
слАногие -КО -многим »-
му_€011 tacts contact^ interests
c o n ta c t id à. iiiteresl in te re s t id
la st nanne c o n ta c t id 4 in te re s t
f ir s t nanne in te re s t id
phone
erлail /
gender
о ди н-к о-м н о гим один -ко -м н о гим
b irth d a y
p ro fe s s io n
c ity Частро
s ta te — З а д а в а е м ы е ------------------
s ta tu s БоГ1р>с:ь1
s e e kin g
и какую пользу мне принесет А если я все равно не против
такое изменение? Я с таким же успе­ дубликатов?
Всегда ли следует создавать хом могу разместить все увлечения

соединительную таблицу в связях в таблице со столбцами сопЬасЬ_1<1 Связывание таблиц помогает обе­
типа «многие-ко-многим»? и 1 п Ъ е ге 8 Ъ _ п а те . Конечно, в ней спечить целостность данных. Например,
будут дубликаты, но в остальном — если вам потребуется удалить записи из
почему бы и нет?
Да, всегда. Связи «мноте-ко-многим» my_contacts, изменяется только табли­
между двумя таблицами приводят к воз­
никновению дубликатов, нарушающих
требования первой нормальной формы
О
• Вы поймете преимущества такой
структуры в следующей главе, когда мы
ца c o n ta c t_ in te re s t. Без отдельной
таблицы вы можете случайно удалить
лишние записи. Получается, что такая
(через пару страниц мы напомним, что начнем строить запросы к связанным структура безопаснее.
такое нормализация). таблицам с использованием соединений.
Кроме того, эти преимущества также Также упрощается обновление информа­
Не существует веских причин в пользу на­ могут зависеть от особенностей исполь­ ции. Допустим, выдопустили ошибку в
рушения первой нормальной формы, зато зования данных. Может оказаться так, что описании увлечения — например, написа­
доводов «против» предостаточно. Самый в таблице вас больше интересует именно ли «туризъм». Чтобы исправить ее, будет
серьезный из них — сложности с построе­ связь «многие-ко-многим», а не данные достаточно изменить всего одну запись
нием запросов при наличии дубликатов. в каждой из связываемых таблиц. в таблице in te re s ts , а содержимое
таблиц c o n ta c t_ in te re s t и ту_
contacts останется неизменным.

346 глава 7
м н о г о т а б л и ч н ы е базы данных

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


решите, какой тип связи лучше использовать для помеченного столбца —
«один-ко-многим» или «многие-ко-многим».
(Не забудьте, что при наличии связи «один-ко-многим» и «многие-ко-многим»
столбец выделяется из таблицы и связывается через идентификатор.)

doughnHt_rating

С]
rating

clown_tracking
с1о\л/п 1с1
activities
d ate

m y.conlacts
co n tact id
С Г s ta !r-f>

books
Ьоок id

fish records
record id

дал ьш е р 347
вы берит е т ип связи, ответ

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


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

do«ghiiat_ratlng
, ^ -tf^ g h n u t_ ty p ?
«один-ко-м ногим >

rating

clown_tracking
clown id
activities «м н о г и е -ко -м н о г и м »
date

my_contacts
contact id
C ^ ~ s ta T r~ D «один-ко - м н о г и м »
< d int^e^5>^ « м н о г и е -ко -мнрг и м »
вопрос с подвохом: у книги
можеп'\. бып^ь несколько лбпло-
books ров, поэт ом у связь относит ся
к т ипу « м н о г и е - к о - м н о г и м » .
book id
^----- ..1'!.многие-ко - м н о г и м »
(^ ^ th o rs ^
...... - к о - м н о г и м

fish ro co rd s

..... «один - к о - м н о г и м »

«один -ко - м н о г и м »

348 гл ава 7
м н о г о т а б л и ч н ы е базы данных

исправляем таблицу Грега Я понял, к чему вы клони­


те. Мм преобразуем базу данных
gгegsJist и таблицу my_contacts
в многотабличную форму, верно?

Почти. Теперь, когда вы разбираетесь


в типах связей, мы почти готовы
к переработке структуры g re g s _ lis t.
М ы знаем , ч т о сто л б е ц in t e r e s t s м о ж н о свя­
з а т ь с д р у г о й т а б л и ц е й с в я з ь ю т и п а « о д и н -ко -
м н о ги м » . С то л б е ц s e e k in g т о ж е н е о б х о д и м о
и с п р а в и ть а н а л о ги ч н ы м об р а зо м . П о сл е э т и х
и з м е н е н и й та б л и ц а будет с о о тв е тс тв о в а ть к р и ­
т е р и я м п е р в о й н о р м а л ь н о й ф о р м ы *.

Н о мы не м ож ем остановиться на первой
норм альной ф орм е — норм ал изацию необхо­
д им о п р о д о л ж и ть. Ч ем сильнее норм ализуется
таблица, тем пр ощ е п о л уч и ть и з нее д анны е
п о с р е д с т в о м за п р о с а (и л и с о е д и н е н и я — см . сле­
д у ю щ у ю гл а в у ). Н о п р е ж д е ч е м с о з д а в а т ь н о в у ю
схем у для базы д а н н ы х g r e g s _ lis t , м ы п о зн а ­
ко м и м с я с д р у ги м и у р о в н я м и н о р м а л и за ц и и .

my_conlacts

co n tact id О '"“ Я

last nam e

first nam e

phone

em ail

g en der

birthday * Вам захот елось вернуться на н е ­


profession сколько глав назад, чтобы вспом нит ь,
что такое первая нормальная ф орма?
city
Не нужно, мы напомним вам на сл ед у -
state нощей странице.
status

interests

seeking

да л ьш е > 349
приведение таблицы к 1НФ

Не 6 первой нормальной форме


М ы упом янули о первой норм альной ф орме. Д авай­
те ещ е раз в с п о м н и м , ч т о это та ко е , а п о то м п р о ­
долж им норм ал изацию до вто р о й и даже третьей
норм альной ф ормы .

И т а к, таблица, находящ аяся в п е р в о й но р м а л ь н о й


ф орм е, д ол ж на уд овл етворять следую щ им условиям .

Первая нормальная форма, или Ш Ф:


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

Не находится в 1НФ Все равно не находится в 1НФ


le y jd le y colors fo y jd l toy СОІОГІ СОІОГ2 СОІОГЗ
5 мяч белый, желтый синий 5 мяч белый желтый синий
б фрисби зеленый, желтый 6 фрисби зеленый желтый
9 воздушный красный,синий, 9 воздушный красный синий зеленый
змей зеленый змей
12 йо-йо белый, желтый 12 ио-ио белый желтый

У
Что5ы ст олбец «co lo rs»
дыл ат о м а рн ы м , он должен
содерж ат ь только один Эта таблица все ещ е не 1НФ,
из э т и х цветов, а не z или пот ом у что столбцы все еьце
3 о одной записи. содерж ат т е же т ипы дан­
ных, все VARCHAR с цвет ами
игрушек.

350 глава 7
м н о г о т а б л и ч н ы е базы данных

Наконец-то — 1НФ...
Д а в а й т е п о с м о т р и м , ч т о зд есь н у ж н о сделать.

В1НФ

nep6wHHK>iC( Внешний ключ.

lo y jd toy color

мяч 5 белый
фрисби 5 желтый Каждая запись
воздушный змей 5 синий
^ '" '7 ^ то л ь ко
12 йо-йо б зеленый °дин цвет, и все
б желтый ^^>^иси уникальны
9 красный
9 синий
9 зеленый
12 белый
U pt <--;;tAAeAl3H0- 12 желтый
це 0^яза1'
уже

Г
В м е с т с значения столбцов
t o y j d » и « c o lo r » образиют
IZ7.
С тол бец t o y _ id в отд е л ьно й табл ице в качестве
в н е ш н е го кл ю ч а — это н о р м а л ь н о , п о то м у ч т о
хр а н и м ы е в нем зн аче ни я не обязаны б ы ть у н и ­
ка л ьн ы м и . П р и д обавл ении в эту табл ицу значе­
н и й c o lo r все за п и с и у н и ка л ь н ы , потом у что
ц в е т в С О Ч Е Т А Н И И с t o y _ i d о б р а з у е т зшмкоуит-
ну ю к о м б и н а ц и ю . Первичный ключ из не­
скольких столбцов? Но разве
первичный ключ не должен быть
только одним столбцом?

Нет. Ключ, состоящий из двух


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

да л ьш е * 351
подробнее о с о с т а в н ы х кл ю ча х

Соетабиые ключи состоят из нескольких столбцов


Д о настоящего момента мы рассматривали связи данных
таблицы с другими таблицами («один-к-одному», «один-ко-
многим»), Однако пока ничего не было сказано о том, как
столбцы таблицы связываются друг с другом. А без это­
Д л я использования со е д и ­
го понять суть второй и третьей нормальных форм невоз-
нений ( к о т о р ы м и м ы
можно. Н о зато потом намного упростится создание схем ^ з а й м е м с я в следцю и лей
базI данных с запросами
данных к нескольким таблицам.
с запросами . г д
главе) таблицы должны
И так, что же такое «составной ключ»? и м е т ь хорошо Спроек­
тированную ст рукт уру!

СОСТАВНЫМ КЛЮЧОМ называется


ПЕРВИЧНЫЙ КЛЮЧ, состоящий из
нескольких столбцов, комбинация ко­ 0 + 1Г
торых образует уникальные значения.
Возьмем следующую таблицу с информацией о супергероях.
Таблица не имеет уникального ключа, но мы можем создать
составной первичны й клю ч из столбцов па те и pow er. Хотя
в каждом из этих столбцов могут встречаться повторяющ ие­
ся значения, их комбинация всегда уникальна.

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


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

наш * po w er w o akn o M
Супер-Мусорщик Моментально убирает мусор отбеливатель
Брокер Делает деньги из ничего NULL
Супер-Парень Летает птицы
Чудо-Официант Никогда не забывает заказы насекомые
Грязнуля Создает пыльные бури отбеливатель
Супер-Парень Обладает суперсилой другие супермачо
Злая Тетка Бывает очень, очень злой NULL
Жаба Язык справедливости насекомые
Библиотекарь Найдет все NULL
Гусыня Летает NULL
Нарисованный Изображает людей игра «Виселица»
Человечек

352 глава 7
м н о г о т а б л и ч н ы е базы данных

Дд)ке супергерои от чего-нибудь зависят


у н а ш и х с у п е р ге р о е в м н о го р а б о ты ! П е р е д ва м и о б ­
но вл е нн а я табл ица s u p e r_ h e ro e s . О н а со о тве тствуе т Если изменение содержи­
т р е б о в а н и я м Ш Ф , н о т у т в о з н и к а е т д р у га я п р о б л е м а .

С толбец i n i t i a l s с о д е р ж и т со кр а щ е н и е , то есть на­


мого одного столбца долж­
чал ьны е б укв ы зн а ч е н и я сто л б ц а nam e. А ч то п р о и з о й ­
дет, е с л и с у п е р ге р о й в д р у г з а х о ч е т с м е н и т ь им я?
но приводить к изменению
Т о чн о , со д ер ж и м о е стол бца i n i t i a l s тож е долж но другого, говорят, что вто­
и зм е н и ть с я . Говорят, ч т о сто л б е ц i n i t i a l s функцио­
нально зависим о т сто л б ц а nam e. рой столбец функционально
э^и т и м ени совпадают, н» в с о ч е т а й ^
со значением стол1иа « p o w e r » создается зависим от первого.
у н и ка л е н и й составной пер би чн ии ключ.
super_heroes
I
Item « 0 + i r p o w e r 0+ я* w oaknoss c it y со м п1гу n rc h ^ o n o m y i n it ia l s
Супер-Мусорщик Моментально убирает мусор отбеливатель Готэм США Неряха СМ
Брокер Делает деньги из ничего NULL Нью-Йорк США Налоговый Инспектор БР
^ Супер-Парень Летает птицы Метрополис США Супер-Зануда СП
Чудо-Официант Никогда не забывает заказы насекомые Париж Франция Обжора 40

V Грязнуля
^ Супер-Парень
Создает пыльные бури
Обладает суперсилой
отбеливатель
алюминии
Тулза
Метрополис
США
США
Гувер
Плохиш
ГР
СП
Злая Тетка Бывает очень, очень злой NULL Рим Италия Психоаналитик зт
Жаба Язык справедливости насекомые Лондон Англия Цапля ЖА
Библиотекарь Найдет все дети Спрингфилд США Хаос БИ
Гусыня Летает NULL Миннеаполис США Охотник ГУ
Нарисованный Изображает людей игра «Висе­ Лондон Англия Ластик НЧ
Человечек лица»

Итак, в таблице супергероев столбец i n i t i a l s зависим от столб­


ца n a m e . А вы видите еще какие-нибудь похожие зависимости?
Запишите их здесь.

а а льш е ► 353
возьми в руку карандаш, реш ение

Возьми в руку карандаш


Решениг Итак, в таблице супергероев столбец i n i t i a l s зависим от столб­
ца п а ш е . А вы видите еще какие-нибудь похожие зависимости?
Запишите их здесь.

initials зависит от п а т е Из этой записи не яcнo^ в какой


таблице находятся столбцы; это
weakness зависит о т п а т е ^ м о ж е т быть сущ ественно при до­
бавлении новых таблиц. Суицествует
агск_епет у зависит от п а т е специальный сокращенный синтаксис
для обозначения э т и х зависим ост ей
city зависит от country и maблuцJ в которых они находятся.

Сокращенная запись UP базам данных


Д л я ко м п а ктн о го о п и са н и я ф ун кц и о н а л ьн ы х зави си м о сте й часто испол ьзу­
ется следую щ ая запись:

Т . х —> Т . у
Э т о м о ж н о п р о ч и т а т ь т а к : «В т а б л и ц е с и м е н е м Т с т о л б е ц у ф у н к ц и о н а л ь н о
з а в и с и т о т с то л б ц а х». З а в и с и м ы й с то л б е ц у ка зы в а е тс я в п р а в о й ч а с ти .

П р и м е н и т е л ь н о к н а ш и м с у п е р ге р о я м э т о в ы гл я д и т та к:

s u p e r _ h e r o e s . nam e —> s u p e r _ h e r o e s . i n i t i a l s
«в т а б л и ц е s u p e r_ h e ro e s стол бец i n i t i a l s ф ун кц и о на л ьно зави сит

о т стол бца п а те » .

s u p e r _ h e r o e s . nam e —> s u p e r _ h e r o e s . w e a k n e s s
«в т а б л и ц е super h e ro e s стол бец w e a k n e s s ф ун кц и о н а л ьн о за ви си т
о т ст о л б ц а п а т е » .

s u p e r _ h e r o e s . nam e —> s u p e r _ h e r o e s . arch_^en<


«в т а б л и ц е super h e ro e s стол бец a rc h enem y ф ун кц ионал ьно зависит
о т стол бца п а те » .

s u p e r _ h e r o e s . c o u n t r y —> s u p e r _ h e r o e s . c i t y
«в т а б л и ц е super h e ro e s стол бец c i t y ф ун кц и о н а л ьн о зави сит
о т сто л бца c o u n tr y » .

354 глава 7
м н о г о т а б л и ч н ы е базы данных

Супергеройские зависимости
И т а к , есл и наш с у п е р ге р о й п о м е н я е т и м я , сто л б е ц
in itia ls то ж е д о л ж е н и зм е н и ть ся ; это означает, ч т о
стол бец зависит о т сто л бца nam e.

Е сл и за кл я т ы й в р а г с у п е р ге р о я р е ш и т п е р е е ха ть
в д р у го й го р о д , т о и зм е н и тс я е го те кущ е е м е сто ­
на хо ж д е н и е — и то л ь ко . Т а ки м образом , стол бец
a rc h enem y c i t y в п р и в е д е н н о й н и ж е таблице
абсол ю тно независим. ддениі^^-

Зависимым назы вается сто л б е ц с д а н н ы м и , ко то р ы е


м о гу т и зм е н и ть с я в случае и зм е н е н и я д р у го го сто л б ­
ца. Независимые с т о л б ц ы су щ ест в у ю т с а м и п о себ е.

Частичные функциональные зависимости


Частичная функциональная зависимость означает,
ч т о н е -кл ю ч е в о й с то л б е ц з а в и с и т о т н е к о т о р ы х , н о не Тем в р е м е н е м Л а с т м к
о т всех сто л б ц о в с о с та в н о го п е р в и ч н о го кл ю ч а .
^ е р е г к а л в новый г о р о д ,
но на д р у ги е ст ол Ь ц ы
R наш ей табл ице стол бец i n i t i a l s ч а ст и ч гю н е з а ­ э т о н и как не повлияло.
висим о т nam e, п о т о м у ч т о в сл учае и з м е н е н и я и м е н и
с у п е р ге р о я сто л б е ц i n i t i a i l s то ж е изм енится,
а в с л у ч а е и з м е н е н и я p o w e r (и о н е n a m e !) с т о л б е ц
in itia ls останется неизм енны м .
Сокращение злвис'лм сил
илАени, но не о т с и п е р -
сп особн ост еМ , п о э т о м у
Столбцы ^
э т а т аблица содер ж и т
« p o w e r » вм ест е ч а с т и ч н у ю функцио--
н а л ь н у ю з а в и с uAU^ciVib.

пат& ’<’ !Г р о « г& Н * г weakness сйу initials arch_enemy_id агс1|_епету_с11у


Супер- Мусорщик Моментально убирает мусор отбеливатель Готэм ST 4 Готэм
Брокер Делает деньги из ничего NULL Нью-Йорк ТВ 8 Ньюарк
Супер-Парень Летает птицы Метрополис SG 5 Метрополис
Чудо-Официант Никогда не забывает заказы насекомые Париж WW 1 Париж
Грязнуля Создает пыльные бури отбеливатель Тулза D 2 Канзас-Сити
Супер-Парень Обладает суперсилой алюминий Метрополис SG 7 Готэм
Злая Тетка Бывает очень, очень злой NULL Рим FW 10 Рим
Жаба Язык справедливости насекомые Лондон Т 16 Бат
Библиотекарь Найдет все дети Спрингфилд L 3 Луисвиль
Гусыня Летает NULL Миннеаполис GG 9 Миннеаполис
Нарисованный Изображает людей игра Лондон S 33 Бородейл
Человечек «Виселица»

да л ьш е ► 355
т ранзит ивны е ф ункциональны е ; л в / г : ^ о лгг/

Транзитивные функциональные зависимости


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

Значение «а гск^епет у_[и» не изменилось,


хотя Неряха и пер ееха л в К а н за с-С и т и .

^с к_ е п е ш у З > 1 ч ^ r c h _ e n e m y j^ y
n a m e ©+»■
Супер-М усорщик 4 4 ^ \^ К а н за с -С и ти У Если изменение не-клю-
Брокер ^
Супер-Парень 5 Метрополис чевого столбца может
Чудо-Официант 1 Париж
Грязнуля 2 Канзас-Сити привести к изменению
других столбцов, значит,
Предположим, супергерой захотел поменять
себе заклятого врага. Значение а г с Ь _ е п е т у _ 1 с1 существует транзитивная
при этом изменится, а это м ож ет привести к из­
менению a r c h _ e n e m y _ c itY . зависимость.
Если изменение не-ключевого столбца приводит
к изменению других столбцов, значит, существу­
ет транзитивная зависимость.
Е сли обновление « a r c k ^ e n e m u j d :
п р и в о д и т к и зм е н е н и ю значения
о с т о л б ц е » a r c h .^ е п е т у ^ а Ь у » .

n a m e ОЦ'рг ^ м к _ е п е т у ^ ^ М ^ " a r c h _ e n e m y j^ y У
Супер-М усорщик Канзас-ХА4«/
Брокер 8 Ньюарк
Супер-Парень 5 Метрополис
Чудо-Официант 1 Париж
п от ом у что не-ключевой с т о л -
Грязнуля 2 Канзас-Сити
столбцом « a r c k _ ,e n e m y J d » . к о т о ­
рый т акже является не-ключевым.

Транзитивная функциональная зави­


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

в следующей таблице хранится информация о книгах. Столбец риЬ_1(1 определяет


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

a u th e r 0 +JT t i l l e 0+ W c o p y r ig lit p u b jd pul>_city


Д ж он Дир В мире с природой 1930 2 Н ью -Йорк
Ф ред Мерц яненавижу Люси 1968 5 Бостон
Лесси Помогите Тимми! 1950 3 Сан-Франциско
Тимми Лесси, успокойся 1951 1 Н ью -Йорк

Напишите, что произойдет со значением столбца copyright, если столбец title в третьей
записи примет значение «Вытащите Тимми из колодца!».
« c o p y r ig h t »
При изменении названия и зм ен ит ся и зна ч е- заоисит от «title.>>
нйё '«co py righ t». ............................................................. по'э'тдмуего значе -
ние изменится.

Что произойдет со значением столцба copyright, если автор книги в третьей записи
изменится, а название останется прежним?

Что произойдет с записью «В мире с природой», если ее полю риЬ_1(1 будет присвоено
значение 1?

Что произойдет со значением риЬ_1с1 записи «Я ненавижу Люси», если издатель пере­
местится в другой город?

Что произойдет со значением риЬ_с11 у записи «Я ненавижу Люси», если ее полю риЬ_1(1
будет присвоено значение 1?

да л ьш е ► 357
упражнение, от вет

в следующей таблице хранится информация о книгах. Столбец pub id определяет


издателя, а столбец pub city — город, в котором была опубликована книга.
ажнение
реш ен и е Напишите, что произойдет со значением столбца copyright, если столбец title в третьей
записи примет значение «Вытащите Тимми из колодца!». Столбец « c o p y rig h t» зави -
При изменении названия и зм ен ит ся с и т от « tit le » , поэт ам и
....................................... им енит ая.
Что произойдет со значением столцба copyright, если автор книги в третьей записи
изменится, а название останется прежним?
При изменении автора, но не названия изм ен ит ся и значение
Л.втс
........................................................1
р а з у ю т с о ст а в ­ Copyright» зависит
ной первичный от названия и от
Ключ автора.

author O'1'R’ |1Но 0+!Г copyright І^ігії.М |иЛ-«*ИГ


Д ж он Д ир в мире с природой 1930 2 Н ью -Й орк
Ф ред Мерц я ненавижу Люси 1968 5 Бостон
Лесси Помогите Тимми! 1950 3 Сан-Ф ранциско
Тимми Лесси, успокойся 1951 1 Н ью -Й орк

Что произойдет с записью «В мире с природой», если ее полю pub id будет присвоено
значение!? ^ ^ « p u h _ c j t y » для « p u b J d 1 » и « p u h j d Z » —
«p uh _city» не изменит ся. Н ь ю -Й о р к , поэт о м у город не меняет ся
p ub id не з а в и - ................................................... (даже когда «pub_city» зависит от «p ub_id»)
си т от с т о л б ­
ца pub city произойдет со значением pub id записи «Я ненавижу Лкюи», если издатель пере-
U поэт ом у местится в другой город?
оста&тся.„^_^^^'^Р'^^-'‘^^^ ост а ет ся т е м же.
т е м же.

Что произойдет со значением pub city записи «Я ненавижу Люси», если ее полю pub id
убудет присвоено значение 1? ^ ^ « p u b ^ c it y » зависит о т зна
jub_city» т р а н з и - «p ub_city» ст ановит ся Н ью -Й орк. / ^ и е н и я в ст олбце « p u b j d »
\ивно зависит о т ..............................................................................транзитивная функцио-
ü u b j d » , поэт ому /'■^?<^нлльнйя зависимость.
члчение меняется. к-
author О+я- |1Ио О*«*«- copyright Р ^ .М |н»Ь_«Ну
Д ж он Дир В мире с природой 1930 2 Н ью -Йорк
Ф ред Мерц яненавижу Люси 1968 5 Бостон
Лесси Помогите Тимми! 1950 3 С ан-Ф ранциско
Тимми Лесси, успокойся 1951 1 Н ью -Йорк

358 ■глава 7
м н о г о т а б л и ч н ы е базы данны х
Частно
^аД аБаеМ ы е
БоПрїСГьі

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

Использование столбца-идентификатора, как в таблице столбец-идентификатор?

m y _ c o n ta c ts , полностью решает все проблемы. Так как


этот столбец представляет собой новый ключ, который со­ • Безусловно, это решает проблему. Однако попробуйте
здается только для индексирования этой таблицы, никакие провести поиск в Интернете по условию «синтетические или
другие столбцы от него не зависят естественные ключи» — вы найдете убедительные аргумен­
ты в пользу обоих решений, а также немало горячих споров.
Лучше, если вы примете решение самостоятельно. В этой
книге в основном используется решение с синтетическим
ключом, чтобы вы смогли понять суть концепции, не отвле­
каясь на тонкости реализации.

Зависимости — это, конечно, хорошо.


Но какое отношение они имеют к переходу
от первой нормальной формы ко второй?

Включение столбцов первичных ключей


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

дги:ьше 359
преобразование таблиц в 2НФ

Вторая нормальная форма


Как покажут следующие две таблицы, используе­
мые в системе складского учета магазинов игрушек,
требования второй нормальной формы относятся
к отношениям между первичным ключом таблицы
и хранящимися в ней данными.
*вУ_І€І toy
5 мяч
6 фрисби
9 воздушный змей
Сосіллавной ключ. 12 йо-йо

--------- - \
toy.id •1оге_ со1ог inventory store.oddress
0+я- Столбец содерж ит
id 0 + »
1 34
много дубликатов,
5 белый 23 Мейпл
5 3 желтый 12
п ри ч ем эти дубли­
100 Норт-стрит
1 синий 5
каты не содерж ат
5 23 Мейпл
6 2 зеленый 10
полезной и н ф о р ­
1902 Эмберлайн
4 желтый 24
мации об и г р у ш ­
6 17 Инглсайд
50
ках: они относятся
9 1 красный 23 Мейпл
9 2 синий 2 1902 Эмберлайн
к магазину.
9 2 зеленый 18 1902 Эмберлайн
12 4 белый 28 17 Инглсайд
12 4 желтый 11 17 Инглсайд

/ Количество единиц товара


Над э т и м столбцом т оже с т о и т х о ­
зависит от обоих с т о л б ­
рошенько подумат ь. Эти данные ск о ­
цов, образующих составной
р е е должны хранит ься в таблице и г р у ­
первичный ключ, поэт ому
шек, а не в складских данных. Столбец
частичная функциональная
«toyjcL» должен идент иф ицироват ь
зависим ост ь о т су т ст в у ет .
как т и п , ТАК- И цвет игрушки.

Обратите внимание на дублирование s t o r e a d d r e s s


для игрушек, связанных с идентификатором магазина
s t o r e id . Если нам вдруг понадобится изменить адрес
магазина, придется изменять каждую запись таблицы,
в которой он присутствует. Чем больше записей обнов­
ляется с течением времени, тем выше вероятность того,
что в данных появятся случайные ошибки.

С другой стороны, если выделить столбец s t o r e _


a d d r e s s в отдельную таблицу, то адрес будет достаточ­
но изменить только в одном месте.

360 глава 7
миогстэ.б л и н н ы е базы данны х

Возмо)кно, таблица у)ке находится 6 2 Н Ф ...


Таблица 1НФ также находится в 2НФ, если все столб­
цы таблицы являю тся частью первичного ключа. Таблица 1НФ находится
Мы можем создать новую таблицу с составным первич­ в 2НФ, если все столбцы
ным ключом из столбцов t o y _ i d и s t o r e id . Тогда таблицы являются частью
в одной таблице будет храниться вся информация об первичного ключа
игрушках, в другой — вся информация о магазинах,
а новая таблица будет связывать эти две таблицы. ИЛИ
она имеет одностолбцо­
вый первичный ключ.

Вся информация о них. lo y_sto re


г ————————————л
I Игрушки toy_id
Вся информация о них.
store id
Магазины
Таблица 1НФ также находится в 2НФ, если она
имеет одностолбцовый первичный ключ.
И это хорошая причина для создания столбца-
идентификатора с условием AUTO_INCREMENT.

Вторая нормальная форма, или 2НФ:


Правило 1. Таблица находится в ШФ.
Правило 2. Таблица не имеет частичных функцио­
нальных зависимостей.
Вряд ли в my_contacts есть
частичные функциональные
зависимости, хотя...

Значит, пора поиграть...

а :іп ь ш е ^ 361
ст аньт е т аб л иц ей 2НФ

^ ш ан ьш е таб л и ц ей 2 С Ч асш и Ч н ы М и

^ =*ункЦионаЛьНь1Ми ЗаБисиМоспряМи
IJj’ eAcmaDbine cc^ff на М есте гпаёлиНы

U ucKJIioMume из се^и Бес ЧасшиЧ— Э т и два


столбца fo yjn ven lo rÿ
Ные 'рункниональныс Зависи­
образуют ( toy_id
мости. Ç каждой из iij^eAcmaB- уникальный ^ "( store id
ленных m aëjiuU Bbi4ej>KHume m e составной
первичный
с т о л б ц ы , Komof*bie лучше nej’eMecmumb
ключ.
в ощдеЛьну1о таблицу.

ceekie sales
am ount
singers g ir li d
s in g e rid date
last пагле girl_nam e
first name troop_leader
agency total sales
agency _state mevies
movie id
title
genre
salary
r e n te d b y
ernployee_id
due date
last name
rating
first name

salary
manager dog_breeds
e m p lo y e e e m a il breed
hire date description

avg_w eight
avg_height
club id

club state

362 глава 7
м н о г о т а б л и ч н ы е базы данны х

- ^Возьми в руку карандаш


Преобразуйте эти таблицы в три таблицы, соответствующие требованиям 2НФ.

Одна таблица должна содержать информацию об игрушках, другая — о ма­


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

Добавьте в соответствующие таблицы столбцы p h o n e , m a n a g e r, c o s t


и w e ig h t . Возможно, вам придется создать новые значения t o y i d .

l e y id c o lo r In v e n t o r y s to re _ a d d re s s
5 мяч
0+>r Id 0 + i r
6 фрисби
5 1 белый 34 23 Мейпл
9 воздуш­
5 3 желтый 12 100 Норт-стрит
ный змей
5 1 синий 5 23 Мейпл
12 йо-йо
б 2 зеленый 10 1902 Эмберлайн
6 4 желтый 24 17 Инглсайд
9 1 красный 50 23 Мейпл
9 2 синий 2 1902 Эмберлайн
9 2 зеленый 18 1902 Эмберлайн
12 4 белый 28 17 Инглсайд
12 4 желтый 11 17 Инглсайд

да л ьш е * 363
станьте таблицей 2нф. от вет

^ щ а н ь ш е т а б л и ц е й 2 1 1 ^ ^ ^ Ч асзп и Ч н ьхМ и

=^»ункЦионаЛьНьШи ЗаБисдШоспшМи. QmBem


| ] | ’еДстаБы пе себя на М есте та б Л и Д ы

и искЩ оЧ ите из себя Все ч а с т и ч ­ Эти два


ст олбц а lo yJavM flo ry
ные ‘функциональные зависи­
образую т \ v to y_id
м о с ти . ^ к а ж д о й из ^^^‘е Д с т а Б - уникалш ш store id
Ленных т а б л и ц ВыЧер'Кншпе т е сост авной
первичный
сто л бц ы , котор*ы е лучше п е]=ем естить
ключ.
в ощдеЛьну1о таблиЩ ).

Первичный ключ. ceeki*_sal«s


Хот я з д е с ь с л е ­
довало бы р а з ­ am ount
singers м ест и т ь иден­ После исключения эт их
girl_id
т и ф и к а т о р из столбцов ocmaвшuecJl
singer_id date
т аблицы agency ^ образуют составной
last_nam e gtffrfwœe-
(два а г е н т с т в а первичный ключ.
first_nam e tf œ p _ loador
м огут
agency одинаковые н а з в а - teterKsateS"
agency _state - ' н и я ) , частичной mevies
ф ункциональной Первичный movie id
за ви си м ост и нет- ключ.
title
Эти столбцы genre
Первичный salary связаны толька
ключ. rented_by
^ em ployee_id транзитивной
last_nam e функциональной due date

Э т и м дан­ за в и с и м о с т ью .' rating


first name
ным здесь
salary
не м е с т о , deg_breeds
manager
но частичной С оставной п е р ­
breed
функциональ­ em ployee_email вичный ключ.
ной зав иси ­ description
hire_date
м о ст и нет. avg_w eight Столбец «с1иЬ_1с1» м о ж е т н а ­
avg_height ходиться в этой таблице (если
club_id это связь «о д и н -к -о д н о м у » ),
р- столбцу «c^ub_state» здесь явно
- н е м ест о . Но несм от ря на это,
среди столбцов нет частичных
функциональных зависимостей.

364 глава 7
^1 Ноготабпичные базы данны х

- ^Возьми в руку карондаш


"■2Ш 0Н И 0 Преобразуйте эти таблицы в три таблицы, соответствующие требованиям 2НФ.

Одна таблица должна содержать информацию об игрушках, другая — о ма­


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

Добавьте в соответствующие таблицы столбцы p h o n e , m a n a g e r, c o s t


и w e ig h t . Возможно, вам придется создать новые значения t o y _ i d .

toy id atore_ color storo.addroas


t * y jd toy 0 +"» id 0+ir
5 мяч 5 1 белый 34 23 Мейпл
6 фрисби 5 3 желтый 12 100 Норт-стрит
9 воздушный 5 1 синий 5 23 Мейпл
змей 6 2 зеленый 10 1902 Эмберлайн
12 йо-йо 6 4 желтый 24 17 Инглсайд
9 1 красный 50 23 Мейпл
9 2 синий 2 1902 Эмберлайн
9 2 зеленый 18 1902 Эмберлайн
12 4 белый 28 17 Инглсайд
12 4 желтый 11 17 Инглсайд

S t o r e _ in v e n to r y
Сост авной первичны й
toy id store inventory
ключ со ст о и т 0+V id 0 + w
из ст олбцов « t o y j d » 5 1 34
и « sto rejd » . 5 3 12
t o y _ in f o 5 1 5
6 2 10
to y jd toy со1ог cost weight 6 4 24
0 -^
9 1 50
1 мяч белый 1.95 0.3
9 2 2
2 мяч желтый 2.20 0,4
9 2 18
3 мяч синий 1.95 0.3
12 4 28
4 фрисби зеленый 3.50 0,5
12 4 11
5 фрисби желтый 1.50 0,2
6 воздушный красный 5.75 1,2
змей
s to r e in fo
7 воздушный синий 5.75 1.2
змей store_ address phone manager
8 воздушный зеленый 3.15 0.8 id O—w
змей 1 23 Мейпл 555-6712 Джо
9 йо-йо белый 4.25 0,4 2 1902 Эмберлайн 555-3478 Сьюзен
10 йо-йо желтый 1.50 0.2 3 100 Норт-стрит 555-0987 Тара
4 17 Инглсайд 555-6554 Гордон

да л ьш е у 365
переход к ЗНФ

Третья нормальная форма (наконец-то!)


Так как в книге мы по возможности добавляем «син­
тетические» первичные ключи, с переводом таблиц Если таблица имеет син­
во вторую нормальную форму обычно проблем не
бывает. Любая таблица с синтетическим первич­ тетический первичный
ным ключом, не имеющая составного первичного
ключа, всегда находится в 2НФ. ключ и не имеет составно­
Как убедиться, что мы в ЗНФ?
го первичного ключа, она
находится в 2НФ.
Третья нормальная форма, или ЗНФ: Вицг ие забыли? Т р а н з и ­
тивная ф у н к ц и о н а л ь н а я
Правило 1. Таблица находится в 2НФ. зависим ост ь ознаийет
наличие связей между не
Правило 2. Таблица не имеет транзи- ^ ключевыми столдцами.

Если изменение какого-


тивных зависимостей. либо не-ключевого
столбца м о ж е т п р и в е ­
ст и к и зм енению д р у ­
Что произойдет при изменении значения какого- гих сглолбцов, и м е е т
либо из грех столбцов; cou rse_nam e (название м е ст о транзитивная
учебного курса), i n s t r u c t o r (преподаватель) зависимость.
и in s tr u c to r _ p h o n e (телефон преподавателя).

При р а с с м о ­ courses
т рении з Н ф
И рл изм ен ен ии c o u r s e _ n a m e c o u rs e id
на первичный
пи i n s t r u c t o r , ИИ i n s t r u c t o r _
ключ можно c o u rs e nam e
p hone не и зм ен яю тся.
не обращать
внимания. in s tru c to r
■=> П ри и зм ен ен ии i n s t r u c t o r _ p h o n e
in s tr u c to r _ p h o n e
ни i n s t r u c L o r , ни co u rse _ n a m e

ПС изм еняю тся.

■=> При изменении значение


i n s t r u c t o r Чтобы таблица с о о т в е т -
изменится. Мы об­
in s t r u c t o r _ p h o n e ' ствовала требованиям зН Ф ,
наружили транзитивную зависимость. " из нее необходимо убрать
ст олбец «in stru cto rjp h o n e» .

366 :лавн 7
м н о г о т а б л и ч н ы в базы данны х

Ч то joAsmb е таблицей my.contaets?


ажнение
В нее необходимо внести несколько изменений. Начните с текущей версии таблицы
my contacts И изобразите новую схему gregs_list. Обозначьте связи между внеш­
ними ключами линиями, а связи типа «один-ко-многим» — стрелками. Также обозначьте
первичные и составные ключи.

contact id
last name
first name
phone
email
gender
birthday
profession
city
state
status
interests
seeking

П о д с к а зк а . И а м а берсмя

Эля почтового индекса:


а до этого было 7.)

да л ьш е * 367
упражнение, реш ение

Ч т о делать с таблицей m y^contacts?


^ п /пражнение
раж ж
в нее необходимо внести несколько изменений. Начните с текущей версии таблицы
'О ш ейке
my contacts и изобразите новую схему gregs_list. Обозначьте связи между внеш­
ними ключами линиями, а связи типа «один-ко-многим» — стрелками. Также обо­
значьте первичные и составные ключи.

m y _ c e n ta c ts Связь «многие-ко-АЛНогиМ» со ст о и т
contact id из двух связей « о д и н - к о - м н о г и м »
last _ name и соединительной таблицы.
first_nam e
phone
Д б я столбца образуют
email
gender
/^составной клю<^
birthday ^один-ко-многим»
profession <один / к о - м н о г и м contart_iwt>r4t
city
state ■interest_id O— y
status interest_id
interest
interests 0 + ir
seeking
8 таблице «co n ta cts
in terest» неко-
iy_coBtacts n^opoe значение
contact_id « in te re s tjd » мож ет
Эти т ри связи относятся
last_nam e вст речат ься м н о го-
к т ипу « о д и н - к о - м н о г и м » . 'Mh,
first_nam e
кратно J а в таблице
phone «in t e r e s t s » — только
' prof4«teii email
р аз.
p ro f_id О— ж gender
profession birthday
-s e e k in g jd О—чг
seeking_id ( seeking
zip.cod* .^zip_code 0+W
Г
.fstatus_id «один - к о ^ н о г и м »
city
А ба с т о л б -
state Чй о б р а з у ^ ^

К лю ч.
status
'^ я з . «многие-ко-м ногим »
status Z m o u m из f^ ^ ^ Z e d u -
« о д и н - к о - м н о г и м » U соеди
нительной таблицы-

368 глава 7
м н о г о т а б л и ч н ы е базы данны х

...А далее Ре9)ки (и дгедО^^О


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

Конец

--------
Стоп, не так быстро! Теперь
мне нужно составить запросы ко
всем этим новым таблицам! Как получить
данные из набора связанных таблиц без на­
писания сотни-другой запросов?

Вас спасут соединения.


До встречи в следующей главе...

да л ьш е > 369
крат кии обзор sqi

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

Схема Транзитивная функциональ­


ная зависимость
О п и слни е данны х,
ниммх б базе данных, Не-ключевой столбец свя­
включающее все ооьек зан с другим не-ключевым
т ы и связи м еж ^ сц ^ ^ ^ - столдцом (-ами).
С вяэь «ОДИН~,^_
одному»
Вторая нормальная форма (2НФ)
Таблица находится в І-ИФ
и не содержит частичных
функциональных зависимо­
Связь «один-ко-многим» стей.

Запись одной таблицы Третья


ар« нормальная форма (ЗНФ)
м ож ет быть связана со I Таблица
Та< находится в ЯНФ
многими записями дру­ и не им еет транзитивных
гой таблицы^ но каждая зависимостей.
запись последней м ож ет
быть связана только с Внешний ключ
одной записью в первой.

ния которого ссылаются

С оставн ой ключ
П е р в и ч н ы й КЛЮ Ч. С О - ^

с»ол5ц о6,
которых образует уни
« ‘« ‘’ Р О Й , и « й о & р Т т " " " кальное значение клю

370
м н о г о т а б л и ч н ы е базы данны х

Возьми в руку карандаш


Решение Используя ко м ан ду A L T E R и функцию S U B S T R IN G IN D E X , из­
м ен и те таблицу так, чтобы таблица состояла из перечисленны х

Прежде всего необходимо


столбцов. Количество запросов не о граничивается.
contact_id
создап\ь новые силол(5ц(7(;
last_name
ALTER TABLE my_contacts
ADD COLUMN interestl V A R C H A R (50), first_name
ADD COLUMN interest2 VARCHAR(50),
ADD COLUMN interests VARCHAR(50),
phone
ADD COLUMN interests VARCHAR(50); e m a il
З д т е м первое увлечение п ереносит ся в новый с т о л - gdnder
дец « i n t e r e s t l » . Э т о можно сделат ь так: birthday
profession
city
U P D A T E my_contacts
SET interestl = SU B ST R IN G IN D E X (interests, 1 );

Первое увлечение, сохраненное в «interest^-», нужно уда--' state


л и т ь из столбца « in terests» . Удаляются все символы до status
первой запят ой включительно:
interestl
функция TRIM удаляет пробелы у левого Функция Ш ант воз-
interest2
края строки после того, как мы уда­
л и м все символы вплот ь до запятой^ /
вращ ает правую
част ь строкового interests
значения. interest4
UPDATE my_contacts SET interests = TRIM(RIGHT(interests,
(LENGTH (interests)-LENGTH (interestl) - ].))); seeking
A эт а уст р а ш а ю щ ая конструкция вычисляет длии^^ ча­
ст и столбца « in terests» . Из общей длины « in t e r e s ts » іі.чи,н^лпе.т-
ся длина част и, пер ем ещ ен н ой в « in t e r e s t ^ » . Зате/л /лс;
е м ещ е г , чтобы усеченное значение начиналось п о е л ,: <aivM-wu.
Эти действия повт оряю т ся для остальных
столбцов увлечений:
UPDATE my_contacts SET interest2 = SUBSTRING_INDEX(interests, 1);
UPDATE my_contacts SET interests = TRIM(RIGHT(i n t e r e s t s , (LENGTH ( in te r e s ts ) -
LENGTH(interest2) - 1)));
UPDATE my_contacts SET interest3 = SUBSTRING_INDEX(interests, 1);
UPDATE my_contacts SET interests = TRIM(RIGHT(interests, (LENGTH(interests)-
LENGTH(interests) - 1)));

Для последнего столбца осталось т о л ь ко одно значение:


UPDATE my_contacts SET interest4 = interests;

Т еп ер ь ст олбец « in t e r e s t s » можно п ол н ост ью удалить.


Также можно было п ер еи м ен о ва т ь его в « in t e r e s t ^ »
и избавиться о т лишней команды ADD COLUMN
(п р едп о л ага ет сяJ что увлечений не более четырех).

да л ьш е > 371
упражнение, р е ш е н и е

Напишите для Реджи запрос, не использующий столбец in te r e s ts .

'пражнение
Р ’ЗШСИИС SELEC T FROM my_contacts
Сое. 316. WHERE g e n d e r = 'Ж'
AN D s t a t u s = 'He зам уж ем ' Фактически эт о т о т
^ ___ ^ е запрос, который Грег
AND s t a t e - М А использовал для Найдже-
AND seeklna LIKE ‘%Неженатый без проверки
столбца «in terests».
мужчина%‘
AN D b i r t h d a y > '1-Я5 0 - Z 0 ~ 0 3 '
AN D b i r t h d a y < ' 1 Я в 0 - 2 0 ~ 0 3 ‘,

372 глава 7
8 ^ о 0 д и н е н и я и М Н о Го щ а б л и Ч н ь хе озоераЦии

Не могли бы мы
^
остаться в одиночестве?^

Добро пожаловать в многотабличный мир! Базы данных, состоя­


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

U Все равно повторения, повторения...


Грег заме тил, что и столбцах p r o f e s s i o n , i n t e r e s t s
II s e e k in g постоянно встречаются одни и те же зпачсмпя.

ИҐ І.-І А .4 с
не ж е н а т •lolus
~Пол[Собёл~^ неженат
женщина асЮокат''
женат
учит ель ж ивот ные ~
к ни ги
книги
м узы ка
»еекіиа
мужчина
не за м у ж ем м уж и к I ка-----
|^эрй|Хар^йсо^^ женщина Джеральдина
адвокат
мужчина м узы ка
адвокат

сп о р т
музыка professien не ж е н а п л
программист
учитель ж енщ ина
адвокат адвокат '
живот ные

не ж е н а т

не ж енат in te r e s ts ж енщ ина


книги Жак Пеннингтон
учит ель
музыка
женщина
животные КНі<?и
програм мист спорт

сп о р т
заллуж ем
не за м у ж ем NULL
вёндйхйллш п^
мужчина програлш ист
к н и ги
адвокат спорт
книги

374 глава 8
соединения и м н о г о т а б п и ч н ы е операции

Заполнение таблиц
Обилие повторяющихся значений упро­
щает заполнение таблиц p r o f e s s i o n ,
i n t e r e s t s и s e e k in g . Грег хочет запол­
нить эти таблицы значениями, уже храня­
щимися в старой таблице my c o n t a c t s .

Но сначала необходимо составить за­


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

Напишите запросы, возвращающие список значений столбцов


profession, i n t e r e s t s и s e e k in g v a lu e s из старой таблицы
my c o n t a c t s . В списке не должно быть дубликатов. Вспомните
задачу с продажей печенья из главы 6.

дальше > 375


возьми в руку карандаш , р е ш е н и е

Р ^Возьми в руку карандаш


Напишите запросы, возвращающие список значений столбцов
p r o f e s s i o n , i n t e r e s t s и s e e k i n g v a l u e s из старой
таблицы m y _ c o n t a c t s . В списке не должно быть дубликатов.
Вспомните задачу с продажей печенья из главы 6.

SELECT profession FROM imy_contacts


^ GROUP BY profession
f ORDER B Y profession;
Условие GROUP B Y соединя­
ет дубликаты в одно зна~
^ чение для каждой группы.

З а т е м условие ORDER
BY упорядочивает с п и ­ \ SELEC T seeking FROM my_contacts
сок по алфавиту. ^ GROUP BY seeking
ORDER BY seeking;
При нарушении порядка у с л о ­
вий вы получит е сообш,ение
об ошибке. Условие ORDER BY
всегда должно ст оят ь на п о ­
следнем м ест е.

GRQJ^P B'YUnterests
1RDER BY inte^bit;
Ho этот запрос не подойдет
для столбца interests. Ведь
в этом столбце хранится не­
сколько значений, помните?

Мы не сможем воспользоваться
простым запросом SELECT для
вывода информации об увлечениях.
С такими значениями аналогичная команда
S E L E C T работать не будет.

in te r e s ts
книги, спорт
музыка, животные,
книги
животные, книги
спорт, музыка

376 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Проблемы с нормализацией
Ненормализованная структура таблицы порождает массу
проблем. Не существует простого способа извлечь эти
значения из столбца i n t e r e s t s по одному.

То, ч т о у нас е с ть :

interest« Столбец из таблицы


один, два, три, четыре ‘^ y ^ c o n t a c t s

То, ч т о дол)кно б ы ть :

interests
один С т о л б е ц новой
^''лаблицы in t e r e s ts .
два
три
четыре

( Может, вручную? Мы можем


ШТУРМ просмотреть каждую запись
( rny_contacts, а потом ввести каждое
Как выделить не-атомарные значения значение в новой таблице.
в один столбец таблицы i n t e r e s t s ?

Прежде всего, это гигантский объем работы.


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

Зачем выполнять всю «черную работу» самостоятельно,


рискуя натворить ошибок? Лучше поручить ее 8 ЦЬ.

да л ьш е ► 377
разделение т е к с т о в ы х д а н н ы х

Особые увлечения (столбец)


в одном довольно прямолинейном решении в таблице m y c o n t a c t s
создаются четыре новых столбца для временного хранения обрабатывае­
мых значений. После завершения обработки столбцы будут удалены.

- ^Возьми в руку карандаш


Вы у ж е ум еете пользоваться ко м ан д о й A L T E R ; создайте в табли­
це my c o n t a c t s четы ре новых столбца. П рисвойте им им ена
in t e r e s tl, in te r e s t2 , in te r e s ts и in te r e s t4 .

QiTiBfinbi на с, 408 -

Вот как будет выглядеть столбец i n t e r e s t s с новыми столбцами


в таблице m y _ c o n ta c ts после выполнения A L T E R .
in te re s t

interests interestl hiter»«tS Шфгтш*» interest4


один, два, три, четыре

П ервое увлечение копируется в новый столбец i n t e r e s t l


при помощи функции S U B S T R IN G _ IN D E X (см. главу 5):

UPDATE m y _ c o r^ ta c ts
• I
SET in te r e s tl = S U B S T R I N G _ IN D E X ( in t e r e e t s , / / 1 );
T r ...Поиск
McKoMWw
После выполнения команды таблица ст олбц а. сим бол первого
будет выглядеть так. (зл л я т й я ) в х о ж дени я.

interests Interestl interests lalMWSI9 interest4


один, два, три, четыре один

378 -=лгва 8
соединения и м н с г о т а б п и ч н ы е операции

Разделение увлечений
А теперь самое сложное: мы воспользуемся другой функцией для
удаления из текущего значения i n t e r e s t s данных, скопирован­
ных в столбец interestl. После этого можно будет продолжить
заполнение остальных столбцов по тому же принципу.

___ _ interests interestl interesta interest#


( один^, два, три, четыре один

ющук> за ним запят ую и пробел, следующий


за запятой в ст олбце «interests»-

Функция S U B S T R получает текст столбца i n t e r e s t s и возвращает


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

З а м е н и т ь содержимое, столбца
interests т е м , что в нем хранится
сейчас, с удалением символов, ' ;■ Длинл т екст а
пированных в « in t e r e s t ^ » запятой 6 поле « i n t e r e s t l » . ^ д символа-.
и пробела- запятая и пробел.

Л
UPDATE m y_conta c ts
SET in te r e s ts = S U B S T R ( in t e r e s t s , L E N G T H ( in t e r e s t l) + 2 ) ;
я

функция SUSSTR
/■
функция LENGTH ^
f
исходного п ер в ч ^ возвращает число ^ н аш ем п р и м ер е
длину ст роки, указан­ ^^^^на строки ^
о н а « ^ ^ Р ^ ^ ^ ^ ^ " Т к ^ ч г л ы к скоёках, ■^■^один» р а в н а ,
част ь, описанную в кр у-л кх ной в круглых скобках. 4

и возвращает вторую. ^ Si
И т а к , суММй будет
равна 4 rZ , или 6 -
некоторых функций зависит от ^именно столько с и м ­
используемой разновидности 5 0 1 . волов 6ydevn у дале­
Так вот, это одна из таких ф ун к­ но в начале старого
ций. За описанисл\ вашей к о н к р е т ­ содержимого столбца
ной разновидности 5 0 1 обращ ай­
interests.
т есь к док11Л'\е!стации

Oà/ihiiie 379
разделение т е к с т о в ы х д а н н ы х (часть 2)

Обновление столбцов
После выполнения команды UPDATE таблица будет выглядеть
так, как показано ниже.
Однако работа еще не закончена. Теперь нужно проделать то
же самое для сто л б ц о вi n t e r e s t 2 , i n t e r e s t s и i n t e r e s t 4 .

interests interestl interests interest#


два, три, четыре один

Г ^Возьми в руку карандаш


Заполните пропуски в команде u p d ate . Мы привели пару под­
сказок, чтобы немного упростить вашу задачу.

Подсказка. С каждым вызо-


00Л1 SU 3STR текалл с т о л б ­
ца «interests сплановиплся
все короче.»
/ UPDATE my_contacts SET
^ i n t e r e s t l = SUBSTRING_INDEX ( in t e r e s t s . 1) ,

in t e r e s t s = SUBSTR ( i n t e r e s t s , LENGTH ( i n t e r e s t l ) -1-2) ,


\ in t e r e s t2 = SUBSTRI NG_I NDEX( ) ,
^ i n t e r e s t s = SUBSTR ( ..................................................................... ) ,
in t e r e s t s = SUBSTRING_INDEX ( .................................................) ,
in t e r e s t s = SUBSTR (..................................................................... ) ,
in te r e s t4 = ...................................................................................... со
-T После удаления первых т р е х ивлечений
^ и з сплолдца « in teres ts» ост ает ся п о ­
следнее, чет в ер т о е увлечение. Что с
ним нужно сделат ь?

Заполнит е содержимое всех столбцов


^ после выполнения больилой команды.

і interests interestl interests interests interest#


два, три, четыре один

380 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Вывод списка
Наконец-то все увлечения разделены по разным столбцам. Для вывода можно
воспользоваться простой командой S E L E C T — но не для всех одновременно.
И команда не позволит легко извлечь их в один итоговый набор, потому что увле­
чения хранятся в четырех столбцах. Результат будет выглядеть примерно так.

i File Edil Window Help TooM anyColumns

> SELECT i n t e r e s t l , in te re s t2 , in te re s ts , i n t e r e s t 4 FROM m y _ c o n ta c ts ,

I in te re s tl I in te re s t2 I in te re s ts I in te re s t4 |

{ один 1 два 1 три i четыре i


{ лошади животные 1 1 i
\ музыка 1 рыбалка 1 книги 1 кино 1
{ живопись { 1 1
\ лошади ! животные \ i 1
\ музыка 1 спортз 1 книги 1 лодки 1
1 туризм 1 музыка !
1 лошади 1 ЖР1ВОТНЫе 1 1 1
1 музыка 1 спорт 1 книги 1 вязание 1
1 животные 1 книги { туризм 1 1
1 собаки 1 туризм 1 1 1
! кино 1 спорт ! 1 i

Конечно, мы можем написать четыре отдельные команды S E L E C T для


вывода всех значений:

SELECT interestl FROM m y _ c ontacts; SELECT interests FROM my_contacts;

SELECT interest2 FROM my_contacts; SELECT interest4 FROM my_contacts;

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

П о п р о б VU т е Т с а м и

Вспомните команду select д л я столбца profession, написанную нами на с. 375:


ажнение
SELECT profession FROM my_contacts GROUP BY profession

O R D E R BY p r o f e s s i o n ;

Ha следующей странице представлены ТРИ СПОСОБА использования команд select для


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

аальш е * 381
т ройное веселье с запросами

Дороги, которые мы выбираем


Вы знаете, что самое
Возможность сделать одно и то же тремя (и более) разными » 6 авиовв8 <».,Двтм?
способами кому-то может показаться веселой, но нормаль­ Одну и ту же вещь
можно сделать
ных людей такое изобилие обычно сбивает с толку. нвсколысими
способами!
И все же это полезно. Зная три решения одной задачи, вы
всегда сможете выбрать то решение, которое лучше под­
ходит для ваших потребностей. А по мере роста объема дан­
ных вы заметите, что некоторые запросы быстрее выпол­
няются вашей РСУБД. Запросы к очень большим таблицам
желательно оптимизировать, и умение решать одну задачу
разными способами вам в этом поможет.

prof_id
profession

(Почти) одновремеиное Выполнение CREATE« SELECT u INSERT


I. C REA TE TA B LE , з а т е м IN S E R T с SELECT
Этот способ вам уже известен! Сначала таблица t a b l e
со.1дается командой CRFATE, а затем столбцы .заполняются
: т ; 1чепиями, во.звращаемыми командой SELECT н ас. 375.
Создание таблицы profession го ::п\олбцом
CREATE ТЛ В Ь Е p r o f e s s i o n ^ 7 - VARCHAR
^ ^ ^ для описании профессии.
i d IN T (1 1 ) N O T N U L L A U T O _ IN C R E M B N T P R IM A R Y K Q Y ,
p r o fe s s io n v a r c h a r (2 0 )
);
INSERT INTO profession (profession)
SELEC ^ p r o fe s s io n FR C ^ m y _ c o n ta c t^ \
GROUP BY profession J
OBBER BV p r o f e s s io n ; „ 3 ..о л н е и и с
on»
т«5личв| profession значенияли.,
выдаваемыми командой SELECT.

382 глава 8
соединения и многотабличные операции

2. CREATE TABLE с SELEC T, добабление первичного ключа командой A LTER


Второй способ: таблица p r o f e s s i o n создается командой C R E A T E с ис­
пользованием данных команды SELECT, возвращающей значения столбца
profession таблицы m y contacts. Затем таблица изменяется командой
A L T E R с добавлением перви'п 1 0 г0 ключа. „ s
^ profession с еды нст -
в ен н ы м ст о л б ц о м . Таблица заполняет ся:
CREATE TABLE p r o f e s s i o n AS ^ -м а ч е н н в .м и SELEC T
SELECT p r o f e s s i o n FROM my c o n t a c t s .п о с л е ч е г о к п м л н
GROUP BY p r o f e s s i o n да A L T b R додавлясуп
ORDER BY p r o f e s s i o n ; в т аблицу ст ол бец
ALTER TABLE p r o f e s s i o n п ерви ч ного клю ча.
ADD COLUMN i d IN T NOT NULL AUTO_INCREMENT F IR S T ,
ADD PRIMARY KEY ( i d ) ;

Оянобременное Выполнение CREATE, SELECT u INSERT


3. C REA TE TABLE с пербичным ключом u SELECT 6 одной команде
A ;iTOT способ сос тоит всего h:i oahoi'o шага: команда C R E A T E со;)да-
с г таблицу p r o Г со сю лицом нсринчного юпоча н столбцс'м
V A R C H A R для хранспня про(|)с (ч iiii, одпов|)с'менно с :1ан<злнением
Создание т а ­
Н О С Л О Д 1 Н ‘ Г(> данпылп! запроса :;1':Т,Г'’
,СТ. Условие A U T O _ I N C R E M E N T
блице! p r o fe s s io n
сообщае т 1Ч:У1>/(, ч'1'o мпачсиня ( чолбца id должны генерироваться
с первичны.лл к л ю ­
автома тнчс( кн, а ( ледова тс.ш.ио, данные будут направлены в един-
ч о м и столдцом^
( твепп 1.1 н ос т а т т п к я с голбец.
« p r o f e s s i o n ■'>, кот с'
CREATE TABLE p r o f e s s i o n р ы и н е м е д л е н н о Jf-'
I t- п о л няе m г я дан и oi л-
(
i d I N T (1 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY S E l B C T
p r o f e s s i o n v a r c h a r (2 0 )
AS
SELECT p r o f e s s i o n FROM m y _ c o n ta c ts
GROUP BY p r o f e s s i o n
ORDER BY p r o f e s s i o n ;
£ Я еще не видел ключевое слово AS.
Похоже, оно используется для обозна­
чения результатов запроса, вставляе­
мых в новую таблицу.

Да, ключевое слово А 8 делает именно это.


Оно используется при определении псевдонимов,
которыми мы сейчас :)аймемся!
ключевое слово AS

Зачем нуАно AS?


AS заполняет новую таблицу результатами S E L E C T . Таким образом,
при использовании AS во втором и третьем примерах мы указываем
РСУБД, что данные, полученные из таблицы my c o n t a c t s в резуль­
тате выполнения S E L E C T , следует поместить в только что созданную
таблицу p r o f e s s i o n .
Если бы мы не создали
Если бы мы не указали, что новая таблица содержит два столбца с но­
маблицу с двумя с т о л б ­
выми именами, то условие AS создало бы всего один столбец с таким
цами, то команда с о ­
же типом данных и именем, как у столбца из команды S E L E C T .
здала бы один столбец
Создаем в н о - с т а ки м же т и п о м дан­
вой таблице ных и ил'^енем, как
ст олбец типа CREATE TABLE p r o f e s s i o n у р е з у л ь т а т а SELECT.
VARCHAR (
с им ен ем ^ __i d I N T (1 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
profession. ^ p r o f e s s i o n v a r c h a r (2 0 )
) ^
Э т о K o poiM K o e
^ 7 1 SELECT p r o f e s s i o n E^OM in y _ c o n ta c ts
КДЮИебое С А О б О GROUP BY p r o f e s s i^ T ^ ;^ - .^
и гр ает важ ную ORDER BY p r o f e s s i o n имена o m -
р о л .: о но нап раб- носятся к столбцу
весь вывод «p rofession » т а б л и ц ы
s e l e c t в новую w\y_contacts.
т.а6лицу-

Так как таблица p r o f e s s i o n была создана с автоматически


увеличиваемым первичным ключом, значения могут добав­
ляться только во второй столбец таблицы, которому также
присвоено имя p r o f e s s i o n .

Я совсем запуталась —«profession» встреча­


ется в этом запросе целых пять раз! Возможно
РСУБД отличает одно вхождение от другого,
но как их различу я?

Для предотвращения путаницы столбцу


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

384 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Пеебзоиимы столбцов
Создать псевдоним очень просто. Он указывается после первого использова­
ния имени столбца в запросе с другим ключевым словом AS. Оно сообщает
РСУБД, что столбец p r o f e s s i o n таблицы m y _ c o n ta c ts может временно
называться новым именем, чтобы пользователю было проще разобраться
в происходящем.

Мы присвоим данным, выбранным из таблицы my c o n t a c t s , имя mc_prof


(т с — сокращение от m y _ c o n ta c ts ).

CREATE TABLE p r o f e s s i o n
(
id I N T (1 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY, Э т о т запрос
p r o f e s s io n v a r c h a r (2 0 ) _ делает то же
) AS ^^мое, но благо­
SELECT p ro fe ssio n AS mc_pro£ FRCM my_contacts даря псевдониму
в нем прощ е
GROUP BY mc_pro£ —
OM.EK BY « = _ p r o I ;^
\
У к а ж и г л с п и в З о н и м после
разобраться.

первого использования исход­


ного имени столбца в з а п р о ­
се- Тем сам ы м вы сообщаете
своей Р С У 5А . что в дальней­
ш ем к столбцу возможны об­
ращ ения не только по имени
но и по псевдониму.

Между двумя запросами существует одно неочевидное различие.


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

Но так как мы указали, что новая таблица состоит из двух столб­


цов (первичный ключ и столбец p r o f e s s i o n ) , столбцу таблицы
будет присвоено имя p r o f e s s i o n , а не m c_ p ro f.

. Результ ат ы m cprof
programmer programmer
исходного з а ­
teacher щего псевдоним. teacher
проса с и с ­
lawyer Имя столбца со - lawyer
ходным им ен ем
столбца.
нимом.

да л ьш е ► 385
псевдонимы т абл иц

Кому ну)кны псевдонимы таблиц?


Вам и нужны! Мы сейчас займемся соединениями с выборкой дан­
ных из нескольких таблиц. Без псевдонимов вам придется вводить
имена таблиц снова и снова и вам это быстро надоест.

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


столбцов. Псевдоним таблицы указывается после первого
Псевдонимы
использования имени таблицы в запросе с ключевым словом AS.
В следующем примере оно сообщает, что таблица my c o n t a c t s
таблиц также
в дальнейшем будет также доступна по имени т с .
называются
SELECT p r o f e s s i o n AS m c p ro f параллельными
FROM m y _ c o n ta c ts AS me именами.
GROUP BY m c _ p ro f fr .
ORDER BY m c p r o f ; ^ ПсебЭоимллы
с о з д а ю т с я ^v^aк ^ ,
себ дон и м ы столбц ов.
W

и я должен использовать «А5»


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

Нет, существует сокращенный синтаксис


назначения псевдонимов.
Просто не указывайте ключевое слово АЗ. Следу­
ющий запрос делает то же самое, что и запрос в
начале страницы.
Э т и два з а п р о ­
са д е л а ю т одно
ц 1ЛЛ. 0 ЖЙ-

SELECT p r o f e s s io n m c _ p ro f Н а з н а ч е н и е п с е в д о н и м а б ез к л ю ­
чево го сл о в а А З . П с е в д о н и м д о л -
FROM m y _ c o n ta c ts me ж е н указы ват ься сразу ж е п осле
GROUP BY m c _ p ro f^ и м е н и т а б л и ц ы и ли с т о л б ц а
ORDER BY m c _ p ro f; с к о т о р ы м он с в я з ы в а е т с я .

386 ■;пява 8
соединения и м и о г с т а б л и ч н ы е операции

Все, что Вы хотели знать о Внутренних соединениях


Каждый, кому доводилось слышать разговоры о
наверняка слышал слово «соединение». Эта тема не так
сложна, как может показаться на первый взгляд. Мы
покажем вам, что такое соединения, как они работают,
^ ...вот откуда ^
в каких ситуациях их следует при­
на самом деле берутся N
менять и в какой ситуации приме­
таблицы результатов. )
няется та или иная разновидность
соединений.

Но начнем мы с рассмотрения
простейшей разновидности соеди­
нений (которая и полноценным
соединением-то не является!).

Она известна под разными имена­


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

Предположим, имеются две таблицы: с именами детей и названия­


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

toys boys
to yjd Іоу b o y jd Ьву
1 обруч 1 Дейви
2 самолет 2 Бобби
3 солдатики 3 Бивер
4 губная гармошка 4 Ричи
5 бейсбольные карточки

да л ьш е 'f 387
перекрест ны е с о е д и н е н и я

Перекрестное соединение
Результат следующего запроса представляет собой перекрестное
соединение. Мы запрашиваем данные из обеих таблиц: столбец
t o y из таблицы t o y s и столбец boy из таблицы b o y s.

Помнит е сокращеннук} запись из предыду


VT' оцей главы? Перед точкой указывается имя
SELEC T t .to y , b .b o y та6лии,ы, после точки — имя стол6и,а т а ­
FROM to y s AS t блицы. Только на э т о т раз вм ест о полных
имен таблиц использую т ся псевдонимы.
CROSS J O IN K
b o ys AS b ; \) Запрос ч и т а е т данные из столбца «Ьоц
) таблицы boys и из столбца « t o y » т аб
З Э е ^ т о ж е и сп о л ь - лицы «to y s .» Оставшаяся част ь з а п р о -
з у ю т с я псевдонимы отсоединяет эти два столбца в нову
таблт -
П ерекрестное соединение создает пару из каждо­
го значения первой таблицы и каждого значения Перекрестное со­
из второй таблицы.

to y s . toy boys-boy единение (CROSS


to y
обруч рг
Ь«у
Дейви
JOIN) возвращает
самолет
солдатики -•
^

Бобби
Бивер
комбинации каждой
губная гармош ка^
бейсбольные ^
Ричи
записи первой табли­

карточки
Л и н и и обп^ипип^піл^ цы с каждой записью
единения. Каждой игрушке ст авит ся
^ в со о т вет ст ви е каждый мальчик второй таблицы.
Р езул ьт ат не содерж ит дубликатов.

Результат соединения состоит из 20 записей


(5 игрушек * 4 мальчиков), то есть всех воз­ to y Ь«у
можных комбинаций. обруч Дэйви
обруч Бобби
обруч Бивер
т а к ., ^
СЯ только теМ: и т У ^ (лддбли- обруч Ричи
ж и т больиле ^ 0 таблице самолет Дэйви
самолет Бобби
це «hoys^ то р езу л ьт а т ы
самолет Бивер
:;у Г и р о б « л и с . ' самолет Ричи
самолет Дэйви
К Л с^^рЛ еЛ ^ L

388 глава 8
соединения и м н о г о т а б л и ч н ы е операции

часгп“
<аД аБаеМ ы е
BoIlJoCbl

• и зачем мне это нужно? Что произойдет при перекрестном соединении


двух очень больших таблиц?

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


что при экспериментах с соединениями можно случай­ Вы получите огромное количество записей. С пере­
но получить перекрестный результат Это поможет вам крестным соединением лучше не экспериментировать —
исправить неправильно написанный запрос. Поверьте, при таком гигантском объеме возвращаемых данных
такое случается. Кроме того, перекрестные соединения ваш компьютер может «зависнуть»!
иногда используются для тестирования скорости РСУБД
и ее конфигурации. Их обработка занимает относитель­
но много времени, что упрощает анализ и сравнения. Существует ли другой синтаксис у таких запро­
сов?

А если использовать запрос вида: • Да, существует Вместо ключевых слов CROSS JOIN
SELECT * F R O l t o y s CROSS J O IN b o y s ; можно поставить запятую:
Что произойдет при использовании SELECT *7
SELECT toys.toy, boys.boy
FROM toys, boys;
УУ Попробуйте сами. Вы получите те же 20 записей,
но в них будут включены все 4 столбца.

Ранее я слышал термины «внутреннее соедине­


ние» и «внешнее соединение». Это то же самое, что
Внутренним соединением и перекрестное соединение?

(INNER JOIN) называется 0: Перекрестное соединение является разновидно­


стью внутреннего соединения, в сущности, внутреннее

перекрестное соединение, соединение - это перекрестное соединение, из результа­


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

часть записей исключается


по условию запроса.
ШТУРМ
Как вы думаете, какой результат вернет следую­
щий запрос:
SELECT Ы . Ь о у , Ь 2 .Ь о у

FROM b o y s AS Ы CROSS J O IN b o y s AS b 2 ;

Попробуйте сами.

да л ьш е ► 389
возьми в руку карандаш

^Возьми Вруку карандаш


iny_conlacls Перед вами две таблицы из базы данных
гх co n tact_ id 0 — ir
g r e g s _ l is t : p r o f e s s io n и m y _ c o n ta c ts .
Просмотрите код запроса и запишите, что, по
last_nam e
вашему мнению, делает каждая строка.
first_n am e
phone
prof*ssien email
p ro f_ id
gender
profession birthday
^ prof id

zip _ cod e

statu5_id

SELECT т с . la s t _ n a m e ,

т с . fir s t_ n a m e ,

p .p r o fe s s io n

FROM m y _ c o n ta c ts AS me

INNER J O IN

p r o f e s s i o n AS p

ON m e. c o n t a c t _ i d = p . p r o f _ i d ;

390 глава 8
соединения и м н о го гпа бли ч ны е операции

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


Изобразите таблицу с результатами.

Д ж о а н Эверетт

Не замужем
4 -3 -1 4 7 8
Солт-Лейк-сити, ЦТ

Художник Тара Болдуин


Ж Замужем
jeverettSm igM y£um balЫ et
Я -% ~ гй 7 о
парусный спорт, туризм, кули­
нария Бостон, МА
555 555- ‘^гЮ Шеф -повар
Ж
tara@breakneckpizxa.com
кино, книги, кулинария
5 5 5 5 5 5 -3 4 3 2
Пол Сингх
Женат

Нью-Йорк, МУ
Профессор
м
ps@tikiheanlounge.com
собаки,
5 5 5 5 5 5 -8 2 .Я Я

аа.пьше ^ 391
возьми в руку карандаш, решение

-^Возьми В руку карандаш


гешение m y_ c« H ta cls Перед вами две таблицы из базы данных
contact_id О—тг
g r e g s _ l i s t ; p r o f e s s i o n и m y _ c o n ta c ts .
Просмотрите код запроса и запишите, что, по
last_nam e
вашему мнению, делает каждая строка.
first_nam e
phone
p ro fe s s io n email
gender
profession birthday
-► p ro f_id

z ip _ c o d e ^ -^ -

status_id

SELECT т с . la s t _ n a m e , Выборка столбца «last^nam e» таблицы


<<my^c6'niacis>>'(nce^ m e ) ........................................

т с . fir s t_ n a m e , u столбца «First_nam e» таблицы mt^_contacts

p .p r o fe s s io n и столбца «p rofession » таблицы


profession (псевдонилА p)
FROM itY _ c o n t a c t s AS me из таблицы my_contacts (псевдоним тс)

INNER J O IN внутреннее соединение р езу л ь т а т о в выборки

p r o f e s s i o n AS p с таблицей profession (псевдоним р)

0N т с . c o n t a c t _ i d = p . p r o f_ id ; при условии, что значение столбца


« 1: опЫ са_т » таблицы ^ny_coniacts с о ­
впадает со значением столбца «1о1»
таблицы profession

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


Изобразите таблицу с результатами.

la s l_ n a m e firs f_ n a m e p ra fo s s ie n
Эверетт Джоан Художник
Сингх Пол Профессор
Болдуин Тара Ш еф-повар

392 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Открой свое внутреннее соединение

Понял! Так я могу связать новые табли­


цы с новой версией my_contacts. Мне
не нужно писать десяток SELECT, доста­
точно включить таблицы во внутреннее
соединение!

Все только начинается


Думаете, это все? Мы рассмотрели только одну
разновидность одного типа соединений. И вам еще
предстоит узнать много всего об этом и других ви­
дах соединений, прежде чем вы сможете эффектив­
но и разумно применять их на практике.

Внутреннее соединение комбинирует записи двух


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

SE1£C T s o m e c o lijm n s
FRO M t a b le l

IN N E R J O IN Mb/ не указываем псевдо­


нимы, чтобы не у с л о ж ­
Также можно t a b le 2 нять запрос.
ucnoAt^^oeami?
^ д к )и е 6 о е слобо ON s o m e c o n d x tio n ;
W H ERE.
. В условии м о г у т и с п о л ь ­
зоваться любые о п е р а ­
торы сравнения.

Внутреннее соединение комбинирует


записи из двух таблиц в соответ­
ствии с заданным условием.
да л ьш е ► 393
эквивалент ное соединение

Внутреннее соединение 6 дейстВии: экВисоединение


Рассмотрим следующие таблицы. У каждого мальчика
есть только одна игрушка. Связь относится к типу
«один-к-одному», а t o y _ i d — внешний ключ.

boys toys
b o yJd 0 -n r boy t o y j d О— «• to y
to y jd
1 Дэйви 3 1 обруч
2 Бобби 5 2 самолет
3 Бивер 2 3 солдатики
4 Ричи 1 4 губная гармошка
5 бейсбольные
карточки
Все, что требуется — определить, какая игрушка принад­
лежит каждому из мальчиков. Мы можем воспользоваться
внутренним соединением с оператором = для поиска совпа­ Эквивалентное соеди­
дений внешнего ключа b o y s с первичным ключом t o y s .
нение — внутреннее
SELEC T b o y s .b o y , to y s . to y
FROM boys соединение с проверкой
IN N E R
to y s
J O IN
равенства.
ON b o y s .to ^ _ id = t o y s . to y _ id ;

1 boys toys
b o y j d 0 —ж boy lo y J d lo y jd to y
1 Дэйви 3 1 обруч
2 Бобби 5 2 самолет
3 Бивет 2 3 солдатики
4 Ричи 1 4 губная гармошка
5 бейсбольные
(Карточки

[А т о го вя я т а б л и ­
boy to y
ца. П ри ж елании в ,
Ричи обруч
з а п р о с /.ложно б ы л о
Бивет самолет
д о б а в и т ь услобме
Дэйви солдатики
С к Р £ 1< 8 Y h o y s.b o u .
Бобби бейсбольные
карточки

394 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Р Возьми В руку карандаш


Напишите следующие запросы эквивалентных соединений
для базы данных g r e g s l i s t .

Запрос, который возвращает адреса электронной почты (e m a il) и профессии ( p r o f e s s i o n ) каждого


человека в т у c o n t a c t s .

Запрос, который возвращает имя (first_name), фамилию (la s t_ n a m e ) и семейное положение ( s t a t u s )


каждого человека в m y _ c o n ta c ts .

Запрос, который возвращает имя (f i r s t name), фамилию (la s t_ n a m e ) и штат ( s t a t e ) каждого чело­
века в ra y _ c o n ta c ts .

contact intorost
professiow
,contact_id
pro f_id (>™ r-
last name O+w
profession interests
first name interest_id ^ •interest id
zip_«ode phone 0 + ir interest
z ip _ c o d e ( H -^ email

city gender
contnct_«oeicin9
state birthda’
contact id

sla iv s
pro f_id
■ 0 +. seelting
>zip _cod e seeking_id
status id ■seeking id O— w
>status id I 0 +w seeking
status

да л ьш е » 395
возьми в руку карандаш , р е ш е н и е

Г ^ о з ь м и в руку карандаш
Решение Напишите следующие запросы эквивалентных соединений
для базы данных g r e g s _ l i s t .

Запрос, который возвращает адреса электронной почты (e m a il) и профессии ( p r o f e s s i o n ) каждого


человека в m y _ c o n ta c ts .

SELECT mc.email, p.profession FROM my_contacts m e


INNER JOIN profession p ON m c .p r o f j d - p.profjd-,
Внешний ключ p r o f j d связы ­
вает ся со ст олбцом « p r o f id »
>^адлицы profession.

Запрос, который возвращает имя (f i r s t name), фамилию ( l a s t name) и семейное положение


( s t a t u s ) каждого человека в m Y _ c o n ta c ts .

SELECT mc.first_namej mc.last_name, s.status FROM my_contacts m e


INNER JOIN status s ON m c .sta tu sjd - s.statusjd;
Внешний ключ s t a t u s jd
связывается со столЬцоМ
« s t a t u s j d » таблицы «sta tu s».

Запрос, который возвращает имя ( f i r s t name), фамилию ( l a s t name) и штат ( s t a t e ) каждого чело­
века в m y _ c o n ta c ts .

S ELECT mc.first_name, mc.last_name, z-state FROM my_contacts m e


INNER JOIN zipjcode z ON mc.zip_code = z.zip_code;

На э т о т р аз в качестве ключа,
связывающего две таблицы,
и сп ользу ет ся ст олбец «zip_code>
MY_cowt«<ts c o n la clln te re sf
contact id j:o n ta c t_ id
p ro f_id O— jr-
profession
last name O+w
first name interest_id
-interest idO— jr
xlp_«odl* phone 0 +w interest
zip_code O—JT email

city gender
cowtact_a00iclng
state birthda’
contact id
0 + ir
slalus >zip _cod e seeking_id
status id 0 — If ■6eeking_id
>status id 0 + jr seeking
status

396 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Внутреннее соединение 6 qeiiemBuu; неэквивалентное соединение


Неэквивалентное соединение возвращает записи, у которых задан­
ные значения столбцов не равны. Для примера рассмотрим те же две
таблицы, b o y s и t o y s . Используя неэквивалентное соединение, мы
можем точно узнать, каких игрушек нет у каждого из мальчиков (та­
кой результат более удобен при поиске подарка на день рождения).

SELEC T b o y s .b o y , to y s . to y
E T ^O M b o y s О п ер а т о р « н е равно» __
IN N E R J O IN r отсюда M название coedu-
нения.
У п ор я д о ч е н и е to y s
результаупов n qn b o y s . to y id <> to y s . to y id
З и Г ““ “ 0W 5ER BY b o y s .b o jr ^ \

boys toys
b e y j d 0—W Ь *у to y id to y jd toy
1 Дэйви 3 1 обруч
2 Бобби 5 2 самолет
3 Бивер 2 3 солдатики
4 Ричи 1 4 губная гармошка
5 бейсбольные
карточки

boy toy
Бивер обруч Ч еім ь ір е и г р у ш к и ,
Бивер солдатики K om ovbiy еще н е т
Бивер губная гармошка у ви вера.
Бивер бейсбольные карточки
Бобби солдатики
Бобби губная гармошка
Бобби обруч
Бобби самолет
Дэйви обруч Неэквивалентное
Дэйви самолет
Дэйви губная гармошка соединение про­
Дэйви бейсбольные карточки
Ричи
Ричи
самолет
солдатики
веряет несовпа­
Ричи
Ричи
губная гармошка
бейсбольные карточки
дение значений.

а а л ьш е ► 397
ест ест венны е со е д и н е н у >,

Последнее внутреннее соединение: естественное соединение


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

Одинаковые и м ен а
^ сп л ол бц а.
boys 'ф toys
b o y j d Ö—-яг boy lo y jd to y jd 0 - ^ to y
1 Дэйви 3 1 обруч
2 Бобби 5 2 самолет
3 Бивер 2 3 солдатики
4 Ричи 1 4 губная гармошка
5 бейсбольные
карточки
Как и прежде, мы хотим знать, какая игрушка есть у каждого
из мальчиков. Естественное соединение распознает совпа­
дающие имена столбцов в двух таблицах и вернет соответ­
ствующие комбинации.

SELEC T b o y s .b o y , to y s . to y
FROM b o y s
NATURAL J O IN
to y s ;

b o y j d 0 —W boy lo y jd 0™ ^ to y
to y jd
1 Дэйви 3 1 обруч
2 Бобби 5 2 самолет
3 Бивер 2 3 солдатики
4 Ричи 1 4 губная гармошка
5 бейсбольные
карточки
M w получили
же сам ы й
р е . 5 у л ь т а т , как
Естественное соедине­
boy to y
W в случае п е р в о ­
го в н у т р е н н е г о
Ричи обруч ние связывает записи
Бивер самолет
соединения, —
зквисоединение
Дэйви солдатики но значениям одно­
Бобби губная гармошка
именных столбцов.
398 р.лава 8
соединения и м н о г о т а б л и ч н ы е операции

Р Возьми в руку карандаш


Напишите следующие запросы для базы данных g r e g s l i s t с ис­
пользованием естественных или неэквивалентных соединений.

Запрос, который возвращает адреса электронной почты (e m a il) и профессии ( p r o f e s s i o n ) каждого


человека в m y _ c o n ta c ts .

Запрос, который возвращает имя (f ir s t_ n a m e ), фамилию (la s t_ n a m e ) и семейное положение


( s t a t u s ) , которым не обладает каждый человек в m y _ c o n ta c ts .

Запрос, который возвращает имя (f ir s t_ n a m e ), фамилию ( l a s t name) и штат (state) каждого чело­
века в т у c o n t a c t s .

my_ceHtacts co n tactin terest


profe»»iew
contact id ,contact_id
p ro f_id 1 -V
last name 0 + ir
profession interests
first name interest_id -interest id
phone 0 + ir interest
zip_code 0~^ email

city gender
coBtq«t_seeltiwg
state birthda
contact id
0 + ir
status seeitlwfl
> zip _cod e seel<ing_id
■5eel<ing_id
status id
■►status id 0 + ir seel<ing
status

да л ьш е * 399
возьми в руку карандаш, р еш ение

- ^ В о з ь м и в руку карандаш
V Решение Напишите следующие запросы для базы данных д г е д з _ 1 1 з 1
с использованием естественных или неэквивалентных соединений.

Запрос, который возвращает адреса электронной почты (e m a il) и профессии ( p r o f e s s i o n ) каждого


человека в my_contacts.

SELECT mc.emailj p.profession FROM my_contacts me


INNER JOIN profession p;,

Запрос, который возвращает имя ( f i r s t name), фамилию (la s t_ n a m e ) и семейное положение


( s t a t u s ) , которым не обладает каждый человек в m y _ c o n ta c ts .

S ELECT mc.First_name, mc.last^name, s.status FROM my_contacts m e


INNER JOIN status s ON m c .sta tu sjd <> s.statusjd^

А ля каждого человека будет создано несколько записеи


со всеми вариант ами семейного положения, с которыми
э т о т человек не связан по sta tu sjd .

Запрос, который возвращает имя ( f ir s t_ n a m e ), фамилию (la s t_ n a m e ) и штат ( s t a t e ) каждого


человека в m y _ c o n ta c ts .

S ELECT mc.First_name, mc.last_name, z.state FROM my_contacts m e


INNER JOIN zipjcode z; .. ^ ^ ^ ^ ^
J- Условие ON в первом и т р е т ь е м запросах не обяза-
тельно п от ом у что имена внешнего и первичного
ключей в них совпадают.

mv «ontacis conlncl in leresi


contact id ,contact_id
p ro f_id О—r-
last name 0+ r
profession in t*r« sls
first name interest_id -interest id 0 —jr
phone 0 +Ж interest
zip_code 0 'Я email

city gender
contacl_«e*M ag
state birthda’
contact id
0 + ir
stains M »h iag
■►zipcode seeking_id
status idO — I f ■6eeking_id
■ fstatu sjd 0+ ir seeking
status

400 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Проведите линию от каждого вида соединения к его описанию. Н екоторые


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

еетеетВенноесоединение Я возвращаю все записи, у кото­


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

перекрестноесоединение Я возвращаю все записи, у которых


значение столбца таблицы совпа­
дает со значением столбца другой

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

я соединяю две таблицы, содер­


жащие одноименные столбцы.
неэквивалентноесоединение
Количество возвращаемых мною

Внутреннеесоединение записей может быть равно произ­


ведению количества записей двух
таблиц.

Я возвращаю все возможные ком­


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

перекрестноепроизведение Я соединяю две таблицы с про­


веркой условия.

дал ьш е > 401


кт о и что делает ? оп)вегп

Проведите линию от каждого вида соединения к его описанию. Н екоторые


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

естественноееоеаинение Я возвращаю все записи, у кото­


рых значение столбца таблицы
не совпадает со значением столб­
ца другой таблицы.
эквиваАентновсоединение
Для меня важен порядок соеди-
„ениятаблиц^ 0 5

см зан о главе Ю .
перекрестно«соединение
6

Я возвращаю все записи, у кото­


рых значение столбца таблицы
совпадает со значением столбца

Внеш
неесоедине другой таблицы, и при этом ис­
пользую ключевое слово ОЫ.

Я соединяю две таблицы, содер­


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

Я возвращаю все возможные


декартово соеди! комбинации без проверки
условия.

перекрестноепрш
зведе я соединяю две таблицы с про­
веркой условия.

402 глава 8
соединения и м н о г о т а б л и ч н ы е операции

Для приведенной ниже схемы базы данных дгедз_11 з1 напиши­


те запросы 501, возвращающие указанную информацию.
ажнение

Напишите два запроса с разными соединениями для получения парных записей из таблиц ту
contacts И contact interest.

Напишите запрос для получения всех возможных комбинаций записей из таблиц contact_seeking
и seeking.

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

conlacl interest
proto«sloii
contact id .contact_id
p ro f_id О—гг-
last name 0+>r
profession interests
first name interest_id ^ •interest id
»lp_c«de phone 0 + ir interest
zip c o d e O ~ T r email

city gender
contact_seeiting
state birthda
contact id
■ 0 + ,
slatu* seeiting
■►zip_code seeking_id
status idO — seeking_id
>status_id 0 + ir seeking
status

да л ьш е ► 403
упражнение, ре ш е ни е

Для приведенной ниже схемы базы данных gregs_list напиши­


те запросы 801, возвращающие указанную информацию.
ажнение
ргш енме
Напишите два запроса с разными соединениями для получения парных записей из таблиц ту_
contacts И contact_interest.

S ELEC T mc.first_nam.ej m c.last_nam e, ci.in terestjd FROM my^contacts m e


INNER JOIN c o n t a c t jn t e r e s t ci ON m e .c o n t a c t jd = ci.co n tactjd ;

SELECT mc.first_name, m c.iast_nam e, ci.in terestjd FROM my_contacts m e


NATURAL JOIN c o n t a c t jn t e r e s t ci;

Напишите запрос для получения всех возможных комбинаций записей из таблиц contact seeking
и seeking.
S ELECT * FROM contact_seeking CROSS JOIN seeking;

SELECT * FROM contact_seeking, seeking; дбд способа выполнения одного


— ------- перекрестного соединения.

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

S ELECT р.profession FROM my_contacts тс


INNER JOIN profession p ON m c .p r o f j d = p .p ro f _ id GROUP BY profession
ORDER BY profession;

IWy_€0Wta«*8 centacljnleresl
|1 го1 ч « 1он
contact id 0 -—ЯГ - ^ contact_id
p r o fjd
last name 0+w
profession interest«
first name interest_id -interest id
»ip_code phone 0 + fr < interest
zip_code 0 ~-ir email

city gender
contwct_seelting
state birthda
contact_id
p ro f_id
0+w
•talH* seeidna
■►zip_code seeking_id
status idO — sf seeking_id
■►status id 0 +>r 4 seeking
status

404 гпава 8
соединения и м н о г о т а б л и ч н ы е операции
Часто
Задаваемы е -

Бот^ЬС ь!

Можно ли включить в соединение более двух Значит ли это, что существуют другие варианты
таблиц? синтаксиса внутренних соединений?

• Можно, но об этом чуть позднее. Пока нас интересуют yj Да, существуют. Но если вы поймете описанный нами
только общие концепции соединений. синтаксис внутренних соединений, разобраться с другими
будет намного проще. Сами концепции намного важнее,
чем тонкости использования WHERE или ON.
Вроде как соединения считаются сложной темой?

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


меньше напоминают текст на естественном языке. В со­ ORDER BY. Означает ли это, что в соединениях можно
кращенной записи (скажем, лри замене ключевых слов использовать и другие конструкции?
INNER JOIN запятыми) ОНИ выглядят еще более запутан­
ными. По этой причине в книге в основном используются (^ • Да, в соединениях можно использовать конструкции
более понятные, а не более компактные запросы. GROUP BY, WHERE, а также функции SUM, AVG И Т Д.

Встроенные запросы?
Грег постепенно начинает понимать возможности соединений.
Он видит, что разбиение базы данных на таблицы имеет смысл,
а работать с хорошо спроектированными таблицами не так уж
сложно. Грег даже планирует расширить базу данных g r e g s l i s t .

Но мне по-прежнему часто приходится


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

Запрос внутри другого запроса?


Такое возможно?

да л ьш е ► 405
откровенно о п севдон и м ах

0 ’Т|<![Р013Ё:ЬЧ Й 0'
о
Т А Б Л И Ц и С Т С З л Б Ц О 'В
Интервью недели;
Что они скрывают?

Head First: Добро пожаловать, Псевдоним ПТ: Я существую для того, чтобы упростить
Таблицы и Псевдоним Столбца. Мы рады, написание запросов.
что вы сегодня с нами. Надеемся, вы поможе­
ПС: И еще ты помогаешь мне в соединениях,
те нам прояснить некоторое недопонимание.
ПТ.
Псевдоним Таблицы: Еще бы, я тоже очень
Head First: Ничего не понимаю. Может, при­
рад. И вы можете для краткости называть нас
ведете пример?
П Т и ПС во время этого интервью (смеется).
ПТ: Давайте рассмотрим синтаксис. Думаю,
Head First: Ха-ха! Да, это будет уместно.
вам будет предельно понятно, что я делаю:
Итак, ПС, начнем с вас. Для чего такая се­
кретность? Вы что-то пытаетесь скрыть? SELECT тс. last_nam e, тс.firs t_ n a m e ,

Псевдоним Столбца: Вовсе нет! Если уж на р .p ro fe s s io n

то пошло, я стараюсь все прояснить. Ведь FROM m y_contacts AS me


я сейчас говорю за нас обоих — верно, ПТ?
INNER JOIN
ПТ: Конечно. В случае ПС и так понятно,
что он старается сделать: он берет длинные p ro fe s s io n AS p

или избыточные имена столбцов и упрощает


WHERE me.c o n ta c t_ id = p .id ;
работу с ними. Просто для удобства. Кроме
того, он предоставляет таблицы результатов
Head First: Понятно! Повсюду, где мне при­
с понятными именами столбцов. Со мной
шлось бы вводить m y _ c o n ta c ts , достаточно
дело обстоит немного иначе.
ввести т с . Л p r o f e s s i o n заменяется на р.
Head First: Надо признать, мы не настолько Так гораздо проще и намного удобнее, когда
хорошо знакомы с вами, ПТ. Мы видели, как мне приходится включать два имени столб­
вы работаете, но еще не до конца понима­ цов в один :ianpoc.
ем, что именно вы делаете. Ведь когда вас
ПТ: Особсиио когда таблицы имеют похожие
используют в запросах, вы не отображаетесь
имена. Упрощение помогает не только на­
н результатах.
писать нужный запрос, но и понять его, когда
ПТ: Да, это правда. Но по-моему, вы не улавли­ вы всрнстссь к нему через какое-то время.
ваете моего более высокого предназначения.
Head First: Во;н>июе спасибо, П Т и ПС. Нам
Head First: Высокого предназначения? Инте­ было очеьн.... э.... куда они пропахли?
ресно, продолжайте.

406 глава 8
соединения и м н о г о т а б /т ч н ы е операции

Новые инструменты
После главы 8 вы можете строить соединения,
как настоящий SQL-профессионал. Ниже
od
перечислены основные понятия этой главы.
Полный список инструментов приведен
С Г5
в приложении III.

«ее
вяу«р ® « КОМ '

Перекрестное соединение
Набор всех комбинации
\ уСАоб'^'^- записей одной таблицы
с записями другой т а ­
блицы. Т акж е вст реча-
и>тся другие названия —
Естес-рвенное соединение
«декартово соединение»,
Внутреннее соединение «декартово произведе­
оез « о м » . Работает
ние» и др.
•только при соедине­
нии двух таблиц, со ­
держащих одноименные
столбцы.

эквивалентное и неэкви­ С Г Г
валентное соединение
дбе разновидности вну­ ^^K>ЧeИu^>»»
тренних соединений. Эк •<^К>Чевые С А о 6 ^ °^ °'
бивалентное соединение
^ой.
sa^AenZ запя-
возвраи^ает комбинации
с равными значениями,
а неэквивалентные —
с неравными значениями
столбцов-

дальше ► 407
возьми в руку карандаш, реш е ни е

- ^озьми в руку карандаш ■


Решение Вы уже умеете пользоваться командой ALTER; создайте в табли­
це my_contacts четыре новых столбца. Присвойте им имена
Со с. 378.
interestl, interest2, interests и interest4.

ALTER TABLE my_contact5


A P P (i n t e r e s t l VARCHAR(ZO), in teres ts VARCHAR(2-0),
interest3 VARCHAR(ZO),, in teres ts VARCHAR(20));

^ Возьми Вруку карандаш


6Ш6НИ6 Заполните пропуски в команде update. Мы привели пару под-
Со С 380 сказок, чтобы немного упростить вашу задачу.

Не п у т а й т е SUBSTRIN G JNPEX с SUBSTR: ф у н к ­


ция SUBSTRIN G JNPEX и щ е т заданный т е к с т
(в данном случае зап ят у ю ) *внут ри* с т о л б ­
ца « in te r e s t s » и возвращ ает все п р е д ш е с т в у ю -
,щ и е символы, функция SU/3STR у секает ст олбец
« in t e r e s t s » до т е к ст а , следующего за первым ув-
UPDATE iny_contacts SET ^ л еч ен и ем , запят ой и пробела (->-2-) до конца строки.
i n t e r e s t l = SOBSTRING_INDEX(interests, 1 ),
in t e r e s t s = SUBSTR ( i n t e r e s t s , LENGTH ( i n t e r e s t l ) -1-2) , ^
in t e r e s t2 = SUBSTRING_INDEX( ),
in t e r e s t s = SUBSTR( interests, LENGTH(interestZ)+Z ),

in t e r e s t s = SUBSTRING_INDEX ( )'
in t e r e s t s = SUBSTR(,../interests, L E ^ ,
in te r e s t4 = .......................................

. . уЭаленмя первых т р е х увлечений из столбиа


После выполнения « in t e r e s t s » о ст а ет ся только ч ет в ер т о е ивлече
команды ст олбец ние. Эта команда п рост о п ер ен о си т его в н о в ^
« in t e r e s t s » ост ает ся столбец. Также вм ест о этого можно было п е р е -
п уст ы м . именоват ь ст олбец « in t e re s t s » в « in t e r e s t ^ »

^yintereats interestl in terests in terests interest4


sec-e^?.tbttd?io»rth first second third fourth

408 глава 8
9 одзаг1|=»ось1

Запросы внутри запросов

Мне, пожалуйста, запрос из двух частей. Соединения — хоро­


шая штука, но иногда возникает необходимость обратиться и базе дан­

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

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

запроса. В этом вам помогут подзапросы, также называемые подчинен­


ными запросами. Они предотвращают дублирование данных, делают
запросы более динамичными и даже помогут вам попасть на вечеринку
в высшем обществе. (А может, и нет — но два из трех тоже неплохо!)
за работ ой к грегу!

Грег берется за поиски работы


До настоящего момента база данных g r e g s _ l i s t была
сугубо бескорыстным делом. Она помогала Грегу подби­
рать пары для своих друзей, но заработка не приносила.

Внезапно Грег сообразил, что он мог бы открыть соб­


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

Имея новые функциональные


возможности, я могу создать собст­
венное кадровое агентство!

Грег знает, что для знакомых, которые заинтере­


суются его предложением, в базу данных придется
добавить новые таблицы. Вместо того чтобы раз­
мещать информацию в my_con t a c t s , он решает
создать отдельные таблицы со связями «один-к-
одному» по двум причинам.
Во-первых, не все участники списка п^_сопta c ts
заинтересованы в его услугах. Отдельная таблица
позволяет избавиться от значений N U L L в т у _
contacts.

Во-вторых, если когда-нибудь Грег наймет людей,


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

410 глава 9
подзапросы

В списке Грега появляются новые таблицы


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

Текуьцйя ДоС 1^У*^НЬ(е


И с к о м а я радсллла
в а к а н си и .

с m y _ c o n ta c ts связью типа «один-к-одному»,


для получения данных очень удобно исполь­
зовать естественные соединения.

да л ьш е ► 411
I
внут р е н н е го со е ди н е н и я
использование

г , « . » » » ч » »W '« “ « •7 ;
Грег получил „„формацию ° ™ ™ ° й бТ^даииых. 0 „ »о-.ет

" Г — - - - “ " - “ “ ''

Требуется: Веб-разработчик
Компания примет на работу веб-разра­
ботчика с отличным знанием HTML & CSS
для работы с группой визуального ди­
зайна. Специалисту, хорошо разбирающе­
муся в веб-стандартах, предоставляется
уникальная возможность проявить себя
в чрезвычайно перспективной компании,
которой руководят умные люди, любящие
свое дело.

Зарплата: $95000-$105000
Оео лт работы: 5+ лет

ка(ндидатов, он смо-
Когда Грег найдет дХьнейш ий отбор,
жет обзвонить их и пр г д а н н ^ всех
Но с„ачала
веб-разраб 0 Т1 ШКр^< 0 ДЬ1 Т0 м Р

412 глава 9
подзапросы

- ® J o 3bMM в руку карандаш


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

|»Ь_снггви1 iob_desired iob_llsting«


contact id contact id 0 " ^ job idO — >r
title
salary title title
start date salary_low salary
salary_high zip
Н аим еньш ая за р п л а т а available description
на кот о ру к > с о г л а с е н years_exp
кандидат .

З а р п л а т а , кот орую
кандидат надеет ся
>лолучать на новой
работ е.

да л ьш е ► 413
два запроса за два шага

Но ОН хочет опробовать другие запросы


П ока у Грега больш е вакансий, чем п ретендентов. О н нам ерен п р о ве­
сти поиск по таблице p r o f e s s io n s и вы ясн и ть, удастся ли ему найти
совпадения для отк р ы ты х вакансий. Д алее он со б и р ается вы п олни ть
есте ст ве н н о е соединение с таблицей m y _ c o n ta c ts , получить контакт­
ны е данные и узнать, заин тересую тся ли кандидаты его предлож ением .

Сначала он получает все вакантные должности из таблицы job_current.

SELECT t i t l e FROM jo b _ lis t in g s till*


Веб-дизайнер Аииль малая
GROUP BY t i t l e ORDER BY t i t l e ; ■ част ь должно­
Веб-разработчик
Официант ст ей в таблице
^ п о л ь з у е м конст рикцию Парикмахер joh_current.
Р гзу л ь-
BY, чтобы для каж - Повар
т ат ы.
‘^ ^ ^ /о л ж н о ст и возвращалась
только одна запись. К р о м е
!^ого, данные упорядочива-
к^ился по алфавиту

Р ^. Возьми в руку карандаш


Напишите запрос для выборки из базы данных кандидатов, удо­
влетворяющих поставленным условиям.
"it.
Час и н т е р е с у ю т контактные данные

SELEC T m c.last^nam e, m c.first^nam e, т с.phone

FROM m y_contacts A S m e Так как в таблицах m y_contacts и job__desiVed


NATURAL JOIN ^ ст ТлТеТ^^г ключа использует ся
С - ст олдец « c o n t a c t e d » , их можно связат ь при
joh_Aesired A S jd пом ощ и ест ест венного соединения.

WHERE Jd.title = 'Веб-разработ чик'

AND jd .sa ta ry jo w < 1 0 5 0 0 0 :

Л> Нас и н ересу ю т только лю ди, готовые работ ат ь за п р е д ­


лож енную сум м у. По ст олбцу « sa la ry jo w » мы убеж даемся в
т о м , чт о предложенная зар п лат а не ниже запраш иваем ого
м иним ум а.

414 глава 9
подзапросы

А теперь Грег использует ключевое слово IN, чтобы узнать,


имеются ли кандидаты на эти должности среди его подопечных.

SELECT т с . first_ n a re e , me. last_nam e, me.phone, j c . t i t l e


FROM jo b _ cu rren t AS j c NATURAL JOIN m y_contacts AS me
WHERE
j с . t i t l e IN ( ' Веб- дазайнер^^^^Веб-разработчик' , ' Официант' , ' Парикмахер' ' Повар')

Помнит е ключевое слово IN^ С ним запрос Р езульт ат ы


возвращает запись в т о м случае, если первого запроса.
значение jc.title входит в группу значений
в круглых скобках. Работает'
mc.ffirsl.iiame mc.lasl name т с .phone |c.tille
Джо Лонниган (555) 555-3214 Повар
Венди Хиллерман (555)555-8976 Официант
Шон Миллер (555)555-4443 Веб-дизайнер
Джаред Колуэй (555)555-5674 Веб-разработчик
Хуан Гарза (555)555-0098 Веб-разработчик

Но нам все равно придется вводить два разных запроса...

Ш Т У Р М

Попробуйте объединить два запроса в один. Запишите здесь этот запрос.

да л ьш е > 415
знакомст во с nodjan/jocaMU

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

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


p r o f e s s i o n s , мы назовем ВНЕШНИМ зап росом , потому что в него «упако­
ван» другой, ВНУТРЕННИЙ запрос. Д авай те посм отри м , что происходит.

ВНЕШ Ний запрос

^SELECT me. firs t_ n a ra e , m e.last_nam e, me.phone, j c . t i t l e

FROM jo b _ c u rre n t AS jc NATURAL JOIN m y_contacts AS me

WHERE

jc .title IN ', ' '^

Это внешний запрос. X.


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

В се проф ессии из сп иска в скобках были получены в резуль­


тате первого зап р оса — т о го , котор ы й вы бирал все вакантны е
Подзапрос представля­
долж н ости из таблицы j o b _ c u r r e n t . Таким образом (будьте
вним ательны , это топкий м о м ен т!), мы можем заменить эту
ет собой запрос, <<упа-
часть внешнего запроса частью первого запроса. Он по-
прежнему вернет результаты, перечисленные в скобках, кованный» в другом
но на этот раз будет инкапсулирован в подзапросе;
запросе. Также он мо­
B H V T P E H H U U запрос жет называться <<вну-
тренним запросом».
SELECT t i t l e FROM j o b _ l i s t i n g s ^
Эта часть первого запроса
превращ ает ся во в н у т р е н ­
ний запрос (или подзапрос).

416 глава 9
подзапросы

два запроса преобразуются 6 запрос с подзапросом


Ф актически мы всего лиш ь объединяем два зап р оса в один. П ер­
вы й зап рос н азы вается внешним, а втор ой — внутренним.

БНЕШНИй запрос + B H V T P E H H U U запрос

Запрос с подзапросом

Два объединенных за ­
проса ^превращаются
в запрос с подзапросом.

SELEC T m e . f ir s t_ n a m e , m e . la s t_ n a m e , m e .p h o n e , j c .t it le

FROM jo b _ c u r r e n t AS jc NATURAL J O IN m y _ c o n ta c ts AS me
W HERE je . t it le IN (S E L E C T t it le FROM jo b lis tin g s )

7
вым запросалл ' вращ аемы е п е р -

Результаты, полученные при вы полнении этого


запроса, в точ н ости совпадаю т с результатами
при явном перечислен ии всех вакансий в условии
W H E R E , но набирать приходится намного меньш е.
Те же р е з у л ь т а т ы , но всего
с. одним за п росом!

mc.first_name m c.iast name т с .р Ь е я е |с.1Ш е


Джо Лонниган (555) 555-3214 Повар
Венди Хиллерман (555)555-8976 Официант
Шон Миллер (555)555-4443 Веб-дизайнер
Джаред Колуэй (555)555-5674 Веб-разработчик
Хуан Гарза (555)555-0098 Веб-разработчик

да л ьш е * 417
ур ок анатомии

|^ о Д Ц о Д М и К р о с К о Ц о М

Подзапросы: если одного запроса недостаточно


Подзапрос — не что иное, как запрос внутри другого запроса.
«О хваты ваю щ ий» зап р ос н азы вается внеш ним, а «влож енны й» — внутрен­
ним зап росом , или подзапросом .

Внешний запрос (иногда назыбагмый


охбяилыбающым запросом).

SELEC T C T O J i6 e L i; l , a r ^ th e r _ c o liim n
FROM ta b le
W HERE c o lu m n = (S E L E C T c o lu m n FROM t a b le )

Внутренний запрос (подза^ ‘.рос).


■Внешний запрос.

SELEC T s o m e _ c o lu m n , a n o th e r c o lu m n
FROM t a b le
W HERE c o l\a m n = (S E L E C T c o lu m n FROM t a b le )

Внут рен­
\
ний запрос i'
Так как подзапр ос использует оп ер атор =, он значение
возвр ащ ает одно значение, одну зап и сь и з одного
столбца (иногда н азы вается «ячейкой», но в S Q L
и спользуется терм ин скалярное значение). Э то Наш подзапрос .
значение ср авн и вается со столбцам и в условии е'л\ скалярное знача'..,:: л-л,,
WHERE. ст олоец. одна iaiMiC:.] /'ynv,,'
рое зй/шел, аааЬичв . - ■

418 •ава 9
подзапросы

Подзапрос 6 действии
Д авай те посм отрим , как работает аналогичны й зап рос к таблице
my c o n t a c t s . Р С У БД чи тает скалярное значен ие из таблицы
z i p code и ср авн и вает его со столбцам и в условии WHERE.

(S E L E C T z ip _ c o d e FROM
z ip _ c o d e W HERE c ity =
'М е м ф и с ' AND s ta te = ’ T N ')

значение
i
SELEC T la s t_ n a m e , fir s t_ n a m e
FRO M m y _ c o n ta c ts
W HERE z ip _ c o d e = (S E L E C T z ip _ _ c o d e FROM
z ip _ c o d e W HERE c ity =
'М е м ф и с ' AND s ta te = 'T N ')
С
Запрос выбирает из
^y^contacts имена лю~ Часто
оей, живуш^их в М е м ­ ^аД аБ аеМ ы е
фисе (илтат Теннесси). B o rijb C b i

Почему то же самое нельзя сделать с ис­ Тот же запрос можно реализовать следующим
пользованием соединения? образом:

Можно, но некоторые люди считают, что ра­ SELECT last_name, first_name


ботать с подзапросами проще, чем с соединения­ FROM my_contacts me
ми. Хорошо иметь свободу выбора синтаксиса. NATURAL JOIN zip_code zc
WHERE zc.city = 'Мемфис'
AND zc.state = 'TN'

аальш е >
• 419
беседа у намина

Беседа у камина Ввутреввий или внешний?

Внешний запрос Внутренний запрос


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

Д а, конечно. Т ы даеш ь мне один малень­


кий результат, а п ользователям нужны
данны е, и притом М Н О ГО . Я даю им
эти данные. Думаю, если бы тебя не
бы ло, это бы их вполне устроило.
Н ет, я придаю твои м результатам н екое
подобие специализаци. Б е з меня теб е
при дется во зи ться со всем и данными
в таблице.

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


WHERE.
Я И Е С Т Ь т в о е услови е WHERE, и при­
том предельно конкретн ое. С об ствен н о,
ты мне не так уж нужен.

Нужен, ещ е как. Какая польза о т одного


столбца одной записи? О н п р о сто не со ­
д ерж и т д остато чн ой инф ормации.
Ладно. В о зм о ж н о, нам все ж е сто и т
раб отать вм есте. Я определяю направ­
лен и е поиска т во и х результатов.

К он ечн о, но я работаю сам по себе.

Как и я.

420 глава 9
подзапросы

Правила для подзапросов


Ниже перечислены некоторые правила, которым должны удовлетворять
'ЗЖН2НУ1С подзапросы. Заполните пропуски словами из следующего набора (некото­
рые слова могут использоваться многократно).

точкл с злпятоО КОНЕЦ


список СТОЛБЦОВ
КРУГАЫЕ СКОБКУ
1>Е1ЕГ£
Ч Ш £

Кодеке $ 0 1
Кодеке 8 0 1

собой одну команду

да л ьш е ► 421
упражнение, реш е ни е

ПраВила подзапросов
Помните об этих правилах, когда будете рассматривать примеры подзапросов в этой главе.
ажнение
Кодекс S Q L
Кодекс SQ L
Подзапрос всегда представляет Подзапросы могут исполь­
собой одну команду SELECT. зоваться в четырех местах
запросов: SELECT, SELECT
Подзапросы всегда заключа­
список СТОЛБЦОВ как один
ются в КРУГЛЫЕ СКОБКи из столбцов, условие FROM
Подзапросы не имеют собствен­
и условие WHERE,
ного символа ТОЧКА Подзапросы могут использо­
СЗАПЯТОЙ . Как обычно, один ваться в командах INSERT, 3s
J
I

такой символ обозначает


DELETE, UPDATE и,конечно,
КОНЕЦ всего запроса.
SELECT.

ЗйЧ- 'С

<аДаБаеМые
BoTljoCbl
Так что же может возвращать внутренний запрос? А как Мне все еще неясно, сколько значений может возвра­
насчет внешнего запроса? щать подзапрос — одно или несколько. Что по этому поводу
(^азано в официальных правилах?
! В большинстве случаев внутренний запрос может воз­
вращать только одно значение, то есть один столбец с одной В общем случае подзапрос должен возвращать одно
записью. Внешний запрос берет это значение и использует его значение. IN — исключение из правила. Обычно подзапросы
для сравнения со всеми значениями столбца. возвращают одно значение.

Почему вы говорите об «одном значении», когда в при­ Что произойдет, если подзапрос возвращает несколь­
мере на с. 418 возвращается целый столбец значений? ко значений, но не использует условие WHERE с набором

О Потому что оператор 1Ы просматривает набор значений.


При использовании оператора сравнения (как = в разделе «Ана­
ЗJ^^aчeний?
Хаос и разрушение!.. На самом деле вы просто получите
томия») имеется всего одно значение, которое сравнивается сообщение об ошибке.
с каждым значением в столбце.

422 9
подзапросы

Правила — это, конечно, хорошо, но я хочу знать,


как мне избавиться от длинных имен в столбцах результа­
тов — таких, как mc.last_name. На этот счет есть
какие-нибудь правила?

Существует два способа упрощения


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

В о т как вы глядит тол ько что осозданн ы й нами подза­


прос с коротки м и псевдоним ам и столбц ов.

Столбцу «First^name» |^Д - ■д столбцу «last_name>;


блицы my_contact5 в р е з у л ь ­ иад(5лиць/ my_contacts
т а т а х запроса назначается назначается псевдоним
псевдоним «fi\rstnam&i^^^

SELECT me. f i r s t _ n a m e AS f i r s t n a m e , m c . l a s t _ n a m e AS l a s t n a m e ,
m e.ph on e AS p h o n e, jc .title AS j o b t i t l e
Столбцу « p h o n e » ^
таблицы my^contacts. fro m j o b _ c u r r e n t AS j c NATURAL JOIN m y _ c o n t a c t s ( ^ m c
в резулс^татак н а - -----
значается псевдоним w here j o b t i t l e i n ( s e l e c t t i t l e from j o b _ l i s t i n g s ) ; >
« p h o n e » и т ак далее. ' задываи т^е:
ключевое слово
В общ ем , вы поняли!
AS не является
обязательным.
в о « К«К р е з а -« -- А >лоскольку !лсевдоиимы При создании
с псевдонимами су щ ест в у ю т лиш ь в р е ­ !лсе6донима ьгс
lan^ocoM-. столбцов р езу л ьт а менно, они никак не влия- можно о п у ­
ты ст али намного ю т на имена и сп о л ь з у е­ ст и т ь.
^ более понятными мы х таблиц и столбцов.

firs ln a m * iastn am * phene ie b lille


Джо Лонниган (555) 555-3214 Повар
Венди Хиллерман (555)555-8976 Официант
Шон Миллер (555)555-4443 Веб-дизайнер
Джаред Колуэй (555)555-5674 Веб-разработчик
Хуан Гарза (555)555-0098 Веб-разработчик

дальше у 423
пост роение подзапроса

Построение подзапроса
С амое сл ож н ое в подзапр осах — не структура, а определен и е того ,
какую часть зап р о са следует п р ео бр азо вать в подзапр ос (и нужно
ли это делать вообщ е).

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

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


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

Кто из моих знакомых


зарабатывает больше всех?

Анализ вопроса
П ереф разируем во п р о с в к о н тексте таблиц и столб ц ов базы
данных.

«Кто» означает, что вас интересую т столбц ы имени и фамилии


из таблицы m y _ c o n t a c t s . «Зарабаты вает больш е всех» озн ача­
ет, ч то вы х о ти т е определи ть м аксим альное значени е столбца
s a l a r y из таблицы j o b _ c u r r e n t .

Кто из моих знакомых зарабатывает больше всех?

^ СіАлолдцьі « f i r s t _ ^ a ^ e » MAX(salary)
«la st_n a m e» ілладлицьі і^аблицьі
'^У-Contacts. Joh_current.

Построение запроса, отвечающего на часть вопроса


Разделим во п р о с на части и построи м зап р ос, котор ы й во звр а­
щ ает о т в е т на одну и з частей .

П о х о ж е, хорош им кандидатом для п ервого зап р о са будет вы бор­


ка МАХ( s a l a r y ) :

SELECT M A X (s a la r y ) FROM j o b _ c u r r e n t ;

Помнит е функцию MAX? Она


оозвраш,ает наибольшее значение
из столбца, указанного в скобках.

424 глава 9
подзапросы

Продолжаем анализировать запрос.


с п ервой частью зап р о са т о ж е все ясн о; и з таблицы
вы би раю тся столбцы имени и фамилии:

SELEC T т с . fir s t_ n a m e , m e . la s t_ n a m e
FROM m y _ c o n ta c ts AS m e;
SwfopKa имени a фамилии.
Остается понять, как связать эти два запроса.
Нам нужны не тол ько им ен а лю дей и з m y _ c o n t a c t s , но
и данны е об их зар аб отке для ср авн ени я с МАХ ( s a l a r y ) .
Для вы борки данных о зарплате каж дого чел овека будет
и сп о льзо ваться естествен н ы й внутренний запрос:

S E LE C T т с . f ir s t_ n a m e , m e. la s t
nam e, je .s a la r y Использобание е с т е ­
FROM m y _ e o n ta e ts AS me ственного соединения
для выборки данных
N A T tJ R A L J O IN jo b _ e u r r e n t AS je ; о заработке ка)¥.дого
человека.

А теперь добавляем условие WHERE котору^о мы


для связывания двух запросов. только что написали ,
М ы создаем один больш ой зап р о с на выборку, котор ы й извлекает сведения
о тв еч ает на вопрос: «Кто зар аб аты вает больш е всех?» q заработке каждого
/ человека в таблице.

SELEC T m e . f ir s t_ n a m e , m e . la s t_ n a m e , " ^ jc . s a l a r y
FROM m y _ c o n ta c ts AS me NATURAL J O IN jo b _ e u r r e n t AS jc
W HERE jc .s a la r y =
(S E L E C T M A X (jc .s a la ry ) FROM jo b c u rre n t j c ) ;

Первая част ь, которая ст ала подзапро


сом для определения максимального зиа Майк? Я так и думал —
чения salary. Полученное значение и с п о л ь ­ он никогда не проверяет чеки.
зует ся для сравнения с внешней част ью
запроса для получения резул ьт ат а.

Mc.first_naM* mc.lasl_iiaiii* |с.>а1агу


Майк Скала 187000

дальш е ► 425
несколько способов и -т исан и я зап ио со е

Похоже, то же самое можно


было сделать и без подзапроса.

Верно, подзапрос — не единственное


решение этой задачи.
К тому ж е результату мож но бы ло прийти
с использован и ем естествен н о го внутреннего
соедин ени я и команды L I M I T . Как это часто
б ы вает в SQ L , задачу мож но реш ить несколь­
кими разны м и способам и.

ШТУРМ
Напишите другой запрос, который покажет, кто из знакомых
Грега больше всех зарабатывает.

Мне все равно,


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

Логично.
Тогда почему бы вам не о брати ться
к и нтервью на с. 430?

426 глава 9
подзапросы

Подзапрос как столбец SELECT


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

SELEC T m e.f 1r St_ n a m e , m e . 1 a s t_ n a m e


(S E L E C T s ta te

FROM z ip _ _ c o d e ^ - О пределяем
псевдоним для
W HERE m c .z ip _ c o d e = z ip _ c o d e ) AS s ta te столбца «sta te» .
FROM m y c o n ta c ts m e;

Наш анализ этого зап р оса начинается с подзапроса.


П одзап рос всего лиш ь устанавливает со о т вет ст ви е
по ч то во го индекса с об означением ш тата по таблице
zipjcode.
В упрощ енном виде зап рос делает следующ ее:
Подзапрос, исполь­
Перебрать все записи в таблице my_contacts. Для каждой
записи получить илля, дх1милию и штат (для чего запрос зуемый в качестве
получает почтовый индекс и сопоставляет его с обозначе­
нием штата по таблице zip_code). выражения столбца
Не забудьте, что подзапрос м о ж ет вернуть тол ько одно в команде SELECT,
зн ачен и е, поэтому при каждом его вы полнени и во звр а ­
щ ается одна запись. Результат выглядит прим ерно так. может возвращать
только одно значение
mc.f irst_nam *
Джо
■nc.lasl_name
Лонниган
•1а1*
■ ТХ
из одного столбца.
Венди Хиллерман СА
Шон Миллер NY
Джаред Колуэй NJ
Хуан Гарза СА

да л ьш е > 427
подзапрос с ест ест венны м соединением

Другой пример: подзапрос с естественным соединением


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

SELECT jc .s a la r y

FROM m y _ c o n t a c t s me NATURAL J O I N jo b _ c u r r e n t jc Запрос возвращает


одно значение —
WHERE e m a i l = 'a n d y 0 w e a th e r o r a m a .c o m ';
за р п л а т у Энди.

Грег зам ечает, ч то зап рос возвр ащ ает всего один результат.
В м есто то го ч то б ы получить зн ачение и подстави ть его
Э т о т запрос б у ­ в другой зап р о с, он реш ает п р еобр азовать его в подзапрос.
дет внутренним. Он пиш ет один зап р ос, которы й:
С использованием one
^ - п о л у ч а е т зарплату Энди; р ат ор а сравнения >.
— ср авн и вает ее с другими зарплатами;

— возвращ ает им ен а и фамилии лю дей, ко тор ы е зарабаты ­


ваю т больш е Энди. ^ ___ \
Запрос получается
■длинным, но он позволит У к о т о р ы х значение «sa la ry »
мне сравнить значение, б о л ь ш е , чем у Энди.
которого я пока не знаю,
с другими значениями Внеш ний запрос:
в базе данных.

:. f ir s t _ n a m e , m c .ia s t nam e, jc .s a la ry * ^

my contacts AS me NATURAL JOIN job current AS jc

> (ЗДЕСЬ БУДЕТ ЗАПРОС С ЗАРПЛАТОЙ ЭНДИ)

428 глава 9
подзапросы

НекоррелимВанный подзапрос Выборка имени,


фамилии
И так, все ком поненты собраны в о е­
и зарплат ы .
дино; зап р о с го то в. Сначала РСУ БД
однократно вы п ол н яет внутренний
зап р о с, а затем использует полу­
ч енное зн ачение для вы числения
результата внеш него зап р оса

РСУбД начинает выполне­


ние запроса с этой части.

Вывод данных толи?ко т ех


лю дей, у которых з а р п л а ­
т а выше чем у Энди.

Р С У 5Д обрабатывает эти
два запроса по отдельности.
Подзапрос получает
Н ебольш ая ч асть результатов. З ап р ос не содер­ -зар п ла т у Энди, которая
ж и т ORDER BY, поэтом у данны е не упорядочены . использует ся внешним Выполняется
запросом для сравнения у\ервыМ.
M c .f lr s t_ n a M * M c .ia c t n a n * i« .s a la r y
Гас Логан 46500
Брюс Хилл 78000 Автономный подзапрос,
Тереза Семел 48000
Рэнди
Джулия
Райт
М ур
49000
120000
не содержаищй ссылок
на данные внешнего
В се подзапр осы , к о тор ы е встр еч али сь нам до настоящ его
мом ента, были некоррелированными подзапросами. запроса, называется
Внутренний зап р о с об р абаты вается п ервы м , а полученный
результат используется в условии WHERE внеш него запроса. некоррелированным
Но внутренний запрос никоим образом не зависит от данных
внешнего запроса; его м ож но выполнить отдельно, как само­ подзапросом.
стоятельный запрос.
Внешний запрос обраба­
тывается вторым. Его (а если вы про и зн есет е ^
р езу л ь т а т ы зависят от с л о в а « н е к о р р е л и р о в а н н ы й

ВНЕШ Нии запрос значения, возвраи^енного подзапрос» в разговоре, это


внут ренним запросом. произведет большое вп е-
ил^ллАс.ние
чат ление нана собеседников).
в н у т р е н н и й запрос
не зави -
сыт от внешнего и выполня­
ет ся первылл.

дальше > 429


выбор запроса

о ч -к р о в м а д о '
О В © 191-
Интервью недели:
Выбор оптимального построения
запроса из нескольких вариантов
Head First SQL: Д обр о п ож аловать, SQ L . С паси­ И ногда Б А Х — и о тв ет готов! Главное — правиль­
бо, ч то не пож алели врем ени. М ы знаем , что дела но сп роси ть.
у вас идут непросто.
Head First SQL: Значит, все дело во врем ени по­
SQL: Н еп р осто?Теперь это так н азы вается? Я бы лучения ответа? Нужно вы би рать из эти х со о б ­
сказал, что ситуация крайне тр ево ж н ая, тяж елая ражений?
и плохо поддаю щ аяся объективном у анализу при
SQL: Ну конечно. В се дело в том , как сп роси ть.
крайней запутанности.
Я п р о сто пы таю сь о твети ть на ваши воп р осы ,
Head First SQL: Да уж... С об ствен н о , мы как раз когда они точ н о сф ормулированы.
об этом. Иногда приходится слы ш ать ж алобы
Head First SQL: С корость? В ней секрет?
на вашу чрезмерную ги бкость. Когда мы задаем
вам воп р о с, вы даете слиш ком много вари антов SQL: П ослуш айте, я вам подскажу: базы данных
ответа. Р А С Т У Т со врем енем . Ваш и во п р о сы долж ны
б ы ть как мож но прощ е, ч тобы для выдачи о твета
SQL: Д ей стви тельн о , я гибок. Один и т о т ж е на заданны й во п р о с мне при ходилось как м ож ­
во п р о с мне м ож но задать разны ми сп особам и — но м еньш е думать. Задавай те п р о сты е воп р осы ,
и я дам один аковы е о тветы . и я бы стр о отвечу на них.
Head First SQL: К ое-кто считает, что вам не хва­ Head First SQL: П он ятн о. А как определить,
та ет реш ительности. какой во п р о с п р остой , а какой — нет?
SQL: Н е стану оправды ваться. В ы меня вы став­ SQL: Н априм ер, п ер екр естн ы е соединения об­
л яете каким-то злодеем. рабаты ваю тся о ч ен ь долго. К орр ели рован н ы е
Head First SQL: Н ет, мы знаем , что это не так — подзапр осы то ж е не отличаю тся б ы стр отой ...
п р о сто вы немн ого... н еточны . Head First SQL: Ещ е что-нибудь?
SQL: ХА! Я — неточен ! С меня довольно, {встает) SQL: Н у..
Head First SQL: Нет, не уходите. М ы хотим Head First SQL: П ож алуйста, продолж айте.
всего лиш ь задать н есколько во п р о сов. Иногда
БЫ п о зво л я ете нам спраш ивать одно и т о ж е по-
SQL: Э ксперим ентируйте. И ногда лучше всего
со зд ать т е ст о в ы е таблицы , о п р о б овать разн ы е
разному.
зап р о сы и ср авн и ть врем я их обработки. Да,
SQL: И что в этом плохого? и соеди нени я об р абаты ваю тся эф ф екти вн ее под­
зап р о со в.
Head First SQL: Н и чего, мы п р о сто хоти м по­
нять, КАК И М Е Н Н О это нужно делать. Э то суще­ Head First SQL: С пасибо, SQ L . Н евер о ятн о ,
ствен н о , если о тв ет ы все равно одинаковы е? такая тайна — и вдруг...

SQL: Ну конечно, сущ ественно. И ногда мне при­ SQL: Ага. С пасибо, что не пожалели м оего
ходи тся очен ь долго думать, чтобы дать ответ. врем ени.

430 глава 9
подзапросы

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


циям, а затем объедините их в запрос с подзапросом.

^ Грег хочет узнать среднюю зарплату веб-разработчиков в своей таблице j ob_current.


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

Напишитезапросдля определения среднейзарплаты веб-разработчиковвтаблице


job_current.

а Грег желает знать имя, фамилию и зарплату каждого веб-разработчика в таблице


job_current.

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


втаблице job_current.

Используя среднюю зарплату (и немного математических вычислений) с подзапросом, Грег


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

Объединитедвазапроса.Используйтеподзапросвспискестолбцов select.

дальше > 431


практикум, ответ

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


ям, а затем объедините их в запрос с подзапросом.

^ Грег хочет узнать среднюю зарплату веб-разработчиков в своей таблице j ob c u r r e n t .


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

Напишитезапросдля определения среднейзарплаты веб-разработчиковвтаблице


job_current.
S ELECT AVG(saiary) FROM jo h _ cu rren t WHERE title = ' Be.5-разработчик';

__ Среднее значение вычисляется


функцией AV6J.

а Грег желает знать имя, фамилию и зарплату каждого веб-разработчика в таблице


jo b _ c u rr e n t.

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


втаблицеjob_current.

S ELECT mc.first_name, т с .last_name, Jc.salary

FROM my_contacts me NATURAL JOIN jo b_cu rren t jc

WHERE jc.title = 'Зеб=разработчик';

a , Используя среднюю зарплату (и немного математических вычислений) с подзапросом, Грег


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

Объединитедвазапроса.Используйтеподзапрос вспискестолбцовselect.
Нйш подзапрос.
S ELECT mc.rirst_name, т с .Iast_name, jc.salary, ^
,0^ ' *** ' ^
jc.salary — (SELEC T AVCi(satary) FROM jo b _ cu rren t WHERE title = 'Веб-разработчик')

FROM my_contacts m e NATURAL JOIN jo b_cu rren t jc

WHERE jc.title = 'Веб-разработчик';

432 глава 9
подзапросы

Некоррелированный подзапрос
с несколькими значениями: IN, NOT IN
В ер н ем ся к первому запросу, котор ы й был опробован Грегом на с. 17. Э то т
зап рос п озволил ему найти лю дей, долж н ости к о тор ы х совпадают с одной
из предлож енны х вакансий. З ап р ос б ер ет полный набор значений t i t l e ,
возвращ аем ы х командой SELECT в под зап р осе, и п р о вер я ет по этому набору
каждую зап и сь таблицы j ob c u r r e n t для поиска во зм о ж н ы х совпадений.

SELECT т с . f i r s t _ n a m e , me. l a s t _ n a m e , m e .p h o n e , jc .title

FROM j o b _ c u r r e n t AS j c NATURAL JOIN m y _ c o n t a c t s AS me

WHERE j c . t i t l e (SELECT t i t l e FROM j o b _ l i s t i n g s ) ;

^ Значение jc.title каждой записи проверяется


no всему набору, возвращенному подзапросом.

К л ю ч евы е слова NOT I N п о зво лят Грегу о то б р ать д ол ж н ости , отсутствующие


среди его вакансий. Эта конструкция б ер ет полный набор значений t i t l e , во з­
вращ енны х командой SELECT в п одзапр осе, и п р о вер я ет по нему каждую запись
таблицы j o b _ c u r r e n t . З ап р ос возвр ащ ает все зн ачен и я, от сут ст вующ ие в набо­
ре. Теперь Грег м о ж ет направить усилия на пои ск вакансий для этих д олж н остей.

SELECT т с . f i r s t _ n a m e , me. l a s t _ n a m e , m e .p h o n e , jc .title

FROM j o b c u r r e n t j c NATURAL JOIN my c o n t a c t s me

WHERE j c . t i t l e C ^ T I ^ (SELECT t i t l e FROM j o b _ l i s t i n g s ) ;

NOT IN возвращает долж ност и. о т су т -


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

некоррелированными под­
Такие зап р осы н азы ваю тся
запросами; ключевые слова IN или NOT IN п роверяю т
со о т вет ст ве н н о присутствие или о тсутстви е результатов Некоррелированный под­
внещ него зап р оса среди результатов подзапроса.
запрос при помопщ Ш или
\0Т Ш проверяет факт
ШТУРМ
наличия (или отсутствия)
Почему вместо подзапроса нельзя
просто ввести список значений? значений, возвращенных
подзапросом, в наборе.
д а л ьш е ► 433
подзапросы, уп р а ж н е н и е

Напишите запросы для получения ответов на следующие вопросы (используйте соеди­


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

Выведите все должности с зарплатой, равной наибольшей зарплате из таблицы jo b_listings.

ОшВетр на с. 436 -

г — — — — — — — — — — — — — — — — —

Выведите имена и фамилии людей с зарплатой выше средней.

^ О тпВртп ня Ґ 4 3 6 .

L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

г — — — — — — — — — — — — — — — — — ~1
Найдите всех веб-дизайнеров, у которых почтовый индекс (21р_сос1е) совпадает с почтовым
I индексом какой-либо вакансии веб-дизайнера из таблицы jo b_listings.

ОгоВеш на с. 4 3 7 -
J

Выведите список всех людей, у которых почтовый индекс (zip code) совпадает с почтовым
индексом человека, получающего максимальную зарплату.

ОгоБетп на с. ш
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ J

434 -jjiaea 9
подзапросы

iob_curreiit iob.desired iob_listings


contact id job_id

title title title


salary salary_low salary
start date salary_high zip
available description
years_exp

contact Jn te r e s I
contact_id ^

my_conlacts 0+?r interests

contact id interest_id interest id ©««■


profeasion interest
last name 0+r
prof_id 0’~ne
first name
profession
phone
contact_seeking
email
sip_code contact_id ^
gender
zip_code birthday 0 + jT seeking
city
prof _ id ' seeking_id ■seeking_id
state ■>
0+5Г seeking
zip_code I
states status id'
status_id 0— 'w- 1
status

дальше > 435


упражнение, реш ение

Напишите запросы для получения ответов на следующие вопросы (используйте


/ГфаЖНСНИб соединения и некоррелированные подзапросы там, где это уместно). Используйте
схему базы данных gregs_list.

Выведите все должности с зарплатой, равной наибольшей зарплате из таблицы j ob_listings.

Результ ат ы внешнего запроса сравни­


ваются со значением MAX(salary).
/ Подзапрос возвраш,ает
SELECT title FROM jobjistings ^ одно значение.

WHERE salary = (SELEC T MAX(salary)


FROM Jobjistinas);
MAX возвращает наиболь-
ш ую зар п л ат у в таблице.

Выведите имена и фамилии людей с зарплатой выше средней.

Внешний запрос получает р е з у л ь т а т п о д за ­


проса и возвращает записи, у которых «sa la ry »
больше вычисленного среднего значения.

SELECT mc.first_name, m c.lastjnam e


FROM my_contacts m e
NATURAL JOIN Jo b_cu rren t jc
WHERE jc.salary > (SELEC T AVG(salary) FROM job_curirent);
Ест ест вен но е со ед и ­
нение возвращает
(информацию о людях,
у которых з а р п л а т а ' Подзапрос возвращает
^
‘ ревы ш ает значение, средню ю зарплат у.
I возвращаемое вну-
I ‘^Р^нним запросом.

L __ __ __ __ __ __ __ __ __ __ — __ __ __ __

436 глава 9
подзапросы

Найдите всех веб-дизайнеров, у которых почтовый индекс (zip code) совпадает с почтовым индексом
какой-либо вакансии веб-дизайнера из таблицы job_listings.

Для получения полезной информации о найден-


HWX людях (им я, ф ам илия, т елеф он) необходимо
воспользоваться ест ест в ен н ы м соединением.

S ELECT mc.first_nam e, m c.ia stjn a m e, mc.pWone FROM my_contacts m e


NATURAL JOIN jo b _cu rren t jc WHERE jc.title = 'web designer' A N P mc.zip_code
IN (S E L E C T zip FROM jobjistings WHERE title = 'web d esigner“);

V V

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

Внешний запрос получает почтовые индексы


и иш,ет совпадения в таблице my_contacts. Так Средний подзапю
как средний подзапрос м о ж е т вернут ь более ‘почтовые индек
одного почтового индекса, мы и сп ол ьзу ем IN. с максималь^г,-
^ ^ои зар п л а т о й .

SELECT last_name, first_^name FROM my_contacts /


WHERE zip_code IN (S E L E C T mc.zip_code FROM my_contacts me
NATURAL JOIN jo b_cu rren t jc
WHERE jc.salary = (S E L E C T MAX(salary) FROM job_current));

Подзапрос с наибольшим уровнем вложенности


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

дальш е > 437


коррелированны е п одз а пр осы

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

Правильно. В модели с некоррелированным


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

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


в таблице i n t e r e s t для каж дого чел овека в m y _ c o n t a c t s ,
а затем возвр ащ ает имена и фамилии лю дей с трем я увле­
чениями.

SELEC T m e . fir s t_ n a m e , m e . la s t_ n a m e

FROM m y _ c o n ta c ts AS me
ПсевдонилА для my_contacts
W HERE
создается во внешнем запросе.
3 = (
SELEC T COUNT(*) FROM c o n ta c t in te r e s t
W HERE c o n ta c t id = m e .c o n ta c t id Чтобы значение mc.contact_
(■с( могло использоваться
) ;
в подзапросе и спользует ся во внут реннем запросе,
i^ceudoHuM me. сначала должен быть вы­
полнен внешний запрос.

П одзап рос зави си т о т внеш него запроса. О бр аботка внутреннего


зап р оса стан ет возм ож н ой тол ько п осле т о го , как внеш ний запрос
п редостави т зн ачение c o n t a c t _ i d .

В п одзапр осе используется псевдоним таблицы my c o n t a c t s — т с ,


котор ы й был создан во внеш нем запросе.

438 :плеа 9
подзапросы

Коррелированный подзапрос с NOT EXISTS


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

Д опустим, Грег х о ч е т расш ирить круг клиен тов сво ей службы поиска
работы . Д ля этого он соб и р ается р азосл ать сообщ ения всем людям
из my c o n t a c t s , данные к о тор ы х ещ е не со д ер ж атся в таблице
jo b_cu rren t. Д ля поиска запи сей он использует услови е NOT EXISTS.

SELECT me. first_n am e firstn a m e , m c.last_name lastnam e, me.email email

FROM nqr_contacts me EXISTS находит


д р а н н о й почть, т е х Т аТ ш ^ '
WHERE NOT EXISTS
6 настояи^ее время не предст авлгны Т которые
(SEI.ECT . jo b _ c u rre „ t J c ^

WHERE me. eo n ta e t_ id = j e . co n ta e t_ id ) ;

^ ^ л а 1е т ?
С оедините каждую ч асть приведен ного вы ш е зап р о са с описанием т о го , что она делает.

m e. f i r s t _ n a m e f i r s t n a m e Н азн ачает псевдоним для поля me. l a s t _ n a m e

WHERE NOT EXISTS


Если два значения c o n t a c t i d совпадаю т,
WHERE me. c o n t a c t _ i d = условие вы полнен о
j e . co n ta e t_ id Н азн ач ает полю псевдоним f i r s t n a m e
FROM m y _ e o n t a e t s me
В ы б и р ает все поля таблицы с псевдоним ом j с
m c .la st_ n a m e la stn a m e
Н азн ач ает полю псевдоним e m a i l
SELECT * FROM
jo b _ c u r r e n t j c И сти н но, если записи не найдены

m e .e m a il e m a il Н азн ач ает псевдоним для таблицы my e o n t a e t s

дальш е у 439
подзапросы и EXiSTS/NO T EXISTS

EXISTS u NOT EXISTS


П о аналогии с IN и NOT IN, в подзапр осах такж е м ож н о и с­
п ол ьзовать клю чевы е сл о ва E X IS T S и NOT EXISTS. П ри веден ­
ный ниж е подзапрос возвращ ает данны е из my c o n t a c t s ,
у котор ы х значение c o n t a c t i d по крайней м ере один раз
встр еч ается в таблице c o n t a c t _ i n t e r e s t .

SELECT me. first_n am e firstn a m e, me.last_name lastnam e, me.email em ail


Запрос с EXISTS находит, имена, ф ам илии и адреса э л ек т р о н -
FROM my_eontacts me почты людей из таблицы my_contacts, у которых значение
4—— ^ ^ c o n t a c t jd по крайней м е р е один раз вст речает ся в таблице
WHERE EXISTS
co n ta ctjn terest-
(SELECT * FRCM e o n ta ct i n t e r e s t c i WHERE m e.con taet id = e i.e o n t a c t id ) ;

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

me. f i r s t _ n a m e f i r s t n a m ' Н азн ач ает псевдоним для поля m e. l a s t _ n a m e

WHERE NOT EXISTS


Если два значения c o n t a c t _ i d совпадаю т,
WHERE me. c o n t a c t _ i d = условие вы полнен о
j c . c o n ta ct_ id Н азн ач ает полю псевдоним f i r s t n a m e

FROM m y _ e o n t a e t s me
В ы б и р ает все поля таблицы с псевдоним ом j е
m c.la st_ n a m e lastn am e
Н азн ач ает полю псевдоним e m a i l
SELECT * FROM
jo b _ e u rre n t j e И сти н но, если записи не найдены

m e .e m a i l e m a i l Н азн ач ает псевдоним для таблицы m y _ e o n t a e t s

440 глава 9
подзапросы

- д^Возьми в руку карандаш-------------------------------------------------------------------------------


Напишите запрос для получения адресов электронной почты
людей, которые имеют не менее одного увлечения, но при этом
отсутствуют в таблице j o b _ c u r r e n t .

ОшВете на с. 444.

дальше ► 441
успех подзапросов!

Слу)кба поиска работы Грега принимает заказы


Грег вполне освоился с выборкой данных с исполь­
зованием подзапросов. Он даже научился пользо­
ваться ими в командах INSERT, UPDATE и DELETE. Интересно, удастся ли
О О
мне найти своего перво­
Он снял небольшой офис и собирается провести ве­ го работника в таблице
черинку, чтобы отпраздновать начало нового дела. job_desiгed...

Часто
'^а Д а Б а е М ы е
B o n jb C b i

Б: Итак, подзапрос можно вложить в другой подзапрос? Подзапросы мне не нравятся, могу ли я использовать
вместо них соединения?
Безусловно. Количество уровней вложения подзапросов
ограничено, но в большинстве РСУБД оно значительно превы­ • в большинстве случаев — да, можете, но сначала необходи­
шает практический «потолок». мо еще кое-что узнать о соединениях...

• Как лучше всего строить подзапрос внутри подзапроса?

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


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

Найти самого высокооплачиваемого веб-дизайнера


Найти людей, зарабатывающих х

поспе чего подставить первый ответ на место х.

442 глава 9
подзапросы

По дороге на Вечеринку
Гре. о6„арр.и.ае. в газете с х .™ . с се„са„.....н.м за.оло.ко».

М Ш б в г е и

® [ г а ( Щ д !^ м а [ ^ < о ) © !? ^ ^
СКРЫ ТЫ Е СО ЕДИ Н ЕН И Я
С оседи утверждаю т, ч то п одзап р осы — «не ч то и н ое», как
об ы чн ы е соединения, и «...люди долж н ы узнать правду».

Трой Армстронг
Р еп о р тер ШЦиЕКУЕК

Д ей тави л ь — И сточники In q u eIy er подтвердили т о , ч то ч то


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

«Э то ужасно, — ры дает учительница Х ей ди М усгроув, — Как


я скажу детям , ч то п осл е в сех трудов по изучению подзапро­
со в , п осл е всего п отр ачен н ого на них врем ени они могли
п р о сто и сп о льзо вать соединения? Э то катастроф а!» Местная жительница Хейлли
Мусгроув узнает шокирующую
Тема будет продолж ена в следующ ей главе, где внещ ние правду о подзапросах.
зап р о сы ста 11ут предм етом п ристального внимания общ е­
ствен н о сти .

вы ходит мы только ЗРЯ ПОТРАТили ВРЕМЯ? и ПОДЗАПРОСЫ


НичТнЕОТДиЧАЮТСЯОТСОЕДиНЕНиЦ?
ОТВЕТ НА ЭТОТ ВОПРОС ВЫ УЗНАЕТЕ В СЛЕДУЮЩЕО ГААВЕ.
443
крат кий обзор sql

Новые инструменты Внешний запрос


В главе 9 вы овладели искусством Запрос, содержащий
построения подзапросов. Вспомните внутренний запрос (под­
СП то, что вы узнали в ней. Полный список запрос).
инструментов приведен в приложении III.
р»
®«УЧ>енний эахфос
Некоррелированным
Запрос, находящийся
подзапрос
Подзапрос, который с у ­ ШКЖе МОЖС!^
щ ест вует сам по cede
и не содержит ссылок на
данные внешнего запроса. Подзапрос
бАоженкый
*ОРРел»ф,

Подз, Й н у тр е н н и м

^озьми в руку карандаш ■


Решение Напишите запрос для получения адресов электронной почты
людей, которые имеют не менее одного увлечения, но при этом
Со с. 441. отсутствуют в таблице j o b _ c u r r e n t .

S E LE C T me.email FROM my_^contacts m e W HER E

EXISTS

(S E LE C T * FROM c o n t a c t jn t e r e s t ci W H E R E m c .c o n ta c t J D = ci.contactJP )

AND ----------
N O T EXISTS
в условии W HER E исп о л ьз у е т ся связка AND.
(S E LE C T * FROM jo h _cu rren t Jc

W H ER E m e .c o n t a c t jd = J c .c o n t a c t j d ):

444 глава 9
10 ^ н е Ш н и е с о е д и н е н и гг, с а м о с о е д и н е н и я и с о 1о 8 ь 1

Новые приемы

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


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

Уничтожение старых данных


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

Для получения этой информации можно


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

В неш ние соединения возвращ аю т все запи си одной из таблиц


в м есте со всем и соответствую щ и м и данными из другой таблицы.

При внутреннем соединен ии сравниваются записи двух таблиц,


причем порядок следован ия эти х двух таблиц неваж ен.

Д авай те в общ их ч ер тах посм отрим , что делает экви вален тн ое


соединени е. М ы получаем столбц ы , связан н ы е совпадени ем зна­
чений t o y i d в обеи х таблицах:

SELEC T g .g i r l , t .to y

FROM g ir ls g
IN N E R J O IN to y s t

ON g . t o y _ id = t . to y _ id ;

Эквивалентное
g ir ls соединение с р а в ­ to y s
нивает записи
gIrMd girl 1ву_М ЗИЛих двух та - lo y jd »•У
1 Джейн 3 олиц по з н а ч е ­ 1 обруч
2 Салли 4 ниям toy^id. 2 самолет
3 Синди 1 3 солдатики
4 губная гармошка
/ 5 бейсбольные
карточки
Иаили girl Юу 6 кубики
ре,зульт ат 01. Синди обруч 7 волшебный
Джейн солдатики экран
Салли губная гармошка 8 пружина

446 глаен "10


внеш ние соединения, самосоединения и союзы

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

Л е в о е внеш нее соединение (LEFT OUTER JOIN) п ереби ра­


нении для КАЖДОЙ
ет все записи левой таблицы и ищет для каждой соответ­
ствие среди запи сей правой таблицы. В ч астн о сти это
ЗАПИСИ ЛЕВОЙ табли­
удобно, когда между левой и правой таблицей сущ ествует
св я зь типа «один-ко-многим».
цы ищется соответствие
Ч тобы п он ять логику внеш него соедин ения, н еоб­ среди записей правой
ходимо понять, какая таблица находи тся «слева»,
а какая — «справа». таблицы.
В л евом внеш нем соединении таблица, следую­
щая после FROM, но Д О JOIN, сч и тается «левой»,
а таблица, следующая П О С Л Е JOIN, сч и тается
«правой».
Тадлии,а перед ключевыми с л о ­
вами левого внешнего соедине­
ния счит ает ся «левой».

Левая 1ллаблии,а

Аевое внешнее
„еЭкнении. ^

дальш е i 447
левое внеш нее соединение

пример левого Внешнего соединения


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

Н и ж е приведен си н такси с л ево го внеш него соеди нени я на при­


м ер е уже исп ользовавш и хся таблиц. Таблица g i r l s указана пер­
вой п осле FROM, поэтом у она сч и тается л ево й таблицей; далее
следуют кл ю чевы е сл о ва LEFT OUTER JOIN; и наконец, таблица
to y s сч и тается правой таблицей.

И т а к , лгвое внешнее соединение п ер еб ир а ет все


злписм левой таблицы (girls) м и щ е т для каждой с о ­
о т в ет ст в и е среди записей правой таблицы (toys).

SELEC T g . g i r l , t .to y
РРПМ r r i i - l « girls п р е д ш ест в у е т LEFT OUTER
g x r iS g < r j o i n , п оэт ом у она является левой.,.
LEFT OUTER J O IN to y s t

ON g . to y _ id = t .to y _ id ;

Таблица girls п р ед ш ест ву ет


l e f t o u t e r j o i n , поэт ому •й 1^аблии,а toys,
она является левой... следуюсцая зд LEFT
o u t e r JOIN, явля-
гт ся правой. V
g irls toys
g irijd вМ to y jd le y j d
1 Джейн 3 / обруч ^
2 Салли ----------- / сЗмаПе!
3 Синди ■ < ;о 3 / солдатики
........ —V 4 губная гармошка
5 / бейсбольные
карточки
Р е зу л ь та т левого внеш него ео ед (щ н и я 6 кубики
7 / волшебный экран
Результат т о т ж е, что и при внутреннем 8 / пружина
соединении.

fe y
■"^ИНДИ обруч
Р езул ьт ат Джейн солдатики
Салли губная гармошка

448 глава 10
внеш ние соединения, самосоединения и союзы

И все? Спрашивается, чего


мы добились? Выходит, внешнее
О о соединение ничем не отличается
от внутреннего.

Отличается: внешнее соединение возвращает запись


независимо от того, есть у нее совпадение в другой
таблице или нет.
О тсутстви е совпадений о б озн ач ается значен ием NULL. В нашем
прим ере с девочкам и и игрушками NULL в результатах означает,
что данная игрушка не прин адлеж ит никому из д евоч ек. О чен ь
ценная инф ормация!

Значение NULL в результатах левого


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

SELECT g . g i r l , t . toy
FROM toys t
LEFT OUTER JOIN g i r l s g
ON g . to y _id = t . to y _ id ;

(Подсказка. Таблица р езу л ьт а т о в


будет содерж ат ь 8 записей.)

дальш е ► 449
возьми в руку карандаш , реш ение

Р ^Jo3bMM в руку карандаш


^ \ш е н и е в этом запросе таблицы поменялись местами. Напишите, как,
по вашему мнению, будет выглядеть таблица результатов.

SELECT д . g i r l , t . toy
FROM toys t ^ — Аебдя таблица
LEET: OUTER JOIN g i r l s g
ON g .to y _ id = t .t o y _ id ; Лравая таблица

На э т о т раз каждая запись в таблице toys


(левая таблица) проверяет ся по таблице girls
(правая таблица).

Левая таблица Правая таблица

toys У g ir ls
lo y jfl toy gM Jd g irl l o y jd
1 обруч 1 Джейн 3
2 самолет 2 Салли 4
3 солдатики 3 Синди 1
4 губная гармошка
5 бейсбольные
карточки
6 кубики С изм ен ен ием порядка таблиц
7 волшебный экран изм еняет ся и р е з у л ь т а т
8 пружина
I
g iri le y
Если совпадение будет Синди обруч
найдено, р е з у л ь т а т NULL самолет
включается в таблицу. Джейн солдатики Столбцы в таблице
Если совпадение о т ­ Салли губная гармошка Р езу л ьт а т о в п о -
с у т с т в у е т , запись NULL бейсбольные
6 таблице все равно карточки В Ы 50Р К И . Этот
создается, но о т с у т - NULL кубики порядок не име~
ствуюш,ее значение NULL волшебный экран спл ничего общего г
зам ен яет ся NULL. NULL пружина л е в о й и ПРАВОЙ
<^аблицей соединения.

450 глава 10
внеш ние соединения, самосоединения и союзы

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

Результат левого внешнего соединения

giri 1*У
Джен водяной пистолет
Клео дудка
Мэнди NULL

Э т о Mbi еде -
Левая таблица лали за вас. Правая таблица

girls
q irU d girl to çiJd
г Джен 1
Z К лео Z
3 Мэнди 3

Эта задача
посложнее.
Запрос Результат левого внешнего соединения

giri toy
Jen водяной пистолет
Cleo водяной пистолет
NULL дудка
Sally пружина
Martha пружина

Левая таблица Правая таблица

дальш е у 451
упражнение, решение

Ниже приведены два результата. Напишите для каждого из них левый внешний
запрос, который мог бы привести к его созданию, а также таблицы g irls и toys
/пражнение с данными, соответствующими результатам.
'^еш енпг
Результат левого внешнего соединения
Запрос
вігі fy
S ELEC T g .g ir i t.toy Джен водяной пистолет
FROM girls g Клео дудка
Мэнди NULL
LEFT OUTER JOIN toys t
ON g .t o y jd - t.to y jd ; И груш ки, при
сутствуюш,ие.
Левая таблица Правая таблица
в р езульт ат ах.
toys
girls
to ц Jd toy
q ir ljd йМ t o y jd
г водяной п и ­
г Джен 1 ст о л ет
г К лео 2. 7. дудка
3 Мэнди 77 3

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


t o y j d , не су щ ест вую щ ее в т а б л и ­ ваю т на т о, что одна игрушка
це toys, п от ом у чт о в ст олбце toy ес т ь у нескольких девочек.
р езу л ьт а т а хранит ся NULL.
Запрос Результат левого внешнего соединения

SELEC T g.girl, t.toy вігі fo y


FROM toys t Jen водяной пистолет
NULL означает ,
Cleo водяной пистолет
LEFT OUTER JOIN girls g что ни у одной
NULL дудка
ON g .t o y jd - t.to y jd ; из девочек нет
Sally пружина
дудки.
Martha пружина

Левая таблица Правая таблица

toys girls
t o y jd toy cjirljd Ф'Н t o y jd
% водяной п и ­ И Джен г
ст о л ет г Клео 1
а дудка 3 Салли 3
3 пружина 4 М арт а 3

452 глава 10
внеш ние соединения, самосоединения и союзы

Внешние соединения и мно)кеетвенные совпадения


К ак видно из это го примера, запись в результирующем SELECT g . g i r l , t . t o y
н аборе со зд ается даж е при отсутстви и совпадений в FROM t o y s t
другой таблице, а при м н о ж ествен н ы х совпаден и ях бу­ LEFT OUTER JOIN g i r l s g
дет создан о несколько записей. В о т ч то прои сходи т при ON g . t o y _ i d = t . t o y _ i d ;
л евом внеш нем соединении:

toys g irls
lo y jd lo y flM Jd f e y jd
1 водяной пистолет- ------------ ^---------- •=>' Джен 1
2 дудка ■----- ----- 2---------- Клео 1
3 пружина — ---------- 3---------- Салли 3
--------- —-------- 4_______ -=-> Марта 3

З а п и с ь с в о д я н ы м п и с т о л е т о м ( t o y s ) с р а в н и в а е т с я с за п и с ь ю Д ж е н ( g i r l s ) : t o y s . t o y i d = 1,
g i r l s . to y _ id = 1
Есть совпадение.
З а п и с ь с в о д я н ы м п и с т о л е т о м ( t o y s ) с р а в н и в а е т с я с за п и с ь ю К л е о ( g i r l s ) : t o y s . t o y _ i d = 1,
g irls .to y _ id = 1
Есть совпадение.
З а п и с ь с в о д я н ы м п и с т о л е т о м ( t o y s ) с р а в н и в а е т с я с за п и с ь ю Салли ( g i r l s ) : t o y s . t o y id = 1,
g irls .to y _ id = 3
Нет совпадения.
З а п и с ь с в о д я н ы м п и с т о л е т о м ( t o y s ) с р а в н и в а е т с я с за п и с ь ю М а р т ы ( g i r l s ) : t o y s . t o y id = 1,
g irls .to y _ id = 3
Нет совпадения.
З а п и с ь с дудкой ( t o y s ) с р а в н и в а е т с я с за п и с ью Д ж е н ( g i r l s ) : t o y s . t o y _ i d = 2,
g irls .to y _ id = 1
Нет совпадения.
З а п и с ь с дудкой ( t o y s ) с р а в н и в а е т с я с за п и с ь ю К л е о ( g i r l s ) : t o y s . t o y _ i d = 2,
g irls .to y _ id = 1
Н ет совпадения.
З а п и с ь с дудкой ( t o y s ) с р а в н и в а е т с я с за п и с ь ю Салли ( g i r l s ) : t o y s . t o y id = 2,
g irls .to y _ id = 3 вігі ••у
Нет совпадения. Джен водяной
З а п и с ь с дудкой ( t o y s ) с р а в н и в а е т с я с за п и с ь ю М а р т ы ( g i r l s ) : t o y s . t o y id = 2, пистолет
g irls .to y _ id = 3 > Клео водяной
Нет совпадения. пистолет
Конец таблицы, создается запись с NULL. "
NULL дудка
З а п и с ь с п ружиной ( t o y s ) с р а в н и в а е т с я с за п и с ь ю Д ж е н ( g i r l s ) : t o y s . t o y i d = 3,
g irls .to y _ id = 1 Салли пружина
Нет совпадения. г Марта пружина
З а п и с ь с пружиной ( t o y s ) с р а в н и в а е т с я с за п и с ь ю К л ео ( g i r l s ) : t o y s . t o y _ i d = 3,
g irls .to y _ id = 1
Нет совпадения.
З а п и с ь с пружиной ( t o y s ) с р а в н и в а е т с я с за п и с ь ю Салли ( g i r l s ) : t o y s . t o y _ i d = 3,
g irls .to y _ id = 3
Есть совпадение.
З а п и с ь с пружиной ( t o y s ) с р а в н и в а е т с я с за п и с ь ю М а р т ы ( g i r l s ) : t o y s . t o y i d = 3, g i r l s . t o y _ i d = 3
Есть совпадение.

дальше ► 453
правое внеш нее соединение

Правое внешнее соединение


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

SELEC T g . g ir l, t . t o y select g.giri, t.toy


.ТЦуавая таблица.
FROM to y s t ^ ^ Левая таблица. ^ Л г б а я таблица.
R IG H T OUTER J O IN g ir ls g LEFT OUTER JOIN to y s t
Прябая
ON g . to y _ id = t.to y _ id ; ON g .t o y _ i d = t . t o y _ i d ;
таблица.

Э т о т запрос уже
приводился на с. 448.
В обоих запросах
таблица girls явля­
Левая таблица ет ся левой таблицей.
(в обоих запросах).
\ g irls
X ^
toys
запросах).

g ir ljd g irl lo y jd lo y jd le y
1 Джейн 3 1 обруч
2 Салли 4 2 самолет
3 Синди 1 3 солдатики
4 губная гармошка
5 бейсбольные
карточки
6 кубики
7 волшебный экран
8 пружина

giri Юу
Синди обруч
Наши Джейн солдатики
Салли губная гармошка

454 гпава 10
внеш ние соединения, самосоединения и союзы

часзпо
<аДаБаеМые
БоТ1р>Сь1

Есть ли причины для использования ле­ Если существуют ЛЕВОЕ и ПРАВОЕ


вого внешнего соединения вместо правого? внешние соединения, то существует ли со­
единение, возвращающее результаты левого
Заменить ключевое слово LEFT ключевым и правого соединений?
словом RIGHT проще, чем изменять порядок
таблиц в запросе. Достаточно изменить всего ! В некоторых (но не во всех) РСУБД
одно слово — вам не придется переставлять существуют такие соединения, называемые
имена таблиц и их псевдонимы. ПОЛНЫМИ внешними соединениями. Они не
поддерживаются в MySQL, SQL Server и Access.
С другой стороны, на практике обычно бывает
проще всегда придерживаться одного типа
(скажем, левых внешних соединений) и менять
местами таблицы. В этом случае код получает­
ся более понятным.

дальше > 455


соединение т аблицы с собой

Нельзя ли воспользоваться внешним


соединением для того, чтобы связать
таблицу с ней самой? Иногда это мо­
жет быть полезно.

Одна и та же таблица может


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

Н о сначала н еобходи м о р азобр аться с одной


проблем ой, котор ая возникла в Д ей тави ле...

456 глава 10
внеш ние соединения, самосоединения и союзы

Пока мы занимались Внешними соединениями...


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

П еред вами пример новой иерархии


клоунов. У каж дого клоуна и м еется один
начальник (кром е сам ого главного клоу­
на, М и стер а С ниф лза).

П еред вами текущая схем а базы данных.


Д авай те подумаем, как лучше внедри ть
в нее новую информацию.

deccripfieii info_aclivifie« activities


id 4- ■> id activity_id
clown info
gender activity_id activity
id
description
name
when

location
infojocalion
location id

location id location

when
UTVPM
Как изменить структуру схемы,
чтобы сохранить в базе дан­
Вам смешно, наде­
ных информацию об иерархии
юсь? Ведь я же клоун...
клоунов?
Смешно, спрашиваю?

Снифлз. начальник
\Слара6елл u С н а г л з ^

да л ьш е ► 457
добавление т аблицы clown_boss

Создание новой таблицы


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

10 Мистер Снифлз

5 Кларабелл 3 Снаглз

^ 7 Зиппо О ^ Элси
8 Бэйб 2 Пиклз 0 Скутер 4 Мистер Хобо
9 Бонзо '

В н овой таблице для каж дого клоуна указан иденти­


ф икатор его начальника из таблицы с1 о ы п _ 1 п £ о .

c lo w n b o ss
М ежду таблицей с 1 о к п _ Ь о з з и табли­
id цей с1 о ;^ п _ 1 п £ о сущ ествует св я зь типа
b o s a jd
1 3 «оди н-к-одному ».
2 5
3 10
4 3
5 10
б 3
7 3 У М ист ера Снифлза нет начальни­
8 5 ка, но идент иф икат ор ему нужен.
9 5 В столбце « b o s s j d » будет указан его
10 10 собственный и д ен т и ф и к а т о р , ч т о ­
бы избеж ат ь значения NULL в эт о м
столбце.

458 глава 1C
внеш ние соединения, самосоединения и союзы

Место новой таблицы в схеме


П о см отр и те на текущую схему базы данных. Как лучше
встр о и ть в нее новую таблицу?

descri ption info_activllles activities


id 4- ■> id activity_id
clewn info
gender activity_id activity
id
when
name

infe location iocatien


clewn boss location_id
■> i d ^ - T r
id О—яг
location id location
Ь055 id
when

Ситуация немного странная. В схем е во зн и к ает связь


типа «один-к-одному» с 1с1 (первичн ы й клю ч) и связь
типа «один-ко-многим» с Ь о зз_ 1 с1 . И п ерви чны й клю ч,
и внеш ний ключ находятся в таблице с1окп_±п£о.

Похоже, мы можем воспользоваться таблицей


со связью «один-к-одному». Но раз таблица
не содержит закрытой информации, нельзя ли
встроить эти данные в основную таблицу?

ШТУРМ
Можно ли хранить информацию об иерархии
клоунов без создания отдельной таблицы?

459
реф лексивны й внеш ний ключ

Рефлексивный Внешний ключ


В таблицу c l o w n i n f о следует д обави ть новы й столбец
с инф ормацией о том , кто я вляется начальником т о го или
иного клоуна. В новом сто лб ц е будет хран и ться идентиф и­
катор начальника. М ы назовем его b o s s id , как в таблице
c lo w n _ b o s s .

в таблице c lo w n _ b o s s столб ец b o s s i d был внеш ним


клю чом. П ри добавлении в c l o w n _ i n f о э т о т сто л б ец все
равно о стается внеш ним клю чом, х о тя и н аходи тся в другой
таблице. Такие внеш ние ключи, ссы лаю щ и еся на другое поле
той ж е таблицы , н азы ваю тся рефлексивными.

М ы счи таем , ч то М истер Сниф лз я вл я ется свои м со б ствен ­


ным начальником, поэтому у него зн ачен и е b o s s i d совп а­
дает c i d .

Рефлексивным внешним ключом н азы вается первичный


ключ таблицы , используемый в той ж е т аблице для другой цели. РЕФЛЕКСИВНЫЙ внеш-
ний ключ — первичный
Новый столбец, «Ьо59_!с(>: ключ таблицы, исполь-
который мы прост о
добавили в таблицу зуемый в той же таблице
clow nJnfo. В столбце
хранится рефлексивный для других целей.
внешний ключ.

clown in fo
id nan* Ь е *о < | < - По ссылке на поле « i d »
1 Элси 3 в т ой же таблице
2 Пиклз 5 Можно о п р е д е л и т ь ,
3 Снаглз 10 кто из клоунов яв­
4 Мистер Хобо 3 ляет ся начальником
5 Кларабелл 10 Элси.
6 Скутер 3
7 Зиппо 3
8 Бэйб 5
9 Бонзо 5
И снова в столбце « b 0S S Jd »
10 Мистер Снифлз М ист ера Снифлза^хранит-
-----------
ся его собственный иден­
тификатор.

460 глава 10
внеш ние соединения, самосоединения и союзы

Соединение таблицы с ней самой


Д опустим, мы хоти м вы вести сп и со к в се х клоунов и их начальни­
ков. С пи сок всех клоунов с идентиф икаторами начальников легко
вы вод и тся зап р осом SELECT:

SELECT nam e, b o ss _ id FROM c l o w n _ i n f o ; nan* Ь ом


Элси Снаглз
H o нам нужны пары имен клоуна и его начальника.
Пиклз Кларабелл
Снаглз Мистер Снифлз
Мистер Хобо Снаглз
Кларабелл Мистер Снифлз
Скутер Снаглз
Зиппо Снаглз
Бэйб Кларабелл
Бонзо Кларабелл
Мистер Снифлз Мистер Снифлз

Имеются две идентичные таблицы, c l o w n _ i n f o l и c l o w n _ i n f o 2 .


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

clown in f o l clown in£o2

М н аш * b«>a_id id n am * b«ss_i<>
1 Элси 3 1 Элси 3
2 Пиклз 5 2 Пиклз 5
3 Снаглз 10 3 Снаглз 10
4 Мистер Хобо 3 4 Мистер Хобо 3
5 Кларабелл 10 5 Кларабелл 10
6 Скутер 3 6 Скутер 3
7 Зиппо 3 7 Зиппо 3
8 Бэйб 5 8 Бэйб 5
9 Бонзо 5 9 Бонзо 5
10 Мистер Снифлз 10 10 Мистер Снифлз 10

дальше > 461


возьми в руку карандаш, решение

- ^ Возьми в руку карандаш


'ешение Имеются две идентичные таблицы, с 1 о к п _ 1 п £ о 1 и с 1 о н п _ 1 п £ о 2 .
Напишите соединение для получения таблицы результатов с имена­
ми каждого клоуна и его начальника.

clown in f o l clown in fo2

ы name b e s s jd id name bes*_id


1 Элси 3 1 Элси 3
2 Пиклз 5 2 Пиклз 5
3 Снаглз 10 3 Снаглз 10
4 Мистер Хобо 3 4 Мистер Хобо 3
5 Кларабелл 10 5 Кларабелл 10
б Скутер 3 6 Скутер 3
7 Зиппо 3 7 Зиппо 3
8 Бэйб 5 8 Бэйб 5
9 Бонзо 5 9 Бонзо 5
10 Мистер Снифлз 10 10 Мистер Снифлз 10

чтойи м

SELEC T c l . n a m e , cZ .n a m e AS boss HUM «boss».


FROM c l o w n j n f o l c l
INNER JOIN ciow nJnfoZ cZ
ON c l . bossJ d - cZ.id;

Здесь проверяет ся со вп а ­
дение « b o s s j d » из таблицы
clo w n Jn F o l с « i d » из т а ­
блицы clow nJnfoZ.

462 глава 10
внеш ние соединения, самосоединения и союзы

Потребуется самосоединение
В только ч то вы полненном упражнении одна таблица
и сп ользовалась дважды. Н о в норм ализован ной базе
clown In fo
не м ож ет бы ть двух копий одной таблицы . В м есто этого
для имитации соединения двух таблиц и спользуется само­ id n am * bes«J<i
соединение. 1 Элси 3
2 Пиклз 5
Этот запрос очень похож на предыдущее задание, но 3 Снаглз 10
имеет существенное отличие. 4 Мистер Хобо 3
5 Кларабелл 10
6 Скутер 3
7 Зиппо 3
SELEC T c l.n a m e , c 2 .n a m e AS b oss 8 Бэйб 5
9 Бонзо 5
FROM c lo w n _ in fo c l
10 Мистер Снифлз 10
IN N E R J O IN c lo w n _ in f o c2
ON c l.b o s s id = c 2 .id ; Тй(5лицд clo w n jn fo использует ся
0бажды, с синонимами c l (о т к ц -
да берет ся bossjd) и cZ (о т щ д а
дерет ся имя начальника).

В м есто двух идентичны х таблиц мы используем


clown_inf о дваж ды ; сначала с псевдоним ом с 1 , а за­
тем с псевдоним ом с2. Д алее столбец Ь о зз _ 1 с 1 (из с 1 )
св я зы вае тся с именем начальника (из с 2 ) поср ед ством
вну'греннего соединения.
Данные столбца образуются вни-
• п^ренним соединением bossJd первого
экземпляра таблицы clownjnfo ( c l )
name boas и и м ен ем начальника, которое
Элси Снаглз дерет ся из таблицы clownjnfo (cZ).
Пиклз Кларабелл
Снаглз Мистер Снифлз
Мистер Хобо Снаглз
Кларабелл М иаер Снифлз При самосоединении запрос
Скутер Снаглз
Зиппо Снаглз к одной таблице строится так,
Бэйб Кларабелл
Бонзо Кларабелл как если бы она была двумя
Мистер Снифлз Мистер Снифлз
таблицами, содержащими
орнаковую информацию.
дальше > 463
использование союзов

Другой способ получения многотабличной информации

Я пытаюсь построить полный список


всех должностей, встречающихся в gгegs_list.
Как узнать, какие должности встречаются
во всех трех таблицах?

Три таблицы , о котор ы х го вор и т Грег.

^ocmynHbic,
Работа, которую вакансии.
-ГекуЩйЯ
работа- ^ и щ у т п р ет ен дент ы
I
|*b_CH rr«iit ieb_d«sir«d ieb jislin g*
contact idO— яг contact id 0“^ job idO— >r
^ S - ir
title title title
salary salary low salary
start date salary high zip
available description
years exp

П ока он написал три отдельны е команды SELECT:

SELEC T t it le FRO M jo b _ c u r r e n t;

SELEC T t it le FROM jo b _ d e s ir e d ;

SELEC T t it le FROM jo b _ lis t in g s ;

Команды работаю т, но Грег х о ч е т объеди нить результаты в одном


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

464 глава 10
внеш ние соединения, самосоединения и союзы

Союзы Ддннме
Данные
С ущ ествует ещ е один сп особ получения из job_curtrev^
из job_desired.
объединенны х результатов таблиц — так на­
зы ваем ы е со ю зы (клю ч евое сл о во UNION) .

С ою з объеди н яет в одну таблицу резуль­ U N IO N


таты двух и б олее зап р о со в на основании обьединяет
того , ч то указано в зап р о се SELECT. С ою зы
м ож но тр актовать как «пересекаю щ иеся» 1МЫ з а п р о ­
значения всех зап р осов. сов S E L E ^
ко беем тс
блица/Л-

SELECT t i t l e FRC»4 jo b _ cu rre n t UN IO N


^объединяет
UNION р езу л ьт а т ы Данные
и з jobjistings-
SELECT t i t l e FROM jo b _d esired эт их т р ех разных
DNKMI ' запросов в одну
обш,ую таблицу
SELECT t i t l e FRCM j o b _ l i s t i n g s ; результатов- litle
Бухгалтер
Небольшая часть Адвокат
сот ен должностей, Программист
п р и су т с т в у ю щ и х ’ Веб-дизайнер
Грег зам ечает, что в результатах нет дубли­ в об-ьединенных V Менеджер
катов, однако долж н ости п ереч и слен ы не Р езу л ь т а т а х из Шеф-повар
по порядку, поэтому он п ы тается п о вто ­ т р е х таблиц. Психолог
ри ть зап р о с с добавлением условия ORDER Парикмахер
BY в каждой команде SELECT. Учитель

SELECT t i t l e FROM jo b _ cu rre n t ORDER BY t i t l e


UNION
SELECT t i t l e FROM jo b _d esired ORDER BY t i t l e Грег добавил ORPER BY
6 кджЭую команду, и т о -
UNION бы должности в таблице
SELECT t i t l e FRC»i jo b _ lis tin g a ORDER BY t i t l e ; резу л ьт а т о в были упо
рядочены по алфавиту.

ШТУРМ
Как вы думаете, что произошло при выполнении нового
запроса?

дальш е > 465


правила союзов

Ограничения союзов
Запрос Грега не сработал! РС У БД вы дала сообщ ен ие об ош иб­
ке, потому что она не знала, как и н тер п р ети р овать м ногократ­
ное п овтор ен и е ORDER BY.

При и спользовании UNION допускается только одно услоние


ORDER BY в конце к о м а н д ы . Э то о б ъясн яется тем , что сою з
объединяет и группирует результаты н ескольки х команд
SELECT.
Е сть м ногое на св ет е, ч то вам следует зн ать о сою зах.

\(,о 5екс союзов 8 SQL


Кодекс союзов 6 SQL
По умолчанию SQL исключа­
Количество столбцов ет дубликаты из результатов
в командах s e l e c t д о л ж н о
союзов
быть одинаковым. Нельзя
выбрать два столбца одной
командой и еще один столбец Типы данных в столбцах долж­
другой. ны либо совпадать, либо быть
совместимыми.

Команды SELECT должны со­


держать одинаковые выраже­ Если вы по какой-то причине
ния и агрегатные функции. ХОТИТЕ получить список со
всеми дубликатами, исполь­
зуйте оператор UNION ALL.
Команды SELECT могут сле­ Он возвращает все совпадения,
довать в любом порядке; на не только уникальные.
результаты это не влияет.

466 глаеа 10
внеш ние соединения, самосоединения и союзы

Правила союзов в действии


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

В каждой команде, SELECT


должно использоваться оди ­
aoaohoO.
наковое количество столбцов. ^

SELEC T ( titl^ F R O M jo b _ c u r r e n t
U N IO N

SELEC T FROM jo b _ d e s ir e d
U N IO N
SE LEC T ( ^ it ^ F R O M jo b _ lis t in g s

ORDER BY t i t l e ;

Если вы х о т и т е упорядочить р езу л ь т а т ы ,


включите ORDER BY за последней из объединяе­
мых команд SELECT. Это п риведет к упорядоче
HUho всего списка результ ат ов.

titi* Резил^^таты, KomoptPie наМ


Адвокат хот елось бы получить^
Клоун выглядят примерно так.
Механик
Нейрохирург
В этом прим ере все три столбца о тн о сятся к одному
Парикмахер
типу данны х VARCHAR. В результате столбец , во звр а­
Пекарь
щ аемый зап росом , т о ж е о тн о си тся к типу VARCHAR.
Психиатр
Психолог
Тренер
Ювелир
UiTVPM
Как вы думаете, что произойдет, если объ­
единяемые столбцы относятся к разным
типам данных?

дальше ► 467
U N IO N ALL

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

SELEC T t it le FROM jo b _ c u r r e n t

U N IO N A LL
Нд 31^01^ раз Mt>i SELEC T t it le FROM jo b _ d e s ir e d
х о т и м получит ь бее
значения, краняш,иг- U N IO N ALL
ся б столбцах « tit le »
всех т р ех таблиц- SELEC T t it le FROM jo b _ lis tin g s

ORDER BY t i t l e ;

title
Адвокат в э т о м списке одна до л ж ­
Адвокат ност ь м о ж е т вст речат ься
несколько раз-
Клоун
Механик
Нейрохирург
Нейрохирург Д о настоящ его м ом ента в наших со ю зах ис­
Нейрохирург пол ьзовал и сь столбц ы с совпадаю щ им типом
Парикмахер данны х. О днако в н екото р ы х ситуациях м ож ет
Парикмахер возникнуть н еобходи м ость в создании со ю за
из разн оти п н ы х столбц ов.
Пекарь
Психиатр Когда мы говорим , что типы данны х долж ны
б ы ть со вм ести м ы друг с другом, это означает,
Психолог
что при необходи м ости их м ож но при вести
Психолог
к общему типу; а если это го сделать не удастся,
Психолог вы п олнени е зап р о са при ведет к ош ибке.
Психолог
Д опустим , в со ю зе тип INTEGER объедин яется
Тренер
с типом VARCHAR. Так как данные VARCHAR
Ювелир нельзя п р ео бр азо вать в целое чи сло, в полу­
ченны х результатах тип INTEGER будет преоб­
разован в VARCHAR.

468 глава 10
внеш ние соединения, самосоединения и союзы

Создание таблицы на оснобе еоюза


Ч тоб ы узнать, какой тип данны х будет возвращ ен в со ста в е сою за, н еобхо­
димо каким-то образом сохр ан и ть эти данные. Команда CREATE TABLE AS
п о зво л я ет сохран и ть результаты и проан али зи ровать их б олее подробно.

Команда CREATE TABLE AS получает результаты зап р оса S E L E C T и стр о и т


на их о сн о ве таблицу. В следующ ем прим ере данны е со ю за столб ц ов t i t l e
разм ещ аю тся в н овой таблице с именем m y _ u n io n .
Уже знакомый
Имя новой таблицы. союз.Таблица
может со з­
даваться на
CREATE TABLE m y _ _ u n io n AS
основе любых
SELEC T t it le FRO M jo b _ c u r r e n t U N IO N команд SELECT.

SELEC T t it le FRO M jo b _ d e s ir e d

U N IO N SELEC T t it le FROM jo b _ lis t in g s

- ^озьми в руку карандаш

Создайте союз из столбцов c o n t a c t _ i d (таблица j o b _ c u r r e n t )


и s a l a r y (таблица j о Ь _ 1 i s t i n g s ) .

Как вы думаете, к какому типу данных будет относиться результат? Напи­


шите команду CREATE TA B LE AS для сохранения результатов союза.

Выведите описание таблицы командой DESC и проверьте правильность


своего предположения.

QjnBero на с. 479.

дальше > 469


INTERSECT и EXCEPT

INTERSECT u EXCEPT
Конструкции INTERSECT и EXCEPT, в отличие Ь .....................................................
^ Эти две операции
от UNION, используются для поиска перекры­
)УДЬ11^ I НЕ ПОДДЕРЖИ-
вающихся результатов запросов.
осщорэжны! ВАЮТСЯ в MySQL.
INTERSECT возвращает данные из результатов
первого запроса, которые также присутствуют
во втором запросе.

Данные j o k c u r r e n t Айннме job_desired.


SELECT t i t l e FROM jo b _ cu rren t
INTERSECT
SELECT t i t l e FROM jo b _ d e sired ;

Чтобы данные были


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

/\аниые job.xuirrent. Данные job_desired.


SELECT title FROM job_Current N e'
EXCEPT
SELECT t i t l e FRCai jo b _ d e sired ;

Данные, вст речаю щ иеся


в обеих т аблицах, исключа-
указанной после кл', ■ к.^'лся из р е з у л ь т а т о в .
слова EXCEPi

470 гл.ава 10
внеш ние соединения, самосоединения и союзы

С союзами разобрались, пора переходить к...


Погодите, так же нельзя.
Вы сказали, что союзы и подзапросы дела­
ют одно и то же. Это нужно доказать.

(Э ээ.... То есть мы имели в виду...)

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


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

с ПООІЛГЩЗГіСвии

Подзапросы Д ба запроса преобразуются 8 запрос с подзапросом


Чтобы сдслать 1Ч>. что делается двуш запросами, всего в одном запросе, 1>бъединвем два запроса в один. Пер-
нам понадобится включить в него подзапрос. второй - внутренним.
Второй запрос, в котором извлекшотся совпадения нэ таблицы
p r o f e s s io n s , мы назовем ВНЕОШИМзапросом, потому что в него «упако­
ван- друп)й, ВНУТРЕННИЙ запрос. Давайте посмотрим, что происходит.

+ < ia a ip
— З м ^ е яо^зсй^еом

Згі-
no, .isc.la*t_natBe, и с .phone, J c . e it l*
пре$раіцс,ю^^,.^
QV1 ^ tf 3‘г^рос с ^o:hanpoc.OA
і гаон job _current S j c HhTOBAb JDIH By^oontacta AS me

SELECT me.first_name, me.l a


\ / J c . t i t l e IN ( •
FROM job_current AS jc NATURAL JOIN my_contacts AS
\Л ^ WHERE jc.title IN (SELECT title FRCW job_liatings)
диештіі ianvoc.
гчл^оса. /
■ряв OVJlMetV' бгіиглрег'М.'-М

Все профессии из списка в скобках Г)ыли получены в резуль­


тате первого запроса - того, который выбирал все вакантные
Подзапрос представля­
должности из таблицы jo b _ c u r r в n t. Таким образом (будьте
книмагелыш. это тонкий момент[). мы можем заменить эту
ет собой запрос, <<упа- Результаты, иолученныо ири вынолнеЕнш этого
часть внешнего запроса часты » первого запроса. Он по- запроса, и точности совпадают с ре.^льгатами
прсжяему в«рвет результаты, п ерсчислеввы е в скобках. ковапный>> в другом ири явном перечислении всех ааканшв в условии
WHERE, но набирать приходится намного мсныое. и же hv всего
запросе. Также оп мо­ оені‘м ^anaorcubf
жет называты'я <<впу- ■ u .ttM t ш т в m J m Aj m h m м « .*1м м
Лхо Лонниган 555) 555-3214 Поеао
треппим запросом». аенди Хилперман 555)555-8976 Официант
SEL8CT t i t l e FROM jo b _ ll« t» n g a Шон Милтр 555)555-4443 Веб-дизайн»
*‘.е>т&го ia-r^cc^ Джэоед KOftVX* 555)555-5674 Веб-разработчик
XvdH Гарза 555)555-0098 Веб-рааработчик
лпдіап}зос,

да л ьш е * 471
использование соединений в м е ст о подзапросов

Преобразование подзапроса 6 соединение


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

SE L E C T m e .f i r s t _ n a m e , m e .l a s t _ n a m e , m e .p h o n e , j e .title
F R O M j o b _ e u r r e n t AS je N A T U R A L J O I N m y _ e o n t a e t s AS m e
W H E R E je . t i t l e IN (SELECT title F R O M job listings)

/
П р и в ы п о л н е н и и запроса бы л п о ­ Внутренний
л у ч е н с л е д у ю щ и й результат. запрос.

■HC.firsl_nain* inc.la«l_naiN * m c.p h e n * i c .l i l l *


Джо Лонниган (555) 555-3214 Повар
Венди Хиллерман (555)555-8976 Официант
Шон Миллер (555)555-4443 Веб-дизайнер
Джаред Колуэй (555)555-5674 Веб-разработчик
Хуан Гарза (555)555-0098 Веб-разработчик

- ^ Возьми в руку карандаш


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

SELECT т с .first_name, me.last_name, me.phone, jc.title

FROM job_current AS jc NATURAL JOIN my_contacts AS me

INNER JOIN job_listings jl Секцию WHERE с п одза­


просом можно з а м ен и т ь СП
ON jc.title = jl.title;
внут ренним соединением.

Объясните, почему конструкция IN N E R J O I N этого запроса во звращ ает те ж е результаты, что и подзапрос.

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

472 глава 10
внешние соединения, с а м о с о е д и н е н и я и союзы

Я написал уже немало подзапросов.


Нужно ли переписать их все в виде
соединений?

Нет — если все подзапросы


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

Беседа у камина Соединения и подзапросы >к т о лучше?

Соединение Подзапрос
Б езусловно, я лучш е п о д хо ж у для б ол ьш ин ства
ситуаций. М еня прощ е п о ня ть и я о б ы чно вы ­
п о л н я ю с ь н а м н о го б ы с тр е е , ч е м ка ко й -н и б у д ь
П р о с т и т е , э то к т о «стары й»? В о м н о ги х Р С У Б Д
ста р ы й подзапрос.
я не п о д д е р ж и в а л с я д о п о с л е д н е го в р е м е н и .
М еня приш л ось Д О Б А В И Т Ь , потом у ч то м но­
ги е п р о гр а м м и с т ы х о те л и р а б о та ть со м н о й .

И без вас п р е кр а с н о о б х о д и л и с ь . П р е ж д е все­


К о го вы п ы та е те сь обм ануть? П о д и р а зб е р и сь
го , м е н я п р о щ е п о н я т ь .
в ваш их В Н У Т Р Е Н Н И Х и В Н Е Ш Н И Х соедине­
н и я х . Н а п у с т и л и т у м а н у ...

К т о бы го в о р и л — ка к на сче т ваш их К О Р Р Е ­
ЛИ РО ВАН Н Ы Х и НЕКОРРЕЛИРОВАННЫ Х
Х о р о ш о , у нас о б о и х есть св о й ж а р го н ; это
разновидностей?
правда. Н о со м н о й м о ж н о сначала в ы ч и с л и ть
в н у т р е н н ю ю ч а с т ь , а у ж е п о т о м о т д е л ь н о за­
няться внеш ней.

|ІJ>oДoЛЖeнue на следу1°шей ап]’ аниЦе.

да л ьш е ► 473
беседа у кам и н а

Беседа у камина
Сегодняшняя шехяа: соединения
U подзапросы. К то лучше?

Соединение Подзапрос
Д а л е к о н е в с е гд а , м и с т е р К О Р Р Е Л И Р О В А Н ­
Н Ы Й П од за п р о с. Н о п о ка д овол ьн о об этом .
Я л у ч ш е п о д х о ж у , ко гд а в р е зул ьта та х д о л ж н ы
п р и сутств о в а ть сто л б ц ы и з н е с ко л ь ки х таблиц.
Б олее т о го , я — е д и н ств е н н о е р е ш е н и е для п о ­
д о б н ы х случаев.
Д а , и и м е н н о п о э т о м у у вас н е л а д ы с а гр е га т ­
н ы м и ф у н кц и я м и — и х нельзя и сп о л ьзо ва ть в
у с л о в и я х WHERE б е з п о д з а п р о с а . С о г л а с и т е с ь ,
это о тч а сти ко м п е н си р уе т за п р е т на возвращ е­
н и е н е с к о л ь к и х сто л б ц о в . В ы созд аете с л и ш ко м
м н о го тр уд но сте й.

М о ж е т, это и правда, н о разобраться в то м , ч то


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

Д а, насчет псевд оним ов — м не каж ется, что о н и


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

Э э э ... в е р н о . Н о я з н а ю к а к м и н и м у м о д н о , ч т о
о т л и ч а е т м е н я о т вас. Я м о гу и с п о л ь з о в а т ь с я
в к о м а н д а х UPDATE, I N S E R T и D E L E T E .
Тож е м не достиж ение.

474 гл ава 10
внешние соединения, с а м о с о е д и н е н и я и союзы

Возьмите запросы с подзапросами из главы 9 и посмотрите, что лучше — переписать


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

Выведите все должности с зарплатой, равной наибольшей зарплате из таблицы job lis tin g s .

SELECT title FROM j o b _ l i s t i n g s WHERE s a l a r y = (SELEC T


M A X (sa la ry ) FROM j o b lis tin g s );

Решение с подзапросами удобнее?

Выведите имена и фамилии людей с зарплатой выше средней.

SELECT т с . first_ n a m e , m c .la s t_ n a m e FROM m y _ c o n t a c t s me


NATURAL J O I N jo b _ c u r r e n t jc WHERE j c . s a l a r y > (SELEC T
A V G (sa la ry ) FROM j o b _ c u r r e n t ) ;

Решение с подзапросами удобнее?

да л ьш е ► 475
упражнение, р еш е н и е

Возьмите запросы с подзапросами из главы 9 и посмотрите, что лучше — переписать


НЖНСНКб заново с использованием соединений или оставить подзапросы.

реш ение

Выведите все должности с зарплатой, равной наибольшей зарплате из таблицы job lis tin g s .

SELECT tit le FROM j o b _ l i s t i n g s WHERE s a l a r y = (SELEC T


M A X (sa la ry ) FROM j o b _ l i s t i n g s ) ;

S ELECT title FROM jobjistings


ORDER BY salary DESC LIMIT X:

Чтобы запрос возвращал только одну


запись — с наибольшей зарплатой.

Решение с подзапросами удобнее? ....... ...........................................

Выведите имена и фамилии людей с зарплатой выше средней.

SELECT т с . f i r s t _ n a m e , m c .la s t_ n a m e FROM m y _ c o n t a c t s me


NATURAL J O I N jo b _ c u r r e n t jc WHERE j c . s a l a r y > (SELEC T
A V G (sa la ry ) FROM j o b cu rren t);

В отличие от предыдущей реа ли за ци и , ллы не можелд


ucnoльзoвamt? LIMIT и ORDER BY.

В предыдущем реш ении мы могли


LIMIT для получения
Решение с подзапросами удобнее? ..О..: .................... ^!^ибрл1р_щей зар п л ат ы из упорядо­
ченного списка зар п лат . Зарплат ы
«оы ш е ср ед н ей » не упорядочиваются
поэт ом у мы не м о ж ем использоват ь
LIMIT для их получения.

476 гл ава 10
внешние соединения, са м о с о е д и н е н и я и союзы

Показывает, кто
Самосоединение как подзапрос является начальни­
ком данного клоуна.
В ы уж е видели, ка к подзапрос преобразуется в соединение.
Д а вайте п о см о тр и м , ка к сам о сое д и не ние преоб разуется
clown info
\
в подзапрос. м nam* boss М
1 Элси 3
П о м н и те стол бец b o s s id , д о б а вл е н н ы й в та б л иц у
2 Пиклз 5
c l o w n _ i n f о? В о т к а к в ы г л я д е л о с а м о с о е д и н е н и е , в к о т о ­
3 Снаглз 10
р о м и сп о л ь зо в а л и сь два п се в д о н и м а c l o w n _ i n f o — c l и с2.
4 Мистер Хобо 3
5 Кларабелл 10
6 Скутер 3
ДО ПРЕОБРАЗОВАНиЯ 7 Зиппо 3
8 Бэйб 5
9 Бонзо 5
SELECT c l . n a m e , c 2 . nam e AS b o s s 10 Мистер Снифлз 10
FROM c lo w n i n f o c l ------------ - Первый экземпляр
clow njnfo.
IN N E R J O IN c l o w n _ i n f o c2
ON c l . b o s s _ i d = c 2 .id ; Вплорой э к з е м ­
пляр clow njnfo.

ПОСЛЕ ПРЕОБРАЗОВАНиЯ

П о д за п р о с , п о л у ч е н н ы й в резул ьтате п р е о б р а зо в а н и я са м о со ­
е д и н е н и я , явл яется ко р р е л и р о в а н н ы м , п о то м у ч т о о н за в и си т
о т резул ьтата в н е ш н е го за п р о са для п о л у ч е н и я п р а в и л ь н о го
значения b o ss i d и н а х о д и т с я в с п и с к е с т о л б ц о в SELECT.

Подзапрос в списке
столбцов SELECT.

SELECT c l . n a m e , /1

(S E LE C T nam e FROM c l o w n _ i n f o
WHERE c l . b o s s ^ ^ id ^ AS b o s s
ROM c lo w n i n f o c lT \
Подзапрос зависит от р езу л ьт а т о в
бнешнего запроса для получения п р а ­
вильного значения bo ssjd, поэт ому
он является коррелированным.

да л ьш е > 477
ожидать проблем в гла ве 11?

Компания Грега растет


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

Ж ал ь, ч то новы е р а б о тн и ки пл охо поним аю т, что


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

478 глава 10
внешние соединения, с а м о с о е д и н е н и я и союзы

Со с. 469.
Возьми в руку карандаш
Решение
Создайте союз из столбцов c o n t a c t _ i d (таблица j o b _ c u r r e n t ) и s a l a r y
(таблица j o b _ l i s t i n g s ) .

S ELECT c o n t a c t jd FROM job^curirent UNION


S ELECT salary FROM Jobjistings;

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


команду C R EA TE T A B L E AS для сохранения результатов союза.

CREATE TABLE myjtable SELECT c o n t a c t j d


F^OM jo b_ cu rren t UNION S E L E ^ sala^^^^
Job J istings;

Выведите описание таблицы командой D ESC и проверьте правильность


с в о е г о предположения.

D EC(1Z,Z)

Возьми в руку карандаш


Решение А вот как выглядит у сло вие WHERE, если переписать за пр ос в виде внут­
реннего соединения:

SELECT m e .first_name, m e .last_naine, me.phone, jc.title

FROM job_current AS jc NATURAL JOIN my_contacts AS me

INNER JOIN job_listings jl С е щ и ю WHERE с подзапросом


можно за м ен и т ь внут ренним
ON jc.title = j1.title;
соединением.

Объясните, почему конструкция IN N E R J O I N этого запр оса во звр ащ ае т те же результаты, что и подзапрос.

выполнении
условия Jc.title = Jl.title , что эквивалентно секции WHERE с подзапросом:
WHERE jc.title IN (S E L E C T title FROM Jobjistings);

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


быть не м о ж ет ! Но ваш о т в ет показы-
вает, ч т о вы уже начали ду м а т ь о т,ом,
какой способ будете использоват ь в буду-
и^ем со своими данными.

да л ьш е ► 479
краткий о б зо р s q l

Новые инструменты
Ваши познания в SQL стремительно растут. Вы освоили
внешние соединения, самрсоединения и союзы и даже
знаете, как преобразовать соединение в запрос, и наоборот.
с::?
Полный список инструментов приведен в приложении III.

я е в о е в н е ®йб ®
И Ф Л Е кс и в а в й ВНЕШНИЙ ю т е
левое 6«
'Т е в о й
й комороа он Sftirvucu соо^ ' ^
lo T T f” клю - U с р е З и 3ai^wceu
ОМ, используемый для
других целей. 'пТ ав^ о й ^ ^

ПРАВОЕ ВНЕПИЕЕ СОЕДИНЕНИЕ


сам осоединение
UHION и о5-ьеЭиняеил Правое внешнее соеди­
СОУОЪ резуд^^'
CKV0C05 построения з а - нение перебирает все
6 оэну ва- JZ c a к оЭкой та«лш<е записи ПРАВОЙ таблицы,
псноблкии CAU к«к если «и она и ищет для них соответ­
6 К О М «и З « Х была Эбумя таблица ствия среди записей
м и. содержащими Л е в о й таблицы.
одинаковую
информаи,ию.
in t e r s e c t
резуд'?'^^^ ^ K O K C l^p y*^'
Ключевое слово возвращает
только те значения. .
рые присутствуют в первом
ЭубдикаилоЬ. и во втором запросе.
create table as

except
у создания маглиць, по
результатам выполне­ Ключевое слово возвращает
ния команды SELECT. только те значения, которо-
ые присутствуют в первом.
но НЕ бо втором запросе.

480 глава 10
11 0Г^»аниЧени!Г, п р еД сл ааБ Л ен и я и т р а н з а к ц и и

+
У семи нянек

Ваша база данны х выросла, и теперь с ней будут работать


другие лю ди, к сожалению, далеко не все они так же хорошо разбирают­
ся в SQL, как вы. Вам придется позаботиться о том, чтобы предотвратить
ввод неверных данных, запретить просмотр лишних данных, а также
предотвратить возможные конфликты при одновременном вводе дан­
ных. В этой главе мы займемся защитой данных от чужих ошибок. Итак —
Защита Ваз Данных, часть 1.
база данных грега р а с ш и р я е т с я

Грег нанимает помои^никоб


Г р е г н а н я л двух р а б о т н и к о в ,
к о т о р ы е д о л ж н ы п о м о га т ь ему { Я уже основательно )
в в е д е н и и р а з в и в а ю щ е го с я ^ забыл SQL... Наде- ^
б и зн е с а . Д ж и м будет з а н и м а ть с я \ юсь, г per не заметит. J
вводом д а н н ы х н о в ы х к л и е н т о в ,
а Ф р э н к — п о и с к о м для н и х п о д ­
х о д я щ е й р аб о ты .

Грег провел предварител ьны й


и н с т р у к т а ж , н а к о т о р о м объ яс­
н и л с т р у к ту р у базы д а н н ы х
и н а з н а ч е н и е к а ж д о й и з та б л и ц .

jo b _ c iirr4 it jo b _ d e s lr e J |*b_n«tiiia«
contact id contact id job_id

title title
title
salary salary J e w
salary
start date salary_high
zip
available
description
years_exp

co n la cl in lo ro st in le r e s is
contact_id 1 ■interest_id 0— jr
^ 0 + ir ^ interest
Hiy_c»Hta€ts
interest_id
p ro fessio n 0+ЯГ
last name
p ro f_id 0 ~ ) r —
first name
profession
phone
сои1ас1_»оок1ня se e k in g
email
zip^codo contact_id ■seeking_id О—тг
gender 1
zip_code 0 —» - ^ 0 + ir seeking
birthday
city
seeking_id
state p ro f_id
0+r
-►zip_code
s la lu s >status_id
status id 0—Tf- Г
status

482 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Первый день: вставка данных нового клиента


Д ж и м с и д и т в с в о е м н о в о м о ф и с е и п о л у ч а е т с о о б щ е н и е о т Г р е га .

Чат: данные для вставки

можешь добавить запись в базу данных? j

^Конечно, могу.
Грег

Здесь только часть информации, остальное пришлю позже.


J ) Джим

Гр«г

' Пэт Мэрфи, 555-1239, patmurphy@someemail.com, почтовый


индекс 10087

Грег

^У^Дата рождения — 15/4/1978/^

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

Грег
(вроде все простоТуже делаю :)

Спасибо!
Джим

V
Грег

Не стоит благодарности |

г X*
OiTVPM
А вы сможете написать запросы для вставки данных нового
клиента в базу данных?

да л ьш е 483
неограниченный в в о д д а н н ы х

Д]ким не хочет использовать NULL


В п р о ц е ссе ввода д а н н ы х Д ж и м сознает, ч то
Я слышал, что значения
о н даже не знает — П э т это м уж чи н а ил и
NULL в базе данных нежела
ж е н щ и н а ? Г р е га п о б л и з о с т и н е т, р е ш е н и е
тельны, но я пока не знак»,
п р и х о д и т с я п р и н и м а т ь сам ом у. Д ж и м р е ш а ­
какой пол указывать в этой
е т в в е сти в сто л б ц е g e n d e r зн а ч е н и е «X».
записи.
О н п и ш е т в сп о м о га те л ь н ы е за п р о с ы для п о ­
л учения нед остаю щ их д анны х, наприм ер:

Значение prof_id берется из таблицы profession.


SE L E C T p r o f _ i d FROM p r o f e s s i o n WHERE p r o f e s s i o n = 'У ч и т е л ь ';

M y_c»iita«ts
prof_M И д ен т и ф и к а т о р ,
со о т вет ст ву ю щ ий
contact id
19
проф ессии « у ч и т е л ь » ,
last name
для последующего и с ­
first name
пользования в запросе
phone
к ту_сопЬас±$. email
gender
birthday
Значение status_id берется из таблицы status. prof_id
SELECT sta tu s_ id FROM p r o f e s s i o n WHERE s t a t u s zip_code
status id
s t a le s id

Далее Джим создает запись с буквой «X» в столбце gender.

Для столбцов AU TO JN C R EM EN T задавать


значение не нужно. Два апост роф а означа­
ю т , что значение первичного ключа долж ­
но генерироваться автоматически.

IN SERT IN TO m y _ c o n t a c t s VALUES(' ' Мэрфи' , ' П эт'


'5 5 5 1 2 3 9 ', 'p a tm u r p h y @ s o m e e m a il.c o m ', 'X ', 1 9 7 8 -1 5 -0 4 ,
19, '1 0 0 8 7 ', 3);

/ фиктивное обозначение пола, к о т о ­


И дент иф икат оры , найденные при рое Д ж и м р е ш а е т ввести в столбце
помощ и вспомогат ельных запросов. « g e n d e r » — он не хочет выбирать
Также можно было использоват ь наугад или вводить NULL.
подзапросы.

484 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Три месяца спустя


Г р е г за н и м а е тся с б о р о м д е м о гр а ф и ч е с ки х д а н н ы х . О н х о ч е т
знать, ско л ь ко в табл ице my c o n ta c ts м уж чин, скол ько ж е н­
щ и н и с к о л ь к о в с е го в н е й за п и с е й . Д л я э т о го о н в ы п о л н я е т
т р и запроса.

SELECT COUNT(* ) AS F e m a le s FRO M m y _ c o n ta c ts WHERE gender = 'Ж ';

Females __Та6лии,а my^contacts содерж ит 5 9 7 5 записей


5975 с буквой « Ж » в столбце « g e n d e r » .

SELECT COUNT(* ) AS M a le s FRO M m y _ c o n ta c ts WHERE gender = 'M';

M ales
6982 И 6 9 82. записи с буквой « М » .

SELECT COUNT(* ) AS T o ta l FR O M m y _ c o n ta c ts ;

Total Э т о т запрос возвращает общее


12970
количество записей в таблице.

Г р е г зам ечает, ч т о сум м а н е со в п а д а е т с о б щ и м ко л и ч е с т в о м з а п и с е й .


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

SELECT gender FR O M m y _ c o n ta c ts
WHERE gender <> 'M ' AND gender <> 'Ж';

g— der
^ S поисках пропавилих данных он об­
наруживает 3-3 записей, у которых
ст олбец « g e n d e r » содерж ит «X ».

Ш ТУРМ

Мог ли Джим обойтись без


фиктивных значений X?
X
X

да л ьш е У 485
ограничения check

Добавление ограничения CHECK


О гр а н и ч е н и я сто л б ц ов уж е встре ча л ись нам в предш еству­
ю щ и х гл а в а х . Ограничение определяет набор значений, Офаничение CHECK
к о т о р ы е м о гу т вста в л я ться в сто л б е ц , и уста н а в л и в а е тся п р и
созд ании табл ицы . В ча стн о сти м ы уж е рассм атривали о гр а н и ­ определяет значения,
ч е н и я NOT NULL, PRIM A RY KEY, F O R E IG N KEY и UNIQUE.

С ущ ествует ещ е одна ка те го р и я о гр а н и ч е н и й сто л б ц о в — т а к


которые M oiyr встав­
назы ваем ы е о гр а н и ч е н и я п р о в е р ки (CHECK). Д о п у с т и м ,
д анны х долж на сохраняться инф орм ация о м онетках, ко то ­
в базе
ляться в столбец
р ы е по па д а ю т в ко п и л ку. К о п и л ка п р и н и м а е т то л ь ко м о н е тки
п о 1, 5 , 1 0 и 2 5 ц е н т о в , к о т о р ы е в б а з е д а н н ы х о б о з н а ч а ю т с я
базы данных. В нем
б у к в а м и Р, N , D и Q с о о т в е т с т в е н н о . С л е д у ю щ а я т а б л и ц а и с ­
п о л ь з у е т о г р а н и ч е н и е CHECK д л я п р о в е р к и з н а ч е н и й , к о т о р ы е используются те же
м о г у т в с т а в л я т ь с я в с т о л б е ц c o in .
условные операто­
ры, что и в условии
CREATE TABLE p ig g y _ b a n k
WHERE.
(
id IN T AUTO_INCREMENT NOT NULL PRIMARY KEY,
c o in C H A R (l) CHECK ( c o in IN ( ' P ' , ' N ' , ' D' , ' Q' ))
-------------- ----------------------

Значением столбца « с о т » м о ж е т _ У
быть только одна из эт их букв.

Если значение, которое вставляется


в столбец, нарушает условие CHECK,
вы получите сообщение об ошибке.

CHECK не обеспечи-
ЗДЬхцС I вает целостности
>С1Цор:>ЖНь1! данных в MySQL.
MySQL позволяет создавать таблицы
с ограничениями CHECK, но эти ограниче­
ния не работают. MySQL их игнорирует.

486 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Ограничение CHECK для столбца gender


Е сл и б ы Г р е г м о г в е р н у ть с я в п р о ш л о е , т о о н б ы созд ал та б л и ­
Почему
ц у m y _ c o n t a c t s с о г р а н и ч е н и е м CHECK д л я с т о л б ц а g e n d e r .
я постоянно
В п р о ч е м , о н м о ж е т р е ш и т ь п р о б л е м у к о м а н д о й A L T E R TA B L E .
получаю ошибку?

A LTER TABLE m y _ c o n t a c t s
ADD C O N STR A IN T CHECK g e n d e r I N ('М','Ж');

H a сл е д ую щ и й д е н ь Д ж и м о б н а р уж и в а е т, ч т о о н уж е не м о ж е т созд ать
за п и с ь , в к о т о р о й с то л б е ц g e n d e r с о д е р ж и т ф и к т и в н о е з н а ч е н и е «X».
О н о б р а щ а е т с я с в о п р о с о м к Г р е гу . Т о т р а с с к а з ы в а е т о н о в о м о г р а н и ч е ­
н и и , а п о с к о л ь к у в е р н у т ь с я в п р о ш л о е все р а в н о н е уд астся — п о р у ч а е т
Д ж и м у с в я за ть с я со в с е м и п р е т е н д е н т а м и «X» и у зн а ть , к а к о го о н и пола.

- Возьми в руку карандаш


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

C R EA T E TABLE m y s t e r y _ t a b l e
(
co lu m n l I N T (4) CHECK (co lu m n l > 200),

co lu m n 2 CHAR( l ) CHECK (colu m n 2 NOT IN ('x', 'y', 'z ')),

co lu m n s VARCHARO) CHECK ('A' = SU B ST R IN G ( c o l u m n _ 3 , 1, 1)),

co lu m n 4 VARCHARO) CHECK ('A' = SU B STR IN G ( c o l u m n _ 4 , 1, 1)


AND '9 ' = S U B S T R IN G (co lu m n _ 4, 2, 1))

Столбец c o l u m n l : .............................................................................................................................................................................

Столбец c o l u m n 2 : .............................................................................................................................................................................

Столбец c o l u m n 3 : .............................................................................................................................................................................

Столбец c o l u m n 4 : .............................................................................................................................................................................

дал ьш е > 487


в о з ь м и в р у к у к а р а н д а ш , решение

- ^ В о зь м и в руку карандаш
V C R EA T E
Решение Запишите, какие значения разрешены в каждом из следующих с толбцов.

TABLE m y s t e r y _ t a b l e
(
co lu m n l IN T (4 ) CHECK (co lu m n l > 200),

colu m n 2 C H A R (l) CHECK (colu m n 2 NOT IN ('x', 'y', 'z ')),

co lu m n s VARCHARO) CHECK ('A' = SU B ST R IN G ( c o l u m n _ 3 , 1, 1)),

co lu m n 4 VARCHARO) CHECK ('A' = SU B ST R IN G ( c o l u m n _ 4 , 1, 1)


AND '9 ' = S U B S T R IN G (co lu m n _4 , 2, 1))

* р азреш ен ы ком бинированные


усл ови я со св я зк а м и A N P и OR-

Столбец с о l u m n 1: .НИР.^ . 9 . . .............................................................................................................................

Столбец c o l u m n 2 : .А\9Аш.С!иМврА,_К^д^^ .............................................................................................................

Столбец c o l u m n s - с имволом с т р о к и должна быть буква А

Столбец c o l u m n 4 - ^ ^ / ? ^ * ^ '^ символоМ ст роки должна быть буква А, а 6mof?biM — i^ucjojpa 9

_ Часто»
^адаБаеМ ы е
Бо11р>Сь1

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

• Практически все. Вы можете использовать все условные


конструкции: AND, OR, IN, NOT, BETWEEN И т Д., И даже объеди­
объеди- \)' Что произойдет при попытке вставить значение, не про-
нять ИХ, как в приведенном выше примере. Впрочем, подзапро- шедшее проверку CHECK?
сы запрещены.
О Вы получите сообщение об ошибке, а данные вставлены
не будут.
Если Офаничения CHECK нельзя использовать в MySQL,
то чем их заменить?
какая от этого польза?
Простого ответа на этот вопрос не существует Иногда ис­
пользуются триггеры — запросы, выполняемые автоматически Гарантия того, что в таблицу попадут только осмысленные
при наступлении некоторого события. Но триггеры далеко данные и она не будет забиваться фиктивными значениями.

488 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Однообразная работа Фрэнка


Ф р э н к работает над п о и с ко м в а ка н си й . П о с те ­
п е н н о о н зам етил н е ко т о р ы е за ко н о м е р н о с ти :
в а к а н с и й в е б -д и з а й н е р о в м н о го , а п р е т е н д е н ­
то в — мало. Т е х н и ч е с ки х пи са те л е й в п о и с ка х
р а б о ты м н о го , а в а ка н с и й — мало.

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

Мне приходится раз за разом


создавать одинаковые запро­
сы, и так каждый день.
Мне это надоело.

О ш а н к ш е « ^ р э н к о М

и р Д о п а В ы п е себя на Месте и напиШише


ЗanJ^cы, К°тп°]=*ые энк пиШеш каж ды й день.
ЛапиШигое Зал|=ос ддя Выборзки Всех записей Веб-
ДиЗайнер^В из тnaблuЦьlJ°L—
Вместе с их контактнь1М и даннь1Ми.
ЦапиШите Другой запр><>с для ириска
°т к р * ы т ы х Вакансий для техн и че­
ских писателей.

да л ьш е у 489
создание п р е д с т а в л е н и я

^ т а н ь ш е ф р э н к о М . О ш Б е ш

У р>еДацаВьте себя на Месте <|>]=*энка и S ELEC T Mc.fiVst_name, mc.iast_


напиШите Запросы, Кощо]=>ые ‘§»р>энк п а т е , т с.p h o n e, т с .email
FROM my_contacts т с
пиШ ет каж ды й день. ЦалиШ ите запр°с
NATURAL JOIN joh_desired j d
для Выборзки Всех записей WHERE jd.title = 'B ed -дизайнер':
Веб—диэайне]=*оВ из т а б л и ­
ц ы JoL_«JeвiГe<l вм есте с их
К °н тактн ь1М и данными. | | а -
S E L E C T title, salary, description,
пиШите Др*1^Гой запр’ ос для поиска zip
о т к р * ы т ы х Вакансий для технических FROM Jobjistings
писателей.
WHERE title - 'Технический п и с а ­
тель';

З ап р о сы н е сл о ж н ы е , н о если Ф р э н ку пр и д ется ввод и ть и х


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

Пусть> сI о х р а н и т с в о и з а п р о с ы
/ в текстовоАА файле, а п о т о м
1 ко п и р у ет, ко гд а понадобится.
В чем проблем а?

Файлы могут быть случайно стерты


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

490 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Создание представления
С ]о з д а т ь п р е д с т а в л е н и е с о в с е м н е с л о ж н о — д о с т а т о ч н о д о б а ­
в и т ь в з а п р о с к л ю ч е в ы е с л о в а CR EA TE V IEW . Д а в а й т е с о з д а ­
д и м два п р е д с та в л е н и я для з а п р о с о в Ф р э н к а .

CREATE V IE W w e b _ d e s ig n e r s AS
SELECT m e . f i r s t _ n a m e , m e . l a s t _ n a m e , m e . p h o n e , m e . e m a i l
FROM m y _ e o n t a e t s me
NATURAL J O IN j o b _ d e s i r e d jd ^
«H ER E j d . t i t l e = . в е б - д и з а й н е р ';

CREATE V IE W t e c h _ w r i t e r _ j o b s AS
SELECT t i t l e s a la r y , d e s c r ip tio n , z ip
FROM j o b _ l i s t i n g s
WHERE t i t l e = ' Технический п и с а те л ь ';

Действительно про­
о О сто! Но как использовать
представление, которое
я создал? ^__

Ш ТУРМ

Как по вашему мнению выглядит


команда SQL, использующая
представление?

да л ьш е * 491
использование запросов в командах SELECT

Просмотр представлений
В озьм ем то л ь ко ч т о со зд а нно е н а м и п р е д ста вл е ни е w eb d e s ig n e r s .

CRE1ATE V IE W w e b _ d e s ig n e r s AS
SELECT m e . f i r s t _ n a m e , m e . l a s t _ n a m e , m e .p h o n e ^ m e .e m a il
FROM m y _ e o n t a e t s He забывайте: ключевое слово
AS можно ие указывать
NATURAL J O IN jjo
o bb __ddee! s i r e d jd ^ зыоать.

WHERE j d . t i t l e = 'В е б - д и з а й н е р ';

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


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

SELECT * FROM w e b _ d e s i g n e r s ;

' Имя представления.

Р езультат:

fir s t nam e la s t nam e phone em ail


Джон Мартинес 5559872 jm@someemail.com
Саманта Хоффман 5556948 sammy@someemail.com
Тодд Герц 5557888 toci@someemail.com
Фред Макдугал 5557744 fm@sotTieemail.com

И т а к далее - &се записи, у к о ­


т о р ы х б ст олбце « Ы 1 е » хранится
значение «В еб -дизайнер».

492 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Как Работает представление


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

SELECT * FROM w e b _ d e s i g n e r s ;

О н а о зн а ч а е т: « В ы б р а т ь все з а п и с и и з п о д з а п р о с а , в о з в р а щ а ю ­
щ е го и м я , ф а м и л и ю , те л е ф о н и адрес э л е к т р о н н о й п о ч т ы все х
лю дей и з таб л иц ы my c o n t a c t s , к о т о р ы е и щ у т в а ка н с и ю веб­
дизайнера».

SELECT * FROM
(S E LE C T m e . f i r s t _ n a m e , m e .la s t_ n a m e , m e .p h o n e , m e .e m a il
FROM m y _ e o n t a e t s me
^ /N A T U R A L J O IN jo b _ d e s ir e d jd
WHERE j d . t i t l e = 'В е б - д и з а й н е р ') AS w e b _ d e s i g n e r s ;

Часть, использован­
Подзапросу назначается
ная в представлении.
псевдоним, чплоды запрос
интерпретировал его
как таблицу.
А кок насчет этой ча­
сти — А5 \«еЬ_с1е31дпегз?
Зачем она нужна?

В секции FROM должна быть


указана таблица.
И х о т я на щ а ко м а н д а SELECT во звр а щ а ­
е т в и р туа л ь н ую таблицу, S Q L не с м о ж е т
узнать об этом без псевдоним а.

дал ьш е 493
подробнее о п р е д с т а в л е н и я х

Что такое представление


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

Н о в и р т у а л ь н а я т а б л и ц а н е х р а н и т с я в базе д а н н ы х . О н а со зд а ­
е тс я то гд а , ко гд а в ы и с п о л ь з у е т е п р е д с та в л е н и е , а за те м у н и ч т о ­
ж а е т с я . О с т а е т с я т о л ь к о к л ю ч е в о е с л о в о V IE W с и м е н е м . И э т о
х о р о ш о , п о т о м у ч т о п р и к а ж д о й в с т а в ке н о в ы х з а п и с е й в базу
д а ь п 1ы х п р и и с п о л ь з о в а н и и п р е д с т а в л е н и я б у д е т о т о б р а ж а т ь с я
новая инф орм ация.

Почему представления удобны при работе с базами данных

1 Возможные изменения структуры базы данных не нарушат работы


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

m0.At>K0 бо
брблля UC-
ж е н и й . С озд авая п р е д ста в л е н и я д а н н ы х , вы с м о ж е те и зм е н я т ь б а зо вую с тр у кту р у 1ЛОЛ(зЗоб(ЯНиЯ

та б л и ц — со зд а н н о е п р е д ста в л е н и е будет и м и т и р о в а т ь п р е ж н ю ю с тр у кту р у та б л и ­ ктр еЭ стя бл е-


ц ы , и вам н е п р и д е тс я в н о с и т ь и зм е н е н и я в п р и л о ж е н и е , р а б о та ю щ е е с д а н н ы м и . ныя б з а п р о ­
сах-

2 Приложения упрощают сложные запросы до простых команд.


В ам н е п р и д е тс я м н о го к р а т н о созд авать с л о ж н ы е с о ю зы и п о д за п р о с ы — д о­
с та то ч н о создать для н и х пре д ста в л е ни е , с кр ы в а ю щ е е всю с л о ж н о с т ь н и ж е ­
л е ж а щ е го за п р о с а . А ко гд а к о д S Q L будет и с п о л ь зо в а т ь с я в Р Н Р и л и д р у го м
я зы ке п р о гр а м м и р о в а н и я , вам будет н а м н о го п р о щ е р а б о та ть с п р е д ста в л е н и е м .
В ы будете и с п о л ь з о в а т ь у п р о щ е н н ы й к о д п р е д с т а в л е н и я в м е с т о б о л ь ш о го , с л о ж ­
н о го запроса с м н ож еством соед и нений . П р о сто та ум еньш ает в е р о ятн о сть о ш и ­
б о к, а ко д ста н е т более уд обочитаем ы м .

3 Представления могут скрывать информацию, которая не нужна


пользователю.
П р е д п о л о ж и м , в базу д а н н ы х g r e g s l i s t добавляю тся таб л иц ы с д анны м и
кр е д и т н ы х ка р т. В ы м о ж е те создать п р е д ста в л е н и е , в к о т о р о м будет ука за н о ,
ч т о д а н н ы е к а р т ы х р а н я т с я в с и с те м е , н е р а с кр ы в а я ее д а н н ы х . Р а б о т н и к и будут
видеть то л ь ко ту и н ф о р м а ц и ю , ко то р а я им нуж на, а ко н ф и д ен ц и а л ьн ы е сведения
останутся с кр ы ты м и о т н и х.

494 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

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


ставление, которое покажет мне всех людей из таблицы
job_current, которые также присутствуют в таблице job_
desired, с их текущей зарплатой, минимальной желаемой
зарплатой из поля salary_low и разностью этих двух чисел?
Проще говоря, насколько они рассчитывают повысить свой
заработок при смене работы? Да, и не забудьте
включить их имена, адреса электронной почты
и телефоны.

Задача не из простых, но любой запрос, который можно создать в форме s e l e c t , может


ЛЖМРНИР преобразован в представление. Для начала ответьте на приведенные ниже вопросы,
а затем запишите запрос Фрэнка в виде представления с именем j o b r a i s e s .

Какие таблицы должны быть включены в запрос?

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

Как средствами SQL создать в результатах столбец с именем r a is e ?

Напишите запрос Фрэнка:

i'nyivgvwi x?d\M isv£ г)\л/иу1И9иу1£эоэ


о 029 V>1£V>iOQOjJ

да л ь ш е ► 495
упражнение, реш ение

Задача не из простых, но любой запрос, который можно создать в форме s e l e c t , может


быть преобразован в представление. Для начала ответьте на приведенные ниже вопросы,
ажнение а затем запишите запрос Фрэнка в виде представления с именем j o b r a i s e s .

’ Реш ение

Какие таблицы должны быть включены в запрос?

joh_currentj job_desired и my_cov\tacts

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

С т о л б е ц « sa la ry » таблицы Jo b_cu rren t и ст олбец « s a la r y jo w »


таблицы joh_desired
Как средствами SQL создать в результатах столбец с именем r a i s e ?

В ычесть « sa la ry » из « s a la r y jo w » , и назначить разност и псевдоним.

Напишите запрос Фрэнка:

Здесь мы создаем новое п р е д -


^ ставление с и м ен ем job^raises.

CREATE VIEW Job_raises AS


SELECT mc.first_name, mc.lastjname,, mc.email, m e.p ho n e,

, , , . , V,
j c .c o n t a c t jd j jc.salary, jd .sa la ry jo w , В о ст альном коде запроса
т ренних соединения используи^тся для
,

jd .sa la ry jo w - jc.salary AS raise извлечения данных из т р е х таблиц.


FROM jo b _cu rren t jc Л: Простейшая м а т ем а т и ческа я опера
\ иия с о з д а е т новый ст олбец «raise».
INNER JOIN job_desired j d Ч ^
INNER JOIN my_contacts m e Текущая зар п л ат а вычитается
из ожидаемой, а
W HERE
AND j c .c o n t a c t j d - m c .c o n t a c t jd ;

Запрос получился просто огромным, но для просмотра


информации Фрэнку теперь достаточно ввести простую
команду
SELECT * FROM j o b _ r a i s e s ;

496 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

^ Возьми В руку карандаш


Фрэнк вы полняет запр ос S E L E C T на с. 4 9 6 с использованием нового
представления j o b _ r a i s e s . Как ему упорядочить результаты в алфа­
витном порядке по фамилиям?

ОшВетп на с. 517.

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


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

^ Значит, я могу
создать представление, ко- )
( торое позволит мне изменять ^
содержимое таблиц?

Можете, но игра не стоит свеч.


Е с л и в представлении используются агре­
гатные функции ( т а к и е , к а к SUM, COUNT
и л и AVG) , о н о н е м о ж е т и с п о л ь з о в а т ь с я д л я
о б н о в л е н и я д а н н ы х. К р о м е то го , если пред ­
содержит условия GROUP BY,
ставл ение
DISTINCT и л и HAVING, и з м е н е н и е д а н н ы х
также невозможно.

К а к п р а в и о л , о п е р а ц и и I N S E R T , UPDATE
и DELETE б ы в а е т у д о б н е е в ы п о л н я т ь т р а д и ц и ­
о н н ы м способом , но мы рассм отрим прим ер
о б н о в л е н и я д а н н ы х через представление.

а а льш е > 497


просм от р содерж им ого н о п и п т

Обновление данных через представление


Д а в а й т е с о зд а д и м п р е д с та в л е н и е н а базе н о в о й т а б л и ц ы с и м е н е м p ig g y bank.
В табл ице хр а нятся данны е о м о не тка х, ко то р ы е соб ираю тся в ко п и л ке . У ка ж ­
д о й м о н е т к и и м е е т с я и д е н т и ф и к а т о р , н о м и н а л (п е р в а я б у кв а а н гл и й с к о г о н а зв а ­
н и я Р, N , D и л и Q ) и г о д в ы п у с к а .

CREATE TABLE piggy_bank


(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
coin CHAR(l) NOT NULL,
coin_year C H A R (4)
)

В н а с то я щ и й м о м е н т та б л и ц а p ig g y b a n k со д е р ж и т следую щ ие данны е:

id coin co in .y ear
1 Q 1950
2 P 1972
3 N 2005
4 Q 1999
5 Q 1981
6 D 1940
7 Q 1980
8 P 2001
9 D 1926
10 P 1999

С о зд а д и м п р е д с та в л е н и е , к о т о р о е в ы в о д и т т о л ь к о з а п и с и 2 5 -ц е н т о в ы х
м о н е т о к (Q ):

CREATE V IE W AS p b _ q u a r t e r s
SELECT * FROM p ig g y _ b a n k
WHERE c o i n = 'Q';

Ш ТУРМ

Как будет выглядеть таблица результатов при выполнении


следующего запроса?

SELECT * FROM p b _ q u a r t e r s ;

498 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Создайте таблицу р 1 д д у _ Ь а п к , а также представления p b _ q u a r t e r s и р Ь _ (1 1 те з с исполь-


аЖ НеНИе зованием приведенных ниже запросов.

IN S E R T INTO p i g g y _ b a n k VALUES 1950), C ' , ' P ' , 1 9 7 2 N' , 2 0 0 5 ) ,


1999) , ' Q' , 1981) , ( " , ' D' , 1 9 4 0 ) , ( " , ' Q' , 1980) , ( " , ' P ', 2 0 0 1 ) , ( " , ' D',
1926), ( ’ ', ' P', 1999);

CREATE VIEW p b _ q u a r t e r s AS S E L E C T * FROM p i g g y _ b a n k WHERE c o i n = ' Q' ;

CREATE VIEW p b _ d i m e s AS S E L E C T * FROM p i g g y _ b a n k WHERE c o i n = 'D ' WITH CHECK O P T I O N ;

Попробии^ле понять
Напишите, что произойдет при выполнении каждого из следующих запросов что делает
IN SE RT, DELETE и UPDATE. В конце упражнения запишите итоговое состояние Д т это уело
таблицы p i g g y b a n k . л' р ^ я ра оты
^ - над упражнением.
IN SE R T INTO p b _ q u a r t e r s VALUES C ','Q ', 1993);

IN S E R T INTO p b _ q u a r t e r s VALUES C ' , ’ D' , 1942);

IN S E R T INTO p b _ d i m e s VALUES C ','Q ', 2005);

DELE T E FROM p b _ q u a r t e r s WHERE c o i n = 'N ' OR c o i n = 'P ' OR c o i n = 'D V

UPDATE p b _ q u a r t e r s SET c o in = 'Q ' WHERE c o i n = 'P';

да л ьш е ► 499
упражнение, р е ш е н и е

Создайте таблицу piggy bank, а также представления pb quarters и pb_dimes с исполь-


аЖ НеНИе зеванием приведенных ниже запросов.

/й ш е н н е

IN S E R T INTO p i g g y _ b a n k VALUES 1950), C ' , ' P ' , 1 9 7 2 ) , ('', 'N', 2005),


( " , ' Q ' , 1999) , ( " , ' Q' , 1981) , ( " , ' D' , 1 9 4 0 ) , ( " , ' Q' , 1980) , ( " , 'P' , 2 0 0 1 ) , ( " , ' D' ,
1926), ( " , 'P', 1999);

CREATE VIEW p b _ q u a r t e r s AS S E L E C T * FROM p i g g y _ b a n k WHERE c o i n = ' Q' ;

CREATE VIEW p b _ d i m e s AS S E L E C T * FROM p i g g y _ b a n k WHERE c o i n = 'D ' WITH CHECK O P T I O N ;

J
Напишите, что произойдет при выполнении каждого из следующих запросов Попробуйте п о ­
INSERT, DELETE И UPDATE. В КОНЦе упражнения ЗаПИШИТе ИТОГОВОе СОСТОЯ- нять, что делает
ние таблицы piggy_bank. это условие, во
время работы над
IN S E R T INTO p b _ q u a r t e r s VALUES C ','Q ', 1993);
упражнением.
Запрос будепл. выполнен нормально.

IN S E R T INTO p b _ q u a r t e r s VALUES C ','D ', 1942);

8 таблицу вставляется новая запись, хотя и з-за условия


WHERE этого вроде бы быть не должно.

IN S E R T INTO p b _ d i m e s VALUES C ','Q ', 2005);

Ошибка и з-за условия CHECK OPTION. Данные,


вводимые в предст авлении, проверяют ся по у с л о ­
вию WHERE перед вставкой.

DELETE FROM p b _ q u a r t e r s WHERE c o i n = 'N ' OR c o i n = 'P ' OR c o i n = ' D' ;

Э т о т запрос не и зм ен яет со д е р ­ ы cein toin^year


жимое таблицы, пот ом у что поиск 1 Q 1950
осущ ест вляет ся только в р е з у л ь ­ 2 р 1972
т а т а х с coin - 'Q' 3 N 2005
4 Q 1999
UPDATE p b _ q u a r t e r s SET c o i n = 'Q ' WHERE c o i n = 'P'; 5 1981
Q
6 D 1940
Ничего не делает с таблицей, 7 Q 1980
п от ом у что предст авление 8 Р 2001
p bj]u a v te rs не возвраш,ает 9 D 1926
значений с coin - 'Р! 10 Р 1999
11 Q 1993
Итоговое содерж имое т а ­
12 D 1942
блицы выглядит так:

500 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Представление с CHECK OPTION


У с л о в и е CHECK O P T IO N , в к л ю ч е н н о е в п р е д с т а в л е н и е , у к а з ы в а е т в а ­
ш е й Р С У Б Д , ч т о все к о м а н д ы IN SE R T и DELETE д о л ж н ы п р о в е р я т ь с я Конструкция
п о у с л о в и ю WHERE в в а ш е м п р е д с т а л в е н и и . И т а к , к а к CHECK O P TIO N
в л и я е т н а к о м а н д ы I N S E R T и UPDATE? CHECK OPTION
П р и и с п о л ь з о в а н и и CHECK O P T IO N в п р е д ы д у щ е м у п р а ж н е н и и п о ­
п ы т к а в ы п о л н е н и я IN SE R T о т в е р га л а с ь , е с л и д а н н ы е н е с о о т в е т с т в о ­
проверяет каждую
в а л и у с л о в и ю WHERE в п р е д с т а в л е н и и p b _ d i m e s . П о п ы т к а в ы п о л н е ­
н и я UPDATE т о ж е п р и в е д е т к о ш и б к е :
попытку выполне­
ния вставки или
UPDATE p b _ d im e s SET c o i n = 'x ';
обновления данных
З н а ч е н и е ' x ' н е с о о т в е т с т в у е т у с л о в и ю WHERE в p b _ d i m e s ,
поэтом у данны е не обновляю тся. на соответствие
условию WHERE
Нельзя ли использовать представ­
ления с CHECK OPTION для создания
представления.
чего-то наподобие CHECK CONSTRAINT,
если вы работаете с MySQL?

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


но проверять команды INSERT на соответствие
условиям WHERE.
В с п о м н и т е « пр об л е м у пола», о к о т о р о й го в о р и л о с ь ра н е е в э т о й
гл а в е — н а б а з е т а б л и ц ы m y _ c o n t a c t s м о ж н о с о з д а т ь п р е д с т а в ­
л е н и е , к о т о р о е Д ж и м будет и сп о л ь зо в а ть для о б н о в л е н и я т у _
c o n t a c t s . П р е д с та в л е н и е будет вы д а ва ть о ш и б к у к а ж д ы й раз,
ко гд а Д ж и м п о п ы т а е т с я в с т а в и ть ' х ' в с то л б е ц g e n d e r .

В MySQJ, можно Ш ТУРМ

имитировать CHECK Как создать для my c o n t a c t s представле­


ние, которое заставит Джима ввести в поле
CONSTRAINT при по­ g e n d e r либо 'М', либо 'ж'?

мощи CHECK OPTION.


д а л ьш е * 501
о б н о в л я е м ы е и н е о б н о в л я е м ы е предст авления

Представление мо)кет быть обновляемым, если...


В п р и м е р е с та б л и ц е й p ig g y b a n k оба созд анны х нам и представ­
ления бы ли обновляемы ми. Обновляемое представление позво­
л яет изм енять табл ицы , на ко то р ы х о н о основано. В аж но, чтобы
о б н о в л я е м о е п р е д с т а в л е н и е в к л ю ч а л о в с е с т о л б ц ы NOT NULL и з
с в о и х та б л и ц . В это м случае п р и вста в ке с и сп о л ь зо в а н и е м п р е д ­ Обновляемое пред
ставл ения м о ж н о б ы ть уве р е н н ы м в то м , ч то ка ж д ы й стол бец, ко т о ­
р ы й обязател ьно д о л ж е н б ы ть запо л н е н, п о л у ч и т свое зн аче ни е . ставление вклю­
П о сути это означает, ч т о с со зд а н н ы м и на м и п р е д ста в л е н и ям и
м о г у т в ы п о л н я т ь с я в с е к о м а н д ы : I N S E R T , UPDATE и D E L E T E . Е с л и чает все столбцы
в п р е д с т а в л е н и е в к л ю ч а ю т с я в с е с т о л б ц ы NOT NULL, о н о с м о ж е т
п р е д о с та в и ть все н е о б х о д и м ы е д а н н ы е для сво е й та б л и ц ы . NOT NULL из
Т а кж е сущ ествую т необновляемые представления, в которые
в к л ю ч а ю т с я н е в с е с т о л б ц ы NOT NULL. К р о м е с о з д а н и я и у д а л е н и я ,
своих таблиц.
с необновляем ы м и представлениям и м о ж е т вы по л н яться то л ько
операция вы борки.

Если не считать CHECK OPTION, я не вижу


особой пользы от использования INSERT
в представлениях.

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


используются для выполнения команд INSERT,
UPDATE и DELETE.
Х о т я у н и х и м е ю т с я с в о и п о л е з н ы е п р и м е н е н и я (н а п р и м е р ,
о б е сп е че н и е ц е л о с тн о с ти д а н н ы х в M y S Q L ), о б ы ч н о п р о щ е
и с п о л ь з о в а т ь I N S E R T , UPDATE и D E L E T E с с а м о й т а б л и ц е й .
В ста в ка в п р е д с та в л е н и и м о ж е т п р и го д и т ь с я в то м случае, ес­
л и в нем вы во д и тся то л ь ко о д и н столбец, а остал ьны е стол бцы
з а п о л н я ю т с я NULL и л и з н а ч е н и я м и п о у м о л ч а н и ю . В т а к и х
с л у ч а я х IN SER T м о ж е т и м е т ь с м ы с л . Т а к ж е м о ж н о в к л ю ч и т ь в
п р е д с т а в л е н и е у с л о в и е WHERE, к о т о р о е о г р а н и ч и в а е т в с т а в л я ­
е м ы е д а н н ы е , и м и т и р у я о г р а н и ч е н и е CHECK в M y S Q L .

А е сл и вам ещ е н е д о с т а т о ч н о с л о ж н о с т е й , т о у ч т и т е , ч т о
об новл ени е в о зм о ж н о то л ько для пред ставл ени й, не сод ерж а­
щ и х а г р е г а т н ы х о п е р а т о р о в (SUM, COUNT, AVG и т . д . ) , а т а к ж е
т а к и х о п е р а т о р о в , к а к BETWEEN, HAVING, I N и NOT IN .

502 глава 11
транзакции для всех

Когда хорошая база данных плохо Ведет себя


М и с с и с Х а м ф р и с х о ч е т п е р е в е с ти 1000 д ол л а р о в
со с в о е го т е ку щ е го с ч е та н а с б е р е га те л ь н ы й счет.
О н а н а п р а в л я е т с я к б а н к о м а т у ...

О н а п р о в е р я е т баланс с в о и х с ч е то в , те ку щ е го
и с б е р е га те л ь н о го .

1000 5HnOLEЯr^5 30 5 Я П 0 1 Е Я П 5
1П С Н Е С Н Ш й 1П 5Я^^1П55

ЛЗ/

О н а вы бирает.

TRRn5FER 1000 5flnOLEOП5


FROn СНЕСКШй Т О 5Я1^1П55

О н а на ж им а е т кн опку.

Питание снова включилось.


СНБСКІПб 03
О н а п р о в е р я е т со сто я н и е св о и х счетов.

О ЗЯПОІЕЯПБ 30 БЯПОІЕЯПБ
т снЕСнто 1П З ЯІ ^ І Пй З

Банкомат жалобно пищит, и экран гаснет.

Сбой питания.
К у д а ж е и с п а р и л и с ь деньги м и с с и с Х а м ф р и с ?

504 глава 11
ограничения, предг':п'1а в л в н и я и транзакции

Удаление представлений
К о г д а к а к о е -л и б о п р е д с т а в л е н и е с т а н о в и т с я н е н у ж н ы м , уда­
л и т е е г о к о м а н д о й DROP V I E W . Э т о д е л а е т с я о ч е н ь п р о с т о :

DROP V IE W p b _ d im e s ;

Часто
"^ a A a B a e M b ;.10
БоТ)]ЪСь1

Можно ли получить список созданных представлений?


5: Ограничения CHECK и представления очень полезны
i тех случаях, когда с базой данных работает сразу несколь­
Представления хранятся в базе данных как таблицы. Коман­ ко людей. Но что произойдет, если два человека попытают­
ся одновременно изменить один столбец?
да SHOW TABLES выводит информацию обо всех представле­
ниях и таблицах. А для просмотра структуры представления,
как и для просмотра структуры таблицы, используется команда
DESC.
о • Чтобы ответить на этот вопрос, необходимо познакомиться
с транзакциями. Но сначала мы узнаем историю миссис Хам­
фрис, которой понадобилось получить деньги в банкомате.

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


в представлении?
Ограничения CHECK
Возможны разные варианты. Одни РСУБД разрешают
использовать представление, не возвращая данных. MySQL и представления помогают
позволяет удалить представление только в том случае, если
таблица, на которой оно основано, существует, хотя при этом вы
можете удалить таблицу, задействованную в представлении.
сохранить контроль над
В других РСУБД реализовано другое поведение. Поэксперимен­
тируйте со своей РСУБД и посмотрите, что получится. В общем
случае представления лучше удалять до удаления таблиц, на
базой данных при одновре­
которой они основаны.
менной работе нескольких
О
пользователей.
дал ьш е > 503
ограничения, п р е д с т а в л е н и я и транзакции

Что произошло с банкоматом

I D a t a v il l e
БАНКО М АТ;

Б А Н К О М А Т : Л Я ЭТО ШЕ nUCCUC ЗТЕ<1Ь ХЯПфРи С! П Р и В Е Т . HUC-


LUC х я п ф р и о [ R c o o u r i T j D = з в г г ц
Sa v i n g s & l o a n
М и с с и с Х а м ф р и с : С к а ж и т е , с к о л ь к о у м е н я д е н е г.

БАНКО М АТ: S E L E C T B f l L f l n C E FROf l С Н Е С К Ш й UHE R E


nccouDT_;o = звггь
S E L E C T B f l L R D C E FROIl S f l t ' i r i G S U H E R E R C C O U r i T . f D = 3 8 P P I : )
1000 HR ТЕКУЦЕЛ СЧЕТУ, 30 НЯ СВЕРЕГЯТЕ11ЬН0П
М и с с и с Х а м ф р и с : П е р е в е д и те 1000 д о л л а р о в с т е ку щ е го сче та
н а с б е р е га те л ь н ы й .

БАНКО М АТ: ЯУЯ НЕПРОСТЯЯ. n UCCUC ХЯПфРиС. НО Я


СПРЯВ,1ЮСЬ...
[CHECHinS.BHL > 1000. ЦЕНЕГ аостяточно]
[ С НЯ Т Ь 1000 с Т ЕКЧЦЕ Г О С Ч Е Т Я ]
[ПО№Я11УйОТЯ. ВСТЯВЬТЕ Buuuun...]
БАНКО М АТ:
Здесь произош ел
сдой питания. БАНКО М АТ:

Б А Н К О М А Т : ШШЩШЯ

Б А Н К О М А Т : Л Я ЗТО ШЕ nUCCUC ЗТЕ( 1Ь ХЯПфРи С! П Р и В Е Т . П и С -


CWC ХЯПФРИС [ R c c o u r i T j o -- з в г г и

М и с с и с Х а м ф р и с : С к а ж и т е , с к о л ь к о у м е н я д е н е г.

БАНКО М АТ: S E L E C T В Я С Я П С Е F ROH C H E C K I D G UHE RE


я с с о и п т _/D = з в г г ь
S E L E C T B f l L f l M C E F ROH S f l t ' i n G S U H E R E f l C C O U M T _ / D = З в г г ! : )
0 НЯ ТЕ1^ЧЦЕП СЧЕТУ. 30 НЯ C B E P E T R T E i l b H O n
БАНКО М АТ:
RUi РЯЗВЕ п о т н о Бить Ki J d RKOn п о 3 K P R H 4 P а о с в и й в н и я . пис-
с и с ЗТЕ(1Ь х н п ф р и с .

ШТУРМ
Можно ли сделать так, чтобы банкомат
не забыл о команде i n s e r t , выполняемой
в начале операции миссис Хамфрис?

А т е м в р е м е н е м в д р у го м м е с т е ...

да л ьш е ► 505
транзакции дл я всех, часть вторая

Новые неприятности с банкоматами


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

5аза данных с и н ф о р ­
м а ци ей о сост оянии
о6иА,его счет а М эр и
и Джонд.

Баланс
350 долларов

БАНКОМАТ; nPWSf Г, аШОН. СНОВЯ ТИР БАНКОМАТ: nPWflf г. ПЗРИ


йЧПЯЕиь. У ПЕНЯ йЕНЬГи AUUHUEP
Мэри: С ко л ько денег на моем
Джон: С к о л ь к о д е н е г н а м о е м счету? счету?

БАНКОМАТ: Думает (SELECT БАНКОМАТ: Думает SELECT


CHECKirtG.BflL FROn fl CCOUDTSJ CHECKmG. Sfl L FROn RCC0UrtTS:>
350 aO^ilRPOB 350 aoii^BPOB

Джон: Д а й м не 300 долларов. ДЗЫ НЬДЗЫ НЬ


БАНКОМАТ: Т Н Я Т ■S RLL УОи ТН1ПК ГЛ Мэри роется в сумочке в поисках
GOOD FOR. ТО GIt'E ПЕ П0Г1БУ. сотового телефона.
JUST USE ПЕ НПО ТНЕП lOnORE ПЕ.
ТО^Ь/^0 и ЗННЕиЬ. ЧТО йЕНЬГи U3 ПЕНЯ Мэри: Д а й м не 300 долларов.
ТЯииТЬ. nPUUEd. ВЗЯ/1 - и ПР0ПЯ,1.
БАНКОМАТ: ЗЯПРОСТО.
[СНЕС1^тО_ВЯС> 300. йЕНЕГ йОСТЯТОЧНО] 350 долларе!
3 5 0 дол (CHECKiriG.BflL > 300. SHE HRS
[СНЯТЬ 300 со СЧЕТЯ] ЕПОивН П0ПЕЧ1 [СНЕСК/П5 BRL >
300. ДЕНЕГ йОСТЯТОЧНО]
fSUSTRflCT 300 FROnCHECmnG_BRLJ
50 долларов
[ЧПЕНЬииТЬ СНЕСКтЗ.ВЯС ня 300] __ __ [С_НЯТЬ_30в СО_СЧЕТ_Я]

Джон забирает деньги и уходит. 7 [упЕНЬииТЬ CHECKinO.BRL НЯ 300]


Проблема 2 5 0 д о л л а р о в
БАНКОМАТ: ПОНЯ. йШОН. 3B0HU. возникла БАНКОМАТ: У ВЯС БОПЬиОЙ
здесь. ПЕРЕРЯСХОД.

506 ■глава 11
ограничения, п р е д с т а в л е н и я и транзакции

да л ьш е > 507
анатомия т р а н за кц и и

Это не мечты, а транзакции


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

Если баланс текущего счета >= 1000

Уменьшить баланс текущего счета на 1000

Гри операции образуют Увеличить баланс сберегательного счета на 1000


одну единицу работы
‘^ о и е с т ь транзакция.

Д ж о н и М э р и п ы т а ю т с я о д н о в р е м е н н о в ы п о л н и т ь од ну и т у
ж е т р а н за к ц и ю .
Д ж о н и Мэри одновременно п ы т а ­
ют ся снят ь по 3 0 0 долларов.

Если баланс текущего счета >= 300 Если баланс текущего счета >= 300

Уменьшить баланс текущего счета на 300 Уменьшить баланс текущего счета на 300

Выдать 300 долларов Выдать 300 долларов

~^~ранзакция
Джона. Транзакция
Банане Мэри.
3 5 0 д ол я ар ов

Б а н к о м а т М э р и в о о б щ е н е д о л ж е н о б р а щ а т ь с я к с ч е т у (д а ж е
д л я п р о в е р к и б а л а н с а ), п о к а б а н к о м а т Д ж о н а н е з а в е р щ и т
о б р а б о тку т р а н з а кц и и и не с н и м е т б л о ки р о в ку с нее.

Е1сли в ходе транзакции не удается выпол­


нить хотя_бы ^^ то не выполня
ется ни одна операция.
508 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

СбойетВа транзакций
Ч т о б ы н а б о р ко м а н д S Q L м о г с ч и та ть с я т р а н з а кц и е й , о н д о л ж е н обл адать че ­
ты рьм я свойствам и; атом арностью , цел остностью , и зо л и р о ва н н о стью и у сто й ч и ­
во стью . В а н гл и й с ко м я зы ке э т о т н а б о р с в о й с тв ч а сто о б о зн а ча е тся с о кр а щ е н и ­
е м А С Ш ( A t o m ic i t y , C o n s is te n c y , I s o la t io n , D u r a b i l i t y ) .

Атомарность
З а в е р щ а ю тс я л и б о все о п е р а ц и и , в х о д я щ и е в т р а н з а к ц и ю , л и б о н е заверщ а-
Л' л> ется н и одна. Т р а н за кц и я не м о ж е т б ы ть вы п о л н е н а ч а сти ч н о . Д е н ь ги м и с­
ЛППНГІП
с и с Х а м ф р и с п р о п а л и н е и з в е с т н о куд а и м е н н о п о то м у , ч т о б ы л а в ы п о л н е н а
то л ь ко часть тр а н за кц и и .

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

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

Устойчивость
П о с л е з а в е р ш е н и я т р а н з а к ц и и база д а н н ы х д о л ж н а с о х р а н и т ь и з м е н е н н ы е
II д а нны е , за щ и ти в и х о т сбоев п и та н и я и л и д р у ги х о п а сн о сте й . О б ы ч н о
1ИКЛВІШЛ
для э т о го о п и с а н и е тр а н з а кц и и со хр а н я е тся вне о с н о в н о й базы д а н н ы х.
Е с л и б ы з а п и с ь о т р а н з а к ц и и м и с с и с Х а м ф р и с х р а н и л а с ь о т д е л ь н о , т о ее
1000 д о л л а р о в в е р н у л и с ь б ы н а счет.

да л ьш е ► 509
управление транзакциями в s q l

$01 помогает работать е транзакциями


c h e c k ie g
Р а с с м о т р и м о ч е н ь п р о с т у ю базу д а н н ы х д ля
банка. О н а с о с т о и т и з та б л и ц ы с д а н н ы м и e s e r* ^ c c o u n t _ id
владельцев сче то в , та б л и ц ы т е ку щ и х сче то в a c c o u n tjd 0 " т г - b a la n ce
и та б л и ц ы с б е р е га те л ь н ы х сч е то в . la s t_ n a m e
f ir s t_ n a m e
И ещ е много s a v in g s
phone
других столбцов. e m a il ♦ a c c o u n t_ id
V
a d d re ss b a la n ce
П р и работе с тр а н за кц и я м и в S Q L
испол ьзую тся т р и ком анды .

/команда Здесь Р С У 5А начина­


) сообщает е т следит ь за вы пол­
START TR A N S A C TIO N ; SQL о начале нением ваилего кода.
п^ранзакции.
START TRANSACTION от сж ж ивает выпол­
нение всех последующ их ком анд SQL в п л о т ь
д о в ы п о л н е н и я COMMIT и л и ROLLBACK.

Команда
зак репляет
р езу л ьт а т ы
C O M M IT; всего вы пол­ Если р е з у л ь т а т выполне­
ненного кода. ния кода вас у ст р а ива ет ,
вы зак репляет е изменения
Е сл и все ко м а н д ы в ы п о л н е н ы у с п е ш н о
в базе данных командой
и все в ы гл я д и т х о р о ш о , закрепит е изме­
COMMIT...
нения ко м а н д о й COMMIT.

'команда воз- ..или выполните коман-^


' ^ Р ^ т е т базц ду ROLLBACK, чтобы
ROLLBACK; данных к со ст о - вернут ь базу данных к
^0 начала состоянию до начала
•^Р^изакции транзакции.
Е сл и ч т о -т о п о ш л о не т а к , ко м а н д а Ваш код.
ROLLBACK от меняет все изменения,
и база д а н н ы х в о зв р а щ а е т с я к со ­ / Д о начала
стоянию до ввода ком анды S T A R T транзакции.
TRANSACTION.

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

510 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Как до/икен был работать банкомат


БАНКОМАТ: ЛЯ - ЛЯ - ЛЯ...
БАНКОМАТ: ЛЯ ЗТО ШЕ PILICCUC 1ТЕЛЬ ХЯПфРИС! ПРиВЕТ. ПИС-
D a t a v il l e сис хяпфрис [RCCOUHTJO = з в г г и
Sa v i n g s & l o a n
Миссис Хамфрис: С к а ж и т е , с к о л ь к о у м е н я д е н е г.

БАНКОМАТ: Д))л«аетеГ SELECT BflLflnCE FROH CHECKIflG UHERE


яссоипт _10 = Звгг!:
SELECT BflLflMCE FROn Sflt'IDGS UHERE flCCOU«T_ID = ЗВ гг1:1
1000 HR ТЕ>^ЧЦЕП СЧЕТУ. 30 HR CBEPETRTEilbHOn

Миссис Хамфрис: П е р е в е д и те 1000 д олл аров с те ку щ е го счета


н а с б е р е га те л ь н ы й .

БАНКОМАТ: 3RdR4R НЕПРОСТЯЯ. HUCCUC XRn$PUC. НО Я CflPRB-


/1ЮСЬ...
[5 TRRT TRRnSRCTIOri:

[SELECT BRLRHCE FROH СНЕСШПв UHERE RCCOUHT_ Ш -З В В г 1}

БАНКОМАТ: 1000 HR ТЕКЧЦЕП СЧЕТЧ. ПОШНО ПРОйО/ИИНТЬ.

БАНКОМАТ: [U PORTE СНЕСШПО SET BRLRHCE = BRLRHCE - 1000


UHERE RCCOUHT.ID = э в г г1 ]

[П0ЩВ(1ЧйСТН. BCTRBbTE BUUHUO...]

З д е с ь произошгл В1^,1ЮЧИЕТСЯ РЕЗЕРВНОЕ RUTRHUE-. OTREHR TPRH3RI^ULIU


с5ои Ш‘п\ания-

БАНКОМАТ:
БАНКОМАТ:
БАНКОМАТ:
БАНКОМАТ:ЛЯ ЗТО ШЕ RUCCUC ЗТЕ(1Ь ХЯПфРиС! ПРИВЕТ. ПиС-
К о м а н д а COMMI Г сис хнпфрис [ r c c o u h t j o = з в г г 1]
не б ы л а в ы п о л н е н а ,
п оэт ом у сост ояние Миссис Хамфрис: С к а ж и т е , с к о л ь к о у м е н я д е н е г.

базы данны х не из - A T M : Д у м а е т SELECT BflLflDCE FROO CHECKIMG UHERE


м енилось. RccouriT_m = звгг i.
SELECT BflLflMCE FROn Sfll^lMGS UHERE flCCOUnT_/D -ЗВггЬ)
HR ТЕКЧЦЕП СЧЕТЧ. 30 HR СВЕРЕГНТЕПЬНОП

да л ьш е у 511
mysql и т р а н за кц и и

Как работать
с транзакциями 6 MySQL Команда для экономии Времени
Влглянкте на код. который использовался для создаиия таблицы н а с. 217,
и п р н в с л п т ы й ни ж е результат выполнения команды SHOW CR£ATE
Ч то б ы использовать тр а н за кц и и TABLE m y _c on r.ac t s. Э тн фра1мснты не ндектичны , но если вставить
этот код в команду CREATE TABLE, резу льтат будет тем же. Удалять обрат­
ные апострофы илн параметры данных не н уж но, но е с л и : » т о сделаете.
в M yS Q L, необход им о вы брать пра­ команда нс1л>'чится более компактной.

вильное яд ро хр а н е н и я д а нны х. Так /


Иш.па ..
-■4». I
назы вается м е ханизм , о б е сп е чи ва ю щ и й Jmu сил'.ва-.а
<Rt-'AVt глн:,[
хр а н е н и е всей и н ф о р м а ц и и и стр уктур SOLC4i(»v\rtf>v>,
СГЛОА^Ц^ no 1(/Л0Л -
базы д а н н ы х. О д н и т и п ы ядер подд ер­
C R EA TE T A B L E 'm y contacts' инициал^" -
р^изтса чпиченпем
ж и в а ю т т р а н з а к ц и и , д р у ги е и х н е п о д ­
^ULL(еслк ивиоис
'last_name' varchar(30) default NULL, ,\адаи1У Эрягос ?ип•
'first_Naine' varchar(20) default NULL, иений}.
держ иваю т.
'email' varchar(50) default NULL, При со^даи.«4 та -
'gender' char(l) default NULL, блицо! r.cAamt/\tHo
В с п о м н и т е , к а к в гл а в е 4 м ы р а с с м а т р и ­ укази/вдти,. мо -
'birthday' date default NULL, жет Ai.1 стол5еи.
вали результат в ы п о л н е н и я ко м а н д ы 'profession' varchar(50) default NULL, с о д б р л .а т ь N U LL.

'location' varchar(50) default NULL,


SHOW CR EA TE TABLE m y _ c o n t a c t s ; 'status' varchar(20) default NULL,
'interests' varchar(lOO) default NULL,
'seeking' varchar(100) default NULL,
E N G m B -N rlSM f VBSKJLT СНАКЗЕТ«Сф1251
A т е п е р ь выбор ядра
хранения с т а ^ д л я нас T
He обращайте бнмлллнкя на
существенным.
тексм после закрывающей
круглой скобки. Он описыва­ Если скопировать и выпол-
ет механизм хранения данных нитьэтоткрд, он создаст
и u c n 0 A t '3 y e M y h 0 кодировку таблицу.
символоб. Пока нас устроят
значения по умолчанин). '

Проследите за тем, чтобы


было выбрано ядро ВОВ
или 1ппоОВ — только эти
два ядра поддерживают
Х ппоО В и В О В — два р а зн ы х м еха­
транзакции.
низм а, и сп о л ьзуе м ы х Р С У Б Д для
хранения инф орм ации.

О н и н а зы в а ю тся я д р а м и х р а н е н и я д а н н ы х , и в ы б о р л ю б о го
и з н и х п о з в о л и т вам и сп о л ь зо в а ть т р а н з а кц и и . За д о п о л н и ­
тельной инф орм ацией о разл ичиях между ядрами хранения
д а н н ы х M yS Q L обращ айтесь к д о кум е нта ц и и .

Д л я н а ш и х целей н е в а ж н о , ка ко е и з двух ядер вы вы берете.


Д л я с м е н ы я д р а и с п о л ь з у е т с я к о м а н д а с л е д у ю щ е го вида:

A LTER TABLE я м я т а б л т щ TYPE ~ In n o D B ;

512 глава 11
ограничения, п р е д с т а в л е н и я и транзакции

Теперь попробуйте сами


П р е д п о л о ж и м , м ы р е ш и л и п р е в р а т и т ь все
1 -ц е н т о в ы е м о н е т к и в к о п и л к е (Р ) в 2 5 -ц е н т о в ы е ( Q ) .

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


p ig g y b a n k , с о з д а н н о й р а н е е в э т о й гл а в е . В п е р в о й
т р а н з а к ц и и б у д е т и с п о л ь з о в а н а к о м а н д а ROLLBACK,
о тм е н я ю щ а я все и зм е н е н и я .

S T A R T T R A N S A C T IO N ;

SELECT * FROM p i g g y _ b a n k ;

UPDATE p i g g y _ b a n k set c o in = 'Q ' w here c o in = ' P ';

SELECT * FROM p i g g y _ b a n k ; < ------- Здесь изменения ещ е видны.


ROLLBACK; ------ Передумали.
,,..д здесь их уже н ет.
SELECT * FROM p i g g y _ b a n k ; ^

В т о р о й р а з и с п о л ь з у е м к о м а н д у COMMIT, п о т о м у ч т о и з ­
м е не н ия нас устраиваю т.

S T A R T T R A N S A C T IO N ;

SELECT * FROM p i g g y _ b a n k ;

UPDATE p i g g y _ b a n k set co in = 'Q ' w here c o in = 'P';

SELECT * FROM p i g g y _ b a n k ; < --------Здесь изменения euie видны...

CO M M IT; — - Закрепление транзаки,ии.


SELECT * FROM p i g g y _ b a n k ; — ,u з д е с ь тОЖ е.

д ал ь ш е > 513
в о з ь м и в р у к у карандаш

- ^ Возьми В руку карандаш


Запишите сод ер ж и м о е базы дан­ piggy_bank
ных p i g g y b a n k посл е вы полне­
ния транзакций. Сейчас база дан­
M coin c»in_year
ных содержит следующие данные. 1 Q 1950
2 P 1972
3 N 2005
4 Q 1999

START T R A N S A C T IO N ; id coin coin_year


1
UPDATE p i g g y _ b a n k set c o in = 'Q ' w here c o in = 'P '
2
AND c o i n _ y e a r < 1970; 3
4
COMMIT;

START T R A N S A C T IO N ; id coin coin_yeor


1
UPDATE p i g g y _ b a n k set co in = 'N ' w here c o in = 'Q'; 2
ROLLBACK; 3
4

S T A R T T R A N S A C T IO N ;
id coin coin y o « '
UPDATE p i g g y _ b a n k set co in = ' Q' w here c o in = 'N '
1
AND c o i n _ y e a r > 1950; 2
3
ROLLBACK; 4

S T A R T T R A N S A C T IO N ;
id coin coin_y«or
UPDATE p i g g y _ b a n k set c o in = 'D ' w here co in = 'Q ' 1
2
AND c o i n _ y e a r > 1980;
3
COMMIT; 4

S T A R T T R A N S A C T IO N ; id coin coin_yoar
1
UPDATE p i g g y _ b a n k set co in = 'P ' w here c o in = 'N '
2
AND c o i n _ y e a r > 1970; 3
4
COMMIT;

OipBem Ha c. 518-

514 гл ава 11
ограничения, п р е д с т а в л е н и я и транзакции
Часто»
'^ а Д а Б а е М ы е
Б о ї^ С ь і
вреда для самих таблиц в случае ошибки. Только не забудь­
Необходима ли команда START TRANSACTION, или те выполнить COMMIT или ROLLBACK после завершения
COMMIT и ROLLBACK будут работать без нее? экспериментов.

О Вы должны сообщить своей РСУБД о начале транзак­


ции командой START TRANSACTION. Это необходимо для Нельзя ли обойтись без COMMIT и ROLLBACK?
того, чтобы РСУБД знала, до какой точки следует отменить
выполненные операции. Ваша РСУБД регистрирует все операции, выполняемые
внутри транзакций, в журнале транзакций: чем больше вы
выполняете операций, тем больше места занимает журнал.
Можно ли использовать START TRANSACTION Постарайтесь применять транзакции только тогда, когда
просто для того, чтобы проверить работу некоторых вам действительно необходимо иметь возможность отмены
запросов? выполненных действий, чтобы не расходовать понапрасну
дисковое пространство, а вашей РСУБД не прихсщилось
Можно и нужно. Это отличный способ поэксперимен­ выполнять лишнюю работу по отслеживанию выполняемых
тировать с запросами, изменяющими данные таблиц, без действий.

АЛне все еще нужно придумать,


как полностью закрыть доступ к некоторым
таблицам. Скажем, мой новый бухгалтер должен
работать только с таблицами зарплаты, и толь­
ко. А еще нужно сделать так, чтобы некоторые
пользователи могли использовать SELECT, но
операции INSERT, UPDATE и DELETE были им
ЗАПРЕЩЕНЫ.

Как организовать контроль за доступом


пользователей к базе данных?

Об этом вы узнаете в следующей главе.

дальш е ► 515
краткий обзор sql

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

Обновляемое представление
Представление, которое
позволяет изменять) дан­
ные в базовых таблицах.
ка к Обновляемые представ­
Транзакция
ления должны содержать
командJ вы­ все столбцы NOT n u l l своих
полняемых как единое ^^•^росов. ^''^OCtnot базовых таблиц.
целое. Если выполнение
хои(\я бы одной коман­
Необновля емое
ды будет прервано, представление
то отменяи>тся сразу
все команды.
START TRANSACTION

К-оманда, сообщаюи^ая
о начале т ран­
закции. Все дальнейшие Ограничения хфоверки
изменения существу­ Ограничения, разреш аю­
ют лишь временно, щие вставку или обнов­
пока не будет выпол­ ление в таблице только
нена команда ссялшт. конкретных значений.
Транзакция продолжает
выполняться, пока она
либо не будет закре­ |сНЕСК OPTION
плена командой ссйосгт, Ключевые слова, ис­
либо отменена коман­ пользуемые при создании
дой ROLLBACK, в случае обновляемого представ­
отмены база данных ления; дальнейшие опе­
возвращается в сост о­ рации вставки и обнов­
яние, в котором она ления проверяются на
находилась до выполне­ соответствие условию
ния START TRANSACTION. WHERE |^|зеЭстдблениЯ.

516 сл а е а 11
ограничения, п р е д с т а в л е н и я и транзакции

^ о з ь м и в руку карандаш
Решение Фрэнк вы полняет запр ос S E L E C T на с. 4 9 6 с использован ием нового
представления j o b _ r a i s e s . Как ему упорядочить результаты в алфа­
Со с. 497.
витном порядке по фамилиям?

Нужно добавить ORPER BY last_name


либо в команду создания п р е д с т а в л е ­
ния, либо в команду S ELEC T при его
использовании.

да л ьш е * 517
возьми в руку карандаш, р е ш е н и е

- ^ош \А В руку карандаш


Решение Запишите содержимое базы piggy_bank
данных р 1 д д у _ Ь а п к после
Со с. 514. id coin c«in_year
выполнения транзакций. Сейчас
1 Q 1950
база данных содержит следующие
2 P 1972
данные.
3 N 2005
4 Q 1999

S T A R T T R A N S A C T IO N ; id coin coin_year
UPDATE p i g g y _ b a n k set co in = 'Q ' w here c o in = 'P '
1 <5 г я 50
2 P г й 17.
AND c o i n _ y e a r < 1970;
3 N 2 .0 0 5
Совпадений н е т - a з н а ­ 4 Q
ч и т, н е т и изменений.

START T R A N S A C T IO N ; Id cein coin_year


1 г я 50
UPDATE p i g g y _ b a n k set c o in = ' N' w here c o in = 'Q'
2 P г я 17-
ROLLBACK; ----------------- ^ О т м ен а , изменений нет. 3 N 2005
4 Q гяйя

START T R A N S A C T IO N ;
id cein c»in_y«ar
UPDATE p i g g y _ b a n k set c o in = 'Q ' w here co in = 'N '
1 Q ХЯ5 0
AND c o i n _ y e a r > 1950; 2 P 1 .9 7 2
ROLLBACK; ^— - Qm MCHa, u 3 MeHeHuu Hem. 3 N 2005
4 Q 1- ЯЯЙ

START T R A N S A C T IO N ;
id coin coin_yoar
UPDATE p i g g y _ b a n k set c o in = 'D ' w here co in = '-Q-
Q' 1 ХЯ5 0
2 p 19 72
AND c o i n _ y e a r > 1980;
3 N 2005
COMMIT; И змененная запись.
? 4 V 1999

START T R A N S A C T IO N ; Id coin coin_year


1 1950
UPDATE p i g g y _ b a n k set c o in 'P ' w here c o in = 'N '
2 p 1972
AND c o i n _ y e a r > 1970; 3
Измененная запись. — p 2005
COMMIT; 4 1999

518 гп ав а 11
12 )е 5 о ц а с :н о а ііь

Защита данных

Вы потратили массу времени и сил на создание базы


данны х, и если теперь с ней что-нибудь случится, это будет полной ката­

строфой. Кроме того, вам приходится предоставлять другим пользователям


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

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

Проблемы С пользователями
С б о р д а н н ы х о кл о ун а х в Д е й та в и л е развернул ся
н а с то л ь ко ш и р о к о , ч то го р о д с к о й со ве т нанял целую
г р у п п у р а б о т н и к о в д л я н а б л ю д е н и я за к л о у н а м и
'Лжордж»
и за н е с е н и я и н ф о р м а ц и и в базу д а н н ы х c lo w n _
tra c k in g .

К со ж а л е н и ю , в гр у п п у п р о н и к п е р е о д е ты й кл о ун,
и з в е с т н ы й п о д к л и ч к о й « Д ж о р д ж » . О н созд ал ц е л ы й I nvest
р я д п р о б л е м в базе д а н н ы х , в к л ю ч а я п о т е р ю ........ Security deveiope
и неж елательное и зм енение д а н н ы х, а та кж е п о ч ти
с о в п а д а ю щ и е з а п и с и , с у щ е с т в у ю щ и е т о л ь к о и з-за
преднам еренны х опечаток. В от лиш ь не которы е
из в о зн и кш и х проблем :

в таблице c lo w n jn fo имеются записи клоунов с именами Снаглз, Снагглз


и Снуглэ. Мы уверены, что это один и тот же клоун, потому что столбцы
gender и description во всех случаях совпадают (различаются только имена).

Лишние записи в таблице c lo w n jn fo создают массу проблем с просмотром


информации. Так, в таблице in fo jo c a tio n используются идентификаторы
разных записей Снаглз, Снагглз и Снуглз из таблицы c lo w n jn fo .

Info Mtlvilio« activltlos


id .a c tiv ity id O " T r
1
a c tiv ity _ id 1 a c tiv ity

clewn inf*
id
nam e

gender
Info location location
d e s c rip tio n lo c a tio n id
boss id lo c a tio n
lo c a tio n _ id

w hen

520 глава 12
безопасность

Предотвращение ошибок в базе данных


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

Т акж е п р и и спр а вл е ни и о ш и б о к необход им о действовать о с то р о ж н о —


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

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

- ^ о з ь м и в руку карандаш
Защитите базу данных от во зм о ж н о го саботаж а со стороны клоунов.
С каждой стороны запишите некоторые запросы, которые должны быть
разреш ены (или запрещены ) новым работникам. Там, где это возможно,
укажите имена таблиц.

Операции, которые следует разрешить новым Операции, которые следует запретить новым
работникам. работникам.
пример-. S ELECT fro m activities п р и м е р : DROP TABLE on clow njn fo

д ал ь ш е ► 521
возьми в руку карандаш, р е ш е н и е

- ^ В о зь м и в руку карандаш
V \ш ен и е Защитите базу данных от возмож ного саботажа со стороны клоу­
нов. С каждой стороны запишите некоторые запросы, которые
должны быть разреш ены (или запрещены) новым работникам.
Там, где это возмож но, укажите имена таблиц.

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

п р и м ер : S ELEC T From activities п р и м е р : PROP TABLE on clow njn fo

S ELECT From clo w n jn fo , PROP TABLE on clo w n jn fo , info_


info_activities, activities, activities, activities, infojocation, location
infojocation, location
INSERT on clo w n jn fo , info_activities,
activities, infojocation, location

UPPATE on clo w n jn fo , info_activities,


activities, infojocation, location

ALTER on clo w n jn fo , info_activities,


activities, infojocation, location

PELETE on clo w n jn fo , info_activities,


activities, infojocation, location

Хорошие новости — мы м ож ем помешать


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

522 гл ава 12
безопасность

Защита учетной записи roof


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

П о у м о л ч а н и ю п е р в ы й п о л ь зо в а те л ь — ro o t — м о ж е т в ы п о л н я т ь с б а зо й
д а н н ы х л ю бы е о п е р а ц и и . Э то ва ж н о , п о то м у ч то пользователь ro o t дол­
ж е н и м е ть в о зм о ж н о с ть созд авать у ч е тн ы е за п и с и д р у ги х пол ьзо в а те л е й .
О гр а н и ч и в а ть права ro o t не н у ж н о , н о у ч е тн о й за п и си ro o t не о б хо д и м о
н а з н а ч и т ь п а р о л ь . В M y S Q L э т о д елается сл е д ую щ е й ко м а н д о й ;

SET PASSWORD FOR ' r o o t ' @' l o c a l h o s t ' = PASSWORD( ' b 4 d c l Оw n Z ' )

И мя п р и ви л еги ро ­
«
t
localhost» указывает где Пароль, назна­
ванного п о л ь з о в а ­ установлено и вы полняет ­ ченный п о л ь з о ­
т еля — 'root'. ся п ро гр ам м н ое одеспече- ва т елю root.
Hue SQL.

В д р у г и х Р С У Б Д и с п о л ь з у ю т с я д р у г и е к о м а н д ы . Н а п р и м е р , в O r a c le
ко м а н д а в ы гл я д и т та к:

a lte r user root id e n tifie d by н о в ы й -п а р о л ь ;

Е сли вы работаете с базой д а н н ы х че р е з гр а ф и ч е с ки й и н те р ф е й с,


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

За и н ф о р м а ц и е й о защ ите у ч е тн о й за п и си ro o t о б р ащ айтесь к д о­


кум ентации своей РС УБ Д .

Ч а ст р о

^аД аБ аеМ ы е
B o lîjo d b l

А что означает это <1оса1Ьо8»7 Можете объяснить под­ А если я работаю с SQL-клиентом на другом компьютере?
робнее?
Это называется удаленным доступом. Вы должны указать
1оса1Ьоз1 означает, что для выполнения запросов исполь­ в запросе меаонахождение этого компьютера; в этом случае
зуется тот же компьютер, на котором установлена РСУБД, Значе­ localhost заменяется IP-адресом или именем хоста. На­
ние lo c a lh o s t используется по умолчанию, поэтому включать пример, если РСУБД установлена на компьютере с именем
его в команду не обязательно. kumquats в сети издательства O'Reilly, то имя будет иметь вид
root@kumquats.oreilly.com.

да л ьш е > 523
создание н о в о го п о л ь зо в а т е л я

Создание нового пользователя


В о п р о с , о тв е т на к о т о р ы й вам , в е р о я тн о , о че ви д е н :

К а к SQL хранит инф ормацию о пааьзоватпелях?

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

С о зд а ние н о в о го пользователя м о ж н о н а ча ть с и м е н и и па­


роля. В S Q L ко м а н д ы для со зд а н и я по л ьзо в а те л е й не сущ е­
ствует, н о в б о л ь щ и н с тв е Р С У Б Д и с п о л ь зу ю тс я ко м а н д ы
с л е д у ю щ е го ви да:
Имя пользователя
для нашего нового
работника — Элси.
CREATE USER e l s i e 8 0 Ь не опре­
ID E N T IF IE D BY ' c l3 v 3 r p 4 s 5 w 0 r d ' деляет синтак­
сис управле­
^ У д ь те
Пароль
J оСш ороЖ Ны !
ния пользова­
телями.
Синтаксис команд создания
пользователей зависит от кон­
--------- кретной РСУБД. За информацией
Разве нельзя запретить о том, как следует создавать
Элси доступ к некоторым пользователей в вашей РСУБД,
таблицам при создании обращайтесь к документации.
учетной записи?

Можно, но иногда мы еще не знаем, какой


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

524 глава 12
безопасность

Решите, что необходимо ка)кдому пользобатедю


М ы созд али у ч е тн у ю за п и сь Э л си . П о к а о н а не и м е е т р а зр е ш е н и й для в ы п о л н е н и я
к а к и х -л и б о о п е р а ц и й . Ч т о б ы р а з р е ш и т ь е й в ы п о л н е н и е л ю б ы х о п е р а ц и й с c lo w n _
i n f o (д а ж е п р о с т о й в ы б о р к и ) , н е о б х о д и м о и с п о л ь з о в а т ь к о м а н д у GRANT.

В о т л и ч и е о т у ч е т н о й з а п и с и ro o t, к о т о р о й р а з р е ш е н о в ы п о л н е н и е л ю б о й к о м а н д ы
S Q L с л ю б ы м о б ъ е к т о м б а з ы д а н н ы х , у ч е т н ы м з а п и с я м н о в ы х п о л ь з о в а т е л е й за­
п р е щ е н ы л ю б ы е д е й с тв и я . Ч т о б ы р а з р е ш и т ь п о л ь зо в а те л я м ка ки е -л и б о о п е р а ц и и
с базой д а н н ы х, н е о б хо д и м о в ы п о л н и ть ко м а н д у GRANT.

Имя базы П о л ьзо в а те л и .


w o o d la n d _ c o tta g e ^
'данных.

tallcing_aniaals
ч
animaLM
Y Y
А II
1 blue bird
Y Y
2 badger
N N L
3 deer
Y Y bashful doc dopey
4 Таблицы.
chores
chore M chore name time

1
к
1 washing up 9:30 pm
2 sewinq 10.00 am i\ i\
4
3 cooking
making beds
5;00 pm
7:35 am
kitchen
bedroom
grumpy h appy sleepy
A
sneezy

Изменение таблицы разрешается только


некоторым пользователям.
Н о вы е запи си в табл ице c h o re s м о гу т д о б а вл яться т о л ь к о а д м и н и с тр а ­
то р о м базы д а н н ы х. Т ол ько пол ьзовател ь ro o t м о ж е т в ы п о л н я ть ко м а н д ы Команда GRANT
INSERT, UPDATE и DELETE д л я э т о й т а б л и ц ы . П о л ь з о в а т е л ь h a p py
з а т а б л и ц у t a l k i n g a n im a ls и м о ж е т и з м е н я т ь е е с т р у к т у р у к о м а н д о й точно определя­
ALTER, а т а к ж е в ы п о л н я т ь д р у г и е о п е р а ц и и .
ет, какие опера­
Выборка из таблицы разрешается только
некоторым пользователям. ции с таблицами
В ы б о р ка из таб л иц ы t a lk in g _ a n im a ls р а зреш ается всем по л ьзо ва те л ям ,
к р о м е gru m p y . и столбцами мо-
Даже внутри таблиц могут действовать свои ограничения: lyr выполняться
некоторые пользователи могут видеть лишь часть столбцов.
В с е , к р о м е dopey, м о г у т п р о с м а т р и в а т ь с о д е р ж и м о е с т о л б ц а
пользователями.
in s tr u c tio n s таблицы c h o re s .

д а л ьш е > 525
команда GRANT

Простая команда GRANT


И т а к , н а д а н н ы й м о м е н т Э л с и з а п р е щ е н о в ы п о л н е н и е к а к и х -л и б о о п е р а ­
ц и й . О н а м о ж е т п о д кл ю ч и ть ся к Р С У Б Д со сво и м им енем пользователя
и п а р о л е м , н о э т и м все и о гр а н и ч и в а е т с я . Ч т о б ы Э л с и м о гл а в ы п о л н и т ь
ко м а н д у SELECT с та б л и ц е й c lo w n i n f o , ей необ ход им о предоставить
соответствую щ ее разрешение. Э то делается сл е д ую щ е й ко м а н д о й .

Пользователю р а зр еш а ет ся
выполнять команду SELECT...

GRANT SELECT ON , 3^,,^


C lO W n _ _ in fO _____ ^ таблицей.

TO e X s i e / ^ ' Разрешение п р е д о ­
ст авляет ся пользова
т е л ю с и м ен ем elsie.

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

GRANT SELECT ON a c t i v i t i e s TO e l s i e ;
GRANT SELECT ON l o c a t i o n TO e l s i e ;
GRANT SELECT ON i n f o _ a c t i v i t i e s TO e l s i e ;
GRANT SELECT ON i n f o lo c a tio n TO e l s i e ;

526 глава 12
безопасность

4^
^ п р ааЖНбНИб
ж н
Попробуйте предположить, что делают следующие команды g r a n t д л я базы данных
woodland_cottage (с. 525).

Команда Что она делает?

1. GRANT IN SERT ON m a g i c _ a n i m a l s
TO d o c ;

2. GRANT D E L E T E ON c h o r e s
TO h a p p y , s le e p y ;

3. GRANT D E L E T E ON c h o r e s
TO h a p p y , sle e p y
WITH GRANT O P T I O N ; ........................
^ ----------^ Подсказка: это
4. GRANT S E L E C T ( c h o r e _ n a m e ) ON .
chores TO d o p e y ;

5. GRANT S E L E C T , I N S E R T ON
ta lk in g _ a n im a ls
TO s n e e z y ;

6. GRANT A L L ON t a l k i n g _ a n i m a l s
TO b a s h f u l ;

Теперь попробуйте самостоятельно написать несколько команд g r a n t .

7. Разрешить пользователю doc выборку из таблицы


chores.

8. Разрешить пользователю sleepy удаление


из таблицы talking_animals, а также разрешить
sleepy предоставлять разрешение на удаление из
talking_animals любому другому пользователю.

9. Разрешить всем ( a l l ) пользователям выполнение


любых операций с chores.

10. Разрешить пользователю doc выборку из всех


таблиц базы данных woodland cottage.

да л ьш е > 527
уараж н в м ив . р е ш е н и е

Попробуйте предположить, что делают следующие команды g r a n t для базы данных


woodland_cottage (с. 525).

ажнение Команда Что она делает?


реш ение

1. GRANT I N S E R T ON m a g i c _ a n i m a l s Р азр еш ает п ользоват елю doc


TO d o c ; вставку в таблицу magic_animals.

2. GRANT D E L E T E ON c h o r e s Р азреш ает happy и sleepy -----


TO h a p p y , s le e p y ; удаление из таблицы chores.

3. GRANT D E L E T E ON c h o r e s Р азреш ает happy и sleepy удаление из


TO h a p p y , s le e p y таблицы chores, а т акже п р е д о ст а в ­
WITH GRANT O P T I O N ; ление другим того же разрешения.

4. GRANT S E L E C T ( c h o r e _ n a m e ) ON Р азр еш ает dopey выборку только из


chores TO d o p e y ; столбца ch o rejn a m e таблицы chores.

5. GRANT S E L E C T , IN SERT ON Р азр еш ает sneezy выборку и в ст а в ­


ta lk in g _ a n im a ls ку в таблицу talking_animals.
TO s n e e z y ;

6. GRANT A L L ON t a l k i n g _ a n i m a l s Р азр еш ает bashful выборку, обновле­


TO b a s h f u l ; ние, вставку и удаление с таблицей
talking_animals.

Теперь попробуйте самостоятельно написать несколько команд g r a n t .

7. d R A N T S ELECT ON chores Разрешить пользователю doc выборку из таблицы


TO doc; chores.

8. d R A N T PELETE ON talking_ Разрешить пользователю sleepy удаление


animals TO sleepy WITH d R A N T из таблицы talking_animals, а также разрешить
OPTION; sleepy предоставлять разрешение на удаление из
talking animals любому другому пользователю.

9. d R A N T ALL ON chores TO bashful, Разрешить всем ( a l l ) пользователям выполнение


doc, dopey, g r u m p y , happy, sleepy, любых операций с chores.
sneezy;

10. d R A N T SELEC T ON woodland_ Разрешить пользователю doc выборку из в с е х ^ -


c o t t a g e * TO doc таблиц базы данных woodland_cottage.

528 гл ава 12
безопасность

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

В одной команде GRANT можно перечислить несколько


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

Конструкция WITH GRANT OPTION разрешает пользователям


предоставлять другим разрешение, указанное в команде.
О п и с а н и е в ы гл я д и т к р а й н е за п у та н н о , н о п о с у ти о зн а ча е т, ч т о есл и
пользователь получает р а зр е ш е ни е в ы п о л н я ть в ы б о р ку и з c h o r e s , то
с WITH GRANT O P T IO N о н м о ж е т т а к ж е р а з р е ш а т ь в ы б о р к у и з c h o r e s
д р у ги м по л ьзователям .

Вместо всей таблицы можно указать конкретный столбец


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

Для таблицы можно указать более одного разрешения.


П е р е ч и с л и т е п р е д о ста в л я е м ы е р а зр е ш е н и я , р азд ел яя и х за п я ты м и .

GRANT ALL разрешает выполнение операций SELECT,


UPDATE, INSERT и DELETE с заданной таблицей.
Ф а кти ч е с ки это со кр а щ е нн ая запись для п е р е чи сл е н и я всех о пера­
ц и й с таблицей.

Конструкция database_name.* обозначает все таблицы


в базе данных.
П о а н а л о ги и с т е м , к а к * о б о з н а ч а е т «все з а п и с и » в ко м а н д е SELEC T,
э т а к о н с т р у к ц и я о б о з н а ч а е т все т а б л и ц ы в базе д а н н ы х .

да л ьш е > 529
команда REVOKE

Команда REVOKE
А если потребуется лишить Элси предоставленной привилегии
SELECT? Для этого используется команда REVOKE.

Помните простейшую форму команды GRANT? Синтаксис


REVOKE выглядит почти так же, только GRANT заменяется
на REVOKE, а ТО - на FROM.

привилегия, к о т о р а я о т н и м у
^ ет ся у п о л ь з о в а т е л я (SELECT).

REVOKE SELECT ON
clown^info
FROM elsie;

П о л ьзо в а т ел ь, к о т о р ы й
л и ш а е т с я привилегии.

Также можно отозвать W IT H GRANT O P T IO N , оставив саму приви­


легию неизменной. В следующем примере happy и sleepy смогут
выполнять команду D E L E T E с таблицей c h o r e s , но не смогут
предоставить эту привилегию другим пользователям.

П о л ьзо в а т е л ь л иш ает ся
у^олько привилегии
flRAN T OPTION.
Только попро­
буй, Джим,
REVOKE GRANT OPTION ON и я лишу тебя всех
привилегий на це­
DELETE ON chores лый месяц.
FROM happy, sleepy;

d e le t e

530 глава 12
безопасность

Отзыв использованной привилегии GRANT OPTION


Допустим, пользователь root предоставил sleepy привилегию DELETE
с GRANT OPTION для таблицы c h o re s. Пользователь sleepy предоста­
вил sneezy привилегию DELETE для таблицы c h o re s.

предост ав­
л я е т PELETE sleepy предост ав­ sneezy
для chores л я е т DELETE
с GRANT для chores
OPTION
Допустим, пользователь root меняет свое решение и отнимает привилегию
у sleepy. Пользователь sneezy также лишится этой привилегии, хотя непо­
средственно отозвана она была только у sleepy.

sleepy
лиилает
sleepy п р и ­
ничего не
д е л а е т , но
1
" Г Г
вилегии sneezy т е ­
root sleepy р я е т св ою sneezy
d e l e t e для
привилегию.
chores

у команды REVOKE существует побочный эффект: sneezy также


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

Ш ТУРМ

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


RESTRICT и CASCADE. Как ВЫ Думаете, что они
делают?

да л ьш е ► 531
более точные разновидности revoke

CASCADE u RESTRICT
Существует два способа отозвать при­
вилегию так, чтобы отзыв не отра­
зился на других пользователях. Клю­
чевые слова CASCADE и RESTRICT I
позволяют более точно указать, кто предост авля­
должен сохранить свои привилегии ет PELETE для sleepy
предост ав­ JL
ляет PELETE sneezy
или лишиться их. chores с GRANT для chores
OPTION
с ключевым словом CASCADE привилегии лишается заданный пользователь (в данном
случае sleepy), а также все, кому он предоставил соответствующие разрешения.

REVOKE DELETE ON chores FROM sleepy CASCADE;

^ CASCAPE означа­
ет , что отзыв з а ­
т ронет не только
sleepy
лишает заданного пользо­
ничего не
sleepy п р и ­ делает , но
I вателя, но и всех
вилегии пользователей по
sneezy т е ­
PELETE для ряет свою цепочке.
sneezy
chores привилегию.

С ключевым словом RESTRICT привилегии лишается заданный пользователь, а если


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

REVOKE DELETE ON chores FROM sleepy RESTRICT;

Если лишение
привилегии за ­
т ронет других
пытается
лиш ит ь sleepy
...HOничего
не выходит, 1 пользователей,
команда REVOKE
пот ому что
привилегии с RESTRICT выдает
sleepy команда т ак­ sneezy
PELETE для же зат ронет ошибку.
chores sneezy.
Оба пользователя сохраняют свои привилегии, а root получает со­
общение об ошибке. Изменение не сохраняется, потому что оно
распространяется на пользователя sneezy, не указанного в команде.

532 •глсзез 12
безопасность

- ^ В о зь м и в руку карандаш
Кто-то продолжает предоставлять Элси лишние привилегии. На­
пишите команды REVOKE для возвращения к безопасному уров­
ню, на котором разрешена только выборка командой SELECT.

GRANT SELECT, INSERT, DELETE ON l o c a t i o n s TO e l s i e ;

GRANT ALL ON clown in f o TO e l s i e ;

GRANT SELECT, INSERT ON a c t i v i t i e s TO e l s i e ;

GRANT DELETE, SELECT on i n f o _ l o c a t i o n TO e l s i e


WITH GRANT OPTION;

GRANT IN S E R T (lo c a tio n ), DELETE ON lo c a t i o n s TO e l s i e ;

да л ьш е > 533
возьми в руку карандаш, решение

- ф,}огьтв руку карандаш


Ешение Кто-то продолжает предоставлять Элси лишние привилегии. На­
пишите команды REVOKE для возвращения к безопасному уров­
ню, на котором разрешена только выборка командой SELECT.

GRANT SELECT, INSERT, DELETE ON l o c a t i o n s TO e l s i e ;

REVOKE INSERT. UPDATE. DELETE ON locations FROM elsie.

GRANT ALL ON clo w n _ in fo TO e l s i e ;

REVOKE INSERT, UPDATE, DELETE ON c l o w n j n f o FROM elsie;

HpuBuAezua
) SELECT doAPK-
/ Ha ocM.am.bc$i,
GRANT SELECT, INSERT ON a c t i v i t i e s TO e l s i e ; noaimoMy o m -
3bi6aeM He 6ce.

REVOKE INSERT ON activities FROM elsie;

/другой с п о ­
соб — с н а ч а ­
ла о т о з в а т ь
GRANT DELETE, SELECT on i n f 0_ l o c a t i o n TO e l s i e все п р и в и л е ­
WITH GRANT OPTION; гии, а п о т о м
предост авит ь
REVOKE DELETE on i n fo j o c a t i o n FROM elsie CASCADE; необходимые.

GRANT IN S E R T (lo c a tio n ), DELETE ON l o c a t i o n s TO e l s i e ;

REVOKE GRANT INSERT(location), DELETE ON locations FROM elsie;

В е р о я т н о , зд е с ь т а к ж е ^ . И ещ е с т о и т у б е д и т ь -
п о л ь з о в а т ь GRANT, чт обы Элси м ог ^ Э лТ Т г
ЛЛ вы п ол нят ь выборку из loca ю п . п р е д о ст а в и л а другим
т е п ривилеги и, к о т о р ы е
были п р е д о с т а в л ен ы ей.

534 глава 12
безопасность

Часзпо
Ч адаБаеМ ы е -
Б о Т ]р зС ь 1

Я все еще думаю о командах


GRANT с именами столбцов. Что про­
О Как уже не раз было в этой главе, все
зависит от вашей разновидности РСУБД.
Что произойдет, если два разных
пользователя предоставят sneezy оди­
изойдет, если разрешить вставку для В MySQL глобальные привилегии такого наковые привилегии, которые отзыва­
одного столбца таблицы? рода предоставляются командой вида: ются root в предыдущем примере?

GRANT SELECT ON *.*


! Хороший вопрос. Вообще-то такая • Здесь начинаются сложности. Одни
ТО elsie;
привилегия будет практически бесполез­ системы не обращают внимания на
ной; если пользователь может сохранить Первая звездочка обозначает все базы то, какая команда GRANT выполнялась
данные топько в одном столбце, он не данных, а вторая — все таблицы. в режиме CASCADE, другие игнорируют
сможет вставить запись в таблицу По­ привилег>1и, предоставленные другими
пытка завершится успешно только в том пользователями. Это еще одна ситуация,
случае, если таблица состоит из един­ Значит, режим CASCADE исполь­ в которой ответ следует искать в докумен­
ственного столбца, указанного в команде зуется по умолчанию для команды тации РСУБД.
GRANT. REVOKE?

Существуют ли другие, столь же { I ! Обычно CASCADE используется по Существуют ли другие объек­


бесполезные команды GRANT? умолчанию, но за подробностями вам сно­ ты, кроме таблиц и столбцов, кото­
ва следует обращаться к документации рые могут использоваться в GRANT
вашей РСУБД. и REVOKE?
Почти все привилегии для столбцов
бесполезны, еспи они не сочетаются ! Представления могут использоваться
с привилегией SELECT в команде GRANT. Что произойдет при отзыве при­ точно так же, как таблицы — если только
вилегии, которой пользователь не представление не является необновляе­
обладает? мым. В противном случае вам не удастся
Предположим, я хочу добавить
пользователя, которому разрешена использовать INSERT даже при наличии
выборка из всех таблиц во всех моих ! Вы получите сообщение об ошибке, разрешения. И по аналогии с таблицами,
базах данных. Существует ли простой в котором говорится об отсутствии GRANT. доступ может разрешаться на уровне
способ сделать это? конкретных столбцов представления.

Значит, если я хочу предоставить одинаковые разрешения


пяти пользователям, мне нужно перечислить их через запятую
в конце команды бРАЫТ?

Такое решение определенно сработает. И при небольшом


количестве пользователей действовать нужно именно так.
Но по мере роста вашей организации в ней будут появляться классы
пользователей. Допустим, 10 человек занимаются вводом данных
и им достаточно предоставить разрешения на вставку и выборку из
некоторых таблиц. Также в системе могут быть три администратора,
которым разрешены любые операции, и множество рядовых пользо­
вателей с доступом на уровне S E L E C T . Возможно даже существование
программ и веб-приложений, которые подключаются к базе данных
и работают с конкретными представлениями.

д а л ьш е ► 535
чем плохи о б щ и е учеП1НЬ;е записи

^ ’ Так почему бы не со-


\ эдать по одной учетной записи
! для каждого класса, чтобы несколько
I пользователей использовали одно
и то же имя с паролем?

Проблема общих учетных записей


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

Рэнди по своей работе должен


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

V
main database

536 глава 12
безопасность

Отдельные учетные записи —


не лучшее решение для групп поль­
зователей, совместное использова­
ние одной учетной записи тоже не
годится... Что же делать?

Нужно каким-то образом назначить группам


их привилегии, одновременно сохраняя за
каждым пользователем индивидуальную
учетную запись.
Для этого нам понадобятся роли. Роль позволяет опре­
делить набор привилегий и назначить их всем участни­
кам некоторой группы. Роли становятся объектами базы
данных, которые можно изменять в случае изменения
базы —при этом вам не придется явно изменять при­
вилегии каждого пользователя в соответствии с измене­
ниями в базе. à в MySQL
ВУДЬіїіЄ роли не
Команда создания роли очень проста:
о С зп о р Ь ж Н ь їІ поддержи­
ваются.
CREATE ROLE data__entry ; Вероятно, поддержка ролей
появится в будущих версиях
MySQL, но пока привилегии
Имя со зд а в а е м о й приходится назначать на
роли. уровне отдельных пользова­
телей.

Привилегии предоставляются ролям точно так же, как и име­


нам пользователей.

GRANT SELECT, INSERT ON some_table TO data_entry;

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

дальш а > 537


развлечения с р о л я м и

использование роли
До создания ролей привилегии пользова­
П редост ав­ n
телей назначались командой GRANT.
ляет приви­
легии SELECT doc
и INSERT
GRANT SELECT, INSERT для talking,,
ON t a lk in g _ a n im a ls animals.
TO d oc;
^ /7
С т ары й способ. tal)cing_anlinals
anlmal_ld anlmal.type sings dances
1 blue bird Y Y
2 badger Y Y
3 deer N N
4 squirrel Y Y
Остается лишь заменить операцию GRANT, указать в ней
новую роль и применить к doc. Перечислять привилегии
или таблицы не нужно, потому что вся информация хра­
нится в роли d a ta _ e n try :.

GRANT data__entry ТО doc; п

doc
и м я роли з а н и м а е т
м е с т о имени т аблицы GRANTS
и привилегий.
-► data_entry

У
talk ln g _ a n lm a ls
animal M animai.type sings dances

Удаление ролей 1
2
blue bird
badger
Y
Y
Y
Y
3 deer N N
Когда надобность в роли отпадает, незачем хранить ее в базе 4 squirrel Y Y

данных. Удаление ролей осуществляется командой DROP.

DROP ROLE data_entry;

538 глава 12
безопасность

Часш»
^аД аБаеМ ы е
БоГ1р)Сь1

А если я хочу предоставить привилегии для всех Если пользователь обладает ролью, которая была
таблиц в базе данных? Перечислять все имена? удалена, он лишается этих разрешений?

О Нет, используйте следующий синтаксис: • Вот именно! Все выглядит так, словно вы явно предо­
ставили ему эти разрешения, а потом отозвали их. Только
GRANT SELECT, INSERT, DELETE
вместо одного пользователя разрешений лишаются все
ON gregs_list.* пользователи, которым была назначена эта роль.
TO jim;

Достаточно указать имя базы данных, а знак * обеспечит


Может ли пользователь иметь сразу несколько
назначение привилегий для всех таблиц этой базы. 5:.
ролей?
POJ

Можно ли удалить роль, которая в данный момент :


0 • Да, может Только проследите за тем, чтобы роли
назначена пользователю? не конфликтовали друг с другом, иначе вы создадите себе
немало проблем.
Вы можете удалять роли, используемые в настоящее
время. Будьте очень внимательны при удалении ролей, что­
бы не лишить пользователей необходимых разрешений.

_ Возьми в руку карандаш


Как отозвать роль
Роли отнимаются у пользователей почти так же, как и привилегии.
Удастся ли вам написать команду для отзыва роли d a t a _ e n t r y
у пользователя doc, не заглядывая на следующую страницу?

дальше ► 539
WITH ADMIN OPTION

p- д ^ о зь м и в руку карандаш
Решение Роли отнимаются у пользователей почти так же, как и привилегии.
Удастся ли вам написать команду для отзыва роли d a t a _ e n t r y
у пользователя doc, не заглядывая на следующую страницу?

REVOKE data_entry FROM doc;

Конструкция IVITH ADMIN OPTION


Как говорилось ранее, у команды GRANT имеется режим W IT H GRANT
O P T IO N . У ролей существует аналогичная конструкция W IT H A D M IN
O P T IO N . Она позволяет каждому обладателю роли назначать ее всем
остальным. Например, при использовании следующей команды:

GRANT data_entry ТО doc WITH ADMIN OPTION;

Теперь doc обладает привилегиями администратора и может ^1ТН ADMIN OPTION


назначить happy роль d a t a e n t r y точно так же, как она была Разрешаеил пользова-
назначена ему самому; <телю doc назначить

GRANT d a t a _ e n t r y ТО h a p p y ; ‘другому пользователю

При использовании с ролями команда REVOKE также поддержива­


ет ключевые слова CASCADE и R E S T R IC T . Давайте посмотрим, как
они работают.

О тзы б роли с CASCADE


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

REVOKE data_entry FROM doc CASCADE;


С ключевым словом
CASCADE команда
REVOKE действует не
только на пользователя,
но U на всея остальных
happy т еря-
пользователей в цепочке.
em привиле­
лиилает doc
il
гии, которые
роли data_ предоставил
entry. doc ему doc. happy

540 глава 12
безопасность

Отзы в роли с RESTRICT


Если пользователь успел назначить роль кому-то другому, то при
попытке лишить его этой роли командой REVOKE с ключевым
словом RESTRICT произойдет ошибка.

REVOKE data__entry FROM doc RESTRICT ; Если лишение роли


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

пы т ает ся ...но ничего 4


л и ш и т ь doc
роли data_
не выходит ,
п о т о м у чт о
изм енение
А
happy
entry...
т акж е з а т р о ­
н е т карру.

Оба пользователя сохраняют свои роли, а гоо< получает


сообщение об ошибке. Изменение не сохраняется, потому
что оно распространяется на пользователя happy.

Роли — удобная штука, но давайте вернем­


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

Пришло время заняться настройкой


безопасности доступа к базе данных дгед8_И81.
Грег должен выполнить действия, описанные в этой
главе, и защитить учетную запись юо1, разобраться в том,
какой уровень доступа нужен его работникам, и предо­
ставить им соответствующие привилегии.
А теперь плохая новость: на месте Грега окажетесь ВЫ...

д а л ьш е > 541
стань грогом

^ ш а н ь У реГоМ
^ последний J»a9 nj’eAanaBbine се^я на Месте У^еГа и HacmJ^ou-

і р е j ’ a a j ’ e iB e H u H п о л ь з о в а т е л е й , ч т ц о Є ь і н е о ц ь о ц н ы е | ^ а Є о і ц і ш к и

ни Ч еГо сл у ч а й н о не ucnopreiujiu.

|Jj>o4uinauTne описания р>абоцц,і каж доГо п ол ьзо вател я.

ЦапиШ ите КоМандьі К о то р ы е п р е Д ° с т а В я т


. р>аЄотникаМ Д оступ К неовходиМьіМ данньїМ
u не П о звол ят гШ сД еЛ ать ниЧеГо лиШнеГо.

Фрэнк: Я отвечаю за поиск работников для от­


крывшихся вакансий. Я никогда не ввожу данные
в базу, хотя и удаляю вакансии при их закрытии
или обнаружении претендента. Иногда мне также
приходится искать контактные данные в таблице
m y _ co n ta cts.
Джим: Я ввожу всю новую информацию во всей
базе данных. Теперь, когда я не могу случайно
ввести X в столбце g ender, у меня все отлично по­
лучается. Я также обновляю данные и понемногу
учусь удалять, хотя Грег мне это запрещает. Конеч­
но, ему я об этом не говорю...
Джо: Грег только что нанял меня для работы над
сайтом своей фирмы. Он хочет, чтобы контакт­
ные данные интегрировались на сайте. Вообще-
то я веб-программист, а не специалист по S Q L ,
но я умею выполнять простые команды SELECT.
А всякие вставки-удаления —это не для меня.

^ЗГляните на ст р у к т у р у базы Данных


grege_lifit U напиШите КоМандьі ДЛЯ
э т и х па]^ей, пока они не поВреДиЛи данные.

542 глава 12
безопасность

ЦапиШ ите Команду для назначения lJaJ=toЛя ЦоЛьЭоБагг1еЛ1о с иМенеМ «Toot».

Janumume m j^ КоМанды, Koinop>ie созда!«!!! mj>u учетные Записи — по одной для кажДоГо
из тр*ех p>aSoinHuKoB.

Janumume К°Манды Q Кото|’ые %^1ут назначать п^^аБиЛьНые |>аз^>еШения кажДоМу


из т]=е^ j=>aSomnuKoB.

|оЬ_сигген1 |»b_deslred |ob_listiiigs


contact id О—тг contact id job_id O—Tr^^-jT
title
title title salary
salary salary_low zip
start date salary_high description
available
years_exp contact interest interests
contact_id ^ -interest id
► 0+Я - interest
profassign
interest_id
prof_id 0 -
last name 0+»
profession
first name
xi |i_cede phone
centact_seeiting seelcing
email
contact_id ■seeking_id
city gender
^ O +w seeking
state birthday
prof_id seeking_id
status 0+ r
>zip_code
status id 0 — w-
status >status_id

дальше * 543
стань грегом. ответ

(\ п а н ь У р е Г ° М . Q m B em
^ последний J>a3 и^’еДапаВыре се^я на Месте |реГа и насігір*ошгіЄ
j>a3j»eineHuH П ользователей, Чіцобьі неоиытгшые р*аботники ниЧеГо
случайно не испо]^иЛи.

Цр*оЧшцайте описания р*абоіпьі кажДоГо поЛьЗоВатеЛя,


\ ЦапиШите КоМандьі Koinoj>i,,e гіреД°стаВяш
' 'С>.
, р*абоіцникаМ Д оступ к необходимым ДанньїМ
U не поЗВоЛящ им с д е л а т ь ниЧеГо лиШнеГо.

J апиШ ите Команду для назначения па|*оля цоЛьЗоВатеЛіо с именем «Toot».

SET PASSWORD FOR r o o W lo c a lk o s t = PA SSW O R D C grSG R ulz’);

ЦапиШ ите m j^ КоМандьі, Kom oj^ie с о з д а їо т m f^ у ч е тн ы е записи — no одной


для каЖДоГо из m j’e*^ J^aSoinHuKoB.

CREATE USER f m n k IDENTIFIED BY 'jO bM 4tcH ’:


J иначе — не о о р а щ а и м е вни -
CREATE USER j i m IDENTIFIED BY 'NOmOr3Xs'; IT '" '’' 'лтоЬы все
ф р а г м е н т ы к ом ан ды были
CREATE USER j o e IDENTIFIED BY 's3 LeCTdOOd'; м е с т е и следовали
о п ра ви л ьн о м порядке!
ЦалиШ ите КоМандьі Kom°f*bie б у д у т н а зн а ч а т ь т^аВиЛьНые
разрешения каж дому из m f e * Р аб отн и ков.
Фрэнк долж ен и м е т ь в о з м о ж -
GRANT DELETE ON j o b ji s t i n g s ТО fran k; ^ ----- н о с т ь у да л я т ь
^ <Г^ нят ь выборку из m y_contacts.
GRANT SELECT ON m y_con tacts * TO frank;
Д ж и м у необходим д о с т у п SELECT
INSERT ко всем о б ъ е к т а м a reas
GRANT SELECT, INSERT ON g r e g s j i s t TO jim ; д у д а л я т ь данные ем у ~
пока р а н о в а т о .
GRANT SELECT ON m y_contacts, profession , zip_code, status,
c o n t a c t j n t e r e s t , interests, co n ta ct_ seek in g , seeking TO jo e ;
\ Наконец, Д ж о нужно р а з р е ш и т ь выборку
из всех исходных т аблиц - к р о м е т ех ,
к о т о р ы е о т н о с я т с я к п о и ск а м рабо т ы .

544 глава 12
безопасность

Объединение CREATE USER е GRANT


Пока мы еще не закончи­
ли — нельзя ли объединить
CREATE USER с 6RANT
в одну команду?

Да, можно. Для этого достаточно связать


воедино две части, которые мы уже видели.
Вот как выглядели команды CREATE USER и GRANT,
использованные нами для Элси:

CREATE USER e l s i e

ID E N T IF IE D BY ' cl3v 3rp 4sS w O rd ' ;

GRANT SELECT ON

clo w n _ in fo

TO e l s i e ;

Давайте объединим их, опустив часть CREATE USER.


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

GRANT SELECT ON
clown_info
TO elsie
IDENTIFIED BY 'cl3v3rp4s5w0rd';

За л ы и е ► 545
с л » с о .гр м » еш од,.т ш М „рово,) уровс.ш.

Оглушительный успех! Спасибо, без вас я бы не спра­


вился! Кстати, у меня открыва­
ется филиал в вашем городе...
Может, это стоит обсудить?
™ ? " г о 6 ^ Г д а н н ь « была в ь ю ч е н а „ о „ .р * к а
рекламных объявлений и форумов.
А знаете что самое невероятное? В Дейтавиле
^ о Г д - - к о й успех, что в более 500 городах „о
всему «иру открылись Ф ™ "“ “ 'з^;, ■
а сам Грег не сходит с первых стран ц

Т 11р К р !41ф © Ш [ Ж М

Вакансии и форумы
Друзья и родственники говорят, что слава ничуть не измени­
ла Грега.

Тр ой А р м стр он г
КОРРЕСПОНДЕНТ INQUERYER
ДЕЙТАВИЛЬ — Местный предприниматель Грег добился
успеха и известности. Его сетевая база данных превратилась
из набора карточек сначала в простую таблицу, а потом и в
многотабличную базу данных со службой знакомств, поиском
работы и другими полезными функциями.

База данных Грега уже


добралась до вашего города?
Если нет — это вопрос времени,
говорят аналитики.

546 глава 12
безопасность

Нобые инструменты
Поздравляем, вы закончили главу 12!
Ниже перечислены основные концепции
безопасности SQL, представленные
в этой главе. Полный список инструментов
приведен в приложении III.
1XD
grant

манда точно опреде-


какие операции
I вы полняет
С '® * '® •пользователем с т а -

ка основании предо-
\ созЭйдая а ? ей с иа-

WITH GRANT OPTION

Разрешает пользоват е-
лю давать другим по ль­
зователям предост ав­
ленные ему привилегии.

зобаилеД^ Роль

WITH ADMIN OPTION


СО-
Разрешает пользоват е­ \Роли «Споиь^
ли) назначать другим
•пользователям соб­ Р<^легий H i c £ i T '
ственную ему роль

дал ьш е ► 547
спасибо, что п о с е т и л и Д е и т а в и л ь !

Присоединяйтесь!

Ц спош уйте $ 0 1 6 сбоих проектах...


и 6озмо)кно, бас то)ке озкидает успех!
Мы были рады встретиться с вами в Дейтавиле.
Жаль, конечно, что нам приходится расставаться, но пришло
время применить полученные знания на практике — наверняка
где-нибудь вблизи от вас есть клоуны, за которыми нужно наблю­
дать, пончики, которые нужно попробовать, или Список [подставьте
ваше имя], который нужно создать. В конце книги вы найдете еще
кое-какую полезную информацию и алфавитный список основных
инструментов 301 — а потом беритесь за дело!
У рлЛ оЖ ен и е : 1’ о Ч е е

Десять важнейших тем +


(о которых мы не рассказали)

Но даже после всего сказанного беседа еще не за­


кончена! Есть еще кое-что, о чем вы должны знать. Мы решили,
что будет неправильно просто проигнорировать эти темы — они
заслуживают хотя бы краткого упоминания. Итак, прежде чем от­
кладывать книгу, ознакомьтесь с этими короткими, но важными
разделами. А когда вы прочитаете и эту главу, останется еще
пара приложений... и может быть, немного рекламы... и ничего
больше. Честное слово!
графический и нт ер ф е йс

1. используйте графический интерфейс к своей РСУБД


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

Графические инструменты MySQL


Вместе с MySQL также можно загрузить графический инструментарий MySQL,
и что еще важнее —программу MySQL Administrator. Весь пакет доступен по адресу:
http://dev.mysql.com/downloads/gui-tools/5.О .html
Имеются версии для Windows, Mac и Linux. Программа MySQL Administrator обе­
спечивает возможность простого и удобного просмотра, создания и редактирова­
ния баз данных и таблиц.
Также вам может пригодиться программа MySQL Query Browser. Она позволяет вве­
сти запрос и просмотреть результаты в интерфейсе программы (вместо консоли).

З десь вводятся запросы .

О О (У Untitled @ locafhost via socket


j SELECT name, boss.id FRflMclawui

Back » »text * Slop

OQuary
:id name ibossjd
[F Bsie' 3
12 Pickles 5
13 Snuggles 10
З дссь выводятся l4 Mr. Hobo 3

результ ат ы . Is Clarabelle 10
|6 Scooter 3
|7 Zippo 3
is Babe 5
l9 Bonzo S
110 Mister Sniffles 10

■ _______ ______
10 ГОУ1Я felched.___________ j </' Edit M C an«l V 'Savt i И R rst M Last j^ S«arch

Selected schema 'gregsLlst'.

550 приложение 1
прочее

другие графические инструменты


Также существует немало других графических программ для работы с MySQL.
Выберите из них ту, которая лучше всего подходит лично вам. Ниже приведены
лишь некоторые примеры, а остальное можно легко найти поиском в Интернете.
Пользователям Мае стоит обратить внимание на CocoaMySQL:
h t t p : / / cocoain y sq l. s o u r c e f o r g e . n et/

ООО (M ^QL 5.0.37) roô^tocalhost/chS/boys

ShowConso)« OearConsott Show Variables Bush Priviteses Table C^rMions Create Table Syntax Кнопки для
Databases « Structure i Content Custom Query Status просмотра
f d .«
f boy.id
структуры
IDG l.
s ШШ: з а п р о с а , его
ТаЫе$ bOY-W j»y toïJd вк>1полнения
i ...... Davey
b&fs 2 Bobbv изменения
giris
moretoys
3 Beaver плаблицы.
tov^t
^4 №chie
6 Johnny
5 Ш
йу

encoding

\ ISO latin lO atin » ' Ш б r o w s in ta b le

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


Эта программа хорошо подходит для удаленного администрирования MySQL
по Интернету. Для работы с MySQL на локальном компьютере она менее
удобна. Дополнительную информацию можно найти на странице;
http://www.phpmyadmin.net/
Далее перечислены другие популярные графические инструменты. Некото­
рые из них работают исключительно на платформе PC; чтобы узнать, подой­
дут ли они вам, лучше всего зайти на сайт и прочитать информацию о по­
следней версии.
Navicat предоставляет 30-дневный бесплатный пробный период;
http://www.navicat.сот/
SQLyog предлагает бесплатную версию Community Edition;
http://www.webyog.com/еп/

дальше > 551


Зарезервированные слова и с п е ц и а л ь н ы е с и м в о л ы

2. Зарезервиробанные слоВа и специальные символы


В языке SQL довольно много зарезервированных ключевых слов. Эти слова не рекомендуется ис­
пользовать в качестве имен баз данных, таблиц и столбцов. Даже если вам очень хочется назвать
новую таблицу «select», попробуйте найти более содержательное имя, в котором «select» не встре­
чается. А если без зарезервированного ключевого слова никак не обойтись, постарайтесь исполь­
зовать его с другими словами и символами подчеркивания, чтобы не путать РСУБД. На следующей
странице приведен список ключевых слов, которые не рекомендуется использовать в именах.
Ситуация усложняется тем, что в SQL имеются незарезервированные слова, которые могут ока­
заться зарезервированными в будущих версиях SQL. Мы не будем перечислять их здесь; найдите их
в справочнике по вашей конкретной РСУБД, который вы купите после знакомства с этой книгой.

Специальные символы
Ниже перечислены многие специальные символы SQL с краткими описаниями. Как и ключевые
слова, их не рекомендуется использовать в именах —исключение составляет только символ под­
черкивания (_). В общем случае имя не должно содержать никаких символов, кроме букв и симво­
лов подчеркивания. Имена из одних цифр тоже нежелательны, хотя и они иногда оказываются
содержательными.

Возвращает все столбцы таблицы в команде SELECT.


Используются для группировки выражений, определения порядка выполнения математиче­
ских операций и вызова функций, а также для ограничения подзапросов.
Завершает команды SQL. ^
h------------------------------------- ;----------------------------- -------------------------------- — Я вл я ю т ся сп ец и -
Разделяет элементы списков (например, в команде INSERT или условии IN). ^ символа-
Используется в ссылках на имена таблиц и в дробных числах.____________. т олько с LIKE
Предаавляетодин символ в условии LIKE. ------------- .
Представляет несколько символов в условии LIKE.
Обозначает отрицание (NOT); используется при сравнении в условиях WHERE.
Строковые значения в SQL заключаются между двумя апострофами.
Также для этой цели можно использовать кавычки, хотя лучше ограничиться апострофами.
Используется для включения апострофов в текстовые столбцы таблиц.
Кроме операции сложения, также используется для конкатенации (сцепления) строк.

Краткая сводка математических операторов.

Между двумя значениями обо­


Сложение Вычитание Деление
значает операцию умножения.

И сравнительных операторов.

> Больше !> Не больше >= Больше либо равно


В книге не рассматриваются.
< Меньше !> Не меньше >= Меньше либо равно За информацией обращайтесь
= Равно О Не равно 1= Не равно к документации своей РСУБД.

552 приложение I
Э т о т список р е к о м е н д у е м с я п р о с м а т р и в а т ь '^Рочее
каждый р а з . когда в п р о г р а м м е к а к о м у -л и б о о5 ъ -
ЗареЗерВироВаННЫе СЛоВа при сваи вает ся имя из одного слова - у б е д и -
f f ~ ^ т е с ь в т о м , что э т о слово не за р езер ви р ов ан о .

ABSOLUTE ACTION ADD ADMIN AFTER AGGREGATE ALIAS ALL ALLOCATE ALTER AMD ANY ARE ARRAY AS
ASC ASSERTION AT AUTHORIZATION
BEFORE BEGIN BINARY BIT BLOB BOOLEAN BOTH BREADTH BY
CALL CASCADE CASCADED CASE CAST CATALOG CHAR CHARACTER CHECK CLASS CLOB CLOSE COLLATE
COLLATION COLUMN COMMIT COMPLETION CONNECT CONNECTION CONSTRAINT CONSTRAINTS
CONSTRUCTOR CONTINUE CORRESPONDING CREATE CROSS CUBE CURRENT CURRENT_DATE
CURRENT PATH CURRENT ROLE CURRENT TIME CURRENT TIMESTAMP CURRENT USER CURSOR CYCLE
DATA DATE DAY DEALLOCATE DEC DECIMAL DECLARE DEFAULT DEFERRABLE DEFERRED DELETE DEPTH
DEREF DESC DESCRIBE DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DICTIONARY DIAGNOSTICS
DISCONNECT DISTINCT DOMAIN DOUBLE DROP DYNAMIC
EACH ELSE END END EXEC EQUALS ESCAPE EVERY EXCEPT EXCEPTION EXEC EXECUTE EXTERNAL
FALSE FETCH FIRST FLOAT FOR FOREIGN FOUND FROM FREE FULL FUNCTION
GENERAL GET GLOBAL GO GOTO GRANT GROUP GROUPING
HAVING HOST HOUR
IDENTITY IGNORE IMMEDIATE IN INDICATOR INITIALIZE INITIALLY INNER INOUT INPUT INSERT
INT INTEGER INTERSECT INTERVAL INTO IS ISOLATION ITERATE
JOIN
KEY
LANGUAGE LARGE LAST LATERAL LEADING LEFT LESS LEVEL LIKE LIMIT LOCAL LOCALTIME
LOCALTIMESTAMP LOCATOR
MAP MATCH MINUTE MODIFIES MODIFY MODULE MONTH
NAMES NATIONAL NATURAL NCHAR NCLOB NEW NEXT NO NONE NOT NULL NUMERIC
OBJECT OF OFF OLD ON ONLY OPEN OPERATION OPTION OR ORDER ORDINALITY OUT OUTER OUTPUT
PAD PARAMETER PARAMETERS PARTIAL PATH POSTFIX PRECISION PREFIX PREORDER PREPARE
PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURE PUBLIC

READ READS REAL RECURSIVE REF REFERENCES REFERENCING RELATIVE RESTRICT RESULT RETURN
RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP ROUTINE ROW ROWS
SAVEPOINT SCHEMA SCROLL SCOPE SEARCH SECOND SECTION SELECT SEQUENCE SESSION
SESSION_USER SET SETS SIZE SMALLINT SOME SPACE SPECIFIC SPECIFICTYPE SQL SQLEXCEPTION
SQLSTATE SQLWARNING START STATE STATEMENT STATIC STRUCTURE SYSTEM USER
TABLE TEMPORARY TERMINATE THAN THEN TIME TIMESTAMP TIMEZONE_HOUR TIMEZONE_MINUTE TO
TRAILING TRANSACTION TRANSLATION TREAT TRIGGER TRUE
UNDER UNION UNIQUE UNKNOWN UNNEST UPDATE USAGE USER USING
VALUE VALUES VARCHAR VARIABLE VARYING VIEW
WHEN WHENEVER WHERE WITH WITHOUT WORK WRITE

YEAR
ZONE

дальше ► 553
ANY, ALL и SOME

re s ta u ra n t_ ra tin g s
3. ALL, ANY u SOME
name rafiiig
Три ключевых слова ALL, ANY и SOME очень полезны при
Pizza House 3
работе с подзапросами. Они работают с операторами сравне­
ния и наборами результатов. Прежде чем переходить к их The Shack 7
рассмотрению, вспомните оператор IN из главы 9. Arthur's 9
Ribs 'n' More 5
SELECT name, r a t in g FROM re s ta u ra n t_ ra tin g s
WHERE r a t in g IN
(SELECT r a t in g FROM re s ta u ra n t_ ra tin g s Подзапрос возвраіцаепл. все
WHERE r a t in g > 3 AND r a t in g < 9); оц&нки в диапазоне о т З до ^
в данном случае 7 и S'.
Этот запрос возвращает все названия ресторанов с такими
же оценками, как у ре.эультата подзапроса в круглых скобках.
Результат состоит из двух записей, The Shack и Ribs WMore.

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


А теперь рассмотрим следующий запрос:
SELECT name, r a t in g FROM re s ta u ra n t_ ra tin g s > ALL находит все
WHERE r a t in g > ALL
(SELECT r a t in g FROM re s ta u ra n t_ ra tin g s
WHERE r a t in g > 3 AND r a t in g < 9);
значения, большие

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


максимального значе
превышающей всеоценки в наборе (это ресторан >ЫЛмг’5).
ния в наборе.
Пример запроса с оператором <;
SELECT name, r a t in g FROM re s ta u ra n t_ ra tin g s
WHERE r a t in g < ALL
(SELECT r a t in g FROM re s ta u ra n t_ ra tin g s WHERE < ALL находит все
r a t in g > 3 AND r a t in g < 9);
значения, меньшие
С ALL также можно использовать операторы >= и <=. Сле­
дующий запрос вернет записи ТТге Shack и Arthur’s. В резуль­ минимального значе­
тат включаются записи с оценкой, большей либо равной
наивысшей оценке в наборе, которая равна 7: ния в наборе.
SELECT name, r a t in g FROM re s ta u ra n t_ ra tin g s
WHERE r a t in g >= ALL ---------------------
в р е з у л ь т а т в к л ю ч а ю т с я записи
(SELECT r a t in g FRC^ r e s ta u ra n t_ ra tin g s с оценкой, больш ей либо равной
WHERE r a t in g > 3 AND r a t in g < 9); наивысшей оценке в наборе.

554 прило>нение f
прочее

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


Условие с ANY истинно, если хотя бы одна запись в наборе удо­
влетворяет условию. Рассмотрим следующий пример. > ANY находит все
SELECT name, r a t in g FROM re s ta u ra n t_ ra tin g s
WHERE r a t in g > ANY
значения, большие
(SELECT r a t in g FROM re s ta u ra n t_ ra tin g s WHERE
r a t in g > 3 AND r a t in g < 9);
минимального значе­

O h означает следующее; «Выбрать все записи, у которых оцен­


ния в наборе.
ка больше, чем хотя бы одно из значений набора (5, 7)». Так
как оценка The Shack 7, что больше 5, запись включается
в результат. Также возвращается запись i4rt/iur’s с оценкой 9.
< ANY находит все
значения, меньшие
максимального значе
ния в наборе.
Ключевое слово SOME
SOME означает то же, что ANY в стандартном синтаксисе SQL.
Чтобы узнать, работает ли это ключевое слово в вашей РСУБД,
обращайтесь к документации.

да л ьш е > 555
подробнее о т и п а х д а н н ы х

4 . Подробнее о типах данных


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

BOOLEAN
в столбце этого типа может храниться значение «true», «false», или же он может остаться
равным NULL. Тип очень удобен для хранения логических признаков «истина/ложь». Во
внутреннем представлении РСУБД сохраняет 1 для истинных значений или Одля ложных.
При вставке также можно указывать 1 вместо «true« или Овместо «false».

INT
Тип INT неоднократно использовался в книге. В столбцах этого типа могут храниться
значения в диапазоне от Одо 4 294 967 295 в том случае, если столбец должен принимать
только положительные значения.
Если значения столбца могут быть как положительными, так и отрицательными, следует
определить столбец типа INT со знаком. Значения таких столбцов лежат в диапазоне от
-2 147 483 648 до 2 147 483 647. Чтобы сообщить РСУБД, что в столбце должны храниться
числа INT со знаком, используйте следующий синтаксис при создании столбца:
INT(SIGNED)

Другиие разнобидности INT


Тип INT вам уже известен, но два типа SMALLINT и BIGINT помогают немного оптимизиро­
вать хранение информации. Они определяют наибольшее число, которое может храниться
в столбце.
Диапазоны значений этих типов зависят от конкретной СУБД. В MySQL они выглядят так:

со 1НОИОМ 6ei 1нака


SMALLINT от - 3 2 7 6 8 до 32767 ОТ 0 ДО 6 5 5 3 5
от -9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 8 от 0
B IG IN T
до 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 ДО 18446744073709551615

Кроме того, в MySQL дополнительно определены следующие целочисленные типы:

со з н а к о м без з н а к а
TIN YIN T ОТ-1 2 8 ДО 127 от 0 до 255
MEDIUMINT о т - 8 3 8 8 6 0 8 до 8 3 8 8 6 0 7 от 0 до 16777215

556 приложение I
прочее

Типы DATE u TIME


Ниже приведена сводка стандартных форматов типов даты и времени в MySQL.

DATE YYYY-MM-DD

DATETIME

TIMESTAMP YYYYMMDDHHMMSS

TIME

some d a te s

a date
2007-08-25 22:10:00
1925-01-01 02:05:00

При выборке из столбца, содержащего дату и/или время, можно изменить фор­
мат возвращаемых данных. Функции форматирования даты/времени зависят
от конкретной РСУБДД. Рассмотрим пример использования функции MySQL
DATE_FORMAT () . Ф о р м а т н ы е ст р о к и должны
Допустим, у вас есть столбец a _ d a te : ^ б ы з а к л ю ч е н ы в а п о ст р о ф ы .

SELECT DATE_FORMAT(a_date, ' %М %Y') FROM som e_dates;

Обозначения %Ми %Y описывают нужный формат даты. Результат должен вы­


глядеть примерно так:

а dale
August 2007
January 1925

Количество параметров форматирования огромно; рассмотреть их здесь нам


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

дальше ► 557
временные т а б л и ц ы

5 . Временные таблицы
В этой книге мы создали много разных таблиц. Каждый раз при создании таблицы
РСУБД сохраняет описание ее структуры. При вставке данных РСУБД сохраняет эти
данные. Если завершить сеанс SQL в окне терминала или в графической программе,
таблица и хранящиеся в ней данные никуда не пропадут. И таблицы, и данные остают­
ся в базе до тех пор, пока вы не удалите их.
SQL также поддерживает другую разновидность таблиц —так называемые врем енные
т аблицы. Временная таблица существует от ее создания до момента удаления или до
завершения пользовательского сеанса. Под сеансом понимается промежуток времени от
подключения к РСУБД с данными учетной записи до выхода или завершения графи­
ческой программы. Временные таблицы также могут удаляться явно командой DROP.

Для чего мо}кет понадобиться Временная таблица:


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

Создание Временной таблицы Синтаксис


Синтаксис создания временных таблиц в MySQL прост — создания
достаточно добавить ключевое слово TEMPORARY: временных
Радьте таблиц
CREATE TEMPORARY TABLE my_tei4}_table
оС зЦ орэЖ Н Ь! зависит
(
som e_ld INT, TEMPORARY — от РСУБД.
some d a ta VARCHAR(50) еди н ст вен н ое и з м е ­ За информацией об этой
нение в команде. возможности обращайтесь
к документации РСУБД.
Сокращенный синтаксис
Временные таблицы также можно создавать по результатам запросов:
CREATE TEMPORARY TABLE m y_ten?)_table AS
SELECT * FRCM m y_perm anent_table ;
После AS м о ж е т с л е д о в а т ь
произвольны й запрос.
558 .Приложение 1
прочее

6. преобразование типа
Иногда в столбце хранятся данные одного типа, а вам необходимо ин­
терпретировать их как данные другого типа. В SQL преобразование типа
осуществляется функцией CAST ( ) .
Синтаксис:

CAST (сто л б ец , ТИЛ)

Допустимые значения параметра ТИП:


CHARO

DATE
DATETIME

DECIMAL
SIGNED [INTEGER]
TIME

UNSIGNED [INTEGER]

Когда мо)кет потребоваться функция CAST()?


Преобразование строки к типу DATE: С т рок а 'Z 0 0 S - 0 1
npeodj
SELECT CAST('2 0 0 5 -0 1 -0 1 ' AS DATE); <у^е^бразуется к типу
PATE.

Преобразование целого числа в дробное: ^ _

SELECT CAST (2 AS DECIMAL) ; ------" щ а е т С Я в дро5ног Z.OO.

Функция CAST { ) применяется и в других ситуацих: в списках значений


INSERT, в списках столбцов SELECT и т. д.

Функция CAST О не мо)кет использоваться


для преобразования:
♦ Дробных чисел в целые;
♦ TIME,DATE,DATETIME,CHAR в DECIMAL и INTEGER.

да л ьш е > 559
получение т ек ущ ей и н ф о р м а ц и и

7. Кмя пользователя и текущее время


Иногда для одного пользователя в РСУБД создаются несколько учетных запи­
сей с разными разрешениями и ролями. Чтобы узнать, какая учетная запись
используется в настоящий момент, введите следующую команду:

SELECT CURRENTJJSER;

В выходных данных команды также указывается имя хоста. Если РСУБД рабо­
тает на одном компьютере с пользователем, а пользователь работает с учет­
ной записью mot, команда выдаст следующий результат:

г о о t @ lo c a lh o s t

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


IFile Edit Window Help

560 п р и ло ж е ни е I
прочее

8. Полезные числовые функции


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

Ч и сло вая Н ахначение


ф ункция
ABS(x) Возвращает модуль (абсолютную величину) х
sanpoc ревуяьтат
SELECT A B S (-2 3 ); 23
ACOS(х) Возвращает арккосинус х
SELECT ACOS(O); 1.5707963267949
ASINO Возвращает арксинус х
SELECT A S IN ( O .l) ; 0.10016742116156
ATAN(x,y) Возвращает арктангенс отношения переменных х и у
SELECT A T A N (-2 ,2 ); -0.78539816339745 |
C EIL(x) Возвращает наименьшее целое число, большее либо равное х. Возвращае­
мое значение имеет тип В1 6 1 ЫТ
SELECT C E IL (1.32 ); 2
COS (х) Возвращает косинус х в радианах
SELECT C O S (l); 0.54030230586814
СОТ (х) Возвращает котангенс х
SELECT СОТ(12); -1.5726734063977
ЕХР(х) Возвращает результат возведения числа е в степень х
SELECT E X P( - 2 ) ; 0.13533528323661
FLOOR(х) Возвращает наибольшее целое, меньшее либо равное х
1SELECT FLOOR(1 .3 2 ); 1
FORMAT (х,у) Преобразует X в отформатированную текстовую строку с округлением
до у цифр в дробной части
SELECT FORMAT(34 521 00 .5 0,2); 3,45 2,10 0.5 0 1
LN(x) Возвращает натуральный логарифм х |
SELECT LN (2); 0.69314718055995
LOG(x) and Возвращает натуральный логарифм х, или, при использовании двух пара­
LOG(x,y) метров, возвращает логарифм х по основанию у
SELECT LOG(2); 0.69314718055995
SELECT LO G (2,65536); 16

|||»оДоЛЖение на сЛеДЛ1°Щей о и ран и Ц е.

да л ьш е ► 561
другие числовые ф ункции

8. Полезные чиелобые функции (продол)кение)


Ч и сло вая О писание
ф ункц ия

MOD(x,y) Возвращает остаток от деления х на у


н трм |1е> у я ь тат
SELECT MOD( 2 4 9 , 1 0 ) ; 9
Р1() Возвращает число "пи"
SELECT Р Х ( ) ; 3 .1 4 1 5 9 3
POWER ( X , у) Возвращает результат возведения х в степень у
SELECT P O W (3,2); 9
RADIANS(х) Возвращает результат преобразования х из градусов в радианы
SELECT RADIANS( 4 5 ) ; 0 .7 8 5 3 9 8 1 6 3 3 9 7 4 5
RANDO Возвращает случайное вещественное число
SELECT RANDO ; 0 .8 4 6 5 5 9 2 0 6 8 1 2 2 3
ROUND (х) Возвращает значение х, округленное до ближайшего целого
SELECT ROUND( 1 . 3 4 ) ; 1
SELECT ROUND( - 1 . 3 4 ) ; -1
ROUND( X , у) Возвращает значение х, округленное до у цифр в дробной части
SELECT ROUND( 1 . 4 6 5 , 1 ) ; 1 .5
SELECT ROUND( 1 . 4 6 5 , 0 ) ; 1
SELECT ROUND( 2 8 .3 6 7 , - 1 ) ; 30
S I6 N (x ) Возвращает 1, если число х положительно, 0 - еспи оно равно 0, или -1 для
отрицательного х
SELECT S I ( a i ( - 2 3 ) ; -1
SIN (x) Возвращает синус х
SELECT SIN (P I 0 ) ; 1 .2 2 4 6 0 6 3 5 3 8 2 2 4 е -1 6
SQRT(х) Возвращает квадратный корень из х
SELECT SQRT(IOO); 10
TAN(x) Возвращает тангенс х
SELECT T A N (P IO ); - 1 . 2 2 4 б 0 6 3 5 3 8 2 2 4 е -1 6
TRUNCATE(х ,у ) Возвращает число х, усеченное до у цифр в дробной части
SELECT TRUNCATE( 8 . 9 2 3 , 1 ) ; 8 .9

562 приложение I
прочее

9 . индексирование для ускорения операций


Вы уже знаете, что такое индексирование по первичному и внешнему
ключу. Такие индексы отлично подходят для логического связывания
таблиц и обеспечения целостности данных. Однако индексы также
можно строить для отдельных столбцов, чтобы ускорить обработку
запросов.
Если условие WHERE применяется к неиндексировапному столбцу,
РСУБД начинает с первого значения этого столбца и последовательно
проверяет все записи, одну за одной. Для большой таблицы (скажем,
4 миллиона записей) перебор займет достаточно продолжительное
время.
При построении индекса для столбца РСУБД сохраняет дополнитель­
ную информацию о столбце, которая значительно ускоряет поиск.
Дополнительная информация, организованная особым образом, хра­
нится в специальной служебной таблице. За экономию времени при­
ходится расплачиваться дополнительными затратами пространства.
Следовательно, индексировать следует только тс столбцы, по которым
часто проводится поиск.
Общая схема выглядит так.
Определите, для каких столбцов вашей базы индексирование будет
наиболее эффективным. Например, представьте, что в огромной та­
блице a l l _ c o n t a c t s часто выполняется поиск по столбцам l a s t _
name и f irs t_ n a m e . Выполнение запросов стало занимать слишком
много времени, и вы решаете, что операции необходимо ускорить.
В MySQL для построения индекса с именем a l l c o n t a c t s names
используется следующая команда:

ALTER TABLE m y_contacts


ADD INDEX a ll_ co n ta cts_ n a m e s(la st_ n a m e , firs t_ n a m e ) ;

Индекс также можно построить командами следующего вида:

CREATE INDEX a ll_ co n ta cts_ n a m e s


ON a ll_ c o n t a c t s (last_nam e, firs t_ n a m e ) ;

Построение индекса a ll_ co n ta cts_ n a m e s имеет одно интересное


последствие: при выполнении запроса к исходной таблице (напри­
мер, SELECT * FR(»1 a ll_ c o n ta c ts ) записи будут отсортированы
по значению last_nam e со вторичной сортировкой по first_ n a m e
без указания порядка в команде.

дальше ► 563
РНР MySQL с высот hi 10,000 метров

10. PHP/MySQL за 2 минуты


Напоследок давайте очень кратко рассмотрим возможности взаимодей­
ствия с MySQL из РНР для выборки данных по Интернету. Этот крошечный
раздел дает лишь начальное представление об этой возможности, и вам
определенно стоит подробнее изучить эту тему.
Предполагается, что читатель уже немного разбирается в РНР, а также
достаточно уверенно пишет запросы SQL. Следующий фрагмент кода под­
ключается к базе данных с именем g r e g s _ l i s t и выполняет выборку имен
и фамилий из таблицы my c o n t a c t s . Код РНР сохраняет все данные, загру­
женные из базы, в массиве. Последняя часть кода выводит список имен
и фамилий на веб-странице.

<?php

$conn = m y s q l_ c o n n e c t( "lo c a lh o s t" , " g re g " , "g rS g zp A s");


if ( ! $conn)

{
d ie ( 'D id n o t c o n n e c t: ' . m y s q l_ e rro r());

m y sq l_ s e le c t_ d b ("my_db", $ con n );

$ r e s u lt = m ysq l_ q uery("SELECT firs t_ n a m e , last_nam e FROM m y_ con tacts");

w h ile ($ ro w = m y s q l_ fe tc h _ a rra y ( $ re s u lt) )

{
echo $ ro w [' firs t_ n a m e '] . " " . $ ro w ['la s t_ n a m e '];
echo "<br />";

m y sq l_ clo se ($ co n n );

?>

Файл сохраняется под именем gregsnam es .php на веб-сервере.

564 приложение I
прочее

Подробнее о ка)кдой строке


<?php
Первая строка сообщает веб-серверу о том, что дальше следует код РНР.
$сопп = m y s q l_ c o n n e c t( " l o c a l h o s t " , " g r e g " , "g rS g z p A s") ;
Чтобы подключиться к базе данных g re g s l i s t , необходимо сообщить веб-серверу ее местонахожде­
ние, имя пользователя и пароль. По этим данным создается строка подключения, которой присваива­
ется имя $сопп. Функция РНР mysql co n n e c t {) получает эту информацию и пытается использовать
ее для подключения к РСУБД.
if ( ! $corai)
{
d i e ( ' D id n o t c o n n e c t ; ' . m y s q l_ e r r o r ( ) ) ;
}
Если подключение не состоялось, РНР отправляет сообщение с описанием причины, а обработка
кода РНР на этом прекращается.
n ^ s q l_ s e le c t_ d b (" m y _ d b " , $conn) ;
Подключение к РСУБД прошло успешно. Теперь мы должны указать РНР, какая база данных нас инте­
ресует. Для выбора базы данных g re g s l i s t используется команда USE:
$ r e s u l t = n ^ sq l_q u ery ("S E L E C T f ir s t _ n a m e , la st_ n a m e РКШ n iy _ c o n ta c ts ") ;
База данных выбрана, подключение создано, но еще нет запроса для выполнения. Мы создаем такой
запрос и отправляем его РСУБД функцией m ysql_qu ery {). Все возвращаемые записи сохраняются
в массиве $ r e s u l t .
w h ile ($ ro w = m y s q l _ f e t c h _ a r r a y ( $ r e s u l t ) )
{
Теперь синтаксис РНР используется для вывода содержимого $ r e s u l t на веб-странице. Цикл $w h ile
перебирает записи, пока не будет достигнут конец данных.
ech o $ r o w [' f i r s t _ n a m e ' ] . " " . $ ro w [' la s t_ n a in e ' ] ;
ech o "< b r / > ";
}
Две команды РНР ech o выводят на веб-странице поля f i r s t name и l a s t name каждой записи. Вы­
водимые строки разделяются тегами HTML <br>.
lo s e ($ c o n n );
После того как все данные будут выведены, подключение к РСУБД закрывается (по аналогии с завер­
шением сеанса работы за терминалом).
?>
Сценарий РНР на этом завершен.

д а л ьш е > 565
|П 1Л оЖ ен и е : У стан овк а

Попробуйте сами

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


случае, если вы сможете применить их на практике.
в этом приложении содержатся инструкции по установке РСУБД MySQL.
установка MySQL

За зело!
Было бы странно прочитать книгу о языке SQL, не имея возможности
поэкспериментировать с ним. В этом разделе приведено краткое опи­
сание процесса установки MySQL для систем Windows и Мае OS X.

ПРИМЕЧАНИЕ. Материал раздела относится к Windows 2000,


ХР и Windows Server 2003, а также другим 32-разрядным
операционным системам семейства Windows. На платформе
Мае он относится к Мае OS X 10.3.x и более поздних версий.

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


грузки и установки MySQL. Бесплатная версия сервера РСУБД MySQL
называется MySQL Community Server.

инструкции u устранение проблем


Далее приводится список основных действий по установке MySQL для
Windows и Мае OS X. Этот список не заменяет подробные инструкции
на сайте MySQL, и мы настоятельно рекомендуем посетить сайт
и ознакомиться с инструкциями! Подробные инструкции, а также
руководство по устранению проблем в ходе установки приводятся по
адресу:

h t t p : / / d ev .m y sq l. com /doc/refm an/5. 0 / e n / w in d o w s -in s ta lla tio n .h tm l

Вам также пригодится программа MySQL Query Browser, упоминав­


шаяся на с. 550-551. Она позволяет вводить запросы и просматривать
результаты в интерфейсе приложения (вместо окна консоли).

568 Приложение и
установка MySQL

Устаиобка MySQL 6 системе Windows


Откройте страницу:
h ttp :/ / d e v .m y s q l. com /dow nloads/n^sql/5. О.h tm l
и щелкните на кнопке Download в разделе MySQL Community Server.

ВОЗМОЖНО; список
п р и д ет ся п р о к р у ­
т и т ь вниз.

8д/и нужна
версия S.O
и выше.

О Выберите ссылку Windows.


верхняя ct^poKal
Mmfsdownhxth J
* * I м,я»мем^м[»«1*»л
tKtmtcai « t d u . «vtnts aM more. MySQL 6.0 CoRvmmtt/ 8«rv«r - GefwraRy Avaieble (< ■ Windows
In conlnsi to «le U^SQL Enttfpn«« St«vw. «nicn rectM S D0№monM>^
S u ta c rtb * MOW .
sp*alc scAediMforwnftn a ntwvweion oflhe ii^SQLCommun^^ ■ Windows x64
ЕлМфпм 3«rv«r wM afso M avMaU« In №e si
M l (source and Olnarr') CommunKy M)U4e. So whUe th t Шс$1^
' Downloaaa StcBoo. the 8lnafl>s bstrt on Ws рзо» mav
operMng syslvffls зге and wM rtmaw comefttenHy
> ThtStMeaniWnarie&ar^rBcomnwneeaior^ Linux (non RPM. Intel C/C+-b comt
<Th*M
uv*r«M
nlndudM
aMI»oculfei
№M* Matures have matured and
IX vefsKjn also, for most pli
Red Hat Enterprise Linux 3 RPM f

да л ьш е * 569
установка MySQL в системе Windows

Загрузка установочного пакета


О В разделе Windows downloads мы рекомендуем выбрать пункт
Windows Z IP/Setup . EXE, потому что в него включена программа, силь­
но упрощающая процесс установки. Щелкните на ссылке Pick а M irror.

WtnOows SPfSeUsp EXE (x86). Downioad I Pick a m m x


Ш 5- lS««ff9€0»22cdB49Q3e03d4«6cf*20S 1Siyialuf«
W tftoot iR^aHer (ипгф s i С \) 5.0 .4 5 5O0M Download I Pick affijffOf
M:.-'' c40b»S7fe5gefa9iSf»caam7ba«-><gb! S y a l i y
Проследите, за
Window« x64 download* (piattoftn notes) meMj чт обы был
Windows Essenttats <^woe4 / mtef
Eh«4T} 5045 28QM Dgswilcadt WcKjiiiwrof выбран ва р и а н т
r * » . e60bMîe2tefS»7ô49«a>«?»»t540b
vwodows ap /s e tu p EXE (AMD64 / Intel
5 0 45 51 7M Download 1 PteK a mirror
с .EXE.
EM64T)
f-,fO£ 6f J«S4SÎ4Se4CieW«S39ïac<lS$ee7î ! З.чрта!ита
without BWJaner (AM064 / Intel EM64T> 5045 61Ш 0 !а О И Й 1 Е Ш Ш В £ !£
: eeUa«:6s3U021bltSt«?e«t«efef<•!So^ufg
Unux (non RPM package») download* {platform rwtes)
Lima gN>c-2 2, ‘stioxianT is state) 5045 75Ш Dowaoaa |PIcit a mifrof
•.•1: 3ct21H15cllic-»c3»blf 1*С *сЬ1М Л1!
Llou*(x86) 5045 604M Qownioadl PtcKamuTor
eO«5QM»65deZbU«et6*{}7C-sabtlSc4 ‘ £!Ш1ЙШ
iim » : / mtef EM647} 5 0 45 632M
f.îOb; аш)9ы»шох%шъгш1
Linux (IA64. Red Hat AS 2.1. state) 5045 1Й 2М Ptwn>paai P jck3_g»aB
MC? ?4S491422fSleJ7«liil0647«SS2K7f4 Si9fiatUfft
Q Irrtem«! I Protected Mcde On

Открывается список серверов, с которых можно загрузить копию


установочного пакета; выберите сервер, расположенный ближе к вам.

Когда загрузка файла будет завершена, откройте его двойным щелч­


ком. Запускается мастер установки (Setup Wizard), который и будет
руководить процессом установки. Щелкните на кнопке Next.

MySQL Srrm 5.0 - Setup Vteaid

W e l c o n i e t o t h e S e t u p w b a r d f o r M y S Q I.
S e r v e r 5 .0

The Setu p \№zard w l alow you bo modify, repair, or remove


MySQL Server 5 .0 . To continue, d d cN ext,

" i- j Двойной ш,елчок на


ф айле о т к р ы в а е т д и а ­
л ого во е окно м а с т е р а
t \ уст ановки. Щ ел к н и т е
M y S Q L ............................. ^ на кнопке Next.
i 1 Next> ^ 1 Caned . .{

570 приложение а
установка MySQL

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


О Вам будет предложено выбрать один из трех вариантов установки: стан­
дартную (Typical), полную (Complete) или пользовательскую (Custom).
В контексте нашей книги следует выбрать вариант Typical.
Вы можете выбрать папку, в которую будет установлена РСУБД MySQL
на вашем компьютере, но мы рекомендуем оставить предложенный по
умолчанию вариант:
C :\Program Files\M ySQ L\M ySQ L S e rv e r 5.0

Щелкните на кнопке Next.

Ready to InstaM the f^ogram


The vMzardis reedy to begin in

I f you « a n t to review or ctiarige an y o f )R]ur iista ts tio n setting s, cid ( Bade. C kk


e x rttfie w te rd . j

Current S e ta ig s :
Destination Rdder: I
1 iS e tL p T i^ e :
С:У>го£гат1=ае51|Му5{г.1|Иу5013етуе-5.0\ 1
Typical ^

Desenatjon Fokter:

Щ елкните на кнопке «Install» — u бое!


Открывается диалоговое окно «Ready to Install», в котором укг1за-
на выбранная для установки папка. Если папка выбрана правиль­
но, щелкните на кнопке Install. В противном случае щелкните на
кнопке Баск, выберите другую папку и вернитесь к этому окну.
Нажмите Install.

дальше > 571


установка MySQL в си с т е м е Mac OS X

Уетанобка MySQL в Мае OS X


Если на вашем компьютере установлена система Мае OS X
Server, то MySQL в ней уже присутствует.
Прежде чем переходить к установке, проверьте, не установ­
лена ли версия MySQL в вашей системе ( A p p lic a tio n s /
Sexver/MySQL Manager.

Откройте страницу:
h t t p : //dev. n ^ s q l . com /downloads/m ysql/5. 0 . h tm l
и щелкните на кнопке Download в разделе MySQL Community
Server.

Возможно, список
при д ет ся п р о к р у ­
т и т ь вниз.

572 п р и л о ж е н и е //
установка MySQL

Выберите в списке строку Мае OS X (package format).

в о з м о ж н о J список
MySQL S.OC< Server - Generally Available (GA) Release п р и д ет ся п р о к р у ­
SubacUfa« Now r
Inconirait to Vk MvSQ- Enicmn^ server wtvc^ r«c«h«s &o№monthly rapid updiMsarvd quarterty Mtvica pack rataases, (hare I» ru)
spetiflc Kheduie for when a r>ewverson ot (he MySOC Communié Server Is released. WMI« every bug ftx ihathas M«f) applied to the
EntewM Server wHi also be avtilttle m «ia subsequent Community Server reteate, №ere v»UI be Mirce<only rtiMsea in bet*een Kill
т и т ь вниз!
(«wree ar\d binary) CommwWv boiW*. So »hue ihe laie« puohîfted commuoiiy sour»* wiHalways be avaflawe fromtw SiiyiSÊ
Downioads Section, the »nariet Usted on ihlspaga maybe from a prevlouamleese. ki any case, full binaries lor an our supported
operawg systemt are and wWremain conveniently avaiiable fromihis page.

. TbeSUr rd br tr»st U!
• The Uax version mdudes addtdonal toatuies №ai haM not been exhausSvely
M ae teaMet have mabted and proven B be «able, they *tMbe incorpora)
Haz version also, tor mo« piaflorms, contam* u
programs
Mac OS X fpackage formal! I
■■ The Debwg binaries have been compiled with exirs debt
irKhided debugging code m w ------------------------

О Выберите пакет, соответствующий вашей версии Mac OS X.


Щелкните на ссылке Pick а Mirror.

О Открывается список серверов, с которых можно загрузить копию устано­


вочного пакета; выберите сервер, расположенный ближе к вам.

о Когда загрузка файла будет завершена, откройте его двойным щелчком. После уста­
новки MySQL откройте электронную документацию и посмотрите, как работать
с данными в программе Query Browser, упоминавшейся на с. 5 5 0-55L
Но если вы торопитесь, ниже описан быстрый способ работы с программой в тер­
минальном режиме.
Откройте окно терминал^ на Мае и введите следующие команды:
s h e l l > cd / u sr/ lo c a l/ m y sq l
s h e l l > sudo . / b in / in y sq ld _safe
(Введите пароль, если потребуется.)
(Нажмите Control-Z.)
s h e l l > bg
(Нажмите Control-D или введите e x i t для выхода из терминала.)

да л ьш е > 573
ри Л оЖ ен и е : ^ п и с о к и н сш р уМ еВ Д ^ о®

Полный инструментарий SQL

в этом приложении перечислены все инструменты


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

AND и OR
Знаки ANP и OR объединяют условия в кон­
струкциях WHERE для повышения точно­
= <><><=>=
сти отбора.
13 вашем распоряжении целый набор олера-
Глава 2
торов сравнения.
Глава 2

AUTOJNCREMENT
Если эта конструкция присутствует
в объявлении столбца, то при каждом
выполнении команды INSERT для это­
ALTER с CHANGE
го столбца автоматически генерируется
Изменение имени и типа данных суш,ест-
уникальное целочисленное значение.
вуьои^его столбца.
Глава 4
Глава 5

AVG
ALTER с MODIFY
функция возвраи^ает среднее арифметиче­
Изменение только типа данных суш,еству-
ское для числового столбца.
юш/его столбца.
Глава 6
Глава 5

ALTER с ADD В
Добавление столбца в таблицу в заданном BETWEEN
порядке. Определение диапазонов значений.
Глава 5
Глава 2

ALTER с DROP
Удаление столбца из таблицы.
Глава 5 CHECK CONSTRAINTS
Операции вставки и обновления с таблицей
выполняются только в том случае, если
ALTER TABLE значения удовлетворяют заданному усло­
Изменение имени таблицы и всей ее вию.
структуры без потери данных. Глава 11
Глава 5

576 п р и л о ж е н и е Ifl
список и н с т р у м е н т о в

CHECK OPTION CROSS JOIN


Используемся при создании обновляемых Набор всех комбинаций записей одной т а­
представлений; все операции вставки и блицы с записями другой таблицы. Также
обновления должны удовлетворять условию встречаются другие названия — «декар­
WHERE в определении представления. тово соединение»J «декартово произведе­
Глава 11 ние» и др.
Глава 8

COUNT
Подсчет количества записей в результа­
тах запроса SELECT без их непосредствен­
ного получения. COUNT возвраи^ает одно DELETE
целое значение. удаляет записи данных из таблицы. Ис­
Глава 6 пользуйте условие WHERE для точного
определения удаляемых записей.
Глава 3
CREATE TABLE
Создание таблицы. Для выполнения ко­
манды необходимо знать ИМЕНА и ТИПЫ DISTINCT
ДАННЫХ столбцов. Для получения этой Выборка только уникальных значений, без
информации следует проанализировать дубликатов.
данные, которые вы собираетесь хранить Глава 6
в таблице.
Глава 1
DROP TABLE
Команда удаляет таблицу, при создании
CREATE TABLE AS которой была допуи{ена ошибка — но это
Создание таблицы по результатам произ­ следует делать до выполнения команд
вольной команды SELECT. INSERT, заполняюоцих таблицу данными.
Глава 10 Глава 1

CREATE USER Е
Команда используется в некоторых РСУ5Д
для создания учетной записи пользователя EXCEPT
и назначения ему пароля. 3 результат включаются записи, вхо-
Глава 12 дяш,ие в результаты первого запроса, но
НЕ ВХОДЯЩИЕ в результаты второго
запроса.
Глава 10

да л ьш е > 577
G -S

М
GRANT МАХ и MIN
Команда точно определяет, какие опера­ МАХ возвраи^ает наибольшее значение
ции могут выполняться пользователем столбца, а MIN — наименьшее.
с таблицами и столбцами, на основании Глава 6
предоставленных ему привилегий.
Глава 12
N
GROUP BY NOT
Группировка записей по одинаковым значе­ Логическое отрицание результата.
ниям столбца. Глава 2
Глава 6

NULL и NOT NULL


При создании базы данных следует знать,
какие столбцы не должны принимать зна­
INTERSECT чение NULL — это упростит сортировку
В результат включаются данные, при- и поиск данных. Условие NOT NULL задает­
сутствуюш,ие в результатах первого ся для столбцов при создании таблицы.
И второго запроса. 1'лава 1
Глава К)

О
IS NULL
Условие для проверки неопределенных зна­ ORDER BY
чений NULL. Результат запроса упорядочивается
Глава 2 по заданному столбцу.
Глава 6

L
LIMIT
Условие определяет, сколько именно запи­ SELECT *
сей должен вернуть запрос и с какой запи - Выборка всех столбцов таблицы.
си следует начинать. Глава 2
Глава 6

578 1 Р(!ложенис II!


в-н

в
Внешний запрос Левое внешнее соединение (LEFT OUTER
Запрос, содержаіций внупп.ренний запрос JOIN)
(подзапрос). Перебор всех записей ЛЕВОЙ таблицы
Глава 9 и поиск для них соответствия среди запи­
сей ПРАВОЙ таблицы.
Глава 10
Внешний ключ
Столбец таблицы, значения которого ссыла­
ются на первичный ключ другой таблицы. М
Глава 7
«Многие-ко-многим»
д в е таблицы связываются через соедини­
Внутреннее соединение (INNER JOIN) тельную таблицу, благодаря чему многие
Любое соединение, комбинирующее записи записи первой таблицы могут быть свя­
двух таблиц по некоторому условию. заны со многими записями второй —
и наоборот.
Глава 8
Глава 7

Внутренний запрос
Запрос, находящийся внутри другого запро­ н
са. Также может называться подзапросом.
Некоррелированный подзапрос
Глава 9
Подзапрос, который существует сам по
себе и не содержит ссылок на данные внеш­
него запроса.
Вторая нормальная форма (2НФ) Глава 9
Таблица находится в 1Нф и не содержит
частичных функциональных зависимостей.
Глава 7
Необновляемое представление
Представление, которое не может ис­
пользоваться для вставки или обновления
Е данных базовой таблицы.
Глава 11
Естественное соединение
Внутреннее соединение без «ОЫ». Рабо­
тает только при соединении двух таблиц,
содержащих одноименные столбцы.
Глава 8

580 пр и л о ж е н и е III
список и н с т р у м е н т о в

Подзапрос
Запрос, вложенный в другой запрос. Также
может называться «внутренним запро­
Обновляемое представление
сом».
Представление, которое позволяет изме­
Глава 9
нять данные в базовых таблицах. Обновля­
емые представления должны содержать все
столбцы NOT NULL своих базовых таблиц.
Правое внешнее соединение
Глава 11
Правое внешнее соединение перебирает все
записи ПРАВОЙ таблицы и ищет для них
соответствия среди записей ЛЕВОЙ таб­
«Один-к-одному» лицы.
Ровно одна запись родительской табли­
Глава 10
цы связывается с одной записью дочерней
таблицы.
Глава 7
Представление
Результат запроса, рассматриваемый как
таблица. Представления особенно удобны
«Один-ко-многим»
для сокращения сложности запросов.
Запись одной таблицы может быть свя­
Глава 11
зана со многими записями другой таблицы,
но каждая запись последней может быть
связана только с одной записью в первой.
Глава 7

Рефлексивный внешний ключ

п Внешний ключ той же таблицы, в которой


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

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

дальше > 581


с -э

Составной ключ Третья нормальная форма (ЗНФ)


Первичный ключ, состояиА,ий из нескольких Таблица находится в 2НФ и не имеет
столбцов, комбинация кот орых образует транзитивных зависимостей.
уникальное значение ключа. Глава 7
Глава 7

Строковые функции
функции, изменяющие копии содержимого Эквивалентное и неэквивалентное
текстовых столбцов, возвращаемые за­ соединение
просом. Исходные данные остаются неиз­ Дбе разновидности внутренних соедине­
менными. ний. Эквивалентное соединение возвращает
Глава 5 комбинации с равными значениями,
а неэквивалентные — с неравными значени­
ями столбцов.
Схема Глава 8
Описание данных, хранимых в базе данных,
включающее все объекты и связи между
ними. Экранирование
Глава 7 Апострофы в текстовых данных необходи­
мо экранировать — удвоением апострофа
или обратной косой чертой.
Т Глава 2

Транзитивная фунциональная зависимость


Не-ключевой столбец связан с другим
не-ключевым столбцом (-ами).
Глава 7

582 пр и п о ж е н и е III
Линн Бейли
Изучаем 80Ь
Перевел с английского Е. Матвеев

Заведующий редакцией А. Кривцов


Руководитель проекта А. Юрченко
Ведущий редактор Ю. Сергиенко
Художественный редактор Л. Адуевская
Корректор В. Листова
Верстка И. Смарышева

ООО «Мир книг», 198206, Санкт-Петербург, Петергофское шоссе, 73, лит. А29.
Налоговая льгота — общероссийский классификатор продукции ОК 005-93,
том 2; 95 3005 — литература учебная.
Подписано в печать 26.08.11. Формат 84х1(Ю/16. Уел. п. л. 62,160. Тираж 2000. Заказ 26231.
Отпечатано по технологии С 1Р в ОАО «Первая Образцовая типофафия»,
обособленное подразделение «Печатный двор».
197110, Санкт-Петербург, Чкаловский пр., 15.

Вам также может понравиться