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

12.  Сформировать список названий судов водоизмещением ниже 30 тыс. тонн (ввод числа), упорядоченных по возрастанию значений года спуска судов на воду, а для судов-одногодков - в алфавитном порядке следования их названий.

SELECT year(Ships.Дата_спуска) as "Дата_спуска",;

 Ships.название, Ships.водоизмещение;

 FROM  sea_wave!ships INNER JOIN sea_wave!ship_types ;

   ON  Ships.class_id = Ship_types.type_id;

 WHERE Ships.водоизмещение < thisform.spinner3.value;

 ORDER BY 1, Ships.название

13.  Для каждой группы значений калибра главных орудий найти минимальное значение года выпуска судов, относящихся к этой группе.

//результат запроса выводится в диалоговое окно

dimension out1(1)

SELECT min(year(Ships.Дата_спуска));

 FROM sea_wave!ships;

 WHERE Ships.калибр between thisform.spinner4.value AND thisform.spinner5.value;

 INTO ARRAY out1

 cMessageTitle = 'Результат запроса'

 cMessageText = 'Мин. год выпуска кораблей '+ ;

 'имеющий калибр главных орудий от '+ str(thisform.spinner4.value,3)+' до '+ ;

 str(thisform.spinner5.value,3) + ' равен '+ str(out1[1],4)

 nDialogType = 0 + 64 + 0

 MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)

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

dimension out1(1)

SELECT count(Ships.название) ;

 FROM  sea_wave!ships INNER JOIN sea_wave!ship_types ;

   ON  Ships.class_id = Ship_types.type_id;

 WHERE Ship_types.type == thisform.combo9.value;

   AND year(Ships.дата_спуска) < 1920 INTO ARRAY out1

//если таких кораблей нет

IF out1[1] == 0

            MessageBox('Нет таких кораблей')

Else//если такие корабли есть

            SELECT count(Ships.название) as "Потоплено";

 FROM  sea_wave!links INNER JOIN sea_wave!ships;

    INNER JOIN sea_wave!ship_types ;

   ON  Ships.class_id = Ship_types.type_id ;

   ON  Links.ship_id = Ships.id;

 WHERE Links.status_id = 2;

   AND Ship_types.type == thisform.combo9.value

endif

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

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

select battle_id ,Count(ship_id) as "cnt" ;

from sea_wave!links inner join sea_wave!status;

on links.status_id=status.id;

where status.status=="участвовал-уничтожен";

group by battle_id into cursor mycursor

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

SELECT DISTINCT links.battle_id;

   FROM  sea_wave!links INNER JOIN sea_wave!ships;

   ON  Links.ship_id = Ships.id;

 WHERE Ships.страна == thisform.combo10.value INTO CURSOR mycursor5

//запрос битв, в которых было потоплено количество кораблей больше заданного

select battle_id;

from mycursor;

having cnt>2 into cursor mycursor2

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

 SELECT distinct  battles.name ;

 FROM  sea_wave!links INNER JOIN sea_wave!battles;

 ON  Links.battle_id = battles.id ;

 WHERE battle_id in (select battle_id from mycursor5) ;

   AND battle_id in (select battle_id from mycursor2) ;

11. Выводы.

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

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