3 8 9 5 Министерство образования Республики Беларусь БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра «Системы автоматизированного проектирования» БАЗЫ ДАННЫХ Лабораторный практикум М и н с к Б Н Т У 2 0 1 0 Министерство образования Республики Беларусь БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра «Системы автоматизированного проектирования» БАЗЫ ДАННЫХ Лабораторный практикум для студентов специализации 1-40 01 02-01 «Информационные технологии в производстве и управлении» Минск БНТУ 2010 УДК 004.65(076.5)(075.8) -ББК 22.18я2 Б 17 Составители: канд. техн. наук В.А. Кочуров, Ю.О. Герман Рецензенты: доцент кафедры САПР БНТУ, канд. техн. наук В. В. Напрасников, доцент кафедры ИТАС БГУИР, канд. техн. наук О.В. Герман Б 1 7 Базы данных: лабораторный практикум для студентов специализации 1-40 01 02-01 «Информационные технологии в производстве и управлении» / сост.: В.А. Кочуров, Ю.О. Герман. - Минск: БНТУ, 2010. - 90 с. Настоящий материал предназначен для изучения дисциплин: «Базы дан- ных», «Базы данных и знаний в САПР». Издание содержит шесть лабора- торных работ, которые проведут Вас шаг за шагом через процесс создания и использования базы данных на платформе Microsoft SQL Server 2005-2008 и поможет: • создать необходимые учетные записи; • определить права доступа; • создать структуру данных, обладающую ссылочной целостностью и защищенную от несанкционированного доступа; • заполнить созданные таблицы данными; • изучить приемы извлечения данных из базы данных. ISBN 978-985-525-417-2 © БНТУ, 2010 СОДЕРЖАНИЕ ЛАБОРАТОРНАЯ РАБОТА № 1 ОСНОВЫ РАБОТЫ В MS SQL SERVER 6 1 Цель работы 6 2 Задание 6 3 Порядок выполнения работы 6 3.1 Открытие среды SQL Server Management Studio 6 3.2 Соединение с SQL Server 7 3.3 Создание учетной записи 8 3.4 Создание базы данных 9 3.5 Создание нового пользователя 10 3.6 Соединение с базой данных 12 3.7 Подключение к базе данных 14 3.8 Создание структуры базы данных 14 3.9 Создание таблиц в конструкторе таблиц 15 3.10 Резервное копирование базы данных 21 4 Контрольные вопросы 23 ЛАБОРАТОРНАЯ РАБОТА № 2 АРХИТЕКТУРА БАЗ ДАННЫХ СЕРВЕРА SQL 24 1 Цель работы 24 2 Задание 24 3 Порядок выполнения работы 26 3.1 Создание диаграммы 26 3.2 Создание индексов 30 3.3 Установление отношений между таблицами базы данных Борей 33 3.4 Ввод данных посредством графического интерфейса 36 4 Контрольные вопросы 37 ЛАБОРАТОРНАЯ РАБОТА № 3 СОЗДАНИЕ СЦЕНАРИЕВ В СРЕДЕ MANAGEMENT STUDIO 38 1 Цель работы 38 2 Задание 38 3 Порядок выполнения работы 38 3 3.1 Ввод данных посредством выполнения инструкции INSERT...38 3.2 Обновление (изменение) данных 40 3.3 Удаление данных 41 4 Контрольные вопросы 42 ЛАБОРАТОРНАЯ РАБОТА № 4 ОБЗОР ЯЗЫКА TRANSACT SQL 44 1 Цель работы 44 2 Задание 44 3 Порядок выполнения работы .....44 3.1 Создание и выполнение запроса к базе данных посредством конструктора запросов и представлений 44 3.2 Практическое изучение приемов применения условий поиска..47 3.2.1 Оператор SELECT 47 3.2.2 Условия поиска 48 3.2.3 Примеры выполнения поиска 50 4 Контрольные вопросы ...59 ЛАБОРАТОРНАЯ РАБОТА № 5 ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ В ЯЗЫКЕ SQL 60 1 Цель работы 60 2 Задание 60 3 Порядок выполнения работы 60 3.1 Использование подзапросов 60 3.2 Применение кванторов в подзапросах 62 3.3 Применение агрегатных функций 64 3.4 Группирование и упорядочение результата запроса 66 3.4.1 Применение предложения ORDER BY 66 3.4.2 Применение предложения GROUP BY 68 3.4.3 Применение предложения HAVING 69 4 Контрольные вопросы 71 ЛАБОРАТОРНАЯ РАБОТА № 6 СОЗДАНИЕ ПРЕДСТАВЛЕНИЙ 72 1 Цель работы 72 2 Задание 72 3 Порядок выполнения работы 72 4 3.1 Создание представлений 72 4 Контрольные вопросы 76 ЛИТЕРАТУРА 77 ПРИЛОЖЕНИЯ 78 Приложение 1. Сценарий заполнения данными базы данных BOREI 78 Приложение 2. Сценарий обновления данных в базе данных Borei 89 5 ЛАБОРАТОРНАЯ РАБОТА №1 ОСНОВЫ РАБОТЫ В MS SQL SERVER 1 Цель работы 1) Изучить интерфейс среды управления SQL сервером - Management Studio. 2) Изучить правила создания таблиц посредством конструктора баз данных в MS SQL Server. 3) Получить начальные практические навыки создания базы данных посредством графического интерфейса среды Management Studio. 2 Задание 1) Создайте учетную запись пользователя MS SQL Server. 2) Создайте новую базу данных. 3) Создайте нового пользователя базы данных. 4) Соединитесь с базой данных под учетной записью пользова- теля. 5) Создайте структуру базы в соответствии с порядком выпол- нения работы. 6) Выполните резервное копирование базы данных. 3 Порядок выполнения работы 3.1 Открытие среды SQL Server Management Studio * В меню Пуск последовательно выберите пункты: Все про- граммы, Microsoft SQL Server, а затем - команду Среда SQL Server Management Studio. * В диалогом окне Соединение с сервером подтвердите задан- ные по умолчанию параметры и нажмите кнопку Подклю- 6 читься. Для соединения необходимо, чтобы поле Имя сервера содержало имя компьютера, на котором установлен SQL Server. Если компонент Database Engine представляет собой именованный экземпляр, то поле «Имя сервера» должно также содержать имя экземпляра в формате <имя_компьютера>\<имя_экземпляра>. 3.2 Соединение с SQL Server 1. Открыть приложение Management Studio путём его выбора из папки Microsoft SQL Server стартового меню (Start Menu —> Microsoft SQL Server 2005 —• SQL Server Management Studio). В данный момент мы соединяемся с сервером как администратор Windows (рис. 1.1). L 8 C o n n e c t t o S e r v e r Microsoft SQL Server 2005 Serve Jyps Server name: Шл 1 OafabassEriiJ-fe MICR 0 S 0 F-A4D BOASO LEXPR E S J Authentication: •hpi n am° ; Windows Authentication 'MICROSO-A4DBOA«wWn -V'-'Mif^ '5'' | - ;•— f l ЙещегпЬь' password. в „.i j Cancel J La*™». J Р и с . 1.1. С о е д и н е н и е с S Q L S e r v e r 2 0 0 5 2. Выбрать имя сервера (в данном случае это Microsof- A4DB07\SQLEXPRESS). 7 MS SQL Server использует два режима аутентификации: аутентификацию Windows и аутентификацию MS SQL Server (SQL Server authentication). Для аутентификации по умолчанию используется аутентификация Windows. Windows Authentification mode (Режим аутентификации Windows) — это режим, который использует для подключения к серверу только логины Windows (рис. 1.1). В этом случае пользователям нет необходимости вводить какие-то пароли при подключении к SQL Server, если они уже вошли в сеть Windows. Для использования аутентификации SQL Server вначале необ- ходимо создать учетную запись в самом SQL Server. В отличие от логинов Windows, логины SQL Server - это самостоятельные учет- ные записи со своими именами и паролями, информация о которых хранится в системной базе данных master. При подключении к сер- веру при помощи логина SQL Server вам придется явно указать имя логина и пароль. 3.3 Создание учетной записи Создайте новую учетную запись с именем STUDENT. В Man- agement Studio список учетных записей, сконфигурированных на сервере, содержится в папке \Security\Logins. Чтобы добавить но- вую учетную запись, необходимо выделить узел Logins в контекст- ном меню и выбрать пункт New Login. В открывшемся окне (рис. 1.2) в поле Login name введите STUDENT. Далее выберите переключатель SQL Server authentica- tion и в поле Password наберите goodstud. Снимите флажок User must change password at next login. Остальные поля оставьте без изменений. 8 General g Swvet Roles j ? User Mappng J f Securabies Status ^ S«ip« - Ш H e * Login цате О 5t fndw« authenticate*! 0 SQLServer authentication Password. £onfiim pas word: Server MICROSOF-A4DB07\SQLEXPRE Connection: MICRQS0F-A4DB07\Admin Ready @ Enforce password poficy . 0 Enforce password epilation Q iise» must change password at next login Certificate name: f kappetf to DefauH abase: Default language: ; master ы [ , ш Г...... Q*?. .-.H i. Су** Рис. 1.2. Создание новой учетной записи 3.4 Создание базы данных Базу данных может создавать только пользователь с права- ми администратора. Выберите в контекстном меню папки Data- bases команду New Database. В поле Database name введите имя создаваемой базы данных (БД) - Borei (рис. 1.3). Здесь также мож- но изменить путь сохранения создаваемой БД. Обратите внимание, что создаётся пустая база данных (контейнер). 9 Database цепе: Qwner Г J ysv fuf»«.n*t Database |Цн: Lopcal Name Fie Type ftegoup b o m Data PRIMARY bora i jog Log AJogrwrth Q I By lOpercert.umwWctedgroA'tf Apptcable 1 By lOpereert .umwMctedgrowt l Server. ovgeiman1960 Corned юг ovge^rian1963'iL*a H H K t V Reedy L J B L I J 'K™ I I Го»ч~"1 =di Рис. 1.3. Создание новой базы данных После создания БД окно Object Explorer обновится. В ветке Da- tabases появится новая база данных BOREI. Эта база данных при- надлежит пользователю по имени sysadmiu (системный админист- ратор). 3.5 Создание нового пользователя Создание пользователя в SQL Server 2005 осуществляется по- средством создания учетной записи. Пользователи базы данных - это специальные объекты, которые создаются на уровне базы дан- 10 ных и используются для предоставления разрешений в базе данных (на таблицы, представления, хранимые процедуры). Логины и поль- зователи БД - это совершенно разные объекты. Чтобы добавить в базу Borei нового пользователя, надо: 1. выделить узел \Databases\ BORER Security\ Users и в контек- стном меню выбрать пункт New User. 2. В открывшемся окне в поля User Name и Login name ввести имя - Student. 3. В СПИСКЕ Database role membership установить флажок db_owner—»ОК (рис. 1.4). Таким образом, на основе учетной записи Student будет соз- дан новый пользователь для БД Borei с правами владельца этой базы данных. Now Рис. 1.4. Добавление в БД нового пользователя 11 3.6 Соединение с базой данных Чтобы пользователь Student мог подсоединиться к созданной ба- зе данных с целью создания её структуры, следует выполнить не- сколько подготовительных действий. 1. Войдите в окно свойств SQL Server: в окне Object Explorer вы- берите корневой элемент (название машины, на которой запущен сервер) и вызовите для него контекстное меню. Выберите пункт Properties. Откроется окно Server Properties (рис. 1.5). ШШРгбщШ МГЙМаГ А*!>П(Г7\рШШГ* $ Genaal Memory Proceuort Secvrty Connections D«abaif Settings J * Advanced 1 Ua>jwec I Metwjj; I P i u y : I Fi» i'MCty m Caiviw» ;,4. •>*«» К.ФХ-.Х E«4i»M . NVWiK-.МЬ шшК .11.111.11 II * » . » * ) t'pfa.JittA '••*l,Vv MIOttSOFvMOBOAAdmr fi )Lfn мпiwc%on nroacrtm Nam* Ы (hi vwa and iruiaica. Changes lo sevei ptopeitm and settings may eHect (he paifonnance. secuity. and av*laUKy ot №w SQL Setvei instance Befae makng any Kich change», consul the ptodid documentation s s i f L — . Рис.1.5. Окно Server Properties 2. Выберите способ аутентификации: на вкладке Security в раз- деле Server authentication выберите опцию SQL Server and Win- dows Authentication mode. 12 3. На вкладке Permissions нажмите кнопку Add. Откроется окно Select Logins or Roles—* Browse. 4. Определите учётную запись, под которой в последующем мы будем заходить на сервер: в открывшемся окне Browse for Objects в списке Matching objects выберите пункт [Student], поставьте возле него галочку —* ОК. В окне Select Logins or Roles в поле Enter the object names to select появится текст [Student] —• Ok. Теперь в окне Server Properties на вкладке Permissions в списке Logins or roles появился пункт Student (в конце списка). Выберите его. 5. Устанавливаем права доступа к серверу для выбранной учётной записи: в списке Explicit permissions for Student ставим птички в колон- ке Grant возле пунктов Authenticate server и Connect SQL (рис. 1.6). f Geneiei Метяу Proc « n o t £ Cowwcborn * * DatabeaeSetlnga ш Advanced J» Регяммоги | • Она • штат 11 Logne oi tdet: Nam % »WS_SQUtAenbcataCertfcateltll , 1 ««MS JQLBepfcationS,r«gCei«kalem " MWS.SOLBaracSvvnoCertifcala»» DUILTIN\AoMw«4CTparotM BUIUlNWtMWCeafew _MlcnoSOF*«BOASQlServo.2aWSSQmieitMfCflOSOFA«OB AUTHORimSYSTEM toifc SAjdart Login Login Login Login Login Login Login Server rale Logn i.Ets-^'^'i.Ji' — '.i. a ; > я v i "Й1- Ум' (Z - ' j Га»4?? J ЕирЫ йеяп»»оп» tat Studert ! Alter any event not* Alter any inked terver Alter any logn i S M K l : Read» AJte tetttigt AJIef Часе Authenticate terv« Gtartot Mtcn0S0FA4DB0AA4iwi M!CnOSOFA4DBOAAdmr. MICROSOFA40B07VAdm MICH0SGFA«DM17\Adnwi MICROSOFA4DBOAAdmn MICROS()FA4DB07\A4i»i MIC80S0FA4OB07SAdtwi MICH0SCIFA4DB07\Adrwi D a a о • • • With Giant • О • • • о о • М И Н «WOSOF^DB,™* B O B » ! Conned SQL м В • ' * i . a О о • • • D П Q f : a i n*j Cancel j Рис. 1.6. Установление прав доступа к серверу 13 6. Заканчиваем подготовительные действия: нажимаем ОК в окне Server Properties. Появится предупреждение о том, что сервер необхо- димо перезагрузить, чтобы изменения вступили в силу. Нажимаем ОК. 7. Для перезагрузки сервера в окне Object Explorer в корневом элементе вызываем контекстное меню и выбираем пункт Restart —> Yes. Будет произведен перезапуск службы сервера. Примечание. Выполнять пункты 1-2 надо один раз. Пункты 3-7 необходимо выполнять для каждой учётной записи (нового логина). 3.7 Подключение к базе данных Чтобы выполнять действия, описанные ниже, нужно быть под- ключенным к серверу под учетной записью Student или sysadmin. Для соединения с сервером под учетной записью Student, надо выполнить следующие шаги: • зайдите в пункт меню File —»Connect Object Explorer; • в поле Server Name введите имя сервера (оставьте то, что вы- водится по умолчанию); • в поле Authentication выберите аутентификацию SQL Server; • в поле Login введите Student, в поле Password - goodstud. 3.8 Создание структуры базы данных Создание учебной базы данных будет выполняться на основе из- вестного из СУБД ACCESS примера BOREI. База данных BOREI является весьма характерной для торговли. Предположим, что Вам поручено разработать базу данных некото- рой компании. В процессе создания информационной модели (data modeling) Вы определите, как минимум, следующие объекты (сущ- ности или абстрактные объекты): клиенты (clients), заказы клиентов (orders), заказано или сведения о заказе (ordered), собственно това- ры (goods), сотрудники компании (employees), доставка (deliveries), а также поставщиков сырья (suppliers), типы или категории товаров (types). При нашем дальнейшем изучении можно увидеть, что база 14 данных BOREI содержит восемь таблиц в точности соответствую- щих вышеприведённым объектам (рис. 1.7). СЙ Л « о » Омское те» — т « к Я-цЪс i— i - Рис. 1.7. Упрощённая диаграмма базы данных BOREI 3.9 Создание таблиц в конструкторе таблиц Каждая таблица может содержать до 1024 столбцов. Имена таб- лиц и столбцов должны соответствовать правилам для идентифика- торов: они (имена столбцов) должны быть уникальными в пределах таблицы, другими словами, можно использовать одинаковые имена столбцов в разных таблицах одной БД. Назначаемые данным типы должны выбираться из типов данных, используемых MS SQL Server. Все действия по созданию таблицы можно выполнить в кон- структоре таблиц: 1. Щелкните правой кнопкой узел таблиц базы данных в Обо- зревателе объектов (Object Explorer) и нажмите кнопку Создать 15 таблицу (New Table). В появившемся окне следует ввести следую- щую информацию: • Column Name - имя поля; • Data Туре - тип поля (см. Конспект лекций п. 2.3); • Allow Nulls - разрешение не вводить данные в столбец. Зна- чение NULL обозначает факт отсутствия какого-либо значения. 2. Заносим в поля значения, как показано на рисунке 1.8. Table -dbe.Table_l*i Summary Column Name Data Type Allow Nulls ^ Codebupphers n t • Title varchar(40) • AddressTo varchar(30) • Post varchar(30) • Address varchar(60) • City varchar(lS) • Ilndex varchar<10) • Country varchar(20) • Telephone varchar(24) • Fax varchar(24) 0 Рис. 1.8. Создание таблицы Suppliers (Поставщики) 3. Сделаем поле CodeSuppliers ключевым. Для создания первичного ключа: • в конструкторе таблиц щелкните селектор строк для столбца базы данных, который необходимо определить в качестве первичного ключа. Чтобы выделить несколько столбцов, на- жмите и удерживайте клавишу CTRL и щелкните селекторы строк для остальных столбцов. • Щелкните правой кнопкой мыши селектор строк столбца и выберите команду Задать первичный ключ. Будет автома- тически создан индекс первичного ключа с именем, состоя- щим из «РК_» и имени таблицы; его можно найти в диалого- вом окне Индексы и ключи. 16 Для изменении первичного ключа: • откройте в конструкторе таблиц таблицу, чей первичный ключ необходимо изменить, правой кнопкой мыши щелкните Конструктор таблиц и выберите пункт Индексы/Ключи в контекстном меню. • В диалоговом окне Индексы/Ключи выберите индекс первич- ного ключа из списка Выберите первичный/уникальный ключ или индекс. • Выполните действие, руководствуясь таблицей 1.1. Таблица 1.1 - Изменение первичного ключа Действие Процедура выполнения Переименование первичного ключа Введите новое имя в поле Имя. Убедитесь, что новое имя не совпадает с именами в списке Выбранный первич- ный/уникальный ключ или индекс. Установка пара- метра кластериза- ции Выберите Создать как CLUSTERED, и из раскрывающегося списка выберите нуж- ный параметр. В таблице может существо- вать только один кластеризованный ин- декс. Если этот параметр недоступен для выбранного индекса, то сначала снимите этот флажок в существующем кластеризо- ванном индексе. Определение ко- эффициента за- полнения Разверните категорию Определение за- полнения и введите целое число от 0 до ] 00 в поле Коэффициент заполнения. Изменение по- рядка столбцов Выберите Столбцы и нажмите троеточие (...) справа от свойства. В диалоговом окне Столбцы индекса удалите столбцы из пер- вичного ключа. Затем снова добавьте эти столбцы в необходимом порядке. Чтобы удалить столбец из ключа, просто удалите имя столбца из списка имен Столбец. 17 4. В нижнем окне (Column properties) можно указать следующую информацию: • Description - описание столбца (вводится произвольная ин- формация); • Default Value - значение в столбце, вводимое по умолчанию (если пользователь не ввел данные в столбец); • Identity - свойство IDENTITY обычно используется для ав- томатического присвоения уникальных идентификационных номеров или первичных ключей. Примечание. Свойство IDENTITY, может использоваться только с целочисленными значениями. • Identity Seed - начальное значение счетчика записей, которое присваивается первой записи, загружаемой в таблицу; • Identity Increment - значение приращения, которое прибав- ляется к значению идентификатора предыдущей загруженной строки. Необходимо указывать либо оба аргумента (и seed, и increment), либо не указывать ни одного из них. Если ничего не указано, применяются значения по умолчанию (1,1). 5. Набранную таблицу следует сохранить, используя для этого кнопку S S и введя имя Suppliers. Создание таблицы "клиенты" (Clients) Создадим таблицу клиенты в соответствии с вышеприведённым сценарием и нижеследующими данными: C o d e C l i e n t i n t NOT NULL, T i t l e V A R C H A R ( 4 0 ) NOT NULL, A d d r e s s T o V A R C H A R ( 3 0 ) NOT NULL, P o s t V A R C H A R ( 3 0 ) NOT NULL, A d d r e s s V A R C H A R ( 6 0 ) NOT NULL, C i t y V A R C H A R ( 1 5 ) NOT NULL, I l n d e x V A R C H A R ( 1 0 ) , C o u n t r y V A R C H A R ( 2 0 ) NOT NULL, T e l e p h o n e V A R C H A R ( 2 4 ) NOT NULL, F a x V A R C H A R ( 2 4 ) Создадим первичный ключ по полю CodeClient. Для этого выде- 18 лим его и в контекстном меню выберем пункт Set Primary key. Сохраним описание таблицы посредством кнопки Й.1 и введя имя Clients. Создание таблицы "заказы" (Orders) Аналогичным образом создадим таблицу заказы в соответствии с нижеприведёнными данными. Зададим для неё первичный ключ по полю CodeOrder. C o d e O r d e r i n t NOT N U L L , C o d e C l i e n t i n t NOT N U L L , C l i e n t V A R C H A R ( 4 0 ) , C o d e E m p l o y e e i n t NOT N U L L , E m p l o y e e V A R C H A R ( 3 0 ) , D a t e A c c o m o d a t i o n d a t e t i m e , D a t e P u r p o s e d a t e t i m e , D a t e E x e c u t i o n d a t e t i m e , C o d e D e l i v e r y i n t NOT NULL, D e l i v e r y V A R C H A R ( 4 0 ) , C o s t D e l i v e r y n u m e r i c ( 1 0 , 3 ) , T i t l e A d d r e s s e e V A R C H A R ( 4 0 ) NOT NULL, A d d r e s s A d d r e s s e e V A R C H A R ( 6 0 ) NOT NULL, C i t y A d d r e s s e e V A R C H A R ( 1 5 ) NOT NULL, I n d e x A d d r e s s e e V A R C H A R ( 1 0 ) NOT NULL, C o u n t r y A d d r e s s e e V A R C H A R ( 2 0 ) NOT NULL Создание таблицы " товары " (Goods) Теперь можно создать таблицу "товары" (goods) с первичным ключом по полю CodeGoods. C o d e G o o d s M a r k C o d e S u p p l i e r s S u p p l i e r C o d e T y p e C a t e g o r y P r i c e I n W a r e h o u s e E x p e c t e d M i n i m a l S t o c k D e l i v e r i e s S t o p p e d 19 i n t NOT N U L L , V A R C H A R ( 4 0 ) NOT N U L L , i n t NOT NULL, V A R C H A R ( 4 0 ) , i n t NOT NULL, V A R C H A R ( 3 0 ) , n u m e r i c ( 1 0 , 3 ) , i n t , i n t , i n t , v a r c h a r ( 3 ) Создание таблицы "Типы или категории" (Types) Подобным образом создадим таблицу "Типы или категории" со- гласно нижеследующим данным с первичным ключом CodeType. C o d e T y p e i n t NOT NULL, C a t e g o r y V A R C H A R ( 3 0 ) NOT N U L L , D e s c r i p t i o n t e x t Создание таблицы "заказано" (Ordered) Таким же образом создадим таблицу "заказано" в соответствии с нижеприведёнными данными. Здесь первичный ключ составной, т.к. состоит из двух полей: CodeOrder, CodeGoods. C o d e O r d e r i n t NOT NULL, C o d e G o o d s i n t NOT NULL, G o o d s V A R C H A R ( 4 0 ) , D i s c o u n t n u m e r i c ( 5 , 4 ) , P r i c e i n t Создание таблицы "сотрудники" (Employees) Согласно следующим данным создадим таблицу сотрудников компании с первичным ключом CodeEmployee. C o d e E m p l o y e e i n t NOT NULL S u r N a m e V A R C H A R ( 2 0 ) NOT N U L L , N a m e V A R C H A R ( 1 0 ) NOT N U L L , P o s t V A R C H A R ( 3 0 ) NOT N U L L , R e f e r e n c e V A R C H A R ( 2 5 ) NOT N U L L , D a t e B i r t h d a t e t i m e , D a t e H i r i n g d a t e t i m e , A d d r e s s V A R C H A R ( 6 0 ) NOT NULL, C i t y V A R C H A R ( 1 5 ) NOT N U L L , I l n d e x V A R C H A R ( 1 0 ) NOT NULL, C o u n t r y V A R C H A R ( 2 0 ) NOT N U L L , H o m e T e l e p h o n e V A R C H A R ( 2 4 ) NOT NULL, A d d i t i o n a l VARCHAR(2 4 ) NOT N U L L , P h o t o t e x t , N o t e t e x t , S u b m i t s V A R C H A R ( 3 0 ) 20 Создание таблицы "доставка" (Deliveries) Также по нижеследующим данным создадим таблицу доставка с первичным ключом CodeDelivery. 3.10 Резервное копирование базы данных Данные, хранящиеся в базах данных, являются стратегической ценностью любой компании, поэтому их сохранность - наивысший приоритет! 1. Выберем в контекстном меню базы данных BOREI пункт Tasks —• Back Up... 2. В открывшемся диалоге Back Up Database - BOREI (рис. 1.9) установим некоторые параметры: • Database — BOREI (это база данных для резервного копиро- вания); • Backup type — Full (тип резервной копии — полный; для пер- вого резервного копирования применяется только такой; если ре- зервная копия уже имеется и вы не желаете создавать заново пол- ную копию, а внести изменения в старую, выберите пункт Differen- tial); • Backup component — Database; • Name — поле для ввода имени резервной копии: можно оста- вить по умолчанию; • Back up to: — Disk. C o d e D e l i v e r y T i t l e T e l e p h o n e i n t NOT N U L L , V A R C H A R ( 4 0 ) NOT NULL V A R C H A R ( 2 4 ) NOT NULL 21 в Bijck Up Database- BORf 1 P T W ® 7 ' • f C™. _ f t L1~L, > | s # W P I i Sow * I j Help J Source Database ttecoveyirode*: Backup type Backup to«ponet*: ® Da&sse О ftes ггчЗЙедю^Р» Backup юй Name Description Backup sat «p re U\iiT > lSl! J ' j ;rj V 'BOREI Ful Database Sarxua ® fUer. i® О On. aerver BA3GINS Connection: Deiiinatan Back up to © DtsK- STUDENT m ReMy < , • • ••»! Рис. 1.9. Диалоговое окно Back Up Database - BOREI 3. Нажмите кнопку Add... в этом диалоге. Откроется диалоговое окно Select Backup Destination (рис. 1.10). В нем в поле File name введите имя файла, в который будет выполнено резервное копиро- вание (у нас это «C:\BOREI\BACKUPS\backupl.bak»). 22 Select Backup Destination Select the Й е ; й backup dWiAfor the backup destivstion You c » o йв«е backup devices fcrfiequenjy used files ОмЬпадаа ondisfc ; ; * , С \BOR0\BAO= 0; • Expected >= 0; • MinimalStock >= 0; • (DeliveriesStopped = 'NO') OR (DeliveriesStopped = 'YES'). 6. Выполнить резервное копирование базы данных. 25 3 Порядок выполнения работы 3.1 Создание диаграммы Для создания новой диаграммы базы данных: 1. в обозревателе объектов щелкните правой кнопкой мыши папку Диаграммы баз данных или любую диаграмму в этой папке. 2. Выберите в контекстном меню значок Создать диаграмму базы данных. Появится диалоговое окно Добавить табли- цу 3. Выберите последовательно из списка Таблицы все таблицы базы данных Борей, созданные в предыдущей лабораторной работе, и, выбирая опцию Добавить, перенесите их на созда- ваемую диаграмму. Эти таблицы отобразятся в графическом виде в новой диаграмме базы данных. 4. Меню Диаграммы баз данных будет добавлено в главное меню, и при этом откроется область конструктора. 5. Продолжайте добавлять и удалять таблицы, изменять суще- ствующие таблицы и изменять связи между таблицами до за- вершения новой диаграммы базы данных. Для открытия существующей диаграммы базы данных: 1. в обозревателе объектов раскройте папку Диаграммы баз данных. 2. Дважды щелкните имя схемы базы данных, которую нужно открыть, -ИЛИ- 3. щелкните правой кнопкой мыши имя схемы базы данных, которую нужно открыть, а затем выберите Создать диа- грамму базы данных. 4. Схема базы данных открывается в конструкторе схем базы данных, где можно изменить схему. Примечание. Только владелец диаграммы или член роли базы данных db_owner может открыть диаграмму. Для сохранения диаграммы базы данных: 1. в меню Файл выберите Сохранить . 2. Если это новая диаграмма, которую еще ни разу не сохраня- ли, откроется диалоговое окно Выбор имени Введите имя диаграммы. 3. Если были выполнены изменения в таблицах существующей диаграммы, откроется диалоговое окно Сохранить, в кото- ром отображается список изменений, которые будут сохра- нены в базе данных при сохранении диаграммы. 4. Нажмите кнопку Да (или ОК, если это новая диаграмма) для обновления базы в соответствии с диаграммой. При сохранении диаграммы базы данных будут сохранены все изменения, включая изменения, выполненные в таблицах, столбцах и других ее объектах. Если нет необходимости сохранять все изменения, внесенные в диаграмму базы данных, можно сохранить определенную таб- лицу или набор таблиц: 1. в диаграмме базы данных выберите таблицы для сохранения. 2. В меню Файл выберите Сохранить выделенное. В диалого- вом окне Сохранить откроется список таблиц, которые бу- дут обновлены в базе данных при сохранении выделенных таблиц. 3. Выберите Сохранить текстовый файл, чтобы перед про- должением сохранить список таблиц в текстовом файле в ка- талоге проекта. 4. В диалоговом окне Сохранить проверьте список таблиц и нажмите кнопку Да, чтобы их сохранить. Примечание. Список таблиц может содержать и другие таб- лицы, кроме выделенных. Например, если изменить тип данных столбца, связанного с другой таблицей, в этот список будут вклю- чены обе таблицы. Для вставки новой таблицы в диаграмму: 1. убедитесь, что осуществлено подключение к базе данных, в которой требуется создать таблицу. 27 2. Нажмите на панели инструментов кнопку Создать таблицу, -или- ицелкните правой кнопкой мыши диаграмму и выберите пункт Создать таблицу. 3. Измените или сохраните имя таблицы, назначенное систе- мой, в диалоговом окне Выбор имени и нажмите кнопку ОК. Откроется стандартный конструктор таблиц, в котором уже известным нам образом можно определить свойства столбцов и ограничений. 4. При сохранении диаграммы таблица будет создана в базе данных. Для добавления существующей таблицы в диаграмму: 1. убедитесь, что осуществлено подключение к той базе дан- ных, таблицы которой требуется изменить. 2. Выберите таблицу в папке Таблицы. 3. Перетащите таблицу в диаграмму базы данных. 4. Отпустите кнопку мыши. Таблица будет вставлена в диа- грамму. Если вставляемая таблица имеет связи с уже сущест- вующими на диаграмме таблицами, то они будут автомати- чески отображены. Для создания отношения «многие ко многим» между табли- цами: 1. добавьте таблицы, которые необходимо связать отношением «многие ко многим» в диаграмму базы данных. 2. Создайте третью таблицу, щелкнув диаграмму правой кноп- кой мыши и выбрав Создать таблицу. Эта таблица станет связующей. 3. В диалоговом окне Выбор имени измените имя, назначенное системой. Например, связующую таблицу для таблиц titles и authors можно назвать titleauthors. 4. Скопируйте столбцы первичных ключей обеих таблиц в свя- зующую таблицу. В эту таблицу можно добавить другие столбцы, как в любую другую таблицу. 5. Создайте первичный ключ в связующей таблице так, чтобы 28 он содержал все столбцы первичных ключей исходных таб- лиц. 6. Определите отношение «один ко многим» между каждой из первоначальных таблиц и связующей таблицей. Связующая таблица должна находиться на стороне «многих» обоих от- ношений. Для создания рефлексивной евши: 1. в диаграмме базы данных щелкните переключатель строк для столбца базы данных, который необходимо связать с другим столбцом, и перетаскивайте указатель за пределы таблицы, пока не появится линия. 2. Перетащите линию назад к выбранной таблице. 3. Отпустите кнопку мыши. Появится диалоговое окно Табли- цы и столбцы. 4. Выберите столбец внешнего ключа и таблицу первичного ключа, с которой необходимо установить связь. 5. Дважды нажмите кнопку ОК, чтобы создать связь. Можно скопировать таблицу из одной диаграммы базы данных в другую в той же самой базе данных. Копирование таблицы из одной диаграммы базы данных в другую диаграмму добавляет ссылку на таблицу во второй диаграмме. При этом таблица не будет продуб- лирована в базе данных. Например, при копировании таблицы authors из одной диаграммы базы данных в другую, каждая диа- грамма будет ссылаться на одну и ту же таблицу authors в базе дан- ных. Для копирования таблицы из одной диаграммы в другую: 1. убедитесь в наличии соединения с базой данных, таблицу ко- торой необходимо скопировать. 2. Откройте исходные и целевые диаграммы базы данных и в исходной диаграмме выберите таблицу, которую необходимо скопировать в целевую диаграмму. 3. Нажмите кнопку Копировать на панели инструментов или в меню Схема базы данных (или меню Правка) сделайте вы- бор Копировать диаграмму в буфер обмена. Это действие помещает выбранное определение таблицы в буфер обмена. 4. Переключитесь к целевой диаграмме. Эта диаграмма должна быть в той же самой базе данных, где и исходная диаграмма. 5. Нажмите кнопку Вставить на панели инструментов или ме- ню Правка выберите Вставить. Содержимое буфера обмена появится в новом месте и останется выделенным, пока не бу- дет выполнен щелчок где-либо в другом месте. Если сущест- вуют связи между выбранными таблицами и другими табли- цами в целевой диаграмме, линии связи будут нарисованы автоматически. При редактировании таблицы в любой диаграмме изменения бу- дут отражены в обеих диаграммах. Точно так же при сохранении таблицы в любой диаграмме таблица больше не считается изменен- ной в любой диаграмме. 3.2 Создание индексов Индексы предназначены для ускорения доступа к данным в таб- лице базы данных. Индекс можно создать, выбрав один или не- сколько столбцов таблицы, по которым необходимо выполнять по- иск. Индексом можно будет пользоваться сразу же после сохране- ния таблицы. Для создания индекса: 1. в обозревателе объектов щелкните правой кнопкой мыши таблицу, для которой хотите создать полнотекстовый индекс и выберите Проект (Изменить в версии с пакетом обновле- ния 1 (SP1) или более ранней версии). Таблица откроется в Конструкторе таблиц. 2. В меню Конструктора таблиц выберите пункт Индексы и Ключи. 3. В диалоговом окне Индексы и Ключи нажмите Добавить. 4. Выберите новый индекс в списке Выбранный первич- ный/уникальный ключ или индекс и определите его свой- ства в таблице справа. 30 5. При необходимости укажите дополнительные параметры ин- декса и нажмите кнопку Закрыть. Индекс создается в базе данных при сохранении таблицы. Для создания уникального индекса: • находясь в сетке, щелкните Тип. • Выберите Индекс в раскрывающемся списке справа от свой- ства. • В списке Имя столбца выберите столбцы, которые необхо- димо проиндексировать. Выбрать можно до 16 столбцов. Для оптимальной производительности следует выбирать только один или два столбца на индекс. Для каждого выбранного столбца укажите, будут ли значения данного столбца распо- лагаться в индексе в возрастающем или убывающем порядке. • Находясь в сетке, щелкните Уникальный. • Выберите Да в раскрывающемся списке справа от свойства. • Выберите параметр Пропустить повторяющиеся ключи, чтобы данные, которые создает дублирующийся ключ в уни- кальном индексе (при помощи инструкции INSERT), были пропущены. Для создания кластеризованного индекса: • выберите в сетке Создать как кластеризованный и из рас- крывающегося списка справа от свойства выберите Да. Для изменения свойств индекса: • находясь в сетке диалогового окна Индексы и Ключи выбе- рите индекс из списка Выбранный первичный / уникаль- ный ключ или индекс. • Измените свойства в сетке. Изменения будут сохранены в ба- зе данных при сохранении таблицы. Переименование индекса. Новым индексам автоматически присваиваются системные име- на в зависимости от имени таблицы базы данных. При создании не- скольких индексов таблицы к именам индексов добавляются «_1», « _2» и т.д. Индекс можно переименовать при условии, что его имя будет уникальным в пределах таблицы. 31 Примечание. При создании первичного ключа или ограничения уникальности таблицы автоматически создается индекс с таким же гшенем, что и у ограничения. Поскольку имена индексов долж- ны быть уникальны в пределах таблицы, нельзя создавать или пе- реименовывать индекс так, чтобы его имя совпадало с гшенем первичного кчюча или ограничения уникальности. Для переименования индекса: • Находясь в сетке диалогового окна Индексы и Ключи, вы- берите индекс из списка Выбранный первичный / уни- кальный ключ или индекс. • В сетке выберите Имя и введите новое имя в текстовое поле. • Изменения будут сохранены в базе данных при сохранении таблицы. Удаление индекса Индексы могут уменьшить производительность инструкций INSERT, UPDATE и DELETE. Индекс можно удалить, если он уменьшает общую производительность или больше не нужен. Для удаления индекса: » в диалоговом окне Индексы и Ключи выберите индекс, кото- рый хотите удалить. » Нажмите кнопку Удалить. Индекс удаляется из базы данных при сохранении таблицы. Примечание. Если индекс был удален в конструкторе таблиц, но не нужно удалять его из базы данных, можно закрыть таблицы без сохранения. Это также отменит все другие изменения с мо- мента последнего сохранения таблицы. Ф Пример 1. Создание индекса Namex. Создайте в конструкто- ре таблиц индекс для таблицы Employees, определяемый следую- щей инструкцией: CREATE INDEX Namex ON Employees (Surname, Name). Эта инструкция определяет индекс с именем Namex для таблицы Employees на основе полей Surname и Name. ••Пример 2. Создание уникального индекса. Создайте в кон- 32 структоре таблиц уникальный индекс с именем Goodsx для таблицы Goods, определяемый следующей инструкцией: CREATE UNIQUE INDEX Goodsx ON Goods (Mark). ФПример 3. Создание индекса с убывающим порядком. По умолчанию SQL сохраняет ключи индекса в порядке возрастания. Для изменения порядка на убывающий нужно включить в определе- ние индекса ключевое слово DESC. Создайте в конструкторе таб- лиц уникальный индекс с именем Amountx для таблицы Ordered, определяемый следующей инструкцией: CREATE INDEX Amountx ON Ordered (codeorder DESC, amount DESC). ^Пример 4. Модификация индексов. Для изменения опреде- ления индекса следует его удалить оператором, и создать заново. 3.3 Установление отношений между таблицами базы данных Бо- рей Можно создавать связи между столбцами разных таблиц непо- средственно в конструкторе диаграмм, перетаскивая столбцы между таблицами. Для выполнения п.п. 3.1 - 3.4 Задания настоящей лабо- раторной работы (создание ограничения FOREIGN KEY посред- ством конструктора баз данных) следует выполнить нижесле- дующую последовательность действий: 1. в конструкторе баз данных щелкните селектор строк для од- ного или более столбцов базы данных, которые необходимо связать со столбцом в другой таблице. Примечание. Столбцы, которые выбираются для внеш- него ключа, должны иметь одинаковый тип данных с пер- вичными столбцами, которым они соответствуют. Каж- дый ключ должен содержать одинаковое число столбцов. Например, если первичный ключ на первичной стороне связи состоит из двух столбцов, необходимо сопоставить каж- дому из этих столбцов столбец таблицы, который будет 33 входить во внешний ключ на другой стороне связи. 2. Перетащите выбранный столбец (столбцы) в связанную таб- лицу. 3. Отобразятся два диалоговых окна: Связи внешнего ключа и Таблицы и столбцы, второе отображается на переднем пла- не. 4. Имя связи устанавливается системой в формате FK_ табли- ца первичного ключа _таблица внешнего ключа. Можно из- менить это значение. 5. Убедитесь, что Таблица первичного ключа правильно за- дает таблицу. 6. Сетка содержит локальные столбцы и соответствующие им внешние столбцы. Можно добавить или удалить столбцы таблицы, либо изменить сопоставления. 7. Нажмите кнопку ОК. Откроется диалоговое окно Связи внешнего ключа. Выбранная связь отображает созданную связь. 8. Измените свойства связи в сетке. 9. Нажмите кнопку ОК. чтобы создать связь. Конструктор баз данных отобразит связь между выбранными столбцами. Для выполнения п.п. 4.1 - 4.3 Задания настоящей лабораторной работы (создание ограничения FOREIGN KEY посредством кон- структора таблиц) выполним следующую последовательность действий: 1. в обозревателе объектов щелкните правой кнопкой мыши таблицу на стороне внешнего ключа для связи и выберите Проект (Изменить в версии с пакетом обновления 1 (SP1) или более ранней версии). Таблица откроется в конструкторе таблиц. 2. В меню конструктора таблиц выберите пункт Отношения. 3. В диалоговом окне Выбранный элемент Отношение щелк- ните Добавить. Связь появится в списке этого окна с установ- ленным системой именем, в формате FK__, где tablename является именем таблицы внешнего ключа. 34 4. Щелкните нужную связь в списке Выбранный элемент От- ношение. 5. Щелкните Изменение свойств у существующего отноше- ния в сетке справа и нажмите кнопку с многоточием (...) справа от свойства. 6. В диалоговом окне Таблицы и столбы в раскрывают,емся списке Первичный ключ выберите таблицу, которая будет находиться на стороне первичного ключа связи. 7. В сетке внизу выберите столбцы, составляющие первичный ключ таблицы. В соседней ячейке сетки справа от каждого столбца выберите соответствующий столбец внешнего ключа таблицы внешнего ключа. 8. Конструктор таблиц предложит имя для связи. Чтобы его из- менить, отредактируйте содержимое текстового поля Имя связи. 9. Нажмите кнопку ОК, чтобы создать связь. Для ознакомления с проверочными ограничениями см. Кон- спект лекций п. 2. ] 0. > В диаграмме базы данных щелкните правой кнопкой табли- цу, которая будет содержать ограничение и выберите пункт Проверочные ограничения из контекстного меню. -или- > Откройте таблицу, которая будет содержать ограничение в конструкторе таблиц, щелкните правой кнопкой мыши в конструкторе и выберите пункт Проверочные ограничения из контекстного меню. > Нажмите кнопку Добавить. Примечание. Чтобы назвать ограничение по-другому, введите имя в поле Имя ограничения. > В поле Выражение в сетке введите SQL-выражения для про- верочного ограничения. Например, чтобы ограничить записи в столбце state в таблице authors Нью-Йорком, введите: state = 'NY', а чтобы ограничить записи в столбце zip записями, со- 35 стоящими из 5 цифр, введите: zip LIKE '[0-9][0-9][0-9][0-9][0-9]'. Примечание. Убедитесь, что все нечисловые ограничения по значению заключены в одиночные кавычки ('). > Разверните категорию конструктора таблиц, чтобы настро- ить момент выполнения проверочного ограничения. > Чтобы проверить выполнение ограничения для данных, ко- торые существовали до создания ограничения, отметьте флажок Проверка существующих данных при создании или повторном включении. Чтобы ограничение проверялось всякий раз, когда происходит добавление или обновление строки в этой таблице, отметьте флажок Принудительное использование для запросов INSERT и UPDATE. Проверка существующих данных при создании проверочного ограничения > На диаграмме базы данных щелкните таблицу, содержащую ограничение, правой кнопкой мыши и в контекстном меню выберите Проверочные ограничения. -или- > Откройте таблицу, содержащую ограничение, в конструкторе таблиц, щелкните конструктор таблиц правой кнопкой мыши и в контекстном меню выберите Проверочные ограниче- ния. > Выберите ограничение в списке Выбранные проверочные ограничения. > Щелкните Проверка существующих данных при создании или повторном включении и выберите Да в раскрываю- щемся списке. 3.4 Ввод данных посредством графического интерфейса 1. Заполнение таблицы Types. Сделайте щелчок правой кноп- кой на таблице Types в Object Explorer и выберите Открыть таб- 36 лицу. Таблица откроется в окне редактора со строкой, подготов- ленной для ввода данных. Введите в таблицу Types две строки дан- ных в порядке следования полей: 1 Мониторы 2 Принтеры 2. Заполнение данными таблицы Suppliers (Поставщики). Та- ким же образом заполним две строки в таблице Suppliers (Постав- щики): 1, Tecnis, Вероника Кудрявцева, Менеджер по закупкам, ул. Большая Садовая, 12, Москва, 123456, Россия, (095) 325-2222, (095) 325-2222; 2, Uni, Дмитрий Сидоров, Координатор, Бостон 78934, Новый Орлеан, 70117, США, (100) 555-4822; 3. Заполнение данными оставшихся таблиц будет выполнено в следующей лабораторной работе. 4. Выполните очередное резервное копирование в соответствии с уже известным порядком действий (Лабораторная работа №1, п. 3.10). 4 Контрольные вопросы 1) Для чего используются диаграммы базы данных? 2) Как создать и сохранить новую диаграмму базы данных? 3) Сколько диаграмм можно создать для одной базы данных? 4) Укажите последовательность действий по включению в диа- грамму новой таблицы? 5) Что такое "Ограничение внешнего ключа"? Укажите после- довательность действий по созданию на диаграмме б;1зы данных ограничения внешнего ключа. 6) Какие типы проверочных ограничений Вы знаете? Укажите последовательность действий по добавлению проверочного ограничения к таблице визуальными средствами конструкто- ра базы данных. 37 ЛАБОРАТОРНАЯ РАБОТА № 3 СОЗДАНИЕ СЦЕНАРИЕВ В СРЕДЕ MANAGEMENT STUDIO !. Цель работы 1) Научиться применению инструкции INSERT. 2) Научиться применению инструкции UPDATE. 3) Научиться применению инструкции DELETE. 2 Задание ]) Заполнить данными все таблицы созданной базы данных BORE1 с использованием оператора INSERT и графического и н т е р ф е й с а Management Studio. 2) Изучить правила выполнения сценария посредством интер- фейса Management Studio. 3) Выполнить примеры по изменению данных. 4) Выполнить примеры по удалению данных. 3 Порядок выполнения работы 3.1 Ввод данных посредством выполнения инструкции INSERT 1. Используя графический интерфейс Обозревателя объектов, последовательно откройте таблицы Types и Suppliers и уда- лиге введённые ранее в них строки. 2. Откройте редактор запросов (если необходимо см. Конспект лекций п.п.4.1.1), нажав на панели инструментов Management Studio кнопку New Queiy. 3. Проверьте и, если необходимо, выберите из выпадающего списка на панели инструментов редактора запросов (см. номер 1 на рисунке 5.1 Конспекта лекций) базу данных, для которой будет выполнен запрос. 38 4. Введите в окно редактора запросов и выполните следующий код: SET IDENTITY INSERT Types ON; Выполнять запрос необходимо, нажав кнопку или F5. Примечание Данная строка необходима нам, если это свойст- во установлено для столбца первичного ключа, и мы собираемся вручную задать значение ключевого поля CodeType. Если предоста- вить серверу самостоятельно задать значение ключевого поля при добавлении новой строки, то эту часть запроса можно не выпол- нять. 5. Теперь введите и выполните инструкцию, которая добавляет строку в таблицу Types: INSERT INTO Types (CodeType, Category) VALUES (1, 'Мониторы') Примечание. Помните, что строки символов, заключённые ка- вычки, являются чувствительными к регистру. 6. Введите и выполните следующий код, добавляющий строку в таблицу Suppliers: SET IDENTITY JNSERT Suppliers ON Теперь введём код для создания строк: INSERT IN TO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone, Fax) VALUES (1, 'Tecnis', 'Вероника Кудрявцева', 'Менеджер по закупкам', 'ул. Большая Садо- вая, 12', 'Москва', '123456', 'Россия', '(095) 325-2222', '(095) 325- 2222'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone) VALUES (2, 'Uni', 'Дмитрий Сидоров', 'Координатор', 'Бостон 78934', 'Новый Орлеан', 70117', 'США', '(100) 555-4822'); GO 39 Обратите внимание, что значение для [Index является строковым, а не числовым. 7. Проверим правильность ввода наших данных, открыв табли- цы в Обозревателе объектов путём выбора Открыть таб- лицу во всплывающем меню. 8. Для ввода остальных данных в таблицы Types, Suppliers, Clients, Deliveries, Employees, Goods, Orders и Ordered вы- полним следующие действия: • скопируем и сохраним в файле Insert.sql текст, приведён- ный в Приложении 1 настоящего руководства; • откроем сохранённый файл Insert.sql в Management Studio и выполним его (см. Конспект лекций п.п.4.1. П. 9. Просмотрим результат, открыв последовательно таблицы в редакторе Management Studio. При этом проверим правиль- ность введенных данных, обратив внимание на то, нет ли по- лей, содержащих только значения NULL. Такие столбцы бу- дут обнаружены в таблице Goods: Supplier, Category; в таб- лице Orders: Client, Employee, Delivery, а также в таблице Ordered: Goods и Price. Их нужно заполнить, обратившись к соответствующим таблицам и воспользовавшись имеющи- мися значениями: CodeClient, CodeEmployee, CodeGoods, что и будет выполнено в следующем подразделе 3.2. 3.2 Обновление (изменение) данных 1. Прежде всего, проанализируем и выполним нижеследующую инструкцию, в которой сначала выполняется инструкция SELECT (см. Лабораторную работу № 4), записанная в скоб- ках после знака присвоения. Она выбирает из таблицы Sup- pliers значения столбца Title, у которых совпадают значения ко/дов в таблице Suppliers и в таблице Goods. Затем получен- ный результат заносится в столбец Supplier таблицы Goods. 40 UPDATE Goods SET Supplier = (SEJ ЕСТ Title FROM Suppliers WHERE. Goods.CodeSuppliers=Supp!iers.CodeSuppliers) 2. Откроем таблицу Goods и просмотрим результат. Столбец Supplier, содержавший ранее значения NULL, теперь запол- нен соответствующими данными из таблицы Suppliers. 3. По аналогии с заполнением данными посредством выполне- ния сценария в п. 3.1 выполним следующие действия: • скопируем и сохраним в файле Updates.sql текст, приве- дённый в Пщложении_2 настоящего руководства; • откроем сохранённый файл Updates.sql в редакторе запро- сов Management Studio и выполним его. 4. Проверим результаты, открыв соответствующие таблицы для просмотра. 5. Если предыдущие действия были выполнены успешно, то можно сделать очередную резервную копию базы данных backup2.bak (Лабораторная работа №1. п. ЗЛО). 3.3 Удаление данных ФПример 1. Удаление строк из таблицы Ordered. В этом уп- ражнении вначале просмотрим заказы дешевле 1$. Затем соответст- вующие заказы будут удалены из таблицы Ordered, и мы убедимся, что это сделано. 1. Введём следующий оператор, чтобы просмотреть продажи по заказам: SELECT * FROM Ordered WHERE Price < 1 Должно существовать три таких заказа. 2. Перед выполнения следующих действий сделайте копию ба- зы данных. Введем следующий оператор DELETE: DELETE FROM Ordered WHERE Price < 1 4! Замечание Обратите внимание, что оператор DELETE не требует определения столбцов, поскольку он удаляет всю строку. 3. Повторим первоначальный оператор SELECT. Он должен вернуть теперь пустой результат. 4. Для восстановления данных воспользуйтесь предыдущей ко- пией, созданной перед выполнением оператора DELETE. 5. Выполним оператор SELECT снова, чтобы увидеть удалён- ные три строки. 6. После удачного выполнения действий по удалению и восста- новлению записей уместно сделать очередную резервную копию базы данных backup4.bak Ф Пример 2. Удаление записей на основе более точных усло- вий. Можно определить условие удаления более точно путём ком- бинирования ряда простых условий в одном. Например, введите следующий оператор, чтобы удалить записи, относящиеся к прода- же товаров фирме "Соло", выполненным после 2 января 1994 г.: DELETE FROM Orders WHERE DatePurpose>'02.01.1994' AND Qient-Соло' Если попытаться выполнить этот оператор, то MS SQL Server вернёт ошибку, поскольку существует внешний ключ в таблице Ordered, который ссылается на таблицу Orders. Если эти строки бу- дут удалены, то некоторые строки таблицы Ordered не будут боль- ше иметь соответствующих сгрок в таблице Orders, что приведёт к нарушению ограничения внешнего ключа (нарушению ссылочной целостности). Примечание. В операторах удаления можно использовать под- запросы, также как они использовались при обновлении данных. 4 Контрольные вопросы 1) Укажите последовательность действий для визуального вво- да данных в конкретную таблицу базы данных. 42 2) Как удалить строку данных из таблицы базы данных визу- альными средствами? 3) Прокомментируйте смысл предложений в составе инструк- ции INSERT INTO. 4) Укажите последовательность подготовительных действий для ввода и выполнения инструкции языка Transact-SQL. 5) Дайте определение терминов ПАКЕТ и СЦЕНАРИЙ при выполнении инструкций языка Transact-SQL. 6) Расскажите о порядке выполнения сценария языка Transact- SQL на примере заполнения данными таблиц базы данных Borei. 7) Расскажите о порядке обновления (изменения) данных. 8) Расскажите о порядке удаления данных. 43 ЛАБОРАТОРНАЯ РАБОТА № 4 ОБЗОР ЯЗЫКА TRANSACT SQL 1 Цель работы 1) Научиться созданию запросов посредством конструктора за- просов Management Studio. 2) Научиться правильному применению условий поиска данных в базе данных. 2 Задание 1) Изучить порядок открытия конструктора запросов в среде Management Studio. 2) Изучить интерфейс конструктора запросов. 3) Изучить правила визуального создания запросов посредст- вом конструктора запросов и представлений. 4) Изучить и выполнить предложенные варианты условий по- иска в составе инструкции SELECT. 3 Порядок выполнения работы 3.1 Создание и выполнение запроса к базе данных посредством конструктора запросов и представлений Для создания нового запроса обычно выполняют нижеперечис- ленную последовательность шагов. 1. В обозревателе объектов сделайте щелчок на узле той базы данных, к которой Вы намерены создать запрос. 2. Сделайте щелчок на кнопке Создать запрос панели инстру- ментов. 3. В позиции главного меню Запрос или во всплывающем ме- ню окна открывшегося редактора выберите пункт Создать 44 запрос в редакторе. Откроется окно конструктора и окно переднего плана Добавление таблицы, содержащее пере- чень доступных таблиц. 4. В диалоговом окне Добавление таблицы выберите таблицы, к которым будет обращаться запрос, и для каждой из них нажмите кнопку Добавить. 5. Выбрав нужные таблицы, нажмите кнопку Закрыть. Изо- бражения отобранных таблиц появятся в области диаграммы конструктора запросов. 6. Если позднее в запрос нужно будет добавить еще какие- нибудь таблицы, в меню конструктора запросов выберите пункт Добавить таблицу, или щелкните открытое место на панели Диаграмма правой кнопкой мыши и из контекстного меню выберите Добавить таблицу. Примечание. Если панели Диаграмма, SQL, Критерий или Ре- зультаты отсутствуют, в меню конструктора запросов выбери- те Область и щелкните панель, которую нужно открыть. 7. На панели Диаграмма на изображениях таблиц поставьте флажки для каждого столбца, который должен войти в ре- зультат запроса. В результате этих действий в области Кри- териев автоматически будут заполнены указанные столбцы, а соответствующая инструкция SELECT также будет сгене- рирована и появится в области SQL-кода. 8. Чтобы выполнить запрос, в меню конструктора запросов вы- берите Выполнить SQL. При дальнейшем улучшении запроса можно изменить код SQL на панели SQL или выбрать такие параметры, как порядок сорти- ровки или псевдонимы столбцов на панели Критерии. Для открытия конструктора запросов и представлений для существующего запроса-. 1. В обозревателе объектов разверните папку Queries. 45 2. Дважды щелкните мышью открываемый запрос. Области конструктора запросов и представлений открываются с уче- том параметров, заданных в диалоговом окне 3 качестве примера создадим запрос к таблицам Orders, Ordered для определения состава товаров, которые заказывала определённая фирма, например, E-Life. Таблица Orders содержит необходимую нам информацию о заказах, за исключением наименования товара, скидки, стоимости и количества, которая хранится в таблице Or- dered. Из построенной ранее диаграммы видно, что таблица Ordered имеет ограничение внешнего ключа по отношению к таблице Orders. Для построения такого запроса с помощью конструктора запросов выполним следующую последовательность действий. ::. В обозревателе объектов делаем щелчок на узле Таблицы в составе дерева Borei. 2. На верхней ланели инструментов делаем щелчок на кнопке Создать запрос. 3. На нижней панели инструментов открывшегося редактора запросов в выпадающем списке проверяем установку теку- щей балы - Etorei. 4. В главном меню Запрос или во всплывающем меню окна ре- дактора запросов выбираем Создать запрос в редакторе. 5. Выбираем таблицы Ordered и Orders в окне переднего плана, щёлкаем на кнопке Добавить и затем Закрыть. Выбранные таблицы появятся в области Диаграммы с отображением от- ношения между ними. 6. На панели критериев отбираем столбцы: Orders.Employee, Orders. DateExecution. Ordered.Goods. Ordered. Discount. Ordered. Price. Ordered.Amount. 7. Ставим галочки против них в столбце Вывод. 8. Добавляем поле Orders.Client и в столбец Фильтр заносим значение 'E-Life'. В столбец вывода для этого поля галочку можно не ставить, если мы не хотим отображать этот столбец. 9. Изучаем созданную инструкцию SELECT в области SQL. 46 10. Выполняем инструкцию щёлкнув на кнопке Выполнить. Если все действия были правильными, то в области SQL-кода появится следующая инструкция: SELECT ordered.Goods, ordered.Discount, ordered.Amount. ordered.Price, orders.Employee. orders.dateExecution FROM ordered INNER JOIN orders ON ordered.Codeorder - orders.Codeorder WHERE Orders.Client='E-Life', а в области результатов будет выведен следующий результат: Крылова Анна 1992-01-05 00:00:00.000 ТЕАС 52х CD-522E 0.0000 42 12 3.2 Практическое изучение приемов применения условий поиска Перед выполнением последующих примеров следует ознако- миться с материалом, ипоженным в и. 4.2 Конспекта лекций. Од- нако и здесь будет полезно кратко напомнить основные понятия, которые там рассматривались. 3.2.1 Оператор SELECT Оператор SELECT является сердцем SQL, поскольку именно по- средством него мы получаем обратно информацию, которую сохра- няли в базе данных. Нет смысла создавать и заполнять структуры данных, если мы не сможем получить их обратно в приемлемой форме. Мы уже встречались с некоторыми простыми формами опе- ратора SELECT в предыдущей лаб. работе. В данной части руково- дства Вы расширите практику в его использовании. Рассмотрим укрупненный синтаксис оператора SELECT: SELECT [DISTINCT] columns FROM tables WHERE < search_conditions> [GROUP BY column [HAVING < search_condition>]] [ORDER BY < order_list> [ ASC | DESC ]] 47 Оператор SELECT содержит семь главных ключевых слов. Клю- чевое слово и связанную с ним информацию называют предложени- ем. Эти предложения представлены в нижеследующей таблице 4.1. Таблица 4.1 - Структура оператора SELECT Предложение Описание SELECT columns Список возвращаемых столбцов DISTINCT Опциональное ключевое слово, исключающее повторяющиеся строки FROM tables Указывает таблицы, из которых должны выбираться значения WHERE Определяет условия отбора подмножества строк из множе- ства всех доступных строк GROUP BY column Группирует возвращаемые строки на основе значений ука- занного столбца HAVING Используется совместно с пред- ложением GROUP BY и опре- деляет условия отбора групп ORDER BY Упорядочивает результирую- щий набор строк, возвращаемых оператором SELECT, на основе указанных столбцов 3.2.2 Условия поиска Текст, следующий за ключевым словом WHERE, называется ус- ловиями поиска, поскольку оператор SELECT ищет строки, удов- летворяющие этому условию поиска. Условие поиска состоит из имени столбца (например "Surname"), оператора (например "=") и значения (например "Белова"). Таким образом, предложение WHERE имеет следующую общую форму: 48 WHERE column_name operator value В общем случае columnjname ес-ть имя столбца запрашиваемой таблицы, operator — это оператор сравнения и value — это значение или диапазон значений, с которым сравнивается значение столбца. Условия поиска, в общем случае, используют операторы, приведён- ные в таблице 4.2. Таблица 4.2 - Классификация операторов в SQL Server г Операторы Описание Операторы сравнения Используются для сравнения значения столб- ца со значением условия поиска. Примерами являются: <, >, <=, >=, =, != или < >, !< (не меньше), !> (не больше). Арифметические операторы Используются для вычисления и оценки зна- чений в условии поиска. Примерами служат: -1-, -, *, /, % (остаток от деления). Логические операторы Проверяют истину некоторого условия. Это операторы: NOT, AND, OR, а также ALL, ANY или SOME, BETWEEN, IN, LIKE и EXISTS. Значения в условии поиска могут быть литеральными (констан- ты) или вычисляемыми, а также значениями, возвращаемыми под- запросами. Описание типов значений приведено в таблице 4.3. Таблица 4.3 — Типы значений в условии поиска Типы значений Описание Литеральные значения Числа и символьные строки, являющиеся образцами для сравнения, например число 1138 или строка 'Новиков'. Вычисляемые значения Функции или арифметические выражения, например Price * 2 или Surname 1 Name. 49 Окончание таблицы 4.3 Подзапросы Вложенный оператор SELECT возвращает (подзапрос - одно или более значений, которые исполь- это вложенный в зуются для сравнения со значениями опре- запрос делённого столбца, оператор SELECT) Рекомендуется символьные значения заключать в одинарные ка- вычки, поскольку в некоторых случаях двойные кавычки являются недопустимыми. Числовые константы записываются без кавычек. Замечание. Строковые значения являются чувствительными к регистру. Когда строка предварительного результата запроса подвергается проверке на соответствие условию, то результатом может быть од- но из трёх значений: • True - строка соответствует условию предложения WHERE; • False — строка не соответствует условию предложения WHERE; • Unknown - некоторое поле в предложении WHERE содержит неопределённое значение NULL, которое не может быть оценено. 3.2.3 Примеры выполнения поиска ^Пример 1. Выбрать строки со значением "Белова" в столбце Surname таблицы Employees. В результате ваших действий конст- руктор запросов должен сгенерировать следующую инструкцию: SELECT Surname, Name, Post, HomeTelephone FROM Employees WHERE 8игпате='Белова' В результате выполнения запрос должен вернуть одну строку: Белова Марш Представитель (017) 555-9857 50 ^Пример 2. Выбрать строки, у которых фамилия (Surname) сле- дует в алфавитном порядке за фамилией Белова. В результате ва- ших действий конструктор запросов должен сгенерировать сле- дующую инструкцию: SELECT Surname, Name, Post, HomeTelephone FROM Employees W H E R E Surname > 'Белова' В результате выполнения запрос должен вернуть одну строку: Крылова Анна Внутренний координатор (017) 555-1189 Ф Пример 3. Поиск с отрицанием NOT. Любое логическое выражение можно превратить в его отрица- ние, поставив перед ним оператор NOT. Например, выберите категории (типы) товаров за исключением CD-ROM-MOB. В данном случае запрос будет выглядеть следующим образом: SELECT CATEGORY FROM TYPES WHERE NOT CATEGORY = CD-ROM' В результате должен получиться список из 15 категорий. Однако есть и другие способы получить тот же самый результат, поставив вместо NOT следующие операторы: SELECT Category FROM Types WHERE CATEGORY != 'Cd-Rom' SELECT Category FROM Types WHERE CATEGORY <> 'Cd-Rom' Применение сравнения LIKE Кроме сравнения непосредственно со значениями, условия поиска могут содержать специальный шаблон. Если проверяемые данные удовлетворяют данному шаблону, то строка включается в результат. Сравнение LIKE является чувствительным к регистру и исполь- зует символы-заменители. Символ (%) соответствует в шаблоне любому набору символов. Символ (_) соответствует одному произ- вольному символу. 51 Таблица 4.4 содержит примеры некоторых общих шаблонов. Таблица 4.4 - Примеры шаблонов Предложение WHERE Соответствует SURNAME LIKE '%a%' Значение поля SURNAME содержит по крайней мере один символ "а". SURNAME 'Kp%' Значение поля SURNAME начинается символами "Кр". CONTAINS (SURNAME',, 'i') Значение поля SURNAME содержит по крайней мере одну букву "i" или "Г. SURNAME BETWEEN 'A' AND 'H' Значение поля SURNAME начинается с любой буквы между "А" и "Н" включи- тельно. ^ П р и м е р 4. Создать запрос для поиска служащих, чьи фамилии оканчиваются на "ова". Вы должны; будете получить следующую инструкцию: SELECT SURNAME,NAME FROM EMPLOYEES WHERE SURNAME LIKE '%ова' В результате должен быть получен следующий результат: SURNAME NAME Белова Марш Крылова Анна ^ П р и м е р 5. Создать запрос для поиска служащих, чьи фамилии начинаются с "К", после которого следуют точно два символа и за- тем символ "л". Остальные символы безразличны. Вы должны бу- дете получить следующую инструкцию: SELECT SURNAME, NAME FROM EMPLOYEES WHERE SURNAME LUCE 'К л%' 52 Результатом должно быть: Крылова Анна. Применение оператора CONTAINS Оператор CONTAINS проверяет наличие заданной сроки сим- волов в любом месте искомой строки. Этот оператор не является чувствительным к регистру и не поддерживает неопределённых символов, если записи в таблице написаны на латинском языке. Примечание. Для того, чтобы этот оператор отработал, не- обходимо, чтобы на сервере была включена служба полнотексто- вого поиска (full-text search service) и таблица была проиндексиро- вана для него. ФПример 6. Создать запрос на поиск клиентов, чьи названия содержат буквы "i" и "1" в любом месте. Созданная инструкция должна принять следующий вид: SELECT TITLE FROM Clients WHERE CONTAINS (TITLE,']') Должен быть получен следующий результат: TITLE E-Life IMC Computers Comtris Net Line Oki Теперь выполним тот же самый оператор, заменив букву "Г' на "i". Мы должны будем получить тот же самый результат. SELECT TITLE FROM Clients WHERE CONTAINS (TITLE,V) Этот оператор является чувствительным к регистру, если записи написаны "кириллицей". SELECT SURNAME, NAME FROM EMPLOYEES WHERE CONTAINS (NAME,'a') 53 Результатом будет: SURNAME NAME Белова Мария Теперь выполним тот же самый оператор, заменив букву "а" на "А": SELECT SURNAME, NAME FROM EMPLOYEES WHERE CONTAINS (NAME,'A') Получим: SURNAME NAME Крылова Анна Проверка на неопределённое значение (оператор IS NULL) Другой тип сравнения проверяет на наличие, или отсутствие ка- кого-либо значения. Для этой цели используется оператор IS NULL. Для проверки присутствия некоторого значения использу- ют оператор IS NOT NULL. ФПример 7. Создать запрос, который возвращает названия фирм, не имеющих факса: SELECT TITLE, FAX FROM CLIENTS WHERE FAX IS NULL Запрос должен вернуть названия четырёх фирм: МАП Инфо, Да- модара-Сервис, IMC Computers, Stop. Выполним теперь оператор с использованием IS NOT NULL: SELECT Title, Fax FROM CLIENTS WHERE FAX IS NOT NULL Результат должен будет содержать следующие строки: SELECT Title, Fax FROM CLIENTS WHERE FAX IS NOT NULL 54 TITLE FAX Омикс 0921-12 34 67 Белкантон (5)555-7293 E-Life 7675-3426 Bepca 089-0877451 Comtris (2)283-3397 Net Line (21)555-8765 NTTs (5) 555-1948 Интеллекте 2967 3333 ZS (9)331-7256 Медиа-софт 035-640231 Эликон-М (907)555-2880 Соло 0522-556722 Olymp (91)745 6210 Oki (11)555-2168 Сравнение с диапазоном и списком значений В предыдущей секции были рассмотрены операторы, которые выполняют сравнение с единственным значением, в то время как операторы BETWEEN и IN сравнивают искомое значение со мно- жеством заданных значений. Оператор BETWEEN проверяет по- падание искомого значения в заданный диапазон. ФПример 8. Применение оператора BETWEEN. Создать за- прос, который возвращает все фамилии, начинающиеся с букв, расположенных между "А" и "К". Заметим, что запрос не включает фамилии, начинающиеся с последней буквы диапазона - "К". Это происходит потому, что оператору BETWEEN удовлетворяют зна- чения меньшие или равные конечному значению диапазона. Поэто- му фамилия, начинающаяся с "К" и содержащая ещё другие буквы, будет больше, чем "К". Инструкция должна принять вид: SELECT SURNAME, NAME FROM EMPLOYEES WHERE SURNAME BETWEEN 'A' AND 'K' 55 Результирующий набор должен будет содержать: SURNAME NAME Белова Мария ФПример 9. Применение оператора BETWEEN. Создать за- прос, который возвращает наименования товаров, цена которых лежит в пределах между 14 и 32 включительно. SELECT CATEGORY, SUPPLIER, PRICE FROM GOODS WHERE PRICE BETWEEN 14 AND 32 ORDER BY PRICE Результат должен состоять из 11 строк, включающих нижнюю и верхнюю границы диапазона. CATEGORY SUPPLIER PRICE Корпуса и блоки питания SV-Trading 14 Модули памяти Uni 15 Устройства ввода и указания Гвин-Медиа 15 Модемы Iven 18 Модули памяти ПК Сервис 19 Сетевое оборудование DAAS 22 CD-ROM B.S.T.Group 23 CD-ROM Конструктив 25 Видеокарты Stepfor 28 Сетевое оборудование BelSoft 32 Сетевое оборудование Гвин-Медиа 32 Поиск с использованием оператора IN Оператор IN сравнивает искомые значения с одним из значений заданного списка. Значения списка должны отделяться друг от дру- га запятыми. Можно использовать оператор NOT для поиска значе- ний, несовпадающих ни с одним из значений заданного списка. 56 ^Пример 10. Создать запрос, который возвращает названия то- варов, имеющих следующие цены: 15, 19, 32. SELECT CATEGORY, SUPPLIER, PRICE FROM GOODS WHERE PRICE IN (15,19,32) ORDER BY PRICE, CATEGORY Должен быть получен следующий результирующий набор строк: CATEGORY SUPPLIER PRICE Модули памяти Uni 15 Устройства ввода и указания Евин-Медиа 15 Модули памяти ПК Сервис 19 Сетевое оборудование BelSoft 32 Сетевое оборудование Евин-Медиа 32 Применение логических операторов AND и OR Несколько условий поиска можно объединить в одном предло- жении WHERE посредством использования логических операторов AND и OR. Когда два условия связываются оператором AND, то имеется в виду, что оба условия должны быть истинными для искомой строки. Ф Пример 11. Посредством использования области критериев конструктора запросов создать запрос, который возвращает слу- жащих, работающих на должности представителя и принятых на работу до 1 января 1994 г. Должна быть сформирована следующая инструкция: SELECT Surname, Name, Post, DateHiring, HomeTelephone FROM Employees WHERE Ров^'Представитель' AND DateHiring < '1.01.1994' В результате оператор должен вернуть одну строку: Белова Мария Представитель 1992-01-05 00:00:00. ООО (017) 555-9857 57 ••Пример 12. Посредством использования области критериев конструктора запросов создать запрос, который возвращает кли- ентов из Германии или Италии. Для поиска строк, удовлетворяю- щих хотя бы одному условию среди нескольких заданных, исполь- зуют логический оператор OR. Должа быть получена следующая инструкция: SELECT Title, Address, City, Country FROM Clients WHERE (Соип1гу=Термания' OR Соип1гу='Италня') Результат запроса должен содержать четыре строки: Верса Берлинская пл., 43 Мюнхен Германия Медиа-софт ул Людовика, 22 Бергамо Италия Stop Тачерстрасс, 10 Кюневачьд Германия Соло ул. Провинциальная, 124 Реджио-Эмшио Италия Управление порядком вычисления условий Когда вводятся сложные условия поиска, следует быть уверен- ным в правильности порядка выполнения этих условий. Предполо- жим, что мы хотим выбрать служащих, принятых на работу до 1993 или после 1993 и родившихся до 1960 года. ^Пример 13. Неудачная попытка выполнения составного условия. Создайте и выполните следующий оператор: SELECT Surname, Name, Post, DateBirth, DateHiring FROM Employees WHERE DateHiring < '01.01.1993' OR DateHiring > '12. 31.1993' AND DateBirth < '01.01.1960' Можно увидеть, что в результате присутствуют только принятые на работу служащие моложе 1960 года: Белова Мария Представитель 08.12.1968 01.05.1992 КрыловаАнна Внутренний координатор 09.01.1958 05.03.1994 Этот запрос возвращает неожиданный результат, потому что ло- гический оператор AND имеет более высокий приоритет, чем опе- 58 ратор OR. Это значит, что выражение с оператором AND выполня- ется раньше выражения с оператором OR. ^Пример 14. Успешная попытка выполнения составного условия. Для изменения нормального приоритета выполнения опе- раций используют скобки. В нижеследующем упражнении скобки размещаются вокруг двух дат приема на работу, чтобы они прове- рялись оператором AND, как единое целое. Выполним предыдущий оператор, но с правильной расстановкой скобок: SELECT Surname, Name, Post, DateEiirth, DateHiring FROM Employees WHERE (DateHiring< '01.01.1993' OR DateHiring> '12.31.1993*) AND DateBirth < '01.01.1960' Теперь мы получили желаемый результат: Крылова Анна Внутренний координатор 09.01.1958 05.03.1994 Примечание. Учёт приоритета выполнения операций важен не только при использовании операторов AND и OR, все операции имеют определённый приоритет, который управляет порядком их выполнения. Этот порядок определяется в описании любого языка программирования и, в частности, языка SQL. В случае неуверенно- сти в правильности выполнения операций следует применять скоб- ки. 4 Контрольные вопросы 1) Что такое условие поиска и где оно применяется? 2) Объясните правила применения шаблонов в условиях поис- ка. 3) Как выполняется проверка на неопределённое значение? 4) Как формулируется условие поиска для проверки на диапа- зон допустимых значений? 5) Как формулируется условие поиска для проверки на пере- чень конкретных значений? 6) Объясните правила управления порядком вычисления логи- ческих условий. 59 ЛАБОРАТОРНАЯ РАБОТА № 5 ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ В ЯЗЫКЕ SQL 1 Цель работы 1) Научиться использовать подзапросы в составе инструкций Transact-SQL. 2) Научиться применять кванторы в условиях поиска данных в базе данных. 3) Научиться применять в запросах агрегатные функции. 2 Задание 1) Изучить правила и условия применения подзапросов в соста- ве инструкций Transact-SQL и выполнить предложенные примеры. 2) Изучить правила и условия применения кванторов и выпол- нить предложенные примеры. 3) Изучить правила и условия применения в запросах агрегат- ных функций и выполнить предложенные примеры. 3 Порядок выполнения работы 3.1 Использование подзапросов Подзапросы являются специальным случаем предложения WHERE, но в силу важности этого инструмента они заслуживают отдельного обсуждения. Вспомним, что в предложении WHERE записывается имя столб- ца, оператор сравнения и значение, с которым осуществляется сравнение. SQL сервер сравнивает содержимое столбца с заданным значением посредством указанного оператора. Вместо значения, с которым производится сравнение в предложении WHERE, можно 60 использовать оператор SELECT. Внутреннее предложение SELECT называют подзапросом. SQL сервер выполняет подзапрос и исполь- зует его результат в качестве значения для сравнения в предложе- нии WHERE. Предположим, например, что мы хотим выбрать список всех то- варов фирмы, которая поставляет принтеры Lexmark. Без использо- вания подзапроса внач&те нужно определить фирму: SELECT Supplier FROM Goods WHERE Mark- Lexmark Z35' Этот запрос вернёт "SV-Trading". Используя этот результат можно сформировать второй запрос, чтобы выбрать все товары фирмы "SV-Trading'': SELECT Mark FROM Goods WHERE Supplier='SV-Trading'; Использование подзапроса позволяет объединить оба запроса в один оператор. ••Пример 1. Выполнить подзапрос, возвращающий единичное значение. SELECT Mark FROM Goods WHERE Supplier = (SELECT Supplier FROM Goods WHERE Mark='Lexmark Z35') В этом случае подзапрос возвращает единственное значение "SV-Trading", в качестве значения, с которым будет осуществляться сравнение в предложении WHERE. Подзапрос должен вернуть единственное значение, поскольку в предложении WHERE осуще- ствляется проверка на знак равенства ("="). В противном случае запрос сгенерирует ошибку. Результирующий набор для обсуждае- мого оператора будет состоять из трех наименований товаров. 61 Подзапросы с множественным результатом Если подзапрос возвращает более одного значения, то содержа- щее его предложение WHERE должно использовать оператор, осу- ществляющий сравнение с несколькими значениями. Оператор IN является именно таким оператором. 4Пример 2. Выполнить следующий пример, в котором выбира- ется название товара и фирмы, заказавшей какой-либо товар фирмы «SV-Tradingx. В этом примере используется подзапрос, который возвращает все товары фирмы «SV-Trading». Главный запрос, в свою1 очередь, выбирает клиента и проверяет, является ли он кли- ентом «SV-Trading». SELECT Client, Goods FROM Orders, Ordered WHERE Goods IN (SELECT Mark FROM Goods WHERE Supplier^-SV-Trading') AND Orders.CodeOrder^Ordered.CodeOrder Результирующий набор должен выглядеть следующим образом: Client Goods Соло Lexmark Z35 3.2 Применение кванторов в подзапросах Нижеследующая таблица 5.1 обобщает кванторы, которые срав- нивают выражение в левой части условия с результатом выполне- ния подзапроса, содержащегося в правой части. Таблица 5.1 - Классификация кванторов в SQL Server Оператор Действие ALL Принимает значение "истина", если сравнение воз- вращает истину для всех результирующих значений подзапроса. 62 Окончание таблицы 5, ANY или SOME EXISTS Принимает значение "истина", если сравнение воз- вращает истину хотя бы для одного результирующе- го значения подзапроса. Определяет, существует ли хотя бы одно значение в результате подзапроса. ••Пример 1. Применение ALL. Предположим, что мы хотим найти товары, которые дороже всех товаров фирмы «CD-Life». Введём следующий запрос: SELECT Supplier, Mark, Price FROM Goods WHERE Price > ALL(SELECT Price FROM Goods WHERE Supp] ier='CD-Life') Результат должен выглядеть следующим образом: Supplier Mark Price BelSoft Canon LBP810 185 DAAS Samsung 550B 150 Q-Senter Intel P4 1700MHz Box 137 Ситипринт Samtron 76E 180 Этот пример использует квантор ALL. Значение столбца Price в каждой строке таблицы проверяется для каждого значения подза- проса. Если цена больше всех значений подзапроса, то строка по- мещается в результирующий набор. ^Пример 2. Применение ANY, EXISTS. Вместо проверки ус- ловия для всех значений подзапроса, запрос можно переписать та- ким образом, чтобы условие выполнялось, по крайней мере, для од- ного значения: SELECT Supplier, Mark, Price 63 FROM Goods WHERE Price > AN Y(SELECT Price FROM Goods WHERE Supplier-CD-Life') Этот оператор должен вернуть 14 строк, в которых цена больше хотя бы одного значения подзапроса. Ключевое слово ANY является синонимом SOME. Они являют- ся взаимозаменяемыми. Ещё одним квантором является EXISTS. Он осуществляет про- верку на существование хотя бы одной строки, удовлетворяющей условиям подзапроса, и возвращает соответственно TRUE или FALSE, даже если строки содержат значения NULL. 3.3 Применение агрегатных функций SQL содержит агрегатные функции, которые вычисляют еди- ничное значение на основе группы значений. Группой значений мо- гут являться данные определённого столбца для заданного набора строк. Агрегатная функция может использоваться в предложении SELECT или где угодно вместо значения в операторе SELECT. Нижеследующая таблица 5.2 перечисляет некоторые агрегатные функции, поддерживаемые SQL сервером. Таблица 5.2 - Агрегатные функции Функция Действие AVG( [ ALL | DISTINCT ] value) Возвращает среднее значение поля для группы строк. COUNT ([ ALL ! DISTINCT ] value | * ) Осуществляет подсчет количест- ва строк, при этом в полях, вхо- дящих в value, игнорируется значение NULL. M1N([ ALL j DISTINCT ] value) Возвращает минимальное значе- ние в столбце для группы строк. MAX([ ALL | DISTINCT] value) Возвращает максимальное значе- ние в столбце дня группы строк. 64 Окончание таблицы 5.2 j SUM([ ALL | DISTINCT ] Возвращает сумму всех значе- , value) | ний value для группы строк. ••Пример 1. Предположим, что мы хотим узнать, сколько име- ется различных поставщиков в таблице Goods. Введём следующий оператор: SELECT COUNT(Supplier) FROM Goods В качестве результата будет выведено одно значение - 45. Однако это не тот результат, который нам нужен, поскольку он включает повторяющиеся значения. Чтобы подсчитать только уни- кальные названия поставщиков следует использовать ключевое слово DISTINCT: SELECT COUNT (DISTINCT Supplier) FROM Goods Будет получен другой правильный результат. COUNT 19 Замечание. Полученное число поставщиков равно количеству записей в таблице Suppliers. ••Пример 2. Вычислить среднюю стоимость товаров в Goods: SELECT AVG(Price) FROM Goods Результат будет иметь следующий вид: A VG 45,568000 ФПример 3. В одном операторе SELECT можно применять не- сколько агрегатных функций. Введём следующий оператор, кото- рый подсчитывает число служащих и сотрудника с наибольшим стажем: 65 SELECT COUNT(Surname), MIN(DateHiring) FROM Employees Результат будет иметь вид: COUNT M1N 2 1992-01-05 Замечание. Если некоторое значение, вовлечённое в подсчёт аг- регатной функцией, есть NULL или является неизвестным, то данная строка игнорируется целиком, чтобы избежать фатачьной ошибки. Например, если вычисляется среднее значение для пятиде- сяти строк, десять из которых содержат значение NULL, то в действительности это значение будет являться средним значени- ем. для сорока строк. ФПример 3. Чтобы увидеть, как агрегатная функция игнорирует строки, содержащие значения NULL выполним следующий тест. SELECT FAX FROM SUPPLIERS Полученный результат состоит из 19 строк, 11 из которых равны NULL. Подсчитаем число значений в столбце Fax: SELECT COUNT(Fax) FROM Suppliers Результат будет содержать число восемь, а не 19. 3.4 Группирование и упорядочение результата запроса 3.4.1 Применение предложения ORDER BY Строки таблиц базы данных не хранятся в каком-либо опреде- лённом порядке. После выполнения запроса можно обнаружить, что порядок следования строк нас не устраивает. Предложение ORDER BY позволяет нам указать желаемый порядок следования строк в результате запроса. Также можно применить предложение GROUP BY. чтобы сгруппировать результаты агрегатных функций. Для сортировки можно использовать один или более столбцов 66 посредством указания имён или порядковых номеров. Предложение ORDER BY имеет следующий синтаксис: ORDER BY [col_name | int] [ASCfENDING] | DESCENDING]] [ , . . . ] Обратим внимание на то, что можно определить несколько столбцов, на основании которых будет осуществляться сортировка, а также на то, что ссылаться на столбцы можно не только по их именам, но и по порядковым номерам их следования в предложении SELECT. По умолчанию SQL сервер использует возрастающий по- рядок (ASCENDING), однако мы можем определить и убывающий (DESCENDING) порядок. ••Пример 1. Выполним следующий запрос: SELECT Mark, Price FROM Goods WHERE Price > 70 Здесь не определен какой-либо порядок вывода результирующих строк, и результат будет иметь следующий вид: Mark Price HDD Seagate Baracuda 4 40Gb 87 HDD IBM 60Gb 79 Canon LBP810 185 Samsung 550B 150 Epson EPL520 90 Intel P4 1700MHz Box 137 Samtron 76E 180 Asus A7S333 86 TV-tuner Aver MediaTV Studio 75 ••Пример 2. Выполним тот же самый запрос, но с сортировкой по столбцу Mark: SELECT Mark, Price FROM Goods 67 WHERE Price>70 ORDER BY Mark Обратим внимание, что, результирующий набор отсортирован по столбцу Mark в алфавитном порядке по возрастанию. ••Пример 3. Упорядочим теперь результирующий набор по столбцу Price таблицы Goods: SELECT Mark, Price FROM Goods WHERE Price>70 ORDER BY Price ФПример 4. Выполним предыдущий запрос, но изменим поря- док сортировки на убывающий: SELECT Mark, Price FROM Goods WHERE Price>70 ORDER BY Price DESC ФПример 5. Чтобы увидеть эффект от сортировки по несколь- ким столбцам, выполним очередной запрос: SELECT Surname, Name, HomeTelephone FROM Employees ORDER BY Surname DESC, Name Обратим внимание, что две строки фамилий упорядочены в убы- вающем порядке, а имена — в возрастающем по умолчанию. 3.4.2 Применение предложения GROUP BY Когда мы применяем запрос (оператор SELECT), содержащий как агрегатные функции (AVG, COUNT, MIN, МАХ, или SUM), так и обычные столбцы, необходимо использовать предложение GROUP BY для группирования результирующего набора по каждо- му неа1регатному столбцу. При этом применяются три правила: 68 • каждый не агрегированный столбец результирующего набора должен появиться в предложении GROUP BY; • предложение GROUP BY может ссылаться только на столб- цы, которые упомянуты в предложении SELECT; • каждое предложение SELECT в запросе может иметь только одно предложение GROUP BY. Группы определяются как подмножества строк, соответствую- щих данному значению столбца, определённому в предложении GROUP BY. ФПример. Группирование результирующего набора, содер- жащего агрегатные функции. Выполним следующий запрос, что- бы определить количество сотрудников по каждой стране: SELECT COUNT(CodeOrder), Client FROM Orders GROUP BY Client Результат должен иметь следующий вид: COUNT Client 1 E-Life 1 IMC Computers 1 Net Line 1 Olymp 1 Белкантон 2 Bepca 1 Интеллекте 2 Соло 1 Эликон-М 3.4.3 Применение предложения HAVING Также как предложение WHERE уменьшает количество строк, возвращаемых оператором SELECT, предложение HAVING может уменьшить число строк, возвращаемых предложением GROUP BY. Подобно предложению WHERE предложение HAVING содержит 69 условия поиска. Однако эти условия обычно применяются к агре- гатным функциям, содержащимся в предложении SELECT. • Пример 1. Управление запросом посредством GROUP BY и HAVING. Применим следующий запрос, чтобы получить список клиентов, заказавших товаров на общую сумму свыше 100, и упо- рядочим результат по клиентам: SELECT Client, SUM(Price) FROM Orders, Ordered WHERE Orders.CodeOrder=:Ordered.CodeOrder GROUP BY Client HAVING SUM(Price) > 100 ORDER BY Client Результат должен иметь следующий вид: Client SUM Olymp 119 Соло 113 •Пример 2. Сортировка результирующего набора по результату агрегатной функции. Но что, если в предшествующем примере мы захо- тели бы упорядочить результат не по клиентам, а по общей сумме зака- зов? Веда, в предложении ORDER BY должна быть ссылка на имя столб- ца из предложения SELECT, в то время как в нашем примере столбец, содержащий общую сумму згказов, представлен именем агрегатной функции. В гаком случае мы должны воспользоваться второй альтерна- тивой синтаксиса предложения ORDER BY (ORDER BY [col_name | int]) — использовать порядковый номер столбца в предложении SELECT. Вернёмся к последнему запросу и изменим предложение ORDER BY в соответствии со следующим примером: SELECT Client, SUM(Price) FROM Orders, Ordered WHERE Orders.CodeOrdei^ Ordered .CodeOrder GROUP BY Client HAVING SUM(Price) > 100 ORDER BY 2 70 результирующий набор должен быть отсортирован по второму столбцу в возрастающем порядке: Client S U M Соло ИЗ Olymp 119 4 Контрольные вопросы 1) Объясните, что такое подзапрос и чем он отличается от за- проса. 2) В каком предложении инструкции SELECT можно использо- вать подзапрос? 3) Можно ли применять подзапрос в Инструкции Transact-SQL INSERT? 4) Можно ли применять подзапрос в Инструкции Transact-SQL UPDATE? 5) Можно ли применять подзапрос в Инструкции Transact-SQL DELETE? 6) Для чего служит инструкция ORDER BY и как её определить визуальными средствами? 7) Для чего служит инструкция GROUP BY и как её определить визуальными средствами? 8) Перечислите состав агрегатных функций и укажите порядок их применения. 71 ЛАБОРАТОРНАЯ РАБОТА № 6 СОЗДАНИЕ ПРЕДСТАВЛЕНИЙ 1 Цель работы 1) Научиться создавать и использовать представления. 2 Задание 1) Изучить правила создания и применения представлений и вы- полнить предложенные примеры. 3 Порядок выполнения работы 3.1 Создание представлений Представление (View) представляет собой виртуальную табли- цу, содержащую выбранные строки и столбцы из одной или не- скольких таблиц или других представлений. MS SQL Server хранит только определения представлений. Представление часто работает как секретное устройство, по- скольку можно предоставить пользователям разрешение работать с представлением, а не с оригинальными таблицами. Таким образом, пользователи могут работать только с данными, имеющимися в представлении, в то время как остальные данные остаются недос- тупными. Представления обычно используют для сохранения часто приме- няемых запросов или наборов запросов к базе данных. Выборка из представления осуществляется так же, как из таблиц, хотя другие операции имеют ряд ограничений. В следующем упражнении будет использована инструкция CREATE; VIEW языка Transact-SQL для создания списка постав- щиков со всеми поставляемыми ими товарами путём выборки Title, 72 Address, Telephone из таблицы Suppliers, а также Category, Mark, Price, InWarehouse, Expected, MinimalStock, DeliveriesStopped из таблицы Goods. Так как представление сохраняется в базе данных, а запрос — нет, процесс создания нового представления отличается от процесса создания запроса. Для создания представления: 1. в обозревателе объектов щелкните правой кнопкой мыши узел Представления и в контекстном меню выберите пункт Добавить новое представление. 2. Продолжите конструировать представление так же, как за- прос SELECT. Примечание. Однако в отличие от конструирования запроса SELECT, для представлений имеются некоторые ограничения. До- полнительные сведения см. в разделе Представления (п. 4.6. Кон- спекта лекций). Открыть представление можно с помощью команды Modify View или Open View. Открытие результатов представления в области «Результа- ты» конструктора представлений: 1. в обозревателе объектов щелкните правой кнопкой мыши представление и выберите Изменить представление. 2. Откроется окно конструктора запросов и представлений, об- ласть «Результаты» которого отображает данные, содержа- щиеся в представлении. Для отображения других областей в меню Конструктора запросов выберите Область, а затем щелкните область, которую хотите открыть. Открытие определения представления: в обозревателе объектов щелкните правой кнопкой мыши пред- ставление и выберите Проект (Изменить в версии с пакетом об- новления 1 или более ранней версии). Примечание. По умолчанию, конструктор запросов и представ- лений открывает все свои области («SQL», «Критерии», «Диа- грамма» и «Результаты»), но эту настройку можно изменить в 73 диалоговом окне Параметры. Для открытия этих областей, если они закрыты, в меню Конструктора запросов и представлений укажите Область и выберите область, которую хотите от- крыть. Сохранение представления. При сохранении представления изменяется определение представления на сервере. В компоненте Database Engine используется новое определение представления при сохранении представления. Для сохранения представления: ). откройте определение представления в конструкторе запро- сов и представлений и измените его. 2. В меню Файл выберите Сохранить view name, где view_name — имя открытого представления. Переименование представления. Изменить имя представления невозможно. Вместо этого необходимо создать новое представле- ние с другим именем и скопировать в него определение старого представления. Это можно сделать посредством следующих шагов: 1. создайте новое представление с именем по вашему усмотре- нию. 2. Откройте старое представление в конструкторе запросов и представлений. 3. Скопируйте весь текст на панели SQL. 4. Вернитесь к новому представлению и вставьте текст. Внимание! При переименовании представления фрагменты ко- да и приложения, использующие это представление, могут привес- ти к сбою. Это относится к запросам, представлениям, хранимым процедурам, пользовательским функциям и клиентским приложе- ниям. Учтите, что возникновение ошибок будет происходить кас- кадно. Прежде чем переименовывать представление, следует хо- рошо продумать, к чему это может привести. '•Пример 1. Создание представления Supplier. Визуальными средствами создайте представление Supplier на основе таблиц Suppliers и Goods, определяемое следующей инструкцией: CREATE VIEW Supplier AS SELECT Title, Address, Telephone, Category, Mark, Price, 74 In Warehouse, Expected, MininialStock, DeliveriesStopped FROM Suppliers, Goods WHERE Goods.CodeSuppliers=Suppliers.CodeSuppliers Предложение WHERE говорит MS SQL Server как соединять строки таблиц между собой: столбец CodeSuppliers таблицы Goods является внешним ключом, который ссылается на столбец Code- Suppliers таблицы Suppliers. Оба столбца являются уникальными и не допускают неопределённых значений (NOT NULL), таким обра- зом, значение столбца CodeSuppliers однозначно идентифицирует строку таблицы Suppliers. Просмотрите результат выполнения одним из вышеописанных способов. ^Пример 2. Визуальными средствами создайте представление MarkFromGoods на основе следующей инструкции: SELECT Mark FROM Goods WHERE Supplier = (SELECT Supplier FROM Goods WHERE Mark-Lexmark Z35') ••Пример 3. Визуальными средствами создайте, представление Clients SV Trading на основе нижеследующего запроса, который выбирает название товара и фирмы, заказавшей какой-либо товар фирмы «SV-Trading». SELECT Client, Goods FROM Orders, Ordered WHERE (Goods IN (SELECT Mark FROM Goods WHERE Supplier='SV-Trading')) AND Orders.CodeOrder=Ordered.CodeOrder ••Пример 4. Визуальными средствами создайте представление ALL_Goods с использованием квантора ALL на основе нижесле- дующей инструкции: SELECT Supplier, Mark, Price FROM Goods WHERE Price > ALL(SELECT Price FROM Goods 75 WHERE Supplier-CD-Life') 4 Контрольные вопросы 1) Объясните, чем отличается представление от запроса. 2) Для каких целей применяется представление? 3) Укажите порядок создания представления визуальными средствами. 4) Можно ли обновлять данные посредством представлений? 5) Можно ли создать представление на основе нескольких таб- лиц? 76 ЛИТЕРАТУРА 1. Solid Quality Learning Microsoft SQL Server 2005. Реализация и обслуживание. Учебный курс Microsoft / пер. с англ. — М.: «Русская Редакция», СПб.: «Питер», 2007. - 768 е.: ил. 2. Электронная документация по SQL Server 2008 [Электрон- ный ресурс] - Режим доступа: http://msdn.microsoft.c£,my'ru" ru/library/ms365325.aspx, свободный. - Загл. с экрана. 3. Библиотека MSDN [Электронный ресурс] - Режим доступа: http://msdn.microsoft.com/ru-ru/library/default.aspx, свобод- ный. - Загл. с экрана. 77 ПРИЛОЖЕНИЯ Приложение 1 Сценарий заполнения данными базы данных BOREI /* Заполнение таблицы "Типы" */ SET IDENTITY INSERT Types ON; INSERT INTO Types (CodeType, Category) VALUES (2, 'Принтеры'); INSERT INTO Types (CodeType, Category) VALUES (3, 'Материнские платы'); INSERT INTO Types (CodeType, Category) VALUES (4, 'Процессоры'); INSERT INTO Types (CodeType, Category) VALUES (5, 'Модули памяти'); INSERT INTO Types (CodeType, Category) VALUES (6, 'Видеокарты'); INSERT INTO Types (CodeType, Category) VALUES (7, 'Звуковые карты'); INSERT INTO Types (CodeType, Category) VALUES (8, 'Устройства ввода и указания'); INSERT INTO Types (CodeType, Category) VALUES (9, 'Колонки, наушники, микрофоны'); INSERT INTO Types (CodeType, Category) VALUES (10, 'Корпуса и блоки питания'); INSERT INTO Types (CodeType, Category) VALUES (11, 'Жесткие диски'); INSERT INTO Types (CodeType, Category) VALUES (12, 'Флоппи-дисководы'); INSERT INTO Types (CodeType, Category) VALUES (13, 'CD-ROM'); INSERT INTO Types (CodeType, Category) VALUES (14, 'Носители'); INSERT INTO Types (CodeType, Category) VALUES (15, 'Модемы'); INSERT INTO Types (CodeType, Category) VALUES (16, 'Сетевое оборудование'); SET IDENTITY J N S E R T Types OFF; /* Заполнение таблицы "Поставщики" */ SET IDENTITY INSERT Suppliers ON; INSERT INTO Suppliers: (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone, Fax) VALUES (3, 'EtelSoft', 'Андрей Герасимов', 'Представитель', '707 Оксфорд', 'Анн-Арбор', '48104', 'США', '(313) 555-5753*, '(313) 555-3349'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone) VALUES (4, 'Iven', 'Антон Сеткин', 'Главный менеджер', '9-8 Секимаи', 'Токио', '100', 'Япония', '(03) 3555-5011'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, 78 C o u n t r y . T e l e p h o n e ) VALUES (5. 'SV-Trading', 'Валерия Евенкова' , 'Директор', '92 Сетсако' . 'Осака'. '545', 'Япония'. '(06) 431 -7877'): INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone, Fax) VALUES (6, 'CD-Life' , 'Наталия Отока', 'Главный менеджер', '74 ул. Роз', •Мельбурн', '3058', 'Австралия', '(03) 444-2343', '(03) 444-6588'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country- Telephone) VALUES (7, 'Stepfor', 'Павел Фокин' , 'Представитель', 'ул. Королевского пути, 29', 'Манчестер', 'М14 GSD', 'Великобритания' , '(161) 555-4448'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, I lndex, Country, Telephone. Fax) VALUES (8, 'B.S.T.Group', 'Евгений Шаматранов' , 'Продавец1, 'Каладоган 13', Тетеборг' , 'S-345 67', 'Швеция', '031-987 65 43', '031-987 65 9Г) ; INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country. Telephone) VALUES (9, 'Biocom', 'Вячеслав Путеев', 'Главный менеджер', 'ул. Американская 12.890', 'Сан-Паулу' , '5442', 'Бразилия', '(11) 555-4640'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, i lndex. Country, Telephone) VALUES (10, 'DAAS', 'Петр Моргунов' , 'Менеджер по продажам', 'Тверская 5', 'Москва', '101785', 'Россия'. ' (095)998-4510 ); INSERT IN FO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone, Fax) VALUES (11, 'Конструктив', 'Федор Куполов', 'Представитель', 'ул. Данте 75', 'Равенна', '48100', 'Италия'. ' (0544) 60323', '(0544) 60603'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, I Index, Country, Telephone) VALUES (12, 'Виола-Сервис', 'Виктор Кухарчук', 'Главный менеджер', 'ул. Хатлевеген, 5', 'Сандвикен', '1320', 'Норвегия', '(0)2-953010'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone) VALUES (13, 'Гвин-Медиа', 'Артем Столяров' , 'Местный представитель', '3400-8 Авеню', 'Бенд'. '97101', 'США', '(503) 555-993 Г); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone) VALUES (14, 'Q-Senter'. 'Александр Осипенко' , 'Представитель', 'ул. Бровайдер, 231', 'Стокгольм', 'S- I23 45', 'Швеция', '08-12.3 45 67'); INSERT INTO Suppliers (CodeSuppliers, Title, Address! о. Post, Address. City, Ilndex. Country, Telephone, Fax) VALUES (15, 'Техинтерторг', 'Дарья Борщева' , 'Агент по продажам', 79 'Частный Департамент'. 'Бостон'. '02134', 'США', '(617) 555-3267', '(617) 555-3389'); INSERT INTO Suppliers (CodeSuppliers. Title. AddressTo. Post. Address. City, ilndex. Country, Telephone) VALUES (16. 'Ситипринт'. 'Инна Риякевич', 'Совладелец', 'ул. Серашун. 471'. 'Сингапур', '0512'. 'Сингапур', '555-8787'); INSERT INTO Suppliers (CodeSuppliers. Title. AddressTo, Post, Address, City. Ilndex. Country. Telephone, f ax) VALUES (17. 'Юнити Сервис1. 'Алексей Жолнсрович', 'Менеджер по продажам', 'ул. Лингбиеилд1, 'Лингби', '2800', 'Дания'. '43844108', '43844115'); INSERT INTO Suppliers (CodeSuppliers. Title, AddressTo, Post, Address, City, Ilndex, Country, Telephone) VALUES (18. 'ПК Сервис'. 'Юрий Бартошек', 'Менеджер по продажам', 'ул. Войрон, 22', 'Монсо', '71300', 'Франция', '85-57-00-07'); INSERT INTO Suppliers (CodeSuppliers, Title, AddressTo. Post, Address. City. Ilndex, Country, Telephone, Fax) VALUES (19, 'Астлайн', 'Руслан Сидкж'. 'Бухгалтер', 'ул. Чессер, 148'. 'Оге-Хиацинте', 'J2S 7S8', 'Канада'. '(514) 555-2955', '(514) 555-292Г); SET IDENTIT Y INSERT Suppliers OFF; /* Заполнение таблицы "Клиенты" */' SET IDENTITY INSERT Clients ON; INSERT INTO Clients (CodeClient, 'litle, AddressTo. Post, Address, City, Ilndex, Country, Telephone, Fax) V A L U E S ( T , 'Ovihkc', 'Андрей Ханавин'. 'Координатор', 'ул. Бергуса, 8'. 'Лулео', 'S-958 22', 'Швеция', '0921-12 34 65', '0921-12'34 67'); INSERT INTO Clients (CodeClient, Title, AddressTo, Post. Address. City, Ilndex. Country, Telephone) VALUES ('2', 'МАП Инфо', 'Виктория Асворд', 'Представитель', 'ул. Цикровая'. 'Лондон', 'ЕС2 5N4T', 'Великобритания', '(171) 555-1212'); INSERT INTO Clients (CodeClient, Title, AddressTo, Post, Address, City, (Index. Country, Telephone. F'ax l VALUES ('3', 'Белкантон', 'Андрей Карпухин', 'Главный менеджер', 'ул. Гарсиа, 9993', 'Мехико', '05022', 'Мексика', '(5) 555-3392'. '(5) 555-7293'); INSERT INTO Clients (CodeClient. Title, AddressTo, Post, Address, City, Ilndex. Country, Telephone) VALUES ('4', 'Дамодара-Сервис', 'Лидия Кулаева', 'Совладелец', 'ул. Эдальго, 29'. 'Берн', '3012'. 'Швейцария'. '0452-076545'):. INSERT INTO Clients (CodeClient, Title, AddressTo. Post, Address. City, Ilndex. Country, Telephone. Fax) VALUES ('5'. 'E-Life', 'Роланд Мендель', 'Менеджер по продажам', 80 Vi. Кировская. 6', Трасс' . '8010'. 'Авария ' , '7675-3425', '7675-3426')-. INSERT INTO Clients (CodeClient. 1'itle, AddressTo. Post. Address, City. Ilndex. C o u n t r y . Telephone) V..\l Л 'ES ('6'. 'IMC Computers', 'Мария Ларсон', 'Совладелец', 'ул. Ксргатая. 24', Ърекке'. 'S-844 67', 'Швеция', '0695-34 67 2 Г); INSERT INTO Clients (CodeClient, Title, AddressTo, Post, Address. City, Ilndex, Country. Telephone. Fax) VALUES ('7'. 'Верса', 'Питер Франкен', 'Главный менеджер', 'Берлинская пл., 43', 'Мюнхен'. '80805', Термания' . '089-0877310', '089-087745 Г); INSERT INTO Clients (CodeClient, Title, AddressTo, Post, Address, City, Ilndex, Country. Telephone, Fax) VALUES ('8'. 'Comtris'. 'Мария Хосе'. 'Совладелец', 'ул. Палое. 5S', 'Каракас'. '108Г, 'Венесуэла', '(2) 283-295 Г, '(2) 283-3397'); INSERT INTO Clients (CodeClient, Title. AddressTo, Post, Address. City. Ilndex, Country. Telephone, Fax) VALUES ('9', 'Net Line', 'Марио Ионтес', 'Бухгалтер', 'ул. Ракко, 67'. •Рио-де-Жанейро', '05454-876', 'Бразилия', '(21) 555-009Г. '(21) 555-8765'); INSERT INTO Clients (CodeClient, Title, AddressTo, Post, Address, City, Ilndex. Country. Telephone, Fax) VALUES ('10'. 'NTTs', 'Карлос Хемандос', '11релсгавигель', 'ул. Карлос, 22', 'Сан-Кристобаль', '5022', 'Венесуэла', '(5) 555-1340', '(5) 555-1948'); INSERT INTO Clients (CodeClient, Title, AddressTo, Post, Address. City, Country, telephone, Fax) VALUES ('11', 'Интеллекте. 'Патрисия Кемма', 'Ученик продавца'. 'Джонстоун шоссе, 8', 'Корк', 'Ирландия', '2967 542', '2967 3333'): INSERT INTO Clients (CodeClient, Title. AddressTo, Post, Address. City. Ilndex. Country. Telephone, Fax) VALUES ('12', 'ZS', 'Максим Анищенко', 'Бухгалтер'. 'Бодиварская, 52'. Ъаркисимею'. '3508', 'Венесуэла', '(9) 331-6954', '(9) 331-7256'); INSERT INTO Clienis (CodeClient, Title, AddressTo, Post, Address, City. [Index. Country. Telephone, Fax) VALUES ('13', 'Медиа-софт', Джовани Ровелли', 'Главный .менеджер', 'ул. Людовика. 22', 'Бергамо', '24100', 'Италия', '035-640230', '035-640231'); RMSERT INTO Clients (CodeClient, Title, AddressTo, Post, Address, City. Ilndex, Country. Telephone, Fax) VALUES ('14', 'Эликон-М', 'Александр Боровик-', 'Представитель', 'ул. Беринговая. 2743', 'Анкоридж', '99508', 'США', '(907) 555-7584', '(907) 555- 2880'); INSERT INTO Clients (CodeClient, Title. AddressTo, Post, Address. City, Ilndex, Country, Telephone) VALUES (45', 'Stop', 'Игнат Довидовский', 'Бухгалтер', Тачерстрасе, 10', 'Ккжевальд', '01307'. 'Германия', '0372-035 188'); 81 INSERT INTO Clients (CodeClient. Title, AddressTo. Post, Address. City, Ilndex, Country* Telephone, Fax) VALUES ('16', 'Соло'. 'Андрей Савельев', 'Ученик продавца', 'ул. Провинциальная, 124', 'Реджио-Эмилио', '42100'. 'Италия', '0522-556721', '0522- 556722'); INSERT INTO Clients (CodeClient, Title, AddressTo. Post, Address. City. Ilndex. Country, Telephone. Fax) VALUES ('17'. 'Olymp'. 'Юрий Макаров'. 'Бухгалтер', 'ул. Виа, Г, 'Мадрид'. '28001', 'Испания'. '(91) 745 6200', '(91) 745 6210'); INSERT INTO Clients (CodeClient, Title, AddressTo. Post, Address, City, Ilndex, Country, Telephone, Fax) VALUES ( '18, 'Oki', 'Александр Гронский', 'Представитель', 'ул. Кастро. 414', 'Сан-Паулс', '05634-030', 'Бразилия', '(11) 555-2167', '(11) 555-2168'); SET IDENTITY. INSERT Clients OFF; /* Заполнение таблицы "Доставка" */ INSERT INTO Deliveries (CodeDelivery, Title, Telephone) VALUES (I , 'Ространс', '(017) 972-9831'); INSERT INTO Deliveries (CodeDelivery, Title, Telephone) VAL UES (2, 'Почта', '(017) 124-3199'); INSERT INTO Deliveries (CodeDelivery, Title, Telephone) VALUES (3. 'Иное', '(017)211-9931'); /* Заполнение таблицы "Сотрудники" */ SET IDENTITY INSERT Employees ON; INSERT INTO Employees (CodeEmployee, SurName, Name, Post, Reference, DateBirth, DateHiring, Address, City, Ilndex, Country, HomeTelephone, Additional, Submits) VALUES (2. 'Белова'. 'Мария', 'Представитель', 'г-жа.', '08.12.1968', '01.05.1992', 'ул. Нефтяников, 14-4'. 'Минск', '122981', 'Беларусь', '(017) 555-9857', '124-5467', 'Новиков, Павел'); INSERT INTO Employees (CodeEmployee, SurName, Name. Post, Reference, DateBirth, DateHiring, Address, City, Ilndex, Country, HomeTelephone, Additional, Submits) VALUES (8. 'Крылова', 'Анна', 'Внутренний координатор', 'г-жа.'. '09.01.1958', '05.03.1994 . 'ул. Лесная. 12-456'. 'Минск', '105001'. 'Беларусь', '(017) 555-1189', '124-2344', 'Кротов. Андрей'); SET IDENTITY, INSERT Employees OFF; 82 заполнение таблицы "Товары" */ Si j IDENTITY INSERT Goods ON; INSERT INTO Goods (CodeGoods. Mark, CodeS.ippliers, CodeType, Price, In Warehouse, Expected, MinimalStock) VALUES (1. 'Genius SP-G06', 1, 9, 9.00, 20, 10, 10); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected) VALUES (2, 'Наушники Dialog М-750НУ+микрофон' , 8, 9. 9.00, 15. 10); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) VALUES (3, 'ATX 2.03 300W', 19, 10. 35.00, 15, 5,10); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType. Price, InWarehouse) VALUES (4, 'ATX Midi Tower 350W', 7, 10, 55.00, 5); INSER T INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) VALUES (5, 'Блок питания ATX 235/250/300W', 5. 10, 14.00, 20, 10, 5): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) VALUES (6, 'HDD Maxtor 30Gb' , 16, 11, 69.00, 10, 2, 8); INSERT IN I О Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price) VALUES (7. 'HDD Seagate Baracuda 4 40Gb', 1 ,11 , 87.00); INSERT INTO Goods (CodeGoods, Mark. CodeSuppliers, CodeType, Price, InWarehouse) VALUES (8, 'HDD IBM 60Gb' , 13, 11, ^9.00, 5); INSERT INTO Goods (CodeGoods. Mark, CodeSuppliers, CodeType, Price, Li Warehouse, Expected, MinimalStock) VALUES (9, T E A C , 4, 12, 9.00, 15, 10, 10); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price) V A L U E S (10, 'Samsung', 14, 12, 13.00); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected) VALUES (11, 'Samsung 52x', 8, 13, 23.00, 5, 5); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse) VALUES (12, 'TEAC 52x CD-522E' , 3, 13, 42.00, 7); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) VALUES (13, 'CD-RW/ROM T E A C , 11, 13, 25.00, 20. 10. 10); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) 83 VALUES 114, 'Verbatim'. 3. 14. 0.28. 300, 100. 50): INSERT INTO Goods (CodeGoods. Mark, CodeSuppliers, CodeType. Price. InWarehouse. Expected, MinimalStock) VALUES (15, 'CD-R TDK 12x'. 19. 14, 0.62. 200, 100, 50); INSER T INTO Goods (CodeGoods, Mark, CodeSuppliers. CodeType. Price, InWarehouse, Expected) VALUES (16, 'CD-R/RW Verbatim 650/700 Mb', 9, 14, 0.98. 200, 100): INSERT INTO Goods (CodeGoods, Mark. CodeSuppliers. CodeType, Price, InWarehouse, Expected) VALUES (17, '3COM USR Zyxel', 4, 15, 18.00, 10. 5); INSERT INTO Goods (CodeGoods. Mark. CodeSuppliers, CodeType, Price. InWarehouse) VALUES (18, 'ACORP 56EMS. USB'. 5, 15. 40.00, 5); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers. CodeT ype, Price. InWarehouse. Expected) VALUES (19, '3COM SOHO 100TX', 10. 16, 22.00, 15. 5); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price. InWarehouse, Expected) VALUES (20, 'HUB 10/t00Mbit', 3, 16, 32.00, 10, 5); INSERT INTO Goods (CodeGoods. Mark. CodeSuppliers, CodeType, Price. InWarehouse. Expected, MinimalStock) VALUES (2 L 'Switch 10/100Mbit', 13, 16, 32.00, 10, 10, 5): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) VALUES (22, 'Кабель "витая пара" UTP cat.5'. 4, 16, 0.18, 100, 100, 20): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers. CodeT ype. Price, InWarehouse, MinimalStock, DeiiveriesStopped) VALUES (23, 'Canon LBP810'. 3, 2, 185.00, 39, 5, 'YES'): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType. Price, InWarehouse. MinimalStock) VALUES (24, 'Accorp VlA266i815D\ 7. 3, 61.00, 29, 10): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, Del i veriesStopped) VALUES (25, 'TNT2 M64 32Mb'. 7, 6, 28.00, 'YES'): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers. CodeType, Price, InWarehouse. MinimalStock) VALUES (26, 'DDR 128Mb', 9, 5, 38.00, 34, 25): INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType. Price, InWarehouse, DeiiveriesStopped) VALUES (27, 'Samsung 550B', 10, 1, 150.00. 20, 'YES'); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, Code Type, Price. InWarehouse, MinimalStock) 84 \ МЛ I S (28, 'Gigabyte GA-60XTA'. 11,3. 64.00. 76, 30): ) N s r . K T INTO Goods (CodeGoods. Mark. CodeSuppliers, CodeType. Price, InWarehouse. DeliveriesStopped) VALUES (29, 'Creative Labs SB Life', 12. 7, 9.00, 26. 'YES'); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price. InWarehouse, MinimalStock) VALUES (30, 'Mouse Logitech B69', 13. 8, 15.00, 10, 15); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers. CodeType, Price. InWarehouse) VALUES (31, 'Epson EPL520'. 6. 2, 90.00, 76); INSER T INTO Goods (CodeGoods. Mark, CodeSuppliers. Code Type. Price, [nWarehouse, MinimalStock) VALUES (32. 'Celeron 1000MHz', 15, 4, 51.00. 26, 15); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, Expected. MinimalStock) VALUES (33, 'Intel P4 1700MHz Box', 14, 4, 137.00, 70. 20); INSER T INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, InWarehouse, Expected, MinimalStock) VALUES (34. 'AMD Athlon 1333MHz', 6, 4. 53.00, 9. 40, 25); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price, 1 n W arehouse. M in i ma 1Stock) VALUES (35, 'Samtron 76E', 16, 1, 180.00, 1 I. 15); INSERT INTO Goods (CodeGoods, Mark., CodeSuppliers, CodeType, Price, InWarehouse. MinimalStock) VALUES (36, 'Коврики пластиковые', 17, 8, 0.50. 112, 20); INSERT INTO Goods (CodeGoods. Mark. CodeSuppliers, CodeType, Price, InWarehouse, MinimalStock) VALUES (37. 'Chicony PS/2 820 2981', 19, 8, 6.00, 23. 30); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, Code Type, Price, InWarehouse. DeliveriesStopped) VALUES (38, 'SDRAM 128Mb', 18, 5. 19.00, 26, 'YES'); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price. InWarehouse, MinimalStock) VALUES (39, 'Asus A7S333' . 6, 3, 86.00, 35, 30); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType, Price. InWarehouse, MiniinalStock) VALUES (40, 'Creative Labs SB Life 5.1+FM radio', 2, 7, 39.00, 10, 10); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers. CodeType, Price, InWarehouse. Expected, MinimalStock) VALUES (41, 'GeForce 2 MX 400 64Mb', 2, 6, 36.00, 10, 15, 24); INSERT INTO Goods (CodeGoods, Mark, CodeSuppliers, CodeType. Price, InWarehouse, Expected, MinimalStock) 85 VALUES (42. 'DIMM PC 133 128Mb Micron', 2, 5. 15.00. 21 ,10 . 30); INS К I INTO (ioods (CodeGoods. Mark, CodeSuppliers, CodeType. Price. InWarehouse. Expected, MinimalStock) VALUES (43, 'AND Duron 1000MHz', 9, 4, 36.00, 22, 10. 10); INSERT INTO Goods (CodeGoods. Mark, CodeSuppliers, CodeType. Price. InWarehouse, MinimalStock) VALUES (44. 'Lexmark Z35'. 5, 2, 62.00, 12, 25); INSERT INTO Goods (CodeGoods, Mark. CodeSuppliers, CodeType, Price, InWarehouse, DeiiveriesStopped) VALUES (45, TV-tuner Aver MediaTV Studio', 4, 6, 75.00. 29. 'YES'); SET IDENTITY INSERT Goods OFF; /* Заполнение таблицы "Заказы" */ SET IDENTITY INSERT Orders ON; INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation. DatePuipose, DateExecution, CodeDelivery, CostDeliverv, TitleAddressee. AddressAddressee, CityAddressee. IndexAddressee. CountryAddressee) VALUESO 1010. '16', 2, '01.05.1992', '05.03.1994', '01.05.1992'. 2, 28.70, 'Соло', Тачеретрасс. 10', 'Лондон', 'WX3 6FW', 'Великобритания'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation, DatePuipose, DatcExecution, CodeDelivery, CostDelivery, TitleAddressee, AddressAddressee, CityAddressee, IndexAddressee. CountryAddressee) VALLESt l 1011, '6', 8, '01.05.1992"', '05.03.1994', '01.05.1992'. 1, 1.21, 'IMC- Computers', 'ул. Мойте, 34', 'Берлин', '12209', 'Германия'): INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee. DateAccomodation, DatePurpose, DateExecution, CodeDelivery, CostDelivery, TitleAddressee, AddressAddressee, CityAddressee, IndexAddressee. CountryAddressee) VALUES! 11012, '7', 2, '01.05.1992', '05.03.1994'. '01.05.1992', 3, 243.00. 'Bepca'. 'ул. Джардем, 32', 'Мюнхен', '80805', 'Германия'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation, DatePuipose, DateExecution, CodeDelivery, CostDelivery, TitleAddressee. AddressAddressee, CityAddressee, IndexAddressee, CountryAddressee) VALUES! 11013, '17'. 8. '01.05.1992'. '05.03.1994', '01.05.1992'. 1, 33.00, 'Olymp', 'ул.Каталаяа. 23', 'М'адрид', '2800Г, 'Испания'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation. DatePuiposc.DatcExecution, CodeDelivery, CostDelivery, TitleAddressee, AddressAddressee, CityAddressee, IndexAddressee. CountryAddressee) VALUES) 11014, '14', 2. '01.05.1992'. '05.03.1994'. '01.05.1992.', 3, 23.60, 'Эликон-М', 'ул. Беговая, 7', 'Бранденбург', '14776', 'Германия'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation, 86 DatePurpose. DateExecution. CodeDelivery, Cost Del ivory, TitleAddressee. AddressAddressee. CilvAddressee. IndexAddressee. Conn try Addressee) VAElJESfl 1015. '1Г. 8. '01.05.1992'. '05.03.1994'. '01.05.1992'. 2. 4.62. 'Интеллекте ' . 'Бразильская пл., 442', 'Ставерен'. '4110'. 'Норвегия'): INSHR'1' IN FO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation. DatePurpose. DateExecution. CodeDelivery , CostDelivery, TitleAddressee, AddressAddressee, CityAddressee. IndexAddressee, CountryAddressee) VAl UES(11016 . '7 ' , 2 , '01.05.1992', '05.03.1994'. 01.05.1992'. 2, 33.80, 'Bepca', 'ул. Джардем. 32', 'Мюнхен' . '80805'. 'Германия'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation. DatePurpose. DateExecution. CodeDelivery. CostDelivery, TitleAddressee, AddressAddressee. CityAddressee. IndexAddressee. Country Addressee) V A L l ' E S d 1017, '5'. 8. '01.05.1992'. '05.03.1994'. 01.05.1992'. 2, 754.00. 'E-Life', 'ул. Мерхеместа, 369'. 'Юджин' . '97403'. 'США'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee, DateAccomodation, DatePurpose, DateExecution, CodeDelivery, CostDelivery. TitleAddressee. AddressAddressee, CityAddressee, IndexAddressee. CountryAddressee) VALUES(11018, '16', 2. '01.05.1992', '05.03.1994'. '01.05.1992'. 2, 11.70. 'Соло', 'Тачерстрасс, 10', 'Лондон', 'WX3 6 F W . 'Великобритания'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee. DateAccomodation, DatePurpose, DateExecution, CodeDelivery, CostDelivery. TitleAddressee, AddressAddressee, CityAddressee. IndexAddressee, Country Addressee) VALUES(11019, '3', 8, '01.05.1992', '05.03.1994', '01.05.1992'. 3, 3.17. 'Белкантон', 'ул. Карлос, 22', 'Буэнос-Айрес', '1010', 'Аргентина'); INSERT INTO Orders (CodeOrder, CodeClient, CodeEmployee. DateAccomodation, DatePurpose. DateExecution, CodeDelivery . CostDelivery. TitleAddressee. AddressAddressee. CityAddressee. IndexAddressee. CountryAddressee) V A L U E S d 1020. '9', 8, '01.05.1992''. '05.03.1994'. '01.05.1992', 2, 43.30, 'Net Line', 'ул. Кэш. 32 Г, 'Сан-Пауло'. '05432-043', 'Бразилия'): SET I DEN TITY INS E RT Orders OFF; !* Заполнение таблицы "Заказано" */ INSERT INTO Ordered (CodeOrder, CodeGoods. Amount, Discount) VALUES (11010,32 , 5, 0.15); INSERT rNTO Ordered (CodeOrder. CodeGoods, Amount) VALUES (11010. 44, 4); INSERT INTO Ordered (CodeOrder. CodeGoods, Amount) VALUES (11011, 16, 30); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount) VALUES (11011, 42, 8): INSERT INTO Ordered (CodeOrder, CodeGoods. Amount) 87 VALUES (11011, 43, 2); INSERT INTO Ordered (CodeOrder, CodeGoods. Amount) VALUES (11012, 9. 14); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount, Discount) VALUES (11012, 26, 9, 0.05); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount) VALUES (11013, 7, 9); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount) VALUES (11013, 21. 10); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount, Discount) VALUES (11014, 2, 16,0.1); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount, Discount) VALUES (11015, 6 ,2 , 0.15); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount) VALUES (11016, 16, 40); INSERT INTO Oidered (CodeOrder, CodeGoods, Amount) VALUES ( 11017, 12, 12); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount) VALUES (11018,14, 80); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount, Discount) VALUES (11019, 25, 7 ,0.25); INSERT INTO Ordered (CodeOrder, CodeGoods, Amount. Discount) VALUES (11020, 30, 6, 0.15); 88 Приложение 2 Сценарий обновления данных в базе данных BOREI UPDATE Goods SET Category=(SELECT Category FROM Types WHERE Goods CodeType Types CodeType): UPDATE Orders SET Client=(SELECT Title FROM Clients WHERE Orders.CodeClient=Clients. CodeClient); UPDATE Orders SET Employee=(SELECT Surname -+' . ' + Name FROM Employees WHERE Orders.CodeEmployee-Employees.CodeEmployee): UPDATE Orders SET Orders.Delivery=(SELECT Title FROM Deliveries WHERE Orders.CodeDelivery=Deliveries.CodeDeliveiy); UPDATE Ordered SET Ordered.Goods=(SELECT Mark FROM Goods WHERE Ordered. CodeGoods^Goods.CodeGoods); UPDAT E Ordered SET Ordered.Price={SELECT Price FROM Goods WHERE Ordered.CodeGoods=Goods.CodeGoods); Учебное издание БАЗЫ ДАННЫХ Лабораторный практикум для студентов специализации 1-40 01 02-01 «Информационные технологии в производстве и управлении» Составители: КОЧУРОВ Вадим Александрович ГЕРМАН Юлия Олеговна Подписано в печать 26.11.2010. Формат 60x84 '/16. Бумага офсетная. Отпечатано на ризографе. Гарнитура Тайме. Усл. печ. л. 5,23. Уч.-изд. л. 4,09. Тираж 100. Заказ 600. Издатель и полиграфическое исполнение: Белорусский национальный технический университет. ЛИ № 02330/0494349 от 16.03.2009. Проспект Независимости, 65. 220013, Минск.