Санкт-Петербургский государственный университет Факультет филологии и искусств Кафедра информационных систем в искусстве...
266 downloads
364 Views
442KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Санкт-Петербургский государственный университет Факультет филологии и искусств Кафедра информационных систем в искусстве и гуманитарных науках
П.П. Щербаков
Создание баз данных в среде MYSQL Учебное пособие
Санкт-Петербург 2007
0
1
Рекомендовано к изданию Кафедрой информационных систем в искусстве и гуманитарных науках Факультета филологии и искусств Санкт-Петербургского государственного университета
Введение В настоящее время растет потребность в создании информационных систем, основанных на базе данных, для различных предметных областей.
Щербаков П.П. Создание баз данных в среде MYSQL: Учебное пособие. — СПб.: Ф-т филологии и искусств СПбГУ, 2007. — 35 с. Учебное пособие посвящено решению задач создания базы данных в среде MySQL Целью настоящего пособия является показать на примере конкретной задачи студентам кафедры информационных систем в искусстве и гуманитарных науках процесс разработки базы данных
Пособие имеет целью научить студентов создавать базы данных, начиная от формулирования задачи до создания системы быстрого развертывания, обеспечивающих обслуживание информационных запросов в конкретной предметной области. Для иллюстрации процесса создания базы данных выбрана задача создание электронного телефонного справочника. В качестве сервера базы данных (СУБД) используется широко распространенный в настоящее время сервер MYSQL, являющийся, практически, стандартом для создания ВЕБ-ориентированных систем.
Раздел 1. Постановка задачи и ограничение предметной области 1.1. Введение: Описание решаемых задач
Подготовка и издание учебного пособия осуществлено в рамках проекта СПбГУ «Инновационная образовательная среда в классическом университете» (Приоритетный национальный проект «Образование»).
© П.П. Щербаков, 2007 © Факультет филологии и искусств Санкт-Петербургского государственного университета, 2007
Отпечатано с готового оригинал-макета в секторе цифровой печати Института искусств Факультета филологии и искусств СПбГУ 199178 Санкт-Петербург, 10 линия В.О., д. 49. Подписано в печать 10.11.2007. Заказ № 55. Формат 60х84/16. Усл. печ. л. 2,2. Тираж 50 экз.
2
Работа над созданием базы начинается с описания предметной области, для которой предназначена создаваемая информационная система, определения информационных потребностей, которые эта система должна удовлетворять, и создания концептуальной схемы базы данных. Эта работа предшествует непосредственной разработке кода, обеспечивающего функциональность базы данных. Описание предметной области очерчивает круг сведений, которые будут храниться в разрабатываемой базе данных. Слишком широкий набор сведений, предназначенный для хранения базы данных повлечет неоправданное усложнение системы и увеличение объема хранимой информации, что, безусловно, скажется на сложности и трудоемкости разработки системы, трудовых затратах на наполнение и сопровождение базы данных и общей эффективности информационной системы. При описании предметной области объекты реального мира подвергаются классификации, фиксируется совокупность подлежащих отображению в базе данных типов объектов. Для каждого типа объектов фиксируется совокупность свойств, посредством которых будут описываться конкретные объекты этого типа в базе данных, виды отношений (взаимосвязей) между этими объектами. Затем решаются вопросы о том, какая информация об этих объектах должна быть представлена в базе данных и как ее представить с помощью данных. При проектировании и создании базы данных необходимо различать явления 3
реального мира, информацию об этих явлениях, представление этой информации посредством данных. Описание информационных потребностей, которые должна обслуживать разрабатываемая информационная система, позволяет определить объекты хранения, уточнить структуру данных, содержательное наполнение базы. Как правило, хорошо описанные информационные потребности позволяют создать эффективные средства обслуживания запросов пользователя. Создание концептуальной схемы базы данных позволяет облегчить решение дополнительных задач, которые возникают на этапе эксплуатации базы данных – разделение доступа и администрирование, поддержание целостности и непротиворечивости, развитие и модификацию базы данных. Рассмотрим эти этапы проектирования более подробно на примере создания «Электронного телефонного справочника» 1.2. Описание предметной области Зададимся вопросом, для кого предназначена разрабатываемая информационная система – для частного лица, для компании, специализирующейся на рекламе, для телефонной компании, для налоговой инспекции…. Список тех, кому может понадобиться такая система можно продолжить, однако для нас имеет смысл определиться. Будем разрабатывать телефонный справочник для частного лица – некоторый аналог записной книжки. Какая информация должна храниться в базе? Вот первый пришедший в голову список. • Обязательно телефонные номера • Обязательно владельцы • Адреса, связанные с владельцем телефонного номера. Данная информация похожа на содержание обычной телефонной книжки, что, впрочем, неудивительно. Так, или примерно так, нам представляется та часть реального мира, которую мы хотим описать и хранить о ней информацию. Уточним содержание хранимой информации. Телефонные номера – храним ли мы коды городов, фиксируем ли мы стационарный это телефон или мобильный, какой оператор поддерживает данный номер, какой тариф на этом номере, нужно ли вводить добавочную информацию, спаренный это телефон, подключен через мини АТС? Владелец – частное лицо или организация, чем занимается и т.д. Адрес – страна, город, улица, дом, квартира или офис, всякие дроби, корпуса, литеры, строения, подъезды, звонки, ближайшая станция метро и тд. 4
Приведенный список показывает, что усложнять данную задачу можно до бесконечности. 1.2. Описание информационных запросов Обратимся теперь к информационным потребностям. Что же мы хотим от нашей системы? Попробуем сформулировать возможный набор содержательных запросов, которые должна обслуживать наша информационная система. • Какой (или какие) телефоны связаны с конкретным лицом или организацией? • С каким адресом связан данный номер телефона? • Какие еще телефоны есть у владельца данного номера? • Какие телефонные номера связаны с конкретным адресом? • Какие телефонные номера не связаны с адресом или владельцем (это для администратора)? • Какие номера телефонов или владельцы телефонов ассоциируются с конкретной сферой деятельности? Сформулированные запросы дают нам представление о том, как должна быть организована информация. 1.3. Описание объектов хранения Название организации и имя владельца должны храниться в базе и по ним должен осуществляться поиск. С организацией может быть связано несколько телефонов, владельцев, адресов и т.д. То же относится и к владельцам телефонов. Такая ситуация подводит нас к решению о том, что Владелец телефона, Организация должны быть отдельными объектами хранения. По некоторым соображениям Адрес и Телефонный номер должны быть отдельными объектами хранения. Таким образом, в нашей базе выделяются четыре объекта
Владелец телефона
Телефонный номер
Организация
Адрес
Какие свойства объектов, или другими словами, атрибуты должны храниться? Как могут или должны представляться и обрабатываться
5
хранимые данные? Попробуем проиллюстрировать, как это учитывается на практике. О владельце телефона, например, можно хранить следующую информацию Фамилия Имя Дата рождения Характеристику Фотографию В данном случае мы не создаем реальную базу данных, которая будет распространяться, главной целью является иллюстрация того, как происходит процесс создания. С этой точки зрения проанализируем перечисленные свойства с точки зрения типов данных, которые будут использоваться непосредственно в базе данных. Имя и Фамилия могут храниться как текстовые строки, которые представляют из себя последовательности символов ограниченной длины. Максимальную длину таких строк необходимо указывать при создании объектов хранения. В случае, если длина, например, имени окажется больше такого ограничения, то возможно отсечение части строки, или даже возникновение ошибки базы данных. Оба следствия для нас нежелательны. Второй момент, который хотелось бы отметить – хранение имени и фамилии отдельно. В реальной жизни имя и фамилию могут писать в разном порядке и если полное имя хранить в одной строке, придется предусмотреть описание внутренней структуры. В данном случае обеспечивается правильность обращения к разным частям полного имени. Дата рождения ассоциируется с календарем и связанными с ним задачами. Если хранить ее в виде строки символов, придется предусмотреть средства определения возраста, дня недели, числа дней в текущем месяце и др. В современных базах данных предусмотрены хранение и обработка данных связанных с временем и датой. Характеристика подразумевает наличие некоторого неструктурированного, возможно, довольно длинного текста, заранее определить размер которого затруднительно. В этом случае нужно предусмотреть возможность хранения такой информации. Фотография – в базе данных может храниться не только текстовая информация. Адрес может включать Страну Город Район 6
Улицу Номер дома Квартиру (офис, помещение или ничего) Дополнительную информацию (корпус, цифровые и буквенные дополнения и др.) Наличие страны, города, района подразумевает глобальность системы. Это обстоятельство может служить основанием для ограничения предметной области. Название улицы, кажется, удовлетворяет тем же условиям что и Имя в описании владельца, однако анализ того, сколькими способами может быть записано название, например, «набережная реки Карповки» говорит о том, что название улицы необходимо сверять с некоторым внутренним справочником или списком. Скорее всего, целесообразно такой список выделить в отдельный объект хранения. В противном случае не совсем ясно, как система узнает, что «реки Карповки набережная» и «наб. Карповки» являются одним и тем же. Это обстоятельство показывает нам, что выбранная в начале структура может изменяться в процессе более детального описания системы. Выбирая способ хранения номера дома следует учитывать, какие задачи с его помощью придется решать – если только идентификацию – можно хранить как строку символов, если нужно выяснить на четной или нечетной стороне стоит дом (например, для набережных это может быть существенным) – лучше его представлять целым числом. О телефонном номере можно хранить следующую информацию Собственно номер Имя провайдера Конечно, о телефонном номере можно хранить гораздо больше информации, но и эта информация позволяет проиллюстрировать очередные проблемы, которые необходимо учитывать и разрешать. Сам номер обычно представляет из себя последовательность цифр фиксированной длины (в отличие от имени и фамилии) но не является числом, с которым можно осуществлять различные арифметические операции. Целесообразно хранить его как текстовую строку, однако необходимо следить, чтобы в ней не встречались буквы, число цифр соответствовало. Имя провайдера полезно хранить, если мы хотим иметь возможность определения, к каким сетям принадлежат номера, что может отразиться на цене звонка. Организация 7
Можно ограничится только названием, однако к нему относится все то, что сказано о хранении названий улиц С точностью до выяснения того, как организовать список улиц, наши объекты хранения можно изобразить следующим образом Владелец телефона
Телефонный номер
Организаци я
Фамилия Имя Дата рождения Характеристика
Номер Имя провайдера
Название
Телефонный номер
Владелец телефона
Адрес
Провайдер
Организация
Улица
Адрес Улицу Номер дома Квартира Доп. инф
1.4. Описание идентифицирующих атрибутов (ключей) Объекты необходимо различать. Это можно сделать, анализируя содержимое всех свойств объектов хранения, а можно ограничиться только несколькими свойствами, относительно которых придется сделать замечание об уникальности. Самым простым способом является введение независимого атрибута, который ни у одного из хранимых объектов одного типа не повторяются. Такой подход позволит, например, правильно идентифицировать улицу, даже если ее название изменилось
1.5. Описание связей между объектами Кроме хранения информации об объектах необходимо учитывать, в каких отношениях они находятся. В реляционных базах данных, представителем которых является MYSQL, связи между объектами реализуются через значения некоторых атрибутов объектов хранения: Например, в объекте Адрес может храниться значение ключевого атрибута описывающего улицу. Важным является понимание того, где должна храниться связующая информация. Попробуем разобраться, как организовать связи между нашими объектами. Сначала попытаемся визуализировать наши связи
8
Такое изображение говорит нам только о том, какие объекты связаны. Для нас же важно где нужно хранить информацию о связях. Покажем стрелочками, куда должны указывать связи
Телефонный номер
Владелец телефона
Адрес
Провайдер
Организация
Улица
9
Добавленные стрелочки указывают, какой из объектов должен указывать на связанный с ним. Разберемся, как выбирать объекты, которые будут хранить информацию о связях между объектами. У Телефонного номера один Владелец, но у Владельца может быть несколько Телефонных номеров. Это значит, что если информацию о ссылке хранить объектеТелефонный номер, то для него достаточно отвести одно дополнительное поле, содержащее значение ключевого поля объекта Владелец телефона. Если ссылки натобъекты Телефонный номер хранить в объекте Владелец телефона, то либо на каждую ссылку нужно заводить отдельный атрибут, либо хранить в одном поле несколько ссылок (например список , разделенный запятой), и предусмотреть механизм выделения нужной ссылки, что представляется нецелесообразным. Такой тип связи получил название "один-ко-многом". Аналогичная ситуация получается в при организации связи Адреса и Улицы в Адресе указывается одна Улица, но Улица может встречаться в нескольких Адресах. В рассмотренной нами модели предметной области Владелец телефона связывается с одной Организацией, что в других ситуациях может не соответствовать требованиям задачи. Другая ситуация складывается при описании связи Адреса и Владельца телефона. С одним адресом может быть связано несколько Владельцев телефонов - следовательно хранить информацию о связи в объекте Адрес нецелесообразно. С другой стороны Владелец телефона может быть связан с несколькими Адресами, что делает нецелесообразным хранение информации о связях и в объекте Владелец телефона. Такие связи получили название "многие-ко-многим". Решение задачи хранения информации о связях такого типа обычно связано с созданием дополнительного промежуточного объекта хранения, в котором хранится информация об обоих связанных объектах и связь "многие-ко-многим" таким образом заменяется парой связей "один-комногим" Прежде чем изображать получившуюся блок-схему отметим различие между имеющимися связями. Телефон обязательно имеет Владельца, в Адресе обязательно должна быть указана Улица, а вот Владелец телефона может быть не связан ни с одной организацией. И та и другая ситуация требует внимательного отношения при реализации проекта. Изобразим получившуюся блок-схему.
Телефонный номер
Владелец телефона
Провайдер
Организация
Связь Адрес Владелец
Улица
Данную схему данных можно положить в основу создаваемой базы данных. Для осуществления следующего шага дадим объектам и их атрибутам имена, которые могут использоваться при создании базы данных. В качестве сервера базы данных мы будем использовать MySQL. Для имен лучше использовать осмысленные названия, состоящие из одного слова, набранные латинскими буквами. Если предполагается использовать сервер базы данных, работающий в под управлением операционной системы LINUX, то необходимо учитывать и регистр, в котором набираются имена. Сведем полученную нами информацию в таблички Имя объекта: provider Имя атрибута Тип данных атрибута Целое число id_provider Строка переменной provider_na длины me Имя объекта: phone Имя атрибута Тип данных атрибута Целое число id_phone phone_numb Строка фиксированной длины er Целое число id_provider
Дополнительные условия Первичный ключ
Дополнительные условия Первичный ключ Ссылается на первичный ключ объекта provider
Имя объекта: organization Имя атрибута Тип данных атрибута id_organisation orgatisation_name 10
Адрес
Целое число Строка переменной длины
Дополнительные условия Первичный ключ
11
Раздел 2. Создание базы данных
Имя объекта: street Имя атрибута
Тип данных атрибута
id_street street_name
Целое число Строка переменной длины
Имя объекта: address Имя атрибута Тип данных атрибута
Дополнительные условия Первичный ключ Ссылается на первичный ключ объекта street
id_address id_street
Целое число Целое число
house office dop_inf
Целое число Целое число Строка переменной длины
Имя объекта: person Имя атрибута Тип данных атрибута id_person f_name l_name birthday comment id_organisation
Целое число Строка переменной длины Строка переменной длины Дата Текст произвольной длины Целое число
Имя объекта: person_addres_link Имя атрибута Тип данных атрибута Целое число id_link Целое число in_person id_address
Целое число
Дополнительные условия Первичный ключ
Дополнительные условия Первичный ключ
Чтобы установить MySQL на последних версиях Windows, нужно войти в систему на правах администратора. Если в вашей системе уже установлена какая-то версия MySQL, перед установ кой новой версии сервер необходимо остановить. Это можно сделать с помощьк следующей команды: mysqladmin -u root -р shutdown Если MySQL выполняется как сервис, последний необходимо отменить. Это можно сделать из командной строки с помощью команды mysqld —remove Начните установку MySQL с распаковки загруженного вами установочного пакета. В зависимости от времени загрузки, содержимое этого пакета может быт разным. Однако компания MySQL АВ, которая предлагает MySQL, в будущем планирует использовать установщик MSI. Программа установки допускает возможность установки MySQL либо в папку по умолчанию (с:\mysql), либо в другое место. Мы предполагаем, что система MySQL будет установлена в папке по умолчанию. Откройте окно команд и перейдите в ту папку, где размещен сервер MySQL. В стандартной установке это будет папка с: \mysql\bin. Введите команду
Ссылается на первичный ключ объекта organisation
Дополнительные условия Первичный ключ Ссылается на первичный ключ объекта person Ссылается на первичный ключ объекта address
Теперь можно переходить к созданию кода, обеспечивающего генерацию базы данных и ее функциональность.
12
2.1. Установка сервера MySQL в среде Windows
mysqld-max — standalone Ответом должен быть ряд сообщений запуска. Если все окажется в порядке, вы сможете установить MySQL и в виде сервиса. Введите имя исполняемого файла сервера, который вы планируете использовать, за которым должно следовать —install. Например: mysqld-max --install Возможности консоли MySQL Рассмотрим основные возможности монитора MySQL. Подключиться к MySQL можно с помощью команды mysql -и имя_пользователя –р Обратите внимание на то, что эта команда не заканчивает точкой с запятой. Имеется множество команд, которые начинаются знаком \ (обратная
13
косая черта). Ни одной из них не нужна в конце точка с запятой. Список этих команд можно получить, набрав команду \h (Буква h здесь является сокращением от английского слова help — помощь.) Подключившись к консоли MySQL, можно выполнить файл команд с помощью команды source имя_файла Если вы еще не вошли в программу консоль, файл команд можно выполнить, используя возможность переадресации файлов. Например: mysql -и имя_пользователя -р < имя_файла Использование пакетного файла позволяет подготовить развертывание работоспособной системы в кратчайшие сроки. После входа в систему вы сможете выяснить, какие базы данных существуют в системе, используя команду SHOW: show databases; Список, показанный системой на этой стадии, окажется довольно коротким: вы увидите только базу данных, названную mysql. Это системная база данных, содержащая информацию об учетных записях пользователей и привилегиях. Из появившегося списка вы можете выбрать базу данных и ввести use имя_базы_данных; Эта команда сообщает MySQL о том, с какой конкретной базой данных вы хотите работать. Выберите базу данных и введите соответствующую команду. (Возможно, у вас недостаточно прав, чтобы выбрать любую из имеющихся баз данных. Если вы получите соответствующее сообщение, выберите другую базу данных и пробуйте снова.) Выбрав базу данных, можно увидеть, какие таблицы она содержит, если набрать show tables; Получить информацию о конкретной таблице можно с помощью команды describe имя_таблицы; Выйти из программы монитора можно с помощью команды /q
2.2. Создание базы данных и основных таблиц Рассмотрим процесс создания базы данных и таблицы в MySQL. Сначала сделаем предварительные замечания. Чувствительность к регистру Поскольку мы только начинаем использовать SQL и создавать идентификаторы MySQL, необходимо сказать несколько слов о чувствительности к регистру. Ключевые слова SQL не зависят от регистра. Это является стандартом в системах баз данных. Чувствительность к регистру для идентификаторов зависит от системы баз данных, которую вы используете. В MySQL чувствительность к регистру для имен баз данных и таблиц зависит от операционной системы, в которой вы работаете. Причина в том, что каждая база данных будет размещаться в определенном каталоге, а каждая таблица — в определенном файле операционной системы. Имена каталогов и файлов в различных операционных системах подчиняются разным правилам. На практике это означает, что при работе в Windows имена баз данных и таблиц не будут зависеть от регистра, но если вы используете операционную систему типа Unix, они будут зависеть от регистра. Это может стать источником некоторых недоразумений, особенно если учесть, что, например, в MacOS X имеется возможность сделать файловую систему как не различающей регистр (HFS+, принято по умолчанию), так и различающей регистр (UFS). Чтобы избежать путаницы, удобно считать все идентификаторы зависимыми от регистра, даже при работе в Windows. Это позволит по необходимости без особых усилий перенести базу данных на другую платформу. Либеральное использование двух форм одного идентификатора (например, Employee и employee), кроме того, создает неудобства при чтении кода, поэтому такую идею вряд ли можно назвать хорошей. Идентификаторы в MySQL Идентификатор — это имя псевдонима, базы данных, таблицы, столбца или индекса. С его помощью вы уникальным образом идентифицируете соответствующий объект. Прежде чем создавать базы данных и таблицы, мы должны выяснить, какие идентификаторы допустимы в MySQL. Вообще говоря, в идентификаторах допускается использовать любые символы, с учетом следующих исключений. ■ Они не должны содержать кавычек, а также символов ACSII(O) и ASCII(255).
14
15
■ Имена баз данных могут содержать любые символы, допустимые для имен каталогов, но, по очевидным причинам, не должны содержать символы, имеющие для каталогов специальное значение (это /, \ и .) . ■ Имена таблиц могут содержать любые символы, допустимые для имен файлов, за исключением символов . и /. Все идентификаторы, кроме имен псевдонимов, могут содержать до 64 символов. Имена псевдонимов могут содержать до 255 символов. Одно странное правило об идентификаторах в MySQL гласит, что вы можете использовать в качестве идентификаторов зарезервированные слова, если заключите их в кавычки. Например, можно создать таблицу с именем TABLE. Конечно, существование такой возможности не означает, что вы должны ее использовать. Как раз наоборот — такой практики лучше избегать. Даже если это не смущает вас при работе с системой, это может "смутить" программу mysqldump, часто используемую для резервирования данных. Имеется короткий список зарезервированных слов, которые MySQL позволяет использовать в качестве идентификаторов без кавычек. Это противоречит стандарту ANSI для SQL, но является довольно распространенной практикой.
Создание таблиц Для создания таблиц в базе данных employee используется оператор SQL CREATE TABLE. В своей типичной форме этот оператор выглядит так: create table имя_таблицы (определение таблицы) [type=тип_таблицы]; Как видите, необходимо начать со слов create table (создать таблицу), за которыми должно следовать имя таблицы, а затем указать некоторый набор определений для столбцов. В конце оператора можно указать тип механизма хранения данных, который мы предпочитаем использовать. Пример создания таблицы drop database if exists phones; create database phones; use phones;
Создание базы данных После разработки структуры было бы логично сообщить MySQL о том, что мы хотим создать новую базу данных. Это делается с помощью оператора SQL CREATE DATABASE: create database phones; Убедиться в том, что этот оператор выполнил свою задачу, можно с помощью команды show databases; Выбор базы данных Прежде чем получить возможность создавать таблицы или делать что-то иное с нашей новой базой данных employee, мы должны сообщить MySQL, что хотим работать с этой базой данных. Для этого используется оператор use: use phones; Теперь база данных» phones сделана текущей, и все действия, которые мы будем предпринимать в дальнейшем, по умолчанию будут применяться именно к этой базе данных.
16
create table street ( id_street int not null auto_increment primary key, street_name varchar( 2 0 ) ) type=InnoDB;
Прокомментируем приведенные операторы drop database if exists phones; Этот оператор проверит, существует ли база данных phones, и, если эти так, удалит ее, так сказать, избавив вас от всех прежних обязательств. Это делать не обязательно и может быть в некоторых случаях даже опасно, но здесь мы это делаем, чтобы убедиться в работоспособности нашего сценария создания базы данных даже в том случае, если вы уже экспериментировали с базой данный phones. После этого мы создаем базу данных и выбираем ее для использования: create database phones; use phones;
17
Теперь начнем создание таблиц внутри только что созданной базы данных. Сначала создадим таблицу street (отделы): create table street ( id_street int not null auto_increment primary key, street_name varchar( 2 0 ) ) type=InnoDB; Эта таблица содержит два столбца — id_street, который будет первичным ключом, и street_name . Для определения столбцов таблицы используется список разделенных запятыми деклараций заключенный в скобки. Обратите внимание на то, что атрибуты столбцов не разделяются запятыми, — разделяются только сами столбцы. Это — наш первый многострочный оператор SQL. Число пробелов в SQL не имеет значения, поэтому мы можем компоновать наши запросы как нам нравится. В операторах CREATE, как правило, в каждой строке размещается о, элемент, чтобы оператор было удобнее читать. Интерпретатор SQL не будет интерпретировать ваш оператор до тех пор, пока вы не напечатаете завершающую точку с запятой (;) и не нажмете клавишу <Enter>. В этой таблице мы декларируем создание двух столбцов. Каждая декларация столбца начинается с указания имени столбца, за которым следует информации о типе этого столбца. Давайте сначала разберемся с определением второго столб таблицы, поскольку оно проще. Декларация street_name varchar(20) сообщает нам, что именем столбца будет street_name и что он будет иметь тип varchar (20). Тип b — это строка переменной длины, в данном случае до 20 символов. Можно было бы использовать char, т.е. строки фиксированной длины. Теперь вернемся к определению первого столбца. Оно выглядит так: id_street int not null auto_increment primary key, Именем столбца является id_street, а его типом — int (целое). Это — уникальный номер, который мы будем использовать для идентификации улиц. После типа указана некоторая дополнительная информация о столбце. Сначала указано, что этот столбец не должен быть пустым — not null , — это значит, что для всех строк таблицы в этом столбце должно быть указано некоторое значение. Затем мы указали, что столбец должен быть типа auto_increment. Это — очень удобная возможность в MySQL. Если при добавлении данных в эту таблицу мы не укажем номер отдела, MySQL поместит в соответствующий столбец уникальный номер, который окажется следующим в последовательности auto_ increment. Это облегчит нам жизнь. 18
Наконец, мы указываем, что этот столбец должен быть первичным ключом нашей таблицы (primary key). Если первичный ключ состоит из одного столбца, мы можем указать его так, как это сделано здесь. Для первичных ключей, состоящих из нескольких столбцов, необходимо использовать другой подход. Итак, таблица определена. Теперь посмотрим на завершающую часть этого оператора SQL. После закрывающей скобки вы видите следующее: type=InnoDB Это выражение говорит о том, что таблица должна использовать механизм хранения InnoDB. Что это значит? MySQL поддерживает различные механизмы хранения данных. Типом, используемым по умолчанию, является MylSAM. Если бы мы хотели использовать таблицы MylSAM, нам не нужно было бы добавлять определение типа в конце оператора create table. Здесь указан тип InnoDB, поскольку в некоторых примерах мы собираемся, использовать внешние ключи. Механизм InnoDB поддерживает внешние ключи! и транзакции, a MylSAM — нет. Таблицы типа MylSAM часто работают быстрее, чем таблицы InnoDB. Поэтому для каждой таблицы нужно решить, какой тип! будет для нее лучшим. create provider ( id_provider int not null auto_increment primary key, provider _name varchar( 2 0 ) ) type=InnoDB; create table organization ( id_organisation int not null auto_increment primary key, orgatisation_name varchar( 1 2 0 ) ) type=InnoDB; create address ( id_address int not null auto_increment primary key, id_street int, house int, office _ int, dop_inf varchar( 2 0 ) ) type=InnoDB; create table person ( id_ person int not null auto_increment primary key, f_name varchar( 2 0 ) , l_name _name varchar( 2 0 ) , birthday date, comment text, id_organisation int) type=InnoDB; 19
create table phone ( id_phone int not null auto_increment primary key, phone_number char( 1 2 ) id_provider int) type=InnoDB; create table person_addres_link ( id_link int not null auto_increment primary key, id_organisation int) type=InnoDB; Определения остальных таблиц не содержат новых элементов синтаксиса, поэтому мы не будем разбирать их подробно. Корректность установок таблиц в вашей базе данных можно проверить с помощью команды show tables; В результате вы получите следующий вывод: I---------------------------------- + I Tables_in_phones | + -----------------------------------------+ | I address I I organization I I person | I person_addres_link I I phone I I provider I street I + ---------------------------------------- + Более пространную информацию о структуре каждой таблицы можно получить с помощью команды describe, например: describe street;
Оператор CREATE TABLE Теперь, после того как мы изучили пример, рассмотрим полный синтаксис оператора CREATE TABLE. В руководстве по MySQL приводится следующая общая форма этого оператора:
20
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] имя_таблицы l (определение_сгеа1е, ...)] [опции_таблицы] [onepaTop_select] или CREATE [TEMPORARY] TABLE [IF NOT EXISTS] имя_таблицы LIKE имя_старой_таблицы; определение__сгеаЬе: имя_столбца тип [NOT NULL | NULL] [DEFAULT значение] [AUTO_INCREMENT] [PRIMARY KEY] [определение_ссылки] или PRIMARY KEY (имя_столбца_индекса, ...) или KEY [имя_индекса] (имя_столбца_индекса,...) или INDEX [имя_индекса] (имя_столбца_индекса, ...) или UNIQUE [INDEX] [имя_индекса] (имя_столбца_индекса,...) или FULLTEXT [INDEX] [имя_индекса] (имя_столбца_индекса, ...) или [CONSTRAINT символ] FOREIGN KEY [имя_индекса] (имя_столбца__индекса, . . .) [определение_ссылки] или CHECK (выражение) Рассмотрим опции, указанные в этой общей форме. Ключевое слово TEMPORARY используется для создания таблиц, которые будут существовать только в текущем сеансе работы с базой данных и которые будут автоматически удалены, когда сеанс завершится. При использовании выражения IF NOT EXISTS таблица будет создана только в том случае, если еще нет таблицы с указанным именем. Выражение LIKE имя_старой_таблицы можно использовать для того, чтобы создать новую таблицу с такой же схемой, как у таблицы имя_старой_ таблицы. В скобках оператора CREATE TABLE мы объявляем столбцы, указываем их типы и другую информацию о структуре таблицы. Самое простое определение столбца состоит из его имени и типа. В следующем разделе мы рассмотрим типы, допустимые для столбцов. В определение столбца можно также добавить следующие элементы. ■ Объявить для любого столбца либо NOT NULL, либо NULL, и это значит, что столбцу или не позволено содержать значения NULL (NOT 21
NULL), или позволено (NULL). По умолчанию столбцам разрешается содержать значения NULL.
■ Выражение FOREIGN KEY позволяет объявлять внешние ключи точно так же, как и первичные.
■ Объявить для столбца значение по умолчанию, используя ключевое слово DEFAULT, за которым должно следовать значение, которое мы хотим использовать по умолчанию.
После закрывающей скобки можно указать некоторые дополнительные характеристики таблицы. Одной из таких характеристик, как вы уже знаете, является тип таблицы. Типы таблиц будут обсуждаться подробно в главе 9. Если не указать тип, создаваемая таблица по умолчанию будет таблицей MylSAM. Ниже приводятся допустимые значения для типов таблиц.
■ Использовать ключевое слово AUTO_INCREMENT, как в предыдущем примере, чтобы генерировать порядковый номер. Автоматически генерируемое значение будет на единицу большим, чем текущее наибольшее значение в таблице. Первая введенная в таблицу строка будет иметь порядковый номер 1. В каждой таблице разрешается иметь не более одного столбца AUTO_INCREMENT, и он должен индексироваться. Как вы увидите позже, в предыдущих примерах мы не создавали никаких индексов вручную, однако они были автоматически созданы для нас. Индексы автоматически создаются для столбцов, объявленных как PRIMARY KEY, а такими были все столбцы AUTO_INCREMENT в нашем примере. ■ Объявить столбец первичным ключом таблицы с помощью выражения PRIMARY KEY. ■ Объявить столбец внешним ключом, используя, как в предыдущем примере, выражение REFERENCES. Кроме имен столбцов и их типов, в этой части оператора CREATE TABLE можно объявить и другую информацию о столбцах. ■ Чтобы создать первичный ключ, состоящий из нескольких столбцов, как в примере, необходимо указать выражение PRIMARY KEY, за которым следуют имена столбцов, формирующих этот ключ. Точно так же можно объявить и первичный ключ, состоящий из одного столбца. Столбец PRIMARY KEY является уникальным индексированным столбцом, который не может содержать значения NULL. ■ INDEX и KEY являются синонимами и означают, что указанные столбцы (столбец) будут индексированы. Обратите внимание, эти столбцы не обязательно должны содержать уникальные значения в MySQL. ■ UNIQUE может использоваться для указания того, что соответствующий столбец должен содержать уникальные значения. Столбцы UNIQUE тоже будут индексированы. ■ FULLTEXT используется для создания полнотекстовых индексов на основе столбцов типа TEXT, CHAR или VARCHAR. Полнотекстовые индексы можно использовать только с таблицами MylSAM. Соответствующий пример приведен в главе 9, "Типы таблиц MySQL". 22
■ MylSAM, принимается по умолчанию. Таблицы этого типа работают очень быстро и поддерживают полнотекстовую индексацию. Этот тип заменил предыдущий стандартный тип ISAM. ■ ISAM является старым типом таблиц. Подобен MylSAM, но с меньшими возможностями, поэтому вместо него всегда следует использовать MylSAM. ■ InnoDB является ACID-совместимым механизмом хранения, обеспечивающим поддержку транзакций, внешних ключей и блокировки на уровне строк. ■ BDB (Berkeley DB) является механизмом хранения, который обеспечивает поддержку транзакций и блокировки на уровне страниц. ■ Таблицы HEAP целиком хранятся в памяти и никогда не записываются на диск, поэтому они работают очень быстро, но ограничены в размерах и не допускают возможности восстановления в случае отказа системы. ■ Таблицы MERGE позволяют объединить несколько таблиц MylSAM с одной структурой, чтобы к ним можно было направлять запросы как к одной таблице. Это можно использовать для того, чтобы обойти ограничения операционной системы на максимальный размер файлов, а следовательно, и таблиц. Можно указать и другие опции для таблицы. Они не обязательны и используются по большей части для оптимизации. Некоторые из них будут обсуждаться в главе 18, "Оптимизация базы данных". Вот перечень этих опций. ■ AUTO_INCREMENT = # Позволяет установить начальное значение auto_ increment, отличное от 1. ■ AVG_ROW_LENGTH = # Позволяет указать оценку для средней длины строки, чтобы помочь механизму хранения. ■ CHECKSUM = 1 Позволяет включить вычисление контрольной суммы для строк таблицы, что может помочь обнаружить проблему при повреждении таблицы. Чтобы включить вычисление контрольной суммы, укажите значение 1. По умолчанию эта опция выключена и работает только с таблицами MylSAM. 23
■ COMMENT = " строка" Сохраняет комментарий для этой таблицы.
Столбцы и типы данных в MySQL
■ MAXJROWS = # Задает максимальное число строк, которые будут храниться в таблице. ■ MIN_ROWS = # Задает минимальное число строк, которые будут храниться в таблице.
В MySQL имеются три основных типа столбцов: числовые, текстовые или строки, а также даты и времени. Мы рассмотрим все их по порядку.
■ PACK_KEYS = { 0 | 1 | DEFAULT} По умолчанию MySQL упаковывает (сжимает) строки в ключах. Если указать значение 1, все ключи будут упакованы, а если указать 0, никакие ключи упаковываться не будут. ■ PASSWORD = "строка" В стандартной версии MySQL не выполняет ничего. DELAY_KEY_WRIТЕ = { 0 | 1} Позволяет отложить обновление ключей до того, как таблица будет закрыта. Работает только с таблицами MylSAM. ■ ROW_FORMAT = {default | dynamic | fixed | compressed} Позволяет указать формат хранения для строк. Работает только с таблицами MylSAM. ■ RAID_TYPE = {1 I STRIPED | RAIDO} RAID_CHUNKS=# RAID_ CHUNKS I ZE=# Позволяет указать конфигурацию RAID с целью оптимизации. ■ UNION = (имя_таблицы, [имя_таблицы. . . ] ) Касается только таблиц MERGE и позволяет указать таблицы, которые должны быть частью MERGE. ■ INSERT METHOD = {NO | FIRST | LAST} Касается только таблиц MERGE и позволяет указать таблицу, в которую должны добавляться данные. ■ DATA DIRECTORY-полный путь к каталогу" Позволяет указать место, где должны храниться данные таблицы. ■ INDEX DIRECTORY-полный путь к каталогу" Позволяет указать место, где должны храниться индексы таблицы. Наконец, если снова обратиться к общей форме оператора CREATE TABLE, можно заметить, что оператор CREATE TABLE можно завершить выражением SELECT. SELECT является оператором SQL, используемым для извлечения строк из одной или нескольких таблиц. (Он обсуждается в главах 6-8.) Можно использовать это выражение для того, чтобы заполнить новую таблицу данными, возвращаемыми оператором SELECT.
24
Числовые типы Числовые типы столбцов используются для хранения чисел. В нашем примере мы использовали типы int (целое число) и float (число с плавающей запятой). Они представляют два подтипа числовых типов: точные числовые типы и приближенные числовые типы. Числовые типы могут характеризоваться максимальной длиной, М, а типы с плавающей запятой — числом десятичных разрядов, D. Эти значения указываются сразу после объявления типа, например: salary decimal(10, 2) Здесь указаны длина 10 и два знака после десятичного разделителя. Можно не использовать никаких параметров вообще и указать только общую длину или же указать как длину, так и число десятичных разрядов. Объявления числовых типов можно также завершать ключевыми словами UNSIGNED и (или) ZEROFILL. Ключевое слово UNSIGNED указывает, что столбец содержит только положительные числа или нули. Ключевое слово ZEROFILL означает, что число будет отображаться с ведущими нулями. Более подробно указанные типы обсуждаются ниже. NUMERIC или DECIMAL Эти типы идентичны, a DECIMAL можно также сократить до DEC. Эти типы используются для хранения точных значений с плавающей запятой и обычно используются для того, чтобы запоминать денежные значения. Они имеют тот же диапазон, что и числа с плавающей запятой двойной точности. INTEGER и его вариации INTEGER можно сократить до INT. Это — стандартное целое число, занимающее 4 байта, с диапазоном из возможных значений. Существует также несколько вариаций INT. ■ TINYINT занимает 1 байт (28 возможных значений). Синономами TINYINT являются BIT и BOOL. ■ SMALLINT занимает 2 байта (216 возможных значений). ■ MEDIUMINT занимает 3 байта (224 возможных значений).
25
■ BIGINT занимает 8 байтов (264 возможных значений). Ниже обсуждаются приближенные числовые типы. FLOAT Это — числа с плавающей запятой с обычной точностью. Они могут представлять положительные числа в диапазоне 1,18х 10~38-3,40х 1038 и аналогичный диапазон отрицательных чисел. DOUBLE Это — числа с плавающей запятой с двойной точностью. Синонимами DOUBLE являются REAL и DOUBLE PRECISION. Они могут представлять положительные числа в диапазоне 2,23 х 10~308-1,80х 10308 и аналогичный диапазон отрицательных чисел. Текстовые типы и строки MySQL поддерживает различные текстовые типы и строки. Основными из них являются CHAR, VARCHAR, TEXT, BLOB, ENUM и SET. Мы рассмотрим каждый из этих типов по очереди. CHAR Тип CHAR используется для хранения строк фиксированной длины. Как и в рассмотренном выше примере создания базы данных employee, после ключевого слова CHAR обычно указывается длина строки, например CHAR (20). Если не указать длину, вы получите CHAR (1) . Максимальная длина значения типа CHAR — 255 символов. При сохранении значений типа CHAR им всегда будет выделяться длина, указанная вами в декларации. Для этого оставшееся в столбце место будет заполнено пробелами. При извлечении содержимого столбца типа CHAR автоматически добавленные пробелы отбрасываются. Очевидно, что хранение строк типа CHAR потребует больше места на диске, чем хранение таких же строк переменной длины. Преимущество состоит в том, что из столбцов фиксированной длины (из столбцов типа CHAR, NUMERIC или DATE) данные извлекаются быстрее. Часто скорость оказывается более важным параметром, чем дисковое пространство, поэтому с точки зрения оптимизации бывает выгоднее использовать тип CHAR для текстовых полей, не подверженных большим вариациям. Перед CHAR (как и перед VARCHAR) можно указать ключевое слово NATIONAL, чтобы ограничить содержимое столбца соответствующим стандартным набором символов. В MySQL оно используется по умолчанию,
26
так что вам это ключевое слово может потребоваться только для кроссплатформенной совместимости. После CHAR и VARCHAR можно добавить ключевое слово BINARY, означающее необходимость учета регистра символов при сравнении строк. По умолчанию при сравнении строк регистр символов игнорируется. VARCHAR Тип VARCHAR предназначен для хранения строк переменной длины. После указания типа в скобках указывается длина, например VARCHAR (10). Допускаются значения от 0 до 255. TEXT, BLOB и их вариации Типы TEXT используются для хранения более длинных фрагментов текста, чем допускается типами CHAR и VARCHAR. Аббревиатура BLOB означает Binary Large Object (большой двоичный объект). Эти типы одинаковы, за исключением того, что тип BLOB предназначен для хранения двоичных данных, а не текста. Сравнение значений типа BLOB зависят от регистра символов, а значений TEXT — нет. Оба типа имеют переменную длину и оба предлагаются в разных размерах. ■ TINYTEXT и TINYBLOB могут хранить до 255 (это 28 - 1) символов или байтов. TEXT и BLOB могут хранить до 65535 (216 - 1) символов или байтов (64 Кбайт). ■ MEDIUMTEXT и MEDIUMBLOB могут хранить до 16777215 (224-1) символов или байтов (16 Мбайт). ■ LONGTEXT и LONGBLOB могут хранить до 4294967295 (232 - 1) символов или байтов (4GB). ENUM Этот тип позволяет перечислить набор возможных значений. Каждая строка может содержать одно значение из перечисленного набора. Декларация типа ENUM выглядит следующим образом: gender enumf'm',
'f')
Данный тип допускает также значение NULL, так что возможными значениями gender будут m, f, NULL или error (ошибка). SET Тип SET (набор) подобен типу ENUM за исключением того, что в данном случае строки могут содержать набор значений из множества перечисленных. 27
Типы даты и времени MySQL поддерживает различные типы даты и времени, которые обсуждаются ниже. DATE Тип DATE предназначен для хранения дат. MySQL ожидает получить дату в стандартной форме ISO (год-месяц-день), а не в трансатлантических ее вариантах. Отображаются значения даты в виде ГГГГ-ММ-ДД. TIME Этот тип предназначен для хранения значений времени, отображаемых в виде ЧЧ:ММ:СС. DATETIME Это — комбинация предыдущих двух типов. Формат ее следующий: ГГГГ-ММ-ДД ЧЧ:ММ:СС. TIMESTAMP Это — очень полезный тип столбца. Если в соответствующем столбце строки вы не укажете конкретное значение или NULL, там будет записано время, когда соответствующая строка была создана или в последний раз изменена. Извлекаемое значение TIMESTAMP будет отображаться в формате DATETIME. Здесь имеется существенное различие между MySQL 4.0 и 4.1. Раньше вы могли установить ширину значения при объявлении столбца типа TIMESTAMP. YEAR Этот тип предназначен для хранения значений года. При объявлении столбца этого типа можно объявить его как YEAR (2) или YEAR (4) , чтобы указать число знаков. По умолчанию используется YEAR (4 ). YEAR (2) представляет значения с 1970 по 2069. Изменение структуры таблиц Кроме создания и удаления таблиц, бывает нужно изменить структуру уже существующей таблицы. Это можно сделать с помощью оператора ALTER TABLE. Оператор ALTER TABLE имеет очень много вариантов, которые можно использовать для изменения структуры таблиц. Например, можно создать индекс name для таблицы employee следующим образом: alter table street add 28
index name (street_name); Оператор ALTER TABLE является исключительно гибким, поэтому он имеет огромное множество дополнительных ключевых слов. Общая форма оператора из руководства по MySQL выглядит так: ALTER [IGNORE] TABLE имя_таблицы спецификация_а11ег [, спецификация_а1Ьег . . . ] спецификация_а1ter: ADD [COLUMN] определение_сгеаЬе [FIRST I AFTER имя_столбца] или ADD [COLUMN] (определение_сгеаЬе, определение_сгеаЬ е, ...) или ADD INDEX [имя_индекса] (имя_столбца_индекса, ...) или ADD PRIMARY KEY (имя_столбца_индекса, . . . ) или ADD UNIQUE [имя__индекса] (имя_столбца_инде кса, . . . ) или ADD FULLTEXT [имя_индекса] (имя_столбца_индекса,...) или ADD [CONSTRAINT символ] FOREIGN KEY [имя_индекса] (имя_столбца_индекса,...) [определение_ссылки] или ALTER [COLUMN] имя_столбца {SET DEFAULT литерал | DROP DEFAULT} или CHANGE [COLUMN] старое_имя_столбца определение_сгеаЬе [FIRST I AFTER имя_столбца] или MODIFY [COLUMN] определение_сгеаЬе [FIRST I AFTER имя_столбца] или DROP [COLUMN] имя_столбца или DROP PRIMARY KEY или DROP INDEX имя_индекса или
29
DISABLE KEYS или ENABLE KEYS или RENAME [TO] новое_имя_таблицы или ORDER BY имя_столбца или опции_таблицы Большинство из этих вариантов самоочевидны или соответствуют выражениям оператора CREATE TABLE (как, например, ADD PRIMARY KEY). Мы вкратце обсудим лишь те опции, которые не кажутся очевидными. Выражения CHANGE и MODIFY означают одно и то же: они позволяют изменить определение столбца или его место в таблице. DROP COLUMN удаляет столбец из таблицы, тогда как DROP PRIMARY KEY и DROP INDEX удаляют только индекс, связанный с указанным столбцом. Выражение DISABLE KEYS заставляет MySQL остановить обновление индексов для таблицы MylSAM, а выражение ENABLE KEYS снова включает обновление индексов. Использование INSERT Оператор SQL INSERT используется для добавления строк в таблицы. Его изучение мы начнем с примера. Вы можете ввести приведенные ниже операторы непосредственно в монитор MySQL или в файл или загрузить соответствующий файл с Web-узла книги. Все из приведенных здесь операторов INSERT очень похожи. Сначала рассмотрим первый из них, чтобы понять, как он работает: insert into street values (1, 'Адмиралтейский пр'); insert into street values (2, 'Владимирский пр'); insert into street values (3, 'Невский пр'); insert into street (id_street, street_name ) values (null, 'Рентгена ул.'); insert into street (street_name, id_street)values ('Средний пр', null); insert into street (street_name ) values ('Университетская наб.'); 30
Ввиду того, что столбец является столбцом auto_increment, мы можем либо указать значение столбца сами, либо позволить MySQL вычислить его для нас. (Обычно выбор подходящего значения можно оставить на усмотрение MySQL, но иногда требуется указать конкретное значение, как это сделано здесь.) В строках Отдел кадров и Отдел маркетинга, как видите, в качестве значения id_street оставлено NULL. Это заставит параметр auto_ increment сделать свое дело, выбрав для столбца подходящее значение. Чуть позже вы увидите, что получится в результате выполнения этого оператора INSERT. I Если вы посмотрите на приведенные здесь операторы INSERT, то увидите, 1 что при добавлении данных типа строки или даты эти данные помещаются в одинарные кавычки, например ' Отдел проектирования1. Если же вставляемые данные являются числовыми, кавычки использовать не следует. Но если помещать данные в кавычки, то что делать, когда сами данные содержит кавычки? Тогда перед одинарной кавычкой необходимо поместить обратную косую черту (\), например ' Д\' Артаньян'. Очевидно, здесь возникает новый вопрос: "Что делать, если необходимо поместить в данные обратную косую черту, не придавая ей какого-либо специального значения?" Тогда необходимо точно так же разместить обратную косую черту перед этой обратной косой чертой, т.е. заменить обратную косую черту двумя (\\). Извлекают данные из базы данных с помощью оператора SELECT. Мы изучим оператор SELECT достаточно исчерпывающе ниже. Здесь же вам нужно знать, что, напечатав select * from имя_таблицы; вы получите все данные, которые в настоящий момент хранятся в таблице.
2.3. Создание тестовых данных При разработки сколько-нибудь значительной информационной системы всегда встает вопрос о правильности работы базы данных. Для того, чтобы быть уверенным в том, что разработанная база правильно отражает предметную область, необходимо создать массив данных, на котором можно проверить работоспособность всех компонентов системы. Так как возможны ошибки при первоначальном создании управляющих операторов, то вероятность краха системы оказывается достаточно велика, более того, при тестировании системы специально могут создаваться нештатные ситуации 31
для проверки устойчивости и надежности всей системы. Для того, чтобы не делать одну и ту же работу несколько раз, необходимо создать набор SQLоператоров, которые генерируют не только структуру базы данных, но и заносят в нее тестовые данные. Такой набор операторов полезно использовать и при планировании миграции базы данных с одного сервера на другой.
Раздел 3. Создание SQL-операторов, реализующих регламентированные запросы 3.1. Создание запросов на выборку данных Извлекаются данные из базы данных при помощи оператора SELECT. Общая форма оператора SELECT выглядит так: SELECT столбцы FROM таблицы [WHERE условия] [GROUP BY группа [HAVING групповые_условия]] [ORDER ВУ сортировка_столбцов] [LIMIT пределы];
Это — не исчерпывающий синтаксис оператора SELECT. Полное его описание приводится в следующей главе, но приведенная здесь форма дает общее представление о форме оператора. В этой главе будут рассмотрены только указанные опции. Оператор SELECT имеет много опций. Их можно использовать или не использовать, но они должны указываться именно в том порядке, в каком они приведены здесь. При разработке запросов к базе даны, реализующих «бизнес-логику» предметной области, следует опираться на описание информационных запросов, которые мы делали в начале. Рассмотрим этот процесс на примере Простой пример Получить содержимое таблица : phone. Эта задача решается при помощи следующего оператора Select * from : phone Не всегда требуется вся информация, хранящяяся в таблице – в этом случае используется указание списка выводимых столбцов. Например запрос Получить список телефонов и соответствующих им внутренних кодов будет выглядеть следующим образом.. Select id_phone, phone_number from : phone 32
33
С другой стороны, часто требуется полная информация, касающаяся конкретной записи, Например, получить информацию о конкретном телефоне Select * from : phone where phone_number = ‘номер_телефона’ Часто требуется получить данные, хранящиеся в связанных таблицах. В этом случае в операторе SELECT указывается полный список таблиц, участвующих в связи, имена требующихся столбцов могут предваряться именем таблицы, из которой они выбираются. Эта ситуация возникает тогда, когда в участвующих в связи таблицах присутствуют столбцы с одинаковыми именами Например – получить список телефонов, связанных с конкретным пользователем. Для написания этого запроса обратимся к схеме базы данных, которую мы приводили вначале. Получаем
Содержание Введение ............................................................................................................ 3 Раздел 1. Постановка задачи и ограничение предметной области........ – 1.1. Введение: Описание решаемых задач................................................. – 1.2. Описание предметной области ............................................................ 4 1.2. Описание информационных запросов ................................................ 5 1.3. Описание объектов хранения............................................................... – 1.4. Описание идентифицирующих атрибутов (ключей) ......................... 8 1.5. Описание связей между объектами..................................................... – Раздел 2. Создание базы данных................................................................ 13 2.1. Установка сервера MySQL в среде Windows ..................................... – 2.2. Создание базы данных и основных таблиц ...................................... 15 2.3. Создание тестовых данных ................................................................ 31 Раздел 3. Создание SQL-операторов, реализующих регламентированные запросы .................................................................... 33 3.1. Создание запросов на выборку данных........................................ –
Select phone_number from : phone, person where person .id_ person = phone.id_ person and f_name=’ l_name’ and l_name =’ фамилия’
34
35