Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика_Семестр1_Методпособие

.pdf
Скачиваний:
67
Добавлен:
05.06.2015
Размер:
2.81 Mб
Скачать

Delete

From <имя таблицы>

[Where <логическое выражение>];

В инструкции Delete не указываются никакие столбцы, так как удаляются целиком записи, а не отдельные поля. Если в SQL операторе не использовать инструкцию Where, то удаляться все записи таблицы, но структура таблицы и ее имя в базе данных сохраняться, и в дальнейшем в таблицу можно добавлять записи. Например, требуется удалить из таблицы Nfirm все записи о фирмах, выпускающих изделия с кодом 500. Запрос Z35 будет следующим:

Delete

From Nfirm

Where Kdiz=500;

Результат запроса Z35 представлен на рисунке 1.4.3.6.4.1.

Рис. 1.4.3.6.4.1 Результат запроса Z35. Вид таблицы Nfirm после удаления записей.

Все виды изменения и удаления записей таблиц могут привести к потере данных. Поэтому рекомендуется сначала создать копии таблиц(инструкция Select into ), а затем производить с копией различные манипуляции.

1.4.3.7 Работа со статистическими функциями по подмножеству

Статистические функции по подмножеству являются аналогами итоговых функций, входящих в групповые операции. Но в отличие от итоговых функций, эти функции могут содержать условия отбора обрабатываемых ими записей. В качестве условия отбора используются такие же логические выражения, что и в запросах. ACCESS располагает следующими статистическими функциями:

DAvg - подсчет среднего арифметического значения столбца или выражения,

DCount - подсчет количества записей,

DFirst - нахождение первого значения столбца из группы,

91

DLast - нахождение последнего значения столбца из группы,

DМах - определение максимального значения столбца или выражения, DMin - определение минимального значения столбца или выражения, DSum - подсчет суммы значений столбца или выражения.

Синтаксис операторов следующий.

<имя_функции> ("аргумент1 ";"аргумент2 ";"аргумент3")

Функции имеют два обязательных аргумента и один необязательны. Все аргументы текстового типа.

Аргумент1 - является обязательным и определяет имя столбца или выражение, над значениями которого будет выполняться функция. Этот аргумент должен быть строкой символов, то есть должен заключаться в кавычки.

Аргумент2 – также является обязательным и определяет имя таблицы или запроса(источник записей), из которых Выбираются столбцы или вычисляются выражения.

Аргумент3 - «Критерий отбора» является необязательный. Если он Присутствует, то

определяет, для каких записей Вычисляется функция, если отсутствует, то функция вычисляется по всем записям.

Функции могут использоваться в инструкции SELECT и определять вычисляемый столбец, выводимый в динамический набор записей. Функции также могут использоваться в условиях отбора записей ( в инструкции Where) и определять набор записей, используемый для вычислений.

Например, требуется вывести информацию о фирмах и изделиях с максимальным годовым выпуском.

В функции, в качестве поля для вычисления максимума используется поле «God». Оно записывается как первый аргумент в виде строкового выражения. Второй аргумент - строковое выражение «Firm» определяет таблицу, Являющуюся Источником данных. Функция Dmax используется в качестве критерия отбора записей . Условие отбора имеет вид:

God = DМах ("God"; "Firma").

Поиск будет идти по всем записям таблицы, т.е. результатом функции является максимальное по всей таблице значение годового выпуска. Вид запроса Z41 будет следующий:

Select Kdf, Nazf, Izd, Kdiz, God From Firm

Where God = DМах ("God"; "Firma");

Результат представлен на рисунке 1.4.3.7.1.

92

Рис. 1.4.3.7.1 Результат запроса Z41.

Наибольший годовой выпуск можно вычислять не по всем записям. Например, вывести информацию о фирмах и изделиях с максимальным годовым выпуском среди всех фирм, кроме фирмы «Топаз» (или фирмы с кодом 40). Запрос Z42 для решения этой задачи с кодом фирмы, не равным 40, представлен ниже:

Select Kdf, Nazf, Izd, Kdiz, God From Firm

Where God = DМах ("God", "Firma", “Kdf <>40”) And Kdf<>40 ;

Результат представлен на рисунке 1.4.3.7.2.

Рис. 1.4.3.7.2 Результат запроса Z42.

В запросе Z42 логическое выражение Kdf<>40 используется дважды: при вычислении максимального значения, как строковое выражение в функции DМах, и как условие вывода в инструкции Where.

Если в качестве условия вычисления функции использовать название фирмы, то такая строка символов требует двойных кавычек. Внутренние кавычки заменяются апострофами, т.е. выражение получит вид:

“ Not Nazf = ‘ Топаз ‘ “

Запрос с названием фирмы Z43 будет следующим:

Select Kdf, Nazf, Izd, Kdiz, God From Firm

Where God = DМах ("God", "Firma", “Not Naz=’Топаз’”) And Not Naz=”Топаз”;

Результат запроса такой же, как на рисунке 1.4.3.7.2.

Решим задачу с вычислением функции DAvg. Вычислим среднеарифметическое значения годового выпуска по изделиям, название которых не начинается на букву «П» . Вывести сведения о фирмах, таких изделиях и годовом выпуске, если этот выпуск больше среднего, а также сам средний выпуск.

93

Запрос Z43, решающий эту задачу будет следующим:

Select Kdf, Nazf, Izd, Kdiz, God, DAvg ("God", "Firma", “Izd Not Like ’П*’”) As srgod From Firm Where God > DAvg ("God", "Firma", “Izd Not Like ’П*’”)

And Izd Not Like ”П*”;

Результат представлен на рисунке 1.4.3.7.3.

Рис. 1.4.3.7.3 Результат запроса Z43.

На этом рисунке можно заметить разницу в работе итоговых функций (например Avg) и статистических (DAvg). Статистическая функция вычисляется для каждой детальной записи и, если результат ее выводится в динамический набор записей, то в каждой записи. Итоговая функция вычисляется один раз по всей таблице, и не может быть выведена одновременно с детальными записями(см. запросы Z20, Z21).

1.4.3.8 Многотабличные базы данных

При проектировании базы данных приходится решать такой вопрос, как наилучшим образом представить некоторую систему из реального мира и построить ее модель в базе данных. Необходимо определить, Какие таблицы необходимо создать, какие столбцы они будут содержать и какие связи будут между таблицами. Для решения всех этих вопросов служит процесс нормализации, то есть упрощения структуры базы данных с целью ее оптимизации. Оптимизация заключается в следующем:

Разные таблицы не должны хранить одни и те же данные.

Записи не должны быть громоздкими.

Таблицы не должны хранить данные, которые могут быть вычислены.

объекты, содержащие несколько показателей (ФИО, адрес и др.) должны храниться в отдельных полях.

Каждое поле таблицы должно быть уникальным не только в пределах таблицы, но и в пределах базы данных.

Ключи.

Каждая таблица содержит информацию об объектах одного типа, например одна таблица о предприятиях, значит другая о производимой этими предприятиями продукции, третья о продаже этой продукции. Реляционная база данных требует, чтобы каждая строка таблицы была уникальной.

94

Уникальность строк таблицы обеспечивает первичный ключ – столбец или группа столбов, имеющих уникальные в пределах этой таблицы значения. Каждая таблица может иметь только один первичный ключ. Access не требует создания первичного ключа в каждой таблице, но это настоятельно рекомендуется. Ключи можно не создавать, если в базе используется только одна таблица или несколько независимых таблиц. Первичный ключ обязателен при объединении нескольких таблиц в единую систему. При этом должен появиться и внешний ключ – столбец одной из таблиц, который ссылается на первичный ключ другой таблицы. При этом важно, чтобы и внешний ключ, и первичный ключ, на который он ссылается, были одного типа и имели одинаковые значения. Очень хорошо, если их имена в таблицах тоже одинаковые.

Связи.

Связи между реальными объектами могут быть очень сложными. Например, на одном факультете учится много студентов и один студент изучает несколько предметов. В СУБД Access в одно и то же время может быть установлена связь только между двумя таблицами. Эти пары таблиц могут быть связаны одним из трех способов: «один-к-одному», «один-ко- многим», «многие-ко-многим».

Отношение типа «один-к-одному».

Две таблицы связаны отношением «один-к-одному»(1->1),если каждой записи (строке) одной таблицы соответствует одна запись (строка) в другой таблице.

Отношение 1->1 может использоваться, если одну таблицу необходимо разбить на две и более по соображениям безопасности, производительности или уменьшения количества столбцов. Например, в таблицах о студентах информацию о паспортных данных, о родственниках и их доходах можно хранить в отдельной таблице, как конфиденциальную информацию, доступ к которой должен быть ограничен. Таблицы, связанные отношением 1->1, должны иметь одинаковый по описанию и по значению первичный ключ для объединения данных.

Отношение типа «один-ко-ногим»

Две таблицы связаны отношением «один-ко-многим» (1->М), если одной записи первой таблицы соответствует одна, много или ни одной записи во второй таблице, но каждой записи второй таблицы соответствует только одна запись в первой таблице. Такая связь таблиц называется главная – подчиненная. Это наиболее распространенный тип связи. Такие связи устанавливаются между основными (оперативными) таблицами с информацией, находящееся в справочных таблицах. Например, одна запись из таблицы о студентах может быть связана только с одной записью из таблицы о факультетах, но одна запись о факультетах связывается со многими записями о студентах. В этом случае таблица о факультетах – главная, а таблица о студентах – подчиненная, связь между ними 1->М. В главной таблице создается первичный ключ, значения которого в пределах своей таблицы

95

должны быть уникальными и для него определяется свойство индексирование со значением Да. Совпадение не допускается. В подчиненной таблице создается такое же поле(по типу и может быть по имени), но как внешний ключ, для него определяется свойство индексирование со значением Да.

Совпадение допускается.

Отношение типа «многие-ко-многим»

Две таблицы связаны отношением «многие-ко-многим» (М->М), если одной записи первой таблицы соответствует много записей во второй таблице и каждой записи второй таблицы соответствует много записей в первой таблице. Такая связь не создается базой данных Access, Отношения такого типа должны быть представлены множеством отношений типа 1->М и 1->1. Мы не рассматриваем такого типа связи в программе нашего курса из-за ограниченности времени.

1.4.3.8.1 Установка связей между таблицами

Будем рассматривать тип связь 1->М, как самую распространенную. Таблица со стороны «один» должна иметь поле с уникальными значениями, которое будет первичным ключом. В режиме конструктора таблицы при описании этого поля должен появиться слева от имени символ «ключик», а в свойстве индексирование значение Да. Совпадение не допускается. В таблице со стороны «многие», должно появиться такое же по типу и значениям поле, но для него свойство индексирование должно иметь значение Да. Совпадение допускается. Например, создадим базу данных с таблицами:

Tyr с полями:

Sh - шифр тура

Str - название страны

KolD - количество дней

Cen - цена тура в спокойный период.

Agen с полями:

Agn - название агентства.

Sht - шифр тура.

Dt - дата отправления

Kolpt - количество путевок.

Одно агентство отправляет клиентов в разные или одинаковые туры. Одни и те же туры могут быть востребованы разными агентствами. Связующими полями будут шифры туров. При этом в таблице Tyr шифры не могут повторяться, так как эта таблицы о турах, и каждая запись это информация об одном туре. Шифр тура является в этой таблице первичным ключом. В таблице Agen шифр тура является объектом, информация о котором содержится в другой таблице. В этой таблице шифры повторяются и для связи с другой таблицей это поле должно быть определено как внешний ключ. Очень хорошо, если ключевые поля имеют одинаковые имена, но обязательно они должны быть полями абсолютно одинакового типа. Примеры

96

описания ключевых полей таблиц Tyr и Agen представлены на рисунках

1.4.3.8.1.1 и 1.4.3.8.1.2.

Рис. 1.4.3.8.1.1 Первичный ключ Sht таблицы Tyr.

Рис. 1.4.3.8.1.2 Внешний ключ Sht таблицы Agen.

Связь между таблицами устанавливается по пустым таблицам командами главного меню: Сервис - схема данных. В результате откроется окно Схема данных, в которое мы добавим сначала таблицу Tyr затем таблицу Agen. Мышкой «протянем» связь от поля Sht первой таблицы к полю Sht второй. В результате наших действий появится окно Изменение связей, в котором мы должны «включить» флажки обеспечения целостности данных:

каскадное обновление и каскадное удаление. Целостность данных означает следующее:

если таблица имеет внешний ключ, то не может быть добавлена запись, не имеющая ссылки по внешнему ключу;

если таблица имеет первичный ключ, то его изменение в этой таблице вызовет изменение соответствующих внешних ключей в другой таблице.

При удалении записи из таблицы, имеющей первичный ключ, автоматически удалялись записи в другой таблице с таким же значением внешнего ключа. Вид окна Схема данных с установленными связями представлен на рисунке 1.4.3.8.1.3.

97

Рис. 1.4.3.8.1.3 Вид окна связей.

Таблицы заполняются только после установки связей между таблицами. При заполнении для одной записи главной таблицы Tyr можно одновременно заполнять несколько записей подчиненной таблицы Agen. Пример ввода приведен на рисунке 1.4.3.8.1.4.

Рис. 1.4.3.8.1.4. Пример заполнения двух связанных таблиц.

1.4.3.8.2 Объединение таблиц в запросах

При создании запроса из двух связанных таблиц в режиме конструктора, автоматически устанавливается внутреннее объединение, при котором выбираются только те записи двух таблиц, для которых находятся соответствующие значения ключей в обеих таблицах. Если затем перейти в режим SQL то увидим следующий оператор:

Select From<главная таблица>

Inner Join<подчиненная таблица>On <первичный ключ>=<внешний ключ>; В инструкции Select такого запроса можно использовать все поля обеих

таблиц, для этого можно ставить «звездочку»( Select *). В этом случае ключевые поля, по которым осуществляется связь, выводятся дважды и с уточненными именами:Tyr.Sht и Agen.Sht. Добавим две записи в главную таблицу (Tyr) и не введем ни одной записи во вторую (Agen). При внутреннем объединении добавленные записи не будут выведены в объединенный запрос. Вид таблицы Tyr, после добавления двух записей о турах на Кипр представлен на рисунке 1.4.3.8.2.1.

98

Рис. 1.4.3.8.2.1 Вид таблицы Tyr.

Напишем запрос для внутреннего объединения двух таблиц. В SQL этот запрос будет выглядеть следующим образом:

Select * From Tyr

Inner Join Agen On Tyr.Sht=Agen.Sht;

Сохраним запрос с именем Z51. Результат этого запроса представлен на рисунке 1.4.3.8.2.2.

Рис. 1.4.3.8.2.2 Вид результата запроса с внутренним объединением.

В режиме SQL возможны два внешних объединения: левое и правое. При левом объединении в результирующий набор записей включаются все записи таблицы, записанной слева от оператора объединения Join, и только те записи другой таблицы, для которых находятся совпадающие значения ключей. Запрос с левым объединением Z52.выглядит следующим образом:

Select * From Tyr

LEFT JOIN Agen On Tyr.Sft=Agen.Sft;

Результат этого запроса представлен на рисунке 1.4.3.8.2.3.

99

Рис. 1.4.3.8.2.3 Результат запроса Z52

Мы видим, что в результат включились две записи о Кипре, для которых мы не вводили соответствующих записей в таблицу Agen. Изменив в запросе левое объединение LEFT на правое RIGHT, получим результат, такой же, как при внутреннем INNER объединении. Левое объединение позволяет выделять из таблицы несогласованные записи. Например, требуется вывести невостребованные туры, то есть те, для которых нет записей в таблице Agen. Запрос Z53 для решения поставленной задачи будет следующим:

Select Tyr.*

From Tyr Left Join Agen On Tyr.Sht=Agen.Sht

Where Agn IS NULL;

Результат этого запроса представлен на рисунке 1.4.3.8.2.4.

Рис. 1.4.3.8.2.4 Результат запроса Z53

В этом запросе мы используем две таблицы, но в набор записей запроса выводятся все поля только таблицы Tyr, поэтому в инструкции Select указываются все поля этой таблицы (Tyr.*).

1.4.3.9 Подчиненные запросы

Подчиненные запросы это SQL запросы, включенные в другие запросы. Подзапросы могут использоваться в инструкции Where в качестве условия

100