Лабораторная работа № 3 - Северо

advertisement
БАЗЫ ДАННЫХ
Методические указания
к выполнению лабораторных работ
для студентов, обучающихся по направлению
подготовки 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
RT
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 bc .
abc
(5)
58. Подсчитать значение формулы (6), описав ее переменные и
присвоив им произвольные значения.
y  sin( a)  exp(b  c) .
(6)
59. Подсчитать значение формулы (7), описав ее переменные и
присвоив им произвольные значения.
y  x 4  ln( a )  b  c .
(7)
60. Подсчитать значение формулы (8), описав ее переменные и
присвоив им произвольные значения.
y
xa
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
Описание поля
Код издательства
Издательство
Город
Download