Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
all_lab.doc
Скачиваний:
47
Добавлен:
14.11.2019
Размер:
1.42 Mб
Скачать

13. Наполнение и тестирование бд

1. Наполнение базы данных

После проектирования и реализации базы данных необходимо наполнить её тестовыми данными и произвести тестирование правильности её работы с точки зрения логики.

Для вставки используется SQL-оператор INSERT.

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

Рассмотрим пример вставки данных для нашей учебной базы данных.

Таблица Kompanija

INSERT INTO Kompanija (kod, nazvanie) VALUES (NULL, 'Aeroflot');

INSERT INTO Kompanija (kod, nazvanie) VALUES (NULL, 'LuftHanza');

INSERT INTO Kompanija (kod, nazvanie) VALUES (NULL, 'KrasAir');

INSERT INTO Kompanija (kod, nazvanie) VALUES (NULL, 'British Airlines');

INSERT INTO Kompanija (kod, nazvanie) VALUES (NULL, 'TransAero');

INSERT INTO Kompanija (kod, nazvanie) VALUES (NULL, 'Air France');

Посмотреть результат в таблице:

SELECT * FROM Kompanija;

Таблица Samolet

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(1, 1, 'IL-86', 'P', 360);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(2, 1, 'IL-86', 'P', 360);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(3, 1, 'Yak-40', 'P', 25);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(4, 1, 'Tu-144', 'P', 150);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(5, 1, 'Tu-144', 'P', 150);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(6, 1, 'An-2', 'P', 15);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(7, 2, 'Boeing 747', 'P',

380);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(8, 2, 'Boeing 747', 'P',

380);

INSERT INTO samolet(nomer, kompanija_kod, model, tip, vmestimost) VALUES(9, 1, 'Boeing 747', 'P',

380);

Посмотреть результат в таблице:

SELECT * FROM Samolet;

Задание: Создайте код вставки данных в вашу базу, заполните таблицы тестовыми данными и исправьте возможные ошибки.

2. Тестирование базы данных

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

1. Проекция

2. Выборка

3. Соединение

4. Умножение

5. Объединение

6. Пересечение

7. Вычитание

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

Первая группа языков называется процедурными и объектными или языками 3-го поколения. К ним относятся Basic, Pascal, C, C++, Java, С# и др.

Языки второго типа называются декларативными или языками 4-го поколения. Представителями этой группы являются языки SQL, Prolog, Haskel и др. Они были названы языками 4-го поколения потому, что позволили во многих случаях сократить время, затраты и объём кода, необходимого для выполнения той или иной операции над данными.

Рассмотрим, как реализуются операции реляционной алгебры в языке SQL.

Проекция

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

SELECT имя_столбца1, имя_столбца2, ... , имя_столбцаN

FROM Имя_Таблицы

Пример 1 (список авиакомпаний):

SELECT nazvanie

FROM Kompanija;

Для того чтобы упорядочить результаты проекции, используется выражение ORDER BY с указанием набора столбцов, по которым надо сортировать результаты и направления сортировки:

SELECT имя_столбца1, имя_столбца2, ... , имя_столбцаN

FROM Имя_Таблицы

ORDER BY имя_столбца3 [DESC], имя_столбца2 [DESC], ... , имя_столбцаN

Слово DESC показывает необходимость сортировки в обратном порядке.

Пример 2 (список авиакомпаний, упорядоченный по названию):

SELECT nazvanie

FROM Kompanija

ORDER BY nazvanie;

Пример 3 (список авиакомпаний, упорядочнный по имени в обратном порядке):

SELECT nazvanie

FROM Kompanija

ORDER BY nazvanie DESC;

Кроме того, иногда может возникнуть задача получения данных без дубликатов, например, списка всех моделей самолётов, которые имеютсяу авиакоманий. Это достигается с помощью ключевого слова DISTINCT.

Пример 4 (модели самолётов):

SELECT DISTINCT model

FROM Samolet;

Выборка

Операция выборки необходима для извлечения определённых строк таблицы, удовлетворяющих определённым условиям, и реализуется с помощью конструкции WHERE:

SELECT имя_столбца1, имя_столбца2, ... , имя_столбцаN

FROM Имя_ТаблицыN

WHERE условие1

[ AND условие2 ] ...

[ OR условиеN ]

где в качестве условий могут выступать конструкции вида:

● имя_столбца1 знак1 значение1,

● имя_столбца2 знак3 имя_столбца3,

(где знак — это =, <, >, <=, <=, !=)

соединённые логическими условиями И (AND), ИЛИ (OR), НЕ (NOT).

Пример 1 (аэропорты Москвы):

SELECT kod, nazvanie

FROM Aeroport

WHERE gorod = 'Moscow';

Пример 2 (аэророрты в городах США, начинающихся на букву «N»):

SELECT *

FROM Aeroport

WHERE strana = 'USA'

AND gorod LIKE 'N%';

Соединение

Операция соединения необходима для получения взаимосвязанных данных из более чем одной таблицы одновременно и реализуется с помощью конструкции JOIN ... ON:

SELECT Таблица1.имя_столбца1, Таблица1.имя_столбца2,

... ,

Таблица2.имя_столбца1, Таблица2.имя_столбца2,

...

FROM Имя_Таблицы1

JOIN Имя_Таблицы2

ON условие_связывания_таблиц

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

Имя_таблицы1.Имя_ключевого_столбца1 = Имя_таблицы2.Имя_ключевого_столбца2

Пример 1 (список самолётов каждой авиакомпании):

SELECT Kompanija.nazvanie, Samolet.model

FROM Kompanija

JOIN Samolet

ON Kompanija.kod = Samolet.kompanija_kod;

Умножение

Операция умножения нужна для получения произведения двух множеств, такое произведение называется декартовым и реализуется с помощью конструкции CROSS JOIN:

SELECT Таблица1.имя_столбца1, Таблица1.имя_столбца2,

... ,

Таблица2.имя_столбца1, Таблица2.имя_столбца2,

...

FROM Имя_Таблицы1

CROSS

JOIN Имя_Таблицы2

Пример 1 (все возможные рейсы из Москву на Украину без учёта конкретных аэропортов):

SELECT DISTINCT

AV.gorod, AP.gorod

FROM Aeroport AV —- Аэропорт вылета

CROSS

JOIN Aeroport AP —- Аэропорт прилёта

WHERE AV.strana = 'Russia'

AND AV.gorod = 'Moscow'

AND AP.strana = 'Ukraine';

Объединение

Операция объединения необходима для получения объединённых результатов нескольких запросов из разных источников и реализуется с помощью конструкции UNION:

SELECT Таблица1.имя_столбца1, Таблица1.имя_столбца2,

... ,

FROM Имя_Таблицы1

UNION

SELECT Таблица2.имя_столбца1, Таблица2.имя_столбца2,

...

FROM Имя_Таблицы2

[ UNION ]

...

Особенностью работы этой конструкции является требование полного совпадения порядка и типов столбцов входящих в неё запросов, а также неявное удаление дубликатов.

Пример 1 (список моделей самолётов авиакомпний «Аэрофлот» и «Люфтганза»):

SELECT SA.model

FROM samolet SA

JOIN Kompanija KA

ON SA.kompanija_kod = KA.kod

WHERE KA.nazvanie = 'Aeroflot'

UNION

SELECT SL.model

FROM samolet SL

JOIN Kompanija KL

ON SL.kompanija_kod = KL.kod

WHERE KL.nazvanie = 'Lufthanza';

Эту же задачу можно было бы реализовать и проще, с помощью проекции и выборки с условием OR, но в учебных целях используется UNION.

Пересечение

Операция пересечения нужна для получения результатов, общих для нескольких запросов.

Она не имеет прямой поддержки в MySQL 5.0 и реализуется с помощью условий связывания или условий ограничений (JOIN ... ON... или WHERE ...).

Пример1 (модели самолётов, которые есть и у «Люфтганзы» и у «Аэрофлота»):

SELECT DISTINCT SA.model

FROM Samolet SA

JOIN Kompanija KA

ON SA.kompanija_kod = KA.kod

AND KA.nazvanie = 'Aeroflot'

JOIN Samolet SL

ON SA.model = SL.model

JOIN Kompanija KL

ON SL.kompanija_kod = KL.kod

AND KL.nazvanie = 'Lufthanza'

Вычитание

Операция объединения необходима для получения разности результатов нескольких запросов из разных источников. Она не имеет прямой поддержки в MySQL 5.0 и реализуется с помощью условий связывания, условий ограничений (JOIN ... ON... или WHERE ...) или подзапросами. Попробуйте самостоятельно получить список моделей самолётов, которые есть только у «Аэрофлота», но не у прочих авиакомпаний.

Задание: Напишите SELECT-запросы, реализующие справочные и аналитические функциональные требования вашей задачи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]