пятница, 17 апреля 2020 г.

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

Задание: 51 (Serge I: 2003-02-17)

SELECT name
FROM (SELECT O.ship AS name, numGuns, displacement
FROM Outcomes O INNER JOIN
Classes C ON O.ship = C.class AND
O.ship NOT IN (SELECT name
FROM Ships
)
UNION
SELECT S.name AS name, numGuns, displacement
FROM Ships S INNER JOIN
Classes C ON S.class = C.class
) OS INNER JOIN
(SELECT MAX(numGuns) AS MaxNumGuns, displacement
FROM Outcomes O INNER JOIN
Classes C ON O.ship = C.class AND
O.ship NOT IN (SELECT name
FROM Ships
)
GROUP BY displacement
UNION
SELECT MAX(numGuns) AS MaxNumGuns, displacement
FROM Ships S INNER JOIN
Classes C ON S.class = C.class
GROUP BY displacement
) GD ON OS.numGuns = GD.MaxNumGuns AND
OS.displacement = GD.displacement

четверг, 16 апреля 2020 г.

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

Задание: 50 (Serge I: 2002-11-05)

select distinct battle from outcomes
where ship in (select name
               from ships
               where class = 'kongo')

Найдите названия кораблей с орудиями калибра 16 дюймов (учесть корабли из таблицы Outcomes).

Задание: 49 (Serge I: 2003-02-17)

SELECT Ships.name
FROM Classes JOIN
Ships ON Classes.class = ships.class
WHERE bore = 16
UNION
SELECT Outcomes.ship
FROM Outcomes JOIN
Classes ON Classes.class = Outcomes.ship
WHERE bore = 16

Найдите классы кораблей, в которых хотя бы один корабль был потоплен в сражении.

Задание: 48 (Serge I: 2003-02-16) 

SELECT cl.class
FROM Classes cl
LEFT JOIN Ships s ON s.class = cl.class
WHERE cl.class IN (SELECT ship FROM Outcomes WHERE result = 'sunk') OR
s.name IN (SELECT ship FROM Outcomes WHERE result = 'sunk')
GROUP BY cl.class

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

Задание: 47 (Serge I: 2011-02-11)

Вывод: номер в соответствии с заданным порядком, имя производителя (maker), модель (model) 

SELECT count(*) OVER (order by c.countM DESC, c.maker,c.model) no, c.maker, c.model
FROM (SELECT count(*) OVER(partition by maker) countM, maker,model
      FROM product) c

Для каждого корабля, участвовавшего в сражении при Гвадалканале (Guadalcanal), вывести название, водоизмещение и число орудий.

Задание: 46 (Serge I: 2003-02-14)

SELECT o.ship, displacement, numGuns FROM
(SELECT name AS ship, displacement, numGuns
FROM Ships s JOIN Classes c ON c.class=s.class
UNION
SELECT class AS ship, displacement, numGuns
FROM Classes c) AS a
RIGHT JOIN Outcomes o
ON o.ship=a.ship
WHERE battle = 'Guadalcanal'

Найдите названия всех кораблей в базе данных, состоящие из трех и более слов (например, King George V).

Задание: 45 (Serge I: 2002-12-04)
Найдите названия всех кораблей в базе данных, состоящие из трех и более слов (например, King George V). 
Считать, что слова в названиях разделяются единичными пробелами, и нет концевых пробелов. 

select name from ships
where name like '% % %'
union
select ship from outcomes
where ship like '% % %'

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

Задание: 44 (Serge I: 2002-12-04)


select name from Ships
where name LIKE 'R%'
UNION
SELECT Ship From Outcomes
where Ship LIKE 'R%'

Укажите сражения, которые произошли в годы, не совпадающие ни с одним из годов спуска кораблей на воду.

Задание: 43 (qwrqwr: 2011-10-28)


select name
from battles
where year(date) not in
     (select launched
      from ships
      where launched is not null)

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

Задание: 42 (Serge I: 2002-11-05)


SELECT ship, battle FROM Outcomes WHERE result = 'sunk'