Формирование нескольких баз данных, основная из которых - «Морская волна», страница 3


Таблица ships

 

id – идентификационный номер корабля

name – название корабля

country_id – идентификационный номер страны

volume – водоизмещение корабля

class_id –  идентификационный номер класса корабля

dateof – дата спуска корабля

weapons_number – количество орудий

calibr – калибр главного орудия


Текст программы

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

select s.name, c.name as страна, cl.name as класс_судна, s.volume, s.dateof, s.calibr ;

from ships s, countries c, classess cl ;

where s.class_id = cl.id and s.country_id = c.id

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

select  countries.name as название_страны, ships.name;

from ;

        ships, battles_ships, countries ;

where ;

        battles_ships.ship_id=ships.id ;

        and battles_ships.battle_id = ThisForm.List1.value ;

        and countries.id = ships.country_id ;

Наибольшие потери

select count(battles_ships.damage) as потери, countries.name as страны ;

from ;

        ships, battles_ships, countries ;

where ;

        battles_ships.ship_id=ships.id ;

        and battles_ships.battle_id = ThisForm.List1.value ;

        and countries.id = ships.country_id ;

        and ( battles_ships.damage=="ранен" or battles_ships.damage=="убит" ) ;

group by countries.name ;

into cursor qw

select * from qw where потери = (select max(потери) from qw )

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

                                                         

select  ships.name as название_корабля, ships.volume;

from ;

        ships, battles_ships ;

where ;

        battles_ships.ship_id=ships.id and battles_ships.battle_id=ThisForm.List1.value ;

order by ships.volume DESC

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

select battle_id as битва, ship_id as корабль ;

from battles_ships ;

where ;

        damage=="ранен" ;

into cursor temp

select  distinct ships.id, ships.name ;

from ;

        ships, battles_ships, temp ;

where ;

        battles_ships.ship_id=ships.id ;

        and battles_ships.ship_id == temp.корабль ;

        and battles_ships.battle_id <> temp.битва

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

select  battles.place, countries.name, count(battles_ships.ship_id) AS потери ;

from ;

        ships, battles_ships, battles, countries ;

where ;

        battles_ships.ship_id=ships.id ;

        and battles_ships.battle_id=battles.id ;

        and countries.id = ships.country_id;

group by countries.id, battles.id ;

having count(battles_ships.ship_id)>=3

6.  найти названия кораблей (?сражения) в которых принимали участие корабли заданного класса (выбор класса).

                                                                

select  distinct battles.place as название_сражения ;

from ;

        ships, battles_ships, battles ;

where ;

        battles_ships.ship_id=ships.id ;

        and battles_ships.battle_id=battles.id ;

        and ships.class_id = classess.id ;

        and classess.name=ThisForm.List1.value

7.  найти для каждого класса корабля значение даты спуска на воду первого корабля этого класса.

select  classess.name as название_класса, min(ships.dateof) as дата_спуска;

from ;

        ships, battles_ships, classess;

where ;

        battles_ships.ship_id=ships.id ;

        and ships.class_id = classess.id ;

group by classess.name

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

select  distinct classess.name as название_сражения, count(ships.id) as потери ;

from ;

        ships, battles_ships, battles, classess ;

where ;

        battles_ships.ship_id=ships.id ;

        and battles_ships.battle_id=battles.id ;

        and ships.class_id = classess.id ;

        and battles_ships.damage == "убит";

group by classess.name

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

select  classess.name as название_класса, count(ships.id) as потери;

from ;