МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ имени ШАКАРИМА г. СЕМЕЙ Документ СМК 3 уровня УМК Учебно-методические Редакция рекомендации №1 от 28.08.2013 г. “Клиент-серверные УМКД 042-14-02приложения с использованием 03.1.20.9/03 баз данных ” УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС ДИСЦИПЛИНЫ «Клиент-серверные приложения с использованием баз данных» для специальности 5В070400 «Вычислительная техника и программное обеспечение» УЧЕБНО-МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ Семей 2013 Лекции Лекции – форма учебного занятия, цель которого состоит в рассмотрении теоретических вопросов излагаемой дисципоины в логически выраженной форме. Обучающийся обязан перед лекцией изучить материал предусмотренный планом лекции, подготовить вопросы к преподавателю. На лекционных занятиях излагаются основные понятия и методы организации реляционных баз данных и манипулирования ими. Вводится понятие реляционной модели данных, обсуждаются структурная, манипуляционная и целостная составляющие модели. Обсуждаются важные аспекты теории баз данных, связанные с функциональными зависимостями. , а также описываются базовые подходы к проектированию реляционных баз данных. Описываются процесс проектирования реляционных баз данных на основе принципов нормализации, а также подходы к проектированию реляционных баз данных с использованием диаграммных семантических моделей данных. Глоссарий База данных (БД, database) - поименованная совокупность структурированных данных, относящихся к определенной предметной области. Предметная область - некоторая часть реально существующей системы, функционирующая как самостоятельная единица. Полная предметная область может представлять собой экономику страны или группы союзных государств, однако на практике для информационных систем наибольшее значение имеет предметная область масштаба отдельного предприятия или корпорации. Система управления базами данных (СУБД) - комплекс программных и языковых средств, необходимых для создания и модификации базы данных, добавления, модификации, удаления, поиска и отбора информации, представления информации на экране и в печатном виде, разграничения прав доступа к информации, выполнения других операций с базой. Реляционная БД - основной тип современных баз данных. Состоит из таблиц, между которыми могут существовать связи по ключевым значениям. Таблица базы данных (table) - регулярная структура, которая состоит из однотипных строк (записей, records), разбитых на столбцы (поля, fields). В теории реляционных баз данных синоним таблицы - отношение (relation), в котором строка называется кортежем, а столбец называется атрибутом. В концептуальной модели реляционной БД аналогом таблицы является сущность (entity), с определенным набором свойств - атрибутов, способных принимать определенные значения (набор допустимых значений - домен). Ключевой элемент таблицы (ключ, regular key) - такое ее поле (простой ключ) или строковое выражение, образованное из значений нескольких полей (составной ключ), по которому можно определить значения других полей для одной или нескольких записей таблицы. На практике для использования ключей создаются индексы - служебная информация, содержащая упорядоченные сведения о ключевых значениях. В реляционной теории и концептуальной модели понятие "ключ" применяется для атрибутов отношения или сущности. Первичный ключ (primary key) - главный ключевой элемент, однозначно идентифицирующий строку в таблице. Могут также существовать альтернативный (candidate key) и уникальный (unique key) ключи, служащие также для идентификации строк в таблице. В реляционной теории первичный ключ - минимальный набор атрибутов, однозначно идентифицирующий кортеж в отношении. В концептуальной модели первичный ключ - минимальный набор атрибутов сущности, однозначно идентифицирующий экземпляр сущности. Связь (relation) - функциональная зависимость между объектами. В реляционных базах данных между таблицами устанавливаются связи по ключам, один из которых в главной (parent, родительской) таблице первичный, второй - внешний ключ - во внешней (child, дочерней) таблице, как правило, первичным не является и образует связь "один ко многим" (1:N). В случае первичного внешнего ключа связь между таблицами имеет тип "один к одному" (1:1). Информация о связях сохраняется в базе данных. Внешний ключ (foreign key) - ключевой элемент подчиненной (внешней, дочерней) таблицы, значение которого совпадает со значением первичного ключа главной (родительской) таблицы. Ссылочная целостность данных (referential integrity) - набор правил, обеспечивающих соответствие ключевых значений в связанных таблицах. Хранимые процедуры (stored procedures) - программные модули, сохраняемые в базе данных для выполнения определенных операций с информацией базы. Триггеры (triggers) - хранимые процедуры, обеспечивающие соблюдение условий ссылочной целостности данных в операциях изменения первичных ключей (возможно каскадное изменение данных), удалении записей в главной таблице (каскадное удаление в дочерних таблицах) и добавлении записей или изменении данных в дочерних таблицах. Объект (object) - элемент информационной системы, обладающий определенными свойствами (properties) и определенным образом реагирующий на внешние события (events). Система - совокупность взаимодействующих между собой и с внешним окружением объектов. Репликация базы данных - создание копий базы данных (реплик), которые могут обмениваться обновляемыми данными или реплицированными формами, отчетами или другими объектами в результате выполнения процесса синхронизации. Транзакция - изменение информации в базе в результате выполнения одной операции или их последовательности, которое должно быть выполнено полностью или не выполнено вообще. В СУБД существуют специальные механизмы обеспечения транзакций. Язык SQL (Structured Query Language) - универсальный язык работы с базами данных, включающий возможности ее создания, модификации структуры, отбора данных по запросам, модификации информации в базе и прочие операции манипулирования базой данных. Null - значение поля таблицы, показывающее, что информация в данном поле отсутствует. Разрешение на возможность существования значения Null может задаваться для отдельных полей таблицы. Лекция №1. Основные понятия баз данных. Базы данных и системы управления базами данных На первой лекции мы рассмотрим общий смысл понятий БД и СУБД. Начнем с того, что с самого начала развития вычислительной техники образовались два основных направления ее использования. Первое направление - применение вычислительной техники для выполнения численных расчетов, которые слишком долго или вообще невозможно производить вручную. Становление этого направления способствовало интенсификации методов численного решения сложных математических задач, развитию класса языков программирования, ориентированных на удобную запись численных алгоритмов, становлению обратной связи с разработчиками новых архитектур ЭВМ. Второе направление, которое непосредственно касается темы нашего курса, это использование средств вычислительной техники в автоматических или автоматизированных информационных системах. В самом широком смысле информационная система представляет собой программный комплекс, функции которого состоят в поддержке надежного хранения информации в памяти компьютера, выполнении специфических для данного приложения преобразований информации и/или вычислений, предоставлении пользователям удобного и легко осваиваемого интерфейса. Обычно объемы информации, с которыми приходится иметь дело таким системам, достаточно велики, а сама информация имеет достаточно сложную структуру. Классическими примерами информационных систем являются банковские системы, системы резервирования авиационных или железнодорожных билетов, мест в гостиницах и т.д. Типовая информационная система, главным образом, ориентирована на хранение, выбор и модификацию данных соответствующей прикладной области. Все вышеперечисленные системы имеют следующие особенности: для обеспечения их работы нужны сравнительно низкие вычислительные мощности данные, которые они используют, имеют сложную структуру необходимы средства сохранения данных между последовательными запусками системы Цель любой информационной системы - обработка данных об объектах реального мира. В широком смысле слова база данных - это совокупность сведений о конкретных объектах реального мира в какойлибо предметной области. Под предметной областью принято понимать часть реально существующей системы, функционирующая как самостоятельная единица. Полная предметная область может представлять собой экономику страны или группы союзных государств, однако на практике для информационных систем наибольшее значение имеет предметная область масштаба отдельного предприятия или корпорации. На самом деле, второе направление возникло несколько позже первого. Это связано с тем, что на заре вычислительной техники компьютеры обладали ограниченными возможностями в части памяти. Создавая базу данных, пользователь стремится упорядочить информацию по различным признакам и быстро извлекать выборку с произвольным сочетанием признаков. Сделать это возможно, только если данные структурированы. Структурирование –это введение соглашений о способах представления данных. Неструктурированными называют данные, записанные, например, в текстовом файле. База данных (БД) - это поименованная совокупность структурированные данных, относящихся к определенной предметной области. В современной технологии баз данных предполагается, что создание базы данных, ее поддержка и обеспечение доступа пользователей к ней осуществляются централизованно с помощью специального программного инструментария - системы управления базами данных. Система управления базами данных (СУБД) - Это комплекс программных средств, предназначенных для создания структуры новой базы, наполнения ее содержимым, редактирования содержимого и визуализации информации. Под визуализацией информации базы понимается отбор отображаемых данных в соответствии с заданным критерием, их упорядочение, оформление и последующая выдача на устройство вывода или передача по каналам связи. Централизованный характер управления данными в базе данных предполагает необходимость существования некоторого лица (группы лиц), на которое возлагаются функции администрирования данными, хранимыми в базе. Пользователями базы данных могут быть различные прикладные программы, программные комплексы, а также специалисты предметной области, выступающие в роли потребителей или источников данных, называемые конечными пользователями. Классификация баз данных По технологии обработки данных базы данных подразделяются на централизованные и распределенные. Централизованная база данных хранится в памяти одной вычислительной системы. Если эта вычислительная система является компонентом сети ЭВМ, возможен распределенный доступ к такой базе. Такой способ использования баз данных часто применяют в локальных сетях ПК. Распределенная база данных состоит из нескольких, возможно пересекающихся или даже дублирующих друг друга частей, хранимых в различных ЭВМ вычислительной сети. Работа с такой базой осуществляется с помощью системы управления распределенной базой данных (СУРБД). Основная задача систем управления распределенными базами данных состоит в обеспечении средства интеграции локальных баз данных, располагающихся в некоторых узлах вычислительной сети, с тем, чтобы пользователь, работающий в любом узле сети, имел доступ ко всем этим базам данных как к единой базе. Возможны однородные и неоднородные распределенные базы данных. В однородном случае каждая локальная база данных управляется одной и той же СУБД. В неоднородной системе локальные базы данных могут относиться даже к разным моделям данных. Сетевая интеграция неоднородных баз данных - очень сложная проблема. Примером распределенной СУБД может служить System R *. В данной системе разработчики прикладных программ и конечные пользователи остаются в среде языка SQL. Возможность использования SQL основывается на обеспечении System R* прозрачности местоположения данных. Система автоматически обнаруживает текущее местоположение упоминаемых в запросе пользователя объектов данных; одна и та же прикладная программа, включающая предложения SQL, может быть выполнена в разных узлах сети. При этом в каждом узле сети на этапе компиляции запроса выбирается наиболее оптимальный план выполнения запроса в соответствии с расположением данных в распределенной системе. По способу доступа к данным базы данных разделяются на базы данных с локальным доступом и базы данных с удаленным (сетевым доступом). Системы централизованных баз данных с сетевым доступом предполагают различные архитектуры подобных систем: файл-сервер; клиент-сервер базы данных; "тонкий клиент" - сервер приложений - сервер базы данных (трехуровневая архитектура). Файл-сервер. Архитектура систем БД с сетевым доступом предполагает выделение одной из машин сети в качестве центральной (сервер файлов). На этот компьютер устанавливается операционная система (ОС) для выделенного сервера (например, Microsoft Windows Server 2003).На такой машине хранится совместно используемая централизованная БД в виде одного или группы файлов. Все другие машины сети выполняют функции рабочих станций, с помощью которых поддерживается доступ пользовательской системы к централизованной базе данных (могут работать в ОС Microsoft Windows 2000 Professional или Microsoft Windows 98). Файлы базы данных в соответствии с пользовательскими запросами передаются на рабочие станции, где в основном и производится обработка. При большой интенсивности доступа к одним и темже данным производительность информационной системы падает. Пользователи могут создавать также на рабочих станциях локальные БД, которые используютсяими монопольно. Концепция файлсервер условно отображена на рис. 3. Рис.3. Схема обработки информации в БД по принципу файл-сервер Клиент-сервер. В этой архитектуре на выделенном сервере, работающем под управлением серверной операционной системы, устанавливается специальное программное обеспечение (ПО) - сервер БД, например, Microsoft®SQL Server™или Oracle. В этой концепции подразумевается, что помимо хранения централизованной базы данных центральная машина (сервер базы данных) должна обеспечивать выполнение основного объема обработки данных. Запрос на данные, выдаваемый клиентом (рабочей станцией), порождае тпоиск и извлечение данных на сервере. Извлеченные данные (но не файлы) транспортируются по сети от сервера к клиенту. Тем самым, количество передаваемой по сети информации уменьшается во много раз. Спецификой архитектуры клиент-сервер является использование языка запросов SQL. Концепция клиент-сервер условно изображена на рис.4 Рис.4. Схема обработки информации в БД по принципу клиент-сервер Трехуровневая архитектура функционирует в Интранет- и Интернет-сетях. Клиентская часть ("тонкий клиент"), взаимодействующая с пользователем, представляет собой HTML-страницу в Web-браузере либо Windows-приложение, взаимодействующее с Web-сервисами. Вся программная логика вынесена на сервер приложений, который обеспечивает формирование запросов к базе данных, передаваемых на выполнение серверу баз данных. Сервер приложений может быть Webсервером или специализированной программой (например, Oracle Forms Server) (см. 5). Рис. 5. Схема работы с БД в трехуровневой архитектуре Структурные элементы базы данных Сразу поясним, что если в базе нет никаких данных (пустая база), то это все равно полноценная база данных. Этот факт имеет методическое значение. Хотя данных в базе и нет, но информация в ней все-таки есть — это структура базы. Она определяет методы занесения данных и хранения их в базе. Простейший “некомпьютерный” вариант базы данных — деловой ежедневник, в котором каждому календарному дню выделено по странице. Даже если в нем не записано ни строки, он не перестает быть ежедневником, поскольку имеет структуру, четко отличающую его от записных книжек, рабочих тетрадей и прочей писчебумажной продукции. Базы данных могут содержать различные объекты, но, забегая вперед, скажем, что основными объектами любой базы данных являются ее таблицы. Простейшая база данных имеет хотя бы одну таблицу. Соответственно, структура простейшей базы данных тождественно равна структуре ее таблицы, рис. 5. Мы знаем, что структуру двумерной таблицы образуют столбцы и строки. Их аналогами в структуре простейшей базы данных являются поля и записи. поле, - элементарная единица логической организации данных, которая соответствует неделимой единице информации - реквизиту. Для описания поля используются следующие характеристики: имя, например. Фамилия, Имя, Отчество, Дата рождения; тип, например, символьный, числовой, календарный; длина, например, 15 байт, причем будет определяться максимально возможным количеством символов точность, для числовых данных, например два десятичных знака для отображения дробной части числа. Запись - совокупность логически связанных полей. Экземпляр записи - отдельная реализация записи, содержащая конкретные значения ее полей. Файл (таблица) структуры. - совокупность экземпляров записей одной Вопросы для самоконтроля 1. Что такое СУБД? 2. Дайте определение базе данных. 3. Укажите цель информационной системы Лекция №2. Виды моделей данных. Общие положения Ядром любой базы данных является модель данных. Модель данных представляет собой множество структур данных, ограничений целостности и операций манипулирования данными. С помощью модели данных могут быть представлены объекты предметной области и взаимосвязи между ними. Модель данных - совокупность структур данных и операций их обработки. СУБД основывается на использовании иерархической, сетевой или реляционной модели, на комбинации этих моделей или на некотором их подмножестве. Рассмотрим три основных типа моделей данных: иерархическую, сетевую и реляционную. . Ранние подходы к организации баз данных o Иерархические базы данных В основе данной модели - иерархическая модель данных. Иерархическая структура представляет совокупность элементов, связанных между собой по определенным правилам. Объекты, связанные иерархическими отношениями, образуют ориентированный граф (перевернутое дерево). В этой модели имеется один главный объект и остальные подчиненные - объекты, находящиеся на разных уровнях иерархии. Взаимосвязи объектов образуют иерархическое дерево с одним корневым объектом. Иерархическая БД состоит из упорядоченного набора нескольких экземпляров одного типа дерева. Автоматически поддерживается целостность ссылок между предками и потомками. Основное правило: никакой потомок не может существовать без своего родителя (см. рис. 1). Сетевые базы данных Сетевой подход к организации данных является расширением иерархического. В иерархических структурах запись-потомок должна иметь в точности одного предка; в сетевой структуре данных потомок может иметь любое число предков. В сетевой модели данных любой объект может быть одновременно и главным, и подчиненным, и может участвовать в образовании любого числа взаимосвязей с другими объектами. Сетевая БД состоит из набора записей и набора связей между этими записями, а если говорить более точно - из набора экземпляров каждого типа из заданного в схеме БД набора типов записи и набора экземпляров каждого типа из заданного набора типов связи. Современные базы данных. Реляционная модель данных Реляционные системы далеко не сразу получили широкое распространение. В то время как основные теоретические результаты в этой области были получены еще в 70-х годах и тогда же появились первые прототипы реляционных СУБД, долгое время считалось невозможным добиться эффективной реализации таких систем. Однако постепенное накопление методов и алгоритмов организации реляционных баз данных и управления ими привели к тому, что уже в середине 80-х годов реляционные системы практически вытеснили с мирового рынка ранние СУБД. Понятие реляционный (англ.relation - отношение) связано с разработками известного американского специалиста в области систем баз данных Е. Кодда. Техническая статья "Реляционная модель данных для больших разделяемых банков данных" доктора Е.Ф. Кодда, опубликованная в 1970 г., является родоначальницей современной теории реляционных БД. Доктор Кодд определил 13 правил реляционной модели (которые называют 12 правилами Кодда). Реляционная модель данных основывается на математических принципах, вытекающих непосредственно из теории множеств и логики предикатов. Эти модели характеризуются простотой структуры данных, удобным для пользователя табличным представлением и возможностью использования формального аппарата алгебры отношений и реляционного исчисления для обработки данных. Ключи и связи Пример 3. Реляционной таблицей можно представить информацию о СОТРУДНИКАХ Поскольку строки в таблице неупорядочены, нам нужна колонка (или набор из нескольких колонок) для уникальной идентификации каждой строки. Такая колонка (или набор колонок) называется первичным ключом (primary key). Первичный ключ любой таблицы обязан содержать уникальные непустые значения для каждой строки. Если первичный ключ состоит из более чем одной колонки, он называется составным первичным ключом (composite primary key). Итак, Первичный ключ - это поле или группа полей, которые единственным образом идентифицируют каждую строку в таблице. Вопросы для самоконтроля 1. Что является ядром базы данных? 2. Опишите модель данных. 3. Опишите иерархические базы данных. 4. В чем отличие иерархической модели от сетевой модели баз данных? Лекция №3. Роль проектирования данных в жизненном цикле информационных систем Общие сведения о проектировании информационных систем Информационная система (ИС) - программно-аппаратный комплекс, предназначенный для хранения и обработки информации какой-либо предметной области. База данных - важнейший компонент любой информационной системы. Хорошо структурированная информация в базе данных позволяет не только беспроблемно эксплуатировать систему и выполнять ее текущее обслуживание, но и модифицировать и развивать ее при модернизации предприятия и изменении информационных потоков, законодательства и форм отчетности. Создание информационной системы ведется в несколько этапов, на каждом из которых конкретизируются и уточняются элементы разрабатываемой системы. Жизненный цикл информационной системы в общем случае начинается в момент принятия решения о ее создании и заканчивается в момент выведения ее из эксплуатации. Основными его этапами (если опустить детали) обычно являются: проведение предпроектного обследования; проектирование данных; разработка приложений, тестирование, написание документации; внедрение созданной информационной системы и обучение пользователей; эксплуатация и сопровождение; выведение из эксплуатации и утилизация. Жизненный цикл (ЖЦ) АИС - это непрерывный процесс, который начинается с момента принятия решения о необходимости создания ИС и заканчивается в момент ее полного изъятия из эксплуатации. рисунок 1.Структурная схема терминов Модель ЖЦ - структура, определяющая последовательность выполнения и взаимосвязи процессов, действий и задач, выполняемых на протяжении ЖЦ. Наибольшее распространение получили две основные модели ЖЦ: каскадная модель (70-85 гг.); спиральная модель (86-90 гг.). Каскадный способ - разбиение всей разработки на этапы, причем переход с одного этапа на следующий происходит только после того, как будет полностью завершена работа на текущем (рис.1.2.1). В спиральной модели ЖЦ (рис. 3), делается упор на начальные этапы ЖЦ: анализ и проектирование. Реализуемость технических решений проверяется путем создания прототипов. Понятие информационного объекта Информационный объект - это описание некоторой сущности (реального объекта, явления, процесса, события) в виде совокупности логически связанных реквизитов (информационных элементов). Такими сущностями для информационных объектов могут служить: цех, склад, материал, вуз, студент, сдача экзаменов и т.д. Информационный объект определенного реквизитного состава и структуры образует класс (тип), которому присваивается уникальное имя (символьное обозначение), например Студент, Сессия, Стипендия. Составные части процесса проектирования данных Основная цель проектирования БД – это сокращение избыточности хранимых данных, а следовательно, экономия объема используемой памяти, уменьшение затрат на многократные операции обновления избыточных копий и устранение возможности возникновения противоречий из-за хранения в разных местах сведений об одном и том же объекте. Так называемый, "чистый" проект БД ("Каждый факт в одном месте") можно создать, используя методологию нормализации отношений. И хотя нормализация должна использоваться на завершающей проверочной стадии проектирования БД, мы начнем обсуждение вопросов проектирования с рассмотрения причин, которые заставили Кодда создать основы теории нормализации Процесс создания информационной модели, можно разделить на несколько этапов: 1. Определение концептуальных требований ряда пользователей. Требования отдельных пользователей интегрируются в едином обобщенном представлении. Последнее называют концептуальной моделью. Концептуальная модель- модель, представляющая объекты и их взаимосвязи без указания способов их физического хранения. При проектировании концептуальной модели структурируют данные и выявляют взаимосвязи между ними, без рассмотрения особенностей реализации и вопросов эффективности обработки. 2. Концептуальная модель изменяется так, чтобы она могла быть обеспечена конкретной моделью данных. В результате формируется логическая модель. Логическая модель- модель, отражающая логические связи между элементами данных вне зависимости от их содержания и среды хранения. Логическая модель может быть реляционной, иерархической или сетевой. 3. Логическая модель отображается в физическую память, так чтобы она могла быть обеспечена конкретной СУБД. Внутренняя модель системы это физическая модель, определяющая размещение данных, методы доступа и технику индексирования. Итак процесс построения информационной модели включает: Основное различие моделей в способе представления взаимосвязей между классами объектов. Схема формирования информационной модели представлена на 4. Рис. 4. Схема формирования информационной модели При проектировании базы данных решаются две основные проблемы. Каким образом отобразить объекты предметной области в абстрактные объекты модели данных, чтобы это отображение не противоречило семантике предметной области и было, по возможности, лучшим (эффективным, удобным и т. д.)? Часто эту проблему называют проблемой логического проектирования баз данных. Как обеспечить эффективность выполнения запросов к базе данных, т. е. каким образом, имея в виду особенности конкретной СУБД, расположить данные во внешней памяти, создания каких дополнительных структур (например, индексов) потребовать и т. д.? Эту проблему обычно называют проблемой физического проектирования баз данных. Логическое моделирование Логическая модель данных, или концептуальное описание предметной области - самый абстрактный уровень проектирования баз данных. Логическая модель данных описывает факты и объекты, подлежащие регистрации в будущей базе данных. С точки зрения теории реляционных БД, основные принципы реляционной модели на концептуальном уровне можно сформулировать следующим образом: все данные представляются в виде упорядоченной структуры, определенной в виде строк и столбцов и называемой отношением; все значения являются скалярами. Это означает, что для любой строки и столбца любого отношения существует одно и только одно значение; все операции выполняются над целым отношением, и результатом их выполнения также является целое отношение. Этот принцип называется замыканием Физическое проектирование данных Физическое проектирование данных осуществляется на основе логической модели. Результатом этого процесса является физическая модель, содержащая полную информацию, необходимую для генерации всех необходимых объектов в базе данных. Для СУБД, поддерживающих системный каталог, физическая модель соответствует его содержимому. Обычно на основании физической модели создается DDL1 -скрипт для создания объектов базы данных либо эти объекты создаются непосредственно из CASE-средства - подавляющее большинство современных средств такого класса поддерживает различные механизмы доступа к данным и может выступать в роли клиентского приложения, инициирующего выполнение DDL-скриптов. Инструментальные средства проектирования информационных систем Многие современные СУБД содержат визуальные средства (нередко входящие в состав утилит администрирования), позволяющие создать новую схему базы данных или просмотреть уже имеющуюся. Существуют также и утилиты (поставляемые отдельно от СУБД), позволяющие разрабатывать или редактировать метаданные. Однако в последнее время все более популярными становятся CASE-средства (Computer-Aided System Engineering). Существует несколько типов CASE-средств, но для создания баз данных чаще всего используются те из них, что содержат в своем составе инструменты для создания диаграмм <сущность-связь> и проектирования данных. Возрастающая сложность современных автоматизированных систем управления и повышение требовательности к ним обуславливает применение эффективных технологий создания и сопровождения АС в течение всего жизненного цикла. Такие технологии, базирующиеся на методологиях подготовки информационных систем и соответствующих комплексах интегрированных инструментальных средств, а также ориентированные на поддержку полного жизненного цикла АС или его основных этапов, получили название CASE-технологий и CASE-средств. Для успешной реализации проекта АС должны быть построены полные и непротиворечивые функциональные и информационные модели системы управления. Накопленный опыт проектирования указанных моделей показывает, что это логически сложная, трудоемкая и длительная по времени работа, требующая высокой квалификации участвующих в ней специалистов. Однако во многих случаях проектирование АС выполняется в основном на интуитивном уровне с применением неформальных методов, основанных на искусстве, практическом опыте и экспертных оценках. Кроме того, в процессе создания и функционирования АС информационные потребности пользователей могут изменяться или уточняться, что еще более усложняет разработку и сопровождение автоматизированных систем управления. От перечисленных недостатков в наибольшей степени свободны подходы, основанные на программнотехнических средствах специального класса - CASE-средствах, реализующих CASE-технологии создания и сопровождения АС. Под термином CASE (Computer Aided Software Engineering) понимаются программные средства, поддерживающие процессы создания и сопровождения АС, включая анализ и формулировку требований, проектирование прикладного программного обеспечения и баз данных, генерацию кода, тестирование, документирование, обеспечение качества, конфигурационное управление и управление проектом, а также другие процессы. CASE-средства вместе с системным программным обеспечением и техническими средствами образуют полную среду разработки АС. Вопросы для самоконтроля 1. Дайте общие сведения о проектировании информационных систем. 2. Что такое информационная система? 3. Перечислите основные этапы создания информационной модели. 4. Что такое жизненный цикл информационной модели? Лекция №4. Проектирование реляционных баз данных с использованием семантических моделей. Диаграммы "сущность-связь (ERD - entityrelationship diagrams)". Общие сведения и основные понятия В реальном проектировании структуры базы данных применяются другой метод - так называемое семантическое моделирование. Семантическое моделирование представляет собой моделирование структуры данных, опирающееся на смысл этих данных. В качестве инструмента семантического моделирования используются различные варианты диаграмм "сущность-связь (ERD - entity-relationship diagrams)" c построением концептуальной модели базы данных. В них сущности изображаются помеченными прямоугольниками, ассоциации – помеченными ромбами или шестиугольниками, атрибуты – помеченными овалами, а связи между ними – ненаправленными ребрами, над которыми может проставляться степень связи (1 или буква, заменяющая слово "много") и необходимое пояснение. Подавляющее большинство средств проектирования данных позволяют создавать ER-диаграммы визуально, изображая сущности и соединяя их связями с помощью мыши. Интерфейс таких средств нередко настолько прост, что позволяет освоить логическое проектирование данных не только разработчику, но и пользователю-непрограммисту, если таковой участвует в проектировании данных как эксперт в предметной области. Далее мы кратко рассмотрим некоторые черты одной из наиболее популярных семантических моделей данных - модель "Сущность-Связи" (часто ее называют кратко ER-моделью). На использовании разновидностей ER-модели основано большинство современных подходов к проектированию баз данных (главным образом, реляционных). Модель была предложена Ченом (Chen) в 1976 г. Моделирование предметной области базируется на использовании графических диаграмм, включающих небольшое число разнородных компонентов. В связи с наглядностью представления концептуальных схем баз данных ER-модели получили широкое распространение в системах CASE, поддерживающих автоматизированное проектирование реляционных баз данных. Характеристика связей и язык моделирования Первый тип – связь ОДИН-К-ОДНОМУ (1:1): в каждый момент времени каждому представителю (экземпляру) сущности А соответствует 1 или 0 представителей сущности В: Студент может не "заработать" стипендию, получить обычную или одну из повышенных стипендий. Второй тип – связь представителю сущности А представителей сущности В. ОДИН-КО-МНОГИМ соответствуют 0, 1 (1:М): одному или несколько Квартира может пустовать, в ней может жить один или несколько жильцов. Так как между двумя сущностями возможны связи в обоих направлениях, то существует еще два типа связи МНОГИЕ-К-ОДНОМУ (М:1) и МНОГИЕ-КО-МНОГИМ (М:N). Классификация сущностей Настал момент разобраться в терминологии. К.Дейт [3] определяет три основные класса сущностей: стержневые, ассоциативные и характеристические, а также подкласс ассоциативных сущностей – обозначения. Стержневая сущность (стержень) – это независимая сущность (несколько подробнее она будет определена ниже). В рассмотренных ранее примерах стержни – это "Студент", "Квартира", "Мужчины", "Врач", "Брак" и другие, названия которых помещены в прямоугольники. Ассоциативная сущность (ассоциация) – это связь вида "многие-комногим" ("-ко-многим" и т.д.) между двумя или более сущностями или экземплярами сущности (как в примере ). Ассоциации рассматриваются как полноправные сущности. Характеристическая сущность (характеристика) – это связь вида "многие-к-одной" или "одна-к-одной" между двумя сущностями (частный случай ассоциации). Единственная цель характеристики в рамках рассматриваемой предметной области состоит в описании или уточнении некоторой другой сущности. Необходимость в них возникает в связи с тем, что сущности реального мира имеют иногда многозначные свойства. Муж может иметь несколько жен (пример ), книга – несколько характеристик переиздания (исправленное, дополненное, переработанное, ...) и т.д. О первичных и внешних ключах Напомним, что ключ или возможный ключ – это минимальный набор атрибутов, по значениям которых можно однозначно найти требуемый экземпляр сущности. Минимальность означает, что исключение из набора любого атрибута не позволяет идентифицировать сущность по оставшимся. Каждая сущность обладает хотя бы одним возможным ключом. Один из них принимается за первичный ключ. При выборе первичного ключа следует отдавать предпочтение несоставным ключам или ключам, составленным из минимального числа атрибутов. Нецелесообразно также использовать ключи с длинными текстовыми значениями (предпочтительнее использовать целочисленные атрибуты). Так, для идентификации студента можно использовать либо уникальный номер зачетной книжки, либо набор из фамилии, имени, отчества, номера группы и может быть дополнительных атрибутов, так как не исключено появление в группе двух студентов (а чаще студенток) с одинаковыми фамилиями, именами и отчествами. Не допускается, чтобы первичный ключ стержневой сущности (любой атрибут, участвующий в первичном ключе) принимал неопределенное значение. Иначе возникнет противоречивая ситуация: появится не обладающий индивидуальностью, и, следовательно не существующий экземпляр стержневой сущности. По тем же причинам необходимо обеспечить уникальность первичного ключа. Теперь о внешних ключах: Если сущность С связывает сущности А и В, то она должна включать внешние ключи, соответствующие первичным ключам сущностей А и В. Если сущность В обозначает сущность А, то она должна включать внешний ключ, соответствующий первичному ключу сущности А. Соблюдение условий ссылочной целостности в реляционной базе данных Выше мы уже говорили о том, что первичный ключ любой таблицы должен содержать уникальные непустые значения для данной таблицы. Это утверждение является одним из правил ссылочной целостности (referential integrity). Целостность (от англ. integrity – нетронутость, неприкосновенность, сохранность, целостность) – понимается как правильность данных в любой момент времени. Некоторые (но далеко не все) СУБД могут контролировать уникальность первичных ключей. Если СУБД контролирует уникальность первичных ключей, то при попытке присвоить первичному ключу значение, уже имеющееся в другой записи, СУБД сгенерирует диагностическое сообщение, обычно содержащее словосочетание primary key violation. Это сообщение в дальнейшем может быть передано в приложение, с помощью которого конечный пользователь манипулирует данными. Если две таблицы связаны соотношением master-detail, внешний ключ detail-таблицы должен содержать только те значения, которые уже имеются среди значений первичного ключа master-таблицы. Если корректность значений внешних ключей не контролируется СУБД, можно говорить о нарушении ссылочной целостности. В этом случае, если мы удалим из таблицы Customers запись, имеющую хотя бы одну связанную с ней detail-запись в таблице Orders, это приведет к тому, что в таблице Orders окажутся записи о заказах, размещенных неизвестно кем. Если же СУБД контролирует корректность значений внешних ключей, то при попытке присвоить внешнему ключу значение, отсутствующее среди значений первичных ключей master-таблицы, либо при удалении или модификации записей master-таблицы, приводящих к нарушению ссылочной целостности, СУБД сгенерирует диагностическое сообщение, обычно содержащее словосочетание foreign key violation, которое в дальнейшем может быть передано в пользовательское приложение. Лекция №4.Вопросы для самоконтроля 1. Что такое семантическое моделирование? 2. Опишите ER-модель 3. Какие бывают связи? 4. Что такое стержневая сущность? 5. Что такое ассоциативная сущность? Лекция №5. Проектирование реляционных баз данных на основе принципов нормализации. Понятие нормализации отношений В этой и следующей лекциях будет рассмотрен классический подход, при котором весь процесс проектирования базы данных осуществляется в терминах реляционной модели данных методом последовательных приближений к удовлетворительному набору схем отношений. Процесс проектирования представляет собой процесс нормализации схем отношений. Нормализация (декомпозиция) отношений - это формальный метод анализа отношений на основе их первичного ключа и существующих связей. Ее задача - это замена одной схемы (или совокупности отношений) БД другой схемой, в которой отношения имеют более простую и регулярную структуру, устранены дублирование, обеспечена непротиворечивость хранимых в базе данных, уменьшены трудозатраты на ведение (ввод, корректировку) базы данных. Однако в технологии работы с хранилищами данных может использоваться обратный прием - денормализация отношений с целью увеличения скорости выполнения запросов к очень большим объемам архивных данных. В теории реляционных баз данных обычно выделяется следующая последовательность нормальных форм: первая нормальная форма (1NF); вторая нормальная форма (2NF); третья нормальная форма (3NF); нормальная форма Бойса-Кодда (BCNF); четвертая нормальная форма (4NF); пятая нормальная форма, или нормальная форма проекциисоединения (5NF или PJ/NF). Основные свойства нормальных форм состоят в следующем: каждая следующая нормальная форма в некотором смысле лучше предыдущей нормальной формы; при переходе к следующей нормальной форме свойства предыдущих нормальных форм сохраняются. В.Коддом выделены три нормальные формы отношений и предложен механизм, позволяющий любое отношение преобразовать к третьей (самой совершенной)∙нормальной форме. Нормальные формы Нормальные формы отношений основываются на фундаментальных в теории реляционных баз данных понятиях функциональной и многозначной зависимости. Для дальнейшего изложения нам потребуется несколько определений. Описательные реквизиты информационного объекта логически связаны с общим для них ключом, эта связь носит характер функциональной зависимости реквизитов. Первая нормальная форма (1НФ) Для обсуждения первой нормальной формы необходимо дать два определения: Простой атрибут - атрибут, значения которого атомарные (неделимы). Сложный атрибут - получается соединением нескольких атомарных атрибутов, которые могут быть определены на одном или разных доменах. (его также называют вектор или агрегат данных). Определение 7. Отношение находится в 1NF тогда и только тогда, когда, все входящие в него атрибуты являются атомарными (неделимыми), и все записи - уникальными. Вторая нормальная форма (2НФ) применяется к отношениям с составными ключами (состоящими из двух и более атрибутов) и связана с понятиями функциональной зависимости (определение 1 и 2). Определение 8. Отношение находится в 2NF, если оно находится в 1NF и каждый неключевой атрибут функционально полно зависит от первичного ключа (см. определение 4). Третья нормальная форма (3НФ) Понятие третьей нормальной формы основывается на понятии нетранзитивной зависимости. (Определение 5). Транзитивная зависимость наблюдается в том случае, если один из двух описательных реквизитов зависит от ключа, а другой описательный реквизит зависит от первого описательного реквизита. Определение 9 (в предположении существования единственного ключа). Отношение находится в 3NF в том и только в том случае, если оно находится в 2NF и каждый неключевой атрибут нетранзитивно зависит от первичного ключа. Вопросы для самоконтроля 1. Дайте понятие нормализации отношений. 2. Дайте определение первой нормальной формы. 3. Дайте определение второй нормальной формы. 4. Дайте определение третьей нормальной формы. 5. Что такое транзитивная зависимость? Лекция №6. Стандарт и реализация языка SQL Введение в структурированный язык запросов (SQL) Одним из языков, появившихся в результате разработки реляционной модели данных, является язык SQL (Structured Query Language), который в настоящее время получил очень широкое распространение и фактически превратился в стандартный язык реляционных баз данных. Стандарт на язык SQL был выпущен Американским национальным институтом стандартов (ANSI) в 1986 г., а в 1987 г. Международная организация стандартов (ISO) приняла его в качестве международного. Нынешний стандарт SQL известен под названием SQL/92. Как работает SQL Рассматриваемый язык SQL ориентирован на операции с данными, представленными в виде логически взаимосвязанных совокупностей таблиц-отношений. Важнейшая особенность его структур – ориентация на конечный результат обработки данных, а не на процедуру этой обработки. Давайте рассмотрим, как работает SQL. Предположим, что имеется база данных, управляемая с помощью какой-либо СУБД. Для извлечения из нее данных используется запрос, сформулированный на языке SQL. СУБД обрабатывает этот запрос, извлекает запрашиваемые данные и возвращает их. Этот процесс схематически изображен на рис. 1. Рис. 1 Как мы увидим позже, SQL позволяет не только извлекать данные, но и определять структуру данных, добавлять и удалять данные, ограничивать или предоставлять доступ к данным, поддерживать ссылочную целостность. Обратите внимание на то, что SQL сам по себе не является ни СУБД, ни отдельным продуктом. Это язык, применяемый для взаимодействия с СУБД и являющийся в определенном смысле ее неотъемлемой частью. Типы команд SQL SQL содержит примерно 40 операторов для выполнения различных действий внутри СУБД. Ниже приводится краткое описание категорий этих операторов. Основные категории команд языка SQL: DDL – язык определения данных; DML – язык манипулирования данными; DQL – язык запросов ;DCL – язык управления данными; команды администрирования данных; транзакциями команды управления Преимущества языка SQL Таким образом, SQL – мощный инструмент, который обеспечивает пользователям, программам и вычислительным системам доступ к информации, содержащейся в реляционных базах данных. Основные достоинства языка SQL заключаются в следующем: стандартность – как уже было сказано, использование языка SQL в программах стандартизировано международными организациями; независимость от конкретных СУБД – все распространенные СУБД используют SQL, т.к. реляционную базу данных можно перенести с одной СУБД на другую с минимальными доработками; возможность переноса с одной вычислительной системы на другую – СУБД может быть ориентирована на различные вычислительные системы, однако приложения, созданные с помощью SQL, допускают использование как для локальных БД, так и для крупных многопользовательских систем; реляционная основа языка – SQL является языком реляционных БД, поэтому он стал популярным тогда, когда получила широкое распространение реляционная модель представления данных. Табличная структура реляционной БД хорошо понятна, а потому язык SQL прост для изучения; возможность создания интерактивных запросов – SQL обеспечивает пользователям немедленный доступ к данным, при этом в интерактивном режиме можно получить результат запроса за очень короткое время без написания сложной программы; возможность программного доступа к БД – язык SQL легко использовать в приложениях, которым необходимо обращаться к базам данных. Одни и те же операторы SQL употребляются как для интерактивного, так и программного доступа, поэтому части программ, содержащие обращение к БД, можно вначале проверить в интерактивном режиме, а затем встраивать в программу; обеспечение различного представления данных – с помощью SQL можно представить такую структуру данных, что тот или иной пользователь будет видеть различные их представления. Кроме того, данные из разных частей БД могут быть скомбинированы и представлены в виде одной простой таблицы, а значит, представления пригодны для усиления защиты БД и ее настройки под конкретные требования отдельных пользователей; возможность динамического изменения и расширения структуры БД – язык SQL позволяет манипулировать структурой БД, тем самым обеспечивая гибкость с точки зрения приспособленности БД к изменяющимся требованиям предметной области; поддержка архитектуры клиент-сервер – SQL – одно из лучших средств для реализации приложений на платформе клиент-сервер. SQL служит связующим звеном между взаимодействующей с пользователем клиентской системой и серверной системой, управляющей БД, позволяя каждой из них сосредоточиться на выполнении своих функций. Вопросы для самоконтроля 1. В каком году появился язык структурированных запросов? 2. В чем его особенности? 3. Для чего он понадобился? 4. Какие команды языка вы знаете? 5. В чем преимущества данного языка? Лекция №7. Реализация операций реляционной алгебры операторами SQL. Основы реляционной алгебры Реляционной является БД, в которой все данные, доступные пользователю, организованы в виде набора двумерных таблиц, а все операции над данными сводятся к операциям над этими таблицами. ПРОЕКЦИЯ ВЫБОРКА ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ C C D D A A B B A A A B B B C C C D D D ОБЪЕДИНЕНИЕ ПЕРЕСЕЧЕНИЕ РАЗНОСТЬ Рис. 1. Некоторые операции реляционной алгебры Предложив реляционную модель данных, Кодд создал и инструмент для удобной работы с отношениями – реляционную алгебру. Каждая операция этой алгебры использует одну или несколько таблиц (отношений) в качестве ее операндов и получает в результате новую таблицу, т.е. позволяет "разрезать" или "склеивать" таблицы (рис. 1). Реляционные операторы обладают одним важным свойством: они замкнуты относительно понятия отношения. Это означает, что выражения реляционной алгебры определяются над отношениями реляционных БД и результатом вычисления также являются отношения. Выражения реляционной алгебры строятся на основе алгебраических операций (высокого уровня), и подобно тому, как интерпретируются арифметические и логические выражения, выражение реляционной алгебры также имеет процедурную интерпретацию. Другими словами, запрос, представленный на языке реляционной алгебры, может быть вычислен на основе вычисления элементарных алгебраических операций с учетом их старшинства и возможного наличия скобок. Набор основных алгебраических операций состоит из восьми операций, которые делятся на два класса - теоретико-множественные операции и специальные реляционные операции, дополненные некоторыми специальными операциями, специфичными для баз данных. В состав теоретико-множественных операций входят традиционные операции над множествами: объединение; пересечение; разность; декартово произведение. Специальные реляционные операции включают: выборку; проекцию; естественное соединение; деление. Реализация операций реляционной алгебры оператором SELECT С помощью предложения SELECT можно реализовать любую операцию реляционной алгебры. □ Выборка (горизонтальное подмножество) таблицы создается из тех ее строк, которые удовлетворяют заданным условиям. Пример: SELECT * FROM Clients WHERE City = 'Тверь' □ Проекция (вертикальное подмножество) таблицы создается из указанных ее столбцов (в заданном порядке) с последующим исключением избыточных дубликатов строк. Пример: SELECT DISTINCT City FROM Clients □ Объединение двух таблиц содержит те строки, которые есть либо в первой, либо во второй, либо в обеих таблицах. Пример: SELECT * FROM Clients WHERE Age = (SELECT MIN(Age) FROM Clients) UNION SELECT * FROM Clients WHERE Age = (SELECT MAX(Age) FROM Clients) □ Пересечение двух таблиц содержит только те строки, которые есть и в первой, и во второй. Пример: SELECT * FROM Clients WHERE Age IN (SELECT MIN(Age) FROM Clients) □ Разность двух таблиц содержит только те строки, которые есть в первой, но отсутствуют во второй. Пример: SELECT * FROM Clients WHERE City NOT IN (SELECT City FROM Clients GROUP BY City HAVING Count(*)<=10) Декартово произведение таблиц и различные виды соединений рассмотрены ниже. Выборки из нескольких таблиц Когда в предложении FROM указаны несколько таблиц, то все они неявно считаются соединяемыми. По сути это означает, что можно получить все возможные комбинации строк (по одной из каждой таблицы), и именно с такой конкатенацией будут работать остальные операторы запроса. Эта конкатенированная таблица носит название декартово произведение или перекрестное соединение (cross join). Чаще всего пользователю нужно исключить большинство строк и выделить определенные данные, что обычно реализуется посредством установления отношений (или условий) при помощи предложения WHERE. Другой способ установить отношения – использование встроенных операций соединения, чтобы осуществить внутреннее соединение в предложении FROM. Результат этого соединения есть порожденная таблица, которая и должна обрабатываться остальными операторами запроса. Допускаются перекрестные (CROSS), естественные (NATURAL) соединения, т.е. соединения по нескольким столбцам с одинаковыми именами, и соединения типа «объединений» (UNION). Соединение UNION и оператор UNION являются различными понятиями. Оператор UNION служит для объединения выходных данных нескольких операторов SELECT. перекрестное соединение: таблица A CROSS JOIN таблица B естественное соединение: таблица A [NATURAL] [тип соединения] JOIN таблица B соединение объединения: таблица A UNION JOIN таблица B объединение посредством предиката: таблица A [тип соединения] JOIN таблица B ON предикат объединение посредством имен столбцов: таблица A [тип соединения] JOIN таблица B USING (имя столбца,..) тип соединения: INNER|{{LEFT|RIGHT|FULL|[OUTER]} Вопросы для самоконтроля 1. Какие элементы реляционной алгебры вы знаете? 2. Что означает запись SELECT *? 3. Что такое перекрестное соединение? 4. Что такое декартово произведение таблиц? Лекция №8. Основные сведения о Системах управления базами данных Основные функции СУБД Создание первых баз данных и СУБД стало возможно лишь с появлением достаточно дешевых и производительных устройств внешней памяти, какими стали жесткие диски (винчестеры), появившиеся во второй половине 60-х годов. В 70-е годы шла интенсивная разработка теоретических вопросов построения баз данных. В результате в начале 80х годов на рынке появились мощные инструментальные средства проектирования и построения информациоонных систем. Начиная с 1980-х годов, одновременно с широким распространением персональных компьютеров, большое распространение получили так называемые "настольные" реляционные СУБД (Desktop Databases), такие как dBase, FoхBase (его более поздние версии - FoхPro и Visual FoхPro), Paradoх, Access. Наиболее распространенным форматом таблиц подобных реляционных баз стал *.dbf, с которым работали dBase, FoхBase, а также Clipper - система написания программ (в режиме строкового компилятора) для работы с базами данных. В последующем некоторые из них стали полноценными сетевыми СУБД, работающими не только в различных операционных системах в архитектуре "файл-сервер", но и имеющими возможности для работы с серверами баз данных в архитектуре "клиентсервер", а также разработки и использования html-страниц для работы с базами данных. Однако, развитие информационных технологий в 90-х привело к появлению новых, более широких требований к обработке и представлению данных. Таким образом, теория баз данных, хотя и располагает впечатляющими достижениями, еще далека от завершения. Система управления базами данных (СУБД) - Это комплекс программных средств, предназначенных для создания структуры новой базы, наполнения ее содержимым, редактирования содержимого и визуализации информации. Основные функции СУБД управление данными во внешней памяти; управление буферами оперативной памяти; управление транзакциями; журнализация и восстановление БД после сбоев; поддержание языков БД. 1. Непосредственное управление данными во внешней памяти Эта функция включает обеспечение необходимых структур внешней памяти как для хранения данных, непосредственно входящих в БД, так и для служебных целей, например, для убыстрения доступа к данным в некоторых случаях (обычно для этого используются индексы). В некоторых реализациях СУБД активно используются возможности существующих файловых систем, в других работа производится вплоть до уровня устройств внешней памяти. Но подчеркнем, что в развитых СУБД пользователи в любом случае не обязаны знать, использует ли СУБД файловую систему, и если использует, то как организованы файлы. В частности, СУБД поддерживает собственную систему именования объектов БД. 2. Управление буферами оперативной памяти СУБД обычно работают с БД значительного размера; по крайней мере этот размер обычно существенно больше доступного объема оперативной памяти. Понятно, что если при обращении к любому элементу данных будет производиться обмен с внешней памятью, то вся система будет работать со скоростью устройства внешней памяти. Практически единственным способом реального увеличения этой скорости является буферизация данных в оперативной памяти. При этом, даже если операционная система производит общесистемную буферизацию (как в случае ОС UNIX), этого недостаточно для целей СУБД, которая располагает гораздо большей информацией о полезности буферизации той или иной части БД. Поэтому в развитых СУБД поддерживается собственный набор буферов оперативной памяти с собственной дисциплиной замены буферов. 3. Управление транзакциями Транзакция - это последовательность операций над БД, рассматриваемых СУБД как единое целое. Либо транзакция успешно выполняется, и СУБД фиксирует (COMMIT) изменения БД, произведенные этой транзакцией, во внешней памяти, либо ни одно из этих изменений никак не отражается на состоянии БД. Понятие транзакции необходимо для поддержания логической целостности БД. 4. Журнализация Одним из основных требований к СУБД является надежность хранения данных во внешней памяти. Под надежностью хранения понимается то, что СУБД должна быть в состоянии восстановить последнее согласованное состояние БД после любого аппаратного или программного сбоя. Обычно рассматриваются два возможных вида аппаратных сбоев: так называемые мягкие сбои, которые можно трактовать как внезапную остановку работы компьютера (например, аварийное выключение питания), и жесткие сбои, характеризуемые потерей информации на носителях внешней памяти. Примерами программных сбоев могут быть: аварийное завершение работы СУБД (по причине ошибки в программе или в результате некоторого аппаратного сбоя) или аварийное завершение пользовательской программы, в результате чего некоторая транзакция остается незавершенной. Первую ситуацию можно рассматривать как особый вид мягкого аппаратного сбоя; при возникновении последней требуется ликвидировать последствия только одной транзакции. Журнал - это особая часть БД, недоступная пользователям СУБД и поддерживаемая с особой тщательностью (иногда поддерживаются две копии журнала, располагаемые на разных физических дисках), в которую поступают записи обо всех изменениях основной части БД. В разных СУБД изменения БД журнализуются на разных уровнях: иногда запись в журнале соответствует некоторой логической операции изменения БД (например, операции удаления строки из таблицы реляционной БД), иногда - минимальной внутренней операции модификации страницы внешней памяти; в некоторых системах одновременно используются оба подхода. 5. Поддержка языков БД Для работы с базами данных используются специальные языки, в целом называемые языками баз данных. В ранних СУБД поддерживалось несколько специализированных по своим функциям языков. Чаще всего выделялись два языка - язык определения схемы БД (SDL - Schema Definition Language) и язык манипулирования данными (DML - Data Manipulation Language). SDL служил главным образом для определения логической структуры БД, т.е. той структуры БД, какой она представляется пользователям. DML содержал набор операторов манипулирования данными, т.е. операторов, позволяющих заносить данные в БД, удалять, модифицировать или выбирать существующие данные. Мы рассмотрим более подробно языки ранних СУБД в следующей лекции. В современных СУБД обычно поддерживается единый интегрированный язык. Стандартным языком наиболее распространенных в настоящее время реляционных СУБД является язык SQL (Structured Query Language). Типовая организация современной СУБД Обычно современная СУБД содержит следующие компоненты (см. рис.1): ядро, которое отвечает за управление данными во внешней и оперативной памяти и журнализацию, процессор языка базы данных, обеспечивающий оптимизацию запросов на извлечение и изменение данных и создание, как правило, машинно-независимого исполняемого внутреннего кода, подсистему поддержки времени исполнения, которая интерпретирует программы манипуляции данными, создающие пользовательский интерфейс с СУБД а также сервисные программы (внешние утилиты), обеспечивающие ряд дополнительных возможностей по обслуживанию информационной системы. рис.1 Компоненты СУБД Классификация СУБД В основу любой классификации закладывается признак классификации. СУБД можно классифицировать по ряду признаков: 1. 2. 3. 4. 5. по модели данных по типу используемого транслятора по сфере применения по способности настраиваться на предметную область по количеству одновременно открытых файлов и наличию языка программирования рис.2 Критерии выбора СУБД при создании информационных систем Выбор системы управления баз данных (СУБД) представляет собой сложную многопараметрическую задачу и является одним из важных этапов при разработке приложений баз данных. можно выделить несколько групп критериев (основные характеристики): Моделирование данных Особенности архитектуры и функциональные возможности Контроль работы системы Особенности разработки приложений Производительность Надежность Требования к рабочей среде .Вопросы для самоконтроля 1. Основные функции СУБД. 2. Какая функция включает обеспечение необходимых структур внешней памяти как для хранения данных, непосредственно входящих в БД, так и для служебных целей? 3. Что такое транзакция? 4. Что такое журнал? 5. Какие специальные языки используются для работы с базами данных? Лекция №9. Обзор настольных СУБД Особенности настольных СУБД Настольные СУБД как таковые не содержат специальных приложений и сервисов, управляющих данными, - взаимодействие с ними осуществляется с помощью файловых сервисов операционной системы. Нередко подобные СУБД имеют в своем составе и средства разработки, ориентированные на работу с данными формата, характерного для этой СУБД, и позволяющие создать более или менее комфортный пользовательский интерфейс. Что же касается обработки данных - она целиком и полностью осуществляется в пользовательском (клиентском) приложении. На сегодняшний день известно более двух десятков форматов данных настольных СУБД, однако наиболее популярными, исходя из числа проданных копий, следует признать dBase, Paradox, FoxPro и Access. Из появившихся недавно СУБД следует также отметить Microsoft Data Engine - по существу серверную СУБД, представляющую собой <облегченную> версию Microsoft SQL Server, но предназначенную, тем не менее, для использования главным образом в настольных системах и небольших рабочих группах. Сведения о производителях перечисленных выше СУБД представлены в следующей таблице. СУБД Производитель Visual dBase dBase, Inc URL http://www.dbase2000. com/ Paradox Microsoft Corel Access 2000 Microsoft FoxPro Microsoft FoxPro Visual Microsoft FoxPro Visual http://www.corel.com/ Microsoft http://www.microsoft. com/ Microsoft http://www.microsoft. com/ Microsoft http://www.microsoft. com/ Microsoft http://www.microsoft. com/ Microsoft Data http://www.microsoft. Microsoft Engine com/ Обзор настольных СУБД dBase и Visual dBase Первая промышленная версия СУБД dBase - dBase II (принадлежащая тогда компании Ashton-Tate, приобретенной позже компанией Borland) появилась в начале 80-х годов. Благодаря простоте в использовании, нетребовательности к ресурсам компьютера и, что не менее важно, грамотной маркетинговой политике компании-производителя этот продукт приобрел немалую популярность, а с выходом следующих его версий dBase III и dBase III Plus (1986 г). Paradox Paradox был разработан компанией Ansa Software, и первая его версия увидела свет в 1985 году. Этот продукт был впоследствии приобретен компанией Borland. С июля 1996 года он принадлежит компании Corel и является составной частью Corel Office Professional. Microsoft FoxPro и Visual FoxPro FoxPro ведет свое происхождение от настольной СУБД FoxBase фирмы Fox Software. Разрабатывая FoxBase в конце 80-х годов, эта компания преследовала цель создать СУБД, функционально совместимую с dBase с точки зрения организации файлов и языка программирования, но существенно превышающую ее по производительности. Одним из способов повышения производительности являлась более эффективная организация индексных файлов, нежели в dBase, - по формату индексных файлов эти две СУБД несовместимы между собой. Microsoft Access Первая версия СУБД Access появилась в начале 90-х годов. Это была первая настольная реляционная СУБД для 16-разрядной версии Windows. Популярность Access значительно возросла после включения этой СУБД в состав Microsoft Office. В отличие от Visual FoxPro, фактически превратившегося в средство разработки приложений, Access ориентирован в первую очередь на пользователей Microsoft Office, в том числе и не знакомых с программированием. Microsoft Data Engine MSDE представляет собой СУБД, базирующуюся на технологиях Microsoft SQL Server, но предназначенную для использования в настольных системах или в сетевых приложениях с объемом данных до 2 Гбайт и небольшим количеством пользователей. По существу MSDE является облегченной версией Microsoft SQL Server, не содержащей средств администрирования, и к настольным СУБД может быть отнесена весьма условно. Вопросы для самоконтроля 1. Расскажите об особенностях настольных СУБД. 2. Какие виды настольных СУБД вы знаете? Лекция №10. Особенности и обзор серверных СУБД Особенности архитектуры <клиент-сервер> Принцип централизации хранения и обработки данных является базовым принципом архитектуры <клиент-сервер>. Для его реализации используется так называемый сервер баз данных, выполненный как приложение или сервис операционной системы, и только он может реально манипулировать файлами, в которых хранятся данные,- для клиентских приложений эти файлы абсолютно бесполезны (и, при правильной организации доступа пользователей к файлам в сети, вообще не должны быть доступны). Сервер баз данных осуществляет целый комплекс действий по управлению данными. Основными его обязанностями являются: выполнение пользовательских запросов на выбор и модификацию данных и метаданных, получаемых от клиентских приложений, функционирующих на персональных компьютерах локальной сети; хранение и резервное копирование данных; поддержка ссылочной целостности данных согласно определенным в базе данных правилам; обеспечение авторизованного доступа к данным на основе проверки прав и привилегий пользователей; протоколирование операций и ведение журнала транзакций. В качестве рабочего места пользователя может быть использован обычный персональный компьютер, что позволяет не отказываться от привычной рабочей среды. Иными словами, в простейшем случае клиентсерверная информационная система состоит из двух основных компонентов: сервера баз данных, управляющего данными и выполняющего запросы клиентских приложений; клиентских приложений, предоставляющих интерфейс пользователя и посылающих запросы к серверу. Существуют и более сложные реализации архитектуры <клиентсервер>, например многозвенные информационные системы с использованием серверов приложений, реализующих бизнес-логику и осуществляющих обработку данных. Однако обсуждение архитектуры таких систем находится за пределами данного обзора - о подобных системах мы, возможно, поговорим в конце данного цикла. Преимущества архитектуры <клиент-сервер> Информационные системы, использующие архитектуру <клиентсервер>, обладают серьезными преимуществами по сравнению с их аналогами, созданными на основе сетевых версий настольных СУБД. Ниже будут рассмотрены наиболее важные из них. Одним из важнейших преимуществ архитектуры <клиент-сервер> является снижение сетевого трафика при выполнении запросов. Hапример, при необходимости выбора пяти записей из таблицы, содержащей миллион записей, клиентское приложение посылает серверу запрос, который сервером анализируется на корректность и, если запрос корректен, компилируется, оптимизируется и выполняется. После этого результат запроса (те самые пять записей, а вовсе не вся таблица) передается обратно клиенту. Вторым преимуществом архитектуры <клиент-сервер> является возможность хранения бизнес-правил (например, правил ссылочной целостности или ограничений на значения данных) на сервере, что позволяет избежать дублирования кода в различных клиентских приложениях, использующих общую базу данных. Современные серверные СУБД обладают также широкими возможностями резервного копирования и архивации данных, а нередко и оптимизации выполнения запросов. Они также, как правило, предоставляют возможность параллельной обработки данных, особенно в случае использования многопроцессорных компьютеров в качестве сервера баз данных. Вопросы для самоконтроля 1. Что входит в обязанности сервера баз данных? 2. Какой принцип является базовым для архитектуры <клиентсервер>? 3. Какими возможностями обладают современные СУБД? Лекция №11. Особенности современных серверных СУБД Характерные черты современных серверных СУБД Выше мы обсудили преимущества архитектуры <клиент-сервер>, обусловленные ее базовыми принципами и не зависящие от того, какая конкретно СУБД выбрана. Однако помимо собственно средства современные серверные СУБД обычно предоставляют дополнительный набор сервисов, связанных с обслуживанием хранения и обработки данных, созданием клиентских приложений, сменой СУБД или ее версии, обслуживанием нескольких баз данных, публикацией данных в Internet. Поскольку в условиях конкуренции между различными производителями СУБД каждый из них стремится к завоеванию как можно большей части рынка, это приводит к тому, что все они пытаются перегнать друг друга и предоставить потенциальному потребителю (а также производителям средств разработки, средств проектирования данных и генераторов отчетов) как можно больше сервисов различного назначения, так как при выборе СУБД потребитель обычно ориентируется на то, что поддерживает в данная СУБД, с одной стороны, и чем она поддерживается - с другой. И, как и в случае настольных СУБД, в этой области также происходит процесс заимствования идей, решений и интерфейсов. Ниже перечислены наиболее характерные для сегодняшнего дня сервисы, предоставляемые серверными СУБД. Реализация для нескольких платформ Административные утилиты Резервное копирование данных Обслуживание репликаций Параллельная обработка данных в многопроцессорных системах Поддержка OLAP и создания хранилищ данных Распределенные запросы и транзакции Средства проектирования данных Поддержка доступа к данным с помощью Internet Наиболее популярные серверные СУБД На сегодняшний день известно более двух десятков серверных СУБД, однако наиболее популярными, исходя из числа продаж и инсталляций, следует признать Oracle, Microsoft SQL Server, Informix, Sybase, DB2. Сведения о производителях перечисленных выше СУБД педставлены в следующей таблице: Производит СУБД Url ель Oracle Oracle Corp. http://www.oracle.com/ Microsoft Server SQL Microsoft Informix Informix Sybase Sybase http://www.microsoft.co m/ http://www.informix.com / http://www.sybase.com/ DB2 IBM http://www-4.ibm.com/ Вопросы для самоконтроля 1. Перечислите характерные черты современных серверных СУБД. 2. Какие сервисы предоставляются серверными СУБД? Лекция №12. Элементы языка - Операторы DDL (Data Definition Language) - операторы определения объектов базы данных Фактически стандартным языком доступа к базам данных в настоящее время стал язык SQL (Structured Query Language). Язык SQL оперирует терминами, несколько отличающимися от терминов реляционной теории, например, вместо "отношений" используются "таблицы", вместо "кортежей" - "строки", вместо "атрибутов" - "колонки" или "столбцы". Стандарт языка SQL, хотя и основан на реляционной теории, но во многих местах отходит он нее. Основу языка SQL составляют операторы, условно разбитые не несколько групп по выполняемым функциям: - Операторы DDL (Data Definition Language) - операторы определения объектов базы данных. - Операторы DML (Data Manipulation Language) - операторы манипулирования данными. Операторы защиты и управления данными, и др. - CREATE SCHEMA - создать схему базы данных - DROP SHEMA - удалить схему базы данных - CREATE TABLE - создать таблицу - ALTER TABLE - изменить таблицу - DROP TABLE - удалить таблицу - CREATE DOMAIN - создать домен - ALTER DOMAIN - изменить домен - DROP DOMAIN - удалить домен - CREATE COLLATION - создать последовательность - DROP COLLATION - удалить последовательность - CREATE VIEW - создать представление - DROP VIEW - удалить представление Операторы DML (Data Manipulation Language) - операторы манипулирования данными SELECT - отобрать строки из таблиц INSERT - добавить строки в таблицу UPDATE - изменить строки в таблице DELETE - удалить строки в таблице COMMIT - зафиксировать внесенные изменения ROLLBACK - откатить внесенные изменения Операторы защиты и управления данными CREATE ASSERTION - создать ограничение DROP ASSERTION - удалить ограничение GRANT - предоставить привилегии пользователю или приложению на манипулирование объектами REVOKE - отменить привилегии пользователя или приложения Кроме того, есть группы операторов установки параметров сеанса, получения информации о базе данных, операторы статического SQL, операторы динамического SQL. Наиболее важными для пользователя являются операторы манипулирования данными (DML). Вопросы для самоконтроля 1.Что такое SQL (Structured Query Language)? 2. Какими терминами оперирует SQL? 3.Какие операторы защиты и управления вы знаете? Лекция №13. Транзакции и целостность баз данных. Транзакции Понятие транзакции не входит в реляционную модель данных, т.к. транзакции рассматриваются не только в реляционных СУБД, но и в СУБД других типов, а также и в других типах информационных систем. Транзакция - это неделимая, с точки зрения воздействия на СУБД, последовательность операций манипулирования данными. Для пользователя транзакция выполняется по принципу "все или ничего", т.е. либо транзакция выполняется целиком и переводит базу данных из одного целостного состояния в другое целостное состояние, либо, если по каким-либо причинам, одно из действий транзакции невыполнимо, или произошло какое-либо нарушение работы системы, база данных возвращается в исходное состояние, которое было до начала транзакции (происходит откат транзакции). Транзакция - это неделимая, с точки зрения воздействия на СУБД, последовательность операций манипулирования данными, выполняющаяся по принципу "все или ничего", и переводящая базу данных из одного целостного состояния в другое целостное состояние. Транзакция обладает четырьмя важными свойствами, известными как свойства АСИД: 1. (А) Атомарность. 2. (С) Согласованность. 3. (И) Изоляция. 4. (Д) Долговечность. Атомарность Транзакции важны как в многопользовательских, так и в однопользовательских системах. В однопользовательских системах транзакции - это логические единицы работы, после выполнения которых база данных остается в целостном состоянии. Транзакции также являются единицами восстановления данных после сбоев - восстанавливаясь, система ликвидирует следы транзакций, не успевших успешно завершиться в результате программного или аппаратного сбоя. Эти два свойства транзакций определяют атомарность (неделимость) транзакции. Атомарность. Транзакция выполняется как атомарная операция - либо выполняется вся транзакция целиком, либо она целиком не выполняется. Изоляция и согласованность В многопользовательских системах, кроме того, транзакции служат для обеспечения изолированной работы отдельных пользователей пользователям, одновременно работающим с одной базой данных, кажется, что они работают как бы в однопользовательской системе и не мешают друг другу. Изоляция. Транзакции разных пользователей не должны мешать друг другу (например, как если бы они выполнялись строго по очереди). Согласованность База данных находится в согласованном состоянии, если для этого состояния выполнены все ограничения целостности. Ограничение целостности - это некоторое утверждение, которое может быть истинным или ложным в зависимости от состояния базы данных. Ограничения целостности классифицируются несколькими способами: 1. По способам реализации. 1.1 Декларативную поддержку ограничений целостности средствами языка определения данных (DDL). 1.2 Процедурную поддержку ограничений целостности - посредством триггеров и хранимых процедур. 2. По времени проверки. 2.1 Немедленно проверяемые ограничения. 2.2 Ограничения с отложенной проверкой. 3. По области действия. 3.1 Ограничения домена. 3.2 Ограничения атрибута. 3.3 Ограничения кортежа. 3.4 Ограничения отношения. 3.5 Ограничения базы данных. Стандарт языка SQL поддерживает только декларативные ограничения целостности, реализуемые как: 1. Ограничения домена. 2. Ограничения, входящие в определение таблицы. 3. Ограничения, хранящиеся в базе данных в виде независимых утверждений (assertion). Проверка ограничений допускается как после выполнения каждого оператора, могущего нарушить ограничение, так и в конце транзакции. Во время выполнения транзакции можно изменить режим проверки ограничения. Примерами ограничений целостности могут служить следующие утверждения: Пример 2. Возраст сотрудника не может быть меньше 18 и больше 65 лет. Пример 3. Каждый сотрудник имеет уникальный табельный номер. Пример 4. Сотрудник обязан числиться в одном отделе. Пример 5. Сумма накладной обязана равняться сумме произведений цен товаров на количество товаров для всех товаров, входящих в накладную. Пример 3 представляет ограничение, реализующее целостность сущности. Пример 4 представляет ограничение, реализующее ссылочную целостность. Другие ограничения являются достаточно произвольными утверждениями (примеры 2 и 5). Любое ограничение целостности является семантическим понятием, т.е. появляется как следствие определенных свойств объектов предметной области и/или их взаимосвязей. Согласованность. Транзакция переводит базу данных из одного согласованного (целостного) состояния в другое согласованное (целостное) состояние. Внутри транзакции согласованность базы данных может нарушаться. Долговечность Если транзакция выполнена, то результаты ее работы должны сохраниться в базе данных, даже если в следующий момент произойдет сбой системы. Вопросы для самоконтроля 1.Что такое транзакция? 2.Какими свойствами обладают транзакции? 3.Как классифицируются ограничения целостности? Лекция №14. Администрирование баз данных. Администрирование В общую компетенцию администратора базы данных входит упрощение разработки и использования базы данных. Обычно это означает поддержание баланса между противоречащими друг другу установками — на защиту базы данных и на максимизацию ее доступности и выгоды от ее использования. Администратор базы данных отвечает за разработку, функционирование и обслуживание базы данных и ее приложений. Функции администратора БД: - Управление структурой базы данных. - Управление параллельной обработкой. - Распределение прав и обязанностей по обработке. - Обеспечение безопасности базы данных. - Восстановление базы данных. - Поддержание репозитория данных. Управление структурой базы данных включает: 1. Участие в разработке БД и приложения - помощь на стадии определения требований и создания модели данных, - активное участие в проектировании и создании БД. 2. Помощь в изменении структуры БД: - оценка влияния изменений на каждого пользователя БД, - документирование всех изменений. Управление параллельной обработкой Меры по управлению параллельной обработкой нацелены на предотвращение непредусмотренного влияния действий одного пользователя на действия другого. Иногда цель состоит в том, чтобы в условиях параллельной обработки пользователь получил такой же результат, как и в случае, если бы он был единственным пользователем. В других случаях подразумевается, что действия различных пользователей будут влиять друг на друга, но ожидаемым образом. Например, пользователь, который ввел свой заказ в компьютерную систему, должен получить один и тот же результат, независимо от того, сколько еще есть пользователей, кроме него — ни одного или сотни. С другой стороны, пользователь, запрашивающий отчет о состоянии склада на самый последний момент, возможно, захочет получить информацию о незавершенных изменениях, начатых другими пользователями, даже если существует риск, что эти изменения впоследствии будут отменены. К сожалению, не существует способа управления параллельной обработкой, который одинаково хорошо подходил бы для всех ситуаций. Все эти способы предполагают некоторый компромисс. Например, пользователь может весьма жестко управлять параллельной обработкой, заблокировав всю базу данных, но пока будут обрабатываться данные для него, ни один другой пользователь не сможет ничего сделать. Такая защита надежна, но дорога. Как вы увидите, существуют и другие меры, которые труднее запрограммировать или реализовать, зато они повышают производительность. Есть также меры, максимизирующие производительность при низком уровне управления параллельной обработкой. При проектировании многопользовательских баз данных вам придется делать выбор среди этих компромиссов. Необходимость в атомарных транзакциях В большинстве приложений баз данных работа пользователей организована в форме транзакций (transactions), известных также как логические единицы работы (logical units of work, LUW). Транзакция - это последовательность действий с базой данных, в которой либо все действия выполняются успешно, либо не выполняется ни одно из них (в последнем случае база данных остается без изменений). Такая транзакция иногда называется атомарной (atomic), поскольку она выполняется как единое целое. Рассмотрим следующую последовательность действий с базой данных, которые могут потребоваться при регистрации нового заказа. Изменить запись данного покупателя, увеличив сумму к оплате. Изменить запись продавца, увеличив сумму комиссионных. Вставить в базу данных запись о новом заказе. Предположим, что на последнем шаге нас постигла неудача – например, из-за недостатка файлового пространства. Представьте себе недоразумение, которое возникло бы, если бы выполнены были только первые два действия, но не третье. Покупателю был бы выставлен счет за заказ, который он не получал, а продавец получил бы комиссионные за товар, который он не отправлял покупателю. Ясно, что эти три действия должны выполняться как единое целое: либо все сразу, либо ни одного. На рис. 1 и 2 приведено сравнение результатов этих действий в виде последовательности независимых шагов (рис. 1) и в виде атомарной транзакции (рис. 2). Обратите внимание, что когда терпит неудачу одно из действий, составляющих атомарную транзакцию, то изменения в базе данных не производятся. Также обратите внимание, что для указания рамок транзакции прикладная программа должна дать команды на начало транзакции (Start Transaction), сохранение транзакции (Commit Transaction) и откат транзакции (Rollback Transaction). Конкретная форма этих команд различается в разных СУБД. Рис. 1. Последовательность в транзакциях – ошибки без использования транзакции Рис. 2. Последовательность в транзакциях – атомарная транзакция предотвращает ошибки Вопросы для самоконтроля 1.Перечислите функции администратора баз данных. 2.Что такое атомарные транзакции? Какова в них необходимость? 3.Как можно управлять параллельной обработкой? Лекция №15. Обработка транзакций. Параллельная обработка транзакций Когда в одно и то же время происходит обработка двух транзакций с базой данных, эти транзакции называются параллельными транзакциями (concurrent transactions). Хотя у пользователей может создаваться впечатление, что их транзакции обрабатываются одновременно, это не может быть так, ибо процессор машины, обрабатывающей базу данных, способен выполнять только одну инструкцию в каждый момент времени. Обычно транзакции выполняются попеременно, то есть операционная система переключает процессор между несколькими задачами, так что за заданный промежуток времени выполняется некоторая часть каждой из них. Это переключение между задачами происходит столь быстро, что два человека, сидящие бок о бок перед двумя компьютерами и работающие с одной и той же базой данных, могут подумать, что их транзакции выполняются одновременно; в реальности же они перемежаются. На рис. 3 показаны две параллельные транзакции. Транзакция пользователя А считывает элемент 100, изменяет его и записывает обратно в базу данных. Транзакция пользователя В выполняет те же самые действия, но с элементом 200. Процессор обрабатывает транзакцию пользователя А, пока не произойдет прерывание ввода-вывода или какая-либо иная задержка пользователя А. Тогда процессор переключается на пользователя В и обрабатывает его транзакцию до прихода прерывания, после чего операционная система передает управление обратно транзакции первого пользователя. Пользователям обработка кажется одновременной, но на самом деле она попеременная, или параллельная. Рис. 3. Пример параллельной обработки запросов 2-х пользователей Проблема потерянного обновления Параллельная обработка, изображенная на рис. 3, не вызывает проблем, поскольку пользователи обрабатывают различные данные. Но предположим, что оба пользователя хотят обратиться к элементу 100. Например, пользователь А хочет заказать пять единиц товара 100, а пользователь В — три единицы этого же товара. Рисунок 4 иллюстрирует возникающую проблему. Пользователь А считывает запись о товаре 100 в свою рабочую область. В соответствии с этой записью, в наличии имеется 10 единиц товара. Затем пользователь В читает запись о товаре 100 в свою рабочую область. Опять-таки, согласно этой записи, в наличии имеется 10 единиц товара. Теперь пользователь А берет пять единиц товара, уменьшает количество единиц товара в своей рабочей области до пяти и обновляет запись для товара 100. После этого пользователь В берет три единицы товара, уменьшает количество товара в своей рабочей области до семи единиц и записывает это количество в базу данных. Теперь база данных ошибочно показывает, что в наличии имеется семь единиц товара 100. Итак: мы начали с 10 единиц в наличии, пользователь А взял пять, пользователь В взял три, а база данных показывает, что осталось семь. Ясно, что это не так. Данные обоих пользователей были верными на момент считывания. Но когда пользователь В считывал запись, у пользователя А уже была ее копия, которую он вот-вот собирался изменить. Эта ситуация носит название проблемы потерянного обновления (lost update problem), или проблемы параллельного обновления (concurrent update problem). Существует другая, схожая проблема, называемая проблемой несогласованного чтения (inconsistent read problem). В этом случае пользователь А читает данные, которые были обработаны некоторым фрагментом транзакции пользователя В. Как следствие, у пользователя А оказываются ошибочные данные. Одно из средств против несогласованностей, вызванных параллельной обработкой, состоит в том, чтобы не давать нескольким приложениям получать копии одной и той же записи, когда предполагается скорое изменение данной записи. Это средство называется блокировкой ресурсов (resource locking). Рис. 4. Проблема потерянного обновления Блокировка ресурсов Один из способов предотвратить проблемы при параллельной обработке – запретить совместное использование ресурсов путем блокировки данных, которые считываются для обновления. На рис. 5 изображен порядок обработки при использовании команды lock. Из-за блокировки транзакция пользователя В должна ждать, пока пользователь А не закончит работу с данными по товару 100. При такой стратегии пользователь В сможет прочесть запись о товаре 100 только после того, как пользователь А завершит ее модификацию. В этом случае результирующее количество единиц товара в базе данных будет равно двум, как и должно быть (было десять, А взял пять, В взял три, осталось два). Блокировочная терминология Блокировка может налагаться либо автоматически, по инициативе СУБД, либо по команде, которая передается СУБД прикладной программой или запросом пользователя. Блокировка, налагаемая СУБД, называется неявной блокировкой (implicit locks), а блокировка, налагаемая по команде, — явной блокировкой (explicit locks). В предыдущем примере блокировка налагалась на строки данных. Однако не все типы блокировки налагаются на этом уровне. Одни СУБД предусматривают блокировку на уровне страницы, другие — на уровне таблицы, а третьи — на уровне базы данных. Размер блокируемого ресурса называется глубиной детализации блокировки (lock granularity). При малой глубине детализации СУБД легче справляется с администрированием блокировки, но такие блокировки часто являются причиной конфликтов. Блокировки с большой глубиной детализации сложно администрировать (СУБД приходится отслеживать и проверять гораздо больше деталей), но конфликты при этом менее часты. Блокировки различаются также по типу. При монопольной блокировке (exclusive lock) блокируются все виды доступа к элементу. Ни одна другая транзакция не может читать или изменять данные. Коллективная блокировка (shared lock) защищает элемент от изменения, но не от чтения. То есть другие транзакции могут свободно читать данный элемент, если они не пытаются изменить его. Рис. 5. Параллельная обработка с явными блокировками Сериализуемые транзакции Когда две или более транзакции обрабатываются параллельно, их результаты, сохраняемые в базе данных, должны быть логически согласованы с результатами, которые получились бы, если бы данные транзакции обрабатывались произвольным последовательным способом. Такая схема обработки параллельных транзакций называется сериализуемой (serializable). Сериализуемость может быть достигнута несколькими способами. Один из способов — обработка транзакций с использованием двухфазной блокировки (two-phase locking). При этой стратегии транзакциям позволяется налагать блокировки по мере необходимости, но как только первая блокировка снимается, данная транзакция уже не может наложить никаких других блокировок. Таким образом, транзакции имеют фазу нарастания (growing phase), на которой блокировки налагаются, и фазу сжатия (shrinking phase), на которой блокировки снимаются. В ряде СУБД используется особая разновидность двухфазной блокировки. В этом случае блокировки налагаются на всем протяжении транзакции, но ни одна блокировка не освобождается, пока не будет выдана команда COMMIT (сохранение) или ROLLBACK (откат, возврат к предыдущему состоянию). Эта стратегия имеет более ограничительный характер, чем требуется для двухфазной блокировки, зато ее легче реализовать. Вообще говоря, рамки транзакции должны соответствовать границам представления базы данных, которое она обрабатывает. В двухфазной стратегии строки каждого отношения в представлении блокируются по мере необходимости. Изменения производятся, но информация не записывается в базу данных, пока представление не будет полностью обработано. После этого изменения сохраняются в базе данных, и все блокировки снимаются. Рассмотрим ввод заказа с помощью представления ЗАКАЗ— ПОКУПАТЕЛЬ, базирующегося на таблицах ПОКУПАТЕЛЬ, ПРОДАВЕЦ и ЗАКАЗ. Чтобы гарантировать, что база данных не пострадает от аномалий, вызванных параллельной обработкой, транзакция ввода заказа налагает блокировки на таблицы ПОКУПАТЕЛЬ, ПРОДАВЕЦ и ЗАКАЗ по мере необходимости, производит все необходимые изменения в базе данных, а затем снимает блокировки. Вопросы для самоконтроля 1.Какие виды транзакций вы знаете? 2.От чего защищает коллективная блокировка? 3.Какая ситуация носит название проблемы потерянного времени? ПРАКТИЧЕСКИЕ ЗАНЯТИЯ Тема практического занятия №1 Знакомство с системой MySQL. Цель: установка MySQL, ознакомление с основными возможностями и особенностями системы. Основные характеристики MySQL База данных представляет собой структурированную совокупность данных. Эти данные могут быть любыми - от простого списка предстоящих покупок до перечня экспонатов картинной галереи или огромного количества информации в корпоративной сети. Для записи, выборки и обработки данных, хранящихся в компьютерной базе данных, необходима система управления базой данных, каковой п является ПО MySQL. Поскольку компьютеры замечательно справляются с обработкой больших объемов данных, управление базами данных играет центральную роль в вычислениях. Реализовано такое управление может быть поразному - как в виде отдельных утилит, так и в виде кода, входящего в состав других приложений. • MySQL - это система управления реляционными базами данных. В реляционной базе данные хранятся в отдельных таблицах, благодаря чему достигается выигрыш в скорости и гибкости. Таблицы связываются между собой при помощи отношений, благодаря чему обеспечивается возможность объединять при выполнении запроса данные из нескольких таблиц. SQL как часть системы MySQL можно охарактеризовать как язык структурированных запросов плюс наиболее распространенный стандартный язык, используемый для доступа к базам данных. • Программное обеспечение MySQL - это ПО с открытым кодом. ПО с открытым кодом означает, что применять и модифицировать его может любой желающий. Такое ПО можно получать по Internet и использовать бесплатно. При этом каждый пользователь может изучить исходный код и изменить его в соответствии со своими потребностями. Технические возможности СУБД MySQL ПО MySQL является системой клиент-сервер, которая содержит многопоточный SQL-сервер, обеспечивающий поддержку различных вычислительных машин баз данных, а также несколько различных клиентских программ и библиотек, средства администрирования и широкий спектр программных интерфейсов (API). • Безопасность Система безопасности основана на привилегиях и паролях с возможностью верификации с удаленного компьютера, за счет чего обеспечивается гибкость и безопасность. Пароли при передаче по сети при соединении с сервером шифруются. Клиенты могут соединяться с MySQL, используя сокеты TCP/IP, сокеты Unix или именованные каналы (named pipes, под NT) Вместимость данных Начиная с MySQL версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 миллионов терабайт (263 bytes). Однако следует заметить, что операционные системы имеют свои собственные ограничения по размерам файлов. Ниже приведено несколько примеров: 32-разрядная Linux-Intel - размер таблицы 4 Гб. Solaris 2.7 Intel - 4 Гб Solaris 2.7 UltraSPARC - 512 Гб WindowsXP - 4 Гб Как можно видеть, размер таблицы в базе данных MySQL обычно лимитируется операционной системой. По умолчанию MySQL-таблицы имеют громка максимальный размер около 4 Гб. Для любой таблицы можно проверить/определить ее максимальный размер с помощью команд SHOW TABLE STATUS или myisamchk -dv table_name. Если большая таблица предназначена только для чтения, можно воспользоваться myisampack, чтобы слить несколько таблиц в одну и сжать ее. Обычно myisampack ужимает таблицу по крайней мере на 50%, поэтому в результате можно получить очень большие таблицы. Кроме технических подробностей можно добавить, что MySQL работает как на Unix, так и на платформе Windows 95/98, он очень прост и удобен в работе. Клиентская программа MySQL представляет собой утилиту командной строки. Эта программа подключается к серверу по сети. Команды, выполняемые сервером, обычно связаны с чтением и записью данных на жестком диске. Клиентские программы могут работать не только в режиме командной строки. Есть и графические клиенты, например MySQL GUI, PhpMyAclmin и др. Существует очень популярный визуальный интерфейс (кстати, написанный на РНР) для работы с этой СУБД. Называется он PhpMyAdmin. Этот интерфейс позволяет значительно упростить работу с базами данных в MySQL. PhpMyAdmin (см. рисунок 3) позволяет пользоваться всеми достоинствами браузера, включая прокрутку изображения, если оно не умещается на экран. Многие из базовых SQL-функций работы с данными в PhpMyAdmin сведены к интуитивно понятным интерфейсам и действиям, напоминающим переход по ссылкам в Internet. Введение в SQL MySQL взаимодействует с базой данных на языке, называемом SQL (Structured Query Language — язык структурированных запросов). SQL предназначен для манипуляции данными, которые хранятся в Системах управления реляционными базами данных (RDBMS). SQL имеет команды, с помощью которых данные можно извлекать, сортировать, обновлять, удалять и добавлять. Стандарты языка SQL определяет ANSI (American National Standards Institute). В настоящее время действует стандарт, принятый в 2003 году (SQL-3). SQL можно использовать с такими RDBMS как MySQL, mSQL, PostgresSQL, Oracle, Microsoft SQL Server, Access, Sybase, Ingres. Эти системы RDBMS поддерживают все важные и общепринятые операторы SQL, однако каждая из них имеет множество своих собственных патентованных операторов и расширений. SQL является общим языком запросов для нескольких баз данных различных типов. Данный курс рассматривает систему MySQL, которая является RDBMS с открытым исходным кодом, доступной для загрузки на сайте MySQL.соm. Типы данных системы MySQL поддерживает несколько типов столбцов, которые можно разделить на три категории: числовые типы данных, типы данных для хранения даты и времени и символьные (строковые) типы данных. В данной лекции мы вначале рассмотрим все возможные типы и приведём требования по хранению для каждого типа столбца, затем опишем свойства типов более подробно по каждой категории. Ниже перечислены типы столбцов, поддерживаемые MySQL. В описаниях используются обозначения, которые использовали разработчики MySql в официальной документации: М - указывает максимальный размер вывода. Максимально допустимый размер вывода составляет 255 символов. D - употребляется для типов данных с плавающей точкой и указывает количество разрядов, следующих за десятичной точкой. Максимально возможная величина составляет 30 разрядов, но не может быть больше, чем М-2. Квадратные скобки ('[' и ']') указывают для типа данных группы необязательных признаков. В таблице 1 представлены типы полей MySql. Таблица . 1. Типы полей MySql TINYINT[(M)] [UNSIGNED] Очень малое целое число. Диапазон со знаком [ZEROFILL] от-128 до 127. Диапазон без знака от 0 до 255 BIT, BOOL SMALLINT[(M)] [UNSIGNED] [ZEROFILL] MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] INT[(M)] [UNSIGNED] [ZEROFILL] Синонимы TINYINT(l) Малое целое число. Диапазон со знаком от 32768 до 32767. Диапазон без знака от 0 до 65535. Целое число среднего размера. Диапазон со знаком от -8388608 до 8388607. Диапазон без знака от 0 до 16777215 Целое число нормального размера. Диапазон со знаком от -2147483648 до 2147483647. Диапазон без знака от 0 до 4294967295. INTEGER[(M)] [UNSIGNED] Синоним для INT [ZEROFILL] Большое целое число. Диапазон со знаком от 9223372036854775808 до 9223372036854775807. Диапазон без знака отОдо 18446744073709551615 Число с плавающей точкой. Атрибут точности FL0AT(T04H0CTb) может иметь значение <=24 для числа с [UNSIGNED] [ZEROFILL] плавающей точкой обычной (одинарной) точности и между 25 и 53 – для числа с плавающей точкой удвоенной точности. FLOAT[(M,D)] [UNSIGNED] Малое число с плавающей точкой обычной точности. Допустимые значения: от [ZEROFILL] 3,402823466Е+38 до -1Д75494351Е-38, О, и от 1Д75494351Е-38 до 3,402823466Е+38. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут М указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение FLOAT без указания аргументов или запись вида FLOAT(X), где X <=24 справедливы для числа с плавающей точкой обычной точности. Число с плавающей точкой удвоенной DOUBLE [(M,D)] точности нормального размера. Допустимые [UNSIGNED] [ZEROFILL] значения: от -1,7976931348623157Е+308 до 2,2250738585072014Е-308, 0, и от 2,2250738585072014Е-308 до BIGINT[(M)] [UNSIGNED] [ZEROFILL] DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] или DEC[(M[,D])] [UNSIGNED] [ZEROFILL] или NUMERIC[(M[.D])] [UNSIGNED] [ZEROFILL] DATE DATETIME TIMESTAMP[(M)] 1,7976931348623157Е+308. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут М указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение DOUBLE без указания аргументов или запись вида FLOAT(X), где 25 <= X <= 53 справедливы для числа с плавающей точкой двойной точности. "Неупакованное" число с плавающей точкой. Ведет себя подобно столбцу CHAR, содержащему цифровое значение. Термин "неупакованное" означает, что число хранится в виде строки и при этом для каждого десятичного знака используется один символ. Разделительный знак десятичных разрядов, а также знак для отрицательных чисел не учитываются в М (но место для них зарезервировано). Если атрибут D равен 0, величины будут представлены без десятичного знака, т.е. без дробной части. Максимальный интервал значений типа DECIMAL тот же, что и для типа DOUBLE, но действительный интервал для конкретного столбца DECIMAL может быть ограничен выбором значений атрибутов М и D. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Если атрибут D не указан, его значение по умолчанию равно 0. Если не указан М, его значение по умолчанию равно 10. Дата. Поддерживается интервал от •1000-01-01' до '9999-12-31*. MySQL выводит значения DATE в формате 'YYYY-MM-DD', но можно установить значения в столбец DATE, используя как строки, так и числа. Комбинация даты и времени. Поддерживается интервал от '1000-01-01 00:00:00' до '9999-1231 23:59:59'. MySQL выводит значения DATETIME в формате 'YYYY-MM-DD HH:MM:SS\ но можно устанавливать значения в столбце DATETIME, используя как строки, так и числа. Временная метка. Интервал от '1970-01-01 00:00:00' до некоторого значения времени в 2037 году. MySQL выводит значения TIMESTAMP в форматах YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD или YYMMDD в зависимости от TIME YEAR[(2 4)] [NATIONAL] CHAR(M) [BINARY] CHAR значений М: 14 (или отсутствующее), 12, 8, или 6: но можно также устанавливать значения в столбце TIMESTAMP, используя как строки, так и числа. Столбец TIMESTAMP полезен для записи даты и времени при выполнении операций INSERT или UPDATE, так как при этом автоматически вносятся значения даты и времени самой последней операции, если эти величины не введены программой. Можно также устанавливать текущее значение даты и времени, задавая значение NULL. Время. Интервал от '-838:59:59' до '838:59:59'. MySQL выводит значения TIME в формате 'HH:MM:SS', но можно устанавливать значения в столбце TIME, используя как строки, так и числа. Год в двухзначном или четырехзначном форматах (по умолчанию формат четырехзначный). Допустимы следующие значения: с 1901 по 2155, 0000 для четырехзначного формата года и 1970-2069 при использовании двухзначного формата (7069). MySQL выводит значения YEAR в формате YYYY, но можно задавать значения в столбце YEAR, используя как , так и числа. Строка фиксированной длины, при хранении всегда дополняется пробелами в конце строки до заданного размера. Диапазон аргумента М составляет от 0 до 255 символов. Концевые пробелы удаляются при выводе значения. Если не задан атрибут чувствительности к регистру BINARY, то величины CHAR сортируются и сравниваются как независимые от регистра в соответствии с установленным по умолчанию алфавитом. Атрибут NATIONAL CHAR (или его эквивалентная краткая форма NCHAR) представляет собой принятый в ANSI SQL способ указания, что в столбце CHAR должен использоваться установленный по умолчанию набор символов (CHARACTER). Это синоним для CHAR(l). [NATIONAL] VARCHAR(M) Строка переменной длины. Примечание: концевые пробелы удаляются при сохранении [BINARY] значения (в этом заключается отличие от спецификации ANSI SQL). Диапазон аргумента М составляет от 0 до 255 символов. Если не задан атрибут чувствительности к регистру BINARY, то величины VARCHAR сортируются и сравниваются как независимые от регистра. TINYBLOB. TINYTEXT Столбец типа BLOB или TEXT с максимальной длиной 255 символов BLOB. TEXT Столбец типа BLOB или TEXT с максимальной длиной 65535 символов. MEDIUMBLOB, MEDIUMTEXT Столбец типа BLOB или TEXT с максимальной длиной 16777215 символов. LONGBLOB, LONGTEXT Столбец типа BLOB пли TEXT с максимальной длиной 4294967295 символов. Перечисляемый тип данных. Объект строки может иметь только одно значения выбранное из заданного списка величин 'значение1’, 'значение2',..., NULL или специальная величина ошибки "". Список ENUM может содержать максимум 65535 различных величин SЕТ(значение1’,’значение2',... Набор. Объект строки может иметь ноль или более значений, каждое из которых должно ) быть выбрано из заданного списка величин 'значение1’, 'значение2',... Список SET может содержать максимум 64 элемента. ЕNUМ('значение 1 ','значение2',...) Таблица . 1. Типы полей MySql TINYINT[(M)] [UNSIGNED] Очень малое целое число. Диапазон со знаком [ZEROFILL] от-128 до 127. Диапазон без знака от 0 до 255 BIT, BOOL SMALLINT[(M)] [UNSIGNED] [ZEROFILL] MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] INT[(M)] [UNSIGNED] [ZEROFILL] Синонимы TINYINT(l) Малое целое число. Диапазон со знаком от 32768 до 32767. Диапазон без знака от 0 до 65535. Целое число среднего размера. Диапазон со знаком от -8388608 до 8388607. Диапазон без знака от 0 до 16777215 Целое число нормального размера. Диапазон со знаком от -2147483648 до 2147483647. Диапазон без знака от 0 до 4294967295. INTEGER[(M)] [UNSIGNED] Синоним для INT [ZEROFILL] Большое целое число. Диапазон со знаком от 9223372036854775808 до 9223372036854775807. Диапазон без знака отОдо 18446744073709551615 Число с плавающей точкой. Атрибут точности FL0AT(T04H0CTb) может иметь значение <=24 для числа с [UNSIGNED] [ZEROFILL] плавающей точкой обычной (одинарной) точности и между 25 и 53 – для числа с плавающей точкой удвоенной точности. FLOAT[(M,D)] [UNSIGNED] Малое число с плавающей точкой обычной точности. Допустимые значения: от [ZEROFILL] 3,402823466Е+38 до -1Д75494351Е-38, О, и от 1Д75494351Е-38 до 3,402823466Е+38. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут М указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение FLOAT без указания аргументов или запись вида FLOAT(X), где X <=24 справедливы для числа с плавающей точкой обычной точности. Число с плавающей точкой удвоенной DOUBLE [(M,D)] точности нормального размера. Допустимые [UNSIGNED] [ZEROFILL] значения: от -1,7976931348623157Е+308 до 2,2250738585072014Е-308, 0, и от 2,2250738585072014Е-308 до 1,7976931348623157Е+308. Если указан атрибут UNSIGNED, отрицательные значения недопустимы. Атрибут М указывает количество выводимых пользователю знаков, а атрибут D - количество разрядов, следующих за десятичной точкой. Обозначение DOUBLE без указания аргументов или запись вида FLOAT(X), где 25 <= X <= 53 справедливы для числа с плавающей точкой двойной точности. DECIMAL[(M[,D])] "Неупакованное" число с плавающей точкой. [UNSIGNED] [ZEROFILL] Ведет себя подобно столбцу CHAR, или DEC[(M[,D])] содержащему цифровое значение. Термин [UNSIGNED] [ZEROFILL] "неупакованное" означает, что число хранится или NUMERIC[(M[.D])] в виде строки и при этом для каждого [UNSIGNED] [ZEROFILL] десятичного знака используется один символ. Разделительный знак десятичных разрядов, а также знак для отрицательных чисел не учитываются в М (но место для них зарезервировано). Если атрибут D равен 0, величины будут представлены без десятичного знака, т.е. без дробной части. Максимальный интервал значений типа DECIMAL тот же, что и для типа DOUBLE, но действительный интервал для конкретного столбца DECIMAL может быть ограничен выбором значений атрибутов М и D. Если указан атрибут BIGINT[(M)] [UNSIGNED] [ZEROFILL] DATE DATETIME TIMESTAMP[(M)] TIME YEAR[(2 4)] UNSIGNED, отрицательные значения недопустимы. Если атрибут D не указан, его значение по умолчанию равно 0. Если не указан М, его значение по умолчанию равно 10. Дата. Поддерживается интервал от •1000-01-01' до '9999-12-31*. MySQL выводит значения DATE в формате 'YYYY-MM-DD', но можно установить значения в столбец DATE, используя как строки, так и числа. Комбинация даты и времени. Поддерживается интервал от '1000-01-01 00:00:00' до '9999-1231 23:59:59'. MySQL выводит значения DATETIME в формате 'YYYY-MM-DD HH:MM:SS\ но можно устанавливать значения в столбце DATETIME, используя как строки, так и числа. Временная метка. Интервал от '1970-01-01 00:00:00' до некоторого значения времени в 2037 году. MySQL выводит значения TIMESTAMP в форматах YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD или YYMMDD в зависимости от значений М: 14 (или отсутствующее), 12, 8, или 6: но можно также устанавливать значения в столбце TIMESTAMP, используя как строки, так и числа. Столбец TIMESTAMP полезен для записи даты и времени при выполнении операций INSERT или UPDATE, так как при этом автоматически вносятся значения даты и времени самой последней операции, если эти величины не введены программой. Можно также устанавливать текущее значение даты и времени, задавая значение NULL. Время. Интервал от '-838:59:59' до '838:59:59'. MySQL выводит значения TIME в формате 'HH:MM:SS', но можно устанавливать значения в столбце TIME, используя как строки, так и числа. Год в двухзначном или четырехзначном форматах (по умолчанию формат четырехзначный). Допустимы следующие значения: с 1901 по 2155, 0000 для четырехзначного формата года и 1970-2069 при использовании двухзначного формата (7069). MySQL выводит значения YEAR в формате YYYY, но можно задавать значения в столбце YEAR, используя как , так и числа. [NATIONAL] CHAR(M) [BINARY] CHAR Строка фиксированной длины, при хранении всегда дополняется пробелами в конце строки до заданного размера. Диапазон аргумента М составляет от 0 до 255 символов. Концевые пробелы удаляются при выводе значения. Если не задан атрибут чувствительности к регистру BINARY, то величины CHAR сортируются и сравниваются как независимые от регистра в соответствии с установленным по умолчанию алфавитом. Атрибут NATIONAL CHAR (или его эквивалентная краткая форма NCHAR) представляет собой принятый в ANSI SQL способ указания, что в столбце CHAR должен использоваться установленный по умолчанию набор символов (CHARACTER). Это синоним для CHAR(l). [NATIONAL] VARCHAR(M) Строка переменной длины. Примечание: концевые пробелы удаляются при сохранении [BINARY] значения (в этом заключается отличие от спецификации ANSI SQL). Диапазон аргумента М составляет от 0 до 255 символов. Если не задан атрибут чувствительности к регистру BINARY, то величины VARCHAR сортируются и сравниваются как независимые от регистра. Столбец типа BLOB или TEXT с TINYBLOB. TINYTEXT максимальной длиной 255 символов BLOB. TEXT Столбец типа BLOB или TEXT с максимальной длиной 65535 символов. MEDIUMBLOB, MEDIUMTEXT Столбец типа BLOB или TEXT с максимальной длиной 16777215 символов. LONGBLOB, LONGTEXT Столбец типа BLOB пли TEXT с максимальной длиной 4294967295 символов. ЕNUМ('значение 1 ','значение2',...) Перечисляемый тип данных. Объект строки может иметь только одно значения выбранное из заданного списка величин 'значение1’, 'значение2',..., NULL или специальная величина ошибки "". Список ENUM может содержать максимум 65535 различных величин SЕТ(значение1’,’значение2',... Набор. Объект строки может иметь ноль или более значений, каждое из которых должно ) быть выбрано из заданного списка величин 'значение1’, 'значение2',... Список SET может содержать максимум 64 элемента. • Установка системы Установка комплекта Apache + Mysql + Php. Итак, закачиваем дистрибутив Apache 2.4.5 и запускаем файл apache_2.0.55- win32-2.x.x.exe 1) Перед вами появляется окошко: Здесь нас программа информирует, что вы собираетесь установить себе на локальную машину (вам компьютер) Apache HTTP Server 2.4.5. Нажимаем кнопку Next. 2) Далее выбираем пусть установки в нашем случае это будет: C:\AppServ: 3) Три возможных способа установки: выборочный и обычный, компактный (выбираем обычный typical): 4) Следующее окно, показанное на рисунке 7, позволяет ввести информацию о сервере: имя сервера и адрес электронной почты администратора. Если установка происходит на локальную машину, то в поля для имени сервера следует ввести localhost (см. рисунок 7). localhost - это имя для использования сервера на локальной машине, которое связано с IP-адресом 127.0.0.1, который зарезервирован для локального использования. В нижней части окна предлагается выбрать номер порта, по которому сервер будет принимать запросы (80 или 8080). 5) Далее в окне настроек следует ввести имя пользователя и пароль. Вводим пароль для пользователя root (пользователь, который имеет неограниченные права). После этого мастер установки сообщит о готовности к процессу установки, и после нажатия кнопки Install, будет произведено копирование файлов сервера. Если установка прошла успешно, Windows автоматически запустит Apache. В конечном итоге у нас должен появиться значок Apache monitor, с его помощью мы будем запускать, и отключать наш Apache: Запуск и настройка Apache Теперь необходимо научиться управлять Apache, а именно научится запускать, останавливать и перезапускать сервер. Существует много способов осуществить эти операции: при помощи утилиты ApacheMonitor, используя консоль управления сервисов Windows, используя пункты меню Пуск, из командной строки. Мы рассмотрим консоль управления сервисов Windows, позволяющего настроить Apache для автоматического старта при запуске системы. Для запуска консоли управления выполните команду Пуск->Настройка->Панель управления->Администрирование>Службы. В появившемся окне консоли, на приведённом ниже рисунке, следует выбрать сервис Apache. Рисунок 10 Контекстное меню, открывающееся по нажатию на правой кнопке, позволяет осуществлять запуск, остановку и перезапуск сервиса. Службы Windows позволяют осуществлять запуск фоновых приложений при старте системы. Для этого необходимо перейти в окно Свойства, выбрав в контекстном меню сервиса пункт Свойства и в появившемся окне в выпадающем списке "Тип запуска" выбрать пункт "Авто". После успешной инсталляции при наборе в окне браузера http://localhost/ или http://127.0.0.1/ - должна загрузиться страница сервера (см. рисунок 12). Рисунок 12 Некоторые ОС имеют обыкновение при первом запуске Internet Explorer-a вызывать Мастер подключения. Если это произошло на вашей машине, нажмите кнопку «отмена» — якобы, вы уже настроили подключение самостоятельно. Если страница http://localhost не работает, вероятнее всего, вам нужно отключить прокси-сервер в настройках браузера. Для <простых> хостов (вроде localhost) обычно достаточно флажка «Не использовать прокси-сервер для локальных адресов» на вкладке Свойства обозревателя — Подключение — Настройка сети — Дополнительно. • Что такое phpMvAdmin phpMyAdmin является программой "визуального" управления базами данных MYSQL (смотрите рисунок). Данная программа написана на РНР и служит для наглядного вывода содержимого базы данных, а так же для простого и понятного управления ею. Программа phpMyAdmin является одним из самых распространенных средств для администрирования, управления и каждодневной работы с базами данных MySQL. Используя интерфейс данной программы Вы сможете создавать новые базы, импортировать данные, редактировать данные, изменять свойства полей в базе данных. Администраторы могут легко создавать аккаунты для пользователей, назначать им привилегии, создавать и настраивать базы данных. Причем, и пользователи, и администраторы могут использовать один и тот же скрипт - просто у пользователя, не обладающего необходимым уровнем доступа, не будет некоторых функций - например, выбора сервера БД, доступа к служебным базам и базам других пользователей и т.д. Но вся функциональность в рамках созданной для него базы полностью доступна. phpMyAdmin имеет встроенные средства для проведения текущих работ с базами и таблицами - обслуживание, проверка и починка испорченных таблиц, резервирование и восстановление из архивов, экспорт данных из таблиц, как в формате SQL, так и в более специфических, например LaTeX или PDF. Для уменьшения объема файл с данными можно сразу же на сервере сжать архиватором - это очень полезно для создания на своей машине копии из удаленной базы на сайте. Данная программа мультиязычна, имеется в ней и интерфейс с русским языком, как в кодировке Кириллица Windows так и в KOI8. Интерфейс программы состоит из двух вертикальных фреймов, в первом из них перечислены доступные базы (если вы администратор, см. рисунок 13), или же сразу таблицы вашей текущей базы данных, см. рисунок 14, если вы не имеете доступа к другим БД. Выбрав необходимую таблицу, вы можете перейти в окно просмотра ее параметров и настроек, см. рисунок 15. Страница загружается в основной фрейм, так что вся информация всегда находится перед глазами в одном окне браузера. В основном окне присутствует ряд вкладок вверху страницы (Рисунок 16), для перехода между основными операциями над таблицей, остальные же функции доступны через ссылки, которые теперь чаще всего обозначаются пиктограммами, что позволило получить очень компактный интерфейс. Программа позволяет выполнять любые SQL-запросы над базами, причем это можно делать как из специального, отдельного, окна запросов (Рисунок 17), так и для каждой таблицы отдельно (Рисунок 18). Очень интересная возможность - после выполнения запроса программа показывает не только детальную информацию о нем (время обработки, количество затронутых рядов), /см. рисунок 19/, но и предлагает показать расширенную информацию о использованных данных при построении запроса (индексах и прочее, что может быть полезно при построении сложных запросов, отладке и ручной оптимизации). Хотя большинство запросов надо прямо вводить в виде корректных SQL- выражений, но для операции поиска данных существует специальный удобный интерфейс. Для этого есть специальная вкладка "Искать"(см. рисунок 20), переход по которой открывает страницу, где поля для поиска представлены в виде формы, заполняя которую можно, не особо вдаваясь в тонкости синтаксиса конкретных выражений, создать довольно таки сложный запрос (имеется ввиду, запрос SELECT). Допустимые поля, варианты сравнения и сортировки результатов - все можно задать через выпадающие списки и меню, а дополнительные условия поиска можно указать в специальных текстовых полях. Хотя такой построитель выражений совсем не отменяет знания особенностей работы БД и SQL, он существенно помогает, когда надо быстро построить специфический поисковый запрос. Рисунок 19 При наличии полномочий пользователь через этот же вебинтерфейс может одним кликом мышки управлять таблицами и базами. Вся дополнительная функциональность упрятана на вкладке "Операции"- (рисунок 21). Тут можно изменить порядок следования полей в таблице, переименовать или переместить ее, создать новую таблицу путем копирования структуры данных или же самих данных, изменить тип таблицы, добавить комментарий и установить другие специфические опции, поддерживаемые сервером MySQL. Конечно, по отдельности все функции phpMyAdmin не уникальны. Строить запросы можно в MySQL Query Browser, там же присутствует полноценный отладчик SQL. администрировать сервер и тонко управлять производительностью можно программой MySQL Administrator - такого множества опций и настроек сервера БД не предоставляет никакая из существующих утилит. Импорт и экспорт данных, создание резервных копий баз лучше всего получается утилитам компании EMS. Но у всех этих программ есть существенный недостаток - все они предназначены для локальной установки (хоть и могут управлять удаленным сервером), функционируют под управлением ОС Windows (хотя есть отдельные версии и под Linux). phpMyAdmin позволяет сделать практически все, что необходимо обычному администратору, разработчику или пользователю и сделать это без необходимости установки какого-либо ПО, из любой точки мира, лишь бы был Интернет. Задания для выполнения к занятию №1 1. 2. 3. 4. 5. Опишите особенности архитектуры «Клиент-сервер». Опишите основные возможности и особенности системы MySQL Какие типы данных в системе MySQL. Установите MySQL. Для чего предназначена программа phpMyAdmin? Тема практического занятия №2 Создание учебной базы данных и проектирование таблиц в среде MySQL. Цель: создать реляционную Базу данных с помощью phpMyAdmin. набор таблиц в ней и заполнить таблицы данными для последующей работы. 1.Теоретические сведения. Реляционная база данных - это тело связанной информации, сохраняемой в двухмерных таблицах. Напоминает адресную или телефонную книгу. В книге имеется большое количество входов, каждый из которых соответствует определенной особенности. Для каждой такой особенности, может быть несколько независимых фрагментов данных, например имя, телефонный номер, и адрес. Предположим, что вы должны сформатировать эту адресную книгу в виде таблицы со строками и столбцами. Каждая строка (называемая также записью) будет соответствовать определенной особенности; каждый столбец будет содержать значение для каждого типа данных - имени, телефонного номера, и адреса представляемого в каждой строке. Адресная книга могла бы выглядеть следующим образом: Имя Телефон Адрес Gerry Farish (415)365-8775 127 Primrose Ave.,SF Celia Brock (707)874-3553 246 #3rd St.,Sonoma Yves Grillet (762)976-3665 Modernas,Barcelona 778 To, что вы получили, является основой реляционной базы данных, как и было, определено в начале этого обсуждения - а именно, двухмерной (строка и столбец) таблицей информации. Однако, реляционные базы данных редко состоят из одной таблицы. Такая таблица меньше, чем файловая система. Создав несколько таблиц взаимосвязанной информации. вы сможете выполнить более сложные и мощные операции с вашими данными. Мощность базы данных зависит от связи, которую вы можете создать между фрагментами информации, а не от самого фрагмента информации. СВЯЗЫВАНИЕ ОДНОЙ ТАБЛИЦЫ С ДРУГОЙ Предположим, что персонажи в нашей первой таблице (адресной книги) - это пациенты больницы. В другой таблице, мы могли бы запомнить дополнительную информацию об этих пациентах. Столбцы второй таблицы могли бы быть помечены как Пациент Доктор Страховка Баланс. Farish Drume B.C./B.S. $272.99 Grillet Halben None $44.76 Brock Halben Health,Inc. $9077.47 Много мощных функций можно выполнить, извлекая информацию из этих таблиц согласно указанным параметрам, особенно когда эти параметры включают в себя фрагменты информации связанные в различных таблицах друг с другом. Например, возьмем - докторов. Предположим, доктор Halben захотел получить номера телефонов всех своих пациентов. Чтобы извлечь эту информацию, он мог бы связать таблицу с номерами телефонов пациентов (по адресной книге) с таблицей, которая бы указывала, какой из пациентов - его. Хотя, в этом простом примере, он мог бы держать это в голове и сразу получать номера телефонов пациентов Grillet и Brock, эти таблицы могут быть слишком большими и слишком сложными. Программы реляционной базы данных разрабатывались, для того чтобы обрабатывать большие и сложные совокупности данных такого типа, что очевидно является более универсальным методом в деловом мире. Даже если бы база данных больницы содержала сотни или тысячи имен - как это вероятно и бывает на практике - одна команда SQL могла бы выдать доктору Halben информацию, в которой он нуждался почти немедленно. ПОРЯДОК СТРОК ПРОИЗВОЛЕН Чтобы поддерживать максимальную гибкость, строки таблицы, по определению, не должны находиться ни в каком определенном порядке. С этой точки зрения, в этом структура базы данных отличается от нашей адресной книги. Вход в адресную книгу обычно упорядочивается в алфавитном порядке. В системах, с реляционной базой данных, имеется одна мощная возможность для пользователей - это способность упорядочивать информацию так чтобы они могли восстанавливать ее. Рассмотрим вторую таблицу. Иногда Вам необходимо видеть эту информацию упорядоченной в алфавитном порядке по именам, иногда в возрастающем или убывающем порядке, а иногда сгруппированной по отношению к какому-нибудь доктору. Наложение порядка набора в строках будет сталкиваться со способностью заказчика изменять его, поэтому строки всегда рассматриваются как неупорядоченные. По этой причине, вы не можете просто сказать: " Мы хотим посмотреть пятую строку таблицы. " Пренебрегая порядком, в котором данные вводились или любым другим критерием, мы определим, не ту строку, хотя она и будет пятой. Строки таблицы, которые рассматриваются, не будут в какой-либо определенной последовательности. ИДЕНТИФИКАЦИЯ СТРОК ( ПЕРВИЧНЫЕ КЛЮЧИ ) По этим и другим причинам, вы должны иметь столбец в вашей таблице который бы уникально идентифицировал каждую строку. Обычно, этот столбец содержит номер - например, номер пациента, назначаемый каждому пациенту. Конечно, вы могли бы использовать им пациентов, но возможно, что имеется несколько Mary Smiths; и в этом случае, вы не будете иметь другого способа, чтобы отличить этих пациентов друг от друга. Вот почему номера так необходимы. Такой уникальный столбец (или уникальна группа столбцов), используемый чтобы идентифицировать каждую строку и хранить все строки отдельно, называются - первичными ключами таблицы. Первичные ключи таблицы важный элемент в структуре базы данных. Они - основа вашей системы записи в файл; и когда вы хотите найти определенную строку в таблице, вы ссылаетесь к этому первичному ключу. Кроме того, первичные ключи гарантируют, что ваши данные имеют определенную целостность. Если первичный ключ правильно используется и поддерживается, вы будете знать, что нет пустых строк таблицы, и что каждая строка отличается от любой другой строки. СТОЛБЦЫ ИМЕНУЮТСЯ И НУМЕРУЮТСЯ В отличие от строк, столбцы таблицы (также называемые полями) упорядочиваются и именуются. Таким образом, в нашей таблице адресной книги, возможно, указать на " адрес столбца " или на " столбец 3 ". Конечно, это означает, что каждый столбец данной таблицы должен иметь уникальное имя, чтобы избежать неоднозначности. Лучше всего если эти имена указывают на содержание поля. В типовых таблицах, мы будем использовать такие сокращения для имени столбца, как cname для имени заказчика, и odate для даты порядка. Мы также дадим каждой таблице личный числовой номер столбца в качестве первичного ключа. Следующий раздел будет объяснять эти таблицы и их ключи более подробно. • Проектирование типовой Базы данных. Таблицы 1, 2, и 3 составляют реляционную базу данных, которая является минимально достаточной, чтобы легко ее отслеживать, и достаточно полной, чтобы иллюстрировать главные понятия и практику использования SQL. Они будут использоваться для иллюстрирования различных особенностей SQL по всему курсу. Вы могли уже обратить внимание, что первый столбец каждой таблицы содержит номера, чьи значения различны для каждой строки. Как вы, наверное, и предположили, это - первичные ключи таблиц. Некоторые из этих номеров также показаны в столбцах других таблиц. В этом нет ничего неверного. Они показывают связь между строками, которые используют значение, принимаемое из первичного ключа, и строками где это значение используется в самом первичном ключе. Таблица 1: salespeople - Продавцы snum sname City comm 1001 Peel London 0.12 1002 Serres SariJose 0.13 1004 Motika London 0.11 1007 Rifkin barcelona 0.15 1003 Axelrod New York 0.1 Таблица 2: cnu m 200 1 200 2 200 3 200 4 200 6 200 8 200 7 Таблица 3: Заказчики – customers cname city hoffman London giovann i liu Rome grass SanJos e berlin clemens London cisneros SanJos e Rome pereira ratin g 10 0 20 0 20 0 30 0 10 0 30 0 10 0 snum 100 1 100 3 100 2 100 2 100 1 100] 100 4 Порядки – orders Onum a mt odate cnum 3001 18.69 1990-10-03 2008 3003 767.19 1990-10-03 2001 3002 1900.1 1990-10-03 2007 3005 5160.45 1990-10-03 2003 3006 1098.16 1990-10-03 2008 3009 1713.23 1990-10-04 2002 3007 75.75 1990-10-04 2004 3008 4723 1990-10-05 2006 ЗОЮ 1309.95 1990-10-06 2004 3011 9891.88 1990-10-06 2006 snum 1007 1001 1004 1002 1007 1003 1002 1001 1002 1001 Например, поле snum в таблице Заказчиков указывает, какому продавцу назначен данный заказчик. Номер пол snum связан с таблицей Продавцов, которая дает информацию об этих продавцах. Очевидно, что продавец, которому назначены заказчики, должен уже существовать - то есть, значение snum из таблицы Заказчиков должно также быть представлено в таблице Продавцов. Если это так, то говорят, что " система находится в состоянии справочной целостности ". ПРИМЕЧАНИЕ: Эти три представленных таблицы в тексте имеют русские имена - Продавцов, Заказчиков и Порядков, и далее будут упоминаться именно под этими именами. Имена любых других применяемых в книге таблиц будут написаны по-английски, что бы отличать их от наших базовых таблиц этой базы данных. Кроме того, в целях однозначности, имена заказчиков, продавцов, Системных Каталогов, а также полей в тексте, также будут даны на латыни. Таблицы приведены как пример к похожей ситуации в реальной жизни, когда вы будете использовать SQL, чтобы следить за продавцами, их заказчиками, и порядками заказчиков. Давайте рассмотрим эти три таблицы и значения их полей. Здесь показаны столбцы Таблицы 1 ПОЛЕ snum продавца. СОДЕРЖАНИЕ уникальный номер, назначенный каждому продавцу (" номер служащего "). sname им расположение продавца (город). city комиссионные продавцов в десятичной форме. comm Таблица 2 содержит следующие столбцы: ПОЛЕ СОДЕРЖАНИЕ уникальный номер, назначенный каждому cnum заказчику. имя заказчика. cname city расположение заказчика (город). rating код указывающего уровень предпочтения данного заказчика перед другими. Более высокий номер указывают на большее предпочтение (рейтинг). Snum номер продавца назначенного этому заказчику ( и з таблицы Продавцов) ПОЛЕ И имеются столбцы в Таблице 3 СОДЕРЖАНИЕ onum уникальный номер, данный каждому приобретению, amt значение суммы приобретений, odate дата приобретения. Cnum номер заказчика делающего приобретение( и з таблицы Заказчиков), snum номер продавца продающего приобретение ( и з таблицы Продавцов). Работа в MvSql • Создание Баз Данных с помощью phpMyAdmin Если база данных еще не создана, то на начальной странице программы phpMyAdmin (смотрите рисунок 1) в текстовое поле введите имя будущей базы данных learn и нажмите на кнопку Создать (Create). Таблицы Все данные в SQL содержатся в объектах, называемых таблицами. Таблицы представляют собой совокупность каких-либо сведений об объектах, явлениях, процессах реального мира. Никакие другие объекты не хранят данные, но они могут обращаться к данным в таблице. Таблицы в SQL имеют такую же структуру, что и таблицы всех других СУБД и содержат: строки; каждая строка (или запись) представляет собой совокупность атрибутов (свойств) конкретного экземпляра объекта; столбцы: каждый столбец (поле) представляет собой атрибут или совокупность атрибутов. Поле строки является минимальным элементом таблицы. Каждый столбец в таблице имеет определенное имя, тип данных и размер. В появившемся окне (рисунок 2) следует ввести имя таблицы, и количество полей, и затем нажать кнопку «Пошел». Далее в появившемся окне (рисунок 3) следует описать структуру таблицы, т.е. имена колонок - в колонке Поле тип данных в колонке - Тип Длину Атрибуты возможность существования, не заполненного информацией поля – Null значение по умолчанию У каждой таблицы должен существовать уникальный индекс, чтобы была возможность обновления информации после модификации таблицы Для заполнения таблицы данными следует выбрать вкладку Вставить явиться окно, похожее на рисунок 5. Обратите внимание, что в некоторых полях уже отображены значения - это значения, введенные по умолчанию. При необходимости их можно изменить. Для просмотра полученной таблицы следует выбрать вкладку Обзор. • Типы данных. Ниже описаны все типы данных, используемые в среде MySql. • Числовые типы данных MySQL поддерживает все числовые типы данных языка SQL92 по стандартам ANSI/ISO. Они включают в себя типы точных числовых данных (NUMERIC, DECIMAL. INTEGER и SMALLINT) и типы приближенных числовых данных (FLOAT, REAL и DOUBLE PRECISION). Ключевое слово INT является синонимом для INTEGER, а ключевое слово DEC - синонимом для DECIMAL. Типы данных NUMERIC и DECIMAL реализованы в MySQL как один и тот же. Они используются для величин, для которых важно сохранить повышенную точность, например для денежных данных. Требуемая точность данных и масштаб могут задаваться (и обычно задаются) при объявлении столбца данных одного из этих типов, например: salary DECIMAL(5,2) В этом примере - 5 (точность) представляет собой общее количество значащих десятичных знаков, с которыми будет храниться данная величина, а цифра 2 (масштаб) задает количество десятичных знаков после запятой. Следовательно, в этом случае интервал величин, которые могут храниться в столбце salary, составляет от -99,99 до 99.99 (в действительности для данного столбца MySQL обеспечивает возможность хранения чисел вплоть до 999,99, поскольку можно не хранить знак для положительных чисел). Величины типов DECIMAL и NUMERIC хранятся как строки, а не как двоичные числа с плавающей точкой, чтобы сохранить точность представления этих величин в десятичном виде. При этом используется по одному символу строки для каждого разряда хранимой величины, для десятичного знака (если масштаб > 0) и для знака (для отрицательных чисел). Если параметр масштаба равен 0. то величины DECIMAL и NUMERIC не содержат десятичного знака или дробной части. Максимальный интервал величин DECIMAL и NUMERIC тот же. что и для типа DOUBLE, но реальный интервал может быть ограничен выбором значений параметров точности или масштаба для данного столбца с типом данных DECIMAL или NUMERIC. Если конкретному столбцу присваивается значение, имеющее большее количество разрядов после десятичного знака, чем разрешено параметром масштаба, то данное значение округляется до количества разрядов, разрешенного масштаба. Если столбцу с типом DECIMAL или NUMERIC присваивается значение, выходящее за границы интервала, заданного значениями точности и масштаба (или принятого по умолчанию), то MySQL сохранит данную величину со значением соответствующей граничной точки данного интервала. Тип FLOAT обычно используется для представления приблизительных числовых типов данных. Если ключевое слово FLOAT в обозначении типа столбца используется без указания точности, MySQL выделяет 4 байта для хранения величин в этом столбце. Возможно также иное обозначение, с двумя числами в круглых скобках за ключевым словом FLOAT. В этом варианте первое число по- прежнему определяет требования к хранению величины в байтах, а второе число указывает количество разрядов после десятичной запятой, которые будут храниться и показываться. Если в столбец подобного типа попытаться записать число, содержащее больше десятичных знаков после запятой, чем указано для данного столбца, то значение величины при ее хранении в MySQL округляется для устранения излишних разрядов. Для типов REAL и DOUBLE PRECISION не предусмотрены установки точности. В MySQL оба типа реализуются как 8-байтовые числа с плавающей точкой удвоенной точности. Чтобы обеспечить максимальную совместимость, в коде, требующем хранения приблизительных числовых величин, должны использоваться типы FLOAT или DOUBLE PRECISION без указаний точности или количества десятичных знаков. Если в числовой столбец попытаться записать величину, выходящую за границы допустимого интервала для столбца данного типа, то MySQL ограничит величину до соответствующей граничной точки данного интервала и сохранит результат вместо исходной величины. Например, интервал столбца INT составляет от -2147483648 до 2147483647. Если попытаться записать в столбец INT число -9999999999, то оно будет усечено до нижней конечной точки интервала и вместо записываемого значения в столбце будет храниться величина -2147483648. Аналогично, если попытаться записать число 9999999999, то взамен запишется число 2147483647. Если для столбца INT указан параметр UNSIGNED, то величина допустимого интервала для столбца останется той же, но его граничные точки сдвинутся к 0 и 4294967296. Если попытаться записать числа - 9999999999 и 9999999999, то в столбце окажутся величины 0 и 4294967296. Все типы целочисленных данных могут иметь необязательный и неоговоренный в стандарте атрибут UNSIGNED. Беззнаковые величины можно использовать для разрешения записи в столбец только положительных чисел, если необходимо немного увеличить числовой интервал в столбце. Для команд ALTER TABLE, LOAD DATA INFILE, UPDATE и многострочной INSERT выводится предупреждение, если могут возникнуть преобразования данных вследствие вышеописанных усечений. В таблице представлены наиболее часто используемые числовые типы полей MySql. Таблица 1. Наиболее часто используемые числовые типы полей MySql. До Тип Байт От TINYINT -128 127 1 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854 9223372036854775807 775808 • Типы данных даты и времени Существуют следующие типы данных даты и времени: DATETIME. DATE, TIMESTAMP. TIME н YEAR. Каждый из них имеет интервал допустимых значений. а также значение "ноль", которое используется, когда пользователь вводит действительно недопустимое значение. Отметим, что MySQL позволяет хранить некоторые не вполне достоверные значения даты, например 1999-11-31. Причина в том, что управление проверкой даты входит в обязанности конкретного приложения, а не SQL-серверов. Для ускорения проверки правильности даты MySQL только проверяет, находится ли месяц в интервале 0-12 и день в интервале 0-31. Данные интервалы начинаются с 0. это сделано для того, чтобы обеспечить дтя MySQL возможность хранить в столбцах DATE или DATETIME даты, в которых день или месяц равен нулю. Эта возможность особенно полезна дтя приложений, которые предполагают хранение даты рождения - здесь не всегда известен день или месяц рождения. В таких случаях дата хранится просто в виде 1999-00-00 или 1999-01-00 (при этом не следует рассчитывать на то, что для подобных дат функ- ции DATE_SUB() или DATE_ADD дадут правильные значения). Ниже приведены некоторые общие рекомендации, полезные при работе с типами данных даты и времени: MySQL извлекает значения для данного типа даты или времени только в стандартном формате, но в то же время пытается интерпретировать разнообразные форматы, которые могут поступать от пользователей (например, когда задается величина, которой следует присвоить тип даты или времени или сравнить со значением, имеющим один из этих типов). Тем не менее, поддерживаются только форматы, описанные в следующих разделах. Предполагается, что пользователь будет вводить допустимые значения величин, так как использование величин в других форматах может дать непредсказуемые результаты. - Хотя MySQL пытается интерпретировать значения в нескольких форматах, во всех случаях ожидается, что крайним слева будет раздел значения даты, содержащий год. Даты должны задаваться в порядке год-месяц-день (например. '98-0904'), а не в порядке месяц- день-год или день-месяц-год, т.е. не так. как мы их обычно записываем (например '09-04-98', '04-0998'). MySQL автоматически преобразует значение, имеющее тип даты или времени, в число, если данная величина используется в числовом контексте, и наоборот. • Значение, имеющее тип даты или времени, которое выходит за границы установленного интервала или является недопустимым для этого типа данных (см. начало раздела), преобразуется в значение "ноль" для данного типа. (Исключение составляют выходящие за границы установленного интервала величины типа TIME, которые усекаются до соответствующей граничной точки заданного интервала TIME). В таблице 2. представлены форматы значения "ноль" для каждого из типов столбцов: Таблица 2. Нулевые значения для типов данных даты и времени Тип столбца Значение "Ноль" '0000-00-00 00:00:00' DATETIME '0000-00-00' DATE 00000000000000 (длина зависит от TIMESTAMP количества выводимых символов) '00:00:00' TIME 0000 YEAR Значения 'ноль' - особые. Для их хранения или ссылок на них можно явно применять представленные в таблице значения, а можно использовать '0', что легче в написании. • Типы данных DATETIME. DATE и TIMESTAMP Далее рассмотрим типы DATETIME, DATE и TIMESTAMP, которые являются родственными типами данных. Опишем их свойства, общие черты и различия. Тип данных DATETIME используется для величин, содержащих информацию как о дате, так и о времени. MySQL извлекает и выводит величины DATETIME в формате 'YYYY-MM-DD HH:MM:SS'. Поддерживается диапазон величин от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'. ("поддерживается" означает, что хотя величины с более ранними временными значениями, возможно, тоже будут работать, но нет гарантии того, что они будут правильно храниться и отображаться). Тип DATE используется для величин с информацией только о дате, без части. содержащей время. MySQL извлекает и выводит величины DATE в формате 'YYYY-MM-DD'. Поддерживается диапазон величин от '1000-01-01' до '9999-12-31'. Тип столбца TIMESTAMP обеспечивает тип представления данных, который можно использовать для автоматической записи текущих даты и времени при выполнении операций INSERT или UPDATE. При наличии нескольких столбцов типа TIMESTAMP только первый из них обновляется автоматически. Для остальных (кроме первого) столбцов типа TIMESTAMP также можно задать установку в значение текущих даты и времени. Для этого необходимо просто установить столбец в NULL или в NOW(). Любой столбец типа TIMESTAMP (даже первый столбец данного типа) можно установить в значение, отличное от текущих даты и времени. Это делается путем явной установки его в желаемое значение. Данное свойство можно использовать, например, если необходимо установить столбец TIMESTAMP в значение текущих даты и времени при создании строки, а при последующем обновлении этой строки значение столбца не должно изменяться: Величины типа TIMESTAMP могут принимать значения от начала 1970 года до некоторого значения в 2037 году с разрешением в одну секунду. Эти величины выводятся в виде числовых значений. Формат данных, в котором MySQL извлекает и показывает величины TIMESTAMP, зависит от количества показываемых символов. Это проиллюстрировано в таблице 3. Полный формат TIMESTAMP составляет 14 десятичных разрядов, но можно создавать столбцы типа TIMESTAMP и с более короткой строкой вывода: Таблица 3 Формат данных TIMESTAMP в зависимости от количества извлекаемых разрядов Формат вывода Тип столбца TIMESTAMP(14) YYYYMMDDHHMMSS TIME ST АМР( 12) YYMMDDHHMMSS TIMESTAMP(IO) YYMMDDHHMM TIMESTAMP(8) YYYYMMDD TIMESTAMP(6) YYMMDD TIMESTAMP(4) YYMM TIMESTAMP(2) YY Величины DATETIME, DATE и TIMESTAMP могут быть заданы любым стандартным набором форматов: • Как строка в формате 'YYYY-MM-DD HH:MM:SS' или в формате 'YY-MM-DD HH:MM:SS\ Допускается "облегченный" синтаксис можно использовать любой знак пунктуации в качестве разделительного между частями разделов даты или времени. Например, величины '98-12-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45' и '98@12@31 11^30^45' являются эквивалентными. Как строка в формате 'YYYY-MM-DD' или в формате 'YY-MM- DD'. Здесь также допустим "облегченный" синтаксис. Например, величины '98-12-3Г, '98.12.31', '98/12/31' и '98@12@31' являются эквивалентными. Как строка без разделительных знаков в формате 'YYYYMMDDHHMMSS' или в формате 'YYMMDDHHMMSS', при условии, что строка понимается как дата. Например, величины '19970523091528' и '970523091528' можно интерпретировать как '1997-0523 09:15:28', но величина '971122129015' является недопустимой (значение раздела минут является абсурдным) и преобразуется в'0000-00-00 00:00:00'. Как строка без разделительных знаков в формате 'YYYYMMDD' или в формате 'YYMMDD', при условии, что строка интерпретируется как дата. Например, величины '19970523' и '970523' можно интерпретировать как '1997-05-23', но величина '971332' является недопустимой (значения разделов месяца и дня не имеют смысла) и преобразуется в '0000 -00-00'. Как число в формате YYYYMMDDHHMMSS или в формате YYMMDDHHMMSS, при УСЛОВИИ, ЧТО ЧИСЛО интерпретируется как дата. Например, величины 19830905132800 и 830905132800 ин терпретируются как '1983-09-05 13:28:00'. Как число в формате YYYYMMDD или в формате YYMMDD. при условии, что число интерпретируется как дата. Например, величины 19830905 и 830905 интерпретируются как '1983-09-05'. Как результат выполнения функции, возвращающей величину, приемлемую в контекстах типов данных DATETIME. DATE или TIMESTAMP (например, функции NOWQ или CURRENT DATEQ. Tип данных TIME MySQL извлекает и выводит величины типа TIME в формате 'HH:MM:SS' (или в формате 'HHH:MM:SS' для больших значений часов). Величины TIME могут изменяться в пределах от '-838:59:59' до '838:59:59'. Причина того, что "часовая" часть величины может быть настолько большой, заключается в том, что тип TIME может использоваться не только для представления времени дня (которое должно быть меньше 24 часов), но также для представления общего истекшего времени или временного интервала между двумя событиями (который может быть значительно больше 24 часов или даже отрицательным). Величины TIME могут быть заданы в различных форматах: Как строка в формате 'D HH:MM:SS.дробная часть' (следует учитывать, что MySQL пока не обеспечивает хранения дробной части величины в столбце рассматриваемого типа). Можно также использовать одно из следующих "облегченных" представлений: HH:MM:SS.дробная часть. HH:MM:SS, НН:ММ, D HH:MM:SS, D НН:ММ, D НН или SS. Здесь D - это дни из интервала значений 0-33. Как строка без разделителей в формате 'HHMMSS', при условии, что строка интерпретируется как дата. Например, величина '101112' понимается как ‘10:11:12', но величина '109712' будет недопустимой (значение раздела минут является абсурдным) и преобразуется в '00:00:00'. Как число в формате HHMMSS, при условии, что строка интерире тируется как дата. Например, величина 101112 понимается как '10:11:12'. MySQL понимает и следующие альтернативные форматы: SS, MMSS, HHMMSS, HHMMSS.дробная часть. При этом следует учитывать, что хранения дробной части MySQL пока не обеспечивает. • Как результат выполнения функции, возвращающей величину, приемлемую в контексте типа данных типа TIME (например, такой функции, как CURRENT_TIME). • Тип данных YEAR Тип YEAR - это однобайтный тип данных для представления значений года. MySQL извлекает и выводит величины YEAR в формате YYYY. Диапазон возможных значений - от 1901 до 2155. Величины типа YEAR могут быть заданы в различных форматах: Как четырехзначная строка в интервале значений от '190 Г до •2155еКак четырехзначное число в интервале значений от 1901 до 2155. Как двухзначная строка в интервале значений от '00' до '99'. Величины в интервалах от '00' до '69' и от '70' до '99' при этом преобразуются в величины YEAR в интервалах от 2000 до 2069 и от 1970 до 1999 соответственно. Как двухзначное число в интервале значений от 1 до 99. Величины в интервалах от 1 до 69 и от 70 до 99 при этом преобразуются в величины YEAR в интервалах от 2001 до 2069 и от 1970 до 1999 соответственно. Необходимо принять во внимание, что интервалы для двухзначных чисел и двухзначных строк несколько различаются, так как нельзя указать "ноль" непосредственно как число и интерпретировать его как 2000. Необходимо задать его как строку '0' или '00'. или же оно будет интерпретировано как 0000. Как результат выполнения функции, возвращающей величину, приемлемую в контексте типа данных YEAR (такой как NOWQ). Недопустимые величины YEAR преобразуются в 0000. • Символьные типы данных Существуют следующие символьные типы данных: CHAR, YARCHAR. BLOB. TEXT. ENUM и SET. Рассмотрим описание их работы, требований к их хранению и использования их в запросах. В таблице 4 приведены символьные типы данных и их размерность. Таблица 4. Символьные типы данных Тип Макс, размер TINYTEXT или TINYBLOB TEXT или BLOB MEDIUMTEXT MEDIUMBLOB LONGBLOB 2^8-1 2^1б-1 (64К-1) 2^24-1 (16М-1) или 2^32-1 (4G-1) Байт 255 65535 16777215 4294967295 • Типы данных CHAR и 1ARCHAR Типы данных CHAR и VARCHAR очень схожи между собой, но различаются по способам их хранения и извлечения. В столбце типа CHAR длина поля постоянна и задается при создании таблицы. Эта длина может принимать любое значение между 1 и 255. Величины типа CHAR при хранении дополняются справа пробелами до заданной длины. Эти концевые пробелы удаляются при извлечении хранимых величин. Величины в столбцах VARCHAR представляют собой строки переменной длины. Так же как и для столбцов CHAR, можно задать столбец VARCHAR любой длины между 1 и 255. Однако, в противоположность CHAR, при хранении величин типа VARCHAR используется только то количество символов, которое необходимо, плюс один байт для записи длины. Хранимые величины пробелами не дополняются, наоборот, концевые пробелы при хранении удаляются. Если задаваемая в столбце CHAR или VARCHAR величина превосходит максимально допустимую длину столбца, то эта величина соответствующим образом усекается. Различие между этими двумя типами столбцов в представлении результата хранения величин с разной длиной строки в столбцах CHAR(4) и VARCHAR(4) проиллюстрировано следующей таблицей 5. Извлеченные из столбцов CHAR(4) и VARCHAR(4) величины в каждом случае будут одними и теми же, поскольку при извлечении концевые пробелы из столбца CHAR удаляются. Если при создании таблицы не был задан атрибут BINARY дтя столбцов, то величины в столбцах типа CHAR и VARCHAR сортируются и сравниваются без учета регистра. При задании атрибута BINARY величины в столбце сортируются и сравниваются с учетом регистра в соответствии с порядком таблицы ASCII на том компьютере, где работает сервер MySQL. • Типы данных BLOB и TEXT Тип данных BLOB представляет собой двоичный объект большого размера, который может содержать переменное количество данных. Существуют 4 модификации этого типа - TINYBLOB, BLOB. MEDIUMBLOB и LONGBLOB, отличающиеся только максимальной длиной хранимых величин. Тип данных TEXT также имеет 4 модификации - TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT. соответствующие упомянутым четырем типам BLOB и имеющие те же максимальную длину и требования к объему памяти. Единственное различие между типами BLOB и TEXT состоит в том, что сортировка и сравнение данных выполняются с учетом регистра для величин BLOB и без учета регистра для величин TEXT. Другими словами, TEXT - это независимый от регистра BLOB. Если размер задаваемого в столбце BLOB или TEXT значения превосходит максимально допустимую длину столбца, то это значение соответствующим образом усекается. • Тип перечисления ENUM ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы. Перечисление может иметь максимум 65535 элементов. Регистр не играет роли, когда вы делаете вставку в столбец ENUM. Однако регистр значений, получаемых из этого столбца, совпадает с регистром в написании соответствующего значения, заданного во время создания таблицы. Если вам нужно получить список возможных значения для столбца ENUM, вы должны вызвать SHOW COLUMNS FROM имятаблицы LIKE имя_столбца_епит и проанализировать определение ENUM во втором столбце. • Тип множества SET SET - это строковый тип, который может принимать ноль или более значений, каждое из которых должно быть выбрано из списка допустимых значений, определенных при создании таблицы. Элементы множества SET разделяются запятыми. Как следствие, сами элементы множества не могут содержать запятых. Например, столбец, определенный как 5ЕТ("один", "два") NOT NULL может принимать такие значения: "один" "два" "один,два" Множество SET может иметь максимум 64 различных элемента. Оконечные пробелы удаляются из значений множества SET в момент созданная таблицы. Если вы вставляете в столбец SET некорректную величины, это значение будет проигнорировано. Если вам нужно получить все возможные значения для столбца SET, вам следует вызвать SHOW COLUMNS FROM table_name LIKE set_column_name и проанализировать SET-определение во втором столбце. Выбор правильного типа данных в столбце Для того чтобы память использовалась наиболее эффективно, всегда следует стараться применять тип данных, обеспечивающий максимальную точность. Например, для величин в диапазоне между 1 и 99999 в целочисленном столбце наилучшим типом будет MEDIUMINT UNSIGNED. Часто приходится сталкиваться с такой проблемой, как точное представление денежных величин. В MySQL для представления таких величин необходимо использовать тип данных DECIMAL. Поскольку данные этого типа хранятся в виде строки, потерь в точности не происходит. А в случаях, когда точность не имеет слишком большого значения, вполне подойдет и тип данных DOUBLE. Если же требуется высокая точность, всегда можно выполнить конвертирование в тип данных с фиксированной точкой. Такие данные хранятся в виде BIGINT. Это позволяет выполнять все вычисления с ними как с целыми числами, а впоследствии при необходимости результаты можно преобразовать обратно в величины с плавающей точкой. Требования к памяти для различных типов столбцов Требования к объему памяти для столбцов каждого типа, поддерживаемого MySQL, перечислены ниже по категориям. Требования к памяти для числовых типов приведены в таблице 6. Требования к памяти для типов даты и времени приведены в таблице 7 Требования к памяти для символьных типов приведены в таблице 8. Таблица 8. Требования к памяти для символьных типов РЕЗЮМЕ Теперь вы знаете, что такое реляционная база данных, понятие, которое звучит сложнее, чем есть на самом деле. Вы также изучили некоторые фундаментальные принципы относительно того, как сделаны таблицы - как работают строки и столбцы, как первичные ключи отличают строки друг друга, и как столбцы могут ссылаться к значениям в других столбцах. Вы поняли, что запись это синоним строки, и что поле это синоним столбца. Оба термина встречаются в обсуждении SQL. и мы будем использовать их в равной степени в этой книге. Вы теперь знакомы с таблицами примеров. Краткие и простые, они способны показать большинство особенностей языка, как вы это увидите. В некоторых случаях, мы будем использовать другие таблицы или постулаты некоторых различных данных в одной из этих таблиц чтобы показать вам некоторые другие возможности. Теперь вы готовы к углублению в SQL самостоятельно. Следующая глава даст вам быстрый просмотр языка, и даст вам информацию, которая поможет Вам ссылаться к уже пройденным местам. Задания для выполнения к занятию №2 - Создайте БД Learn. В БД Learn создайте таблицы Salespeople, Orders, и Customers, правильно подобрав типы данных. Заполните данными. Какое поле таблицы Заказчиков является первичным ключом? Что является столбцом 4 из таблицы Заказчиков? Как по-другому называется строка? Столбец? Почему вы может не запрашивать для просмотра первые пять строк таблицы? Подготовьте отчет о проделанной работе. Отчет может быть представлен в письменном или электронном варианте. Содержание отчета: титульный лист, если отчет в электронном варианте цель работы тексты SQL-запросов с пояснениями результаты выполнения запросов ответы на вопросы вывод. Тема практического занятия №3 Выполнение SQL-запросов с использованием реляционных и булевых операторов для извлечения информации из таблицы Цель работы: используя данные базы данных, подготовленной во второй лабораторной работе, подготовить и реализовать серию запросов, связанных с выборкой информации из таблиц с использованием булевых и реляционных операторов. 1. Введение в SQL. Structured Query Language представляет собой непроцедурный язык, используемый для управления данными реляционных СУБД. Термин <непроцедурный> означает, что на данном языке можно сформулировать, что нужно сделать с данными, но нельзя проинструктировать, как именно это следует сделать. Иными словами, в этом языке отсутствуют алгоритмические конструкции, такие как метки, операторы цикла, условные переходы и др. Язык SQL был создан в начале 70-х годов в результате исследовательского проекта IBM, целью которого было создание языка манипуляции реляционными данными. Первоначально он назывался SEQUEL (Structured English Query Language), затем - SEQUEL/2, а затем просто SQL. Официальный стандарт SQL был опубликован ANSI (American National Standards Institute – Национальный институт стандартизации, США) в 1986 году (это наиболее часто используемая ныне реализация SQL). Данный стандарт был расширен в 1989 и 1992 годах, поэтому последний стандарт SQL носит название SQL92. В настоящее время ведется работа над стандартом SQL3, содержащим некоторые объектно-ориентированные расширения. Существует три уровня соответствия стандарту ANSI - начальный, промежуточный и полный. Многие производители серверных СУБД, такие как IBM, Informix, Microsoft, Oracle и Sybase, применяют собственные реализации SQL, основанные на стандарте ANSI (отвечающие как минимум начальному уровню соответствия стандарту) и содержащие некоторые расширения, специфические для данной СУБД. Как работает SQL Давайте рассмотрим, как работает SQL. Предположим, что имеется база данных, управляемая с помощью какой-либо СУБД. Для извлечения из нее данных используется запрос, сформулированный на языке SQL. СУБД обрабатывает этот запрос, извлекает запрашиваемые данные и возвращает их. Этот процесс схематически изображен на рис. 1. Как мы увидим позже, SQL позволяет не только извлекать данные, но и определять структуру данных, добавлять и удалять данные, ограничивать или предоставлять доступ к данным, поддерживать ссылочную целостность. Обратите внимание на то, что SQL сам по себе не является ни СУБД, ни отдельным продуктом. Это язык, применяемый для взаимодействия с СУБД и являющийся в определенном смысле ее неотъемлемой частью. Операторы SQL SQL содержит примерно 40 операторов для выполнения различных действий внутри СУБД. Ниже приводится краткое описание категорий этих операторов. Data Definition Language (DDL) Data Definition Language содержит операторы, позволяющие создавать, изменять и уничтожать базы данных и объекты внутри них (таблицы, представления и др.). Эти операторы перечислены в табл. 1. Таблица 1 Оператор CREATE TABLE DROP TABLE ALTER TABLE CREATE VIEW DROP VIEW CREATE INDEX DROP INDEX Описание Применяется для добавления новой таблицы к базе данных Применяется для удаления таблицы из базы данных Применяется для изменения структуры имеющейс таблицы Применяется для добавления нового представления к баз данных Применяется для удаления представления из базы данных Применяется для создания индекса для данного поля Применяется для удаления существующего индекса Data Manipulation Language (DML) Data Manipulation Language содержит операторы, позволяющие выбирать, добавлять, удалять и модифицировать данные. Обратите внимание на то, что эти операторы не обязаны завершать транзакцию, внутри которой они вызваны. Операторы DML представлены в табл. 2. Таблица 2. Оператор Описание SELECT Применяется для выбора данных INSERT Применяется для добавления строк к таблице DELETE Применяется для удаления строк из таблицы UPDATE Применяется для изменения данных Иногда оператор SELECT относят к отдельной категории, называемой Data Query Language (DQL). Transaction Control Language (TCL) Операторы Transaction Control Language применяются для управления изменениями, выполненными группой операторов DML. Операторы TCL представлены в табл. 3. Таблица 3 Оператор COMMIT Описание Применяется для завершения транзакции и сохранени изменений в базе данных Применяется для отката транзакции и отмены изменений ROLLBACK базе данных Применяется для установки параметров доступа к данным SET TRANSACTIO текущей транзакции N Data Control Language (DCL) Операторы Data Control Language, иногда называемые операторами Access Control Language, применяются для осуществления административных функций, присваивающих или отменяющих право (привилегию) использовать базу данных, таблицы в базе данных, а также выполнять те или иные операторы SQL. Операторы DCL представлены в табл. 4. Таблица 4 Оператор GRANT REVOKE Описание Применяется для присвоения привилегии Применяется для отмены привилегии Cursor Control Language (CCL) Операторы Cursor Control Language используются для определения курсора, подготовки SQL-предложений для выполнения, а также для некоторых других операторов. Операторы CCL представлены в табл. 5. Таблица 5 Оператор Описание DECLARE CURSOR EXPLAIN OPEN CURSOR FETCH CLOSE CURSOR PREPARE Применяется для определения курсора для запроса Применяется для описания плана запроса. Этот оператор представляет собой расширение SQL для Microsoft SQL Server 7.0. Он не обязан выполняться в других СУБД. Например, в случае Oracle следует использовать оператор EXPLAIN PLAN Применяется для открытия курсора при получении результатов запроса Применяется для получения строки из результатов запроса Применяется для закрытия курсора Применяется для подготовки оператора SQL для выполнения EXECUTE Применяется для выполнения оператора SQL DESCRIBE Применяется для описания подготовленного запроса Все операторы SQL имеют вид, показанный на рис. 2. Каждый оператор SQL начинается с глагола, представляющего собой ключевое слово, определяющее, что именно делает этот оператор (SELECT, INSERT, DELETE...). В операторе содержатся также предложения, содержащие сведения о том, над какими данными производятся операции. Каждое предложение начинается с ключевого слова, такого как FROM, WHERE и др. Структура предложения зависит от его типа - ряд предложений содержит имена таблиц или полей, некоторые могут содержать дополнительные ключевые слова, константы или выражения. Как можно выполнить SQL-операторы Все современные серверные СУБД (а также многие популярные настольные СУБД) содержат в своем составе утилиты, позволяющие выполнить SQL- предложение и ознакомиться с его результатом. В частности, клиентская часть Oracle содержит в своем составе утилиту SQL Plus, a MySQL - утилиту phpmyAdmin. Именно этой утилитой мы воспользуемся для демонстрации возможностей SQL, а в качестве оазы данных, над которой мы оудем <экспернментировать>. возьмем базу данных LEARN. 2. Выбор данных Выбор данных представляет собой наиболее часто встречающуюся операцию, выполняемую с помощью SQL. Оператор SELECT - один из самых важных операторов этого языка, применяемый для выбора данных. СОЗДАНИЕ ЗАПРОСА Запрос - команда, которую вы даете вашей программе базы данных, и которая сообщает ей, чтобы она вывела определенную информацию из таблиц в память. Эта информация обычно посылается непосредственно на экран компьютера или терминала которым вы пользуетесь, хотя, в большинстве случаев, ее можно также послать принтеру, сохранить в файле (как объект в памяти компьютера), или представить как вводную информацию для другой команды или процесса. Запросы обычно рассматриваются как часть языка DML. Однако, так как запрос не меняет информацию в таблицах, а просто показывает ее пользователю, мы будем рассматривать запросы как самостоятельную категорию среди команд DML которые производят действие, а не просто показывают содержание базы данных. Все запросы в SQL состоят из одиночной команды. Структура этой команды обманчиво проста, потому что вы должны расширять ее так чтобы выполнить высоко сложные оценки и обработки данных. Эта команда называется - SELECT (ВЫБОР). КОМАНДА SELECT В самой простой форме, команда SELECT просто инструктирует базу данных, чтобы извлечь информацию из таблицы. Например, вы могли бы вывести таблицу Продавцов, напечатав следующее: SELECT snum, sname, sity, comm FROM Salespeople; Вывод для этого запроса показывается на Рисунке 1. Другими словами, эта команда просто выводит все данные из таблицы. Большинство программ будут также давать заголовки столбца как выше, а некоторые позволяют детальное форматирование вывода, но это уже вне стандартной спецификации. Имеется объяснение каждой части этой команды: SELECT Ключевое слово которое сообщает базе данных что эта команда - запрос. Все запросы начинаются этим словом, сопровождаемым пробелом. snum, Это - список столбцов из таблицы, которые выбираются sname запросом. Любые столбцы, не перечисленные здесь, не будут включены в вывод команды. Это, конечно, не значит, что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в таблицах; он только показывает данные. FROM FROM - ключевое слово, подобно SELECT, которое должно Salespeople быть представлено в каждом запросе. Оно сопровождается пробелом и затем именем таблицы используемой в качестве источника информации. В данном случае - это таблица Продавцов(8а1е$реор1е). Точка с запятой используется во всех интерактивных командах SQL чтобы сообщать базе данных что команда заполнена и готова выполниться. В некоторых системах наклонна черта влево (\) в строке, является индикатором конца команды. Естественно, запрос такого характера не обязательно будет упорядочивать вывод любым указанным способом. Та же сама команда, выполненная с теми же самыми данными, но в разное время не сможет вывести тот же самый порядок. Обычно, строки обнаруживаются в том порядке, в котором они найдены в таблице, поскольку как мы установили в предыдущей главе - этот порядок произволен. Это не обязательно будет тот порядок, в котором данные вводились или сохранялись. Если вы хотите видеть каждый столбец таблицы, имеется необязательное сокращение, которое вы можете использовать. Звездочка (*) может применяться для вывода полного списка столбцов следующим образом: S E L E C T * F R O M S a le s p e o p le ; Это приведет к тому же результату что и наша предыдущая команда. ОПИСАНИЕ SELECT В общем случае, команда SELECT начинается с ключевого слова SELECT, сопровождаемого пробелом. После этого должен следовать список имен столбцов, которые вы хотите видеть, отделяемые запятыми. Если вы хотите видеть все столбцы таблицы, вы можете заменить этот список звездочкой (*). Ключевое слово FROM следующее далее, сопровождается пробелом и именем таблицы, к которой делается запрос. В заключение, точка с запятой ( ; ) должна использоваться, чтобы закончить запрос и указать что команда готова к выполнению. ПРОСМОТР ТОЛЬКО ОПРЕДЕЛЕННОГО СТОЛБЦА ТАБЛИЦЫ Команда SELECT способна извлечь строго определенную информацию из таблицы. Сначала, мы можем предоставить возможность увидеть только определенные столбцы таблицы. Это выполняется легко, простым исключением столбцов, которые вы не хотите видеть, из части команды SELECT. Например, запрос SELECT sname, comm FROM Salespeople; будет производить вывод показанный на Рисунке 2. ПЕРЕУПОРЯДОЧЕНИЕ СТОЛБЦА Даже если столбцы таблицы, по определению, упорядочены, это не означает, что вы будете восстанавливать их в том же порядке. Конечно, звездочка (*) покажет все столбцы в их естественном порядке, но если вы укажете столбцы отдельно, вы можете получить их в том порядке котором хотите. Давайте рассмотрим таблицу Порядков, содержащую дату приобретения(odat), номер продавца(snum), номер порядка(onum), и суммы приобретениями(amt): SELECT oclate, snum, опит, cunt FROM Orders; Вывод этого запроса показан на Рисунке 3. Как вы можете видеть, структура информации в таблицах - это просто основа для активной перестройки структуры в SQL. УДАЛЕНИЕ ИЗБЫТОЧНЫХ ДАННЫХ DISTINCT (ОТЛИЧИЕ) - аргумент, который обеспечивает Вас способом устранять двойные значения из вашего предложения SELECT. Предположим, что вы хотите знать какие продавцы в настоящее время имеют свои порядки в таблице Порядков. Под порядком (здесь и далее) будет пониматься запись в таблиц}7 Порядков, регистрирующую приобретения, сделанные в определенный день определенным заказчиком у определенного продавца на определенную сумму. Вам не нужно знать, сколько порядков имеет каждый: вам нужен только список номеров продавцов (snum). Поэтому Вы можете ввести: SELECT snum FROM Orders; для получения вывода показанного в Рисунке 4 Для получения списка без дубликатов, для удобочитаемости, вы можете ввести следующее: SELECT DISTINCT snum FROM Orders; Вывод для этого запроса показан на Рисунке 5. Другими словами, DISTINCT следит за тем, какие значения были ранее, так что бы они не были продублированы в списке. Это - полезный способ избежать избыточности данных, но важно что бы при этом вы понимали, что вы делаете. Если вы не хотите потерять некоторые данные, вы не должны безоглядно использовать DISTINCT, потому что это может скрыть какуюто проблему или какие-то важные данные. Например, вы могли бы предположить, что имена всех ваших заказчиков различны. Если кто-то помещает второго Clemens в таблицу Заказчиков, а вы используете SELECT DISTINCT cname, вы не будете даже знать о существовании двойника. Вы можете получить не того Clemens и даже не знать об этом. Так как вы не ожидаете избыточности, в этом случае вы не должны использовать DISTINCT. ПАРАМЕТРЫ DISTINCT DISTINCT может указываться только один раз в данном предложении SELECT. Если предложение выбирает многочисленные поля, DISTINCT опускает строки, где все выбранные поля идентичны. Строки, в которых некоторые значения одинаковы, а некоторые различны - будут сохранены. DISTINCT, фактически, приводит к показу всей строки вывода, не указывая полей ( за исключением когда он используется внутри агрегатных функций, как будет далее), так что нет никакого смысла чтобы его повторять. DISTINCT ВМЕСТО ALL Вместо DISTINCT, вы можете указать - ALL. Это будет иметь противоположный эффект, дублирование строк вывода сохранится. Так как это - тот же самый случай, когда вы не указываете ни DISTINCT, ни ALL, то ALL - по существу скорее пояснительный, а не действующий аргумент. КВАЛИФИЦИРОВАННЫЙ ВЫБОР ПРИ ИСПОЛЬЗОВАНИИ ПРЕДЛОЖЕНИЙ Таблицы имеют тенденцию становиться очень большими, поскольку с течением времени, все большее и большее количество строк в нее добавляется. Поскольку обычно из них только определенные строки интересуют вас в данное врем, SQL дает возможность вам устанавливать критерии, чтобы определить какие строки будут выбраны для вывода. WHERE - предложение команды SELECT, которое позволяет вам устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы, для которой такое утверждение верно. Например, предположим, вы хотите видеть имена и комиссионные всех продавцов в Лондоне. Вы можете ввести такую команду: SELECT sname, city FROM Salespeople WHERE city = "LONDON" ; Когда предложение WHERE представлено, программа базы данных просматривает всю таблицу по одной строке и исследует каждую строку чтобы определить верно, ли утверждение. Следовательно, для записи Peel, программа рассмотрит текущее значение столбца city, определит, что оно равно "London", и включит эту строку в вывод. Запись для Series не будет включена, и так далее. Вывод для вышеупомянутого запроса показан на Рисунке 6. Давайте попробуем пример с числовым полем в предложении WHERE. Поле rating таблицы Заказчиков предназначено чтобы разделять заказчиков на группы, основанные на некоторых критериях которые могут быть получены в итоге через этот номер. Возможно это - форма оценки кредита или оценки основанной на томе предыдущих приобретений. Такие числовые коды могут быть полезны в реляционных базах данных как способ подведения итогов сложной информации. Мы можем выбрать всех заказчиков с рейтингом 100, следующим образом: SELECT * FROM Custome rs WHERE rating = 100; Одиночные кавычки не используются здесь потому, что оценка - это числовое поле. Результаты запроса показаны на Рисунке 7. Предложение WHERE совместимо с предыдущим материалом в этой главе. Другими словами, вы можете использовать номера столбцов, устранять дубликаты, или переупорядочивать столбцы в команде SELECT которая использует WHERE. Однако, вы можете изменять порядок столбцов для имен только в предложении SELECT, но не в предложении WHERE. РЕЗЮМЕ Теперь вы знаете несколько способов заставить таблицу давать вам ту информацию, какую вы хотите, а не просто выбрасывать наружу все ее содержание. Вы можете переупорядочивать столбцы таблицы или устранять любую из них. Вы можете решать, хотите вы видеть дублированные значения или нет. Наиболее важно то, что вы можете ставить условие, называемое предикатом, которое определяет или не определяет указанную строку таблицы из тысяч таких же строк, будет ли она выбрана для вывода. Предикаты могут становиться очень сложными, предоставляя вам высокую точность в решении, какие строки вам выбирать с помощью запроса. Именно эта способность решать точно, что вы хотите видеть, делает запросы SQL такими мощными. Следующие несколько глав будут посвящены, в большей мере, особенностям которые расширяют мощность предикатов. 3. ИСПОЛЬЗОВАНИЕ РЕЛЯЦИОННЫХ И БУЛЕВЫХ ОПЕРАТОРОВ ДЛЯ СОЗДАНИЯ БОЛЕЕ СЛОЖНЫХ ПРЕДИКАТОВ В предыдущей главе вы узнали, что предикаты могут оценивать равенство оператора как верного или неверного. Они могут также оценивать другие виды связей кроме равенств. Эта глава будет исследовать другие реляционные операторы, используемые в SQL. Вы также узнаете, как использовать операторы Буля, чтобы изменять и объединять значения предиката. С помощью операторов Буля (или проще говор логических операторов), одиночный предикат может содержать любое число условий. Это позволяет вам создавать очень сложные предикаты. Использование круглых скобок в структуре этих сложных предикатов будет также объясняться. РЕЛЯЦИОННЫЕ ОПЕРАТОРЫ Реляционный оператор - математический символ, который указывает на определенный тип сравнения между двумя значениями. Вы уже видели, как используются равенства, такие как 2 + 3 = 5 или city = "London". Но также имеются другие реляционные операторы. Предположим, что вы хотите видеть всех Продавцов с их комиссионными выше определенного значения. Вы можете использовать тип сравнения "больше чем" - (>). Реляционные операторы которыми располагает SQL : = Равный к > Больше чем < Меньше чем >= Больше чем или равно <= Меньше чем или равно <> Не равно Предикаты обычно сравнивают значения скалярных величин, используя или реляционные операторы или специальные операторы SQL чтобы увидеть верно ли это сравнение. Предположим, что вы хотите увидеть всех заказчиков с оценкой(rating) выше 200. Так как 200 - это скалярное значение, как и значение в столбце оценки, для их сравнения вы можете использовать реляционный оператор. SELECT * FROM Customers WHERE rating > 200; Вывод для этого запроса показывается на Рисунке 8. Конечно, если бы мы захотели увидеть еще и заказчиков с оценкой равной 200, мы стали бы использовать предикат rating > = 200 БУЛЕВЫ ОПЕРАТОРЫ Основные Булевы операторы также распознаются в SQL. Выражения Буля - являются или верными или неверными, подобно предикатам. Булевы операторы связывают одно или более верных неверных значений и производят единственное верное/или неверное значение. Стандартными операторами Буля распознаваемыми в SQL являются: AND, OR, и NOT. Существуют другие, более сложные, операторы Буля (типа " исключенный или "), но они могут быть сформированы из этих трех простых операторов - AND, OR, NOT. Как вы можете понять. Булева верна/неверна логика - основана на цифровой компьютерной операции; и фактически, весь SQL (или любой другой язык) может быть сведен до уровня Булевой логики. Операторы Буля и как они работают: AND берет два Буля ( в форме A AND В) как аргументы и оценивает их по отношению к истине, верны ли они оба. OR берет два Буля ( в форме A OR В) как аргументы и оценивает на правильность, верен ли один из них. * NOT берет одиночный Булев ( в форме NOT А) как аргументы и заменяет его значение с неверного на верное или верное на неверное. Связывая предикаты с операторами Буля, вы можете значительно увеличить их возможности. Предположим вы хотите видеть всех заказчиков в San Jose которые имеют оценку (рейтинг) выше 200: SE L E C T * F R O M C us to m er s W H E R E cit y = 'S an Jo se' A N D ra tin g > 20 0; Вывод для этого запроса показан на Рисунке 9. Имеется только один заказчик, который удовлетворяет этому условию. Если вы же используете OR вы получите всех заказчиков, которые находились в San Jose или (OR) которые имели оценку выше 200. SELECT * FROM Customers WHERE city = 'SanJose' OR rating > 200; Вывод для этого запроса показывается па Рисунке 10. NOT может использоваться для инвертирования значений Буля. Имеется пример запроса с NOT: SELECT * FROM Customers WHERE city = 'SanJose' OR NOT rating > 200; Вывод этого запроса показывается в Рисунке 11. Все записи за исключением Grass были выбраны. Grass не был в San Jose, и его оценка была больше чем 200, так что он потерпел неудачу при обеих проверках. В каждой из других строк встретился один или другой или оба критериев. Обратите внимание, что оператор NOT должен предшествовать Булеву оператору, чье значение должно измениться, и не должен помещаться перед реляционным оператором. Например, неправильным вводом оценки предиката будет: rating NOT > 200 Он выдаст другую отметку. А как SQL оценит следующее? SELECT * FROM Customers WHERE NOT city = "SanJose' OR rating > 200; NOT применяется здесь только к выражению city = 'SanJose', или к выражению rating > 200 тоже? Как и написано, правильный ответ будет прежним. SQL может применять NOT с выражением Буля только сразу после него. Вы можете получить другой результат при команде: SELECT * FROM Customers WHERE NOT( city = "SanJose" OR rating > 200); Здесь SQL понимает круглые скобки как означающие, что все внутри них будет оцениваться первым и обрабатываться как единое выражение с помощью всего что снаружи них ( это является стандартной интерпретацией в математике ). Другими словами, SQL берет каждую строку и определяет, соответствует ли истине равенство city = " San Jose' или равенство rating > 200. Если любое условие верно, выражение Буля внутри круглых скобок верно. Однако, если выражение Буля внутри круглых скобок верно, предикат как единое целое неверен, потому что NOT преобразует верно в неверно и наоборот. Вывод для этого запроса показывается на Рисунке 12. РЕЗЮМЕ В этой главе, вы значительно расширили ваше знакомство с предикатами. Теперь вы можете находить значения, которые связаны с данным значением любым способом - определяемым различными реляционными операторами. Вы можете также использовать операторы Буля AND и OR чтобы много условий, каждое из которых автономно в предикатах, объединять в единый предикат. Оператор Буля NOT, как вы уже видели, может изменять значение условия или группы условий на противоположное. Булевы и Реляционные операторы могут эффективно управляться с помощью круглых скобок, которые определяют порядок, в котором операции будут выполнены. Эти операции применимы к любому уровню сложности, и вы поняли, как сложные условия могут создаваться из этих простых частей. Выполните задания 6-12. Задания для выполнения к занятию №3 1.Напишите команду SELECT, которая бы вывела номер порядка, сумму, и дату для всех строк из таблицы Порядков. Напишите запрос который вывел бы все строки из таблицы Заказчиков для которых номер продавца = 1001. Напишите запрос, который вывел бы таблицу со столбцами в следующем порядке: city, sname, snum, comm. Напишите команду SELECT, которая вывела бы оценку (rating), сопровождаемую именем каждого заказчика в SanJose. Напишите запрос, который вывел бы значения snum всех продавцов в текущем порядке из таблицы Порядков, без каких бы то ни было пов торений. Напишите запрос, который может дать вам все порядки со значениями суммы выше, чем $1,000. Напишите запрос который может выдать вам пол sname и city для всех продавцов в Лондоне с комиссионными выше .10 . Напишите запрос к таблице Заказчиков чей вывод может включить всех заказчиков с оценкой =< 100, если они не находятся в Риме. Что может быть выведено в результате следующего запроса? SELECT * FROM Orders WHERE (amt < 1000 OR NOT (odate = 10/03/1990 AND спит > 2003)); - Что может быть выведено в результате следующего запроса? SELECT * FROM Orders WHERE NOT ((odate = 10/03/1990 OR snum > 1006) AND amt > = 1500); - Как можно проще переписать такой запрос? SELECT snum, sname, city, comm FROM Salespeople WHERE (comm > + .12 OR comm < .14 ); Подготовьте отчет о проделанной работе. Отчет может быть представлен в письменном или электронном варианте. Содержание отчета: - титульный лист /если отчет в электронном варианте/ цель работы тексты SQL-запросов из примеров результаты выполнения запросов ответы на вопросы тексты SQL-запросов /задания/ с пояснениями результаты выполнения запросов -вывод. - Тема практического занятия №4 Использование специальных операторов в условиях SQL-запросов. Цель работы: получить практические навыки составления и содержательной интерпретации запросов выборки данных с использованием специальных операторов IN, BETWEEN, LIKE, и ISNULL. а также их выполнения на SQL - сервере с использованием клиентских утилит. В дополнение реляционным булевским операторам обсуждаемым в предыдущей работе, SQL использует специальные операторы IN, BETWEEN, LIKE, и ISNULL. В этой главе, вы узнаете как их использовать и как реляционные операторы позволяют создавать более сложные и мощные предикаты. Обсуждение оператора IS NULL будет включать отсутствие данных и значение NULL, которое указывает на то: что данные отсутствуют. Вы также узнаете о разновидностях использования оператора NOT применяющегося с этими операторами. ОПЕРАТОР IN Оператор IN определяет набор значений, которое данное значение может или не может быть вктючено. В соответствии с нашей учебной базой данных на которой вы обучаетесь по настоящее время, если вы хотите найти всех продавцов, которые размещены в Barcelona или в Loudon, вы должны использовать следующий запрос (вывод показывается на Рисунке 1): SELECT * FROM Salespeople WHERE citу = 'Barcelona' OR citv = 'London'; Имеется и более простой способ получить ту же информацию: SELECT * FROM Salespeople WHERE city IN ( "Barcelona", "London"); Вывод для этого запроса показывается на Рисунке 1. Как вы можете видеть. IN определяет набор значений с помощью имен членов набора заключенных в круглые скобки и отделенных запятыми. Он затем проверяет различные значения указанного поля, пытаясь найти совпадение со значениями из набора. Если это случается, то предикат верен. Когда набор содержит значения номеров, а не символов, одиночные кавычки опускаются. Давайте найдем всех заказчиков относящихся к продавцам имеющих значения snum = 1001, 1007, и 1004. Вывод для следующегозапроса показан на Рисунке 2: SELECT * FROM Customers WHERE Snum IN (1001 1007, 1004 ); ОПЕРАТОР BETWEEN Оператор BETWEEN похож на оператор IN. В отличии от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовом}7 порядку. Следующий пример будет извлекать из таблицы Продавцов всех продавцов с комиссионными между .10 и .12 (вывод показывается на Рисунке 3): SELECT * FROM Salespeople WHERE comm BETWEEN 0.10 AND 0.12; Для включенного оператора BETWEEN, значение совпадающее с любым из двух значений границы ( в этом случае, .10 и .12 ) заставляет предикат быть верным. SQL не делает непосредственной определить ваши граничные значения так, сделать что-нибудь типа этого: поддержки не включения BETWEEN. Вы должны или чтобы включающая интерпретация была приемлема, или SEL ECT * FROM Salespeo ple WHERE ( comm BETWEEN 0.10 AND 0.12 ) AND NOT comm IN (0.10, 0.12 ); Вывод для этого запроса показывается на Рисунке 4. По общему признанию, это немного неуклюже, но зато показывает, как эти новые операторы могут комбинироваться с операторами Буля, чтобы производить более сложные предикаты. В основном, вы используете IN и BETWEEN также как вы использовали реляционные операторы, чтобы сравнивать значения, которые берутся либо из набора (для IN) либо из диапазона (для BETWEEN). Также, подобно реляционным операторам, BETWEEN может работать с символьными полями в терминах эквивалентов ASCII. Это означает, что вы можете использовать BETWEEN, чтобы выбирать ряд значений из упорядоченных по алфавиту значений. Этот запрос выбирает всех заказчиков, чьи имена попали в определенный алфавитный диапазон: SELECT * FROM Customers WHERE cname BETWEEN 'A'AND 'G'; Вывод для этого запроса показывается на Рисунке 5. Обратите Внимание что Grass и Giovanni отсутствуют, даже при включенном BETWEEN. Это происходит из-за того, что BETWEEN сравнивает строки неравной длины. Строка 'G' более короткая, чем строка Giovanni, поэтому BETWEEN выводит 'G' с пробелами. Пробелы предшествуют символам в алфавитном порядке (в большинстве реализаций), поэтому Giovanni не выбирается. То же самое происходит с Grass. Важно помнить это когда вы используете BETWEEN для извлечения значений из алфавитных диапазонов. Обычно вы указываете диапазон с помощью символа начала диапазона символа конца( вместо которого можно просто поставить z ) . ОПЕРАТОР LIKE LIKE применим только к полям типа CHAR или VARCHAR, с которыми он используется, чтобы находить подстроки. Т.е. он ищет поле символа, чтобы видеть, совпадает ли с условием часть его строки. В качестве условия он использует групповые символы (wildkards) специальные символы которые могут соответствовать чему-нибудь. Имеются два типа групповых символов используемых с LIKE:* символ подчеркивания (_) замещает любой одиночный символ. Напри мер, 'b_t' будет соответствовать словам 'bat1 или 'bit1, но не будет соответствовать 'brat'.* знак процента (%) замещает последовательность любого числа символов (включая символы нуля). Например '%p%t' будет соответствовать словам 'put', 'posit', или 'opt', но не 'spite'. Давайте найдем всех заказчиков чьи имена начинаются с G ( вывод показывается на Рисунке 6 ) : SELECT * FROM Customers WHERE cname LIKE 'G%'; LIKE может быть удобен, если вы ищете имя или другое значение, и если вы не помните, как они точно пишутся. Предположим, что вы не уверены как записано по буквам имя одного из ваших продавцов Peal или Peel. Вы можете просто использовать ту часть которую вы знаете и групповые символы чтобы находить все возможные пары (вывод этого запроса показывается на Рисунке 7): SELECT * FROM Salespeople WHERE sname LIKE T_ 1 %'; Групповые символы подчеркивания, каждый из которых представляет один символ, добавят только два символа к уже существующим 'Р' и Т , поэтому имя наподобие Prettel не может быть показано. Групповой символ '% ' - в конце строки необходим в большинстве реализаций если длина поля sname больше чем число символов в имени Peel (потому что некоторые другие значения sname - длиннее чем четыре символа ). В таком случае, значение поля sname , фактически сохраняемое как имя Peel, сопровождается рядом пробелов. Следовательно, символ 'Г не будет рассматриваться концом строки. Групповой символ ' % ' - просто соответствует этим пробелам. Это необязательно, если поля sname имеет тип - VARCHAR. А что же Вы будете делать, если вам нужно искать знак процента или знак подчеркивания в строке? В LIKE предикате, вы можете определить любой одиночный символ как символ ESC. Символ ESC используется сразу перед процентом или подчеркиванием е предикате, и означает, что процент или подчеркивание будет интерпретироваться как символ, а не как групповой символ. Например, мы могли бы найти наш sname столбец, где присутствует подчеркивание, следующим образом: SELECT * FROM Salespeople WHERE sname LIKE '%/_%ESCAPE'/'; С этими данными не будет никакого вывода, потому что мы не включили никакого подчеркивания в имя нашего продавца. Предложение ESCAPE определяет '/' как символ ESC. Символ ESC используемый в LIKE строке, сопровождается знаком процента, знаком подчеркивания, или знаком ESCAPE, который будет искаться в столбце, а не обрабатываться как групповой символ. Символ ESC должен быть одиночным символом и применяться только к одиночному символу сразу после него. В примере выше, символ процента начала и символ процента окончания обрабатываются как групповые символы; только подчеркивание предоставлено само себе. Как упомянуто выше, символ ESC может также использоваться самостоятельно. Другими словами, если вы будете искать столбец с вашим символом ESC, вы просто вводите его дважды. Вопервых, это будет означать, что символ ESC "берет следующий символ буквально как символ", и, во-вторых, что символ ESC самостоятелен. Имеется предыдущий пример, который пересмотрен, чтобы искать местонахождение строки '_/' в sname столбце: S E L E C T * F R O M S a l e s p e o p l e WHERE sname LIKE '%/_//%'ESCAPEV; Снова не будет никакого вывода с такими данными. Строка сравнивается с содержанием любой последовательности символов (%), сопровождаемых символом подчеркивания ( /_ ), символом ESC ( / / ) , и любой последовательностью символов в конце строки (% ). РАБОТА С НУЛЕВЫМИ ( NULL ) ЗНАЧЕНИЯМИ Часто, будут иметься записи в таблице, которые не имеют никаких значений для каждого поля, например, потому что информация не завершена, или потому что это поле просто не заполнялось. SQL учитывает такой вариант, позволяя вам вводить значение МЛХ(ПУСТОИ) в поле, вместо значения. Когда значение поля равно NULL, это означает, что программа базы данных специально промаркировала это поле как не имеющее никакого значения для этой строки (или записи). Это отличается от просто назначения полю, значения нуля или пробела, которые база данных будет обрабатывать также как и любое другое значение. Точно так же, как NULL не является техническим значением, оно не имеет и типа данных. Оно может помещаться в любой тип поля. Тем ни менее, NULL в SQL часто упоминается как нуль. Предположим, что вы получили нового заказчика, который еще не был назначен продавцу. Чем ждать продавца к которому его нужно назначить, вы можете ввести заказчика в базу данных теперь же, так что он не потеряется при перестановке. Вы можете ввести строку для заказчика со значением NULL в поле snum заполнить это поле значением позже, когда продавец будет назначен. NULL ОПЕРАТОР Так как NULL указывает на отсутствие значения, вы не можете знать, каков будет результат любого сравнения с использованием NULL. Когда NULL сравнивается с любым значением, даже с другим таким же NULL, результат будет ни верным, ни неверным, он - неизвестен. Неизвестный Булев, вообще ведет себя также как неверная строка, которая, произведя неизвестное значение в предикате, не будет выбрана запросом - имейте в виду, что в то время как NOT(HeBepHoe) - равняется верно, NOT (неизвестное) - равняется неизвестно. Следовательно, выражение типа 'city = NULL' или 'city IN (NULL)' будет неизвестно, независимо от значения city. Часто вы должны делать различия между неверно и неизвестно между строками содержащими значения столбцов которые не соответствуют условию предиката и которые содержат NULL в столбцах. По этой причине, SQL предоставляет специальный оператор IS, который используется с ключевым словом NULL, для размещения значения NULL. Найдем все записи в нашей таблице Заказчиков с NULL значениями в city столбце: SELECT * FROM Customers WHERE city IS NULL: Здесь не будет никакого вывода, потому что мы не имеем никаких значений NULL в наших типовых таблицах. Значения NULL - очень важны, и мы вернемся к ним позже. ИСПОЛЬЗОВАНИЕ NOT СО СПЕЦИАЛЬНЫМИ ОПЕРАТОРАМИ Специальные операторы, которые мы изучали в этой главе могут немедленно предшествовать Булеву NOT. Он противоположен реляционным операторам, которые должны иметь оператор NOT вводимым выражением. Например, если мы хотим устранить NULL из нашего вывода, мы будем использовать NOT, чтобы изменить на противоположное значение предиката: SELECT * FROM Customers WHERE citv NOT NULL: При отсутствии значений NULL (как в нашем случае), будет выведена вся таблица Заказчиков. Аналогично можно ввести следующее SELEC T * FROM Customers WHERE NOT city IS NULL: - что также приемлемо. Мы можем также использовать NOT с IN: SELECT * FROM Salespeople WHERE city NOT IN ('London', 'SanJose'); А это - другой способ подобного же выражения SELECT * FROM Salespeople WHERE NOT city IN ('London',SanJose'); Вывод для этого запроса показывается на Рисунке 8. Таким же способом Вы можете использовать NOT BETWEEN и NOT LIKE. РЕЗЮМЕ Теперь вы можете создавать предикаты в терминах связей специально определенных SQL. Вы можете искать значения в определенном диапазоне (BETWEEN) или в числовом наборе (IN), или вы можете искать символьные значения, которые соответствуют тексту внутри параметров (LIKE). Вы также изучили некоторые вещи относительно того, как SQL поступает при отсутствии данных - что реальность мировой базы данных используя NULL вместо конкретных значений. Вы можете извлекать или исключать значения NULL из вашего вывода, используя, оператор IS NULL. Теперь, когда вы имеете в вашем распоряжении весь набор стандартных математических и специальных операторов, вы можете переходить к специальным функциям SQL, которые работают на всех группах значений, а не просто на одиночном значении, что важно. Задания для выполнения к занятию №4 Напишите два запроса, которые могли бы вывести все порядки на 3 или 4 Октября 1990 Напишите запрос который выберет всех заказчиков обслуживаемых продавцами Peel или Motika. (Подсказка: из наших типовых таблиц, поле snum связывает вторую таблицу с первой) Напишите запрос, который может вывести всех заказчиков, чьи имена начинаются с буквы попадающей в диапазон от А до G. Напишите запрос, который выберет всех пользователей, чьи имена начинаются с буквы С. Напишите запрос, который выберет все порядки, имеющие нулевые значения или NULL в поле amt(cyммa). Тема практического занятия №5 Обобщение данных с помощью агрегатных функций Цель работы: получить практические навыки составления и содержательной интерпретации запросов выборки данных с использованием агрегатных функций SUM, AVG, COUNT, МАХ н MIN. В ЭТОЙ работе, ВЫ ПЕРЕЙДЕТЕ ОТ ПРОСТОГО использования запросов к извлечению значений из базы данных и определению, как вы можете использовать эти значения, чтобы получить из них информацию. Это делается с помощью агрегатных или общих функций, которые берут группы значений из поля и сводят их до одиночного значения. Вы узнаете, как использовать эти функции, как определить группы значений к которым они будут применяться, и как определить какие группы выбираются для вывода. Вы будете также видеть при каких условиях вы сможете объединить значения поля с этой полученной информацией в одиночном запросе. ЧТО ТАКОЕ АГРЕГАТНЫЕ ФУНКЦИИ Запросы могут производить обобщенное групповое значение полей точно также как и значение одного поля. Это делает с помощью агрегатных функций. Агрегатные функции производят одиночное значение для всей группы таблицы. Имеется список этих функций: * COUNT производит номера строк или не- NULL значения полей которые выбрал запрос.* SUM производит арифметическую сумму всех выбранных значений данного поля.* AVG производит усреднение всех выбранных значений данного поля.* МАХ производит наибольшее из всех выбранных значений данного поля.* MIN производит наименьшее из всех выбранных значений данного поля. КАК ИСПОЛЬЗОВАТЬ АГРЕГАТНЫЕ ФУНКЦИИ? Агрегатные функции используются подобно именам полей в предложении SELECT запроса, но с одним исключением, они берут имена поля как аргументы. Только числовые поля могут использоваться с SUM и AVG. С COUNT,МАХ. и MIN. могут использоваться и числовые или символьные поля. Когда они используются с символьными полями, МАХ и MIN будут транслировать их в эквивалент ASCII, который должен сообщать, что MIN будет означать первое, а МАХ последнее значение в алфавитном порядке. Очень важно отметить, что итоговые функции могут использоваться только в списке предложения SELECT и в составе предложения HAVING. Во всех других случаях это недопустимо. Если список в предложении SELECT содержит итоговые функции, а в тексте запроса отсутствует фраза GROUP BY, обеспечивающая объединение данных в группы, то ни один из элементов списка предложения SELECT не может включать каких-либо ссылок на поля, за исключением ситуации, когда поля выступают в качестве аргументов итоговых функций. Чтобы найти SUM всех наших покупок в таблицы Порядков, мы можем ввести следующий запрос, с его выводом на Рисунке 1: SELECT SUM (amt) FROM Orders; Это конечно, отличается от выбора поля при котором возвращается одиночное значение, независимо от того сколько строк находится в таблице. Из-за этого, агрегатные функции и поля не могут выбираться одновременно, пока предложение GROUP BY (описанное далее) не будет использовано. Нахождение усредненной суммы - это похожая операция (вывод следующего запроса показывается на Рисунке 2 ): SELECT AVG (amt) FROM Orders: СПЕЦИАЛЬНЫЕ АТРИБУТЫ COUNT Функция COUNT несколько отличается от всех. Она считает число значений в данном столбце, или число строк в таблице. Когда она считает значения столбца, она используется с DISTINCT чтобы производить счет чисел различных значений в данном поле. Мы могли бы использовать ее, например, чтобы сосчитать номера продавцов, в настоящее время описанных в таблице Порядков ( вывод показывается на Рисунке 3 ): SELECT COUNT (DISTINCT snum ) FROM Orders; ИСПОЛЬЗОВАНИЕ DISTINCT Обратите внимание в вышеупомянутом примере, что DISTINCT, сопровождаемый именем поля с которым он применяется, помещен в круглые скобки, но не сразу после SELECT, как раньше. Этого использования DISTINCT с COUNT применяемого к индивидуальным столбцам, требует стандарт ANSI, но большое количество программ не предъявляют к ним такого требования. Вы можете выбирать многочисленные счета (COUNT ) из полей с помощью DISTINCT в одиночном запросе который, не выполнялся когда вы выбирали строки с помощью DISTINCT. DISTINCT может использоваться, таким образом, с любой функцией агрегата, но наиболее часто он используется с COUNT. С МАХ и MIN, это просто не будет иметь никакого эффекта, a SUM и AVG, вы обычно применяете для включения повторяемых значений, так как они законно эффективнее общих и средних значений всех столбцов. ИСПОЛЬЗОВАНИЕ COUNT СО СТРОКАМИ, А НЕ ЗНАЧЕНИЯМИ Чтобы подсчитать общее число строк в таблице, используйте функцию COUNT со звездочкой вместо имени поля, как например, в следующем примере, вывод из которого показан на Рисунке 4: SELECT COUNT (*) FROM Customers COUNT со звездочкой включает и NULL и дубликаты, по этой причине DISTINCT не может быть использован DISTINCT может производить более высокие номера чем COUNT особого поля, который удаляет все строки, имеющие избыточные или NULL данные в этом поле. DISTINCT не применим с COUNT (*), потому, что он не имеет никакого действия в хорошо разработанной и поддерживаемой базе данных. В такой базе данных, не должно быть ни таких строк, которые бы являлись полностью пустыми, ни дубликатов (первые не содержат никаких данных, а последние полностью избыточны ). Если, с другой стороны, все-таки имеются полностью пустые или избыточные строки, вы, вероятно, не захотите, чтобы COUNT скрыл от вас эту информацию. АГРЕГАТЫ, ПОСТРОЕННЫЕ НА СКАЛЯРНОМ ВЫРАЖЕНИИ До этого, вы использовали агрегатные функции с одиночными полями как аргументами. Вы можете также использовать агрегатные функции с аргументами, которые состоят из скалярных выражении включающих одно или более полей. (Если вы это делаете, DISTINCT не разрешается). Предположим, что таблица Порядков имеет еще один столбец который хранит предыдущий неуплаченный баланс (поле bine) для каждого заказчика. Вы должны найти этот текущий баланс, добавлением суммы приобретений к предыдущему балансу. Вы можете найти наибольший неуплаченный баланс следующим образом: SELECT МАХ ( blnc + (amt)) FROM Orders; Для каждой строки таблицы, этот запрос будет складывать blnc и amt для этого заказчика и выбирать самое большое значение которое он найдет. Конечно, пока заказчики могут иметь многочисленные порядки, их неуплаченный баланс оценивается отдельно для каждого порядка. Возможно, порядок с более поздней датой будет иметь самый большой неуплаченный баланс. Иначе, старый баланс должен быть выбран как в запросе выше. Фактически, имеются большое количество ситуаций в SQL где вы можете использовать скалярные выражения с полями или вместо полей. ПРЕДЛОЖЕНИЕ GROUP BY Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству. Это дает вам возможность объединять поля и агрегатные функции в едином предложении SELECT. Например, предположим что вы хотите найти наибольшую сумму приобретений полученную каждым продавцом. Вы можете сделать раздельный запрос для каждого из них, выбрав MAX(amt) из таблицы Порядков для каждого значения поля snum. GROUP BY, однако, позволит Вам поместить их все в одну команду: SELECT snum, MAX (amt) FROM Orders GROUP BY snum; Вывод для этого запроса показывается на Рисунке 5. GROUP BY применяет агрегатные функции независимо от серий групп, которые определяются с помощью значения поля в целом. В этом случае, каждая группа состоит из всех строк с тем же самым значением поля snum, и МАХ функция применяется отдельно для каждой такой группы. Это значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, также как это делает агрегатная функция. Результатом является совместимость, которая позволяет агрегатам и полям объединяться таким образом. Вы можете также использовать GROUP BY с многочисленными полями. Совершенствуя вышеупомянутый пример далее, предположим, что вы хотите увидеть наибольшую сумму приобретений, получаемую каждым продавцом каждый день. Чтобы сделать это, вы должны сгруппировать таблицу Порядков по датам продавцов, и применить функцию МАХ к каждой такой группе, подобно этому: SELECT snum, odate, MAX ((amt)) FROM Orders GROUP BY snum, odate; Вывод для этого запроса показывается на Рисунке 6. ПРЕДЛОЖЕНИЕ HAVING Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальную сумму приобретений, значение которой выше $3000.00. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный позже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает, что вы не сможете сделать что-нибудь подобно следующему: SELECT snum, odate, MAX (amt) FROM Orders WHERE MAX ((amt)) > 3000.00 GROUP BY snum, odate; Это будет отклонением от строгой интерпретации ANSI. Чтобы увидеть максимальную стоимость приобретений свыше $3000.00, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая: SELECT snum, odate, MAX ((amt)) FROM Orders GROUP BY snum, odate HAVING MAX ((amt)) > 3000.00; Вывод для этого запроса показывается на Рисунке 7. Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящей из команд, использующих GROUP BY. Они должны иметь одно значение на группу вывода. Следующая команда будет запрещена: SELECT snum, MAX (amt) FROM Orders GROUP BY snum HAVING odate = '1990-10-03'; Поле odate не может быть вызвано предложением HAVING, потому что оно может иметь ( и действительно имеет ) больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос( вывод показывается на Рисунке 8 ): SELECT snum, MAX( a mt ) FROM Orders WHERE odate = '1990-10-03' Поскольку поля odate нет, не может быть и выбранных полей, значение этих данных меньше чем в некоторых других примерах. Вывод должен, вероятно включать что-нибудь такое что говорит - " это - самые большие порядки на 3 Октября." Как и говорилось ранее, HAVING может использовать только аргументы которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции - наиболее общие, но и поля выбранные с помощью GROUP BY также допустимы. Например, мы хотим увидеть наибольшие порядки для Series и Rifkin: SELECT snum, MAX (amt) FROM Orders GROUP BY snum HA VING snum in (1002,100 7); Вывод для этого запроса показывается на Рисунке 9. В строгой интерпретации ANSI SQL, вы не можете использовать агрегат агрегата. Предположим, что вы хотите выяснять, в какой день имелась наибольшая сумма приобретений. Если вы попробуете сделать это, то ваша SELECT odate, MAX ( SUM (amt)) FROM Orders GROUP BY odate; команда будет вероятно отклонена. ( Некоторые реализации не предписывают этого ограничения, которое является выгодным, потому что вложенные агрегаты могут быть очень полезны, даже если они и несколько проблематичны.) В вышеупомянутой команде, например, SUM должен применяться к каждой группе поля odate, а МАХ ко всем группам, производящим одиночное значение для всех групп. Однако предложение GROUP BY подразумевает, что должна иметься одна строка вывода для каждой группы поля odate. РЕЗЮМЕ Теперь вы используете запросы несколько по-другому. Способность получать, а не просто размещать значения, очень мощна. Это означает, что вы не обязательно должны следить за определенной информацией, если вы можете сформулировать запрос так чтобы ее получить. Запрос будет давать вам поминутные результаты, в то время как таблица общего или среднего значений будет хороша только некоторое время после ее модификации. Это не должно наводить на мысль, что агрегатные функции могут полностью вытеснить потребность в отслеживании информации такой, например как эта. Вы можете применять эти агрегаты для групп значений определенных предложением GROUP BY. Эти группы имеют значение поля в целом, и могут постоянно находиться внутри других групп, которые имеют значение поля в целом. В то же время, предикаты еще используются, чтобы определять какие строки агрегатной функции применяются.