БАЗЫ ДАННЫХ Методические указания к выполнению лабораторных работ для студентов, обучающихся по направлению подготовки 230100.62 «Информатика и вычислительная техника» Составитель А. А. Будаева Владикавказ 2015 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ (ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ)» Кафедра автоматизированной обработки информации БАЗЫ ДАННЫХ Методические указания к выполнению лабораторных работ для студентов, обучающихся по направлению подготовки 230100.62 «Информатика и вычислительная техника» Составитель А. А. Будаева Допущено редакционно-издательским советом Северо-Кавказского горно-металлургического института (государственного технологического университета). Протокол заседания РИСа № 2 от 18.02.2014 г. Владикавказ 2015 1 УДК 004.65 ББК 32.073.26-0.18.2 Б90 Рецензент: кандидат технических наук, доцент Северо-Кавказского горно-металлургического института (государственного технологического университета) Даурова А. А. Б90 Базы данных: Методические указания к выполнению лабораторных работ для студентов, обучающихся по направлению подготовки 230100.62 – «Информатика и вычислительная техника» / Сост.: А. А. Будаева; Северо-Кавказский горно-металлургический институт (государственный технологический университет). – Владикавказ: Северо-Кавказский горно-металлургический институт (государственный технологический университет). Изд-во «Терек», 2015. – 114 с. В методических указаниях на примерах рассмотрены основные понятия и способы применения SQL – популярного языка запросов к реляционным базам данных; описаны приемы манипулирования данными и формирования запросов различной степени сложности; приведены индивидуальные задания по каждой лабораторной работе. Методические указания способствуют приобретению навыков выполнения работ на предпроектной стадии с целью подготовки исходных данных для технического проектирования компонентов структуры базы данных; а также навыков использования CASE-средств при моделировании прикладных задач и проектировании схем баз данных; формулирования запросов к базам данных на языке SQL; работы в среде систем управления базами данных. УДК 004.65 ББК 32.073.26-0.18.2 Редактор: Боциева Ф. А. Компьютерная верстка: Куликова М. П. Составление. ФГБОУ ВПО «Северо-Кавказский горно-металлургический институт (государственный технологический университет)», 2015 Будаева А. А., составление, 2015 Подписано в печать 06.04.2015. Формат 60х84 1/16. Бумага офсетная. Гарнитура «Таймс». Печать на ризографе. Усл. п.л. 6,63. Уч.-изд. л. 4,56. Тираж 20 экз. Заказ № . Северо-Кавказский горно-металлургический институт (государственный технологический университет). Издательство «Терек». Отпечатано в отделе оперативной полиграфии СКГМИ (ГТУ). 362021, г. Владикавказ, ул. Николаева, 44. 2 Оглавление Лабораторная работа № 1. Проектирование моделей данных с применением CASE-средств. Создание диаграммы сущность-связь. . Лабораторная работа № 2. Формирование просты6х запросов SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Лабораторная работа № 3. Работа с агрегирующими функциями. . . Лабораторная работа № 4. Построение структурированных запросов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Лабораторная работа № 5. Добавление, изменение и удаление данных из таблиц. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Лабораторная работа № 6. Работа с объектами в Transact-SQL. . . . . Лабораторная работа № 7. Программные объекты и функции Transact-SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Литература. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Приложение. Описание баз данных, необходимых для выполнения работ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 16 29 37 60 68 86 105 106 Лабораторная работа № 1 ПРОЕКТИРОВАНИЕ МОДЕЛЕЙ ДАННЫХ С ПРИМЕНЕНИЕМ CASE-СРЕДСТВ. СОЗДАНИЕ ДИАГРАММЫ СУЩНОСТЬ-СВЯЗЬ Цели работы: 1) изучение принципов проектирования данных; 2) приобретение практических навыков создания моделей «сущностьсвязь»; 3) ознакомление с основами работы в CASE-средствах на примере системы ERWin. Теоретические сведения ERWin имеет два уровня представления модели – логический и физический. Логический уровень – это абстрактный взгляд на данные, которые представляются так, как выглядят в реальном мире, и могут называться так, как они называются в реальном мире (например, на кириллице). Логическая модель данных разрабатывается на основе существующих моделей (например, реляционной), но никак не связана с конкретной реализацией системы управления базы данных (СУБД) и прочих физических условий реализации. Она может быть построена на основе другой логической модели, например, на основе модели потоков данных или процессов. Логическая модель является источником информации для фазы физического проектирования. Она предоставляет разработчику физической модели средства проведения всестороннего анализа различных аспектов работы с данными, что имеет исключительно важное значение для выбора действительно эффективного проектного решения. Физическая модель данных, напротив, зависит от конкретной СУБД, фактически являясь отображением системного каталога. В физической модели содержится информация обо всех объектах БД. Поскольку стандартов на объекты БД не существует (например, нет стандарта на типы данных), физическая модель зависит от конкретной реализации СУБД. Следовательно, одной и той же логической модели могут соответствовать несколько разных физических моделей. 4 Интерфейс ERwin. Уровни отображения модели При создании новой логической модели (переключатель типа модели – Logical) остальные значения остаются без изменения. Рис. 1. Создание новой модели Интерфейс модели выполнен в стиле Windows-приложений, достаточно прост и понятен. Палитра инструментов выглядит различно на разных уровнях отображения модели. Рис. 2. Окно отображения модели 5 Рассмотрим кратко основные функции ERwin по отображению модели, а также панель и палитру инструментов. Таблица 1.1 Основная панель инструментов Кнопки Назначение кнопок Создание, открытие, сохранение и печать модели Изменение уровня просмотра модели: уровень сущностей, уровень атрибутов и уровень определений Изменение масштаба просмотра модели Переключение между областями модели – Subject Area Диалоги для генерации отчетов по модели Палитра инструментов Панель инструментов Font and Color Toolbar Панель Суперкласс–подкласс Панель для рисования графических объектов Для создания типов сущностей модели и связывания их между собой используется палитра инструментов (рис. 3). Рис. 3. Палитра инструментов Таблица 1.2 Палитра инструментов Кнопки Назначение кнопок Указатель Сущность Описание Кнопка указателя (режим мыши): в этом режиме можно установить фокус на какомлибо объекте модели Кнопка внесения сущности: для внесения сущности нужно щелкнуть левой кнопкой мыши по кнопке внесения сущности и один раз по свободному пространству на модели. Для редактирования сущностей или других объектов модели необходимо перейти в режим указателя 6 Окончание таблицы 1.2 Кнопки Назначение кнопок Категория Описание Категория, или категориальная связь, – специальный тип связи между сущностями. Для установления категориальной связи нужно щелкнуть левой кнопкой мыши по кнопке категории, затем один раз щелкнуть по сущности-предку, затем – по сущностипотомку Идентифицирующая Связь между независимой и зависимой связь сущностями Связь “Многие-ко- Экземпляр одной сущности может быть многим” связан со многими экземплярами другой сущности и наоборот (эта связь возможна только на уровне логической модели) Неидентифицирующая Связь между независимыми сущностями связь Создание логической модели данных Различают три уровня логической модели, отличающиеся по глубине представления информации о данных: - диаграмма сущность-связь (Entity Relationship Diagram, ERD); - модель данных, основанная на ключах (Key Based model, KB); - полная атрибутивная модель (Fully Attributed model, FA). Диаграмма сущность-связь представляет собой модель данных верхнего уровня. Она включает сущности и взаимосвязи, отражающие основные бизнес-правила предметной области. Такая диаграмма не слишком детализирована, в нее включаются основные сущности и связи между ними, которые удовлетворяют основным требованиям, предъявляемым к информационным системам (ИС). Диаграмма ERD может включать связи «многие-ко-многим» и не включать описание ключей. Как правило, ERD используется для презентаций и обсуждения структуры данных с экспертами предметной области. Модель данных, основанная на ключах, – более подробное представление данных. Она включает описание всех сущностей и первичных ключей и предназначена для представления структуры данных и ключей, которые соответствуют предметной области. Полная атрибутивная модель – наиболее детальное представление структуры данных в третьей нормальной форме, включая все сущности, атрибуты и связи. 7 Сущности и атрибуты Основные компоненты диаграммы ERWin – это сущности, атрибуты и связи. Сущность можно определить как объект, событие или концепцию, информация о которой должна сохраняться. Сущности должны иметь наименование с четким смысловым значением, фактически это имя ее экземпляра. Например, сущность Заказчик с атрибутами Номер заказчика, Фамилия заказчика, Адрес заказчика. Entity Editor в контекстном меню для сущности позволяет определить имя, описание, комментарии, иконку. Для описания атрибутов сущности выбирается пункт Attribute Editor. Здесь можно указать имя нового атрибута и домен, который будет использоваться при определении типа колонки на уровне физической модели. Атрибуты должны именоваться в единственном числе и иметь четкое смысловое значение. Каждый атрибут должен быть определен (закладка Definition), при этом следует избегать циклических определений и производных атрибутов. Для атрибутов первичного ключа (это атрибут или группа атрибутов, идентифицирующих сущность) необходимо сделать пометку в окне выбора Primary Key. Связи Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом или глагольной фразой (Relationship Verb Phrases). Имя связи облегчает чтение диаграммы, например: выполняет размещает клиент заказ сотрудник По умолчанию имя связи на диаграмме не показывается. Для отображения имени следует в контекстном меню для свободного места диаграммы выбрать пункт Display Option/relationship и включить опцию Verb Phrase. На логическом уровне можно установить идентифицирующую связь «один-ко-многим», связь «многие-ко-многим» и неидентифицирующую связь «один-ко-многим» (кнопки в палитре инструментов). Тип сущности определяется ее связью с другими сущностями. Различают зависимые и независимые сущности. Идентифицирующая связь устанавливается между независимой (родительский конец связи) и зависимой (дочерний конец связи) сущностями. Когда рисуется идентифицирующая связь, ERWin автоматически преобразует дочернюю сущность в зависимую. Зависимая сущность изображается прямоугольником со скругленными 8 углами (в предыдущем примере сущность Заказ). Информация о заказе не может быть внесена и не имеет смысла без информации о клиенте, который ее размещает. При установлении идентифицирующей связи атрибуты первичного ключа родительской сущности автоматически переносятся в состав первичного ключа дочерней сущности и помечаются в дочерней сущности как внешний ключ (FK). Эта операция называется миграцией атрибутов. В дальнейшем, при генерации схемы БД, атрибуты первичного ключа получат признак NOT NULL, что означает невозможность внесения записи в таблицу заказов без информации о номере клиента. Заказ Клиент Номер клиента Имя клиента Адрес клиента размещает Номер клиента (FK) Номер заказа Сумма заказа Дата заказа Дата отгрузки Рис. 5. Идентифицирующая связь между независимой и зависимой сущностью При установлении неидентифицирующей связи дочерняя сущность остается независимой, а атрибуты первичного ключа родительской сущности мигрируют в состав неключевых компонентов родительской сущности. Неидентифицирующая связь служит для связывания независимых сущностей. Экземпляр сущности Сотрудник может существовать безотносительно к какому-либо экземпляру сущности Отдел, т. е. Сотрудник может работать в организации, не числясь в какомлибо отделе. Сотрудник Отдел Номер отдела Наименование отдела состоит из Табельный номер сотрудника Номер отдела (FK) Фамилия сотрудника Имя сотрудника Отчество сотрудника Дата рождения сотрудника Рис. 6. Неидентифицирующая связь Во вкладке General меню Relationship Editor можно задать мощность, имя и тип связи. Мощность связи (Cardinality) служит для обозначения отношения числа экземпляров родительской сущности к числу экземпляров дочерней. 9 Можно использовать один из четырех типов мощности: одному экземпляру родительской сущности соответствует 0, 1 или много экземпляров дочерней сущности (не помечается каким-либо символом); одному экземпляру родительской сущности соответствует 1 или много экземпляров дочерней сущности (помечается символом Р); одному экземпляру родительской сущности соответствует 0 или 1 экземпляр дочерней сущности (помечается символом Z); одному экземпляру родительской сущности соответствует заранее заданное число экземпляров дочерней сущности (помечается цифрой точного соответствия). По умолчанию символ, обозначающий мощность связи, не показывается на диаграмме. Для отображения имени следует в контекстном меню для диаграммы (в месте, не занятом объектами модели) выбрать пункт Display Options/Relationship и затем включить опцию Cardinality. Имя связи (Verb Phrase) – фраза, характеризующая отношение между родительской и дочерней сущностями. Для связи «один-ко-многим», идентифицирующей или неидентифицирующей, достаточно указать имя, характеризующее отношение от родительской к дочерней сущности (Parent-to-Child). Для связи «многие-ко-многим» следует указывать имена как Parent-to Child так и Child-to-Parent. 0,1 или много 1 или много 0 или 1 точно N(5) P Z 5 Рис. 2.7. Обозначения мощности Связь «многие-ко-многим» возможна только на логическом уровне. При переходе к физическому уровню Erwin автоматически преобразует связь «многие-ко-многим», добавляя новую таблицу и устанавливая две новые связи один-ко-многим от старых к новой таблице. Имя новой таблице присваивается автоматически как «Имя1_Имя2».5 10 Контрольные вопросы 1. Основные этапы проектирования базы данных. 2. Принципы построения логической модели данных. 3. Какие типы связей используются при построении модели «сущность-связь»? 4. Привести примеры идентифицирующих и неидентифицирующих связей. 5. Что такое мощность связи? Требования к отчету В качестве отчета должна быть представлена ER-диаграмма логической модели данных своего варианта с подробным объяснением ее построения. Лабораторные задания Вариант 1, 10, 19 Тип сущности Атрибуты типа сущности Преподаватель Идентификатор, Имя, Отчество, Фамилия, Кафедра, Должность, Стаж работы Дата проведения, Время проведения, тип Занятие Корпус, Этаж, Номер, Тип, Вместительность Аудитория Имя, Отчество, Фамилия, Группа, Номер студенческого Студент билета, Пол, Дата рождения, Тип документа об образовании, Страна проживания, Область проживания, Город проживания, Проживание в общежитии, Вступительный балл по математике, Вступительный балл по физике, Номер школы, Наличие медали Вариант 2, 11, 20 Тип сущности Атрибуты типа сущности Номер группы, Идентификатор старосты, Группа Идентификатор профорга, Количество человек в группе, Выпускающая кафедра Название учебной дисциплины, Дата определения Текущая успеваемость текущей успеваемости, Оценка текущей успеваемости Идентификатор, Краткое название, Полное название, Факультет ФИО декана 11 Студент Имя, Отчество, Фамилия, Номер группы, Номер студенческого билета, Пол, Дата рождения, Тип документа об образовании, Страна проживания, Область проживания, Город проживания, Проживание в общежитии, Вступительный балл по математике, Вступительный балл по физике, Номер школы, Наличие медали Вариант 3, 12, 21 Тип сущности Атрибуты типа сущности Вид спорта, Номер команды, Название команды, Город Команда базирования, Количество игроков, Фамилия тренера, Базовый стадион Номер игрока, Номер команды, Фамилия игрока, Дата Игрок рождения игрока, Роль в команде Дата/время гола, Номер игры, Номер игрока, Номер Гол команды соревнования, Дата/время соревнования, Соревнование Номер Название соревнования, Место проведения (город), Дата проведения соревнования Номер игры, Номер соревнования, Дата/время игры, Игра Участник_1 игры, Участник_2 игры Вариант 4, 13, 22 Тип Атрибуты типа сущности сущности Родственник Идентификатор родственника студента, Имя родственника студента, Отчество родственника студента, студента Фамилия родственника студента, Дата рождения родственника студента, Тип родственника студента, Место жительства родственника студента, Место работы родственника студента Глава семьи, Количество членов семьи Семья студента Фамилия друга, Имя друга, Отчество друга, Прозвище Друзья друга, Пол друга, Дата рождения друга, Хобби друга студента 12 Студент Имя студента, Отчество студента, Фамилия студента, Группа, Номер студенческого билета, Пол студента, Дата рождения студента, Тип документа об образовании, Страна проживания студента, Область проживания студента, Город проживания студента, Проживание в общежитии, Вступительный балл по математике, Вступительный балл по физике, Номер школы, Наличие медали Вариант 5, 14, 23 Тип Атрибуты типа сущности сущности Тип лечебного заведения, Номер лечебного заведения, Лечебное Специализация лечебного заведения, Место заведение расположения (город) Номер врача, Номер лечебного заведения, Фамилия Врач врача, Специализация врача, Статус врача Дата/время приема, Номер кабинета, Номер врача, Номер Прием страхового полиса пациента, Причина визита, Диагноз, Метод лечения Фамилия пациента, Номер страхового полиса пациента, Пациент Место жительства пациента, Диагноз Вариант 6, 15, 24 Тип Атрибуты типа сущности сущности Номер магазина, Специализация магазина, Название Магазин магазина, Адрес магазина Табельный номер сотрудника, Должность сотрудника, Сотрудник Фамилия сотрудника, Адрес сотрудника, Семейное положение, Количество детей Номер отдела, Название отдела, Фамилия заведующего Отдел отделом Код товара, Название товара, Номер отдела продажи, Товар Дата/время поставки, Количество товара, Цена товара, Единица измерения, Срок годности, Номер поставщика Номер поставщика, Название поставщика, Тип Поставщик продукции, Адрес поставщика, Номер договора 13 Вариант 7, 16, 25 Тип Атрибуты типа сущности сущности Библиотека Номер библиотеки, Название библиотеки, Количество единиц хранения, Адрес библиотеки Табельный номер сотрудника, Фамилия сотрудника, Имя Сотрудник сотрудника, Отчество сотрудника, Дата рождения сотрудника, Образование сотрудника Номер книги, Шифр книги, Название книги, Стеллаж, Книга Автор книги, издательство, Год издания, Цена книги, Дата поступления Номер билета, Фамилия абонента, Адрес абонента, Абонент Телефон абонента, Место работы абонента Номер билета, Номер книги, Дата/время выдачи Выдача Вариант 8, 17, 26 Тип Атрибуты типа сущности сущности Номер хлебозавода, Адрес хлебозавода Хлебозавод Номер изделия, Название изделия, Ингредиент_1, Изделие Количество ингр_1, Ингредиент_2, Количество ингр_2, Ингредиент_3, Количество ингр_3, Номер отделаизготовителя, Номер отдела продаж Номер отдела, Название отдела, Количество Отдел сотрудников, Фамилия начальника отдела Номер поставщика, Адрес поставщика, Номер договора Поставщик Табельный номер сотрудника, Фамилия сотрудника, Сотрудник Место жительства, Должность сотрудника, Номер отдела, Специализация Номер договора, Дата договора, Номер поставщика, Договор Продукт поставки, Количество продукта поставки Вариант 9, 18, 27 Тип сущности Атрибуты типа сущности Номер автовокзала, Город расположения автовокзала, Автовокзал Количество автосредств Автосредство Номер автосредства, Номер автобазы, Название автосредства, Количество мест, Дата получения 14 Сотрудник Рейс Билет Табельный номер сотрудника, Название автовокзала, Фамилия сотрудника, Должность сотрудника, Квалификация сотрудника Табельный номер сотрудника, Название автовокзала, Пункт назначения, Дата/время отправления, Номер автосредства Номер билета, Пункт назначения, Фамилия пассажира, Номер рейса, Дата/время отправления 15 Лабораторная работа № 2 ФОРМИРОВАНИЕ ПРОСТЫХ ЗАПРОСОВ SELECT Цели работы: 1) обучение использованию предложения оператора SELECT и некоторых функций для выполнения простых запросов к БД в режиме диалогового (интерактивного) SQL; 2) приобретение практических навыков форматирования списка вывода SELECT-запросов; 3) изучение специальных условий в запросах: IN, BETWEEN, LIKE, IS NULL; 4) приобретение практических навыков написания запросов с использованием возможностей специальных условий: поиск по вхождению в список значений; поиск по принадлежности значения заданному диапазону; поиск текста по шаблону; поиск по наличию NULL-значений. Теоретические сведения SQL – это аббревиатура выражения Structured Query Language (язык структурированных запросов). SQL основывается на реляционной алгебре и специально разработан для взаимодействия с реляционными базами данных. Является, прежде всего, информационно-логическим языком, предназначенным для описания хранимых данных, их извлечения и модификации. SQL не является языком программирования. Вместе с тем конкретные реализации языка, как правило, включают различные процедурные расширения. Запросы на выборку данных (оператор SELECT) – наиболее часто используемый SQL-оператор. Он предназначен для выборки информации из таблиц. Чтобы при помощи оператора SELECT извлечь данные из таблицы, нужно указать как минимум две вещи: что вы хотите выбрать и откуда. Синтаксис команды SELECT SELECT список вывода FROM {таблица, представление} [WHERE условие] 16 [GROUP BY список полей группировки] [HAVING условие] [ORDER BY список полей сортировки] Примеры 1. Выборка отдельных столбцов: SELECT [Description] FROM Product 2. Выборка нескольких столбцов: SELECT [Description], [InStock] FROM Product 3. Выборка нескольких столбцов: SELECT * FROM Product Для создания и тестирования данного запроса в Management Studio выполните следующие шаги: 1. В контекстном меню базы Sales выберите команду «Создать запрос» или щелкните соответствующую кнопку на панели инструментов . 2. В открывшемся окне создания нового запроса введите представленные выше инструкции SQL. 3. Для запуска запроса на выполнение щелкните кнопку на панели инструментов или нажмите клавишу F5. В нижней части экрана должны появиться результаты. Studio позволяет сохранять пакеты SQL. Это полезно для сохранения сложных запросов, которые будут повторно запускаться в будущем. Для этого щелкните кнопку на панели инструментов. По умолчанию файлы запросов сохраняются с расширением .sql. В дальнейшем сохраненный запрос может быть открыт командой «Открыть файл». Рис. 2.8. Пример вывода данных запроса 17 Сортировка данных В результате выполнения запроса на выборку данные выводятся в том порядке, в котором они находятся в таблице. Для точной сортировки выбранных при помощи оператора SELECT данных используется предложение ORDER BY. В этом предложении указывается имя одного или нескольких столбцов, по которым необходимо отсортировать результаты. Взгляните на следующий пример: SELECT IdProd, [Description], InStock FROM Product ORDER BY InStock Предложение ORDER BY указывает СУБД отсортировать данные по возрастанию значений столбца InStock. Чтобы осуществить сортировку по нескольким столбцам, просто укажите их имена через запятую. В следующем коде выбираются три столбца, а результат сортируется по двум из них – сначала по количеству, а потом по названию: SELECT IdProd, [Description], InStock FROM Product ORDER BY InStock, [Description] Важно понимать, что при сортировке по нескольким столбцам порядок будет таким, который указан в запросе. Другими словами, в примере, приведенном выше, продукция сортируется по столбцу Description, только если существует несколько строк с одинаковыми значениями InStock. Если никакие значения столбца InStock не совпадают, данные по столбцу Description сортироваться не будут. В предложении ORDER BY можно также использовать порядок сортировки по убыванию. Для этого необходимо указать ключевое слово DESC. В следующем примере продукция сортируется по количеству в убывающем порядке плюс по названию продукта. SELECT IdProd, [Description], InStock FROM Product ORDER BY InStock DESC, [Description] 18 Ключевое слово DESC применяется только к тому столбцу, после которого оно указано. В предыдущем примере ключевое слово DESC было указано для столбца InStock, но не для Description. Таким образом, столбец InStock отсортирован в порядке убывания, а столбец Description в возрастающем порядке (принятом по умолчанию). Фильтрация данных В таблицах баз данных обычно содержится много информации и довольно редко возникает необходимость выбирать все строки таблицы. Гораздо чаще бывает нужно извлечь какую-то часть данных таблицы для каких-либо действий или отчетов. Выборка только необходимых данных включает в себя критерий поиска, также известный под названием «предложение фильтрации». В операторе SELECT данные фильтруются путем указания критерия поиска в предложении WHERE. Предложение WHERE указывается сразу после названия таблицы (предложения FROM) следующим образом: SELECT IdProd, [Description], InStock FROM Product WHERE InStock = 0 Этот оператор извлекает значения всех столбцов из таблицы товаров, но показывает не все строки, а только те, значение в столбце InStock (Количество товаров на складе) которых равно 0, т.е. только список отсутствующих на складе товаров. При совместном использовании предложений ORDER BY и WHERE, предложение ORDER BY должно следовать после WHERE. В предыдущем примере проводилась проверка на равенство, т. е. определялось, содержится ли в столбце указанное значение. SQL поддерживает весь спектр условных (логических) операций, которые приведены в следующей таблице. Операция = <> != < <= !< Описание Равенство Неравенство Неравенство Меньше Меньше или равно Не меньше Операция > >= !> BETWEEN IS NULL 19 Описание Больше Больше или равно Не больше Между двумя указанными значениями Значение NULL В следующем примере осуществляется выборка всех клиентов, для которых не указан контактный телефон: SELECT FName, LName, Phone FROM Customer WHERE PHONE IS NULL Для поиска диапазона значений можно использовать операцию BETWEEN. Ее синтаксис немного отличается от других операций предложения WHERE, так как для нее требуются два значения: начальное и конечное. Например, операцию BETWEEN можно использовать для поиска товаров, количество которых находится в промежутке между 5 и 10: SELECT IdProd, [Description], InStock FROM Product WHERE InStock BETWEEN 5 AND 10 Для объединения в предложении WHERE нескольких условий необходимо использовать логические операторы AND и (или) OR. Оператор AND требует одновременного выполнения обоих условий. Запишем предыдущий запрос посредством объединения двух операций сравнения оператором AND: SELECT IdProd, [Description], InStock FROM Product WHERE (InStock >= 5) AND (InStock <= 10) Ключевое слово AND указывает СУБД возвращать только те строки, которые удовлетворяют всем перечисленным критериям отбора. В данном случае будут выбраны только те товары, количество которых находится в промежутке от 5 до 10. Оператор OR указывает СУБД выбирать только те строки, которые удовлетворяют хотя бы одному из условий: SELECT IdCity, CityName FROM City WHERE (CityName = 'Москва') OR (CityName = 'Казань') Посредством этого SQL запроса из справочника городов выбираются только Москва и Казань. Ключевое слово OR указывает СУБД 20 использовать какое-то одно условие, а не сразу два. Если бы здесь использовалось ключевое слово AND, мы бы не получили никаких данных. Если вы внимательно рассмотрите выражение в предыдущем предложении WHERE, то заметите, что значения, с которыми сравниваются названия городов, заключены в одинарные кавычки. Одинарные кавычки используются для определения границ строки (строковой константы). При работе со строковыми константами их всегда необходимо отделять одинарными кавычками. Предложения WHERE могут содержать любое количество логических операторов AND и OR. Комбинируя их можно создавать сложные фильтры. Однако при комбинировании ключевых слов AND и OR необходимо учитывать, что оператор AND выполняется раньше оператора OR, т. е. имеет более высокий приоритет. Изменить приоритет можно с помощью круглых скобок. В следующем примере осуществляется выборка из таблицы клиентов всех Ивановых и Петровых, для которых не указан контактный телефон: SELECT FName, LName, Phone FROM Customer WHERE (LName = 'Иванов' OR LName = 'Петров') AND PHONE IS NULL В случае отсутствия скобок результат был бы неверным, а именно включал бы в себя всех Петровых без контактного телефона и всех Ивановых без каких-либо ограничений. Для того чтобы определить, входит ли сравниваемое значение в определенное заданное множество, можно воспользоваться оператором IN. При этом все допустимые значения, заключенные в скобки, перечисляются через запятую. В частности, предыдущий пример с использованием оператора IN может быть записан в более компактной форме: SELECT FName, LName, Phone FROM Customer WHERE LName IN ('Иванов','Петров') AND PHONE IS NULL Для отрицания какого-то условия используется логический оператор NOT. Поскольку NOT никогда не используется сам по себе (а только вместе с другими логическими операторами), его синтаксис немного отличается от синтаксиса остальных операторов. В отличие от них, NOT вставляется перед названием столбца, значения которого нужно 21 отфильтровать, а не после. В следующем примере отбираются все клиенты, для которых имеются сведения об их контактом телефоне: SELECT FName, LName, Phone FROM Customer WHERE NOT PHONE IS NULL Для фильтрации данных по критерию соответствия определенной символьной строки заданному шаблону используется оператор LIKE. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символышаблоны могут совпадать с произвольными элементами символьной строки. Использование символов-шаблонов с оператором LIKE предоставляет больше возможностей, чем использование обычных операторов сравнения. Шаблон может включать в себя следующие символы-шаблоны: Символшаблон % _ Описание Пример Любое количество Инструкция WHERE FName LIKE 'А%' символов выполняет поиск и выдает всех клиентов, имена которых начинаются на букву ‘А’ Любой одиночный Инструкция WHERE LName LIKE '_етров' символ выполняет поиск и выдает всех клиентов, фамилии которых состоят из шести букв и заканчиваются сочетанием ‘етров’ (Петров, Ветров и т. п.) [] Любой символ, Инструкция WHERE LName LIKE '[Луказанный в С]омов' выполняет поиск и выдает всех квадратных скобках клиентов, фамилии которых заканчиваются на ‘омов’ и начинаются на любую букву в промежутке от ‘Л’ до ‘С’, например Ломов, Ромов, Сомов и т. п. [^] Любой символ, кроме Инструкция WHERE LName LIKE 'ив[^а]%' перечисленных в выполняет поиск и выдает всех клиентов, квадратных скобках фамилии которых начинаются на ‘ив’ и третья буква отличается от ‘а’ 22 В следующем примере осуществляется выборка всех товаров, названия которых начинаются на букву Т: SELECT * FROM Product WHERE [Description] LIKE 'Т%' Создание вычисляемых полей Конструкция SELECT, кроме имен столбцов таблиц, может также включать так называемые вычисляемые поля. В отличие от всех выбранных нами ранее столбцов, вычисляемых полей на самом деле в таблицах базы данных нет. Они создаются "на лету" SQL-оператором SELECT. Рассмотрим следующий пример: SELECT IdCust AS 'Номер', FName + ' ' +LName AS 'Фамилия и имя клиента' FROM Customer Здесь создается вычисляемое поле, которому с помощью ключевого слова AS дан псевдоним ‘Фамилия и имя клиента’. Оно позволяет объединить (произвести конкатенацию) с помощью оператора + фамилию, пробел и имя клиента в одно поле (столбец). Псевдоним может быть задан и для обычного столбца таблицы. В частности, здесь столбцу IdCust задан псевдоним ‘Номер’. Еще одним способом использования вычисляемых полей является выполнение математических операций над выбранными данными. Рассмотрим пример: SELECT IdProd, Qty, Price, Qty * Price AS 'Стоимость' FROM OrdItem WHERE IdOrd = 1 Здесь с помощью оператора умножения * вычисляется общая стоимость каждого товара в заказе с кодом 1 как произведение количества на цену. Исключение дублирующих записей Для исключения из результата выборки повторяющихся строк используется ключевое слово DISTINCT, которое указывается сразу после SELECT. В следующем примере осуществляется вывод всех фамилий клиентов. Даже если среди них есть однофамильцы, каждая фамилия будет выведена только один раз: SELECT DISTINCT LName FROM Customer 23 Задания на лабораторную работу Задания типа А Дать содержательную интерпретацию SQL-запросам, выполнить их на SQL-сервере с использованием клиентских утилит Query Analyzer. База данных книготорговой компании 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. SELECT au_lname, au_fname FROM authors SELECT au_lname, au_fname FROM authors ORDER BY au_lname SELECT au_lname, au_fname FROM authors ORDER BY au_lname, au_fname SELECT title_id, price, ytd_sales, price*ytd_sales 'ytd dollar sales' FROM titles ORDER BY price*ytd_sales SELECT title_id, price, ytd_sales, price*ytd_sales 'ytd dollar sales' FROM titles ORDER BY price*ytd_sales DESC SELECT title_id, type, ytd_sales FROM titles ORDER BY type ASC, ytd_sales DESC SELECT DISTINCT type FROM titles ORDER BY type ASC SELECT DISTINCT city FROM authors ORDER BY city DESC SELECT DISTINCT state FROM authors ORDER BY state SELECT DISTINCT country FROM publishers ORDER BY country DESC SELECT * FROM titles SELECT au_lname, au_fname FROM authors WHERE state= 'CA' SELECT type, title_id, price FROM titles WHERE price*ytd_sales < advance SELECT au_id, city, state FROM authors WHERE state= 'CA' OR city= 'Palo Alto' SELECT title_id, price FROM titles WHERE price between $5 AND $15 SELECT title_id, price FROM titles WHERE type IN ('mod_cook', 'trad_cook', 'business') SELECT au_lname, au_fname, city, state FROM authors WHERE city like 'San%' SELECT type, title_id, price FROM titles WHERE title_id like 'B_2075' SELECT type, title_id, price FROM titles WHERE title_id like 'B[AUN]7832' SELECT title FROM titles WHERE ytd_sales IS NULL SELECT au_lname 'Фамилия', au_fname 'Имя' FROM authors WHERE contract=1 AND phone LIKE '408____-__2_' 24 22. SELECT phone FROM authors WHERE address LIKE '%Broadway Av.%' 23. SELECT title, pubdate FROM titles WHERE pubdate>= 'Jun 9 1991 12:00AM' AND pubdate< '6/16/91' Задания типа B Составить SQL-запросы по их заданному содержательному описанию, выполнить SQL-запросы на SQL-сервере с использованием клиентской утилиты Query Analyzer, проинтерпретировать результаты выполнения запросов. База данных «Сеть магазинов по продажам сумок» Выбрать всю информацию по поставщикам. Отсортировать по названию. 2. Выбрать информацию по поставщикам, включающую название, адрес, рейтинг. Отсортировать по убыванию рейтинга. 3. Выбрать всех поставщиков из города Челябинск. 4. Выбрать всех поставщиков из города Челябинск и Москва. Информация о поставщике должна включать название поставщика, рейтинг, город. 5. Выбрать всех поставщиков с рейтингом менее 0. Отсортировать по убыванию рейтинга. 6. Выбрать всех поставщиков с рейтингом больше 0. Отсортировать по возрастанию рейтинга. 7. Выбрать всех поставщиков, в названии которых присутствует сочетание букв «ЗАО». 8. Выбрать информацию о тех поставщиках, для которых заполнено поле «note» (примечание). Информация должна включать название, адрес, примечание. Список нужно отсортировать по названию в алфавитном порядке. 9. Вывести отсортированный по алфавиту список всех продавцов, 10. Вывести всю информацию по всем заказам с начала года. Отсортировать по номерам. 11. Вывести информацию по неисполненным заказам (заказам, у которых отсутствует дата поставки). 12. Вывести информацию по неисполненным просроченным заказам (заказам, у которых отсутствует дата поставки и время исполнения заказа истекло). 1. 25 13. Вывести информацию по заказам, включающую № заказа, дату заказа за последнюю неделю. 14. Вывести информацию по заказам, на выполнение которых задан срок более 30 дней. 15. Выдать информацию по товарам с ценой для покупателя более 300 рублей. 16. Выдать информацию о товаре, у которого разница между ценой закупки и ценой для покупателя более 300 рублей. 17. Информация о товаре, заказанном в единичном экземпляре. 18. Информацию о товаре, которая включает в себя название модели, общую стоимость заказа (количество*цена закупки), отсортировать по названию модели. База данных книготорговой компании 19. Выбрать имена и фамилии авторов книг. 20. Выбрать имена и фамилии авторов, проживающих в Калифорнии. 21. Выбрать информацию о книгах, объем (стоимость) продаж которых в текущем году меньше стоимости предварительной продажи. Информация о книгах должна включать тип книги, идентификатор и цену книги. 22. Выбрать информацию об авторах, проживающих в штате Калифорния или в городе Salt Lake City. Информация об авторах должна включать идентификатор автора, город и штат проживания. 23. Выбрать все идентификаторы и цены книг, причем цена книги должна быть в диапазоне от 5 до 10 долларов. В SQL запросе использовать предикат BETWEEN. 24. Выбрать все идентификаторы и цены книг по современной и традиционной кулинарии и по бизнесу. В запросе использовать предикат IN. 25. Выбрать информацию об авторах, проживающих в городах, название которых начинается со строки ‘spring’. Информация об авторах должна включать имя и фамилию автора, а также штат и город проживания. 26. Выбрать информацию о книгах, идентификаторы которых начинаются буквой ‘B’, а кончаются строкой ‘1342’. Информация о книгах должна включать тип, идентификатор и цену книги. 27. Выбрать информацию о книгах, идентификаторы которых начинаются буквой ‘B’, заканчиваются строкой ‘1342’, а вторым символом 26 28. 29. 30. 31. 32. 33. 34. 35. 36. идентификатора являются буквы ‘A’, ‘U’ или ‘N’. Информация о книгах должна включать тип, идентификатор и цену книги. Выбрать имена и фамилии всех авторов, упорядоченные по возрастанию фамилий авторов. Выбрать имена и фамилии всех авторов, упорядоченные, в первую очередь, по возрастанию фамилий, а затем – по возрастанию имен. Выбрать информацию о книгах, упорядоченную по возрастанию объема продаж (по стоимости). Информация о книгах должна включать идентификатор, цену, объем продаж (по количеству) и объем продаж (по стоимости). То же, что 30, но использовать упорядочение по убыванию. Выбрать информацию о всех книгах, упорядоченную по убыванию типа книги и числа проданных книг. Информация о книгах должна включать идентификатор и тип книги, а также число проданных книг. Определить, какой город в каком штате находится. Вывести названия городов в порядке возрастания. Определить авторов на букву ‘G’, проживающих в штатах Теннесси, Иллинойс, Канзас, Орегон или Калифорния, которые опубликовали книги, в названиях которых есть слово из трех букв, причем средней буквой является буква ‘a’. Определить книги, авторы и издатели которых живут в одном городе. Выбрать все столбцы таблицы titles. Варианты лабораторных заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 Задание типа A 1 13 5 17 2 14 6 18 3 15 7 19 4 16 8 20 5 17 9 21 6 18 10 22 7 19 11 23 8 20 12 1 9 21 13 2 10 22 14 3 11 23 15 4 12 1 16 5 27 8 9 10 11 12 13 14 15 16 17 18 19 Задание типа B 20 32 3 15 21 33 4 16 22 34 5 17 23 35 6 18 24 36 7 19 25 31 8 20 26 32 9 21 27 36 10 22 28 30 11 23 29 36 12 24 30 1 13 25 31 2 14 26 27 28 29 30 31 32 33 34 35 36 31 33 Примечания. 1. При упорядочении фамилий и имен авторов, городов, штатов, типов книг используется лексикографический порядок. 2. “Издатель” и “Издательство” являются в данном случае синонимами. Соответственно этому синонимами являются “Имя издателя” и “Название издательства”. Контрольные вопросы 1. Какие основные конструкции входят в оператор SELECT? 2. Можно ли менять порядок конструкций в операторе SELECT? 3. Укажите ключевое слово, предназначенное для исключения повторяющихся строк из результата запроса. 4. С помощью какой конструкции выполняется сортировка результата запроса? 5. Какие конструкции являются обязательными для оператора SELECT? 6. Какое ключевое слово используется для выполнения сортировки по убыванию? 7. Какие типы условий поиска (предикаты) вы знаете? Какие ключевые слова используются для их задания? 28 Лабораторная работа № 3 РАБОТА С АГРЕГИРУЮЩИМИ ФУНКЦИЯМИ Цели работы: 1) изучить функции SQL–Server, а также фразы GROUP BY, HAVING, ORDER BY предложения SELECT; 2) приобрести практический опыт по использованию фраз GROUP BY, HAVING, ORDER BY предложения SELECT. Краткие теоретические сведения В SQL определено множество встроенных функций различных категорий, среди которых особое место занимают агрегатные функции, оперирующие значениями столбцов множества строк и возвращающие одно значение. Аргументами агрегатных функций могут быть как столбцы таблиц, так и результаты выражений над ними. Агрегатные функции и сами могут включаться в другие арифметические выражения. В следующей таблице приведены наиболее часто используемые стандартные унарные агрегатные функции. Функция COUNT SUM AVG MIN MAX Возвращаемое значение Количество значений в столбце или строк в таблице Сумма Среднее Минимум Максимум Общий формат унарной агрегатной функции следующий: имя_функции([АLL | DISTINCT] выражение), где DISTINCT указывает, что функция должна рассматривать только различные значения аргумента, а ALL – все значения, включая повторяющиеся (этот вариант используется по умолчанию). Например, функция AVG с ключевым словом DISTINCT для строк столбца со значениями 1, 1, 1 и 3 вернет 2, а при наличии ключевого слова ALL вернет 1,5. Агрегатные функции применяются во фразах SELECT и HAVING. Здесь мы рассмотрим их использование во фразе SELECT. В этом случае выражение в аргументе функции применяется ко всем строкам входной таблицы фразы SELECT. Кроме того, во фразе SELECT нельзя 29 использовать и агрегатные функции, и столбцы таблицы (или выражения с ними) при отсутствии фразы GROUP BY, которую мы рассмотрим в следующем разделе. Функция COUNT имеет два формата. В первом случае возвращается количество строк входной таблицы, во втором случае – количество значений аргумента во входной таблице: COUNT(*)([DISTINCT | ALL] выражение) Простейший способ использования этой функции – подсчет количества строк в таблице (всех или удовлетворяющих указанному условию). Для этого используется первый вариант синтаксиса. Запрос: количество видов продукции, информация о которых имеется в базе данных: SELECT COUNT(*) AS 'Количество видов продукции' FROM Product Во втором варианте синтаксиса функции COUNT в качестве аргумента может быть использовано имя отдельного столбца. В этом случае подсчитывается количество либо всех значений в этом столбце входной таблицы, либо только неповторяющихся (при использовании ключевого слова DISTINCT). Запрос: количество различных имен, содержащихся в таблице Customer: SELECT COUNT(DISTINCT FNAME) FROM Customer Использование остальных унарных агрегатных функции аналогично COUNT за тем исключением, что для функций MIN и MAX использование ключевых слов DISTINCT и ALL не имеет смысла. С функциями COUNT, MAX и MIN, кроме числовых, могут использоваться и символьные поля. Если аргумент агрегатной функции не содержит значений, функция COUNT возвращает 0, а все остальные – значение NULL. Запрос: дата последнего заказа до 1 сентября 2010 года: SELECT MAX(OrdDate) FROM [Order] WHERE OrdDate<'1.09.2010' 30 Описанные выше агрегатные функции применялись ко всей таблице. Однако часто при создании отчетов появляется необходимость в формировании промежуточных итоговых значений, то есть относящихся к данным не всей таблицы, а ее частей. Для этого предназначена фраза GROUP BY. Она позволяет все множество строк таблицы разделить на группы по признаку равенства значений одного или нескольких столбцов (и выражений над ними). Фраза GROUP BY должна располагаться вслед за фразой WHERE (если она отсутствует, то за фразой FROM). При наличии фразы GROUP BY фраза SELECT применяется к каждой группе, сформированной фразой группировки. В этом случае и действие агрегатных функций, указанных во фразе SELECT, будет распространяться не на всю результирующую таблицу, а только на строки в пределах каждой группы. Каждое выражение в списке фразы SELECT должно принимать единственное значение для группы, то есть оно может быть: константой; агрегатной функцией, которая оперирует всеми значениями аргумента в пределах группы и агрегирует их в одно значение (например, в сумму); выражением, идентичным стоящему во фразе GROUP BY; выражением, объединяющим приведенные выше варианты. Самым простым вариантом использования фразы GROUP BY является группировка по значениям одного столбца. Запрос: количество клиентов по городам: SELECT IdCity, COUNT(*) AS 'Кол-во клиентов' FROM Customer GROUP BY IdCity Если в запросе используются фразы и WHERE, и GROUP BY, строки, не удовлетворяющие условию фразы WHERE, исключаются до выполнения группировки. Вследствие этого группировка производится только по тем строкам, которые удовлетворяют условию. Запрос: количество клиентов по городам с фамилией ‘Иванов’: SELECT IdCity, COUNT(*) AS 'Кол-во клиентов' FROM CustomerLName = 'Иванов' GROUP BY IdCity 31 SQL позволяет группировать строки таблицы и по нескольким столбцам. В этом случае имена столбцов перечисляются во фразе GROUP BY через запятую. Запрос: количество клиентов по каждой фамилии и имени: SELECT LName, FName, COUNT(*) FROM Customer GROUP BY LName, FName Для отбора строк среди полученных групп применяется фраза HAVING. Она играет такую же роль для групп, что и фраза WHERE для исходных таблиц, и может использоваться лишь при наличии фразы GROUP BY. В предложении SELECT фразы WHERE, GROUP BY и HAVING обрабатываются в следующем порядке. 1. Фразой WHERE отбираются строки, удовлетворяющие указанному в ней условию; 2. Фраза GROUP BY группирует отобранные строки; 3. Фразой HAVING отбираются группы, удовлетворяющие указанному в ней условию. Значение условия, указываемого во фразе HAVING, должно быть уникальным для всех строк каждой группы. Поэтому правила использования имен столбцов и агрегатных функций во фразе HAVING такие же, как и для фразы SELECT при наличии фразы GROUP BY. Это значит, что во фразе HAVING в качестве операндов сравнения можно использовать только группируемые столбцы или агрегатные функции. Запрос: список городов, количество клиентов из которых больше 10. SELECT IdCity FROM Customer GROUP BY IdCity HAVING COUNT(*)>10 Задания к лабораторной работе 3 Задания типа А База данных книготорговой компании Дать содержательную интерпретацию SQL-запросам, выполнить их на SQL-сервере с использованием клиентских утилит Query Analyzer. 1. SELECT AVG(price) FROM titles 32 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. SELECT AVG(price), AVG(DISTINCT price) FROM titles SELECT AVG(price) 'AVG' FROM titles WHERE type= 'business' SELECT AVG(price) 'avg', SUM(price) 'sum' FROM titles WHERE type IN ('business', 'mod_cook') SELECT COUNT(*) FROM authors WHERE state= 'CA' SELECT COUNT(*) FROM titles WHERE title LIKE 'Co%s' SELECT type, AVG(price) 'avg', SUM(price) 'sum' FROM titles WHERE type IN ('business', 'psychology') GROUP BY type SELECT type, pub_id, AVG(price) 'avg', SUM(price) 'sum' FROM titles WHERE type IN ('business', 'mod_cook') GROUP BY type, pub_id SELECT type, AVG(price) FROM titles WHERE price>$11 GROUP BY type HAVING AVG(price)>$19.7 SELECT au_id, COUNT(*) FROM authors GROUP BY au_id HAVING COUNT(*)>1 SELECT type, MIN(price), MAX(price) FROM titles GROUP BY type ORDER BY type SELECT type, MIN(price), MAX(price) FROM titles GROUP BY type HAVING MAX(price)-MIN(price)>=3 SELECT state, COUNT(DISTINCT pub_id) FROM publishers GROUP BY state SELECT pub_name, AVG(price) 'avg', COUNT(DISTINCT title_id) 'count' FROM titles t JOIN publishers p ON t.pub_id=p.pub_id GROUP BY pub_name SELECT type, (MIN(price)+MIN(price))/2, AVG(price) FROM titles GROUP BY type HAVING type<> 'UNDECIDED' ORDER BY 2 DESC SELECT type, MIN(pubdate), MAX(pubdate) FROM titles GROUP BY type Задания типа B Составить SQL-запросы по их заданному содержательному описанию, выполнить SQL-запросы на SQL-сервере с использованием клиентской утилиты Query Analyzer, проинтерпретировать результаты выполнения запросов. База данных «Сеть магазинов по продажам сумок» 1. 2. 3. 4. Определить среднюю торговую площадь в каждом городе. Определить максимальную торговую площадь в каждом городе. Определить минимальную торговую площадь в каждом городе. Определить суммарную торговую площадь во всех городах, кроме Челябинска. 33 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Определить количество магазинов в каждом городе. Определить количество поставщиков в каждом городе. Определить для каждой модели минимальную и максимальную цену закупки. Определить для каждой модели минимальную и максимальную цену для покупателя. Определить по каждому коду магазина количество в наличии товара модели 'N12345BLACK'. Определить для каждого кода магазина количество представленных моделей. Определить для каждого кода поставщика количество выполненных заказов с Датой заказа = от 01.01.2007 по 01.06.2007. Определить для каждого кода поставщика количество невыполненных и просроченных заказов с Датой заказа = от 01.01.2007 по сегодняшний день. Определить минимальную и максимальную цену для покупателя по модели 'Q76859RED'. По каждому городу определить максимальный, минимальный и средний рейтинг поставщика. Определить среднюю цену для покупателя по каждому коду магазина. Определить по каждой модели количество проданных. Определить по каждому коду продавца максимальную выручку за товар с Датой продажи = от 01.09.2007 по 01.10.2007. Определить по каждому коду продавца суммарную выручку за товар с Датой продажи = от 01.09.2007 по 01.10.2007. База данных книготорговой компании 19. Определить среднюю цену книги. 20. Определить среднюю цену книг по бизнесу. 21. Определить среднюю цену и стоимость всех книг по бизнесу современной кулинарии 22. Определить число авторов, проживающих в Калифорнии. 23. Определить среднюю цену и сумму цен на книги по бизнесу современной кулинарии отдельно для каждого типа книги. 24. Определить среднюю цену и сумму цен на книги по бизнесу современной кулинарии для каждой комбинации типа книги идентификатора издателя. 34 и и и и 25. Выбрать те типы книг, средняя цена дорогих экземпляров (стоимостью более 10 долларов) которых превышает 20 долларов. В выбираемые данные помимо типа книги включить и среднюю цену дорогих экземпляров. 26. Подсчитать число строк в таблице authors, включающих одинаковые идентификаторы авторов. В выбираемые данные включить идентификатор автора и соответствующее ему число повторяющихся строк. 27. Определить число книг, название которых начинается со строки ‘The’ и заканчивается буквой ‘e’. 28. Определить минимальную, максимальную и среднюю цену для каждого из типов книг. Выводимые данные должны быть упорядочены по убыванию типа книг. 29. Определить минимальную и максимальную цену для каждого из типов книг. В результирующую таблицу не включать те типы книг, для которых разность между максимальной и средней ценой меньше 7 долларов. 30. Вычислить среднюю цену всех книг и медиану цены. Под медианой понимается среднее значение всех различных цен всех книг. 31. Определить, сколько книг опубликовал каждый автор и в каких издательствах. 32. Определить для каждого штата минимальную, максимальную и среднюю цену книг авторов, проживающих в одном штате (кроме штата Калифорния). 33. Найти цену самой дешевой книги (книг), вышедшей в США. В запросе использовать операцию группирования. Варианты лабораторных заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 Задание типа A 1 13 9 5 2 14 10 6 3 15 11 7 4 16 12 8 5 1 13 9 6 2 14 10 7 3 15 11 8 4 16 12 9 5 1 13 10 6 2 14 11 7 3 15 12 8 4 16 35 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Задание типа B 32 11 23 33 12 24 1 13 25 2 14 26 3 15 27 4 16 28 5 17 29 6 18 30 7 19 31 8 20 32 9 21 33 10 22 1 27 28 6 7 8 9 10 11 5 4 3 2 Контрольные вопросы 1. В чем отличие конструкций WHERE и HAVING? 2. Какие агрегатные (агрегирующие, групповые) функции вы знаете? 3. Порядок выполнения и назначение предложений: WHERE, HAVING, ORDER BY, GROUP BY. 4. Особенности использования функции COUNT. 36 Лабораторная работа № 4 ПОСТРОЕНИЕ СТРУКТУРИРОВАННЫХ ЗАПРОСОВ 1) 2) 3) 4) 5) 6) 7) 8) Цели работы: ознакомиться с вариантами соединения таблиц; получить практические навыки написания многотабличных запросов; научиться использовать внешние соединения; получить практические навыки использования объединений запросов; изучить принципы использования подзапросов и их виды; получить практические навыки написания подзапросов в различных частях основного запроса (SELECT, FROM, WHERE, HAVING); изучить основные виды предикатов для работы с множествами значений, возвращаемых подзапросом; изучить основные особенности соотнесенных (коррелируемых) подзапросов. Краткие теоретические сведения В SQL сложные запросы являются комбинацией простых SQLзапросов. Каждый простой запрос в качестве ответа возвращает набор записей (таблицу), а комбинация простых запросов возвращает результат тех или иных операций над ответами на простые запросы. В SQL сложные запросы получаются из других запросов следующими способами: вложением SQL-выражения запроса в SQL-выражение другого запроса (первый из них называют подзапросом, а второй – внешним или основным запросом); применением к SQL-запросам операторов объединения и соединения наборов записей, возвращаемых запросами (эти операторы называют теоретико-множественными или реляционными). Подзапросы Подзапрос – это запрос на выборку данных, вложенный в другой запрос. Подзапрос всегда заключается в круглые скобки и выполняется до содержащего выражения. Внешний запрос, содержащий подзапрос, если только он сам не является подзапросом, не обязательно должен начинаться с оператора SELECT. В свою очередь, подзапрос может 37 содержать другой подзапрос и т. д. При этом сначала выполняется подзапрос, имеющий самый глубокий уровень вложения, затем содержащий его подзапрос и т. д. Часто, но не всегда, внешний запрос обращается к одной таблице, а подзапрос – к другой. На практике именно этот случай наиболее интересен. Простые подзапросы Простые подзапросы характеризуются тем, что они формально никак не связаны с содержащими их внешними запросами. Это обстоятельство позволяет сначала выполнить подзапрос, результат которого затем используется для выполнения внешнего запроса. Кроме простых подзапросов, существуют еще и связанные (коррелированные) подзапросы, которые будут рассмотрены в следующем разделе. Рассматривая простые подзапросы, следует выделить три частных случая: 1) подзапросы, возвращающие единственное значение; 2) подзапросы, возвращающие список значений из одного столбца таблицы; 3) подзапросы, возвращающие набор записей. Тип возвращаемой подзапросом таблицы определяет, как можно ее использовать и какие операторы можно применять в содержащем выражении для взаимодействия с этой таблицей. По завершении выполнения содержащего выражения, таблицы, возвращенные любым подзапросом, выгружаются из памяти. Таким образом, подзапрос действует как временная таблица, областью видимости которой является выражение (т. е. после завершения выполнения выражения сервер высвобождает всю память, отведенную под результаты подзапроса). 1) Подзапросы, возвращающие единственное значение. Допустим, из таблицы Customer требуется выбрать данные обо всех клиентах из Казани. Это можно сделать с помощью следующего запроса: SELECT * FROM Customer WHERE IdCity = (SELECT idCity WHERE CityName = 'Казань') FROM City В данном запросе сначала выполняется подзапрос (SELECT idCity FROM City WHERE CityName = 'Казань'). Он возвращает единственное значение (а не набор записей, поскольку по полю City организовано 38 ограничение уникальности) – уникальный идентификатор города Казань. Если сказать точнее, то данный подзапрос возвращает единственную запись, содержащую единственное поле. Далее выполняется внешний запрос, который выводит все столбцы таблицы Customer и записи, в которых значение столбца IdCity равно значению, полученному с помощью подзапроса. Таким образом, сначала выполняется подзапрос, а затем внешний запрос, использующий результат подзапроса. 2) Подзапросы, возвращающие список значений из одного столбца таблицы. Подзапрос, вообще говоря, может возвращать несколько записей. Чтобы в этом случае в условии внешнего оператора WHERE можно было использовать операторы сравнения, требующие единственного значения, используются кванторы, такие как ALL (все) и SOME (или ANY) (некоторый). Рассмотрим общий случай использования запросов с кванторами ALL и SOME. Пусть имеются две таблицы: T1, содержащая как минимум столбец A, и T2, содержащая, по крайней мере, один столбец B. Тогда запрос с квантором ALL можно сформулировать следующим образом: SELECT A FROM T1 WHERE A оператор_сравнения ALL (SELECT B FROM T2) Здесь оператор сравнения обозначает любой допустимый оператор сравнения. Данный запрос должен вернуть список всех тех значений столбца A, для которых оператор сравнения истинен для всех значений столбца B. Запрос с квантором SOME, очевидно, имеет аналогичную структуру. Он должен вернуть список всех тех значений столбца A, для которых оператор сравнения истинен хотя бы для какого-нибудь одного значения столбца B. Запрос: список всех клиентов, проживающих в городах Казань или Елабуга: SELECT * FROM Customer WHERE IdCity = SOME(SELECT IdCity FROM City WHERE CityName IN ('Казань', 'Елабуга')) Предыдущий запрос может быть также реализован и с использованием оператора IN, который рассматривался в разделе “Фильтрация данных”: SELECT * FROM Customer WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName IN ('Казань', 'Елабуга')) 39 Напомним: он проверяет вхождение элемента во множество, в качестве элемента может выступать имя столбца или скалярное выражение, а в качестве множества – явно заданный список значений или подзапрос. Использование подзапроса в качестве второго операнда IN также как и кванторы позволяет избежать ограничения на единственность значения, возвращаемого подзапросом. С помощью оператора IN можно проверять не только наличие значения в наборе значений, но и его отсутствие. Делается это добавлением оператора отрицания NOT. Вот другой вариант предыдущего запроса: SELECT * FROM Customer WHERE IdCity NOT IN (SELECT IdCity FROM City WHERE CityName IN ('Казань', 'Елабуга')) Этот запрос возвращает всех клиентов, кроме тех которые проживают в городах Казань и Елабуга. Аналогичный запрос с использование квантора ALL: SELECT * FROM Customer WHERE IdCity != ALL(SELECT IdCity FROM City WHERE CityName IN ('Казань', 'Елабуга')) 3) Подзапросы, возвращающие набор записей. Подзапрос можно вставлять не только в операторы WHERE и HAVING, но и в оператор FROM: SELECT t.столбец1, t.столбец2, ... , t.столбецn FROM (SELECT ... ) t WHERE ... Здесь таблице, возвращаемой подзапросом в операторе FROM, присваивается псевдоним t, а внешний запрос выделяет столбцы этой таблицы и, возможно, записи в соответствии с некоторым условием, которое указано в операторе WHERE. Связанные (коррелированные) подзапросы Все приведенные до сих пор запросы не зависели от своих содержащих выражений, т. е. могли выполняться самостоятельно и представлять свои результаты для проверки. Связанный подзапрос (коррелированный), напротив, зависит от содержащего выражения, из которого он ссылается на один или более столбцов. В отличие от 40 несвязанного подзапроса, который выполняется непосредственно перед выполнением содержащего выражения, связанный подзапрос выполняется по разу для каждой строки-кандидата (это строки, которые предположительно могут быть включены в окончательные результаты). Например, следующий запрос использует связанный подзапрос для подсчета количества заказов у каждого клиента. Затем основной запрос выбирает тех клиентов, у которых больше одного заказа: SELECT * FROM Customer WHERE c1 < (SELECT COUNT(*) FROM [Order] r WHERE r.IdCust = c.IdCust) Ссылка на c.idCust в самом конце подзапроса – это то, что делает этот подзапрос связанным. Чтобы подзапрос мог выполняться, основной запрос должен поставлять значения для с.IdCust. В данном случае основной запрос извлекает из таблицы Customer все строки и выполняет по одному подзапросу для всех клиентов, передавая в него соответствующий Id клиента при каждом выполнении. Если подзапрос возвращает значение большее одного, условие фильтрации выполняется и строка добавляется в результирующий набор. Связанные подзапросы часто используются с условиями сравнения (в предыдущем примере <) и вхождения в диапазон, но самый распространенный оператор, применяемый в условиях со связанными подзапросами, – это оператор EXISTS (существует). Оператор EXISTS применяется, если требуется показать, что связь есть, а количество связей при этом не имеет значения. Например, следующий запрос возвращает список всех товаров, которые когда-либо заказывали: SELECT IdProd, [Description] FROM Product p WHERE EXISTS (SELECT * FROM OrdItem oi WHERE oi.IdProd = p.IdProd) При использовании оператора EXISTS подзапрос может не возвращать ни одной или возвращать одну или много строк, а условие просто проверяет, возвращены ли в результате выполнения подзапроса строки (все равно сколько). Если взглянуть на блок SELECT подзапроса, можно увидеть, что он состоит из единственного литерала *. Для условия основного запроса имеет значение только факт наличия возвращенных строк, а что именно было возвращено подзапросом – не важно. Поэтому подзапрос может возвращать все, что вам вздумается, но все же при использовании EXISTS принято задавать SELECT *. 41 Для поиска подзапросов, не возвращающих строки, можно использовать оператор EXISTS совместно с оператором отрицания NOT. В частности, чтобы предыдущий запрос возвращал все товары, которые ни разу не заказывались, его можно модифицировать следующим образом: SELECT IdProd, [Description] FROM Product p WHERE NOT EXISTS (SELECT * FROM OrdItem oi WHERE oi.IdProd = p.IdProd) Операции соединения При проектировании базы данных стремятся создавать таблицы, в каждой из которых содержалась бы информация об одном и только одном типе сущности. Это облегчает модификацию базы данных и поддержку ее целостности. Однако сущности могут быть взаимосвязанными. Клиенты связаны с городами по признаку проживания, заказы осуществляют клиенты, товары входят в состав заказов и т. д. Связь между таблицами устанавливается за счет размещения столбца первичного ключа одной таблицы, которая называется родительской, в другой взаимосвязанной таблице, которая называется дочерней. Столбец (или совокупность столбцов) дочерней таблицы, определенный для связи с родительской таблицей, называется внешним ключом. Так, например, таблица Customer содержит столбец IdCity, который для каждой строки клиента содержит значение первичного ключа того города, в котором проживает данный клиент. Наличие внешних ключей является основой для инициирования поиска по многим таблицам. Одна из наиболее важных особенностей предложения SELECT – это способность использования связей между различными таблицами, а также вывода содержащейся в них информации. Операция, которая приводит к соединению из двух таблиц всех пар строк, для которых выполняется заданное условие, называется соединением таблиц. Соединение таблиц во фразе WHERE по равенству значений столбцов различных таблиц. Соединение таблиц может быть указано во фразе WHERE или во фразе FROM. Сначала рассмотрим первый вариант. Большинство запросов, имеющих несколько таблиц во фразе FROM, содержат фразу WHERE, в которой указаны условия, попарно сравнивающие столбцы из различных таблиц. Такое условие называется условием соединения. В этом случае SQL предполагает сцепление только тех пар строк из разных таблиц, для которых условие соединения принимает истинное значение. Фраза WHERE помимо условия 42 соединения может также содержать другие условия, каждое из которых ссылается на столбцы соединенной таблицы. Эти условия производят отбор строк соединенной таблицы. Если таблицы соединяются по равенству значений пары столбцов (группы столбцов) из различных таблиц, такая операция называется соединением таблиц по равенству. Соединение по равенству позволяет соединить только те пары строк, которые действительно взаимосвязаны друг с другом. Так, например, мы можем соединить таблицы городов и клиентов по условию City.IdCity = Customer.IdCity. В таком варианте мы соединяем таблицы осмысленно, так как каждая строка таблицы Customer соединяется только с одной строкой соответствующего города. На базе таблиц City и Customer мы получаем таблицу со столбцами из обеих таблиц, имеющую строки с понятным смыслом. Можно также сказать, что в таблицу Customer вместо столбца IdCity мы вставляем все характеристики (столбцы) соответствующего города из таблицы City. Соединение таблиц используется, когда необходимо вывести: значения столбцов разных таблиц; значения столбцов одной таблицы, отвечающих условию, заданному в другой таблице. Эти два варианта, а также их комбинация, характерны для любого вида соединения, а не только по равенству. Рассмотрим следующий пример: SELECT FName, LName, CityName FROM Customer, City WHERE Customer.IdCity = City.IdCity Этот запрос возвращает список всех клиентов с указанием названий городов, в которых они проживают. Этот вид запросов характерен тем, что фраза WHERE содержит только условие соединения, а список фразы SELECT содержит имена столбцов из различных таблиц. До тех пор, пока запрос относится к одной таблице, обращение к столбцам по их именам не вызывает проблем: в таблице все имена столбцов должны быть неповторяющимися. Однако как только запрос соединяет несколько таблиц, может возникнуть неоднозначность при ссылках на столбцы с одинаковыми именами из разных таблиц. Для разрешения этой неоднозначности во фразах SELECT и WHERE (как и в некоторых других фразах) имена столбцов необходимо уточнять именами таблиц. Запишем предыдущий запрос с полным уточнением имен: SELECT Customer.FName, Customer.LName, City.CityName FROM Customer, City WHERE Customer.IdCity = City.IdCity 43 В этом запросе мы уточнили имена столбцов во фразах SELECT и WHERE, хотя в предложение SELECT это было не обязательно, так как используются неповторяющиеся имена. Тем не менее, при соединении таблиц для наглядности рекомендуется уточнять имена столбцов. Однако на практике для задания более лаконичных имен часто используют короткие синонимы таблиц, по которым можно сослаться на них в любых других местах запроса. Синоним указывается сразу после имени таблицы в предложении FROM. В частности, предыдущий запрос с использованием синонимов для таблиц можно записать более компактным образом: SELECT k.FName, k.LName, c.CityName FROM Customer k, City WHERE ck.IdCity = c.IdCity Следующий запрос отбирает всех клиентов из Казани с фамилией Иванов: SELECT K.IdCust, k.FName FROM Customer k, City WHERE ck.IdCity = c.IdCity AND k.LName = 'Иванов' AND c.CityName = 'Казань' В этом запросе, помимо условия соединения, используется также отбор строк по условиям, заданным для разных таблиц. Рассмотрим простой пример соединения трех таблиц. Запрос: список всех клиентов, которые когда-либо заказывали товар с кодом 1. SELECT DISTINCT c.IdCust, c.FName, c.LName FROM Customer c, [Order] o, OrdItem oi WHERE c.IdCust = o.IdCust AND o.IdOrd = oi.IdOrd AND oi.IdProd = 1 1. Сформулируем общую процедуру составления многотабличного запроса. 2. Определим множество таблиц, необходимых для ответа на запрос. В это множество должны входить те таблицы, на столбцах которых сформулированы условия, а также те, столбцы которых необходимо вывести. Это так называемые базовые таблицы запроса. 3. В структуре взаимосвязанных таблиц найдем путь, соединяющий базовые таблицы. Это так называемый путь вычисления запроса. В результате вы получите перечень таблиц, необходимых для формулировки запроса. Это так называемые таблицы запроса. 4. Во фразе FROM перечислим необходимые таблицы. 44 5. Во фразе WHERE соединим таблицы запроса и при необходимости зададим условия отбора строк в базовых таблицах запроса. 6. Во фразе SELECT перечислим выводимые столбцы. Соединения с использованием фразы FROM Все рассмотренные выше типы и способы соединения таблиц можно (и рекомендуется, поскольку соединения во фразе WHERE считаются устаревшими) осуществлять и с помощью фразы FROM. В ней, в соответствии со стандартом SQL, можно не только перечислить имена таблиц, участвующих в запросе, но и указать их соединение, используя следующий синтаксис: таблица [INNER | {FULL | LEFT | RIGHT} [OUTER]] JOIN таблица {ON условие} Внутреннее соединение. В операторе JOIN внутреннее соединение указывается ключевым словом INNER (впрочем, его можно опустить, так как соединение двух таблиц является внутренним по умолчанию). Условие соединения указывается после ключевого слова ON. В этом случае внутреннее соединение с помощью фразы FROM JOIN очень похоже на соединение с использованием фразы WHERE. Запишем первый пример с предыдущего раздела с использованием оператора JOIN. Запрос: список всех клиентов с указанием названий городов, в которых они проживают: SELECT FName, LName, CityName FROM Customer k JOIN City c ON k.IdCity = c.IdCity При соединении с использованием фразы FROM дополнительное условие можно для увеличения наглядности запроса помещать во фразу WHERE. В этом случае второй пример с предыдущего раздела примет такой вид: Запрос: список всех клиентов из Казани с фамилией Иванов: SELECT K.IdCust, k.FName FROM Customer k INNER JOINc ON k.IdCity = c.IdCity WHERE k.LName = 'Иванов' AND c.CityName = 'Казань' Внешнее соединение. Все соединения таблиц, рассмотренные до сих пор, являются внутренними. Во всех примерах вместо ключевого слова 45 JOIN можно писать INNER JOIN (внутреннее соединение). Из таблицы, получаемой при внутреннем соединении, отбраковываются все записи, для которых нет соответствующих записей одновременно в обеих соединяемых таблицах. При внешнем соединении такие несоответствующие записи сохраняются. В этом и заключается отличие внешнего соединения от внутреннего. С помощью специальных ключевых слов LEFT OUTER, RIGHT OUTER и FULL OUTER, написанных перед JOIN, можно выполнить соответственно левое, правое и полное соединение. В SQL-выражении запроса таблица, указанная слева от оператора JOIN, называется левой, а указанная справа от него – правой. При левом внешнем соединении несоответствующие записи, имеющиеся в левой таблице, сохраняются в результатной таблице, а имеющиеся в правой – удаляются. Значения столбцов из правой таблицы во всех строках, не имеющих соответствия с левой таблицей, принимают значение NULL. При правом внешнем соединении несоответствующие записи, имеющиеся в правой таблице, сохраняются в результатной таблице, а имеющиеся в левой – удаляются. Значения столбцов из левой таблицы во всех строках, не имеющих соответствия с правой таблицей, принимают значение NULL. Соответственно левое и правое внешние соединения различаются только порядком следования таблиц. При полном внешнем соединении двух таблиц результирующая таблица содержит все строки внутреннего соединения этих таблиц, а также не включенные им строки и первой, и второй таблиц (дополненные значениями NULL для отсутствующих столбцов). В следующем примере возвращается полный список городов с указанием количества клиентов из каждого из них: SELECT c.CityName, a.CountCity FROM City c LEFT OUTER JOIN (SELECT IdCity, COUNT(*) AS CountCityCustomerBY IdCity) a ON c.IdCity = a.IdCity ORDER BY c.CityName Если в данном запросе заменить левое внешнее соединение на внутреннее, то из результата будут потеряны города, из которых нет ни одного клиента (проверьте это, заменив LEFT OUTER JOIN на INNER JOIN, и объясните причину разницы). Обратите внимание, что таблица City соединяется не с таблицей, а с подзапросом, которому задан псевдоним a. 46 Множественные операции Множественные операции выполняются над наборами записей (таблицами), полученными в результате запросов, и, в свою очередь, возвращают таблицу. В стандарте SQL множественные операции имеют следующий синтаксис: запрос {UNION | INTERSECT | EXCEPT} [DISTINCT | ALL] запрос, где запрос является предложением SELECT. Отличаются эти операции тем, какие строки возвращенных запросами таблиц отбираются в новую результирующую таблицу: – все строки таблиц, возвращенных обоими запросами; – только те строки, которые имеются в таблицах обоих запросов; – только те строки таблицы первого запроса, которых нет среди строк таблицы второго запроса. Запросы, содержащие множественные операторы, называются составными. Стандарт SQL определяет следующие правила относительно повторяющихся строк в таблицах: базовые таблицы не могут содержать повторяющихся строк (это принципиальное требование реляционной модели данных); результирующие таблицы запросов могут содержать повторяющиеся строки, если это не запрещено ключевым словом DISTINCT во фразе SELECT; результирующие таблицы множественных операций не могут содержать повторяющихся строк, если это не разрешено ключевым словом ALL. Таким образом, именно ключевые слова ALL и DISTINCT указывают, допускаются ли в результирующей таблице повторяющиеся строки. В запросах при отсутствии явного указания предполагается использование ключевого слова ALL, а во множественных операциях – DISTINCT. Таблицы, используемые в качестве операндов множественной операции, должны быть совместимы. Под этим подразумевается следующее: обе таблицы должны иметь одинаковое количество столбцов; соответствующие пары столбцов должны быть одинаковых или совместимых типов. Объединение наборов записей. Нередко требуется объединить записи двух или более таблиц с похожими структурами в одну таблицу. Иначе 47 говоря, к набору записей, возвращаемому одним запросом, требуется добавить записи, возвращаемые другим запросом. Для этого служит оператор UNION (объединение): Запрос1 UNION Запрос2; При этом в результатной таблице остаются только отличающиеся записи. Чтобы сохранить в ней все записи, после оператора UNION следует написать ключевое слово ALL. К базе данных Sales сложно сформулировать осмысленный запрос с объединением, который бы имел какую-либо практическую ценность. Поэтому в качестве примера рассмотрим объединение результатов выполнения запросов, возвращающих просто константные значения. Запрос: объединение с исключением дублирующих строк: SELECT 1, 'Один' UNION SELECT 1, 'Один' UNION SELECT 2, 'Два' Запрос: объединение с сохранением дубликатов: SELECT 1, 'Один' UNION ALL SELECT 1, 'Один' UNION ALL SELECT 2, 'Два' Пересечение наборов записей. Пересечение двух наборов записей осуществляется с помощью оператора INTERSECT (пересечение), возвращающего таблицу, записи в которой содержатся одновременно в двух наборах: Запрос 1 INTERSECT Запрос2; (SELECT 1, 'Один' UNION SELECT 2, 'Два' UNION SELECT 3, 'Три') (SELECT 1, 'Один' UNION SELECT 2, 'Два' UNION SELECT 4, 'Четыре') Разность наборов записей. Для получения записей, содержащихся в одном наборе и отсутствующих в другом, служит оператор EXCEPT (за исключением): Запрос1 ЕХCЕРТ Запрос2; (SELECT 1, 'Один' UNION SELECT 2, 'Два' UNION SELECT 3, 'Три') EXCEPT (SELECT 1, 'Один' UNION SELECT 2, 'Два' UNION SELECT 4, 'Четыре') 48 Задания к лабораторной работе Задания типа А База данных книготорговой компании Дать содержательную интерпретацию SQL-запросам, выполнить их на SQL-сервере с использованием клиентских утилит Query Analyzer. 1. SELECT title, pub_name FROM titles CROSS JOIN publishers 2. SELECT * FROM titles, publishers 3. SELECT title, pub_name FROM titles, publishers WHERE titles.pub_id=publishers.pub_id 4. SELECT title, pub_name FROM titles JOIN publishers ON titles.pub_id=publishers.pub_id 5. SELECT * FROM titles t, publishers p WHERE t.pub_id=p.pub_id 6. SELECT t.*, pub_name FROM titles t, publishers p WHERE t.pub_id=p.pub_id 7. SELECT a.city, a.state FROM authors a, publishers p WHERE a.city=p.city AND a.state=p.state 8. SELECT au_lname, au_fname FROM authors a JOIN titleauthor ta ON a.au_id=ta.au_id JOIN titles t ON ta.title_id=t.title_id WHERE au_lname LIKE 'R%' AND state IN ('CA', 'TX', 'NY', 'OR', 'UT') AND (title LIKE '_h_ %' OR title LIKE '% _h_ %' OR title LIKE '% _h_') 9. SELECT title, type FROM authors a, titles t, titleauthor ta, publishers p WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id AND t.pub_id=p.pub_id AND p.city=a.city 10. SELECT au_lname, au_fname, title FROM authors a, titles t, titleauthor ta, publishers p WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id AND t.pub_id=p.pub_id AND ((p.country= 'USA' AND t.type='popular_comp') OR (p.country='France' AND t.type='psychology')) 11. SELECT au_lname, au_fname, city FROM authors a, titles t, titleauthor ta WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id AND (city LIKE '[CPR]%' OR city LIKE '%San%') AND (title LIKE '% the %' OR title LIKE 'The %' OR title LIKE '% a %' OR title LIKE 'A %') 12. SELECT DISTINCT au_lname, au_fname FROM authors a JOIN titleauthor ta ON a.au_id=ta.au_id JOIN titles t ON ta.title_id=t.title_id JOIN publishers p ON p.pub_id=t.pub_id WHERE p.state= 'CA' ORDER BY au_lname, au_fname 13. SELECT pub_name FROM publishers p JOIN titles t ON p.pub_id=t.pub_id WHERE $15>price AND type= 'psychology' ORDER BY pub_name 49 14. SELECT pub_name, AVG(price) FROM titles t, publishers p WHERE t.pub_id=p.pub_id GROUP BY pub_name 15. SELECT pub_name, AVG(price) FROM titles t JOIN publishers p ON t.pub_id=p.pub_id GROUP BY pub_name 16. SELECT au_lname, au_fname, title FROM authors a, titles t, titleauthor ta WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id AND type= 'popular_comp' 17. SELECT au_lname, au_fname, title FROM authors a JOIN titleauthor ta ON a.au_id=ta.au_id JOIN titles t ON ta.title_id=t.title_id WHERE type= 'psychology' 18. SELECT au_lname, au_fname, pub_name, COUNT(*) FROM authors a, titles t, titleauthor ta, publishers p WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id AND t.pub_id=p.pub_id GROUP BY au_lname, au_fname, pub_name 19. SELECT MIN(price) FROM titles t, publishers p WHERE t.pub_id=p.pub_id GROUP BY country HAVING country='USA' 20. SELECT pub_name, COUNT(*) FROM titles t, publishers p WHERE t.pub_id=p.pub_id AND (type= 'mod_cook' OR type='trad_cook') GROUP BY pub_name 21. SELECT pub_name, COUNT(*) FROM publishers p, titles t WHERE p.pub_id=t.pub_id AND price>$15 GROUP BY pub_name ORDER BY pub_name DESC 22. SELECT title, COUNT(DISTINCT a.au_id) FROM titles t JOIN titleauthor ta ON t.title_id=ta.title_id JOIN authors a ON ta.au_id=a.au_id JOIN publishers p ON p.pub_id=t.pub_id GROUP BY title 23. SELECT state, COUNT(DISTINCT p.pub_id) FROM publishers p JOIN titles t ON p.pub_id=t.pub_id GROUP BY state 24. SELECT title FROM titles WHERE pub_id= (SELECT pub_id FROM publishers WHERE pub_name= 'Binnet & Hardley') 25. SELECT pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type= 'business') 26. SELECT pub_name FROM publishers p WHERE EXISTS (SELECT * FROM titles t WHERE p.pub_id=t.pub_id AND type='popular_comp') 27. SELECT pub_name FROM publishers p WHERE NOT EXISTS (SELECT * FROM titles t WHERE p.pub_id=t.pub_id AND type='mod_cook') 28. SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type='psychology') 29. SELECT type, price FROM titles WHERE price < (SELECT AVG(price) FROM titles) 50 30. SELECT type, AVG(price) FROM titles GROUP BY type HAVING AVG(price) < (SELECT AVG(price) FROM titles) 31. SELECT DISTINCT a.city, a.state FROM authors a WHERE NOT EXISTS (SELECT * FROM publishers p WHERE a.city=p.city AND a.state=p.state) 32. SELECT DISTINCT p.city, p.state FROM publishers p WHERE NOT EXISTS (SELECT * FROM authors a WHERE p.city=a.city AND p.state=a.state) 33. SELECT MIN(price) FROM titles t WHERE t.pub_id IN (SELECT pub_id FROM publishers WHERE country='USA') 34. SELECT title, type, price FROM titles WHERE price>ALL (SELECT price FROM titles WHERE type= 'psychology') 35. SELECT COUNT(DISTINCT city) FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type= 'psychology') 36. SELECT pub_name FROM publishers p WHERE 15>SOME (SELECT price FROM titles t WHERE p.pub_id=t.pub_id AND type= 'trad_cook') 37. SELECT pub_name, state FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles) 38. SELECT title FROM titles WHERE pub_id NOT IN (SELECT pub_id FROM publishers) 39. SELECT t.title FROM titles t WHERE t.price>=(SELECT AVG(tt.price) FROM titles tt GROUP BY tt.pub_id HAVING t.pub_id=tt.pub_id) 40. SELECT au_lname, au_fname, price FROM authors a, titles t, titleauthor ta, publishers p WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id AND t.pub_id=p.pub_id AND country='USA' AND price= (SELECT MIN(price) FROM titles tt, publishers pp WHERE tt.pub_id=pp.pub_id GROUP BY country HAVING country='USA') 41. SELECT DISTINCT au_lname, au_fname FROM authors a, titles t, titleauthor ta WHERE a.au_id=ta.au_id AND ta.title_id IN (SELECT title_id FROM titles WHERE ytd_sales= (SELECT MAX(ytd_sales) FROM titles)) 42. SELECT DISTINCT a.city, a.state FROM authors a WHERE NOT EXISTS (SELECT * FROM publishers p WHERE a.city=p.city AND a.state=p.state) UNION SELECT DISTINCT p.city, p.state FROM publishers p WHERE NOT EXISTS (SELECT * FROM authors a WHERE p.city=a.city AND p.state=a.state) 43. SELECT title, price FROM titles t JOIN publishers p ON t.pub_id=p.pub_id WHERE p.country= 'USA' AND t.price= (SELECT MAX(price) FROM titles tt JOIN publishers pp ON tt.pub_id=pp.pub_id WHERE country= 'USA') 51 44. SELECT pub_name, COUNT(*) FROM titles t, publishers p WHERE t.pub_id=p.pub_id GROUP BY pub_name HAVING COUNT(*)>=ALL (SELECT COUNT(*) FROM titles tt, publishers pp WHERE tt.pub_id=pp.pub_id GROUP BY pub_name) 45. SELECT pub_name, city, state, country FROM publishers p WHERE EXISTS (SELECT * FROM titles t WHERE t.pub_id=p.pub_id) AND 20>ALL (SELECT price FROM titles t WHERE t.pub_id=p.pub_id AND price IS NOT NULL) 46. SELECT state, SUM(price) FROM titles t, publishers p WHERE t.pub_id=p.pub_id GROUP BY state HAVING state NOT IN ('TN', 'MA', 'TX') AND SUM(price)> (SELECT SUM(price) FROM titles tt, publishers pp WHERE tt.pub_id=pp.pub_id AND pp.city= 'Boston') 47. SELECT pub_name, MIN(price) FROM titles t, publishers p WHERE t.pub_id=p.pub_id GROUP BY pub_name HAVING MIN(price)>=ALL (SELECT MIN(price) FROM titles tt JOIN publishers pp ON tt.pub_id=pp.pub_id GROUP BY pub_name) 48. SELECT * FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type= 'psychology' AND pub_id IN (SELECT pub_id FROM publishers WHERE country= 'USA' AND state<> 'CA')) 49. SELECT au_lname, au_fname FROM authors a WHERE a.au_id IN (SELECT au_id FROM titleauthor ta WHERE ta.title_id IN (SELECT title_id FROM titles t WHERE 'CA'=SOME (SELECT state FROM publishers p WHERE p.pub_id=t.pub_id))) ORDER BY au_lname, au_fname 50. SELECT state, COUNT(*) FROM publishers p WHERE EXISTS (SELECT * FROM titles t WHERE p.pub_id=t.pub_id) AND $22>ALL (SELECT price FROM titles t WHERE p.pub_id=t.pub_id AND price IS NOT NULL) GROUP BY state ORDER BY state ASC 51. SELECT state FROM publishers p1 GROUP BY state HAVING COUNT(DISTINCT pub_name)= (SELECT COUNT(*) FROM publishers p2 WHERE EXISTS (SELECT * FROM titles t WHERE p2.pub_id=t.pub_id) AND $22.5>ALL (SELECT price FROM titles t WHERE p2.pub_id=t.pub_id AND price IS NOT NULL) GROUP BY state HAVING p1.state=p2.state) 52. SELECT p1.pub_id FROM titles t1, publishers p1 WHERE t1.pub_id=p1.pub_id GROUP BY p1.pub_id HAVING COUNT(DISTINCT title)= (SELECT COUNT(*) FROM titles t2 WHERE t2.pub_id=p1.pub_id AND EXISTS (SELECT * FROM titleauthor ta3, authors a3 WHERE ta3.au_id=a3.au_id AND 52 53. 54. 55. 56. 57. ta3.title_id=t2.title_id AND a3.state IN (SELECT state FROM publishers p4 WHERE 'business'=SOME (SELECT type FROM titles t5 WHERE p4.pub_id=t5.pub_id)))) SELECT city, state FROM authors UNION SELECT city, state FROM publishers ORDER BY state, city SELECT city FROM authors UNION SELECT city FROM publishers SELECT state FROM authors UNION SELECT state FROM publishers SELECT city, state FROM authors WHERE state IS NOT NULLUNION SELECT city, state FROM publishers WHERE state IS NOT NULLORDER BY city DESC, state ASC SELECT state, MIN(price), MAX(price), AVG(price) FROM authors a, titles t, titleauthor ta WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id GROUP BY state HAVING state<> 'CA' Задания типа B Составить SQL-запросы по их заданному содержательному описанию, выполнить SQL-запросы на SQL-сервере с использованием клиентской утилиты Query Analyzer, проинтерпретировать результаты выполнения запросов. База данных «Сеть магазинов по продажам сумок» Определить, в каком городе максимальная торговая площадь. Определить, в каком городе максимальное количество магазинов. Определить, у какого поставщика максимальный рейтинг. Определить, у какого поставщика минимальный рейтинг. Определить всю информацию о поставщиках, не исполнивших заказ и просрочивших поставку. 6. Определить ФИО продавца с максимальными продажами за прошедший месяц. 7. Выбрать информацию о продавцах и определить для каждого суммарную выручку за товар за прошедший месяц. Отсортировать по убыванию выручки. 8. Определить суммарную выручку от реализации товара у каждого магазина за прошедший месяц. 9. Определить по каждому поставщику суммарную выручку от реализации товара за прошедший месяц. 10. Определить количество проданных сумок каждой модели, поставленных начиная с 1 числа прошедшего месяца. В результирующую таблицу включить номер модели, описание модели, 1. 2. 3. 4. 5. 53 11. 12. 13. 14. 15. 16. 17. 18. количество проданных, количество закупленных, отсортировать по убыванию количества проданных. Определить информацию о товаре, которая должна включать в себя код товара, описание модели, название поставщика, адрес поставщика, дату поставки, количество поставленного товара, количество в наличии, цену для покупателя, название магазина, адрес магазина. Определить магазины, в ассортименте которых нет в наличии моделей, в описании которых встречаются слова «красный» и «замша». Определить товары, имеющиеся в наличии, в описании которых встречаются слова «пряжка» или «фурнитура». Выбранная информация должна включать: код товара, модель, описание модели, номер магазина, адрес магазина, количество оставшегося товара. Определить для проданных товаров разницу между датой продажи и датой поставки в днях. Отсортировать по возрастанию этой величины. Выбранная информация должна включать: код товара, описание модели, разницу между датой продажи и датой поставки. Определить товары, которые не продаются в течение срока, большего, чем один месяц (т. е. количество закупленных = количеству оставшихся в наличии, если поставка была за 1 месяц до сегодняшней даты). Выбранная информация должна включать: код товара, модель, описание модели, название поставщика, адрес поставщика, номер магазина, адрес магазина. Определить товар, который был распродан в течение 3 дней с момента поставки. В выбранной информации указать код товара, модель, описание модели, код поставщика, код магазина, количество поставленного товара, дату поставки. Определить наличие товара в магазине № 123 (код магазина = 1). Выбранная информация должна включать: код товара, модель, описание модели, название поставщика, цену для покупателя, количество в наличии. Отсортировать по названию модели. Выбрать поставщиков, которые находятся в том же городе, что и магазин № 123 (код магазина = 1). Выбранная информация должна включать: название поставщиков, адрес. База данных книготорговой компании 19. Выбрать названия книг и имена выпустивших их издателей. 20. Выбрать названия книг и имена выпустивших их издателей (в разделе FROM запроса использовать операцию соединения JOIN). 54 21. Произвести проекцию на столбцы title и pub_name декартова произведения таблиц titles и publishers. 22. Определить среднюю цену выпускаемых каждым издателем книг. В выбираемые данные включить имя издателя и среднюю цену книги. 23. Определить среднюю цену выпускаемых каждым издателем книг. В выбираемые данные включить имя издателя и среднюю цену книги (в разделе FROM запроса использовать операцию соединения JOIN). 24. Определить, какую книгу по психологии написал каждый из авторов. В выбираемые данные включить имя и фамилию автора, а также название книги. 25. Определить, какую книгу по психологии написал каждый автор. В выбираемые данные включить имя и фамилию автора, а также название книги (в разделе FROM запроса использовать операцию соединению JOIN). 26. Выбрать все столбцы результата эквисоединения таблиц titles publishers по идентификатору издателя. 27. Выбрать все столбцы таблицы titles и столбец pub_name таблицы publishers результата эквисоединения данных таблиц по идентификатору издателя. 28. Выбрать все книги издательства Algodata Infosysytems. В запросе использовать подзапрос для определения нужного идентификатора издателя. В условии поиска использовать предикат ‘=‘. В выбираемые данные включить название книги. 29. Выбрать всех издателей литературы по бизнесу. В запросе использовать подзапрос для выборки нужных идентификаторов издателей. В условии поиска использовать предикат IN. В выбираемые данные включить имя издателя. 30. Выбрать всех издателей литературы по бизнесу. В запросе использовать подзапрос, формирующий промежуточную таблицу, в которую включаются те строки из таблицы titles, которые могут “экви-соединиться” по идентификатору издателя со строками из таблицы publishers и которые представляют тип книг по бизнесу. В условии поиска основного запроса использовать предикат EXISTS. В выбираемые данные включить имя издателя. 31. Выбрать издателей, не выпускающих книг по бизнесу. Дополнительные условия формирования запроса: в запросе использовать подзапрос, формирующий промежуточную таблицу, в которую включаются те строки из таблицы titles, которые могут “экви-соединиться” по идентификатору издателя со строками из таблицы publishers и которые представляют тип книг по бизнесу. 55 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. В условии поиска основного запроса использовать предикат EXISTS. В выбираемые данные включить имя издателя. Выбрать издателей, не выпускающих книг по бизнесу. Дополнительные условия формирования запроса: в запросе использовать подзапрос для выборки нужных идентификаторов издателей. В условии поиска использовать предикат IN. В выбираемые данные включить имя издателя. Выбрать тип и цену для всех книг, цена которых не превышает средней. В запросе использовать подзапрос, определяющий среднюю цену книг. Выбрать тип и среднюю цену книг данного типа, причем эта средняя цена должна быть меньше средней цены всех книг. В запросе использовать подзапрос, определяющий среднюю цену всех книг. Определить города и штаты проживания каждого из авторов и издателей в виде одной результирующей таблицы. Определить все типы книг. Типы книг в результирующей таблице не должны повторяться. Вывести типы книг в порядке возрастания. Определить все города, в которых проживают авторы. Названия городов в результирующей таблице не должны повторяться. Вывести названия городов в порядке убывания. Определить все штаты, в которых проживают авторы. Названия штатов в результирующей таблице не должны повторяться. Вывести названия штатов в порядке возрастания. Определить страны, в которых расположены издательства книг. Названия стран в результирующей таблице не должны повторяться. Вывести названия стран в порядке убывания. Определить все города, в которых проживают авторы и находятся издательства. Названия городов в результирующей таблице не должны повторяться. Вывести названия городов в порядке возрастания. Определить все штаты, в которых проживают авторы и находятся издательства. Названия штатов в результирующей таблице не должны повторяться. Вывести названия штатов в порядке убывания. Определить города и штаты совместного проживания авторов и издателей. (В запросе неявно реализуется операция пересечения). Определить города и штаты, в которых проживают авторы, но нет издательств. (В запросе неявно реализуется операция разности). Определить города и штаты, в которых есть издательства, но не проживают авторы. (В запросе неявно реализуется операция разности). 56 45. Найти авторов самых дорогих книг, вышедших в США. В запросе использовать подзапрос и операцию группирования. 46. Найти авторов, у которых вышли самые нераспродаваемые книги. 47. Найти цену самой дорогой книги (книг), вышедшей в США. В запросе использовать подзапрос. 48. Определить число книг по компьютерам, выпущенных каждым издательством. 49. Определить авторов опубликованных книг по традиционной кулинарии (в США) или по компьютерам (в Германии). 50. Определить авторов из городов, начинающихся с букв ‘A’, ‘B’ или ‘C’, или авторов, имеющих в своем составе слово ‘Salt’, и написавших книги, в названии которых есть определенный или неопределенный артикль английского языка. 51. Определить города и штаты проживания авторов и издателей, за исключением городов и штатов их совместного проживания. (В запросе неявно реализуется операция симметрической разности). 52. Определить названия и цены самых дешевых книг, вышедших в США. (Самые дешевые книги имеют минимальную цену). 53. Определить издательство, в котором опубликовано меньше всего книг. 54. Найти книги, цена которых меньше цены каждой из книг по традиционной кулинарии. 55. Определить местонахождение издательств, цена каждой книги которых меньше 22 долларов. В запросе использовать подзапросы и предикат с квантором. 56. Определить штаты (кроме штатов Индиана, Канзас, Юта), в которых сумма цен выпущенных в них книг больше суммы цен книг, выпущенных в городе Вашингтон. 57. Найти издательство, выпустившее свою самую дорогую книгу с наиболее низкой ценой среди всех остальных издательств. В запросе использовать подзапрос, определяющий максимальные цены книг, выпущенные каждым издательством. 58. Определить полную информацию об издателях книг по компьютерам, авторы которых живут в США (за исключением штата Юта). В запросе использовать подзапросы. 59. Определить книги, стоимость которых составляет не больше средней стоимости книг по издательству, в котором они издавались. 60. Определить для каждого штата число находящихся в нем издательств. 57 61. Определить число городов, в которых выпускается литература по компьютерам. В запросе использовать подзапрос. 62. Определить авторов, хотя бы одна книга которых была опубликована в штате Массачусетс. В запросе использовать подзапросы и предикат с квантором. 63. Найти издательства, среди изданных книг которых найдется хоть одна книга по компьютерам стоимостью более двух долларов. В запросе использовать подзапрос и предикат с квантором. 64. Определить штаты, во всех издательствах которых все изданные книги имеют цену более 10 долларов. В запросе использовать подзапросы и предикат с квантором. 65. Определить издательства, для каждой книги которых выполняется условие: “Если книга выпущена в данном издательстве, то хотя бы один из авторов книги проживает в штате, в котором находится издательство, некоторые выпущенные книги которого посвящены компьютерам”. 66. Выбрать все столбцы декартова произведения таблиц titles и publishers. 67. Найти книги, число продаж которых не определено. 68. Определить минимальную и максимальную цену книг, выпущенных издательствами. 69. Определить авторов, хотя бы одна книга которых была опубликована в штате Массачусетс. В запросе не использовать предикаты с квантором. 70. Найти издательства, среди изданных книг которых найдется хоть одна книга по традиционной кулинарии стоимостью от 12 до 16 долларов. В запросе не использовать предикаты с квантором. 71. Определить для каждого издательства число изданных им дешевых книг (ценой менее 13 долларов). 72. Определить для штатов число издательств, в которых выпускаются только книги ценой более 7 долларов. В запросе использовать подзапросы и предикат с квантором. 73. Определить, сколько авторов имеет каждая изданная книга. 74. Определить штаты и число находящихся в них издательств, выпустивших книги. 75. Определить издательства, не выпустившие книг. 76. Определить не опубликованные в издательствах книги. 77. Определить авторов, работающих по контракту и имеющих телефон с кодом города 415 (первые три цифры номера телефона). 58 78. Определить номера телефонов авторов, проживающих на Седьмой Авеню (Seventh Av.) 79. Определить книги, выпущенные в период с 1 июля 1991 г. по 30 октября 1991 г. (По умолчанию сервер работает с датами в формате xx/yy/zz как с последовательностями месяц/день/год). 80. Вычислить для каждого типа книг среднее арифметическое минимальной и максимальной цены. Результат упорядочить по убыванию значений. 81. Определить временные интервалы, в рамках которых опубликованы книги разных типов. Варианты лабораторных заданий Номер варианта 1 2 3 4 5 6 7 8 9 10 11 12 01 02 03 04 05 06 08 09 10 11 07 12 Задание типа A 13 25 32 49 14 26 38 50 15 27 39 51 16 28 37 46 17 29 41 57 18 30 42 35 19 31 52 53 20 34 44 55 21 35 40 45 22 33 47 54 24 36 43 50 23 48 54 39 29 30 32 34 36 38 40 42 27 38 39 30 09 08 07 17 15 16 03 02 01 06 05 04 25 28 20 27 18 22 11 10 21 14 13 12 Задание типа B 29 31 42 53 30 41 48 49 26 40 45 47 54 56 70 72 24 38 73 74 37 43 51 62 33 78 26 45 32 64 71 23 50 57 58 65 19 23 36 44 35 39 55 69 35 46 63 79 66 52 61 75 64 76 56 42 68 59 81 56 77 60 81 80 58 79 68 78 80 67 24 20 Контрольные вопросы 1. С помощью каких ключевых слов можно соединить столбцы нескольких таблиц? 2. Как можно соединить столбцы нескольких таблиц без использования специальных ключевых слов? 3. С помощью каких ключевых слов можно объединить строки нескольких таблиц? 4. С помощью каких ключевых слов задается декартово произведение таблиц? 59 Лабораторная работа № 5 ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ И УДАЛЕНИЕ ДАННЫХ ИЗ ТАБЛИЦ Цели работы: 1) Изучить команды модификации данных языка SQL; 2) Получить практические навыки написания модификации данных в БД: INSERT – добавление данных в таблицу. UPDATE – изменение данных в таблице. DELETE – удаление данных из таблицы. запросов по Краткие теоретические сведения Запросы, рассмотренные ранее, были направлены на то, чтобы получить данные, содержащиеся в существующих таблицах базы данных. Главным ключевым словом таких запросов на выборку данных является SELECT. Запросы на выборку данных всегда возвращают виртуальную таблицу, которая отсутствует в базе данных и создается временно лишь для того, чтобы представить выбранные данные пользователю. При создании и дальнейшем сопровождении базы данных обычно возникает задача добавления новых и удаления ненужных записей, а также изменения содержимого ячеек таблицы. В SQL для этого предусмотрены операторы INSERT (вставить), DELETE (удалить) и UPDATE (изменить). Запросы, начинающиеся с этих ключевых слов, не возвращают данные в виде виртуальной таблицы, а изменяют содержимое уже существующих таблиц базы данных. Запросы на модификацию (добавление, удаление и изменение) данных могут содержать вложенные запросы на выборку данных из той же самой таблицы или из других таблиц, однако сами не могут быть вложены в другие запросы. Таким образом, операторы INSERT, DELETE и UPDATE в SQL-выражении могут находиться только в самом начале. Добавление новых записей Для вставки записей в таблицу используется оператор INSERT, который имеет несколько форм. INTO (имяТаблицы) VALUES (списокЗначений) 60 вставляет запись в указанную таблицу и заполняет эту запись значениями из списка, указанного за ключевым словом VALUES. При этом первое в списке значение вводится в первый столбец таблицы, второе значение – во второй столбец и т. д. Порядок столбцов задается при создании таблицы. Данная форма оператора INSERT не очень надежна, поскольку нетрудно ошибиться в порядке вводимых значений. Более надежной и гибкой является следующая форма: INSERT INTO (списокЗначений), имяТаблицы (списокСтолбцов) VALUES которая вставляет запись в указанную таблицу и вводит в заданные столбцы значения из указанного списка. При этом в первый столбец из списокСтолбцов вводится первое значение из списокЗначений, во второй столбец – второе значение и т. д. Порядок имен столбцов в списке может отличаться от их порядка, заданного при создании таблицы. Столбцы, которые не указаны в списке, заполняются значением NULL. Рекомендуется использовать именно данную форму оператора INSERT. Следующий запрос добавляет новую запись в справочник городов: INSERT INTO City(CityName) VALUES ('Калуга') Обратите внимание, что столбец IdCity не задается, поскольку он является счетчиком и заполняется СУБД автоматически. INSERT INTO имяТаблицы (списокСтолбцов) SELECT ... вставляет в указанную таблицу записи, возвращаемые запросом на выборку. На практике нередко требуется загрузить в одну таблицу данные из другой таблицы. Например, следующий запрос вставляет в таблицу City сразу два города, возвращаемых запросом с объединением. INSERT INTO City(CityName) SELECT 'Уфа' UNION SELECT 'Волгоград' Удаление записей Для удаления записей из таблицы применяется оператор DELETE: DELETE FROM имяТаблицы WHERE условие; 61 Данный оператор удаляет из указанной таблицы записи (а не отдельные значения столбцов), которые удовлетворяют указанному условию. Условие – это логическое выражение, различные конструкции которого были рассмотрены в предыдущих лабораторных занятиях. Следующий запрос удаляет записи из таблицы Customer, в которой значение столбца LName равно 'Иванов': DELETE FROM Customer WHERE LName = 'Иванов' Если таблица содержит сведения о нескольких клиентах с фамилией Иванов, то все они будут удалены. В операторе WHERE может находиться подзапрос на выборку данных (оператор SELECT). Подзапросы в операторе DELETE работают точно так же, как и в операторе SELECT. Следующий запрос удаляет всех клиентов из города Москва, при этом уникальный идентификатор города возвращается с помощью подзапроса: DELETE FROM Customer WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName = 'Москва') Transact-SQL расширяет стандартный SQL, позволяя использовать в инструкции DELETE еще одно предложение FROM. Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк. Оно позволяет задавать данные из второго FROM и удалять соответствующие строки из таблицы в первом предложении FROM. В частности предыдущий запрос может быть переписан следующим образом: DELETE FROM Customer FROM Customer k INNER JOINc ON k.IdCity = c.IdCity AND c.CityName = 'Москва' Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае семантических (но не синтаксических) ошибок при формулировке SQLвыражения. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рассмотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку: 62 SELECT * FROM Customer k INNER JOINc ON k.IdCity = c.IdCity AND c.CityName = 'Москва' Для удаления всех записей из таблицы достаточно использовать оператор DELETE без ключевого слова WHERE. При этом сама таблица со всеми определенными в ней столбцами сохраняется и готова для вставки новых записей. Например, следующий запрос удаляет записи обо всех товарах: FROM Product Изменение данных Для изменения значений столбцов таблицы применяется оператор UPDATE (изменить, обновить). Чтобы изменить значения в одном столбце таблицы в тех записях, которые удовлетворяют некоторому условию, следует выполнить такой запрос: UPDATE имяТаблицы SET имяСтолбца = значение WHERE условие; За ключевым словом SET (установить) следует выражение равенства, в левой части которого указывается имя столбца, а в правой – выражение, значение которого следует сделать значением данного столбца. Эти установки будут выполнены в тех записях, которые удовлетворяют условию в операторе WHERE. Чтобы одним оператором UPDATE установить новые значения сразу для нескольких столбцов, вслед за ключевым словом SET записываются соответствующие выражения равенства, разделенные запятыми. UPDATE имяТаблицы SET имяСтолбца1 = значение1, имяСтолбца2 = значение2, ... , имяСтолбцаN = значениеN WHERE условие; Например, следующий запрос изменяет фамилию и имя клиента с кодом 5: UPDATE Customer SET FName='Иван', LName='Иванов' WHERE IdCust = 5 Использование оператора WHERE в инструкции UPDATE не обязательно. Если он отсутствует, то указанные в SET изменения будут произведены для всех записей таблицы. 63 Так же, как и в инструкции DELETE, условие в операторе WHERE инструкции UPDATE может содержать подзапросы, в том числе и связанные. SQL расширяет стандартный SQL, позволяя использовать в инструкции UPDATE предложение FROM (по аналогии с DELETE). Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания обновляемых строк. Если обновляемый объект тот же самый, что и объект в предложении FROM, и в предложении FROM имеется только одна ссылка на этот объект, псевдоним объекта указывать необязательно. Если обновляемый объект встречается в предложении FROM несколько раз, одна и только одна ссылка на этот объект не должна указывать псевдоним таблицы. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта. Предположим, что требуется сделать 5 % скидку по тем заказам клиентов, суммарная стоимость которых превышает 1000. Для этого следует изменить значения столбца Price, просто умножить их на 0,95. Однако эти изменения должны быть выполнены, только если суммарная стоимость заказа превышает 1000. Таким образом, в качестве критерия обновления записей в таблице OrdItem может быть задан запрос, возвращающий список всех заказов с суммарной стоимостью более 1000: UPDATE OrdItem SET Price = Price * 0.95 FROM OrdItem o INNER JOIN (SELECT IdOrd FROM OrdItem GROUP BY IdOrd HAVING SUM(Qty*Price) > 1000) a ON o.IdOrd = a.IdOrd Операция изменения записей, как и их удаление, связана с риском необратимых потерь данных в случае семантических ошибок при формулировке SQL-выражения. Например, стоит только забыть написать оператор WHERE, и будут обновлены значения во всех записях таблицы. Чтобы избежать подобных неприятностей, перед обновлением записей рекомендуется выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут изменены. Например, перед выполнением приведенного ранее запроса на обновление данных не помешает выполнить соответствующий запрос на выборку данных: SELECT * FROM OrdItem o INNER JOIN (SELECT IdOrd FROM OrdItem GROUP BY IdOrd HAVING SUM(Qty*Price) > 1000) a ON o.IdOrd = a.IdOrd 64 Задание на лабораторную работу 1. Вставка строк в таблицу Вставьте следующие строки в таблицы: FACULTY FacPK 1 2 3 Name informatics economy linguistics DEPARTMENT DepPK 1 2 3 4 TEAC HER SGROUP Tch PK 1 Dep FK 1 2 1 3 2 4 2 GrpPK 1 2 3 4 5 SUBJECT SbjPK 1 2 3 4 5 FacFK 1 1 1 2 DeanFK NULL NULL NULL Name SE CAD DBMS Accounts Nam Post e Andr ассистент ew John профессо р Bill преподава тель Alber ассистент t DepFK 1 1 3 3 3 Course 1 1 2 3 4 Tel 2281 319 2281 550 NUL L NUL L Num 101 102 205 305 405 Name pascal C OS inernet dbms 65 Building 5 3 4 HeadFK NULL NULL NULL NULL Hiredat e 01.02.2 001 01.07.2 001 17.11.2 002 11.11.2 001 Quantity 33 35 20 25 25 Fund 57398.00 NULL NULL Building 5 5 4 3 Fund 14378.00 15000.00 22000.00 NULL Sala Commis Chief ry sion FK 250 80 NUL L 400 150 1 240 80 1 260 100 4 Curator 4 4 1 NULL 2 Rating 20 22 15 40 37 ROOM RomPK 1 2 3 4 LECTUR E TchF K 1 1 2 2 4 4 Num 101 316 201 202 Seates 20 150 150 30 GrpF K 1 2 3 4 4 4 Floor 1 3 2 2 SbjF K 1 2 3 4 5 5 Building 5 5 2 5 RomF K 1 1 1 2 2 3 Type лекция лабораторная лекция практика практика семинар Da y пон пон втр срд чет пят Wee k 1 1 1 1 2 2 Lesso n 1 1 3 3 4 1 1) Вставьте в таблицу FACULTY информацию о вашем факультете. В связи с тем что к этому времени сведения о преподавателях еще не введены, в качестве внешнего ключа, ссылающегося на декана факультета, укажите NULL. 2) Вставьте в таблицу DEPARTMENT информацию о вашей кафедре и обо всех кафедрах, на которых работают обучающие вас преподаватели. В связи с тем что к этому времени сведения о преподавателях еще не введены, в качестве внешних ключей, ссылающихся на заведующих кафедрами, укажите NULL. 3) Вставьте в таблицу TEACHER информацию о тех преподавателях, которые вас обучают, включая декана факультета и заведующих всеми кафедрами. Подчиненность преподавателей устанавливается следующим образом: деканы факультетов никому не подчиняются; заведующие кафедрами подчиняются деканам факультетов (если заведующий кафедрой является деканом, то он никому не подчиняется); преподаватели, читающие лекции, подчиняются заведующим кафедрами; преподаватели, проводящие лабораторные работы по дисциплине, подчиняются преподавателям, читающим лекции по этой дисциплине. 4) Обновите таблицу FACULTY, заменяя NULL в столбце DeanFK на внешние ключи соответствующих деканов. 66 5) Обновите таблицу DEPARTMENT, заменяя NULL в столбце HeadFK на внешние ключи соответствующих заведующих кафедр. 6) Вставьте в таблицу SGROUP информацию о вашей группе. 7) Вставьте в таблицу SUBJECT все изучаемые вами в текущий момент дисциплины. 8) Вставьте в таблицу ROOM информацию о тех аудиториях, где проводятся у вас занятия. 9) Вставьте в таблицу LECTURE расписание всех ваших занятий. 2. Обновление строк в таблицах Сделайте следующие обновления в таблицах: 1. В таблице FACULTY для факультета economy установите декана “Bob” и фонд = 3467.00 2. В таблице DEPARTMENT для кафедры с DepNo = 3 измените заведующего на «Frank» и корпус на ‘3’. 3. В таблице TEACHER для всех преподавателей на должности «assistant» установите значение столбца Commission равным 25 % от значения столбца Salary. 4. В таблице SGROUP установите значение rating = 0 для всех групп первого курса. 5. В таблице SUBJECT измените название предмета с “internet” на “html”. Контрольные вопросы 1. Необходимо ли, чтобы порядок перечисления столбцов в предложении INSERT соответствовал порядку их определения при создании таблицы? 2. Какие значения присваиваются столбцу, если он не присутствует в списке столбцов предложения INSERT? 3. Что произойдет, если столбец отсутствует в списке столбцов предложения INSERT, и этот столбец имеет ограничение целостности NOT NULL, и для него не определено значение по умолчанию? 4. Что означает отсутствие списка столбцов в предложении INSERT? 5. Можно ли указать значение NULL во фразе VALUES? 6. Какова цель использования имен-синонимов (алиасов) таблиц? 7. Что означает отсутствие фразы WHERE в предложении UPDATE? 8. Что означает отсутствие фразы WHERE в предложении DELETE? 67 Лабораторная работа № 6 РАБОТА С ОБЪЕКТАМИ В TRANSACT-SQL Цель работы: изучить команды определения и манипулирования данными SQL; получить практические навыки составления SQL-запросов для работы с таблицами, индексами, представлениями и курсорами; а также навыки их выполнения на SQL-сервере с использованием клиентских утилит. Теоретические сведения 1. Типы данных Transact-SQL Символьные типы данных CHAR[(n)] – cтроки фиксированной длины, где n – число символов в строке; VARCHAR[(n)] – строки переменной длины, где n – максимальное число символов в строке; TEXT – строки потенциально неограниченного размера (до 2 Гб текста в строке). В данном случае 1≤ n ≤ 255. Символьные столбцы, допускающие пустые значения (NULL), хранятся как столбцы переменной длины. Примеры определений столбцов и типов данных: name VARCHAR(40) state CHAR(2) description CHAR(50) NULL Двоичные типы данных BINARY(n) – двоичные строки фиксированной длины, где n – число двоичных символов в строке; VARBINARY(n) – двоичные строки переменной длины, где n – максимальное число двоичных символов в строке; IMAGE – большие двоичные строки (изображения до 2 Гб в строке). В данном случае 1 ≤ n ≤ 255. Пример задания двоичного столбца: bin_column BINARY(4) NOT NULL 68 Типы данных даты SQL Server поддерживает два типа обозначения даты и времени при хранении: DATETIME и SMALLDATETIME. Последний менее точный и охватывает меньший диапазон дат, но зато позволяет экономить место на диске. SQL Server поддерживает различные форматы ввода даты. По умолчанию он работает с датами в формате xx/yy/zz как с последовательностями месяц/день/год. Точность представления времени при использовании DATETIME – 3 миллисекунды, а при использовании SMALLDATETIME – 1 минута. Пример: Формат ввода: 4/15/99 Значение DATETIME: Apr 15 1999 12:00:00:000 AM Значение SMALLDATETIME: Apr 15 1999 12:00 AM Логический тип данных SQL Server поддерживает логический тип данных BIT для столбцов флагов, имеющих значение 1 или 0. Числовые типы данных Числовые типы данных разбиваются на четыре основные категории: а) целые, включающие INT, SMALLINT и TINYINT. б) данные с плавающей точкой, включающие FLOAT и REAL. в) данные с фиксированной точкой – NUMERIC и DECIMAL г) денежные типы данных – MONEY и SMALLMONEY. а) Целые типы данных Характеристика INT SMALLINT TINYINT Минимальное значение –2 0 Максимальное значение 255 Объем памяти 4 байта 2 байта 1 байт б) Типы данных с плавающей точкой Характеристика FLOAT Минимальное значение ± 2.23E-308 Максимальное значение ± 1.79E308 Точность до 15 значащих цифр Объем памяти 8 байтов REAL ± 1.18E-38 ± 3.40E38 до 7 значащих цифр 4 байта Спецификатор типа FLOAT имеет вид FLOAT[(p)], где p – точность. 69 в) Точные числовые типы данных Эти типы данных вводятся описателями DECIMAL[(p,s)] и NUMERIC[(p,s)], где p – точность, s – масштаб. Они являются синонимами и взаимозаменяемы, но только NUMERIC может использоваться в комбинации со столбцами IDENTITY. Точность – это число значащих цифр, масштаб – число цифр после десятичной точки. Пример: NUMERIC(7,2). Если опущен масштаб, то он полагается равным нулю, а если опущена точность, то ее значение по умолчанию определяется в реализации. г) Денежные типы данных Характеристика MONEY SMALLMONEY Диапазон 922337203685477.5808 214748.3647 Размер памяти 8 байтов 4 байта 2. Создание таблицы Оператор создания таблицы имеет следующий синтаксис: <оператор создания таблицы>::= CREATE TABLE <имя таблицы> (<элемент таблицы>[{,<элемент таблицы>}...]) <элемент таблицы>::=<определение столбца> | <определение ограничения целостности> Каждая таблица БД имеет простое и квалифицированное (уточненное) имена. В качестве квалификатора имени выступает “идентификатор полномочий”. Квалифицированное имя таблицы имеет вид: <идентификатор полномочий>.<простое имя> Определение столбца <определение столбца>::= <имя столбца><тип данных>[<раздел умолчания>] [{<ограничение целостности столбца>}...] <раздел умолчания>::= DEFAULT {<литерал> | USER | NULL} <ограничение целостности столбца>::= NOT NULL[<спецификация уникальности>] | <спецификация ссылок> | CHECK (<условие поиска>) В разделе умолчания указывается значение, которое должно быть помещено в строку, заносимую в данную таблицу, если значение данного 70 столбца явно не указано. Значение по умолчанию может быть: 1) литеральная константа, соответствующая типу столбца; 2) символьная строка, содержащая имя текущего пользователя (USER); 3) неопределенное значение (NULL). Если значение столбца по умолчанию не специфицировано, и в разделе ограничений целостности столбца указано NOT NULL (т. е. наличие неопределенных значений запрещено), то попытка занести в таблицу строку с неспецифицированным значением данного столбца приведет к ошибке. Если ограничение NOT NULL не указано, и раздел умолчаний отсутствует, то неявно порождается раздел умолчаний DEFAULT NULL. Ограничения целостности столбца в принципе сходны с ограничениями целостности таблицы и рассмотрены ниже. Определение ограничений целостности таблицы Синтаксис для определения ограничений целостности таблицы представлен следующими правилами: <определение ограничений целостности таблицы>::= <определение ограничения уникальности> | <определение ограничения по ссылкам> | <определение проверочного ограничения> <определение ограничения уникальности>::=<спецификация уникальности> (<список столбцов>) <спецификация уникальности>::= UNIQUE | PRIMARY KEY <список столбцов>::= <имя столбца>[{,<имя столбца>}..] <определение ограничения по ссылкам>::= FOREIGN KEY (<ссылающиеся столбцы>)<спецификация ссылок> <спецификация ссылок>::== REFERENCES <ссылаемая таблица и столбцы> <ссылаемая таблица и столбцы>::=<имя таблицы>[(<список столбцов>)] <определение проверочного ограничения>::= CHECK (<условие поиска>) Действие ограничения уникальности состоит в том, что в таблице не допускается появление двух или более строк, значения столбцов уникальности которых совпадают. Среди ограничений уникальности таблицы не должно быть более одного определения первичного ключа (ограничения уникальности с ключевым словом PRIMARY KEY). Ограничения по ссылкам в данной работе не используются, и поэтому подробно не рассматриваются. 71 Проверочное ограничение специфицирует условие, которому должна удовлетворять в отдельности каждая строка таблицы. Это условие не должно содержать подзапросов, спецификаций агрегатных функций, а также ссылок на внешние переменные или параметров. В него могут входить только имена столбцов данной таблицы и литеральные константы. Примеры создания таблиц с ограничениями: CREATE TABLE employee (emp_id INTEGER CONSRAINT p1 PRIMARY KEY, fname CHAR(20) NOT NULL, minitial CHAR(1) NULL, lname VARCHAR(30) NOT NULL, job_id SMALLINT NOT NULL DEFAULT 1 REFERENCES jobs(job_id)) CREATE TABLE inventory (code CHAR(4) NOT NULL CONSTRAINT c1 CHECK(code LIKE"[0-9][0-9][0-9][0-9]"), high INT NOT NULL CHECK (high>0), low INT NOT NULL CHECK (low>0), CONSTRAIN c4 CHECK (hign>=low AND high-low<1000)) 3. Изменение таблиц Для изменения таблицы, а именно: для включения новых столбцов и ограничений, а также удаления ограничений – используется оператор ALTER TABLE, имеющий следующий синтаксис: <оператор изменения таблицы>::= ALTER TABLE <имя таблицы> {ADD <элемент таблицы>[{,<элемент таблицы>}...] | DROP CONSTRAINT <имя ограничения>[{,<имя ограничения>}...]} Пример включения нового столбца в таблицу: ALTER TABLE names2 ADD middle_name VARCHAR(20) NULL, fax VARCHAR(15) NULL 4. Создание представлений Механизм представлений является мощным средством языка SQL, позволяющим скрыть реальную структуру БД от некоторых пользователей за счет определения представления БД. Представление реально является некоторым хранимым в БД запросом с именованными 72 столбцами, а для пользователя ничем не отличается от базовой таблицы БД. Представляемая таблица является виртуальной. Обычно вычисление представляемой таблицы производится каждый раз при использовании представления. Оператор определения представления имеет следующий синтаксис: <оператор создания представления>::= CREATE VIEW <имя таблицы>[(список столбцов)] AS <спецификация запроса> [WITH CHECK OPTION] <спецификация запроса>::= SELECT [ALL | DISTINCT] <список выборки><табличное выражение> <список столбцов>::=<имя столбца>[{,<имя столбца>}...] Требование WITH CHECK OPTION имеет смысл только в случае определения изменяемой представляемой таблицы, которая определяется спецификацией запроса, содержащей раздел WHERE. При наличии этого требования не допускаются изменения представляемой таблицы, приводящие к появлению в базовых таблицах строк, не видимых в представляемой таблице. Примеры создания представлений: CREATE VIEW ta_limited AS SELECT au_id, title_id, au_ord FROM titleauthor CREATE VIEW cal_publishers AS SELECT * FROM publishers WHERE state="CA" 5. Операторы, связанные с курсором Курсор – это механизм языка SQL, предназначенный для того, чтобы позволить прикладной программе последовательно, строка за строкой, просмотреть результат связанного с курсором запроса. Курсор можно представить как “буфер” с указателем на текущую строку. Ниже приводится синтаксис операторов, связанных с курсором и их краткая характеристика. <оператор объявления курсора>::= DECLARE <имя курсора> [SCROLL] CURSOR FOR <спецификация курсора> <спецификация курсора>::= SELECT [ALL | DISTINCT] <список выборки> <табличное выражение>[ORDER BY <спецификация сортировки>] 73 Этот оператор не является выполняемым, он только связывает имя курсора со спецификацией курсора. Если задан описатель SCROLL, то курсор является “скроллируемым”, то есть допускает прокрутку результирующей таблицы как вниз, так и вверх на любое число строк. <оператор открытия курсора>::= OPEN <имя курсора> Оператор открытия курсора должен быть первым в серии выполняемых операторов, связанных с данным курсором. Можно считать, что во время выполнения оператора открытия курсора производится построение временной таблицы, содержащей результат запроса, который связан с этим курсором. <оператор чтения>::= FETCH <имя курсора> INTO <список спецификаций целей> <список спецификаций целей>::= <спецификация цели>[{,<спецификация цели>}..] Данный оператор устанавливает курсор на следующую строку таблицы и выбирает значения из этой строки. <оператор позиционного удаления>::= DELETE таблицы> WHERE CURRENT OF <имя курсора> FROM <имя Данный оператор удаляет строку таблицы. Изменяемая таблица, указанная в разделе FROM оператора DELETE, должна быть таблицей, указанной в самом внешнем разделе FROM спецификации курсора. <оператор позиционной модификации>::= UPDATE <имя таблицы> SET <предложение установки> [{,<предложение установки>}...] WHERE CURRENT OF <имя курсора> <предложение установки>::= <имя столбца> = {<арифметическое выражение> | NULL} Данный оператор изменяет значение полей строки таблицы, определенной курсором, в соответствии с предложениями установки. <оператор закрытия курсора>::= CLOSE <имя курсора> Данный оператор закрывает ранее открытый курсор. 74 Примеры работы с курсором: DECLARE mycursor SCROLL CURSOR FOR SELECT au_lname FROM authors OPEN mycursor FETCH FIRST FROM mycursor /* первая строка */ FETCH ABSOLUTE 10 FROM mycursor FETCH NEXT FROM mycursor /* следующая строка */ FETCH RELATIVE 2 FROM mycursor FETCH PRIOR FROM mycursor /* предыдущая строка */ FETCH LAST FROM mycursor /* последняя строка */ CLOSE mycursor 6. Создание индекса Индекс представляет собой объект, ускоряющий выполнение запросов. Синтаксис оператора создания индекса имеет вид: <оператор создания индекса>::= CREATE [UNIQUE] INDEX <имя индекса> ON <имя таблицы> (<имя столбца> [ASC | DESC] [{,<имя столбца>[ASC | DESC]}..]) Описатель уникальности UNIQUE указывает, что никаким двум строкам в индексируемой базовой таблице не позволяется принимать одно и то же значение для индексируемого столбца (или комбинации столбцов) в одно и то же время. Описатели ASC и DESC определяют, что столбец должен быть отсортирован в возрастающем или убывающем порядке в пределах индекса. В Transact-SQL описатели ASC и DESC не используются. 7. Удаление объектов базы данных Для удаления объектов базы данных используются соответствующие операторы, синтаксис которых представлен ниже. <оператор удаления таблицы>::= DROP TABLE <имя таблицы> <оператор удаления представления>::= DROP VIEW <имя представления> <оператор удаления представления>::= DROP INDEX <имя индекса> 75 8. Получение справочной информации об объектах базы данных Информацию об объектах текущей базы данных можно получить, запустив хранимую процедуру SP_HELP, выполнив оператор: SP_HELP <имя объекта> Для объекта-таблицы отображаются: имя собственника таблицы; дата и время ее создания; имена столбцов таблицы и их типы данных; имена, описания и ключи индексов, связанных с таблицей; типы, имена и описания ограничений столбцов и таблицы в целом. Без входных параметров эта процедура возвращает список всех объектов, их собственников и типов объектов. Для получения информации только об ограничениях таблицы можно воспользоваться хранимой процедурой SP_HELPCONSTRAINT, выполнив оператор: SP_HELPCONSTRAINT <имя таблицы> Для получения информации только об индексах таблицы можно воспользоваться хранимой процедурой SP_HELPINDEX, выполнив оператор: SP_HELPINDEX <имя таблицы> Для того чтобы получить список и описания объектов класса X, определенных в базе данных, можно выполнить оператор: SELECT * FROM sysobjects WHERE type= ‘X’ Возможные значения параметра X: U – таблица, V – представление, С – проверочное ограничение, F – ограничение по ссылкам, K – ограничение уникальности, D – раздел умолчаний. Порядок выполнения работы Изучение языка баз данных 1. Изучить язык определения данных SQL, включая операторы создания таблиц (CREATE TABLE), создания представлений (CREATE 76 VIEW), модификации таблиц (ALTER TABLE), удаления таблиц (DROP TABLE), удаления представлений (DROP VIEW), а также операторы создания индексов (CREATE INDEX) и удаления индексов (DROP INDEX). Изучить типы ограничений и способы их представления на языке SQL. 2. Изучить операторы манипулирования данными, связанные с курсором, включая оператор объявления курсора (DECLARE CURSOR), оператор открытия курсора (OPEN), оператор чтения очередной строки курсора (FETCH), оператор позиционного удаления (DELETE), оператор позиционной модификации (UPDATE), оператор закрытия курсора (CLOSE). 3. Изучить одиночные операторы манипулирования данными, включая) операторы поискового удаления (DELETE) и поисковой модификации (UPDATE), а также оператор включения (INSERT). 4. Изучить интегрированную утилиту SQL Enterprise Manager, а также системные хранимые процедуры с точки зрения их использования для просмотра объектов базы данных, создания и удаления таблиц. В частности, изучить работу с системной хранимой процедурой sp_help, используемой для получения информации о базе данных и объектах базы данных. Работа непосредственно с таблицей 1. В соответствии с вариантом задания разработать точную структуру строк (записей) таблицы, включая выбор типов данных для каждого поля строки. 2. Составить оператор создания таблицы с учетом приведенных в задании ограничений, выполнить данный оператор на SQL-сервере с использованием клиентской утилиты. Просмотреть результат выполнения данного оператора с помощью системной хранимой процедуры sp_help или клиентской утилиты SQL-EM. 3. Заполнить созданную таблицу данными с использованием оператора включения. Просмотреть заполненную таблицу. 4. Изменить одну или несколько строк таблицы с использованием оператора поисковой модификации. Просмотреть измененную таблицу. 5. Удалить одну или несколько строк из таблицы с использованием оператора поискового удаления. Просмотреть измененную таблицу. 6. Добавить столбец в таблицу с использованием оператора модификации таблицы. Просмотреть измененную таблицу. 7. Удалить ограничение из таблицы с использованием оператора модификации таблицы. Просмотреть результат выполнения оператора. 77 Работа с курсором 1. Объявить скроллируемый курсор в соответствии со спецификацией курсора из лабораторного задания. 2. Открыть курсор. 3. Просмотреть первую, j-ю и последнюю строки результирующей таблицы, а также последовательно всю результирующую таблицу от начала и до конца и от конца до начала (число j задается преподавателем). 4. Удалить n-ю строку результирующей таблицы с использованием оператора позиционного удаления (число n задается преподавателем). Просмотреть базовую таблицу и сравнить ее c предыдущим вариантом. 5. Модифицировать k-ю строку результирующей таблицы, изменив значение одного или нескольких полей, с использованием оператора позиционной модификации (число k задается преподавателем). Просмотреть базовую таблицу и сравнить ее c предыдущим вариантом. 6. Закрыть курсор. Работа с представлением 1. В соответствии с заданием составить оператор создания представления, выполнить данный оператор на SQL-сервере с использованием клиентской утилиты. Просмотреть результат выполнения данного оператора с помощью системной хранимой процедуры sp_help или клиентской утилиты SQL-EM. Просмотреть представляемую таблицу. 2. Включить несколько записей в представляемую таблицу с использованием оператора включения. Просмотреть представляемую и базовую таблицы и сравнить их с предыдущими вариантами этих таблиц. 3. Изменить несколько строк представляемой таблицы с использованием оператора поисковой модификации. Просмотреть представляемую и базовую таблицы и сравнить их с предыдущими вариантами этих таблиц. 4. Удалить несколько строк из представляемой таблицы с использованием оператора поискового удаления. Просмотреть представляемую и базовую таблицы и сравнить их с предыдущими вариантами этих таблиц. 5. Удалить представление с использованием оператора удаления представления. Работа с индексами 1. Создать индекс, который бы позволял быстрый поиск по первичному ключу, содержащему столбцы уникальности. 2. Составить и выполнить какой-нибудь запрос к индексированной таблице. 78 3. Удалить индекс. 4. Удалить базовую таблицу с использованием оператора удаления таблицы. Содержание отчета задание; операторы создания и удаления таблицы; операторы создания и удаления представления; операторы объявления и закрытия курсора; операторы создания и удаления индекса; операторы манипулирования данными, относящиеся к базовой, представляемой и результирующей таблицам; 7) исходная базовая таблица; 8) исходная представляемая таблица; 9) исходная результирующая таблица курсора; 10) измененные таблицы (базовая, представляемая и результирующая) и ссылки на соответствующие им операторы изменения таблиц (для каждого акта изменения). 1) 2) 3) 4) 5) 6) Варианты заданий Вариант 1 Схема таблицы СТУДЕНТ: идентификатор зачетки; фамилия и инициалы студента; специальность; группа; дата рождения; наличие стипендии (имеется/не имеется); адрес проживания; средний балл зачетки. Ограничение уникальности: идентификатор зачетки. Проверочные ограничения: а) код группы должен иметь следующую структуру: <цифра><цифра><буква><буква><цифра>; б) средний балл зачетки должен быть в интервале [2,5]. Спецификация представления: представляемая таблица содержит идентификатор зачетки, фамилию и инициалы студента, а также средний балл зачетки для студентов, получающих стипендию. Спецификация курсора: результирующая таблица включает фамилию и инициалы студента, группу и адрес проживания для студентов, имеющих средний балл зачетки более 4,5. 79 Вариант 2 Схема таблицы ЭКЗАМЕН: название предмета; фамилия и инициалы студента; фамилия и инициалы преподавателя; должность преподавателя; дата сдачи экзамена; номер аудитории; оценка; сложность предмета. Ограничение уникальности: название предмета, фамилия и инициалы студента. Проверочные ограничения: а) должность преподавателя должна быть одной из следующего списка: ассистент, старший преподаватель, доцент, профессор; б) сложность предмета должна быть в интервале [0,1]. Спецификация представления: представляемая таблица содержит название предмета, фамилию и инициалы студента, а также экзаменационную оценку для тех экзаменов, которые принимают профессора. Спецификация курсора: результирующая таблица включает все сведения об экзаменах, сданных на оценку “отлично”. Вариант 3 Схема таблицы ВОЕННОСЛУЖАЩИЕ: номер военного билета; фамилия и инициалы; дата рождения; род войск; воинское звание; оклад; рост; вес; номер противогаза; наличие водительских прав (имеются/не имеются). Ограничение уникальности: номер военного билета. Проверочные ограничения: а) номер военного билета должен состоять из шести цифр; б) номер противогаза должен быть цифрой 1,2 или 3. Спецификация представления: представляемая таблица содержит номер военного билета, фамилию и инициалы, род войск военнослужащих ростом более 180 см. Спецификация курсора: результирующая содержит фамилию и инициалы, воинское звание, номер противогаза военнослужащих, имеющих водительские права. 80 Вариант 4 Схема таблицы КОМПЬЮТЕР: марка компьютера; страна сборки; процессор; объем оперативной памяти; объем внешней памяти; быстродействие; наличие мыши (имеется/не имеется); марка монитора; цена; дата выпуска. Ограничение уникальности: марка компьютера, страна сборки. Проверочные ограничения: а) объем оперативной памяти должен быть в интервале [2,128] Мбайт; б) дата выпуска должна быть не позже текущей даты. Спецификация представления: представляемая таблица содержит марку компьютера, страну сборки и цену для компьютеров, имеющих объем оперативной памяти более 8 Мбайт. Спецификация курсора: результирующая таблица совпадает с базовой. Вариант 5 Схема таблицы УЧЕБНЫЙ ПЛАН: код специальности; название дисциплины; семестр; дата начала семестра; общее количество часов; наличие курсового проекта (имеется/не имеется); формы отчетности (экзамены, зачеты и т. д.). Ограничение уникальности: код специальности, название дисциплины, семестр. Проверочные ограничения: а) код специальности должен иметь следующую структуру: <цифра><цифра>.<цифра><цифра>; б) семестр должен быть или осенний, или весенний. Спецификация представления: представляемая таблица содержит код специальности, семестр и названия дисциплин, для которых предусмотрен курсовой проект. Спецификация курсора: результирующая таблица содержит все сведения о дисциплинах весеннего семестра. 81 Вариант 6 Схема таблицы ПОСТАВКИ ТОВАРОВ: название фирмы-поставщика; название фирмы-потребителя; товарный кредит (да/нет); название товара; количество единиц товара; вес единицы товара; цена единицы товара; платежные реквизиты (адрес и номер расчетного счета); дата отгрузки. Ограничение уникальности: название фирмы-поставщика, название фирмыпотребителя. Проверочные ограничения: а) поставляемыми товарами являются холодильники, пылесосы и утюги; б) количество поставляемых единиц товара не должно превышать 100 штук. Спецификация представления: представляемая таблица содержит сведения о товарах. Спецификация курсора: результирующая таблица содержит название фирмыпоставщика, название фирмы-потребителя и название товара для поставок, в которых используется товарный кредит. Вариант 7 Схема таблицы АВТОТРАНСПОРТ: государственный номер; тип (автобус, самосвал, тягач, джип); марка; год изготовления; грузоподъемность или вместимость; расход горючего на 100 км; пробег к текущему техосмотру; дата проведения последнего техосмотра; успешность техосмотра (положительная/отрицательная). Ограничение уникальности: государственный номер. Проверочные ограничения: а) государственный номер имеет следующую структуру: <буква><цифра><цифра><цифра><буква><буква>; б) автотранспорт может быть следующих типов: автобус, самосвал, тягач, джип. Спецификация представления: представляемая таблица содержит государственный номер, тип и марку автотранспорта, успешно прошедшего техосмотр. Спецификация курсора: результирующая таблица содержит тип автотранспорта, грузоподъемность (вместимость) и дату проведения последнего техосмотра для автотранспорта, выпущенного за последние пять лет. 82 Вариант 8 Схема таблицы ФАКУЛЬТЕТ: название факультета; фамилия и инициалы декана; телефон деканата; дата основания факультета; число выпускающих кафедр; число обучаемых студентов; наличие иностранных студентов (имеются/не имеются); удельный вес преподавателей с учеными степенями. Ограничение уникальности: название факультета. Проверочные ограничения: а) телефон деканата должен иметь следующую структуру: 63-<цифра><цифра>-<цифра><цифра>; б) удельный вес преподавателей с учеными степенями должен быть в интервале [0,1]. Спецификация представления: представляемая таблица содержит название факультета, фамилию и инициалы деканата, а также число выпускающих кафедр для факультетов, на которых учатся иностранные студенты. Спецификация курсора: результирующая таблица содержит фамилию и инициалы декана, телефон и дату основания деканата. Вариант 9 Схема таблицы УСПЕВАЕМОСТЬ: факультет; специальность; дисциплина; общее количество студентов; количество сдававших студентов; удельный вес отличных, хороших, удовлетворительных и неудовлетворительных оценок; дата начала экзаменационной сессии. Ограничение уникальности: факультет, специальность, дисциплина. Проверочные ограничения: а) количество сдававших студентов не должно быть больше количества студентов; б) сумма удельных весов отличных, хороших, удовлетворительных и неудовлетворительных оценок должна быть равной 1. Спецификация представления: представляемая таблица содержит названия специальности и дисциплины, а также количество сдававших студентов для факультета вычислительной техники. Спецификация курсора: результирующая таблица содержит все сведения об успеваемости на специальности “Вычислительные машины, комплексы, системы и сети”. 83 Вариант 10 Схема таблицы ЖИВОТНОЕ: название животного; класс животного; максимальный вес животного; минимальный вес животного; средний вес животного; окраска; место обитания; дата занесения в Красную книгу; продолжительность жизни; летательные способности (летает/не летает). Ограничение уникальности: название животного. Проверочные ограничения: а) средний вес животного должен быть больше минимального веса и меньше максимального веса; б) дата занесения в Красную Книгу не должна быть после текущей даты. Спецификация представления: представляемая таблица содержит сведения о весе животных. Спецификация курсора: результирующая таблица содержит название, класс и средний вес животных, способных летать. Вариант 11 Схема таблицы ФИРМА: название фирмы; организационно-правовая форма (ООО, ОАО, ТОО и т. д.); юридический адрес; дата учреждения; количество работников; число работников, имеющих водительские права; средний оклад работников; средний возраст работников; направления деятельности; задолженность по налогам (имеется/не имеется). Ограничение уникальности: название фирмы. Проверочные ограничения: а) число работников, имеющих водительские права, не должно превышать общее количество работников; б) средний возраст работников не должен превышать 35 лет. Спецификация представления: представляемая таблица включает название фирмы и соответствующие обобщенные сведения о работниках этой фирмы. Спецификация курсора: результирующая таблица содержит название фирмы, юридический адрес и количество работников, причем удельный вес работников фирмы, имеющих водительские права, превышает 60 %. 84 Вариант 12 Схема таблицы ТЕЛЕВИЗОР: марка телевизора; страна сборки; тип кинескопа; размер по диагонали; системы цветности; число каналов; наличие телетекста (имеется/не имеется); звук (моно/стерео); выходная мощность; вес; потребляемая мощность; дата продажи. Ограничение уникальности: марка телевизора, страна сборки. Проверочные ограничения: а) система цветности может быть следующих типов: PAL/SECAM, B/G, D/K, H, I, M, NTSC, VIT); б) число каналов должно быть не меньше 40. Спецификация представления: представляемая таблица содержит марку телевизора, страну сборки и потребляемую мощность для телевизоров, имеющих телетекст. Спецификация курсора: результирующая таблица совпадает с базовой. 85 Лабораторная работа № 7 ПРОГРАММНЫЕ ОБЪЕКТЫ И ФУНКЦИИ TRANSACT-SQL Цель работы: знакомство с основными принципами программирования в MS SQL Server, средствами встроенного языка Transact SQL. Содержание работы 1. Знакомство с правилами обозначения синтаксиса команд в справочной системе MS SQL Server (утилита Books Online). 2. Изучение правил написания программ на Transact SQL. 3. Изучение правил построения идентификаторов, правил объявления переменных и их типов. 4. Изучение работы с циклами и ветвлениями. 5. Изучение работы с переменными типа Table и Cursor. 6. Проработка всех примеров, анализ результатов их выполнения в утилите Query Analyzer. 7. Выполнение индивидуальных заданий по вариантам. Пояснения к выполнению работы Для освоения программирования используем пример базы данных c названием DB_Books (см. приложение). При выполнении примеров и заданий обращайте внимание на соответствие названий БД, таблиц и других объектов проекта. Таблица 7.1 Специальные знаки и простейшие операторы в Transact SQL Знак Назначение 1 2 * Знак умножения Знак 3 "" - Знак вычитания % Остаток от деления двух <> чисел Знак сложения или [ ] конкатенации (объединение двух строк в одну) + ‘ ’ 86 Назначение 4 В них заключают строковые значения, если SET QUOTED_IDENTIFIER OFF В них заключают строковые значения Не равно Аналог кавычек, в них можно заключать названия идентификаторов, если в их названиях встречаются пробелы Окончание табл. 7.1 1 = <= >= != @ @@ -- 2 Знак равенства или сравнения Меньше или равно Больше или равно Не равно Ставится перед именем переменной Указывает на системные функции Однострочный комментарий или комментарий с текущей позиции и до конца строки 3 4 !< Не менее чем !> > < . / Не более чем Больше Меньше Разделяет родительские подчиненные объекты Знак деления /* */ Многострочный комментарий и Идентификаторы – это имена объектов, на которые можно ссылаться в программе, написанной на языке Transact SQL. Первый символ может состоять из букв английского алфавита или “_”, “@”, “#”. Остальные дополнительно из цифр и «$». Имя идентификатора не должно совпадать с зарезервированным словом. Для ограничителей идентификаторов при установленном параметре: SET QUOTED_IDENTIFIER ON можно использовать как квадратные скобки, так и одинарные кавычки, а строковые значения только в одинарных кавычках (режим по умолчанию). Если использовать установленный параметр в режиме: SET QUOTED_IDENTIFIER OFF, то в качестве ограничителей идентификаторов можно использовать только квадратные скобки, а строковые значения указываются в одинарных или двойных кавычках. Переменные используются для сохранения промежуточных данных в хранимых процедурах и функциях. Все переменные считаются локальными. Имя переменной должно начинаться с @. 87 Объявление переменных Синтаксис в обозначениях MS SQL Server: DECLARE @имя_переменной1 тип_переменной, @имя_переменнойN тип_переменной …, Если тип переменной предполагает указание размера, то используется следующий синтаксис для объявления переменных: DECLARE @имя_переменной1 тип_переменной @имя_переменнойN тип_переменной(размер) (размер), …, Пример: DECLARE @a INT, @b numeric(10,2) DECLARE @str CHAR(20) Присвоение значений переменным и вывод значений на экран Присвоение с помощью SET – обычное присвоение, синтаксис: SET @имя_переменной = значение. Пример: DECLARE @a INT, @b numeric(10,2) SET @a = 20 SET @b = (@a+@a)/15 SELECT @b --вывод на экран результата Присвоение с помощью SELECT – помещение результата запроса в переменную. Если в результате выполнения запроса не будет возвращено ни одной строки, то значение переменной не меняется, т.е. остается старым. Пример: DECLARE @a INT SELECT @a = COUNT(*) FROM Authors Пример: DECLARE @str CHAR(30) SELECT @str = name FROM Authors В данном примере в переменную поместится последнее значение из результата запроса. 88 Сочетание ключевых слов SET и SELECT Пример: DECLARE @a INT SET @a = (SELECT COUNT(*) FROM Authors) Работа с датой и временем Оператор SET DATEFORMAT dmy | ymd | mdy задает порядок следования компонентов даты. Пример: SET DATEFORMAT dmy DECLARE @d DateTime SET @d = ’31.01.2005 13:23:15’ SET @d = @d+1 SELECT @d Создание временной таблицы через переменную типа TABLE Объявляется через DECLARE с указанием в скобках столбцов таблицы, их типов, размеров, значений по умолчанию, а также индексов типа PRIMARY KEY или UNIQUE. Пример: DECLARE @mytable TABLE(id INT, myname CHAR(20) DEFAULT ‘Введите имя’) INSERT INTO @mytable(id) VALUES (1) SELECT * FROM @mytable Пример: DECLARE @mytable TABLE(id INT, myname CHAR(20) DEFAULT ‘Введите имя’) INSERT @mytable SELECT Code_publish, City FROM Publishing_house SELECT * FROM @mytable Преобразование типов переменных Функция CAST возвращает значение, преобразованное к указанному типу: CAST(@переменная или значение AS требуемый_тип_данных). 89 Пример: DECLARE @d DateTime, @str char(20) SET @d = ’31.01.2005 13:23:15’ SET @str = CAST(@d AS Char(20)) SELECT @str Функция CONVERT возвращает значение, преобразованное к указанному типу по заданному формату. Изучить дополнительно, по желанию. Операторские скобки BEGIN /* в них нельзя помещать команды, изменяющие структуры объектов БД. Операторские скобки должны содержать хотя бы один оператор. Требуются для конструкций поливариантных ветвлений, условных и циклических конструкций. */ END Условная конструкция IF Синтаксис: IF условие Набор операторов1 ELSE Набор операторов2 Пример: DECLARE @a INT DECLARE @str CHAR(30) SET @a = (SELECT COUNT(*) FROM Authors) IF @a >10 BEGIN SET @str = 'Количество авторов больше 10' SELECT @str END ELSE 90 BEGIN SET @str = 'Количество авторов = ' + str(@a) SELECT @str END Цикл WHILE Синтаксис: WHILE Условие Набор операторов1 BREAK Набор опреторов2 CONTINUE Конструкции BREAK и CONTINUE являются необязательными. Цикл можно принудительно остановить, если в его теле выполнить команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения всех команд в теле, необходимо выполнить команду CONTINUE. Пример: DECLARE @a INT SET @a = 1 WHILE @a <100 BEGIN PRINT @a -- вывод на экран значения переменной IF (@a>40) AND (@a<50) BREAK --выход и выполнение 1-й команды за циклом: ELSE SET @a = @a+rand()*10 CONTINUE END PRINT @a Объявление курсора CURSOR – это набор строк, являющихся результатом выполнения запроса. В один момент времени доступна лишь одна строка (текущая), по курсору можно передвигаться и получать доступ к элементарным 91 данным. При объявлении курсора создается временная копия данных, которая сохраняется в БД tempdb. Динамический курсор – данные в курсоре могут быть изменены. Статический курсор – данные в курсоре не меняются. Стандартный способ объявления курсора, синтаксис в обозначениях MS SQL Server: DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ]}] Примеры объявления курсоров: DECLARE MyCursor1 CURSOR FOR (select * from Authors) /*объявили курсор с названием MyCursor1, который содержит всю информацию об авторах, двигаться по нему можно только от первой записи вниз до последней. Курсор является динамическим.*/ DECLARE MyCursor1 INSENSITIVE CURSOR FOR (select * from Authors) /*объявили курсор с названием MyCursor1, который содержит всю информацию об авторах, двигаться по нему можно только от первой записи вниз до последней. Курсор является статическим.*/ DECLARE MyCursor1 SCROLL CURSOR FOR (select * from Authors) /*объявили курсор с названием MyCursor1, который содержит всю информацию об авторах, двигаться по нему можно в любом направлении. Курсор является динамическим.*/ DECLARE MyCursor1 INSENSITIVE SCROLL CURSOR FOR (select * from Authors) /*объявили курсор с названием MyCursor1, который содержит всю информацию об авторах, двигаться по нему можно в любом направлении. Курсор является статическим.*/ DECLARE MyCursor1 CURSOR FOR (select * from Authors) FOR READ ONLY /*объявили курсор с названием MyCursor1, который содержит всю информацию об авторах, двигаться по нему можно только от первой записи вниз до последней. Курсор является динамическим. Данные доступны только для чтения.*/ DECLARE MyCursor1 CURSOR FOR (select * from Authors) FOR UPDATE /*объявили курсор с названием MyCursor1, который содержит всю информацию об авторах, двигаться по нему можно только от первой 92 записи вниз до последней. Курсор является динамическим. Данные курсора можно менять.*/ Операторы для работы с курсором Прежде чем обратиться к данным курсора, его нужно после объявления открыть. Синтаксис оператора OPEN в обозначениях MS SQL Server: OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name } Пример: DECLARE MyCursor1 CURSOR FOR (select * from Authors) OPEN MyCursor1 После прекращения работы с курсором, его нужно закрыть. Курсор остается доступным для последующего использования в рамках процедуры или триггера, в котором он создан. Синтаксис оператора CLOSE в обозначениях MS SQL Server: CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name } Пример: DECLARE MyCursor1 CURSOR FOR (select * from Authors) OPEN MyCursor1 --здесь операторы работы с курсором: CLOSE MyCursor1 Если курсором больше не будут пользоваться, то его необходимо уничтожить и освободить переменную. Синтаксис оператора DEALLOCATE в обозначениях MS SQL Server: DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name } Пример: DECLARE MyCursor1 CURSOR FOR (select * from Authors) OPEN MyCursor1 --здесь операторы работы с курсором: CLOSE MyCursor1 DEALLOCATE MyCursor1 FETCH – оператор движения по записям курсора и извлечения данных текущей записи в указанные переменные. Синтаксис оператора FETCH в обозначениях MS SQL Server: 93 FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar }] FROM] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,...n ] ] Пример: DECLARE MyCursor1 SCROLL CURSOR FOR (select * from Authors) DECLARE @i bigint, @s char(20), @d smalldatetime OPEN MyCursor1 FETCH FIRST FROM MyCursor1 INTO @i, @s, @d PRINT @i PRINT @s PRINT @d CLOSE MyCursor1 DEALLOCATE MyCursor1 @@FETCH_STATUS – данная функция определяет признак конца или начала текущего курсора. Функция принимает одно из следующих значений: 0 – находимся в пределах курсора, не в конце; 1 – попытка выйти за пределы первой записи вверх (в никуда); 2 – попытка выйти за пределы последней записи вниз (в никуда). Пример: DECLARE MyCursor1 SCROLL CURSOR FOR (select * from Authors) DECLARE @i bigint, @s char(20), @d smalldatetime OPEN MyCursor1 FETCH FIRST FROM MyCursor1 INTO @i, @s, @d WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM MyCursor1 INTO @i, @s, @d PRINT @i PRINT @s PRINT @d END CLOSE MyCursor1 DEALLOCATE MyCursor1 Встроенные функции Встроенные функции, имеющиеся в распоряжении пользователей при работе с SQL, можно условно разделить на следующие группы: математические функции; строковые функции; 94 функции для работы с датой и временем; функции конфигурирования; функции системы безопасности; функции управления метаданными; статистические функции. Использование функций для работы со строковыми переменными Таблица 7.2 Краткий обзор строковых функций Название функции ASCII CHAR CHARINDEX DIFFERENCE LEFT LEN LOWER LTRIM NCHAR PATINDEX REPLACE QUOTENAME REPLICATE REVERSE RIGHT RTRIM SOUNDEX SPACE STR STUFF SUBSTRING UNICODE UPPER Действие, выполняемое функцией Возвращает код ASCII левого символа строки По коду ASCII возвращает символ Определяет порядковый номер символа, с которого начинается вхождение подстроки в строку Возвращает показатель совпадения строк Возвращает указанное число символов с начала строки Возвращает длину строки Переводит все символы строки в нижний регистр Удаляет пробелы в начале строки Возвращает по коду символ Unicode Выполняет поиск подстроки в строке по указанному шаблону Заменяет вхождения подстроки на указанное значение Конвертирует строку в формат Unicode Выполняет тиражирование строки определенное число раз Возвращает строку, символы которой записаны в обратном порядке Возвращает указанное число символов с конца строки Удаляет пробелы в конце строки Возвращает код звучания строки Возвращает указанное число пробелов Выполняет конвертирование значения числового типа в символьный формат Удаляет указанное число символов, заменяя новой подстрокой Возвращает для строки подстроку указанной длины с заданного символа Возвращает Unicode-код левого символа строки Переводит все символы строки в верхний регистр 95 Использование функций для работы с числами Таблица 7.3 Краткий обзор математических функций Название функции ABS ACOS ASIN ATAN ATN2 CEILING COS COT DEGREES EXP FLOOR LOG LOG10 PI POWER RADIANS RAND ROUND SIGN SIN SQUARE SQRT TAN Действие, выполняемое функцией Вычисляет абсолютное значение числа Вычисляет арккосинус Вычисляет арксинус Вычисляет арктангенс Вычисляет арктангенс с учетом квадратов Выполняет округление вверх Вычисляет косинус угла Возвращает котангенс угла Преобразует значение угла из радиан в градусы Возвращает экспоненту Выполняет округление вниз Вычисляет натуральный логарифм Вычисляет десятичный логарифм Возвращает значение "пи" Возводит число в степень Преобразует значение угла из градуса в радианы Возвращает случайное число Выполняет округление с заданной точностью Определяет знак числа Вычисляет синус угла Выполняет возведение числа в квадрат Извлекает квадратный корень Возвращает тангенс угла Использование функций для работы с типом дата/время Таблица 7.4 Краткий обзор функций Название функции Действие, выполняемое функцией 1 2 DATEADD Добавляет к дате указанное значение дней, месяцев, часов и т. д. DATEDIFF Возвращает разницу между указанными частями двух дат DATENAME Выделяет из даты указанную часть и возвращает ее в символьном формате DATEPART Выделяет из даты указанную часть и возвращает ее в числовом формате DAY Возвращает число из указанной даты GETDATE Возвращает текущее системное время 96 Окончание табл. 7.4 1 ISDATE MONTH YEAR MINUTE HOUR SECOND 2 Проверяет правильность выражения на соответствие одному из возможных форматов ввода даты Возвращает значение месяца из указанной даты Возвращает значение года из указанной даты Возвращает значение минут из указанной даты/времени Возвращает значение часов из указанной даты/времени Возвращает значение секунд из указанной даты/времени Варианты заданий к лабораторной работе Общие сведения Для получения более подробной информации о работе тех или иных операторов или функций можно запустить утилиту Books Online из состава MS SQL Server и в разделе «Указатель» набрать искомый ключевой элемент. Для выполнения заданий ориентироваться на вариант и список номеров заданий во второй лабораторной работе. Специальные знаки и простейшие операторы в Transact SQL 1. Проверить работу описанной установки QUOTED_IDENTIFIER. 2. Проверить работу описанной установки SET DATEFIRST. SET Объявление переменных 3. Объявить переменную Perem1 типа «денежный», а переменную Perem2 типа «число» с целой частью, равной 8, и дробной частью, равной 2. 4. Объявить переменную Perem1 типа строка длиной 100, а переменную Perem2 типа длинное целое. 5. Объявить переменную Perem1 типа «динамическая строка» с максимальной длиной 1000, а переменную Perem2 типа «целое число». 6. Объявить переменную Perem1 типа «строка» длиной 30, а переменную Perem2 типа «число» с целой частью, равной 10, и дробной частью, равной 3. 7. Объявить переменную Perem1 типа «дата/ время», а переменную Perem2 типа «число» в диапазоне от 0 до 255. 97 Присвоение значений переменным и вывод значений на экран 8. Подсчитать среднюю цену закупленных книг (с помощью запроса SELECT) и умножить ее на значение 123,34, которое необходимо сохранить в отдельной переменной, вывести значение переменной на экран. 9. Подсчитать суммарную цену всех закупок книг, результат поместить в переменную, вывести значение переменной на экран. 10. Подсчитать количество книг в справочнике книг, результат поместить в переменную, вывести значение переменной на экран. 11. Определить минимальную дату рождения автора в справочнике авторов, результат поместить в переменную, вывести значение переменной на экран. Сочетание ключевых слов SET и SELECT 12. Подсчитать количество поставщиков книг, результат поместить в переменную. 13. Подсчитать сумму закупок книг, результат поместить в переменную. 14. Подсчитать среднюю цену в таблице покупок книг, результат поместить в переменную. 15. Подсчитать максимальную стоимость книг в закупке, результат поместить в переменную. Работа с датой и временем 16. Определить переменную Date1 типа «дата/время». Присвоить ей значение даты 31. 12. 2006 в формате dd.mm.yyyy. 17. Определить переменную Date1 типа «дата/время». Присвоить ей значение даты 31. 12. 2006 в формате mm.dd.yyyy. 18. Определить переменную Date1 типа «дата/время». Присвоить ей значение даты 31. 12. 2006 в формате yyyy.mm.dd. Создание временной таблицы через переменную типа TABLE 19. Создать локальную таблицу с названием TEMP и полями типа «дата/время», «длинное целое», «строка». Добавить в нее две записи с данными и вывести результат на экран. 20. Создать локальную таблицу с названием TEMP и полями типа «длинное целое», «строка» и значением по умолчанию «введите чтонибудь», «денежный». Добавить в нее две записи с данными и вывести результат на экран. 98 21. Создать локальную таблицу с названием TEMP и полями типа «целое», «динамическая строка», «бит» со значением по умолчанию «1». Добавить в нее две записи с данными и вывести результат на экран. 22. Создать локальную таблицу с названием TEMP и полями типа «дата/время», «длинное целое», «строка». Добавить в нее две записи с данными и вывести результат на экран. 23. Создать локальную таблицу с названием TEMP и полями типа «дата/время», «длинное целое с автонаращиванием», «динамическая строка». Добавить в нее две записи с данными и вывести результат на экран. Преобразование типов переменных 24. Объявить переменные типа FLOAT, CHAR, TINYINT. Присвоить значения, соответствующие типам. Выполнить преобразование переменных типа FLOAT, CHAR, TINYINT в INT, DATETIME, BIT соответственно и вывести результат на экран. 25. Объявить переменные типа INT, DATETIME, BIT. Присвоить значения, соответствующие типам. Выполнить преобразование переменных типа INT, DATETIME, BIT в FLOAT, CHAR, TINYINT соответственно и вывести результат на экран. 26. Объявить переменные типа NUMERIC, VARCHAR, DATETIME. Присвоить значения, соответствующие типам. Выполнить преобразование переменных типа NUMERIC, VARCHAR, DATETIME в FLOAT, CHAR, BIGINT соответственно и вывести результат на экран. 27. Объявить переменные типа BIT, NVARCHAR, DATETIME. Присвоить значения, соответствующие типам. Выполнить преобразование переменных типа BIT, NVARCHAR, DATETIME в FLOAT, INT, BIGINT соответственно и вывести результат на экран. Условная конструкция IF 28. Подсчитать количество поставщиков в таблице Deliveries. Если их в таблице от 2 до 5, то ничего не сообщать, в противном случае вывести сообщение вида "В таблице ... поставщиков" (вместо многоточия поставить точное количество поставщиков). 29. Подсчитать сумму закупок книг в таблице покупок. Если полученная сумма в диапазоне от 1000 до 5000, то ничего не сообщать, в противном случае вывести сообщение вида "Сумма закупок = …" (вместо многоточия поставить точную сумму). 30. Подсчитать среднюю стоимость закупки книг в таблице покупок. Если полученная стоимость в диапазоне от 1000 до 5000, то ничего не 99 сообщать, в противном случае вывести сообщение вида "Средняя стоимость закупки = …" (вместо многоточия поставить точную среднюю стоимость). 31. Определить минимальную стоимость закупки книг в таблице покупок. Если полученная стоимость в диапазоне от 200 до 300, то ничего не сообщать, в противном случае вывести сообщение вида "Минимальная стоимость закупки = …" (вместо многоточия поставить точную стоимость). Цикл WHILE 32. Определить количество записей в таблице Authors. Пока записей меньше 15, делать в цикле добавление записи в таблицу с автоматическим наращиванием значения ключевого поля, а вместо имени автора ставить значение «Автор неизвестен». 33. Определить количество записей в таблице издательств. Пока записей меньше 20, делать в цикле добавление записи в таблицу с автоматическим наращиванием значения ключевого поля, а вместо названия издательства ставить значение «не известно». 34. Определить количество записей в таблице поставщиков. Пока записей меньше 17, делать в цикле добавление записи в таблицу с автоматическим наращиванием значения ключевого поля, а вместо названия поставщика ставить значение «не известен». Объявление курсора 35. Создать статический курсор по данным таблицы Books с полями Code_book, Title_book. 36. Создать динамический курсор по данным таблицы поставщиков (таблица Deliveries) с полями Name_delivery, Name_company. 37. Создать статический курсор по данным таблицы Books и Authors с полями Code_book, Title_book, Name_author. 38. Создать статический курсор по данным таблицы Books и Publishing_house с полями Code_book, Title_book, Publish. Операторы для работы с курсором 39. Создать динамический курсор для чтения по данным таблицы Deliveries с полями Code_delivery, Name_delivery. Вывести данные 3-й записи. 40. Сделать текущей БД db_books. Поместить в курсор данные таблицы Purchases. Перебрать все записи таблицы Purchases. Просуммировать значения произведений полей Cost и Amount и результат 100 сохранить в переменной Sum_table, которую после суммирования вывести на экран. Закрыть и удалить из памяти курсор. 41. Объявить статический курсор по данным таблиц Authors и Books. Вывести данные 5-й записи. Использование функций для работы со строковыми переменными Базовый текст дан в отдельном файле по вариантам. Для выполнения этого блока заданий в Query Analyzer объявите переменную типа varchar и присвойте ей в качестве значения строку с базовым текстом, который будет анализироваться и/или исправляться в заданиях. 42. Удалить в тексте лишние пробелы. Лишними считаются те, которые идут непосредственно за пробелом. Подсчитать количество исправлений. 43. Подсчитать количество встреч каждой из следующих букв: "а", "в", "и", "п" – в базовом тексте. 44. Подсчитать доли процентов встречи следующих букв: "е", "о", – если суммарный процент встречаемости всех этих букв равен 100 % (т. е. процент встречаемости е % + о % равен 100 %. 45. По правилам оформления машинописных текстов перед знаками .,!?:; пробелы не ставятся, но обязательно ставятся после этих знаков. Удалите лишние пробелы. Подсчитать количество исправлений. 46. По правилам оформления машинописных текстов перед знаками .,!?:; пробелы не ставятся, но обязательно ставятся после этих знаков. Расставьте недостающие пробелы. Подсчитать количество исправлений. 47. Найти из исходного текста второе предложение и вернуть его в переменную Perem, а также вывести на экран весь исходный текст и найденное предложение. 48. Удалить из базового текста 2, 4, 6, 8 слов. 49. Удалить из базового текста 3, 5, 7, 10 слов. 50. Вставить в базовый текст вместо букв «а» - «АА». 51. Вставить в базовый текст вместо букв «е» и «о» - «ББ». 52. Поменять местами первое и последнее слова в базовом тексте. Использование функций для работы с числами 53. Вывести значение формулы (1), описав ее переменные и присвоив им произвольные значения. v v0 e 101 RT 45 . (1) 54. Подсчитать значение формулы (2), описав ее переменные и присвоив им произвольные значения. y 2 x exp(ln( x 2 )) . (2) 55. Подсчитать значение формулы (3), описав ее переменные и присвоив им произвольные значения. y sin( a) a . x 2 b3 (3) 56. Подсчитать значение формулы (4), описав ее переменные и присвоив им произвольные значения. 10 y In a n 1 . (4) 57. Подсчитать значение формулы (5), описав ее переменные и присвоив им произвольные значения. y tg (a) a bc . abc (5) 58. Подсчитать значение формулы (6), описав ее переменные и присвоив им произвольные значения. y sin( a) exp(b c) . (6) 59. Подсчитать значение формулы (7), описав ее переменные и присвоив им произвольные значения. y x 4 ln( a ) b c . (7) 60. Подсчитать значение формулы (8), описав ее переменные и присвоив им произвольные значения. y xa b3 . 102 (8) 61. Подсчитать значение формулы (9), описав ее переменные и присвоив им произвольные значения. y a cos(x) sin( x) . b2 a 2 (9) Использование функций для работы с типом дата/время 62. Вывести на экран название текущего месяца и текущее время. Записать в таблицу Purchases в поле Date_order одинаковую дату поступления, которая равна 12. 03. 2000. 63. Разобрать на отдельные составляющие текущую дату и время и вывести значения на экран в следующем порядке (вместо многоточий): 64. "Сегодня: День = …, Месяц = …, Год = …, Часов = …, Минут = …, Секунд = …" 65. В исходный текст, сохраненный в переменной Perem, после слова " время " вставить текущее время. Результат сохранить в той же переменной Perem и вывести на экран. Варианты заданий Вариант 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 2 1 3 4 5 6 7 8 9 10 6 7 8 9 10 11 12 13 14 15 6 5 7 8 9 13 18 9 14 12 11 12 13 14 15 16 17 18 19 20 12 11 13 14 15 26 27 18 29 20 16 17 18 19 20 21 22 23 24 25 16 15 17 18 19 33 28 19 24 22 Список номеров упражнений 21 26 31 36 41 46 22 27 32 37 42 47 23 28 33 38 43 48 24 29 34 39 44 49 25 30 35 40 45 50 26 31 36 41 46 51 27 32 37 42 47 52 28 33 38 43 48 53 29 34 39 44 49 54 30 35 40 45 50 55 22 26 32 36 42 46 21 25 31 35 41 45 23 27 33 37 43 47 24 28 34 38 44 48 25 29 35 39 45 49 36 43 46 53 56 63 37 38 47 48 57 58 28 29 38 39 48 49 39 34 49 44 59 54 30 32 40 42 50 52 103 51 52 53 54 55 56 57 58 59 60 52 51 53 54 55 1 2 58 61 60 56 57 58 59 60 61 62 63 64 65 56 55 57 58 59 11 4 59 65 62 61 62 63 64 65 1 2 3 4 5 62 61 63 64 65 17 10 60 3 8 Контрольные вопросы 1. 2. 3. 4. 5. 6. 7. 8. Объявление переменных в T-SQL. Типы данных в T-SQL. Правила создания и модификации структуры таблиц. Виды индексов в SQL Server и их создание. Представления: назначение, создание и использование. Виды представлений. Базовые операторы языка T-SQL. Курсоры. 104 Литература 1. Астахова И. Ф. Распределенные базы данных на примере ORACLE: Методические материалы к спецкурсу. Воронеж: Изд-во ВГУ, 2000. 40 с. 2. Остринская Л. И., Семенова И. И., Дороболюк Т. Б. Теория и практика работы с современными базами и банками данных: Учебное пособие. Омск: Изд-во СибАДИ, 2005. 250 с. 4. Семенова И. И. Сборник упражнений по стандарту SQL. Омск: Издво СибАДИ, 2005. 43 с. 5. Интернет-институт информационных технологий. www.intuit.ra. Курс «Основы SQL». 6. Мамаев Е. В. Microsoft SQL Server 2000. СПб.: БХВ-Петербург, 2005. 1280 с. 7. Семенова И. И. SQL стандарт в СУБД MS SQL SERVER, ORACLE, VFP И ACCESS: манипулирование данными. Омск: Изд-во СибАДИ, 2008. 57 с. 105 Приложение Описание баз данных, необходимых для выполнения работ Базы данных «Сеть магазинов по продажам сумок» БД состоит из 7 таблиц: 1. Seller (Продавцы) № Атрибут 1 sellerid PK Ключ 2 fio 3 shopid FK (shop.shopid) 4 rating Семантика Тип данных Ограничение целостности Уникальный код продавца int PRIMARY KEY Фамилия, имя, отчество varchar(40) NOT NULL продавца Уникальный код магазина int NOT NULL, FOREIGNKEY Рейтинг продавца int 2. Sale (Продажи) № Атрибут Ключ Семантика Тип данных 1 saleid PK Уникальный код продажи int 2 dateprod Дата продажи date 3 goodsid FK (goods. Уникальный код товара int goodsid) 4 sellerid FK (seller. sellerid) Уникальный код int продавца Выручка за товар 5 proceeds Ограничение целостности PRIMARY KEY DEFAULT NULL NOT NULL, FOREIGN KEY FOREIGN KEY Numeric(6.2) NOT NULL 3. Supplier (Поставщики) № 1 2 3 4 5 6 Атрибут Ключ supid PK supname suptown supadres rating note Семантика Уникальный код поставщика Название поставщика Город поставщика Адрес поставщика Рейтинг поставщика Примечание Тип данных int Varchar(40) Varchar(20) Varchar(40) int text Ограничение целостности PRIMARY KEY NOT NULL NOT NULL NOT NULL DEFAULT 0 DEFAULT NULL 4. Models (Модели) № Атрибут 1 model 2 descripti on Ключ Семантика PK Название модели Описание Тип данных Varchar(40) text Ограничение целостности PRIMARY KEY 5. Goods (Товары) № Атрибут 1 2 1 goodsid PK 2 3 4 5 Ключ 3 Семантика Тип данных Ограничение целостности 4 5 6 Уникальный код товара int PRIMARY KEY model FK (model. model) Название модели cost Цена закупки number Поставлено всего remain Количество в наличии 106 Varchar(40) NOT NULL, FOREIGN KEY Numeric(6.2) NOT NULL, >0 int NOT NULL, >0 int >0 Окончание табл. 1 2 3 4 5 6 5 customid FK (custom. Уникальный код заказа int NOT NULL, FOREIGN customid) KEY 6 shopid FK (shop.shopid) Уникальный код int FOREIGN KEY магазина 7 costplus Цена для покупателя Numeric(6.2) NOT NULL, CostPlus>Cost 6. Custom (Заказ) № Атрибут Ключ 1 2 3 4 customid PK Nom datecust Supid FK supid) 5 Period Семантика Тип данных Уникальный код заказа int Номер заказа int Дата заказа datetime (supplier. Уникальный код поставщика Int Время выполнения (дни) Дата поставки 4 datedel заказа Int datetime Ограничение целостности PRIMARY KEY NOT NULL, >0 NOT NULL NOT NULL, FOREIGN KEY NOT NULL, >=0 DEFAULT NULL 7. Shop (Магазин) № 1 2 3 4 Атрибут shopid nam address area Ключ PK Семантика Уникальный код магазина Наименование магазина Адрес магазина Площадь магазина Тип данных int Varchar(50) int Ограничение целостности PRIMARY KEY NOT NULL NULL NOT NULL ≥ 0 База данных книготорговой компании База данных книготорговой компании (база данных pubs в MS SQL Server) включает три таблицы, определяющие сущности: таблица authors определяет авторов, таблица publishers – издателей, а таблица titles – сами книги. Четвертая таблица titleauthor задает отношение между таблицами titles и authors. Она показывает, какие книги написал каждый из авторов. Связь между таблицами titiles и publishers определяется столбцом pub_id в данных таблицах. Ниже представлены структуры используемых таблиц. Структура таблицы authors Имя столбца Тип данных Размерность au_id au_lname au_fname phone address city state zip contract varchar varchar varchar char varchar varchar char char bit 11 40 20 12 40 20 2 5 1 Возможность значений null Нет Нет Нет Нет Да Да Да Да Нет 107 Содержательное описание Идентификатор автора Фамилия автора Имя автора Номер телефона Адрес (улица, дом, квартира) Город проживания Штат проживания Энергичность Наличие контракта Структура таблицы publishers Имя столбца Тип данных pub_id char pub_name varchar city varchar state char country varchar Размерность 4 40 20 2 30 Возможность значений null Нет Да Да Да Да Содержательное описание Идентификатор издательства (издателя) Название издательства (имя издателя) Город Штат Страна Структура таблицы titles Имя столбца Тип данных Размерность title_id title type pub_id price advance varchar varchar char char money money 6 80 12 4 8 8 Возможность значений null Нет Нет Нет Да Да Да royalty ytd_sales int int 4 4 Да Да notes pubdate varchar datetime 200 8 Да Нет Содержательное описание Идентификатор книги Название книги Тип книги Идентификатор издательства Цена Аванс (стоимость предварительной продажи) Гонорар Число книг, проданных в текущем году Замечания Дата опубликования Структура таблицы titleauthor Имя столбца Тип данных Размерность au_id title_id au_ord royaltyper 11 6 1 4 varchar varchar tinyint int Возможность значений null Нет Нет Да Да Содержательное описание Идентификатор автора книги Идентификатор книги Порядок автора в названии книги Авторский гонорар В столбце type таблицы titles используются следующие типы книг: business – книги по бизнесу, mod_cook – книги по современной кулинарии, popular_comp – книги по компьютерной тематике, psychology – книги по психологии, trad_cook – книги по традиционной кулинарии, UNDECIDED – неопределенный тип. В столбцах state таблиц authors и publishers используются следующие обозначения административных единиц США: CA – штат Калифорния, DC – округ Колумбия, IL – штат Иллинойс, IN – штат Индиана, KS – штат Канзас, MD – штат Мэриленд, MA – штат Массачусетс, MI – штат Мичиган, NY – штат Нью-Йорк, OR – штат Орегон, TN – штат Теннесси, TX – штатТехас, UT – штат Юта. В столбце country таблицы publishers используются следующие обозначения стран: France – Франция, Germany – Германия, USA – США. Домен городов, используемый в таблицах authors и publishers, включает города Ann Arbor, Berkeley, Boston, Chicago, Corvallis, Colevo, Dallas, Gary, Lawrence, Menlo Park, Munchen, Nashville, New York, Oakland, Palo Alto, Paris, Rockville, Salt Lake City, San Francisco, San Jose, Vacaville, Walnul Creek, Washington. 108 База данных книготорговой компании Таблица authors au_id 172-32-1176 au_lname White au_fname Johnson 213-46-8915 Green Marjorie 238-95-7766 Carson Cheryl 267-41-2394 O'Leary Michael 274-80-9391 Straight Dean 341-22-1782 Smith Meander 409-56-7008 Bennet Abraham 427-17-2319 Dull Ann 472-27-2349 Gringlesby Burt 486-29-1786 Locksley Charlene 527-72-3246 Greene Morningstar 648-92-1872 Blotchet-Halls Reginald 672-71-3249 Yokomoto Akiko 712-45-1867 del Castillo Innes 722-51-5454 DeFrance Michel 724-08-9931 Stringer Dirk 724-80-9391 MacFeather Stearns 756-30-7391 Karsen Livia 807-91-6654 Panteley Sylvia 846-92-7186 Hunter Sheryl 893-72-1158 McBadden Heather 899-46-2035 Ringer Anne 998-72-3567 Ringer Albert phone 408 7223 415 7020 415 7723 408 2428 415 2919 913 0462 415 9932 415 7128 707 6445 415 4620 615 2723 503 6402 415 4228 615 8275 219 9982 415 2991 415 7128 415 9219 301 8853 415 7128 707 4982 801 0752 801 0752 address city 496- 10932 Bigge Menlo Park Rd. 986- 309 63rd St. Oakland #411 548- 589 Darwin Berkeley Ln. 286- 22 Cleveland San Jose Av. #14 834- 5420 College Oakland Av. 843- 10 Lawrence Mississippi Dr. 658- 6223 Berkeley Bateman St. 836- 3410 Blonde Palo Alto St. 938- PO Box 792 Covelo state CA contract 1 CA 1 CA 1 CA 1 CA 1 KS 0 CA 1 CA 1 CA 1 585- 18 Broadway San Av. Francisco 297- 22 Graybar Nashville House Rd. 745- 55 Hillsdale Corvallis Bl. 935- 3 Silver Ct. Walnut Creek 996- 2286 Cram Ann Arbor Pl. #86 547- 3 Balding Pl. Gary CA 1 TN 0 OR 1 CA 1 MI 1 IN 1 843- 5420 Oakland Telegraph Av. 354- 44 Upland Oakland Hts. 534- 5720 Oakland McAuley St. 946- 1956 Rockville Arlington Pl. 836- 3410 Blonde Palo Alto St. 448- 301 Putnam Vacaville CA 0 CA 1 CA 1 MD 1 CA 1 CA 0 Lake UT 1 Lake UT 1 826- 67 Seventh Salt Av. City 826- 67 Seventh Salt Av. City 109 Таблица publishers pub_id 0736 0877 1389 1622 1756 9901 9952 9999 pub_name New Moon Books Binnet & Hardley Algodata Infosystems Five Lakes Publishing Ramona Publishers GGG&G Scootney Books Lucerne Publishing city Boston Washington Berkeley Chicago Dallas Mмnchen New York Paris state MA DC CA IL TX (null) NY (null) country USA USA USA USA USA Germany USA France Таблица titles title_id 1 BU1032 BU1111 BU2075 BU7832 MC2222 MC3021 MC3026 PC1035 PC8888 PC9999 PS1372 PS2091 PS2106 title type 2 3 Busy business The Executive's Database Guide Cooking with business Computers: Surreptitious Balance Sheets You Can Combat business Computer Stress! Straight Talk business About Computers Silicon Valley mod_cook Gastronomic Treats The Gourmet mod_cook Microwave The Psychology UNDECID of Computer ED Cooking But Is It User popular_co Friendly? mp Secrets of Silicon popular_co Valley mp Net Etiquette popular_co mp Computer Phobic 0877 AND Non-Phobic Individuals: Behavior Variations psychology Is Anger the psychology Enemy? Life Without Fear psychology pub_id 4 1389 price 5 19.99 advance 6 5,000.00 ytd_sales 7 4095 pubdate 8 Jun 12 1991 12:00AM 1389 11.95 5,000.00 3876 Jun 9 1991 12:00AM 0736 2.99 10,125.00 18722 1389 19.99 5,000.00 4095 0877 19.99 0.00 2032 Jun 30 1991 12:00AM Jun 22 1991 12:00AM Jun 9 1991 12:00AM 0877 2.99 15,000.00 22246 0877 (null) (null) (null) 1389 22.95 7,000.00 8780 1389 20.00 8,000.00 4095 1389 (null) (null) (null) 21.59 7,000.00 375 Oct 21 1991 12:00AM 0736 10.95 2,275.00 2045 0736 7.00 6,000.00 111 110 Jun 18 1991 12:00AM Apr 3 1996 3:45AM Jun 30 1991 12:00AM Jun 12 1994 12:00AM Apr 3 1996 3:45AM Jun 15 1991 12:00AM Oct 5 1991 12:00AM Окончание табл. 1 PS3333 PS7777 TC3218 TC4203 TC7777 2 3 Prolonged Data psychology Deprivation: Four Case Studies Emotional psychology Security: A New Algorithm Onions, Leeks, trad_cook and Garlic: Cooking Secrets of the Mediterranean Fifty Years in trad_cook Buckingham Palace Kitchens Sushi, Anyone? trad_cook 4 0736 5 19.99 6 2,000.00 4072 0736 7.99 4,000.00 3336 Jun 12 1991 12:00AM 0877 20.95 7,000.00 375 Oct 21 1991 12:00AM 0877 11.95 4,000.00 15096 Jun 12 1991 12:00AM 0877 14.99 8,000.00 4095 Jun 12 1991 12:00AM Таблица titleauthor au_id 172-32-1176 213-46-8915 213-46-8915 238-95-7766 267-41-2394 267-41-2394 274-80-9391 409-56-7008 427-17-2319 472-27-2349 486-29-1786 486-29-1786 648-92-1872 672-71-3249 712-45-1867 722-51-5454 724-80-9391 724-80-9391 756-30-7391 807-91-6654 846-92-7186 899-46-2035 899-46-2035 998-72-3567 998-72-3567 title_id PS3333 BU1032 BU2075 PC1035 BU1111 TC7777 BU7832 BU1032 PC8888 TC7777 PC9999 PS7777 TC4203 TC7777 MC2222 MC3021 BU1111 PS1372 PS1372 TC3218 PC8888 MC3021 PS2091 PS2091 PS2106 111 7 8 Jun 12 1991 12:00AM Структура таблиц БД «Университет» Имя таблицы FACULTY DEPARTMENT TEACHER SGROUP SUBJECT ROOM LECTURE Имя столбца FacNo Name Building DepNo FacNo Name Head Building Fund TchNo DepNo Name Post Tel Hiredate GrpNo DepNo Course Num Quantity Curator SbjNo Name RomNo Num Seats TchNo GrpNo SbjNo RomNo Type Day week Длина (или точность) Тип данных столбца int char char int int varchar varchar number number int int varchar varchar char datetime int int char char number int int varchar int number number int int int int varchar char number 112 Масштаб 20 5 50 50 2 7 50 20 7 1 3 2 50 4 3 25 10 1 2 Структура и описание таблиц БД DB_BOOKS Покупки (название таблицы Purchases) Название поля Code_book Date_order Code_delivery Type_purchase Cost Amount Code_purchase Тип поля Int DateTime Int Bit Money Int Int Описание поля Код закупаемой книги Дата заказа книги Код поставщика Тип закупки (опт/ розница) Стоимость единицы товара Количество экземпляров Код покупки Справочник книг (название таблицы Books) Название поля Code_book Title_book Code_author Pages Code_publish Тип поля Int Char Int Int Int Описание поля Код книги Название книги Код автора Количество страниц Код издательства Справочник авторов (название таблицы Authors) Название поля Code_author Name_author Birthday Тип поля Int Char DateTime Описание поля Код автора Фамилия, имя, отчество автора Дата рождения 113 Справочник поставщиков (название таблицы Deliveries) Название поля Code_delivery Name_delivery Name_company Address Phone INN Тип поля Int Char Char Char Numeric Char Описание поля Код поставщика Фамилия, имя, отчество ответственного лица Название компании-поставщика Юридический адрес Телефон контактный ИНН Справочник издательств (название таблицы Publishing_house) Название поля Code_publish Publish City Тип поля Int Char Char 114 Описание поля Код издательства Издательство Город