Создание основной базы данных «Морская волна», страница 5

Таблица 5. Структура таблицы “Ship_types”

·  Таблица Status” – вспомогательная таблица. Содержит информацию о типах повреждений кораблей, принимавших участие в сражениях.

Название поля

Тип

Длина

Примечание

Id

Numeric

1

Идентификатор повреждений

Status

Character

25

Обозначение повреждений

Таблица 6. Структура таблицы “Status”

10. Тексты и примеры работы программ.

Исходные данные из таблиц:

·  Таблица Battles(всего 4 записи):

·  Таблица Status(всего 4 записи):

·  Таблица Ships(всего 34 записи):

·  Таблица Ship_types(всего 4 записи):

·  Таблица Links(всего 54 записи, приведен фрагмент):

Тексты и результаты работы запросов:

1.  Для каждого морского сражения указать сведения о нем (страны-участники, дата, место и т.п.).

SELECT name as "Название",;

date as "Дата",place as "Местоположение",;

countries as "Страны_участники" from battles

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

//выбор стран-участников заданного сражения

select Страна as " Страна " from ships group by Страна where ships.id in ;

(select ship_id from links right join battles on battle_id=battles.id where;

 battles.name=thisform.combo1.value)

//сортировка стран-участников по количичестве потопленных кораблей

 select Страна as " Страна " ,count(*) as "Потери_потопленными";

 from ships group by Страна where ships.id in ;

(select ship_id from links right join battles on battle_id=battles.id where;

 battles.name=thisform.combo1.value and status_id==2)

//сортировка стран-участников по количичестве поврежденных кораблей

  select Страна as " Страна " ,count(*) as "Потери_поврежденными";

 from ships group by Страна where ships.id in ;

(select ship_id from links right join battles on battle_id=battles.id where;

 battles.name=thisform.combo1.value and status_id==1)

       

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

Select Название, Водоизмещение , type, Страна;

from ships inner join ship_types;

on class_id=ship_types.type_id;

where ships.id in (select ship_id from links inner join battles;

                   on battle_id=battles.id;

                   where battles.name=thisform.combo2.value);

group by Страна, type,Водоизмещение, Название

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

//запрос сколько раз участвовал каждый корабли в сражении

select   ship_id, count(ship_id) as "cnt";

 from links ;

 group by  ship_id INTO CURSOR mycursor1

//выбор кораблей участвовавших два и более раза

select ship_id;

from mycursor1;

having cnt>=2 into cursor mycursor2

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

select ship_id,status_id from links;

where ship_id in (select ship_id from mycursor2);

      AND status_id==1;

group by ship_id, status_id into cursor mycursor3

//окончательный запрос

select ships.название from ships;

where ships.id in (select ship_id from mycursor3)

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