енот. Урок 40. Пр.р. Язык SQL. Язык sql (многотабличная база данных, ms access)
Скачать 195.5 Kb.
|
Практическая работа «Язык SQL(многотабличная база данных, MS Access)»В этой работе вы познакомитесь с новой командой ALTER TABLE (изменить таблицу) языка SQL и научитесь составлять запросы к многотабличной реляционной базе данных. Создание и заполнение таблицИспользуя только SQL-запросы, постройте три таблицы для реляционной базы данных кафе (значок обозначает первичный ключ таблицы): Запишите соответствующие SQL-запросы: Ответ: CREATE TABLE [Заказы] ( [Номер] INTEGER NOT NULL PRIMARY KEY, [Дата] DATE(50) NOT NULL) CREATE TABLE [Заказано] ( [Код] INTEGER NOT NULL PRIMARY KEY, [Номер] VARCHAR(50) NOT NULL, [Цена] VARCHAR(20) NOT NULL) CREATE TABLE [Блюда] ( [Код] INTEGER NOT NULL PRIMARY KEY, [Название] VARCHAR(50) NOT NULL, [Цена] VARCHAR(20) NOT NULL) Теперь нужно построить связи между таблицами: Для этой цели используется команда ALTER TABLE (англ. изменить таблицу). Построить связь между таблицами – это значит задать ограничение (CONSTRAINT), которое связывает первичный ключ одной таблицы с полем соответствующего типа другой. Если связываемое поле второй таблицы – неключевое, то оно называется внешним ключом (FOREIGN KEY). Например, команда для создания связи 1:N между ключевым полем Номер таблицы Заказы и неключевым полем Номер заказа таблицы Заказано выглядит так: ALTER TABLE Заказано ADD CONSTRAINT ORDER_NO FOREIGN KEY([Номер заказа]) REFERENCES Заказы(Номер) Такая запись дословно означает: Изменить таблицу Заказано добавить связь ORDER_NO внешний ключ [Номер заказа] ссылается на поле Номер таблицы Заказы Здесь ORDER_NO – это просто имя, которое мы выбрали для этой связи (можно было выбрать и другое). Введите и выполните показанный выше SQL-запрос на добавление связи. Зайдите в меню Работа с базами данных – Схема данных и убедитесь, что связь действительно создана. Составьте и выполните SQL-запрос на добавление второй связи. Запишите этот запрос в поле для ответа. Ответ: С помощью SQL-запросов заполните базу следующими данными Выбор данных и сортировкаПостроим в режиме SQL запрос СоставЗаказа, который выводит номер заказа и название заказанных блюд. Эти данные находятся в двух таблицах – Заказано и Блюда, поэтому их нужно как-то объединить. Для этого используется связь 1:N между таблицами, которую мы недавно установили. Действительно, для каждой записи в таблице Заказано нужно выбрать название блюда из таблицы Блюда, код которого совпадает с полем Заказано.Код блюда. Это запрос на выборку данных, поэтому используем оператор SELECT'>SELECT_:_SELECT__Заказано.[Номер_заказа],_Блюда.Название_FROM__Заказано,_Блюда_WHERE__Заказано.[Код_блюда]_=_Блюда.Код'>SELECT: SELECT Заказано.[Номер заказа], Блюда.Название FROM Заказано, Блюда WHERE Заказано.[Код блюда] = Блюда.Код Здесь из таблиц Заказано и Блюда выбираются поля Номер заказа и Название; условие в последней строке связывает таблицы. Поскольку названия полей в таблицах, из которых идет выбор, не совпадают, можно было записать запрос в сокращенной форме, указав после оператора SELECT только названия нужных полей: SELECT [Номер заказа], Название FROM Заказано, Блюда WHERE Заказано.[Код блюда] = Блюда.Код Теперь добавим в запрос дату заказа. Она находится в таблице Заказы, которая пока в запросе не участвует. Таким образом, нам нужно объединить три таблицы. Условие отбора получается сложным, два условия (связи по коду блюда между таблицами Заказано и Блюда и по номеру заказа между таблицами Заказы и Заказано) объединяются с помощью логической операции AND (И): SELECT [Номер заказа], Дата, Название FROM Заказано, Блюда, Заказы WHERE Заказано.[Код блюда] = Блюда.Код AND Заказано.[Номер заказа] = Заказы.Номер Проверьте результат выполнения этого запроса. Измените запрос так, чтобы он выбирал только блюда из состава заказа № 1. Запишите этот запрос: Ответ: Построим еще один запрос Итоги, в котором для каждого заказа выводится его номер, дата и общая сумма (с помощью функции SUM). SELECT [Номер заказа], Дата, SUM(Цена) FROM Заказано, Блюда, Заказы WHERE Заказано.[Код блюда] = Блюда.Код AND Заказано.[Номер заказа] = Заказы.Номер GROUP BY [Номер заказа], Дата В последней строке указано, что по полям Номер заказа и Дата выполняется группировка, то есть сумма цен считается для каждой уникальной пары «Номер заказа – Дата». В таблице с результатами запроса заголовок столбца с суммой выглядит не совсем понятно для пользователя, например: «Expr1002» Для того, чтобы сделать у этого столбца заголовок «Сумма», нужно добавить в первую строку запроса после SUM("Цена") так называемый псевдоним (подпись) с ключевым словом AS: SELECT [Номер заказа], Дата, SUM(Цена) AS Сумма ... Проверьте результат выполнения этого запроса. Псевдонимы можно задавать для всех значений, которые выводятся в запросе. Измените запрос так, чтобы заказы были отсортированы в порядке убывания суммы (используйте ключевые слова ORDER BY). Ответ: Вложенные запросыПостроим запрос МинСумма, который выводит минимальную сумму заказа. Для этого будем использовать уже готовый запрос Итоги. Таким образом, источником данных для запроса МинСумма будет не таблица, а другой запрос. Отметим, что предварительно в запросе Итоги нужно отменить сортировку. Запрос получается очень простым SELECT MIN(Сумма) AS Сумма FROM Итоги Наконец, можно вывести информацию о заказе с минимальной суммой: SELECT [Номер заказа], Дата, Итоги.Сумма FROM Итоги, МинСумма WHERE Итоги.Сумма = МинСумма.Сумма Обратите внимание, что этот запрос использует результаты выполнения двух ранее построенных запросов – Итоги и МинСумма. Запрос МинСумма можно было и не составлять, а вместо этого использовать вложенный запрос (запрос в запросе): SELECT [Номер заказа], Дата, Сумма FROM Итоги WHERE Сумма = (SELECT MIN(Сумма) AS Сумма FROM Итоги) Заметим, что если в базе данных есть информация о нескольких заказах с такой же (минимальной) суммой, будет показана информация обо всех этих заказах. Измените запрос так, чтобы получить список всех заказов, сумма которых больше средней. Ответ: |