Академический Документы
Профессиональный Документы
Культура Документы
Изучаем
Приведи
в порядок
свои
отношения
с данными
Освой концепцию
и синтаксис SQL
максимально
эффективно
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. Все права защищены. Никакая часть данной книги не
может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских
прав.
\ Л и н и беЙАМ
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?
9
а н н ы е u tt»«f>.IIuUbi
Определение данных 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 удаляет из таблицы данные,
которые вам больше не нужны. Но мы не только рассмотрим новые инструменты;
в этой главе вы узнаете, как избирательно применять новые возможности и как
предотвратить случайное удаление полезных данных.
12
U j^oeKm uj^oBaH ue т а б л и ц
13
ALIHl
К а к изм енить прошлое
Вам никогда не хотелось исправить прошлые ошибки?
Что же, теперь у вас есть такая возможность. Благодаря команде ALTER
вы сможете применить свои новые знания к таблицам, созданным много дней,
месяцев и даже лет назад. А самое замечательное, что это никак не повредит
существующим данным! К настоящему моменту вы уже знаете, что означает
понятие нормализованный, и можете применять его ко всем таблицам —
как прошлым, так и будущим.
14
I^ C fflu J’ eHHbie В о з м о ж н о с т и
15
]^ н о Го тп аел и Ч н ь1е б а З ы Д ан н ы х
16
^оединения и МноГотпабЛиЧные опер*аЦии
17
Ц од зал р о сь!
. 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
19
^аниЧения, 1 ]|='еДстаБления u т р а н з а к ц и и
O rfs
У семи нянек
Ваша база данных выросла, и теперь с ней будут работать дру
гие люди, к сожалению, далеко не все они так же хорошо разбираются в SQL,
как вы. Вам придется позаботиться о том, чтобы предотвратить ввод неверных
данных, запретить просмотр лишних данных, а также предотвратить возмож
ные конфликты при одновременном вводе данных. В этой главе мы займемся
защитой данных от чужих ошибок. Итак — Защита Баз Данных, часть 1.
20
1)
еЗоГШСНосШЬ
а її
bashful doc
1
dopey grumpy
A
happy sleepy
J L
sneezy
21
Десять важ нейш их тем
(о которых мы не р а сс ка за л и )
Но даже после всего сказанного беседа еще
чена1 Есть еще кое-что, о чем вы должны знать. Мы реп
неправильно просто проигнорировать эти темы — они за(
бы краткого упоминания. Итак, прежде чем откладывать к
тесь с этими короткими, но важными разделами. А ког,/;
те и эту главу, останется еще пара приложений... и может
рекламы... и ничего больше. Честное слово!
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
Введение
. т а к . о и е м у они бкА ^ и м ли
Т А К -О Е б к н и гу об $ ^ и ? »
Для кого написана эта книга?
Если вы ответите «да» на все следующие вопросы.
[З ам ет ка о т отдела продаж-
воо6и^е-то эт а книга для любого
у кого е с т ь деньги.] '
26 введе н и е
Мы знаем, о чем Вы думаете
«Разве серьезные книги но такие?»
«И почему здесь столько рисунков?»
«Можно ли так чему-нибудь научиться?»
Мозг
аапьил 27
'^тпа книГа дяя ш е * , тсш° хоЧ еш учигпься.
Как мы что-то узнаем? Сначала нужно это «что-то» понять, а потом не забыть. Затол
кать в голову побольше фактов недостаточно. Согласно новейшим исследованиям в об
ласти когнитивистики, нейробиологии и психологии обучения, для усвоения материала
требуется что-то большее, чем простой текст на странице. Мы знаем, как заставить ваш
мозг работать.
28 введе ни е
Метапозиаиие: наука о мышлении
Если вы действительно хотите быстрее и глубже усваивать новые зна
ния —задумайтесь над тем, как вы задумываетесь. Учитесь учиться.
Как бы теперь
Мало кто из нас изучает теорию метапознания во время учебы. Нам ио- заставить мой
ложеко учиться, но нас редко этому учат. мозг все это
запомнить...
Но раз вы читаете эту книгу, то, вероятно, вы хотите изучить и по
возможности быстрее. Вы хотите запомнить прочитанное, а для этого
абсолютно необходимо сначала понять прочитанное.
Чтобы извлечь максимум пользы из учебного процесса, нужно заставить
ваш мозг воспринимать новый материал как Н ечто Важное. Критичное
для вашего существования. Такое ж е важное, как тигр. Ина
че вам предостоит бесконечная борьба с вашим мозгом,
который всеми силами уклоняется от запоминания новой
информации.
да л ьш е ► 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 введени е
что можете сделать ш , чтоьы
заетабить сбои мозг побиноВаться
^ ь ір е ж ь т е Мы свое дело сделали. Остальное за вами. Эти советы стану ч
^ > ^ рт реп и т е отправной точкой; прислушайтесь к своему мозгу и определи
«я холодильник те, что вам подходит, а что не подходит. Пробуйте новое.
31
примите к сведению
Это учебник, а не справочник. Мы намеренно убрали из книги все, что могло бы
помешать изучению материала, над которым вы работаете. И при первом чтении
книги начинать следует с самого начала, потому что книга предполагает наличие
у читателя определенных знаний и опыта.
Упражнения ОБЯЗАТЕЛЬНЫ.
Упражнения являются частью основного материала книги. Одни упражнения спо
собствуют запоминанию материала, другие помогают лучше понять его, третьи
ориентированы на его практическое применение. Н е пропускайте упражнения.
32 вве де н и е
Повторение применяется намеренно.
У книг этой серии есть одна принципиальная особенность; мы хотим, чтобы вы
действительно хорошо у св ои л и материал. И чтобы вы запомнили все, что узнали.
Большинство справочников не ставит своей целью успешное запоминание, но это
не справочник, а учебник, поэтому некоторые концепции излагаются в книге по
нескольку раз.
Джейллм Хбндерсон
^ э р и К оА лет и л
Стив Милана
Л у -Э н и Мйззй
Ч осер т о ж е
^ ^ oм oгaл.
Н а ш и за м е ч а т ел ь н ы е р ец ен зен т ы
Мы бесконечно благодарны нашим техническим Flavored Rings в плохо проветриваемых подвалах
рецензентам, вылавливавшим бесчисленные по всей стране, обычно он сидит дома со своими
грубые ляпсусы, коварные ошибки и банальные котами Ральфом и Сквиком.
опечатки. Без них материал книги не был бы
«Шелли» Мойра Мишель Риме, магистр педа
и наполовину таким четким и правильным. Они
гогических наук, обладательница сертификатов
отлично справились со своей работой.
м е р и MCSE, ведет образовательные программы
К эри Коллетт применил 15 лет практического для детей младшего возраста в общественном
опыта, полученного во время работы в начинаю колледже Дельгадо (Нью-Орлеан). В настоящее
щих фирмах, правительственных лабораториях время она переводит свои учебные курсы в ин
и финансовом секторе, в ходе рецензирования тернет-формат, чтобы обеспечить изменившиеся
этой книги. Сейчас он надеется вернуться к дру потребности населения Нью-Орлеана после ура
гим приятным занятиям, не связанным с рабо гана «Катрина». Мы благодарны ей за то, что она
той, — кулинарии, туризму, чтению книг и развле смогла выбрать для нас время в своем плотномО
чениям с собаками. графике.
Лу-Энн Мазза выкроила немного времени из своей Джейми Хендерсон — ведущий специалист по
занятой профессиональной жизни программиста системным архитектурам. Ее волосы выкрашены
и аналитика для написания исключительно точных в фиолетовый цвет, а свободное время делит
и актуальных рецензий. Мы рады, что теперь она ся между виолончелью, книгами, видеоиграми
сможет уделять больше времени своим увлече и фильмами на DVD.
ниями —велоспорту, фотографии, компьютерам,
Благодаря этой замечательной группе код
музыке и теннису.
и упражнения в книге делают именно то, что им
Когда Стив Милано не программирует на по положено делать, а читатель, перевернув послед
лудюжине разных языков, не пишет рецензии нюю страницу, начнет вполне уверенно програм
по книгам и не играет в группе панк-рока O nion мировать на SQL.
34 введе н и е
Благодарности
Р едакт оры
Прежде всего хочу поблагодарить своего редактора Б ретта Маклаф
лина за целых два учебных курса по серии Head First. Бретт не просто
редактор —умение выслушать собеседника сочетается с готовностью
помочь. Б ез его руководства, поддержки и интереса эта книга никогда
не была бы написана. Он не только понял меня с первого собеседова
ния, но и благожелательно относился к моему (порой чрезмерному)
юмору. В результате эта книга стала самым лучшим из всех моих автор
ских проектов. Бретт дал мне много полезных советов, и благодаря
ему я узнала много полезного в ходе работы. Спасибо, Бретт!
Г-Э1''лрин Н о л а н
С от рудн и ки и зд а т ел ь с т в а O ’R eilly
Художественный редактор Луиза Барр была для нас хорошим другом и талантли-
ным дизайнером. Каким-то образом ей удалось преобразовать мои безумные идеи
по впечатляющие художественные образы, которые предельно ясно передают са
мые сложные концепции. Вся работа по дизайну была выполнена ей, и я уверена,
что на многих страницах книги вам захочется поблагодарить ее вместе со мной.
35
1 ]^аннь10ища^ЛиДы
38 глава 1
Нет ли более разумного способа хранения этой
информации? А что бы сделали ВЫ на его месте?
39
Как насчет базы данных?
Ведь книга написана о базах
данных, верно?
40
Р Возьми в руку карандаш
Перед вами несколько карточек из каталога Грега. Найдите
сходные данные, собранные Грегом о каждом человеке. При
свойте таким данным метку, описывающую категорию инфор
мации, и запишите эти метки в отведенных полях.
'^ ан Скуп
^ ен ат
-Антонио, тХс
і^<Мет: ничего
Анджелина Мендоса
Дата рождения:
Системный
администратор
\ Замужем
\ Сан-Франциско, СА
\ 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 Системный Заму^е-м ' с л н -Ф р л н ц и с к о , СА ррлбота
---- — адттимратйр ^ ^
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, о которой вы
должны знать, — контейнер, в котором хранятся все ваши табли
цы. Она-то и называется базой данных.
\
На диаграм м ах и б лок-схем ах базы
данных изображаются в виде цилиндров.
Когда вы видите такое изображение
значит , п ер ед вами база данных.
44 глава 1
да п ы и е 45
п° базам данных
К^оД Ц о Д м и к р о с к о п о м
\лии,а
46
цр базам Данных
а А Ш ) т а б л и ц е й
Starhuzx Coffee
2 .3 /4
s q
2.SM ТАЗ
Кп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
Таблица с и н ф о р
м ацией о пончиках Таблица с и н ф о р
с вареньем . м ацией о пончи
к ах с г л а з у р ь ю .
У
Таблица с инфор
мацией о других М * м к*
кекс с корицеи
•«й*»
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
столбцы со ст ро ка м и -
и получаем таблицу. ^
ff ir s t_ n a m e 1аз1_пате a d d re s s С ||у s la te id .n u ln
Дж о Эппс данные данные данные данные
да л ьш е у 49
Выходит, данные с моих карточек
можно преобразовать в таблицу?
г л
Имй . Профессия ^ Место Ублеч&ния
Фамилия
J J
А ‘>та I Смаилус
I —■■■и .......„ „ I
жительства I: Электронная
----- у^нта f ’......
Ц
^ Данные одной к а р -
п^очки образуют
строку.
~ s r : = = - “
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
Ваза данных библиотеки.
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
52 глава 1
КоАмидуйте!
Запустите свою систему управления реляционной базой данных SQ L (РСУБД).
Откройте окно командной строки или графическую оболочку для работы с РСУБД.
Наше окно терминала после запуска MySQL выглядит так:
С
Угловая скобка — п риглаш ение команд
ной строки. После нее вводятся команды Пробелы в именах баз дан
управления.
ных и таблиц SQL запреш,ены.
в м е с т о них обычно и сп о л ь зу
Прежде всего необходимо создать базу данных, в которой
ю т ся символы подчеркивания.
будут храниться таблицы с данными.
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? Почему
в имени нет апострофа?
Имя таблицы
записывается
созЭлкиЯ в ныжнел! р е г и
ст ре и может ст роки ^ ^-<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?
г .
/
lasl_name firsf_iiame email birthday prefcssion iocalien •talus interests seelcing
ШТУРМ
Найдите два важных отличия между именами столбцов
на карточке и в таблице. Почему они важны?
56 г пава
Посмотрите, как просто пишется код $01
Иы уже знае те, что для создания таблицы данные необхо
димо разбить на категории. Затем вы подбираете подхо-
Д Я 1 Ц И Й тип данных и длину каждого столбца. После этого
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),
57
- возьми в руку карандаш
Ниже приведены описания каждой строки команды C R E A T E
Решение T A B L E и примеры данных для каждого типа столбца.
/
/ Наконец-то создаем таблицу my.contacts
Теперь вы гочно знаете, что делает каждал строка,
\ и можете ввести команду CREATE TABLE для созда-
' ния таблицы. Команду можно вводить по строкам,
копируя ее из приведенного выше определения.
58
Таблица готова
I h ie td il Window Help AIIDone
-> 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/\
выполнить ее.
да л ьш е 59
Зиакометбо е типами данных
Перед вами еще несколько полезных типов данных. Их рабо
та —хранить ваши данные без искажения. С VARCHAR и DATE
вы уже знакомы; пора познакомиться с остальными.
™ зн аем .
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 С наиболее подходящий гип данных для каждого Количество цифр в ц е л о й
столбца... А заодно заполните другие недостающие данные. и дробной части.
Количество единиц
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 )
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 с фиксированной
столбца... А заодно заполните другие недостающие данные.
длиной значения.
Количество единиц
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)
m e e tin g
Время (и день) встречи 10:30 4/ 12/ 2020 PATETIME /
tim e
62
МОМЕНТЫ
DESC my_contacts;
> DESC my c o n t a c t s ;
0<1ЛЫи1г >■ 63
Описание таблицы
На э т и а т р и б у т ы п о к а
Резул ьтат вы полнения команды DESC
не о б р а и ^ а й т е в н и м а н и я ;
вы глядит п р и м ер н о так:
вскоре м ы в е р н ем с я к ним.
> 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)
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 )
да л ьш е > 65
г .
^ а Г н и т ы с к°ДаМи f^ T E DATABASE '
Вы должны были восстановить .
код создания базы данных / USE gregs_li3 t ^
и таблицы с новым уже
contacts ^
столбцом gencier. сущ ест вует .
“ читайте Залошс...
location VARCHAR(50 ),
Л 6ь! !лог^ь.глалмсь вбеа^ли коМДнЗу
V 'R E A TE TABL-B'^ Тогда вы, иаверног,
status
иже знасп^,е что коллаи?а ыз этого
сцлражнеиия не fyai'^'-vo interests VARCHAR(100),
иовьи< стслд&Оу
seeking VARCHAR(100)
---- ----
Е-сли вь! ввели ко.\'\аидс1 в свосй ) ;
консоли, вероятно, р е з у л ь т а т
выглядел приА^.ерно т а к :
66 глава 1
Задаваем ы е -
BoTljoCbi
Почему после определения столбца «seeking А если у меня есть таблица с данными и в нее нужно
^RCHAR(IOO)» нет запятой, как у других столбцов? добавить столбец? Можно ли сделать это без удаления
всей таблицы и повторения ввода?
--------^ ^
Так команду CREATE TABLE придется
набирать повторно? Если бы команды SQL мож
но было вводить в текстовом редакторе (скажем,
Блокнот или T extE d it), это сэкономило бы нам
немало времени и сил.
о а л ьш е > 67
Долой старые таблицы!
О Уничтожить старую таблицу куда проще, чем
создать новую. Введите простую команду:
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 INTO имя_та6лицы (столбеці, столбец2,...)
VALUES ( 'значениеі' 'значение2
Еще одно ключевое
слово-, сообщ ает,
Список значении,
Л Текстовые данные
; А р у г и е зна ч е-
что дальше с л ед у ния (запят ая
разделенных з а п я всегда заклю чаю т ся
ет список зн а ч е- после п о след -
тыми. В базе дан в апост роф ы , даже
ним столбцов.
ных Грега список него значения /
отдельные символы
содерж ит данные не нужна).
(н а п р и м ер , 'М '). ^ лоМ
с карточек.
70
кто
Прежде чем составлять команду IN S E R T , необходимо устано
вить соответствие между именами столбцов и значениями.
СТОЛБЦЫ ЗНАЧЕНиЯ
seeking '1980-05-09'
aa n h iu e f 71
кто
Прежде чем составлять команду INSERT, необходимо устано
вить соответствие между именами столбцов и значениями.
СТОЛБЦЫ ЗНАЧЕНиЯ
gender 'Писатель'
72 гл ава 1
Создание команды INSERT
Н аж м ит е RETURN п ер ед о т к р ы
вающей скобкой - э т о у п р о с т и т
Ю1^ся за^яте71Мм. чт ение кода в окне консоли
Порядок важен!
У д ь т ц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);
74 гпава 1
Возьми в руку карандаш
Ваша РСУБД сообщает об ошибках в командах, но эти сообщения по
рой выглядят весьма туманно. Взгляните на каждую из приведенных
ниже команд IN SER T. Попробуйте найти ошибку в каждой из ко
манд, затем введите ее и посмотрите, что скажет РСУБД.
Где ошибка?
Где ошибка?
Где ошибка?
...................................................................
............................................................................... основного кода команды.
да л ьш е ► 75
Р ^ о з ь м и в руку карандаш
V 6Ш6НИ0 Ваша РСУБД сообщает об ошибках в командах, но эти сообщения по
рой выглядят весьма туманно. Взгляните на каждую из приведенных
ниже команд IN S ER T. Попробуйте найти ошибку в каждой из команд,
затем введите ее и посмотрите, что скажет РСУБД.
76 глава 1
Модификации команды INSERT
У синтаксиса INSERT существует ряд модификаций, о которых следует знать.
^VALUES Ш ТУР М
да л ьш е > 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 '
> 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.
Мы х о т и м вы
брат ь все дан
ные из таблицы... .. збезЗоика им енно
эт о м означает:
^ выбрать ВСЕ- таблицы.
ШТУРМ
Итак, в столбцах, которым не присвоены
значения, выводится 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 столбцам таблицы.
profession V A R C H A R (50),
location V A R C H A R (50),
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),
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,
> 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
дал ьш е > 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
84 -■.лава 1
КЛЮЧЕВЫЕ
МОМЕНТЫ
У Новые инструменты
Мы подошли к концу главы 1.
Для вывода описания структуры таблицы
Вы научились создавать
используется команда desc .
базы данны х и таблицы
Команда d ro p ta b le уничтожает таблицу и вставлять в них данные некоторых
со всем содержимым. Будьте внимательны!
распространенных типов. Кроме того,
Для сохранения данных в таблице исполь вы знаете, как обеспечить наличие
зуется команда in s e r t , которая существу определенного значения у столбца.
ет в нескольких вариантах.
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
Точно знаю, когда вам нужно явиться к врачу на следующей неделе. ETIME
86
2 Команда m j
Выборка данных
Даниіне хранятся
в таблице Грега...
где -mo.
( Т А Ш )
U Л о>л|>оЄушііЄ
т наш ци Б ней ^ н н из «^ранЦисКо.
88 г.Пг1ва 2
лишь> начало таолиць!-
\
,, ещ е не конец! у Г р « . ^
, , ( | Е Н Ь М Н О Г О карточек.
дальш е > 89
ш а н ь J p e ro M . Q n iB e ïïi
п и с а т ь и х имена, «фами
5 л а н т , Энн: anneЫunt@дhreakneckpizza.co^^
лии U a A j’ e ca эЛeкm J^ннoй
поЧты.
ищем контакт
Поиск занял с л и шком много времени
и был исключительно нудным. Также
существует весьма реальная опасность того, То: Тот, Энн <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?
Ковбой, ты-то мне и нужен! Заедь за мной в пять Я не та Энн, которую ты ищешь, но я уверена,
зайдем куда-нибудь перекусить. что она того стоит. Если что-то не срастется —
напиши мне.
90
Улучшенная команда SELECT
( 1л<!лующая команда SELECT поможет Грегу отыскать данные Энн намного
Лы( трее, чем при дотошном просмотре всей огромной таблицы. В этой
команде мы используем условие WHERE, кот орое уточняет критерий от бора
мписей для РСУБД. Условие сужает результаты поиска, а команда возвра-
|||яст только те записи, для которых это условие выполняется.
[/ІДДЯ т аблиці?!
Поставьте с и м
/ вол « : » и нажлли-
^ е RETURN, чтобь,
SELECT * FROM my contacts выполните,' з а п р о с :
. « Е сл и ст олбец first
п а т е содерж ит
IRE first__name = 'Энн'; имя « Э н н » , пока ~
за т ь запись>'-.
ч
|. лючебое слово
в условии WHERE - н а языке
это означает, SQL это Значение столбца first^namx.
I I'VBA, что команда п р о означает Не забудьте, что т е к с т о
веряет значения «равно вые значения должны заклю
I, і іллаблицм п о д
столбца с и м ен ем чаться в апострофы.
м н о ж е с т в о за^-o.ceu.
tirst^ n am .e.
91
Минутку, вы же не думали, что я не замечу
знак * ? Что он здесь делает?
Что это за * ?
Звездочка ( * ) приказывает РСУБД вернуть зна
чения всех столбцов таблицы.
Когда вы видите 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
Знаиени.я a m o u n t i u а т о и ^ іг
з а д а ю т с я в унцыях.
93
Р ьозьми в руку карандаш
Подучите сбой напиток
в запросах Воспользуйтесь только что созданной таблицей
£cAW о [goAfcii — не ОССлОК easy_drinks и проверьте эти запросы на своем
CW/^ lл.0CM0^^P^^ ' компьютере. Запишите, какие напитки вернет каждый
зап р ос,
Какие напитки?...................................................................................
Какие напитки?...................................................................................
Какие напитки?...................................................................................
Какие напитки?...................................................................................
Какие напитки?...................................................................................
Какие напитки?...................................................................................
Какие напитки?
Какие напитки?
94 глава 2
Один момент... Вы говорите: «Проверьте
эти запросы». Значит, предполагается,
что все они работают. И я вам поверила!
Но один запрос вообще не работает,
а еще несколько выглядят сомнительно.
95
возьми в руку карандаш- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Решение Получите сбой напиток
Итак, вы воспользовались таблицей еазу_с1г±пкз,
проверили запросы на своем компьютере и записали
какие напитки вернет каждый запрос.
Какие напитки? Г о р я ч е е з о л о т о
96 глава 2
Вопрос на повышенную оценку: напишите, какой запрос не работает...
« « < ^ о ст р с ф 1
WHERE main = содовая;
да л ьш е ► 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', 'Не женат',
'бунтарство', 'единомышленники, гитаристы');
Г^\
Р а згл а ш ен и е: '> •: X *
WTVPM
Как вы думаете, что происходит?
99
Хм, а почему перед приглашением постоянно вы
водится апостроф? Наверняка какие-то проблемы
с anocTpoqpoMH в команде INSERT...
Непарный апостроф
Точно! Когда Грег попытался вставить запись, РСУБД ожидала уви
четное число апострофов —по одному до и после каждого значени
VARCHAR, CHAR и DATE. Название города Гровер' Милл породило п;
вицу, потому что в нем содержится лишний апостроф. РСУБД хож
получить еще один закрывающий апостроф.
’>
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 ниляется его част ью и его необходимо включить в строку. Для этого можно поставить
А п о ст р оф входит в число
символов SQL
<^0 означает, что в языке он
да л ьш е > 101
Команда INSERT с Внутренним апострофом
Вы должны сообщить РСУБД, что апостроф не обозначает начало
или конец строки, а является част ью текстг..
W lA iT V P M
с какими ещ е символами могут возникнуть анало
гичные проблемы?
102 гп а вя 2
------------------------------------------------------------------------------------------------------------------
Если таблица содержит данные с апострофами, вероятно, в какой-то момент вам noi|)*i
- у у .- буется искать их с условием w h e r e . Чтобы включить в выборку данные с апострофами,
J\\уатп<.пп< экранируйте их, как это делалось при вставке.
ч.ш е * 103
Если таблица содержит данные с апострофами, вероятно, в какой-то момент вам потре-
_ буется искать их с условием w h e r e . Чтобы включить в выборку данные с апострофами,
экранируйте их, как это делалось при вставке.
I '1 - Перепишите следующую команду с использованием двух разных способов экранирова
ния внутреннего апострофа.
II
location = Т р о в ер Милл, N J ‘;
104 snaGci 2
Выборка ограниченного набора столбцов
Итак, вы знаете, как написать команду SELECT для выборки любых
типов данных — в том числе и содержащих апострофы.
l1o n p o 6 v u m 'e T ca M u
w uo Livre Прежде чем вводить следующий запрос SELECT, прикиньте, как будет выглядеть таблица
ТУпражненке
П раЖ Н С Н И б результатов.
(Структура таблицы easy drinks показана на с. 93)
105
выборка с 1г,слбц'
П е п р о 6 VU і п е ї с а м й
Прежде чем вводить следующий запрос selec t, прикиньте, как будет выглядеть
таблица результатов.
d r in k n a m * m c iiii •e c e n d
Голубая луна содовая черничный сок
О динокое дерево содовая вишневый сок
Борзая содовая грейпфрутовый сок
Сода плюс содовая виноградный сок
106
ко м а н д а Vti
...M w м о ж е м c y s u m b
SELECT drink_name, main, second р е з у л ь т а т ы выборки,
FROM easy_drinks; включая в них т о л ь
ко и и т е р е с у ю и і и е нас
ст олбцы.
107
возьми в руку карандаш
^ о з ь м и в руку карандаш - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Допишите четыре команды 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
d.3/ib!ue » 109
возьми в руку карандаш, р е ш е н и е
WHERE a m ountZ = 7;
Эта ф орма в с т р е ч а е т
d rink_nam e FROM easy_drinks ся редко. И сп ол ьзу йт е ее,
SELECT
если вы п олн ост ью уве~
WHERE d n n k _ n a m e = 'Поцелуй'; ^ т о м . что столбец
.................................................................................................. ^'^"^к_пате .записан без
ошибок.
110 алавэ2
команда S E l E C T
КЛЮЧЕВЫЕ
МОМЕНТЫ
Част°
^аД аВаеМ ы е
Бо1]р>Сь1
другой смысл для 501. Вставка в текстовый редактор — один из
А если запрос должен вернуть все столбцы таблицы? способов выявления и удаления символов-«невидимок». Так что
Перечислять их в SELECT или использовать * ? в подобных ситуациях лучше всего вставить запрос в текстовый
редастор и повнимательнее присмотреться к нему
111
МММ, пончики...
Пончики U таблицы...
Чтобы найти в таблице лучшие пончики с глазурью, нам понадо
бятся минимум две команды SELECT. Первая выбирает записи
с пончиками нужного типа, а вторая —записи с оценкой 10.
Хочу
лучшие пончики с глазурью,
и побыстрее — не хочу копаться doughnut_ratings
в сотнях записей.
lin e date »№ • rating с е т т е п 1*
Starbuzz Coffee 7:43 2 3 /4 с корицей 6 слишком много
пряностей
V.
содерж ит ООО з а п и с е й .
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 пончики
А можно выполнить поиск по оценке:
location »yp*
Второй запрос снова
Starbuzz Coffee шоколадный кекс
возвраш,ает сотни
Krispy King с глазурью записей.
Starbuzz Coffee с глазурью
Ш ТУРМ
да л ьш е ► 113
объединениеуся
Объединение условий
Два условия поиска —тип «с глазурью» и оценка 10 —
можно объединить в один запрос при помощи ключево
го слова A N D . Результаты такого запроса будут удовлет
ворять обоим условиям.
Теперь достаточно 8bidpamt>
только столбеа, locatioyi-
SELECT location
FROM doughnut_ratings
WHERE type = 'c глазурью’
T
AND слово AND
ycAoßi"ия WHERE. объединяет
rating = 10;
Starbuzz Coffee
5
7
и оценкой го
и находит записи,
удовлетворяющие обоим условиям.
Krispy King 8
Starbuzz Coffee 10
location
AND
Starb u zz C o ffe e
location type
Starbuzz Coffee шоколадный
Starbuzz Coffee
114 элявa 2
команда Зсг
да л ьш е ^ 115
упражнение, р е ш е н и е
Нам нуж ен
С1АЛ0Л^еЦ еилД!
SELECT email
\^HERE profession - 'cqmpu^^
Условие выбора — з н а
чение столбца profession
равно 'программист '.
Напишите запрос для получения имени и места жительства всех людей, ^
у которых дата рождения совпадает с вашей.
Напишите запрос, при помощи которого Грег мог бы найти всех Энн из Сан-Франциско.
116 глава 2
команда SELECT
I d r i n k name
I Го л убая л у н а i
I Одинокое дер ево I
I Б о рзая I
+--------------------------------- +
3 rows i n set ( 0 . 0 0 sec)
d r i n k name
Сода плюс
дал ьш е I* 117
операторы срае
'у ^
А как было бы здорово, если
бы в одном запросе можно было най
ти все напитки из таблицы еазу_с1ппкз,
содержащие более 1 унции содовой...
Но я знаю, что это всего лишь мечты...
e a s y _ d rin k s
Бабье лето яблочный сок 2 горячий чай 6 налить сок в кружку, добавить горячий чай
Лягушка холодный чай 1.5 лимонад 5 подавать на льду с ломтиком лайма
118 :::; і в а 2
команда St.
Одного достаточно
Однако использовать два запроса вместо одного неэффективно;
к тому же вы рискуете упустить напитки, в которые входит 1.75 или
3 унции содовой. Лучше воспользоваться оператором сравнения
«больше»:
d rin k _ n a m e
Го л уб ая луна
Одинокое дерево
Б орзая
Сода плюс
ШТУРМ
A почему первые два запроса нельзя объединить дополнитель
ным оператором AND?
д .т ь ш е '>■ 119
подробнее об о п е р а т о р а х сравнении
Операторы сравнения
Ранее в наших условиях WHERE использовался только
оператор =. Вы только что увидели пример исполь
зования оператора >, сравнивающего одно значение
с другим. Ниже приведена полная сводка операторов
сравнения.
Оператор = проверяет только точные совпаде Этот странный знак означает «не равно». Его
ния. Он не поможет, если вы хотите проверить, результат прямо противоположен результату
что некоторое значение меньше или больше знака =. Два значения либо равны, либо не
другого. равны —третьего не дано.
\
всем известный знак
равенства. m Z ““ " РАВНО». Условие
все записи, у которых
два значения не совпадают.
ШТУРМ
А вы заметили, что в каждом рассмотренном нами условии w h e re
имя столбца располагалось слева? Будет ли условие работать,
если имя столбца будет указано справа?
120 глава 2
команда S E L E C T
О п ер а т о р « м е н ь ш е »
возвращает все значения
м ен ьш и е заданного.
И конечно, с у щ е с т в у
е т парный операт ор
«б ольш е».
К-оличестбо углйбоЭоб
грам м лУ -)- 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
122 ;л а в а 2
команда ЛГ^гГСТ
- ^ о з ь м и в руку карандаш
А теперь ваша очередь. Напишите запросы, которые возвращают ука
занную информацию. Также запишите результат каждого запроса.
Результат:
Результат: .................................................................
Результат:
Результат:
- ^ В о зь м и в руку карандаш
Решение А теперь ваша очередь. Напишите запросы, которые возвращают ука
занную информацию. Также запишите результат каждого запроса.
Результат: $4 0 0
Результат:...........
124 глава 2
команда SELECT
drink info
SELECT drink_name
FROM drink_info
WHERE
drink_name >= 'Г ' Запрос возвращает напитки,
AND начинающиеся с буквы Г и сл ед у
ющ их букв, но при э т о м nepM^fi
drink name < 'Д '; буква п р ед ш ест в у ет Д .
125
это или то
Выбор ингредиентов
Бармена попросили сделать коктейль с вишневым соком. Для по
иска рецептов можно воспользоваться двумя запросами.
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
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)
127
еще один ответ
- ^ о з ь м и в руку карандаш
ешение Вычеркните лишние части двух команд SELECT и добавьте
связку OR, чтобы превратить их в одну команду SELECT.
m a in = 'я б л о ч н ы й с о к ' ;
Эту ст року м о ж н о прос
^0 связкой OR запрос веюнрт в^,Лркнуть, все необходи
напитков, глав- м ое е с т ь в первой т с т и
^1У^гредиентом которь,х запроса (присоединениои
ключевым словом ОК)-
128 гл ава 2
команда SbLECT
Оператор OR действительно
полезен, но я не понимаю, поче
му мы не воспользовались AND?
АШ) OR
_ Часто
_____ задаваем ы е ______
B o I lp jC b i
да л ьш е ► 129
AND I’m: OR?
d o u g h n u t_ r a tin g s
130 илава 2
команда SELECT
аАШ ) усл о в и ем
дальш е ► 131
условия, от вет
Ди ) у сЛ оБ и еМ . QmBem
Уиже лр*иРеДена cej»uff усЛоБий ^
связками U QJ^. ЦостаВьтпе се^я
на М е ст о э т и х усЛоВий и ол^>еДеЛите,
о тЛ и Ч акгтся ощ о ст а л ь н ы х .
132 глава 2
команда SELECT
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
чааро
ЧадаБаеМые ---------------------------------------------------
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
однообразные з а п р о с ы
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
ШТУРМ
Какие еще специальные символы
встречались вам в этой главе?
да л ьш е * 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 о ^ к о л и ч г -
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 им
136 глава 2
команда S E L E C T
аГншпь! с КоДаМи
Условия WHERE с ключевым словом L IK E и их результаты
1 полностью перепутались. Сможете ли вы восстановить соответ
ствие? Некоторые условия могут возвращать несколько резуль
татов. Напишите собственные условия L IK E со специальными
символами для лишних результатов.
WHERE
l ik e '% е н ^
дал ьш е * 137
решение с магнитами
аГнхипь! с КоДаМи
Условия WHERE С ключевым словом L IK E и их результаты
полностью перепутались. Сможете ли вы восстановить соответ
ствие? Некоторые условия могут возвращать несколько резуль
татов. Напишите собственные условия L IK E со специальными
символами для лишних результатов.
flHEBE s t a t e l ik e 'Нью-%'
ЭЛСИ
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 Л *о"^*
138 гл ава 2
команда S E t £ C )
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
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Œ
дг1пк_пате
Терновник
Вот тебе на
Борзая
Бабье лето
Сода плюс
140 глава 2
команда SELECT
- ^ В о з ь м и В руку карандаш
'0Ш6НИ6 Измените запрос на предыдущей странице так, чтобы он воз
вращал названия всех напитков, содержащих более 60 или
менее 30 калорий.
WHERE
142 глава 2
команда SELECT
Условие IN
Аманда, подруга Грега, использует список контактов Грега для
поиска парней. Она уже побывала на нескольких свиданиях, за b la c k b o o k
вела собственную таблицу со своими впечатлениями.
с1а 1 е_11а т е га11п9
Аманда назвала свою таблицу Ы а с к _ Ь о о к . Она хочет получить Алекс оригинально
список удачных свиданий, поэтому отбирает значения к положи
Джеймс скучно
тельным оценкам.
Иэн потрясающе
OR Сэмми неплохо
условие
Айвен ужасно
каждой п о л о ж и -
' . ^ : ^ ^ ь н о й оценки. Вик смехотворно
OR
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
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
6 rows in s e t ( 2 . 4 3 sec)
144 глава 2
команда SELECT
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 ;
^аД аБаеМ ы е
Б о ц р )С ь 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;
дапьш е ► 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
SELECT d r in k _ n a m e FROM d r i n k _ i n f o
SELECT d r in k _ n a m e FROM d r i n k _ i n f o
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
SELECT d r in k _ n a m e FROM d r i n k _ i n f o
SELECT d r in k _ n a m e FROM d r i n k _ i n f o
148 глава 2
команда SELECT
SELECT d r in k _ n a m e FROM e a s y _ d r in k s
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 r in k _ n a m e FROM d r i n k _ i n f o
SELECT d a te _ n a m e fr o m b la c k _ b o o k
дал ьш е ► 149
крат кий о а зо р s q l
Новые инструменты
Мы подошли к концу главы 2, а ваш инструментарий
пополнился несколькими новыми операторами
GNJ и ключевыми словами. Полный список инструментов
приведен в приложении III.
* еЯ ЭАЯ
= < > < > < = > =
1 ^Й) VI о *-
^ЕТШ е ц
yvO
-в » » " "
,бо1рл-
0 '^ '
hO-
,^ £ г > I
L ik e
с % лип
. р
Новые инст рум ент ы :
операторы'
150 глава 2
команда SELECT
Бар Head First Lounge включает в свое меню фруктовые коктейли. Используя то, что вы
а Ж Н еН И б Узиэли в главе 1, создайте таблицу и вставьте в нее приведенные ниже данные.
Со с. 93 Таблица входит в базу данных с именем drinks. База данных содержит таблицу
рСШ 2 НИ2 easy drinks С рецептами напитков, состоящих всего из двух ингредиентов.
Напитки разделяю т ся
запятыми.
дальш е ► 151
Никак не можете прийти к окончательному решению?
И ладно! Команды, с которыми вы познакомитесь в этой главе —
DELETE и UPDATE, — ИЗбаВЯТ ВаС ОТ ВОЗНИ с данными, которые вы
ввели полгода назад. Команда u pdate изменяет данные, а команда
DELETE удаляет данные из таблицы, которые вам больше не нуж
ны. Но мы не только рассмотрим новые инструменты; в этой главе
вы узнаете, как избирательно применять новые возможности и как
предотвратить случайное удаление полезных данных.
информация о клоунах
©1пасу“5
ЕАИ.'5
МК '^Ве1топ1^
Чспюг С :стсг
154 глава 3
d e le te и up d a te
информация о клоунах
Вот как выглядит наша таблица. Информацию, которой мы пока не располага
ем, можно пропустить — она будет введена позднее. Каждый раз, когда в городе
появляется новый клоун, в таблицу добавляется новая запись. Чтобы содержи
мое таблицы оставалось aк■гy^uIьным, его придется часто изменять.
Пиклз Вечеринка Джека Грина М, оранжевые волосы, синий костюм, огромные ботинки мим
Кларабелл Дом престарелых Бельмонт Ж, розовые волосы, большой цветок, синее платье кричалки, танцы
Скутер Больница Окленд М, синие волосы, красный коаюм, большой нос шарики
OAKLAND
HOSPITAL
MILLSTONE
M ALL
Dickson
1 % Park
1
5
Otracy- s
Eywt's
Mim f Belmon t'^
Senior Center
m tr
да л ьш е ► 155
возьми в руку карандаш
^ОНЗО видели
о <^лрке /\UKC0H.
СнмфАЗ рлз-ьезжа-
еил на маминке.
Мистера Хобо
видели на вече
ринке Эрика Грея
156 глава 3
d e le te и up d a te
да л ьш е > 157
eo3b«fu в думу нарамдаш. решение
VALUES
('Зиппо', ‘Торговый центр Милстоун'j 'Ж.
оранжевый кост ю м , штаны', 'танцы, пение');
1 58 г ла ва 3
d e le te и upd a te
у V ШТУРМ
Как узнать текущее местонахождение конкретного клоуна?
д а л ьш е > 159
можно ли получать данные в хронологическом порядке?
пат* арреагаяс«
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы,пение
Зиппо Больница Окленд Ж, оранжевый коаю м , штаны танцы,пение
Зиппо Заведение Трэйси ^ Ж, оранжевый костюм, штаны танцы,пение
Зиппо Болмарт \ Ж, оранжевый костюм, штаны танцы, жонглирование
Зиппо Торговый центр Милстоун \ж , оранжевый костюм, штаны танцы,пение
Зиппо Больница Окленд \Ж, оранжевый костюм, штаны танцы,пение
160 гпава3
d e le te и u p d a te
-Г
Конечно,это
очень просто. Достаточно
обратиться к последней записи.
д а л ьш е ► 161
о структуре таблицы
Часто
ДаДаБаеМые
БоЦ р>С ь 1
Почему нельзя считать, что последняя запись была А стоит ли хранить такие данные в таблице? Есть ли
добавлена позже остальных записей? смысл во вставке новых записей с сохранением старых?
162 глава 3
d e le te и u p d a te
шаГнишы с Кодами
Мы написали простую команду для уничтожения одной из
записей о клоуне Зиппо, но магниты с фрагментами команды
полностью перепутались. Соберите фрагменты и укажите, что,
по вашему мнению, делает каждая часть новой команды.
WHERE Jll
паше
С
А по ст р оф ы , запятые пение
знаки равенства и с и м - FROM
олы слишком Малы^
чтоды подбирать их.
Зиппо
Р асставьт е их по своеми
усм от рению .
[
дальш е ► 163
магнит ы с командой DELETE от вет
а Г н и щ ь 1 с К оД аМ и
Мы написали простую команду для уничтожения одной из записей
о клоуне Зиппо, но магниты с фрагментами команды полностью пе
репутались. Соберите фрагменты и укажите, что, по вашему мнению,
делает каждая часть новой команды.
d elete
<?- Таблица, из которой
удаляется запись.
FROM
Аобавьте операт ор
^ р ав ио ». апостро(^ы по
Jbe стороны о т магнит а
« т а н ц ы » и символ
и
WHEBE
ю
И не забудьте доба^^ главу) о пределяет , какая именно
имени.
вить условие W H E R E , запись удаляется командой DELETE
а то команда удалит
все з а п и си ’.
164 глава 3
d e le te и up date
да л ьш е > 165
правила DELETE
Правила DELETE
_ Чаагю
--------- ДаДаБаеМые ---------------------
БоТ)р>Сь 1
166 глава 3
d e le te u upd a te
у д а л я т ли э т и КоМанды к а к и е -л и б о
Записи из таб Л и Ц ы .
У р>оБедшпе Лини1о о т к а ж
DELETE FROM d o u g h n u t _ r a t i n g s
до го усЛоВия к удаляемой
doughnut_ratings
д а л ьш е > 167
стань DELETE, ответ
хпань ШШ сусЛоБиеМ
у р*еДС111аБьте себя на М е сте Грч^апы Команд
из т а б л и Д ь !.
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 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 мало варенья
168 глава 3
d e le te и up date
Тайцы INSERT-DELETE
В таблице содержится всего одна запись с данными
клоуна Кларабелл. Так как мы хотим, чтобы в таблице
оставалась всего одна запись с самой новой информа
О т другой записи эт а о т л и
цией, нужно создать новую запись и удалить старую.
чается только занятием.
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 = ' К л а р а б е л л ' ;
да л ьш е ► 169
возьми в руку карандаш
- ^ В о з ь м и В руку карандаш
Используйте команды INSERT и DELETE и внесите в таблицу
d r in k i n f о необходимые изменения. Затем запишите
измененные данные в пустой таблице справа.
d r in k in f o
170 гл ава 3
de le te и up d a te
drinkjnfo
<ігіпк_пате cost carbs color ісе calories
Терновник
Голубая луна
Вот тебе на
Лаймовый физз
Поцелуй
Горячее золото
Одинокое дерево
дорзая
Ьабье лето
Лягушка
Сода плюс
-v.
дальш е ► 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
INSERT INTO d r in k jn fo
VALUES ('Терновник', 3, 8 .4 , 'золот истый', Д ' , 3 3 ) ,
('дорзая', 4 , 1 4 , 'зо лот ист ы й ', 'Д',, SO):
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
^ ш а н ь ш е К о м а н д о й } jj Y
ЦиЖе т^Беден ы усЛоБия Щ. ддя cefuu к°Манд ])n , U l ;
К°тп°р*ые Должны удалишь Лишние записи из щавлиЦы
clown_mC> takle на предыдущей <3nj>aHuUe. Опре
делите, какие условия действительно цоЛеЗНы,
а какие ЛиШь соада1<>т ноВые т^*°влеМы.
не З а т р а г и в а я д руги х записей.
да л ьш е ► 175
ст аньт е командой DELETE, от вет
WHERE name = 'Мистер Хобо' Удаляет все записи М ист ера Хобо,
OR last seen = 'Больница Окленд'; числе и ,нову ю, Я также запись
Скутера.
176 г л ава 3
d e le te и up d a te
SELECT FROM c lo v m _ in f o
WHERE
a c t iv it ie s = ' танцы ';
/ті
178 j
de le te a up date
И сп ользу йт е условие
D ELETE FROM c lo w n _ in f o HERE из команды
WHERE ^ ■ (илаг 1 ) для
поиска и удаления
a c t i v i t i e s = 'т а н ц ы ;
ст арой записи.
Ш
Ш
пат* ia s l_ s *c n а р р *а га п с * a c tlv ili* « X
X
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы,пение го
Q.
д а л ьш е * 179
UPDATE в д е й с т в и и
Но вместо того чтобы вставлять в таблицу новую запись и удалять старую, можно об
новить существующую запись, изменив в ней значения только тех столбцов, которые
требуется изменить.
Для этой цели используется команда SQ L UPDATE. Она обновляет столбец (или столб
цы) новыми значениями. Как и в случае с командами SELECT и DELETE, для выбора
обновляемой записи (или записей) можно задать условие WHERE.
Ключевое слово 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 первый_столбец= 'новое_значение ',
второй_столбец = 'старое_значение';
Чаошо
аДаБаеМые
BoTjJbC bi
Что произойдет, если условие WHERE не задано? Да, можете. Команда внесет те же изменения в ту же запись.
Для таблицы из четырех записей это нормально, но при работе
Каждый столбец, указанный в условии SET, будет обновлен с таблицей, содержащей сотни и тысячи записей, вам пришлось
новым значением. бы изменять по отдельности каждую запись, относящуюся
к Krispy King.
Абсолютно. Оператор = в условии SET означает «присвоить Как и в случае с командой DELETE, если вы не уверены
столбцу указанное значение», а оператор = в условии WHERE в том, что условие WHERE определяет только нужные записи —
проверяет, равно ли текущее значение столбца значению, ука сначала выполните команду SELECT!
занному после знака.
д а л ьш е > 181
без INSERhVELETE
^ 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 = 'Вечеринка Э р и к а Г р е я ' ;
дальше >
во зьм и в р у ку карандаш
184 глгв а 3
delete и update
дальше * 185
в о з ь м и в р у к у к а р а н д а ш , решение
- ^ В о зь м и в руку карандаш
V "ешение
Обновление информации о клоунах
На этот раз давайте выполним обновление правильным способом.
Напишите команду UPDATE для каждого наблюдения (мы уже написали
одну, чтобы вам было проще). Потом запишите, как будет выглядеть табли
ца после выполнения всех команд UPDATE.
..... .....................................................U,
W HERE name = 'Зиппо': „ „ „ о ара^а»
............................................................мач«к> М3 cmoAi«-»
..................................................... не
СЯ п р и озноблении.
Снаглз носит
синие штаны. SET appearance = ‘Ж. желтая рубашка,
синие штаны'
WHERE пате = 'Snuggles';
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 М, сигара, черные волосы, маленькая шляпа скрипка
Кларабелл Дом престарелых Бель Ж, розовые волосы, большой цветок, кричалки, танцы
монт синее платье
Скутер Больница Окленд М, синие волосы, красный костюм, шарики
большой нос
Зиппо Торговый центр Милстоун Ж, оранжевый костюм, штаны танцы
Бэйб Автошкола Эрла Ж, розовый костюм с блестками эквилибристика,
машинки
Бонзо М , женское платье в горошек пение, танцы
Снифлз Заведение Трэйси М, зелено-фиолетовый костюм, длинный нос
Обновление цен
Помните, как мы обновляли цены в таблице 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
188 глава 3
delete и update
дальше ► 189
обновление нескольких записей
UPDATE drink_info
У в е л и ч и т ь н а 1 цену в кдж
SET cost = cost + 1 ; дой из т р е х з а п и с е й , к о т о
рые т ребует ся изм енит ь
WHERE ( н а п и т к и з а $Z■SO и $ 3 . 50 )-
drink_name='Голубая луна'
OR
drink_name='Вот тебе на'
OR
drink name= 'Лаймовый физз'
Часгп'
'^ а Д а Б а е М ы е
БоТ1р>Сь1
190 алава 3
delete и update
191
крат кий обзо р sq l
Нобые нструменты
Глава 3 скоро останется в прошлом.
Ниже приведена краткая сводка новых
команд SQL, которые вы узнали в этой
главе. Полный список инструментов
приведен в приложении III.
DELETE
SET
I значения Си,
192 :::пава 3
]=*ое]сшир»оБание ща^ЛиЦ
Дбе таблицы
Джек и Марк создали таблицы для хранения информации о рекордах
рыбной ловли. В таблице Марка имеются столбцы для бытового и на
учного названия рыбы, ее веса и места, где она была поймана. Столб
ца для имени человека, поймавшего рыбу, в этой таблице нет. со ст о -
« чет ы рех
^/^олдцов. Сра-
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
дальше ► 195
в о з ь м и в р у к у к а р а н д а ш , реш ение
196 глава 4
проект ирование таблиц
Часш°
- ЧадаБаеМые --------------
БопТЪ Сь!
Выходит, таблица Джека лучше, Почему короткие запросы лучше Допустим, в записи хранится по
чем таблица Марка? длинных? чтовый адрес. Почему бы не создать
один столбец для хранения полного
Нет. Это разные таблицы с разными • Чем проще запрос, тем лучше. адреса и несколько других столбцов
целями. Марку редко приходится про С увеличением объема базы данных для хранения его составных частей?
водить поиск по штату, потому что его и добавлением новых таблиц запросы
интересуют только названия (бытовое
и научное) выловленных рыб и их вес.
усложняются. Начинайте с самых про
стых запросов, позднее вы их оцените.
0: Дублирование данных поначалу
может показаться вполне разумной
мерой, но подумайте, сколько лишнего
С другой стороны, Джеку потребу
пространства будет расходоваться
ется искать данные по штату в своих
Значит, в моих столбцах всегда на жестком диске, если база данных
запросах. Именно поэтому он создал
должны храниться как можно мень вырастет до значительных размеров.
в своей таблице отдельный столбец,
шие фрагменты данных? А еще при дублировании данных
чтобы было удобнее указывать штат
в команду UPDATE должно включаться
в запросах.
0: Не обязательно. Как показывает
пример с таблицами Марка и Джека,
дополнительное лишнее условие, и вы
должны помнить о нем при каждом из
все зависит от использования цанных. менении данных.
Следует пи избегать оператора
LIK E в запросах? Что в нем плохо Для примера представьте таблицы со Давайте более подробно разберемся
го? списком машин, предназначенные для в том, как спроектировать оптимальную
автомеханика и продавца. Механику структуру таблицы для ваших целей,.
необходима подробная информация
В операторе LIKE нет ничего
о каждой машине, а продавцу может
плохого, но он усложняет структуру
быть достаточно фирмы-производителя,
запроса и повышает риск получения
посторонних результатов. Если столбцы
модели и номера. Структура таблицы за
содержат сложную информацию, LIKE
не позволяет легко и однозначно опре висит от того, как вы
делить критерий поиска.
собираетесь использо
вать свои данные.
МОЗГОВОЙ
ШТУРМ
3 0 1 — язык, используемый реляцион
ными базами данных. Как вы думаете,
что означает термин «реляционный»
в контексте баз данных 5 0 1 ?
да л ьш е ► 197
рекомендации по проект ированию структуры таблиц
t :r
Какой основной объект
1. Выберите ОДИН объект, который описывает баша таблица^
должна описывать таблица.
198 глава 4
проект ирование таблиц
да л ьш е ^ 199
упражнение, реш ение
бы товое
иам ание
/
г
я провожу поиск по бытовому или \
научному названию рыбы и хочу У
узнать вес и место вылова. ^
±_ Ф ..----------
вес
м есто вы яова
200 глава 4
проект ирование таблиц
ШТУРМ
Как вы думаете, что означает
термин атомарный в контексте
данных 8 0 1 ?
Атомарные данные
Что такое «атом»? Маленький блок информации, который невозможно (или нежелательно)
разделить на составные части меньшего размера. Это определение относится и к данным:
АТОМАРНЫЕ данные были разделены на наименьшие компоненты, дальнейшее деление
которых невозможно или нежелательно.
o rd e r number 1 address
address
1 row in s e t ( 0 . 0 4 sec)
202 глава 4
проект ирование таблиц
С другой стороны
А теперь возьмем агента по торговле не
движимостью. Вполне возможно, что ему
понадобится отдельный столбец с номером
дома —допустим, чтобы он мог получить
список всех предложений по заданной ули
це. Для него название улицы и номер дома
являются атомарными данными.
-+
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
проект ирование атомарных данных
2. Как вы предполагаете
ИСПОЛЬЗОВЭТЬ таблицу
для получения информации С п ро ек т и ру й т е таблицу
о ее объекте? т ак, чтобы запросы были
прост ыми!
столбцы таблицы
3. Содержат ли
атомарные данные,
чтобы запросы были короткими
и конкретными?
Часто
ЧадаБаеМые -
БоТ1р)Сь1
Не дробите данные сверх необходимости. Если лишние столбцы Кроме того, атомарность повышает эффективность запросов:
вам не нужны, не добавляйте их. запросы к атомарным данным быстрее пишутся и выполняют
ся, что дает ощутимый эффект при хранении очень больших
объемов данных.
204 гпааа 4
проект ирование таблиц
^оис^ превраи^ался
fooO am e ingredients ^‘^ояи^ий коилмар!
Миссис Мартини
Д)ко ' Рон Келли
___ -—---- --------------- \------------—_____
206 глава 4
проект ирование т абл иц
Теперь, когда вы знаете «официальные» правила атомарности и три этапа создания атомар-
Т ш р^а ж н (
4 таблиц, взгляните на каждую таблицу, приведенную ранее в книге, и объясните, почему
она является (или не является) атомарной.
Таблица Грега, с. 83
да л ьш е > 207
н орм ализация таблиц
О пользе нормализации
Ваша фирма по проектированию данных заработала,
вы наняли новых проектировщиков баз данных SQL. Атомарность данных — пер
И конечно, вам не хотелось бы целыми часами объ
яснять им, как работают ваши таблицы. вый шаг на нуги создания
Если ваши таблицы будут НОРМАЛИЗОВАНЫ, то
они будут соответствовать стандартным правилам,
НОРМАЛИЗОВАННОЙ
понятным для новых проектировщиков. К счастью,
наши таблицы с атомарными данными уже наполови
таблицы.
ну нормализованы!
Теперь, когда вы знаете «официальные» правила атомарности и три этапа создания атомар-
таблиц, взгляните на каждую таблицу, приведенную ранее в книге, и объясните, почему
она является (или не является) атомарной.
208 глава 4
проект ирование таблиц
Ненормализованные клоуны
Помните таблицу с информацией о клоунах? Сбор информа
ции о клоунах неожиданно превратился в национальное увле
чение, и старая таблица уже не справляется с потоком инфор Запросы с поиском к этим
мации, потому что столбцы 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НФ
Даже когда таблица содержит атомарные данные, пройдена только половина пути.
Полоностью нормализованная таблица находится в ПЕРВОЙ НОРМАЛИЗОВАН
НОЙ ФОРМЕ, или сокращенно ШФ.
Таблица, находящаяся в форме Ш Ф, должна выполнять следующие два правила.
Чтобы таблица
Каждая запись должна обладать
была полност ью
нормализована,
каждой записи уникальным идентификатором,
необходимо при -
сбоить п ер ви ч
ный ключ. который называется первичным
ключом.
ШТУРМ
Как вы думаете, какие столбцы
хорошо подойдут на роль первич
ного ключа?
дальше ►
правила первичных ключей
т
Каждому человеку назна
V
8 эт и.
7 ^
с т о л и ц » ; б.соко и
чается уникальный номер
социального страхования;
э т о т ст олбец м о ж е т
с т а т ь первичным ключом.
Г е “ 'е Г ф » и 1 , 8 е р о я « и „ , Н. Л .и с ... каиЭ и-
даты на роль первичного ключа.
212 глава 4
проект ирование таблиц
ШТУРМ
Сможете ли вы предложить хороший первичный ключ с учетом всех
этих правил?
дальше ► 213
ещ е чут ь-чуть о первичных ключах
214 глава 4
проект ирование т абл иц
част°
Задаваем ы е
БоТ1|ЪСь1
UJTVPM
дальше ► 215
и с п р а в л е н и е т аблицы грега
216 глава 4
проект ирование таблиц
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 ? Результат
ее выполнения будет выглядеть примерно так:
218 глава 4
проект ирование таблиц
Эт и ^ обратные а у с т р о фы
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, чение).
T
He обращайте внимания на т е к ст
после закрываюш,ей круглой скобки.
Он описывает м ехан и зм хранения
данных и и сп ользу ем у ю кодировку
символов. Пока нас у ст р о ят значения
по умолчанию
Если скопировать и выпол
нить этот код, он создаст
Если исходная таб.лиця не была
удалена: то этой т'.адлшА^е п р и
дется присвоит ь новое имя.
^ таблицу.
220 глава 4
проект ирование таблиц
Часто
даДаБаеМые -
Бо1^ЪСь1
дальш е ► 221
ключевое слово AUTO INCREM ENT
222 гл ава 4
проект ирование таблиц
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 , 'П и т е р ', 'Б р э д и ') ;
your_tabie
id First_name last_name
д а л ьш е > 223
у п р а ж н е н и е , решение
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 ( ' С инди', ' Б рэди') ;
Последняя команда
« p a 5omae.w\»j [ все ли команды были выполнены успешно? Напишите, как будет выглядеть
ко з а м е и я е !^ содержимое таблицы после выполнения команд in s e r t .
Ljourjtahie
id first_name last_name
г Марсия Брэди Похоже, м ы пот еряли
запись Д ж е н , когда
Z добби 5рэди попы т ались н азна
3 Синди Ърэди чит ь ей индекс, уже
назначенный Марсии!
Питер Врэди
224 гл ава 4
проект ирование таблиц
_ Часто
--------- ЧадаБаеМые --------------------
. Б о ц р )С ь 1
дальш е ► 225
д о б а в л е н и е первичного ключа
ти §
'^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
проект ирование таблиц
Гр й е E d ™ w J n d W Help A it^rätiön
Hй^^0мнuм, что
При следую щ ей вставке новой
c o ^ t a c t M Sydem ^p uceo m o tLl сы ол5^у
это еще. не конец
таблицы; у Грегд
Ц^' Если у последнрй злм, ^ ^ c t j d 0 т а б ли - м ного знакомых.
дальш е * 227
крат кий о б з о р s q t
Нобые инструменты
Вы взяли на вооружение материал главы 4. Только
посмотрите, сколько у вас появилось новых
инструментов! Полный список инструментов приведен
в приложении III.
Атомарные данные
ваю т ся ат омарны м и
^сли они разбиты на '
Силодбец. не м ож е^
‘ АДариие З " ”"' ;<.кол»№Х Одно-
= = • * = -
■г г - : л е м е к ^ 08- I create ta b le
^ м а н д а выводит и г а -
! вилшыа синтаксис
Первичный ключ
^^Жна
СтоАбщ или набор ст олб I рочения, и
цов, значение которого
однозначно идентифици
рует запись в таблице. ‘^ о р о м . *
, ''“» -w c r a w a w
/ ^ ‘^т.ически p
У^^^кальное
значение.
228 ;:/їі;еа 4
проект ирование таблиц
дальше * 229
5т
232 глява 5
ALTER
Вы также можете задать местонахождение нового столбца в таблице при помощи ключевого слова
AFTER. Попробуйте определить, где должно находиться это ключевое слово, чтобы новый столбец
был добавлен после столбца f i r s t name.
- ^ о з ь м и в руку карандаш
Взгляните повнимательнее на команду 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
Вы также можете задать местонахождение нового столбца в таблице при помощи ключевого слова
AFTER. Попробуйте определить, где должно находиться это ключевое слово, чтобы новый столбец
был добавлен после столбца f i r s t _ n a m e .
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. сД еной
аГниш ы с Кодами
Измените позицию добавляемого столбца p h o n e при помощи магни
тов с ключевыми словами. Создайте как можно больше разных команд,
запишите состояние столбцов после их выполнения. Конструкция
BEFORE в MySQL не работает; довольствуйтесь F IR S T и AFTER.
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 )
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 )
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и,ами.
С ключевым словом
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).
Конструкция A F T E R last_name
ALTER TABLE n iy _ co n ta cts р а з м е щ а е т ст олбец phone
ADD COLUMN phone VARCHAR(10) в т р е т ь е й позиции. Если бы
в наборе был м а г н и т THIRD,
то он сделал бы то же самое.
236 глава 5
ALTER
изменение таблиц
Команда ALTER
позволяет изме
нить практически
Dataville Alterations
любые атрибу
О бслуж и ван и е сущ ествую щ их та б л и ц :
ты таблицы без
необходимости
повторной встав
ки данных. Будьте
CHANGE - и зм ен ен и е и м ен и и т и п а д ан н ы х ст о л б ц о в *
осторожны: изме
нение типа данных
MO 0 IDY - и зм ен ен и е т и п а д ан н ы х и л и позииз^и
* В о зм о ж н а п о т е р я д а н н ы х , ааранхшхя
не п р е д о с т а в л я е т с я .
ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ
Projekts
Какие изменения могут потре
боваться в этой таблице? nw m ber
1 покраска дома Мэрфи
2 перестройка кухни Вальдес
3 укладка паркета Келлер
4 кровельные работы Джексон
OculhiUe у 237
к а п и т а л ь н ы й ремонт
Не содерж ит и н
ф ормации о т о м ,
какие данные д о л ж
ны храниться
Н а з в а н и е ст олб' в этой таблице.
С парой символов
ца ничего не /
^подчеркивания имя
г о в о р и т
о его 1
столбца ст а н ет
содержимом- ^
более П 0ЧЯНа.(1Ь/Л'1
Projekts
— > 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
упражнение, реш ение
Что еще следует сделать для улучшения таблицы? Найдите в описании клю
г
Чтобы табл»^а стопа НОРМАЛИЗОВАННОЙ, мы добавим
con^name \ в иее^ е^ \ лчи^ клю^ьс уникальным идентификатором
проекта. Также нам понадобятся столбцы дл<р п и сан и ^
каждого проекта(дат^ачала сюбот<31Бимерной с то и м о с т^
(^ в а н '^ к о м п а н и ^ -подрядчика иС^ м е р а т е л е ф о ^
___________ J
est cost \
startjate \
con^phone I
240 глава 5
ALTER
грандиозные планы
project_list
ШТУРМ
Какой из существующих столбцов станет
хорошим кандидатом на роль первичного
ключа?
а а л ьш е ^ 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
го\j-'deiC-
ваться p ro
projeCt_list j
Первый стол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
Структурные изменения
Мы решили переоборудовать существующие столбцы под
три из шести столбцов, предусмотренных запланированной
структурой таблицы. Кроме переименования, также следует
обратить внимание на тип данных каждого из этих столбцов.
Взгляните еще раз на структуру таблицы.
— > 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') ;
I/O
GX1
244 гл ава 5
ALTER
^^^^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 » , а эт о новый т и п данных.
тоже, будет заме--
немо...
да л ьш е ► 245
ключевое слово MODIFY
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
246
ALTER
Я говорю по телефону со
своим агентом. Добавьте
остальные столбцы само p r o je c t_ lis t
стоятельно, хорошо?
p re iJ d proi_d*8c con_nam»
1
2
3
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
p r o je c t_ lis t
248 глава 5
ALTER
Стоп!
Никаких лишних столбцов!
Только что выяснилось, что наш проект вре
менно приостановлен. В результате столбец
s t a r t _ d a t e можно удалить из таблицы. Нет
смысла хранить в базе данных лишнюю ин
формацию, которая только попусту занимает
место.
В таблицах рекомендуется держать только
те столбцы, с которыми вы действительно
работаете. Если столбец не используется,
удалите его. Если он вдруг снова понадобится
вам в будущем, его можно будет легко добавить
командой ALTER.
Чем больше столбцов в таблице, тем большую
работу придется проделать РСУБД при обра
ботке запросов и тем больше места занимает
база данных. Возможно, при малом объеме
данных это незаметно, но с увеличением
объема таблицы задержка при получении
результатов становится более ощутимой.
да л ьш е > 249
возьми в руку карандаш, р еш ение
- |^ о з ь м и в руку карандаш
Решение Напишите команду 501 для удаления столбца s t a r t _ d a t e .
Мы еще не описывали ее синтаксис, но вы все равно попы
тайтесь.
И мя таблицы
250 глава 5
ALTER
С
Итак, мы возьмем жалкую второсортную таблицу с данными подержанных
автомобилей и командой alter преобразуем ее в новенькую и сверкаю
щую. Задача усложняется тем, что хранящиеся в таблице данные должны
остаться неповрежденными. Готовы к испытанию?
Дополнительные баллы, если вам удастся все сделать в одной команде
ALTER TABLE.
h o o p t ie
c a r ta b le
251
упражнение, р е ш е н ие
hooptie
саг table
252 глава 5
ALTER
да л ьш е >• 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.
------ ^
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 )
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 построены
по одной схеме: название города, запятая и двухбуквенное сокраще
ние штата. Наличие четко определенного формата упростит разбие
ние и переход к атомарным данным.
Запят
м п я т аая,
я , которая всегда ст о и т у о д и т о с я 6 н е м .
Сначала выделяем все данные до запятой Затем берем два последних символа столбца
и переносим их в столбец с названием города. l o c a t i o n и переносим их в столбец s t a t e .
City Name XX
■ (.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
строковые фуушции
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ЫОЕХ () возвращает все символы, стоящие
перед запятой.
258 глава 5
ALTER
П опробуй т еТ сам и
Функция SUBSTRING (текст, начало, длина) возвращает часть строкового значения текст, начиная
с буквы в позиции начало. Параметр длина определяет длину возвращаемой строки.
Функции UPPER (текст) и LOWER (текст) преобразуют все символы строки к верхнему или нижнему
регистру соответственно.
SELECT UPPER('сШа');
SELECT LOWER('спаГЕтти');
SELECT REVERSE('спаГЕтти');
да л ьш е ► 259
кт о и чт о оепает ''
KTQ
Мы хотим извлечь данные из столбца l o c a t i o n и переме
стить ее в два новых столбца, c i t y и s t a t e .
Ниже перечислены операции, которые необходимо для этого
выполнить. Свяжите операции с ключевыми словами SQL,
которые в них используются.
SUBSTRING__INDEX ()
SELECT
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
д а л ьш е ► 261
кт о и чт о аолает -
+ с - Т і
4"
к т о и Н Т -Ч Г А Е А Р ^ Т ?
SUBSTRING__INDEX ( )
SELECT
adjust
R IG H T
3. Извлечь часть данных из текстового столбца.
alter TABLE
4. Переместить данные, полученные на шаге 3,
DELETE
в один из пустых столбцов.
IN S E R T
UPDATE
262 гл ава 5
ALTER
UPDATE my_contacts
SET state = RIGHT(location, 2);
-Г
Г Но как работает эта
команда? В ней нет условия
( WHERE, определяющего о6-
новляемые записи.
да л ьш е * 263
объединение к о м а н д s q l
my c o n t a c t s
lo c a lio ii c ity • ta le
1 Чеаер, NJ Упрощенная версия
2 Кейти,ТХ нашей |лд(Я(5лмць>|-
3 Сан-Матео, СА
Строковые функции
Давайте посмотрим, как работает этот процесс, на приме
ре упрощенной таблицы. Сначала команда берет значение 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 = 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
%
Взглянуть наданные
поддругим углом ^
Перестройка б бидеотеке
В видеотеке городка Дейтавиль дело орга
низовано из рук вон плохо. Фильмы могут -Го; Персоналу видеотеки
оказаться на разных полках в зависимости от
From; _ новые категории!
того, кто из работников занимается их рас Subject: Новым полкам
становкой. Владелец заказал новые полки,
и он думает, что пришло время распределить
фильмы по категориям.
Гв порядок
Г —наши фильмы, мы оум
вать следующие категории.
Боевики и приключения
Драма
V ID 9 Q Комедия
Семейное кино
Ужасы
Фантастика и Фэнтези
Разное
--------------------------------------------------------------------
н е т . Еслм ф м А .м у , к атего р и и « р а зн о е» ,
рии « с е м е й н о е » , а если нет
270 шлеа 6
р а с ш и р е н и е в о зм о ж н о с т и SELECT
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
272 глава 6
р а сш и р е н и е в о :ш о ж н о с т и SELECT
Э т ом у столбцу
у присваивает ся одно
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
Параскеведекатриафобия R Д Д Д H Д H H драма
274 глава 6
р а с ш и р е н и е в о з м о ж н о с т и SELECT
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
Кому
276 глава 6
р а с ш и р е н и е в о зм о ж н о с т и SELECT
- ^ о з ь м и в руку карандаш
Измените выражение CASE так, чтобы мультфильмы (столбец
cartoon) попадали в категорию 'разное', а не 'семейное'. Только
если мультфильму присвоен рейтинг G, он помещается в катего
рию семейного кино.
ШТУРМ
Как использовать рейтинг К , чтобы подоб
ные инциденты не происходили в буду
щем?
д а л ьш е > 277
возьми в руку карандаш, решение
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.
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 'ужасы-г' фантастика-г
Всем спасибо,
Оказывается, с новыми категориями посетителям стало трудно
Директор
найти нужный фильм. Напишите команду, которая удаляет
только что созданные категории с рейтингом 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;
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
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 сп а р т а н ц ев » ).
Ш ТУРМ
^ о з ь м и в руку карандаш
Чтобы определить правильный порядок записей, нам все равно
придется вручную упорядочивать названия фильмов по буквам,
следующими за начальной «А».
Перед вами результаты одного из 200 (или около того) запросов.
Попробуйте расставить названия фильмов по алфавиту вручную.
SELECT title, category FROM movie_table WHERE title LIKE 'A%' AND category = 'семейное'
title category
Авиаторы семейное
Аквалангисты семейное
Абракадабра семейное
Ааргх! семейное
Ангелы семейное
Астронавты семейное
Ааргх! 2 семейное
дальше * 283
возьми в руку карандаш, р е ш е н и е
- ^ о з ь м и в руку карандаш
Решение Чтобы определить правильный порядок записей, нам все равно
придется вручную упорядочивать названия фильмов по буквам,
следующими за начальной «А».
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
286 глава 6
р а с ш и р е н и е в о з м о ж н о с т и SELECT
Правила SQL
Правила SQL ппНИТе запрос ORDER BY
Выполните запрос o r d e r b y и запол/у;,^ ^ асставьте эти символы в по-
те пустые места, руководствуясь поряп ^ ® оезультг
ком символов в результатах выборка,
+ = !
Не-алфавитные символы следуют
да л ьш е > 287
упражнение, р е ш е н ие
Правила SQL
Правила SQL О.^попните запрос ORDER BY
Выполните запрос ORDER BY и запол/,^^ ^ асставьте эти символы в поряд-
ш следования в результатах.
те пустые места, руководствуясь ПОПял.
ком символов в результатах выбор^^,
+ = ! ( &
Не-алфавитные символы следуют
* 0 ?
до и п о с л е цифр.
288 cj'iaea б
расш ирение возможности SELECT
Всем привет,
Ш ТУРМ
да л ьш е ► 289
сортировка по нескольким столбцам
Названия
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
дальше ► 291
обратный п о р я д о к
Часш°
"^аД аБ аеМ ы е
Бо1]р)Сь1
Но мы использовали ключевое слово DESC для полу Я могу использовать в своих запросах полные слова
чения ОПИСАНИЯ таблицы. Вы уверены, что оно может )ESCRIBE и DESCENDING, чтобы избежать путаницы?
использоваться для изменения порядка?
292 глава 6
ра сш и р е н и е в о зм о ж н о с т и S ELE C T
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
фильмов н печенью
Всем привет!
294 глава 6
р а с ш и р е н и е в о зм о ж н о с т и S ELE C T
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
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
пражнение вставьте в нее несколько чисел и проверьте, как работают запросы, приведенные на не
скольких ближайших страницах.
да л ьш е > 297
GROUP BY хорошо работ ает с SUM и AVG
« « « » 6 г р а .«
Г а Г з и « и „ я
298 глава 6
расш ирение возможности SELECT
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
дальш е ► 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 ir s l name sales
Николь 0.00
Похоже, у всех Бритни 2.58
остальных де- Линдси 0.00
бочек был хотя Пэрис 0.00
бы один выходной,
а у Бритни даже
в худший день
был заработок.
Это уже серьезно. Может, дать приз
девочке, которая продавала печенье
больше дней, чем другие?
300 глава 6
р а с ш и р е н и е в о зм о ж н о с т и S ELE C T
да л ьш е > 301
возьми в руку карандаш, ре ш е ни е
Я 8 дней
В о о б щ е -то нет. М ы не м о ж ем б ы ть
у в е р е н ы в то м , ч то м е ж д у п ер в о й
и последней датой не бы ло пропущ енны х
дней.
С ущ е ств уе т го р а зд о бол ее п р о с т о й с п о с о б узн а ть ,
в те че н и е ско л ь ки д ней продавалось печенье.
Задача реш ается п р и п о м о щ и кл ю ч е в о го слова
D ISTIN CT. О н о п о м о ж е т н а м н е т о л ь к о в ы ч и с л и т ь
н у ж н о е з н а ч е н и е COUNT, н о и п о л у ч и т ь с п и с о к д а т,
н е с о д е р ж а щ и й д уб л и ка то в.
302 глава б
р а с ш и р е н и е в о зм о ж н о с т и SELEC T
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 s a le d ate
С м о т р и т е:
ни одного л
дубликата!
7 ro w s in s e t (0 .0 0 sec)
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 ;
yiHwndg
да л ьш е > 303
кто я?
функция или
11мя
ключевое слово
Мой результат не выглядит большим.
304 глава 6
р зс и т р е н и е в о зм о ж н о с т и SELECT
4 a cm °
^адаБаеМ ы е
БоЗТ^ЬСь!
записей, а вы просто хотите просмотреть уникальные
А могли ли мы добавить условие ORDER BY при значения вместо длинного списка дубликатов.
поиске средних/наиболыиих/наименьших значений
с использованием AVG, МАХ и MIN?
ложнять запросы и упростить изучение новых функций. Верно, но Эдвина смогла узнать, кто из девочек тру
Вернитесь к этим функциям и представьте, к каким дился хуже других. На следующий год она постарается
последствиями привело бы применение ORDER BY. обратить на лентяев особое внимание.
Вы видите, как изменятся результаты?
ШТУРМ
Представьте, что в таблице хранятся
данные не четырех, а сорока девочек. Как
использовать зим для определения второго
места?
да л ьш е У 305
ограничение результатов
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 ;
вращ ает всего два числа.
В т а б л и ц е х р а н я т с я д а н н ы е в с е го ч е т ы р е х д е в о ч е к, и о гр а н и ч е н и е и х д о д в ух о с о
б о й п о л ьзы не п р и н е се т. Н о представьте, ч то вы работаете с о гр о м н о й та б л иц е й.
Д о п у с т и м , в та б л и ц е х р а н я тс я о п и с а н и я 1000 са м ы х п о п у л я р н ы х пе се н, а вы х о т и
те о т о б р а т ь и з н и х п е р в ы е 100 в п о р я д к е п о п у л я р н о с т и . У с л о в и е L IM IT п о з в о л и т
п о л у ч и т ь т о л ь к о н у ж н ы е в а м п е с н и , а о с т а л ь н ы е 9 0 0 о с т а н у т с я « за к а д р о м » .
306 ?лава 6
расш ирение возможности SELEC T
Е щ е н е за б ы л и н а ш п р и м е р с о 100 п е с н я м и ? Д о п у с т и м , м ы х о т и м
п о л у ч и т ь п е с н и с 20 п о 30. Э т о м о ж н о сд е л а ть п р и п о м о щ и L IM IT
с д о п о л н и те л ь н ы м парам етром . У п о р я д о ч и те п е сн и п о п о п у л я р н о с ти
и добавьте усл о ви е L IM IT 19, 10. П а р а м е т р 19 у к а з ы в а е т , ч т о в ы в о д
н а ч и н а е т с я с 2 0 п е с н и (р а з в S Q L н у м е р а ц и я н а ч и н а е т с я с 0 ), а п а р а
м е т р 10 — ч т о з а п р о с д о л ж е н в е р н у т ь 10 з а п и с е й .
дальше ► 307
возьми в руку карандаш, р еш е н и е
- ^ о з ь м и в руку карандаш
Решение Напишите запрос, который вернет второй результат — и только
второй результат. В запросе должно использоваться условие
L IM IT с двумя параметрами.
В аш и за п р о с ы с та н о в я тс я д л и н н е е , п о том у
что с а м и д а н н ы е с та л и б о л е е сл о ж н ы м и .
к таблице с то и т пр и см о тр е ться повним ательнее —
в о з м о ж н о , о н а стал а с л и ш ко м с л о ж н о й . П о р а п е р е
х о д и т ь к г л а в е 7 ...
308 глава 6
р а с ш и р е н и е в о з м о ж н о с т и S ELE C T
функция UAU
11мя
ключевое слово
COUNT функция
Я скажу, сколько здесь было значений.
GROUP BY к л ю ч е в о е сл о в о
Используйте меня при вычислении суммы.
д а л ьш е у 309
краткий обзор sql
Новые нструменты
Глава 6 осталась позади. Теперь вы с легкостью
управляетесь с функциями, ключевыми словами
и расширенными запросами SELECT. Полный
t- O
список инструментов приведен в приложении III.
COUNT
GR0T3P о
C yvxO A dt^
DISTINCT
AVg
Возвращает только
уникальные значенияj без
дубликатов. ______ _
^'^олбцс(.. ‘^^^'^ового
SUM
Сум мирует числовые и M IN
значения в столбце.
Г О у с д е л я е м , ск о л ь к о
именно записеЯ должен
Вайли новые и н с т р у запрос, и с и -
мент ы : функции, к л ю кои записи следует на
чинать. У на
чевые слова и расили -
рснные запросы SELECT'
310 глава 6
7 ^[ноГотаблиЧные ба5ь1 Данных
В о т к а к о н а в ы гл я д и т :
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: Незамужняя женщина
т
'Текущие с)елз
312 глава 7
м н о г о т а б л и ч н ы е базы данных
- ^ о з ь м и в руку карандаш
Допишите запрос Грега, чтобы он находил женщин, разде
ляющих все интересы Найджела. Укажите, что делает каждая
строка кода.
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
возьми в руку карандаш, реш ение
Г ® РУ*^ карандаш
\ш ение Допишите запрос Грега, чтобы он находил женщин, разде
ляющих все интересы Найджела. Укажите, что делает каждая
строка кода.
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
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с)егс Ш '
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 инф орм ация.
не оораш ать Внимания.
дал ьш е ► 317
возьми в руку карандаш, решение
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 ) = 'ж и в о т н ы е ';
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
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.
Реш ение
Запишите его запрос.
322 глава 7
м н о г о т а б л и ч н ы е базы данных
Я-Йа-
\Сазалось Styh
т а к о е хорошее
pe-LUeHWe.-- С о>Ззт^ « Т о л ь к о
Но с н и м з а
просы с т а л и
еще сложнее.
...OguH момент!
Ш ТУРМ
да л ьш е ► 323
создание д о п о л н и т е л ь н ы х т а бл иц
Р а м ки о д н о й та б л и ц ы о ка за л и сь с л и ш ко м у зки м и . В д е й с тв и
те л ьно сти нам н уж н ы дополнительны е таблицы , к о т о р ы е
р а б о т а ю т в со ч ет а н и и с т е к у щ е й т а б л и ц е й , п о з в о л я я н а м с в я
зать одного человека с неско льки м и увлечениям и. П р и э т о м
сущ е ств ую щ и е д а н н ы е будут п о л н о с т ь ю с о х р а н е н ы .
> 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
м н о г о т а б л и ч н ы е базы данных
таблица бы ла разбита и м е н н о та к,
а не и н а ч е и ч т о о з н а ч а ю т все э т и
с тр е л ки и кл ю ч и . А после э т о го
вы см о ж е те п о те м ж е п р и н ц и п а м
ÜiTVPM
р а з б и т ь т а б л и ц у Г р е га .
Как вы думаете, что означают линии
со стрелками? А изображения ключей?
да л ьш е ► 325
построение схе м ы б а зы д а н н ы х
326 глава 7
м н о г о т а б л и ч н ы е базы данных
Д о н а с то я щ е го м о м е н та м ы л и б о с х е м а ти ч н о и з о б р а ж а л и та б л и ц ы с и м е
н а м и с то л б ц о в в за го л о в ка х и д а н н ы м и внизу, л и б о в ы в о д и л и и х о п и с а н и е
в о кн е терм инал а ко м а н д о й DESCRIBE. О б а с п о с о б а х о р о ш о п о д х о д я т д л я
о тд е л ь н ы х та б л и ц , н о ко гд а тр е б у е тс я п о с т р о и т ь д и а гр а м м у и з н е с к о л ь к и х
т а б л и ц , п р и х о д и т с я и с к а т ь ч т о -т о д р у го е .
last name
first name
phone
gender 0 с е столбцы
U . слеэо-
birthday бяния 6 таблице,.
profession
city
state
status
Диаграмма помогает отде
interests лить структуру таблицы
seeking от храняпщхся в пей
данных.
да л ьш е * 327
разбиение таблицы
У д а л я е м с то л б е ц 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 т а к , ч т о б ы э т и две т а б л и ц ы
б ы л и связаны м еж ду собой.
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
добавление связей на диаграмме
В о т ее и с х о д н ы й в а р и а н т. А в о т к а к в ы гл я д и т н о в а я схем а.
ту_с»и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, ко то р а я
п о зв о л и т нам испо л ьзо ва ть да нны е и з о б е и х табл иц.
330 глава 7
м н о г о т а б л и ч н ы е базы данных
- ^ В о зь м и в руку карандаш
Какие еще таблицы стоит добавить в базу данных д гед з_1 1зЪ
для хранения информации о нескольких увлечениях?
таблица ігЛ€ге5Іу.
кажЗзя запись
С(Х>е|9жит;
іґ5І_пате
а5І_пате
Таблица ту согЛаЛ ігЛт.'Л
(ЙЄ5 столЛлз ігЛеігс5І0
Гениям б ст ол ^ опре,-
дли обладает.
да л ьш е у 331
возьми в руку карандаш, реш ение
- ^ о з ь м и в руку карандаш
Решение Какие еще таблицы стоит добавить в базу данных g r e g s _ l i s t
для хранения информации о нескольких увлечениях?
Не старайтесь нарисовать аккуратную схему; сейчас время со
бирать идеи. Одна идея уже изображена на рисунке, но у нее
есть недостаток.
T a iA U C ,« с б я з ы в « « ^
Эениям в
э е : ! г " ; к . к „ м . « в л е .е и и я -
MU обладает.
/^'маёлыца
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 в та б л иц е in t e r e s t s . И ч то ещ е л учш е, п о
э то м у сто л б ц у м о ж н о будет о п р е д е л и ть , ка ки е у в л е ч е н и я п р и
над л еж ат то м у и л и и н о м у чел овеку и з та б л и ц ы m y _ c o n ta c ts .
Т а ко й спо со б связы ван ия назы вается в н е ш н и м ключом.
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
знакомство с в н е ш н и м и к л ю ч а м и
З н а ч е н и е N U L L во в н е ш н е м кл ю ч е
о зн ач ает, что в р о д и те л ь с к о й та б л и ц е
не с у щ е с тв у е т с о о тв е тс тв у ю щ е го
з н а ч е н и я п е р в и ч н о го кл ю ч а.
О д н а ко м ы м о ж е м сд елать т а к , ч т о б ы в н е ш н и й
кл ю ч пр и ни м а л то л ь ко осм ы сленны е зн ачени я,
сущ ествую щ ие в р о д и те л ь ско й табл ице. Д л я это
го следует в о сп о л ьзо ва ться ограничением.
334 глава 7
м н о г о т а б л и ч н ы е базы данных
да л ьш е * 335
зачем нужны вн е ш н и е к л ю ч и
-Г "
Итак, упростить получение информации об
увлечениях можно только одним способом: убрав
их из таблицы my_contacts. И Реджи нужно по
добрать нормальную пару... Осталось понять, КАК
создать таблицу с внешним ключом.
Чаопо
----------------------- <аДаВаеМые -----------------------------------
БоГ1р)Сь1
Как написать запрос на выборку увлечений после того, как они будут из
влечены из m y _ c o n ta c ts ?
336 глава 7
м н о г о т а б л и ч н ы е базы данных
да л ьш е ► 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
м н о г о т а б л и ч н ы е базы данных
Д о п у с т и м , в та б л и ц е А х р а н и тс я ваш е и м я , а в та б л и
це В — и н ф о р м а ц и я о д о ход а х и н о м е р а с о ц и а л ь н о го
с т р а х о в а н и я ( т а к а я и зо л я ц и я п о в ы ш а е т б е з о п а с н о с т ь сВязыВается
д а н н ы х ).
РОВНО О Д Н А - С РОВНО одной
В обеих таблицах присутствует поле епр1оуее_±<1 U3 этих записей из этих записей
П о л е е тр 1 о уе е _ 1 с1 р о д и те л ь с ко й та б л и ц ы явл яется
п е р ви чны м кл ю чо м , а поле етр1оуее_1с1 дочерней
таб л иц ы — вн еш ним кл ю чом .
В с х е м е т а к а я с в я з ь о б о з н а ч а е т с я п р о ст о й с о е д и н и
тел ьной л и н и е й .
•ni|iloyee_id
enployees
0~*1Г first_Bame iast_name
г
SSH С~яг
salary
salary_l*v«l • m p le y e e jd
да л ьш е У 339
связи типа « о ди н -к-о дн о м у»
1. В ы д е л е н и е д а н н ы х м о ж е т у с к о р и т ь о б р а б о т к у з а п р о с о в .
Н а п р и м е р , если подавляю щ ее б о л ьш и н ство за п р о со в и з
вл е ка е т то л ь ко н о м е р с о ц и а л ь н о го с тр а х о в а н и я и н и ч е го
более, лучш е о б ращ аться с за п р о со м к м е н ьш е й таблице.
2. Е с л и с т о л б е ц м о ж е т с о д е р ж а т ь н е и з в е с т н ы е н а д а н н ы й
м о м е н т з н а ч е н и я , в ы д е л е н и е е го в о тд е л ь н у ю т а б л и ц у п о
зв ол и т изб еж ать хр а н е н и я NULL в о с н о в н о й т а б л и ц е .
3. И з о л я ц и я ч а с т и д а н н ы х п о м о г а е т о г р а н и ч и т ь д о с т у п к н и м .
Н а п р и м е р , е с л и у вас и м е е т с я т а б л и ц а с з а п и с я м и р а б о т
н и ко в , и н ф о р м а ц и ю о д о ход а х лучш е х р а н и ть отд ельно о т
о сн о вн о й таблицы .
4. Б о л ь ш и е б л о к и д а н н ы х (н а п р и м е р , т и п BLOB) т о ж е л у ч ш е
х р а н и ть в о тд е л ьной таблице.
К аж д а я запись та б л и ц ы 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
да л ьш е ► 341
связи <шногие-:<о-многим»
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 в таблицу
с информацией о женщинах в качестве внешнего ключа.
да л ьш е У 343
возьми в руку карандаш, реш е ни е
Г ® карандаш
Решение Взгляните на первую пару таблиц. Мы попытались ре
шить проблему, включая столбец з Ь о е _ 1 с 1 в таблицу
с информацией о женщинах в качестве внешнего ключа.
// ^1
2 ^ Сабо
3 Шлепанцы ? 3 Шарлотта
4 Туфли «Прада» ^ 1 / / 4 Миранда
5 Сабо 3 /
6 Шлепанцы 3 /
7 Туфли «Прада» 3 /
8 Сандалии 4 /
9 Шлепанцы 4 /,
10 Туфли «Прада» 4 /
344 глава 7
м н о г о т а б л и ч н ы е базы данных
_ и р а з м е щ а е м их в соедини-
Г т ельной таблице. «один-ко-многим»
«один-ко-многим» 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
подробнее о связях « м н огие-ко-м ногим »
В с о о тв е тс тв и и с э т о й с хе м о й сто л б е ц 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 r e g s _ lis t , м ы п о зн а
ко м и м с я с д р у ги м и у р о в н я м и н о р м а л и за ц и и .
my_conlacts
co n tact id О '"“ Я
last nam e
first nam e
phone
em ail
g en der
interests
seeking
да л ьш е > 349
приведение таблицы к 1НФ
У
Что5ы ст олбец «co lo rs»
дыл ат о м а рн ы м , он должен
содерж ат ь только один Эта таблица все ещ е не 1НФ,
из э т и х цветов, а не z или пот ом у что столбцы все еьце
3 о одной записи. содерж ат т е же т ипы дан
ных, все VARCHAR с цвет ами
игрушек.
350 глава 7
м н о г о т а б л и ч н ы е базы данных
Наконец-то — 1НФ...
Д а в а й т е п о с м о т р и м , ч т о зд есь н у ж н о сделать.
В1НФ
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
подробнее о с о с т а в н ы х кл ю ча х
наш * po w er w o akn o M
Супер-Мусорщик Моментально убирает мусор отбеливатель
Брокер Делает деньги из ничего NULL
Супер-Парень Летает птицы
Чудо-Официант Никогда не забывает заказы насекомые
Грязнуля Создает пыльные бури отбеливатель
Супер-Парень Обладает суперсилой другие супермачо
Злая Тетка Бывает очень, очень злой NULL
Жаба Язык справедливости насекомые
Библиотекарь Найдет все NULL
Гусыня Летает NULL
Нарисованный Изображает людей игра «Виселица»
Человечек
352 глава 7
м н о г о т а б л и ч н ы е базы данных
V Грязнуля
^ Супер-Парень
Создает пыльные бури
Обладает суперсилой
отбеливатель
алюминии
Тулза
Метрополис
США
США
Гувер
Плохиш
ГР
СП
Злая Тетка Бывает очень, очень злой NULL Рим Италия Психоаналитик зт
Жаба Язык справедливости насекомые Лондон Англия Цапля ЖА
Библиотекарь Найдет все дети Спрингфилд США Хаос БИ
Гусыня Летает NULL Миннеаполис США Охотник ГУ
Нарисованный Изображает людей игра «Висе Лондон Англия Ластик НЧ
Человечек лица»
а а льш е ► 353
возьми в руку карандаш, реш ение
Т . х —> Т . у
Э т о м о ж н о п р о ч и т а т ь т а к : «В т а б л и ц е с и м е н е м Т с т о л б е ц у ф у н к ц и о н а л ь н о
з а в и с и т о т с то л б ц а х». З а в и с и м ы й с то л б е ц у ка зы в а е тс я в п р а в о й ч а с ти .
П р и м е н и т е л ь н о к н а ш и м с у п е р ге р о я м э т о в ы гл я д и т та к:
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 . 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 в п р и в е д е н н о й н и ж е таблице
абсол ю тно независим. ддениі^^-
да л ьш е ► 355
т ранзит ивны е ф ункциональны е ; л в / г : ^ о лгг/
^с к_ е п е ш у З > 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 » . к о т о
рый т акже является не-ключевым.
Напишите, что произойдет со значением столбца 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 будет присвоено
значение!? ^ ^ « 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
м н о г о т а б л и ч н ы е базы данны х
Частно
^аД аБаеМ ы е
БоПрїСГьі
Существует ли простой способ устранения частич Когда и зачем мне могут потребоваться составные
ных функциональных зависимостей? ключи из столбцов таблицы (если не считать соеди
нительных таблиц)? Почему нельзя всегда создавать
дги:ьше 359
преобразование таблиц в 2НФ
--------- - \
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 Инглсайд
360 глава 7
миогстэ.б л и н н ы е базы данны х
а :іп ь ш е ^ 361
ст аньт е т аб л иц ей 2НФ
^ ш ан ьш е таб л и ц ей 2 С Ч асш и Ч н ы М и
^ =*ункЦионаЛьНь1Ми ЗаБисиМоспряМи
IJj’ eAcmaDbine cc^ff на М есте гпаёлиНы
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
м н о г о т а б л и ч н ы е базы данны х
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 ^ ^ ^ Ч асзп и Ч н ьхМ и
364 глава 7
^1 Ноготабпичные базы данны х
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
переход к ЗНФ
При р а с с м о 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
366 :лавн 7
м н о г о т а б л и ч н ы в базы данны х
contact id
last name
first name
phone
email
gender
birthday
profession
city
state
status
interests
seeking
П о д с к а зк а . И а м а берсмя
да л ьш е * 367
упражнение, реш ение
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
м н о г о т а б л и ч н ы е базы данны х
Конец
--------
Стоп, не так быстро! Теперь
мне нужно составить запросы ко
всем этим новым таблицам! Как получить
данные из набора связанных таблиц без на
писания сотни-другой запросов?
да л ьш е > 369
крат кии обзор sqi
Новые инструменты
Поздравляем, вы одолели больше Первая нормальная форма (1НФ)
половины книги. Напоминаем Столбцы содержат только
ключевые термины, которые вы узнали атомарные значения и в них
в главе 7. Полный список инструментов от сут ст вую т повторяю-
приведен в приложении III. щиеся группы данных.
С оставн ой ключ
П е р в и ч н ы й КЛЮ Ч. С О - ^
с»ол5ц о6,
которых образует уни
« ‘« ‘’ Р О Й , и « й о & р Т т " " " кальное значение клю
370
м н о г о т а б л и ч н ы е базы данны х
да л ьш е > 371
упражнение, р е ш е н и е
'пражнение
Р ’ЗШСИИС 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 д и н е н и я и М Н о Го щ а б л и Ч н ь хе озоераЦии
Не могли бы мы
^
остаться в одиночестве?^
ИҐ І.-І А .4 с
не ж е н а т •lolus
~Пол[Собёл~^ неженат
женщина асЮокат''
женат
учит ель ж ивот ные ~
к ни ги
книги
м узы ка
»еекіиа
мужчина
не за м у ж ем м уж и к I ка-----
|^эрй|Хар^йсо^^ женщина Джеральдина
адвокат
мужчина м узы ка
адвокат
сп о р т
музыка professien не ж е н а п л
программист
учитель ж енщ ина
адвокат адвокат '
живот ные
не ж е н а т
сп о р т
заллуж ем
не за м у ж ем 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 .
З а т е м условие 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 по одному.
То, ч т о у нас е с ть :
То, ч т о дол)кно б ы ть :
interests
один С т о л б е ц новой
^''лаблицы in t e r e s ts .
два
три
четыре
да л ьш е ► 377
разделение т е к с т о в ы х д а н н ы х
QiTiBfinbi на с, 408 -
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
После выполнения команды таблица ст олбц а. сим бол первого
будет выглядеть так. (зл л я т й я ) в х о ж дени я.
378 -=лгва 8
соединения и м н с г о т а б п и ч н ы е операции
Разделение увлечений
А теперь самое сложное: мы воспользуемся другой функцией для
удаления из текущего значения 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 .
380 глава 8
соединения и м н о г о т а б л и ч н ы е операции
Вывод списка
Наконец-то все увлечения разделены по разным столбцам. Для вывода можно
воспользоваться простой командой S E L E C T — но не для всех одновременно.
И команда не позволит легко извлечь их в один итоговый набор, потому что увле
чения хранятся в четырех столбцах. Результат будет выглядеть примерно так.
I in te re s tl I in te re s t2 I in te re s ts I in te re s t4 |
О стается лишь понять, как вставить результат выполнения этих команд в новую
таблицу. К счастью, это можно сделать, причем способ не один — их не менее трех!
П о п р о б VU т е Т с а м и
O R D E R BY p r o f e s s i o n ;
аальш е * 381
т ройное веселье с запросами
prof_id
profession
382 глава 8
соединения и многотабличные операции
384 глава 8
соединения и м н о г о т а б л и ч н ы е операции
Пеебзоиимы столбцов
Создать псевдоним очень просто. Он указывается после первого использова
ния имени столбца в запросе с другим ключевым словом AS. Оно сообщает
РСУБД, что столбец p r o f e s s i o n таблицы 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 ;^
\
У к а ж и г л с п и в З о н и м после
разобраться.
. Результ ат ы m cprof
programmer programmer
исходного з а
teacher щего псевдоним. teacher
проса с и с
lawyer Имя столбца со - lawyer
ходным им ен ем
столбца.
нимом.
да л ьш е ► 385
псевдонимы т абл иц
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
соединения и м и о г с т а б л и ч н ы е операции
Но начнем мы с рассмотрения
простейшей разновидности соеди
нений (которая и полноценным
соединением-то не является!).
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.
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 столбца.
FROM b o y s AS Ы CROSS J O IN b o y s AS b 2 ;
Попробуйте сами.
да л ьш е ► 389
возьми в руку карандаш
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
Солт-Лейк-сити, ЦТ
Нью-Йорк, МУ
Профессор
м
ps@tikiheanlounge.com
собаки,
5 5 5 5 5 5 -8 2 .Я Я
аа.пьше ^ 391
возьми в руку карандаш, решение
z ip _ c o d e ^ -^ -
status_id
la s l_ n a m e firs f_ n a m e p ra fo s s ie n
Эверетт Джоан Художник
Сингх Пол Профессор
Болдуин Тара Ш еф-повар
392 глава 8
соединения и м н о г о т а б л и ч н ы е операции
SE1£C T s o m e c o lijm n s
FRO M t a b le l
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
соединения и м н о г о т а б л и ч н ы е операции
Запрос, который возвращает имя (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 .
Запрос, который возвращает имя ( f i r s t name), фамилию ( l a s t name) и штат ( s t a t e ) каждого чело
века в m y _ c o n ta c ts .
На э т о т р аз в качестве ключа,
связывающего две таблицы,
и сп ользу ет ся ст олбец «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
соединения и м н о г о т а б л и ч н ы е операции
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
соединения и м н о г о т а б л и ч н ы е операции
Запрос, который возвращает имя (f ir s t_ n a m e ), фамилию ( l a s t name) и штат (state) каждого чело
века в т у c o n t a c t s .
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
с использованием естественных или неэквивалентных соединений.
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
соединения и м н о г о т а б л и ч н ы е операции
Внеш
неесоединение таблицы, и при этом использую
ключевое слово оы.
см зан о главе Ю .
перекрестно«соединение
6
Внеш
неесоедине другой таблицы, и при этом ис
пользую ключевое слово ОЫ.
перекрестноепрш
зведе я соединяю две таблицы с про
веркой условия.
402 глава 8
соединения и м н о г о т а б л и ч н ы е операции
Напишите два запроса с разными соединениями для получения парных записей из таблиц ту
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
упражнение, ре ш е ни е
Напишите запрос для получения всех возможных комбинаций записей из таблиц contact seeking
и seeking.
S ELECT * FROM contact_seeking CROSS JOIN seeking;
Получите список профессий людей из таблицы my contacts, но без дубликатов и в алфавитном порядке.
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.
Вроде как соединения считаются сложной темой?
Встроенные запросы?
Грег постепенно начинает понимать возможности соединений.
Он видит, что разбиение базы данных на таблицы имеет смысл,
а работать с хорошо спроектированными таблицами не так уж
сложно. Грег даже планирует расширить базу данных 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 ,
406 глава 8
соединения и м н о г о т а б /т ч н ы е операции
Новые инструменты
После главы 8 вы можете строить соединения,
как настоящий SQL-профессионал. Ниже
od
перечислены основные понятия этой главы.
Полный список инструментов приведен
С Г5
в приложении III.
«ее
вяу«р ® « КОМ '
Перекрестное соединение
Набор всех комбинации
\ уСАоб'^'^- записей одной таблицы
с записями другой т а
блицы. Т акж е вст реча-
и>тся другие названия —
Естес-рвенное соединение
«декартово соединение»,
Внутреннее соединение «декартово произведе
оез « о м » . Работает
ние» и др.
•только при соедине
нии двух таблиц, со
держащих одноименные
столбцы.
эквивалентное и неэкви С Г Г
валентное соединение
дбе разновидности вну ^^K>ЧeИu^>»»
тренних соединений. Эк •<^К>Чевые С А о 6 ^ °^ °'
бивалентное соединение
^ой.
sa^AenZ запя-
возвраи^ает комбинации
с равными значениями,
а неэквивалентные —
с неравными значениями
столбцов-
дальше ► 407
возьми в руку карандаш, реш е ни е
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 = .......................................
408 глава 8
9 одзаг1|=»ось1
з а п р о с а и и с п о л ь з о в а т ь е го в к а ч е с т в е в х о д н ы х д а н н ы х д р у г о г о
410 глава 9
подзапросы
да л ьш е ► 411
I
внут р е н н е го со е ди н е н и я
использование
г , « . » » » ч » »W '« “ « •7 ;
Грег получил „„формацию ° ™ ™ ° й бТ^даииых. 0 „ »о-.ет
Требуется: Веб-разработчик
Компания примет на работу веб-разра
ботчика с отличным знанием HTML & CSS
для работы с группой визуального ди
зайна. Специалисту, хорошо разбирающе
муся в веб-стандартах, предоставляется
уникальная возможность проявить себя
в чрезвычайно перспективной компании,
которой руководят умные люди, любящие
свое дело.
Зарплата: $95000-$105000
Оео лт работы: 5+ лет
ка(ндидатов, он смо-
Когда Грег найдет дХьнейш ий отбор,
жет обзвонить их и пр г д а н н ^ всех
Но с„ачала
веб-разраб 0 Т1 ШКр^< 0 ДЬ1 Т0 м Р
412 глава 9
подзапросы
З а р п л а т а , кот орую
кандидат надеет ся
>лолучать на новой
работ е.
да л ьш е ► 413
два запроса за два шага
414 глава 9
подзапросы
Ш Т У Р М
да л ьш е > 415
знакомст во с nodjan/jocaMU
Подзапросы
Ч тобы сделать то , что делается двумя запросам и, всего в одном зап р осе,
нам понадобится вклю чи ть в него подзапрос.
WHERE
416 глава 9
подзапросы
Запрос с подзапросом
Два объединенных за
проса ^превращаются
в запрос с подзапросом.
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
вым запросалл ' вращ аемы е п е р -
да л ьш е * 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
Почему то же самое нельзя сделать с ис Тот же запрос можно реализовать следующим
пользованием соединения? образом:
аальш е >
• 419
беседа у намина
Как и я.
420 глава 9
подзапросы
Кодеке $ 0 1
Кодеке 8 0 1
да л ьш е ► 421
упражнение, реш е ни е
ПраВила подзапросов
Помните об этих правилах, когда будете рассматривать примеры подзапросов в этой главе.
ажнение
Кодекс S Q L
Кодекс SQ L
Подзапрос всегда представляет Подзапросы могут исполь
собой одну команду SELECT. зоваться в четырех местах
запросов: SELECT, SELECT
Подзапросы всегда заключа
список СТОЛБЦОВ как один
ются в КРУГЛЫЕ СКОБКи из столбцов, условие FROM
Подзапросы не имеют собствен
и условие WHERE,
ного символа ТОЧКА Подзапросы могут использо
СЗАПЯТОЙ . Как обычно, один ваться в командах INSERT, 3s
J
I
ЗйЧ- 'С
<аДаБаеМые
BoTljoCbl
Так что же может возвращать внутренний запрос? А как Мне все еще неясно, сколько значений может возвра
насчет внешнего запроса? щать подзапрос — одно или несколько. Что по этому поводу
(^азано в официальных правилах?
! В большинстве случаев внутренний запрос может воз
вращать только одно значение, то есть один столбец с одной В общем случае подзапрос должен возвращать одно
записью. Внешний запрос берет это значение и использует его значение. IN — исключение из правила. Обычно подзапросы
для сравнения со всеми значениями столбца. возвращают одно значение.
Почему вы говорите об «одном значении», когда в при Что произойдет, если подзапрос возвращает несколь
мере на с. 418 возвращается целый столбец значений? ко значений, но не использует условие WHERE с набором
422 9
подзапросы
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-. столбцов р езу л ьт а менно, они никак не влия- можно о п у
ты ст али намного ю т на имена и сп о л ь з у е ст и т ь.
^ более понятными мы х таблиц и столбцов.
дальше у 423
пост роение подзапроса
Построение подзапроса
С амое сл ож н ое в подзапр осах — не структура, а определен и е того ,
какую часть зап р о са следует п р ео бр азо вать в подзапр ос (и нужно
ли это делать вообщ е).
Анализ зап р о со в и м еет много общ его с реш ением п р о сты х ариф
м ети ч ески х задач. В ы находите в ф ормулировке задачи то , что
со о тветству ет и звестн ы м значениям (таблицы и имена сто л б ц о в),
и разб и ваете слож н ы е утверж дения на отдельны е ком поненты .
Анализ вопроса
П ереф разируем во п р о с в к о н тексте таблиц и столб ц ов базы
данных.
^ СіАлолдцьі « f i r s t _ ^ a ^ e » MAX(salary)
«la st_n a m e» ілладлицьі і^аблицьі
'^У-Contacts. Joh_current.
SELECT M A X (s a la r y ) FROM j o b _ c u r r e n t ;
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 ; о заработке ка)¥.дого
человека.
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 ) ;
дальш е ► 425
несколько способов и -т исан и я зап ио со е
ШТУРМ
Напишите другой запрос, который покажет, кто из знакомых
Грега больше всех зарабатывает.
Логично.
Тогда почему бы вам не о брати ться
к и нтервью на с. 430?
426 глава 9
подзапросы
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;
да л ьш е > 427
подзапрос с ест ест венны м соединением
SELECT jc .s a la r y
Грег зам ечает, ч то зап рос возвр ащ ает всего один результат.
В м есто то го ч то б ы получить зн ачение и подстави ть его
Э т о т запрос б у в другой зап р о с, он реш ает п р еобр азовать его в подзапрос.
дет внутренним. Он пиш ет один зап р ос, которы й:
С использованием one
^ - п о л у ч а е т зарплату Энди; р ат ор а сравнения >.
— ср авн и вает ее с другими зарплатами;
:. f ir s t _ n a m e , m c .ia s t nam e, jc .s a la ry * ^
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 внеш него запроса. некоррелированным
Но внутренний запрос никоим образом не зависит от данных
внешнего запроса; его м ож но выполнить отдельно, как само подзапросом.
стоятельный запрос.
Внешний запрос обраба
тывается вторым. Его (а если вы про и зн есет е ^
р езу л ь т а т ы зависят от с л о в а « н е к о р р е л и р о в а н н ы й
о ч -к р о в м а д о '
О В © 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
подзапросы
Объединитедвазапроса.Используйтеподзапросвспискестолбцов select.
Объединитедвазапроса.Используйтеподзапрос вспискестолбцов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 = 'Веб-разработчик')
432 глава 9
подзапросы
Некоррелированный подзапрос
с несколькими значениями: IN, NOT IN
В ер н ем ся к первому запросу, котор ы й был опробован Грегом на с. 17. Э то т
зап рос п озволил ему найти лю дей, долж н ости к о тор ы х совпадают с одной
из предлож енны х вакансий. З ап р ос б ер ет полный набор значений t i t l e ,
возвращ аем ы х командой SELECT в под зап р осе, и п р о вер я ет по этому набору
каждую зап и сь таблицы j ob c u r r e n t для поиска во зм о ж н ы х совпадений.
некоррелированными под
Такие зап р осы н азы ваю тся
запросами; ключевые слова IN или NOT IN п роверяю т
со о т вет ст ве н н о присутствие или о тсутстви е результатов Некоррелированный под
внещ него зап р оса среди результатов подзапроса.
запрос при помопщ Ш или
\0Т Ш проверяет факт
ШТУРМ
наличия (или отсутствия)
Почему вместо подзапроса нельзя
просто ввести список значений? значений, возвращенных
подзапросом, в наборе.
д а л ьш е ► 433
подзапросы, уп р а ж н е н и е
ОшВетр на с. 436 -
г — — — — — — — — — — — — — — — — —
^ О тпВртп ня Ґ 4 3 6 .
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
г — — — — — — — — — — — — — — — — — ~1
Найдите всех веб-дизайнеров, у которых почтовый индекс (21р_сос1е) совпадает с почтовым
I индексом какой-либо вакансии веб-дизайнера из таблицы jo b_listings.
ОгоВеш на с. 4 3 7 -
J
Выведите список всех людей, у которых почтовый индекс (zip code) совпадает с почтовым
индексом человека, получающего максимальную зарплату.
ОгоБетп на с. ш
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ J
434 -jjiaea 9
подзапросы
contact Jn te r e s I
contact_id ^
L __ __ __ __ __ __ __ __ __ __ — __ __ __ __
436 глава 9
подзапросы
Найдите всех веб-дизайнеров, у которых почтовый индекс (zip code) совпадает с почтовым индексом
какой-либо вакансии веб-дизайнера из таблицы job_listings.
V V
Выведите список всех людей, у которых почтовый индекс (zip code) совпадает с почтовым индексом
человека, получающего максимальную зарплату.
Вопрос с подвохом в таблице м о ж е т быть сразу несколько ч е л о
век с максимальной зарплат ой. Это означает, что в запросе п р и
дется использоват ь IN и нам понадобятся два подзапроса.
Коррелированные подзапросы
^ — -
Если некоррелированные подзапросы
существуют сами по себе, могу поспорить,
что коррелированные подзапросы каким-то
образом зависят от внешнего запроса.
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. сначала должен быть вы
полнен внешний запрос.
438 :плеа 9
подзапросы
Д опустим, Грег х о ч е т расш ирить круг клиен тов сво ей службы поиска
работы . Д ля этого он соб и р ается р азосл ать сообщ ения всем людям
из my c o n t a c t s , данные к о тор ы х ещ е не со д ер ж атся в таблице
jo b_cu rren t. Д ля поиска запи сей он использует услови е NOT EXISTS.
WHERE me. eo n ta e t_ id = j e . co n ta e t_ id ) ;
^ ^ л а 1е т ?
С оедините каждую ч асть приведен ного вы ш е зап р о са с описанием т о го , что она делает.
дальш е у 439
подзапросы и EXiSTS/NO T EXISTS
Соедините каждую часть приведенного выше запроса с описанием того, что она делает.
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 И сти н но, если записи не найдены
440 глава 9
подзапросы
ОшВете на с. 444.
дальше ► 441
успех подзапросов!
Часто
'^а Д а Б а е М ы е
B o n jb C b i
Б: Итак, подзапрос можно вложить в другой подзапрос? Подзапросы мне не нравятся, могу ли я использовать
вместо них соединения?
Безусловно. Количество уровней вложения подзапросов
ограничено, но в большинстве РСУБД оно значительно превы • в большинстве случаев — да, можете, но сначала необходи
шает практический «потолок». мо еще кое-что узнать о соединениях...
442 глава 9
подзапросы
По дороге на Вечеринку
Гре. о6„арр.и.ае. в газете с х .™ . с се„са„.....н.м за.оло.ко».
М Ш б в г е и
® [ г а ( Щ д !^ м а [ ^ < о ) © !? ^ ^
СКРЫ ТЫ Е СО ЕДИ Н ЕН И Я
С оседи утверждаю т, ч то п одзап р осы — «не ч то и н ое», как
об ы чн ы е соединения, и «...люди долж н ы узнать правду».
Трой Армстронг
Р еп о р тер ШЦиЕКУЕК
Подз, Й н у тр е н н и м
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
Новые приемы
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 пружина
АеВоб; правое...
с другой стор он ы , внеш ние соединения в больш ей степ е
ни зави ся т о т отногиений м еж ду двумя таблицами, чем все В левом внешнем соеди-
рассм отр ен н ы е ранее типы соединений.
Левая 1ллаблии,а
Аевое внешнее
„еЭкнении. ^
дальш е i 447
левое внеш нее соединение
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 ;
fe y
■"^ИНДИ обруч
Р езул ьт ат Джейн солдатики
Салли губная гармошка
448 глава 10
внеш ние соединения, самосоединения и союзы
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 ;
дальш е ► 449
возьми в руку карандаш , реш ение
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 У 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
toys girls
t o y jd toy cjirljd Ф'Н t o y jd
% водяной п и И Джен г
ст о л ет г Клео 1
а дудка 3 Салли 3
3 пружина 4 М арт а 3
452 глава 10
внеш ние соединения, самосоединения и союзы
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
правое внеш нее соединение
Э т о т запрос уже
приводился на с. 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
456 глава 10
внеш ние соединения, самосоединения и союзы
location
infojocalion
location id
location id location
when
UTVPM
Как изменить структуру схемы,
чтобы сохранить в базе дан
Вам смешно, наде
ных информацию об иерархии
юсь? Ведь я же клоун...
клоунов?
Смешно, спрашиваю?
Снифлз. начальник
\Слара6елл u С н а г л з ^
да л ьш е ► 457
добавление т аблицы clown_boss
10 Мистер Снифлз
5 Кларабелл 3 Снаглз
^ 7 Зиппо О ^ Элси
8 Бэйб 2 Пиклз 0 Скутер 4 Мистер Хобо
9 Бонзо '
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
внеш ние соединения, самосоединения и союзы
ШТУРМ
Можно ли хранить информацию об иерархии
клоунов без создания отдельной таблицы?
459
реф лексивны й внеш ний ключ
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
внеш ние соединения, самосоединения и союзы
М н аш * 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
чтойи м
Здесь проверяет ся со вп а
дение « 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 (о т щ д а
дерет ся имя начальника).
^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
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 ;
464 глава 10
внеш ние соединения, самосоединения и союзы
Союзы Ддннме
Данные
С ущ ествует ещ е один сп особ получения из job_curtrev^
из job_desired.
объединенны х результатов таблиц — так на
зы ваем ы е со ю зы (клю ч евое сл о во UNION) .
ШТУРМ
Как вы думаете, что произошло при выполнении нового
запроса?
Ограничения союзов
Запрос Грега не сработал! РС У БД вы дала сообщ ен ие об ош иб
ке, потому что она не знала, как и н тер п р ети р овать м ногократ
ное п овтор ен и е ORDER BY.
466 глаеа 10
внеш ние соединения, самосоединения и союзы
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 ;
дальше ► 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
внеш ние соединения, самосоединения и союзы
SELEC T t it le FRO M jo b _ d e s ir e d
QjnBero на с. 479.
INTERSECT u EXCEPT
Конструкции INTERSECT и EXCEPT, в отличие Ь .....................................................
^ Эти две операции
от UNION, используются для поиска перекры
)УДЬ11^ I НЕ ПОДДЕРЖИ-
вающихся результатов запросов.
осщорэжны! ВАЮТСЯ в MySQL.
INTERSECT возвращает данные из результатов
первого запроса, которые также присутствуют
во втором запросе.
470 гл.ава 10
внеш ние соединения, самосоединения и союзы
с ПООІЛГЩЗГіСвии
+ < 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
да л ьш е * 471
использование соединений в м е ст о подзапросов
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)
/
П р и в ы п о л н е н и и запроса бы л п о Внутренний
л у ч е н с л е д у ю щ и й результат. запрос.
Объясните, почему конструкция IN N E R J O I N этого запроса во звращ ает те ж е результаты, что и подзапрос.
472 глава 10
внешние соединения, с а м о с о е д и н е н и я и союзы
Соединение Подзапрос
Б езусловно, я лучш е п о д хо ж у для б ол ьш ин ства
ситуаций. М еня прощ е п о ня ть и я о б ы чно вы
п о л н я ю с ь н а м н о го б ы с тр е е , ч е м ка ко й -н и б у д ь
П р о с т и т е , э то к т о «стары й»? В о м н о ги х Р С У Б Д
ста р ы й подзапрос.
я не п о д д е р ж и в а л с я д о п о с л е д н е го в р е м е н и .
М еня приш л ось Д О Б А В И Т Ь , потом у ч то м но
ги е п р о гр а м м и с т ы х о те л и р а б о та ть со м н о й .
К т о бы го в о р и л — ка к на сче т ваш их К О Р Р Е
ЛИ РО ВАН Н Ы Х и НЕКОРРЕЛИРОВАННЫ Х
Х о р о ш о , у нас о б о и х есть св о й ж а р го н ; это
разновидностей?
правда. Н о со м н о й м о ж н о сначала в ы ч и с л и ть
в н у т р е н н ю ю ч а с т ь , а у ж е п о т о м о т д е л ь н о за
няться внеш ней.
да л ьш е ► 473
беседа у кам и н а
Беседа у камина
Сегодняшняя шехяа: соединения
U подзапросы. К то лучше?
Соединение Подзапрос
Д а л е к о н е в с е гд а , м и с т е р К О Р Р Е Л И Р О В А Н
Н Ы Й П од за п р о с. Н о п о ка д овол ьн о об этом .
Я л у ч ш е п о д х о ж у , ко гд а в р е зул ьта та х д о л ж н ы
п р и сутств о в а ть сто л б ц ы и з н е с ко л ь ки х таблиц.
Б олее т о го , я — е д и н ств е н н о е р е ш е н и е для п о
д о б н ы х случаев.
Д а , и и м е н н о п о э т о м у у вас н е л а д ы с а гр е га т
н ы м и ф у н кц и я м и — и х нельзя и сп о л ьзо ва ть в
у с л о в и я х WHERE б е з п о д з а п р о с а . С о г л а с и т е с ь ,
это о тч а сти ко м п е н си р уе т за п р е т на возвращ е
н и е н е с к о л ь к и х сто л б ц о в . В ы созд аете с л и ш ко м
м н о го тр уд но сте й.
Э э э ... в е р н о . Н о я з н а ю к а к м и н и м у м о д н о , ч т о
о т л и ч а е т м е н я о т вас. Я м о гу и с п о л ь з о в а т ь с я
в к о м а н д а х UPDATE, I N S E R T и D E L E T E .
Тож е м не достиж ение.
474 гл ава 10
внешние соединения, с а м о с о е д и н е н и я и союзы
Выведите все должности с зарплатой, равной наибольшей зарплате из таблицы job lis tin g s .
да л ьш е ► 475
упражнение, р еш е н и е
реш ение
Выведите все должности с зарплатой, равной наибольшей зарплате из таблицы job lis tin g s .
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?
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 ) .
D EC(1Z,Z)
Объясните, почему конструкция 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
ОМ, используемый для
других целей. 'пТ ав^ о й ^ ^
except
у создания маглиць, по
результатам выполне Ключевое слово возвращает
ния команды SELECT. только те значения, которо-
ые присутствуют в первом.
но НЕ бо втором запросе.
480 глава 10
11 0Г^»аниЧени!Г, п р еД сл ааБ Л ен и я и т р а н з а к ц и и
+
У семи нянек
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
ограничения, п р е д с т а в л е н и я и транзакции
^Конечно, могу.
Грег
Гр«г
Грег
Грег
Профессия — учитель, семейное положение — в браке не состоит.
Чтобы получить правильные значения, используй запросы SELECT —
описание синтаксиса найдешь в моих заметках.
Грег
(вроде все простоТуже делаю :)
Спасибо!
Джим
V
Грег
Не стоит благодарности |
г X*
OiTVPM
А вы сможете написать запросы для вставки данных нового
клиента в базу данных?
да л ьш е 483
неограниченный в в о д д а н н ы х
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
484 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
M ales
6982 И 6 9 82. записи с буквой « М » .
SELECT COUNT(* ) AS T o ta l FR O M m y _ c o n ta c ts ;
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 ».
Ш ТУРМ
да л ьш е У 485
ограничения check
Значением столбца « с о т » м о ж е т _ У
быть только одна из эт их букв.
CHECK не обеспечи-
ЗДЬхцС I вает целостности
>С1Цор:>ЖНь1! данных в MySQL.
MySQL позволяет создавать таблицы
с ограничениями CHECK, но эти ограниче
ния не работают. MySQL их игнорирует.
486 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
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),
Столбец 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 : .............................................................................................................................................................................
- ^ В о зь м и в руку карандаш
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),
_ Часто»
^адаБаеМ ы е
Бо11р>Сь1
Значит, в CHECK можно использовать все то, что раз- не так просты, как ограничения CHECK, а тонкости их использо-
решено в условии NHERE7 вания выходят за рамки этой книги.
488 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
Ф р э н к е ж е д н е в н о в ы п о л н я е т о д н и и т е ж е за
п р о с ы , п ы та я сь п о д о б р а ть для ка ж д о го п о д х о
д я щ у ю работу. -------
О ш а н к ш е « ^ р э н к о М
да л ьш е у 489
создание п р е д с т а в л е н и я
^ т а н ь ш е ф р э н к о М . О ш Б е ш
Пусть> с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 = ' Технический п и с а те л ь ';
Действительно про
о О сто! Но как использовать
представление, которое
я создал? ^__
Ш ТУРМ
да л ьш е * 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 ^ зыоать.
SELECT * FROM w e b _ d e s i g n e r s ;
Р езультат:
492 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
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дпегз?
Зачем она нужна?
дал ьш е 493
подробнее о п р е д с т а в л е н и я х
Н о в и р т у а л ь н а я т а б л и ц а н е х р а н и т с я в базе д а н н ы х . О н а со зд а
е тс я то гд а , ко гд а в ы и с п о л ь з у е т е п р е д с та в л е н и е , а за те м у н и ч т о
ж а е т с я . О с т а е т с я т о л ь к о к л ю ч е в о е с л о в о V IE W с и м е н е м . И э т о
х о р о ш о , п о т о м у ч т о п р и к а ж д о й в с т а в ке н о в ы х з а п и с е й в базу
д а ь п 1ы х п р и и с п о л ь з о в а н и и п р е д с т а в л е н и я б у д е т о т о б р а ж а т ь с я
новая инф орм ация.
m0.At>K0 бо
брблля UC-
ж е н и й . С озд авая п р е д ста в л е н и я д а н н ы х , вы с м о ж е те и зм е н я т ь б а зо вую с тр у кту р у 1ЛОЛ(зЗоб(ЯНиЯ
494 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
Какие столбцы этих таблиц могут использоваться для вычисления прибавки зарплаты?
да л ь ш е ► 495
упражнение, реш ение
’ Реш ение
Какие столбцы этих таблиц могут использоваться для вычисления прибавки зарплаты?
, , , . , V,
j c .c o n t a c t jd j jc.salary, jd .sa la ry jo w , В о ст альном коде запроса
т ренних соединения используи^тся для
,
496 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
ОшВетп на с. 517.
^ Значит, я могу
создать представление, ко- )
( торое позволит мне изменять ^
содержимое таблиц?
К а к п р а в и о л , о п е р а ц и и I N S E R T , UPDATE
и DELETE б ы в а е т у д о б н е е в ы п о л н я т ь т р а д и ц и
о н н ы м способом , но мы рассм отрим прим ер
о б н о в л е н и я д а н н ы х через представление.
В н а с то я щ и й м о м е н т та б л и ц а 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
ограничения, п р е д с т а в л е н и я и транзакции
Попробии^ле понять
Напишите, что произойдет при выполнении каждого из следующих запросов что делает
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);
да л ьш е ► 499
упражнение, р е ш е н и е
/й ш е н н е
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);
упражнением.
Запрос будепл. выполнен нормально.
500 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
А е сл и вам ещ е н е д о с т а т о ч н о с л о ж н о с т е й , т о у ч т и т е , ч т о
об новл ени е в о зм о ж н о то л ько для пред ставл ени й, не сод ерж а
щ и х а г р е г а т н ы х о п е р а т о р о в (SUM, COUNT, AVG и т . д . ) , а т а к ж е
т а к и х о п е р а т о р о в , к а к BETWEEN, HAVING, I N и NOT IN .
502 глава 11
транзакции для всех
О н а п р о в е р я е т баланс с в о и х с ч е то в , те ку щ е го
и с б е р е га те л ь н о го .
1000 5HnOLEЯr^5 30 5 Я П 0 1 Е Я П 5
1П С Н Е С Н Ш й 1П 5Я^^1П55
ЛЗ/
О н а вы бирает.
О н а на ж им а е т кн опку.
О ЗЯПОІЕЯПБ 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
I D a t a v il l e
БАНКО М АТ;
Б А Н К О М А Т : ШШЩШЯ
М и с с и с Х а м ф р и с : С к а ж и т е , с к о л ь к о у м е н я д е н е г.
ШТУРМ
Можно ли сделать так, чтобы банкомат
не забыл о команде i n s e r t , выполняемой
в начале операции миссис Хамфрис?
А т е м в р е м е н е м в д р у го м м е с т е ...
да л ьш е ► 505
транзакции дл я всех, часть вторая
5аза данных с и н ф о р
м а ци ей о сост оянии
о6иА,его счет а М эр и
и Джонд.
Баланс
350 долларов
506 ■глава 11
ограничения, п р е д с т а в л е н и я и транзакции
да л ьш е > 507
анатомия т р а н за кц и и
Д ж о н и М э р и п ы т а ю т с я о д н о в р е м е н н о в ы п о л н и т ь од ну и т у
ж е т р а н за к ц и ю .
Д ж о н и Мэри одновременно п ы т а
ют ся снят ь по 3 0 0 долларов.
Если баланс текущего счета >= 300 Если баланс текущего счета >= 300
Уменьшить баланс текущего счета на 300 Уменьшить баланс текущего счета на 300
~^~ранзакция
Джона. Транзакция
Банане Мэри.
3 5 0 д ол я ар ов
Б а н к о м а т М э р и в о о б щ е н е д о л ж е н о б р а щ а т ь с я к с ч е т у (д а ж е
д л я п р о в е р к и б а л а н с а ), п о к а б а н к о м а т Д ж о н а н е з а в е р щ и т
о б р а б о тку т р а н з а кц и и и не с н и м е т б л о ки р о в ку с нее.
СбойетВа транзакций
Ч т о б ы н а б о р ко м а н д 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
Команда
зак репляет
р езу л ьт а т ы
C O M M IT; всего вы пол Если р е з у л ь т а т выполне
ненного кода. ния кода вас у ст р а ива ет ,
вы зак репляет е изменения
Е сл и все ко м а н д ы в ы п о л н е н ы у с п е ш н о
в базе данных командой
и все в ы гл я д и т х о р о ш о , закрепит е изме
COMMIT...
нения ко м а н д о й COMMIT.
510 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
БАНКОМАТ:
БАНКОМАТ:
БАНКОМАТ:
БАНКОМАТ:ЛЯ ЗТО ШЕ RUCCUC ЗТЕ(1Ь ХЯПфРиС! ПРИВЕТ. ПиС-
К о м а н д а COMMI Г сис хнпфрис [ r c c o u h t j o = з в г г 1]
не б ы л а в ы п о л н е н а ,
п оэт ом у сост ояние Миссис Хамфрис: С к а ж и т е , с к о л ь к о у м е н я д е н е г.
да л ьш е у 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л>'чится более компактной.
О н и н а зы в а ю тся я д р а м и х р а н е н и я д а н н ы х , и в ы б о р л ю б о го
и з н и х п о з в о л и т вам и сп о л ь зо в а ть т р а н з а кц и и . За д о п о л н и
тельной инф орм ацией о разл ичиях между ядрами хранения
д а н н ы х M yS Q L обращ айтесь к д о кум е нта ц и и .
512 глава 11
ограничения, п р е д с т а в л е н и я и транзакции
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 ;
В т о р о й р а з и с п о л ь з у е м к о м а н д у 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 ;
д ал ь ш е > 513
в о з ь м и в р у к у карандаш
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 будут работать без нее? экспериментов.
дальш е ► 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.
витном порядке по фамилиям?
да л ьш е * 517
возьми в руку карандаш, р е ш е н и е
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 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
518 гп ав а 11
12 )е 5 о ц а с :н о а ііь
Защита данных
новить контроль над тем, какие операции с данными разреш ены тем или
иным пользователям.
проблемы с в в о д о м д а н н ы х
Проблемы С пользователями
С б о р д а н н ы х о кл о ун а х в Д е й та в и л е развернул ся
н а с то л ь ко ш и р о к о , ч то го р о д с к о й со ве т нанял целую
г р у п п у р а б о т н и к о в д л я н а б л ю д е н и я за к л о у н а м и
'Лжордж»
и за н е с е н и я и н ф о р м а ц и и в базу д а н н ы х c lo w n _
tra c k in g .
К со ж а л е н и ю , в гр у п п у п р о н и к п е р е о д е ты й кл о ун,
и з в е с т н ы й п о д к л и ч к о й « Д ж о р д ж » . О н созд ал ц е л ы й I nvest
р я д п р о б л е м в базе д а н н ы х , в к л ю ч а я п о т е р ю ........ Security deveiope
и неж елательное и зм енение д а н н ы х, а та кж е п о ч ти
с о в п а д а ю щ и е з а п и с и , с у щ е с т в у ю щ и е т о л ь к о и з-за
преднам еренны х опечаток. В от лиш ь не которы е
из в о зн и кш и х проблем :
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 \ш ен и е Защитите базу данных от возмож ного саботажа со стороны клоу
нов. С каждой стороны запишите некоторые запросы, которые
должны быть разреш ены (или запрещены) новым работникам.
Там, где это возмож но, укажите имена таблиц.
Операции, которые следует разрешить новым Операции, которые следует запретить новым
работникам. работникам.
522 гл ава 12
безопасность
П о у м о л ч а н и ю п е р в ы й п о л ь зо в а те л ь — 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
ко м а н д а в ы гл я д и т та к:
Ч а ст р о
^аД аБ аеМ ы е
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
создание н о в о го п о л ь зо в а т е л я
В т а б л и ц е , к о н е ч н о ! Р С У Б Д п о д д е р ж и в а е т базу д а н н ы х
с и н ф о р м а ц и е й о себе. В т а б л и ц е х р а н я т с я и д е н т и ф и к а т о р ы
пользователей, им ена, п а р о л и и сведения об о п е р а ц и я х, к о
то р ы е п о л ьзо ва те л ю р а зр е ш е н о в ы п о л н я ть с ка ж д о й базой
данны х.
524 глава 12
безопасность
В о т л и ч и е о т у ч е т н о й з а п и с и ro o t, к о т о р о й р а з р е ш е н о в ы п о л н е н и е л ю б о й к о м а н д ы
S Q L с л ю б ы м о б ъ е к т о м б а з ы д а н н ы х , у ч е т н ы м з а п и с я м н о в ы х п о л ь з о в а т е л е й за
п р е щ е н ы л ю б ы е д е й с тв и я . Ч т о б ы р а з р е ш и т ь п о л ь зо в а те л я м ка ки е -л и б о о п е р а ц и и
с базой д а н н ы х, н е о б хо д и м о в ы п о л н и ть ко м а н д у GRANT.
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
д а л ьш е > 525
команда GRANT
Пользователю р а зр еш а ет ся
выполнять команду SELECT...
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 ;
да л ьш е > 527
уараж н в м ив . р е ш е н и е
528 гл ава 12
безопасность
Разновидности GRANT
В то л ь ко ч то вы п о л н е н н о м уп р а ж н е н и и б ы л и представлены
в с е о с н о в н ы е р а з н о в и д н о с т и к о м а н д ы GRANT. В о т о н и :
да л ьш е > 529
команда REVOKE
Команда REVOKE
А если потребуется лишить Элси предоставленной привилегии
SELECT? Для этого используется команда REVOKE.
привилегия, к о т о р а я о т н и м у
^ ет ся у п о л ь з о в а т е л я (SELECT).
REVOKE SELECT ON
clown^info
FROM elsie;
П о л ьзо в а т ел ь, к о т о р ы й
л и ш а е т с я привилегии.
П о л ьзо в а т е л ь л иш ает ся
у^олько привилегии
flRAN T OPTION.
Только попро
буй, Джим,
REVOKE GRANT OPTION ON и я лишу тебя всех
привилегий на це
DELETE ON chores лый месяц.
FROM happy, sleepy;
d e le t e
530 глава 12
безопасность
предост ав
л я е т 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
Ш ТУРМ
да л ьш е ► 531
более точные разновидности revoke
CASCADE u RESTRICT
Существует два способа отозвать при
вилегию так, чтобы отзыв не отра
зился на других пользователях. Клю
чевые слова CASCADE и RESTRICT I
позволяют более точно указать, кто предост авля
должен сохранить свои привилегии ет PELETE для sleepy
предост ав JL
ляет PELETE sneezy
или лишиться их. chores с GRANT для chores
OPTION
с ключевым словом CASCADE привилегии лишается заданный пользователь (в данном
случае sleepy), а также все, кому он предоставил соответствующие разрешения.
^ CASCAPE означа
ет , что отзыв з а
т ронет не только
sleepy
лишает заданного пользо
ничего не
sleepy п р и делает , но
I вателя, но и всех
вилегии пользователей по
sneezy т е
PELETE для ряет свою цепочке.
sneezy
chores привилегию.
Если лишение
привилегии за
т ронет других
пытается
лиш ит ь sleepy
...HOничего
не выходит, 1 пользователей,
команда REVOKE
пот ому что
привилегии с RESTRICT выдает
sleepy команда т ак sneezy
PELETE для же зат ронет ошибку.
chores sneezy.
Оба пользователя сохраняют свои привилегии, а root получает со
общение об ошибке. Изменение не сохраняется, потому что оно
распространяется на пользователя sneezy, не указанного в команде.
532 •глсзез 12
безопасность
- ^ В о зь м и в руку карандаш
Кто-то продолжает предоставлять Элси лишние привилегии. На
пишите команды REVOKE для возвращения к безопасному уров
ню, на котором разрешена только выборка командой SELECT.
да л ьш е > 533
возьми в руку карандаш, решение
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.
/другой с п о
соб — с н а ч а
ла о т о з в а т ь
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, чт обы Элси м ог ^ Э лТ Т г
ЛЛ вы п ол нят ь выборку из loca ю п . п р е д о ст а в и л а другим
т е п ривилеги и, к о т о р ы е
были п р е д о с т а в л ен ы ей.
534 глава 12
безопасность
Часзпо
Ч адаБаеМ ы е -
Б о Т ]р зС ь 1
д а л ьш е ► 535
чем плохи о б щ и е учеП1НЬ;е записи
V
main database
536 глава 12
безопасность
В м е с т о имени
п о л ьзо в а т е л я при
назначении п ри ви -
Мы создали роль и определили ее привилегии. легий у к а з ы в а е т -
Теперь необходимо назначить ее пользователю... ся имя роли.
использование роли
До создания ролей привилегии пользова
П редост ав 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 :.
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
538 глава 12
безопасность
Часш»
^аД аБаеМ ы е
БоГ1р)Сь1
А если я хочу предоставить привилегии для всех Если пользователь обладает ролью, которая была
таблиц в базе данных? Перечислять все имена? удалена, он лишается этих разрешений?
О Нет, используйте следующий синтаксис: • Вот именно! Все выглядит так, словно вы явно предо
ставили ему эти разрешения, а потом отозвали их. Только
GRANT SELECT, INSERT, DELETE
вместо одного пользователя разрешений лишаются все
ON gregs_list.* пользователи, которым была назначена эта роль.
TO jim;
дальше ► 539
WITH ADMIN OPTION
p- д ^ о зь м и в руку карандаш
Решение Роли отнимаются у пользователей почти так же, как и привилегии.
Удастся ли вам написать команду для отзыва роли d a t a _ e n t r y
у пользователя doc, не заглядывая на следующую страницу?
540 глава 12
безопасность
д а л ьш е > 541
стань грогом
^ ш а н ь У реГоМ
^ последний J»a9 nj’eAanaBbine се^я на Месте У^еГа и HacmJ^ou-
і р е j ’ a a j ’ e iB e H u H п о л ь з о в а т е л е й , ч т ц о Є ь і н е о ц ь о ц н ы е | ^ а Є о і ц і ш к и
ни Ч еГо сл у ч а й н о не ucnopreiujiu.
542 глава 12
безопасность
Janumume m j^ КоМанды, Koinop>ie созда!«!!! mj>u учетные Записи — по одной для кажДоГо
из тр*ех p>aSoinHuKoB.
дальше * 543
стань грегом. ответ
(\ п а н ь У р е Г ° М . Q m B em
^ последний J>a3 и^’еДапаВыре се^я на Месте |реГа и насігір*ошгіЄ
j>a3j»eineHuH П ользователей, Чіцобьі неоиытгшые р*аботники ниЧеГо
случайно не испо]^иЛи.
544 глава 12
безопасность
CREATE USER e l s i e
GRANT SELECT ON
clo w n _ in fo
TO e l s i e ;
GRANT SELECT ON
clown_info
TO elsie
IDENTIFIED BY 'cl3v3rp4s5w0rd';
За л ы и е ► 545
с л » с о .гр м » еш од,.т ш М „рово,) уровс.ш.
Т 11р К р !41ф © Ш [ Ж М
Вакансии и форумы
Друзья и родственники говорят, что слава ничуть не измени
ла Грега.
Тр ой А р м стр он г
КОРРЕСПОНДЕНТ INQUERYER
ДЕЙТАВИЛЬ — Местный предприниматель Грег добился
успеха и известности. Его сетевая база данных превратилась
из набора карточек сначала в простую таблицу, а потом и в
многотабличную базу данных со службой знакомств, поиском
работы и другими полезными функциями.
546 глава 12
безопасность
Нобые инструменты
Поздравляем, вы закончили главу 12!
Ниже перечислены основные концепции
безопасности SQL, представленные
в этой главе. Полный список инструментов
приведен в приложении III.
1XD
grant
ка основании предо-
\ созЭйдая а ? ей с иа-
Разрешает пользоват е-
лю давать другим по ль
зователям предост ав
ленные ему привилегии.
зобаилеД^ Роль
дал ьш е ► 547
спасибо, что п о с е т и л и Д е и т а в и л ь !
Присоединяйтесь!
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
550 приложение 1
прочее
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
Специальные символы
Ниже перечислены многие специальные символы SQL с краткими описаниями. Как и ключевые
слова, их не рекомендуется использовать в именах —исключение составляет только символ под
черкивания (_). В общем случае имя не должно содержать никаких символов, кроме букв и симво
лов подчеркивания. Имена из одних цифр тоже нежелательны, хотя и они иногда оказываются
содержательными.
И сравнительных операторов.
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.
554 прило>нение f
прочее
да л ьш е > 555
подробнее о т и п а х д а н н ы х
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)
со з н а к о м без з н а к а
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 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 : ^ б ы з а к л ю ч е н ы в а п о ст р о ф ы .
а dale
August 2007
January 1925
дальше ► 557
временные т а б л и ц ы
5 . Временные таблицы
В этой книге мы создали много разных таблиц. Каждый раз при создании таблицы
РСУБД сохраняет описание ее структуры. При вставке данных РСУБД сохраняет эти
данные. Если завершить сеанс SQL в окне терминала или в графической программе,
таблица и хранящиеся в ней данные никуда не пропадут. И таблицы, и данные остают
ся в базе до тех пор, пока вы не удалите их.
SQL также поддерживает другую разновидность таблиц —так называемые врем енные
т аблицы. Временная таблица существует от ее создания до момента удаления или до
завершения пользовательского сеанса. Под сеансом понимается промежуток времени от
подключения к РСУБД с данными учетной записи до выхода или завершения графи
ческой программы. Временные таблицы также могут удаляться явно командой DROP.
6. преобразование типа
Иногда в столбце хранятся данные одного типа, а вам необходимо ин
терпретировать их как данные другого типа. В SQL преобразование типа
осуществляется функцией CAST ( ) .
Синтаксис:
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
да л ьш е > 559
получение т ек ущ ей и н ф о р м а ц и и
SELECT CURRENTJJSER;
В выходных данных команды также указывается имя хоста. Если РСУБД рабо
тает на одном компьютере с пользователем, а пользователь работает с учет
ной записью mot, команда выдаст следующий результат:
г о о t @ lo c a lh o s t
560 п р и ло ж е ни е I
прочее
да л ьш е ► 561
другие числовые ф ункции
562 приложение I
прочее
дальше ► 563
РНР MySQL с высот hi 10,000 метров
<?php
{
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 );
{
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 );
?>
564 приложение I
прочее
д а л ьш е > 565
|П 1Л оЖ ен и е : У стан овк а
Попробуйте сами
За зело!
Было бы странно прочитать книгу о языке SQL, не имея возможности
поэкспериментировать с ним. В этом разделе приведено краткое опи
сание процесса установки MySQL для систем Windows и Мае OS X.
568 Приложение и
установка MySQL
ВОЗМОЖНО; список
п р и д ет ся п р о к р у
т и т ь вниз.
8д/и нужна
версия S.O
и выше.
да л ьш е * 569
установка MySQL в системе Windows
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
570 приложение а
установка MySQL
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:
Откройте страницу:
h t t p : //dev. n ^ s q l . com /downloads/m ysql/5. 0 . h tm l
и щелкните на кнопке Download в разделе MySQL Community
Server.
Возможно, список
при д ет ся п р о к р у
т и т ь вниз.
572 п р и л о ж е н и е //
установка MySQL
в о з м о ж н о 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 ------------------------
о Когда загрузка файла будет завершена, откройте его двойным щелчком. После уста
новки 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
ри Л оЖ ен и е : ^ п и с о к и н сш р уМ еВ Д ^ о®
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
список и н с т р у м е н т о в
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
О
IS NULL
Условие для проверки неопределенных зна ORDER BY
чений NULL. Результат запроса упорядочивается
Глава 2 по заданному столбцу.
Глава 6
L
LIMIT
Условие определяет, сколько именно запи SELECT *
сей должен вернуть запрос и с какой запи - Выборка всех столбцов таблицы.
си следует начинать. Глава 2
Глава 6
в
Внешний запрос Левое внешнее соединение (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
Самосоединение
Способ построения запроса к одной табли
Первичный ключ (PRIMARY KEY) це так, как если бы она была двумя табли
Столбец или набор столбцов, значение цами, содержащими одинаковую информа
которого однозначно идентифицирует цию.
запись в таблице.
Глава 10
Глава 4
Строковые функции
функции, изменяющие копии содержимого Эквивалентное и неэквивалентное
текстовых столбцов, возвращаемые за соединение
просом. Исходные данные остаются неиз Дбе разновидности внутренних соедине
менными. ний. Эквивалентное соединение возвращает
Глава 5 комбинации с равными значениями,
а неэквивалентные — с неравными значени
ями столбцов.
Схема Глава 8
Описание данных, хранимых в базе данных,
включающее все объекты и связи между
ними. Экранирование
Глава 7 Апострофы в текстовых данных необходи
мо экранировать — удвоением апострофа
или обратной косой чертой.
Т Глава 2
582 пр и п о ж е н и е III
Линн Бейли
Изучаем 80Ь
Перевел с английского Е. Матвеев
ООО «Мир книг», 198206, Санкт-Петербург, Петергофское шоссе, 73, лит. А29.
Налоговая льгота — общероссийский классификатор продукции ОК 005-93,
том 2; 95 3005 — литература учебная.
Подписано в печать 26.08.11. Формат 84х1(Ю/16. Уел. п. л. 62,160. Тираж 2000. Заказ 26231.
Отпечатано по технологии С 1Р в ОАО «Первая Образцовая типофафия»,
обособленное подразделение «Печатный двор».
197110, Санкт-Петербург, Чкаловский пр., 15.