Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пример 2 записки.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
441.34 Кб
Скачать

4.1 Моделирование данных

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

Таблица «Самолет»

CREATE TABLE SAMOLET

(ID_SAMOLET COUNTER NOT NULL PRIMARY KEY,

VID CHAR(40) NOT NULL,

KOLICHESTVO_MEST INTEGER NOT NULL,

KOLICHESTVO_SAMOLETOV INTEGER NOT NULL)

Таблица «Направление»

CREATE TABLE NAPRAVLENIE

(ID_NAPRAVLENIE COUNTER NOT NULL PRIMARY KEY,

NAPRAVLENIE CHAR(40) NOT NULL,

PROTYAGENNOST INTEGER NOT NULL)

Таблица «Рейсы»

CREATE TABLE REYS

(ID_REYS INTEGER NOT NULL PRIMARY KEY,

VREMYA_OTPR DATETIME NOT NULL,

ID_NAPRAVLENIE INTEGER NOT NULL,

FOREIGN KEY(ID_NAPRAVLENIE)

REFERENCES NAPRAVLENIE,

ID_SAMOLET INTEGER NOT NULL,

FOREIGN KEY(ID_SAMOLET)

REFERENCES SAMOLET)

Таблица «Проданные билеты»

CREATE TABLE PRODANNYE_BILETY

(1KLASS INTEGER,

2KLASS INTEGER,

3KLASS INTEGER,

ID_REYS INTEGER NOT NULL,

FOREIGN KEY(ID_REYS)

REFERENCES REYS)

Таблица «Цена»

CREATE TABLE CENA

(ID_CENA COUNTER NOT NULL PRIMARY KEY,

CENA MONEY NOT NULL,

ID_REYS INTEGER NOT NULL,

FOREIGN KEY(ID_REYS)

REFERENCES REYS)

Таблица «Цена класса»

CREATE TABLE CENA_CLASSA

(1K REAL,

2K REAL,

3K REAL,

ID_CENA COUNTER,

FOREIGN KEY(ID_CENA )

REFERENCES CENA)

4.2 Заполнение базы данных средствами sql

Инструкция INSERT INTO добавляет запись или записи в таблицу. Эта инструкция образует запрос на добавление записей.

Таблица «Самолет»

INSERT INTO SAMOLET

VALUES (1, "ТУ-134", 150, 3, "Россия");

Таблица «Направление»

INSERT INTO NAPRAVLENIE

VALUES (2, "Санкт-Петербург", 3530);

Таблица «Рейсы»

INSERT INTO REYS

VALUES (3, #12/30/1899 3:0:0#, 3, 1);

Таблица «Проданные билеты»

INSERT INTO PRODANNYE_BILETY

VALUES (60, 40, 30, 4);

Таблица «Цена»

INSERT INTO CENA ( CENA, ID_REYS )

VALUES (100, 5);

Таблица «Цена класса»

INSERT INTO CENA_CLASSA ( 1K, 2K, 3K )

VALUES (3, 2, 2);

Инструкция UPDATE создает запрос на обновление, который изменяет значения полей указанной таблицы на основе заданного условия отбора.

UPDATE NAPRAVLENIE SET PROTYAGENNOST = 410

WHERE PROTYAGENNOST BETWEEN 400 AND 450;

UPDATE NAPRAVLENIE SET protyagennost = 600, NAPRAVLENIE = "Москва"

WHERE (NAPRAVLENIE Like '*иг*') And (PROTYAGENNOST=1200);

Инструкция DELETE создает запрос на удаление записей, предназначенный для удаления записей из одной или нескольких таблиц, перечисленных в предложении FROM, которые удовлетворяют предложению WHERE.

DELETE *

FROM NAPRAVLENIE

WHERE PROTYAGENNOST=1000;

4.3 Создание запросов select

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

Предложение Select имеет формат:

SELECT [[ALL] | DISTINCT]{ * | элемент_SELECT

[,элемент_SELECT] ...}

FROM {базовая_таблица | представление} [псевдоним]

[,{базовая_таблица | представление} [псевдоним]] ...

[WHERE фраза]

[GROUP BY фраза [HAVING фраза]];

SELECT - (выбрать) данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями

FROM - (из) перечисленных таблиц, в которых расположены эти столбцы

WHERE - (где) строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк

GROUP BY - (группируя по) указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя во фразе SELECT SQL-функции SUM (сумма), COUNT (количество), MIN (минимальное значение), MAX (максимальное значение) или AVG (среднее значение)

HAVING - (имея) в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора групп

Кроме традиционных операторов сравнения (= | <> | < | <= | > | >=) в WHERE фразе используются условия BETWEEN (между), LIKE (похоже на), IN (принадлежит), IS NULL (не определено) и EXISTS (существует), которые могут предваряться оператором NOT (не). Критерий отбора строк формируется из одного или нескольких условий, соединенных логическими операторами: AND, OR, OR NOT, AND NOT.

1. Определить номера рейсов и время отправления самолетов на заданное направление.

SELECT DISTINCT ID_REYS, NAPRAVLENIE, VREMYA_OTPR

FROM NAPRAVLENIE INNER JOIN REYS ON NAPRAVLENIE.ID_NAPRAVLENIE=REYS.ID_NAPRAVLENIE

WHERE NAPRAVLENIE='Мурманск'

ORDER BY NAPRAVLENIE, VREMYA_OTPR;

2.Определить сумму всех проданных билетов и по каждому классу на заданное время.

SELECT VREMYA_OTPR, [1KLASS], [2KLASS], [3KLASS], ([1KLASS])+( [2KLASS])+( [3KLASS]) AS SUMMA_PAS

FROM REYS INNER JOIN PRODANNYE_BILETY ON REYS.ID_REYS=PRODANNYE_BILETY.ID_REYS

WHERE VREMYA_OTPR=#5.00.00#;

  1. Определить прибыль по рейсам на заданное время.

SELECT REYS.ID_REYS, VREMYA_OTPR, NAPRAVLENIE, ([1KLASS]*[CENA]*[1K])+[2KLASS]*CENA*[2K]+[3KLASS]*CENA*[3K] AS PRIBYL

FROM (((NAPRAVLENIE INNER JOIN REYS ON NAPRAVLENIE.ID_NAPRAVLENIE=REYS.ID_NAPRAVLENIE) INNER JOIN PRODANNYE_BILETY ON REYS.ID_REYS=PRODANNYE_BILETY.ID_REYS) INNER JOIN CENA ON REYS.ID_REYS=CENA.ID_REYS) INNER JOIN CENA_CLASSA ON CENA.ID_CENA=CENA_CLASSA.ID_CENA

WHERE REYS.VREMYA_OTPR>#12/30/1899 4:0:0# And REYS.VREMYA_OTPR<#12/30/1899 18:0:0#

ORDER BY NAPRAVLENIE, ([1KLASS]*[CENA]*[1K])+[2KLASS]*CENA*[2K]+[3KLASS]*CENA*[3K];

5. Определить количество проданных билетов всего и по классам на 1, 9, 11 рейсы.

SELECT REYS.ID_REYS, VREMYA_OTPR, [1KLASS], [2KLASS], [3KLASS], ([1KLASS])+([2KLASS])+([3KLASS]) AS SUMMA_PAS

FROM REYS INNER JOIN PRODANNYE_BILETY ON REYS.ID_REYS=PRODANNYE_BILETY.ID_REYS

WHERE REYS.ID_REYS IN (1, 9, 11);

6.Найти процент заполнения самолетов, летящих на заданном направлении.

SELECT REYS.ID_REYS, napravlenie.napravlenie, [2 Пассажиры каждого рейса].SUMMA_PAS, KOLICHESTVO_MEST, [2 Пассажиры каждого рейса].SUMMA_PAS*100/KOLICHESTVO_MEST AS PROCENT_ZAPOLNENIYA

FROM ((napravlenie INNER JOIN reys ON napravlenie.id_napRAVLENIE=REYS.ID_NAPRAVLENIE) INNER JOIN [2 Пассажиры каждого рейса] ON REYS.ID_REYS=[2 Пассажиры каждого рейса].ID_REYS) INNER JOIN SAMOLET ON REYS.ID_SAMOLET=SAMOLET.ID_SAMOLET

WHERE NAPRAVLENIE='Санкт_Петербург'

GROUP BY VID, SAMOLET.KOLICHESTVO_SAMOLETOV, REYS.ID_REYS, [2 Пассажиры каждого рейса].SUMMA_PAS, KOLICHESTVO_MEST, napravlenie

ORDER BY REYS.ID_REYS;

  1. Определить количество пассажиров, купивших билеты на 1 и 2 классы самолетов, произведенных в России или Белоруссии и летящих в Мурманск или Москву.

SELECT REYS.ID_REYS, PROIZVODSTVO, [1KLASS], [2KLASS], [1KLASS]+[2KLASS] AS [1+2], NAPRAVLENIE

FROM ((SAMOLET INNER JOIN REYS ON SAMOLET.ID_SAMOLET=REYS.ID_SAMOLET) INNER JOIN NAPRAVLENIE ON NAPRAVLENIE.ID_NAPRAVLENIE=REYS.ID_NAPRAVLENIE) INNER JOIN PRODANNYE_BILETY ON REYS.ID_REYS=PRODANNYE_BILETY.ID_REYS

WHERE ((PROIZVODSTVO Like '*РУС*') Or (PROIZVODSTVO Like '*ОС*')) And NAPRAVLENIE In ('МОСКВА','МУРМАНСК')

ORDER BY PROIZVODSTVO, [2KLASS], [1KLASS]+[2KLASS], NAPRAVLENIE;

  1. Найти средний процент заполнения всех самолетов.

SELECT SUM([4 ПроцентЗАПОЛНЕНИЯ].PROCENT_ZAPOLNENIYA) AS SUMM_PR, COUNT(*) AS SUMM_REYS, SUM([4 ПроцентЗАПОЛНЕНИЯ].PROCENT_ZAPOLNENIYA)/COUNT(*) AS SREDNIY, AVG([4 ПроцентЗАПОЛНЕНИЯ].PROCENT_ZAPOLNENIYA) AS SREDNIY1

FROM [4 ПроцентЗАПОЛНЕНИЯ];

  1. Найти количество пассажиров, купивших в течение дня билеты на заданное направление.

SELECT NAPRAVLENIE.NAPRAVLENIE, SUM([2 Пассажиры каждого рейса].SUMMA_PAS) AS SUM_PAS

FROM (REYS INNER JOIN NAPRAVLENIE ON NAPRAVLENIE.ID_NAPRAVLENIE=REYS.ID_NAPRAVLENIE) INNER JOIN [2 Пассажиры каждого рейса] ON REYS.ID_REYS=[2 Пассажиры каждого рейса].ID_REYS

WHERE NAPRAVLENIE.NAPRAVLENIE='Москва'

GROUP BY NAPRAVLENIE.NAPRAVLENIE;