Найдите классы в которые входит только один корабль из базы данных учесть также корабли в outcomes
Перейти к содержимому

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

  • автор:

Упражнение 37 стр. 1

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

Вот один из запросов, которые отвергает система проверки:

Консоль

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

Рассмотрим следующий пример данных, для которых этот запрос будет давать неправильный результат.

Каждый, кто решал задачи по схеме данных «Корабли», знает, что такое «Бисмарк» (Bismarck). Это головной корабль, которого нет в таблице Ships. Теперь представим себе, что другой корабль класса «Бисмарк» имеется в таблице Ships, скажем, «Тирпиц» (Tirpitz).

Тогда первый запрос вернет класс «Бисмарк», так как в таблице Ships имеется один корабль этого класса. Второй запрос класс «Бисмарк» не вернет, так как предикат:

Упражнения по SQL

SELECT (обучающий этап) задачи по SQL запросам 120 штук, DML 10 шт. Дистанционное обучение языку баз данных SQL. Интерактивные упражнения и тестирование по операторам SELECT,INSERT,UPDATE,DELETE языка SQL. SQL remote education. SQL statements exercises. Подзапросы, Соединение таблиц, Функции SQL, Введение в SQL, Скачать книги по SQL. Команды SQL,CREATE SEQUENCE,CREATE SYNONYM,CREATE USER,CREATE VIEW,Create Table,DROP,GRANT,INSERT,REVOKE,SET ROLE,SET TRANSACTION,SQL ALTER TABLE,SQL команды.

к задачам SQL

47. Найдите производителя, продающего ПК, но не ПК-блокноты.

select distinct p.maker

where p.type = ‘PC’

and p.maker not in (select maker from product where type=’Laptop’)

48. Найдите размеры жестких дисков, совпадающих у двух и более PC. Вывести: HD

having count(model) >= 2

49. Найдите пары моделей PC, имеющих одинаковые скорость и RAM. В результате каждая пара указывается только один раз, т.е. (i,j), но не (j,i), Порядок вывода: модель с большим номером, модель с меньшим номером, скорость и RAM.

select distinct two.model, one.model, one.speed, one.ram

from pc one inner join pc two

on (one.ram = two.ram) and (one.speed = two.speed) and (one.model < two.model)

50. Найдите ПК-блокноты, скорость которых меньше скорости любого ПК. Вывести: type, model, speed

select p.type, l.model, l.speed

from laptop l inner join product p

on p.model = l.model and

l.speed < (select min(speed) from pc)

51. Найдите производителей самых дешевых цветных принтеров. Вывести: maker, price

select distinct p.maker, l.price

from product p, printer l

where (p.model = l.model) and

(l.price = (select min(price) from printer where color=’y’)) and

52. Для каждого производителя найдите средний размер экрана выпускаемых им ПК-блокнотов. Вывести: maker, средний размер экрана.

select p.maker, avg(l.screen)

from product p, laptop l

where (p.model = l.model)

group by p.maker

53. Найдите производителей, выпускающих по меньшей мере три различных модели ПК. Вывести: Maker, число моделей

select mm.maker, count(*)

from (select distinct p.maker maker, p.model model

where p.type=’PC’) as mm

group by mm.maker

having count(*) >= 3

54. Найдите максимальную цену ПК, выпускаемых каждым производителем. Вывести: maker, максимальная цена.

select p.maker, max(pk.price)

from product p inner join pc pk

on (p.model = pk.model)

group by p.maker

55. Для каждого значения скорости ПК, превышающего 600 МГц, определите среднюю цену компьютера с такой же скоростью. Вывести: speed, средняя цена.

select ss.speed, avg(pk.price)

from (select distinct speed as speed

where (speed> 600)) as ss, pc pk

where (pk.speed = ss.speed)

group by ss.speed

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

from ships s, classes c

where s.name = c.class

from outcomes o, classes c

where o.ship = c.class

57. Найдите классы, в которые входит только один корабль из базы данных (учесть также корабли в Outcomes).

from (select class, name

select ship, ship

where ship in (select class

from classes)) as c

group by c.class

having count(c.class) = 1

58. Найдите страны, владевшие когда-либо как обычными кораблями, так и крейсерами.

select distinct c.country

from classes as c

where c.type = ‘bb’ and

c.country in (select distinct cс.country

from classes as cс

where cс.type = ‘bc’)

select distinct c.country

where (c.country in (select c.country

from classes c inner join ships s

on (s.class = c.class) and (c.type = ‘bb’)

from classes c inner join outcomes o

on (o.ship = c.class) and (c.type = ‘bb’)

and (c.country in (select c.country

from classes c inner join ships s

on (s.class = c.class) and (c.type = ‘bc’)

from classes c inner join outcomes o

on (o.ship = c.class) and (c.type = ‘bc’)

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

//если хотите вынести моск, то вот:

select c.country, cc.qty, min(cc.launched)

classes c left join

(SELECT cl.country, sh.launched, case

when count(sh.name) = 0

from classes cl

inner join ships sh

on sh.class = cl.class and sh.launched is not null

group by cl.country, sh.launched

having count(sh.name) = (select max(bb.qty)

from (SELECT cl.country, sh.launched,

case when count(sh.name) = 0

from classes cl

inner join ships sh

on sh.class = cl.class and sh.launched is not null

group by cl.country, sh.launched) as bb

where (bb.country = cl.country))

on c.country = cc.country

group by c.country, cc.qty

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

from classes c, outcomes o, ships s

where (o.ship = s.name) and

(s.class = c.class) and

from classes c, outcomes o

where (c.class = o.ship) and

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

from ships s, classes c

where s.class = c.class and bore = 16

from outcomes o, classes c

where o.ship = c.class and bore = 16

62. С точностью до 2-х десятичных знаков определите среднее число орудий всех линейных кораблей (учесть корабли из таблицы Outcomes).

select cast(avg(cast(numGuns as decimal)) as numeric(4,2))

from (select name, numGuns

from ships s inner join classes c

on s.class = c.class and c.type=’bb’

select ship, numGuns

from outcomes o inner join classes c

on o.ship = c.class and c.type=’bb’) as sh1

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

select i.point, i.inc-o.out

(select p.point, case when sum(i.inc) is null then 0 else sum(i.inc) end as inc

from (select point from income_o union select point from outcome_o) as p

left join income_o i

on i.point = p.point

group by p.point) as i

(select p.point, case when sum(o.out) is null then 0 else sum(o.out) end as out

from (select point from income_o union select point from outcome_o) as p

left join outcome_o o

on o.point = p.point

group by p.point) as o

on i.point = o.point

64. Посчитать остаток денежных средств на начало дня 15/04/01 на каждом пункте приема для базы данных с отчетностью не чаще одного раза в день. Вывод: пункт, остаток.

select i.point, i.inc-o.out

(select p.point, case when sum(i.inc) is null then 0 else sum(i.inc) end as inc

from (select point from income_o union select point from outcome_o) as p

left join income_o i

on (i.point = p.point) and (i.date < ‘20010415’)

group by p.point) as i

(select p.point, case when sum(o.out) is null then 0 else sum(o.out) end as out

from (select point from income_o union select point from outcome_o) as p

left join outcome_o o

on (o.point = p.point) and (o.date < ‘20010415’)

group by p.point) as o

on i.point = o.point

where i.inc-o.out<> 0

65. Предполагая, что среди идентификаторов квадратов имеются пропуски, найти минимальный и максимальный «свободный» идентификатор в диапазоне между имеющимися максимальным и минимальным идентификаторами. Если пропусков нет, выводить NULL. Например, для последовательности идентификаторов квадратов 1,2,5,7 результат должен быть 3 и 6.

select min(start), max(stop)

from (select l.q_id+1 as start, min(fr.q_id-1) as stop

left outer join utq as r on l.q_id = r.q_id — 1

left outer join utq as fr on l.q_id < fr.q_id

r.q_id is null and fr.q_id is not null

group by l.q_id) as z

66. Определить лидера по сумме выплат в соревновании между каждой парой пунктов с одинаковыми номерами из двух разных таблиц — outcome и outcome_o — на каждый день, когда осуществлялся прием вторсырья хотя бы на одном из них. Вывод: Номер пункта, дата, текст: — «once a day», если сумма выплат больше у фирмы с отчетностью один раз в день; — «more than once a day», если — у фирмы с отчетностью несколько раз в день; — «both», если сумма выплат одинакова.

select case when o1.point is null then o2.point else o1.point end,

case when o1.date is null then o2.date else o1.date end,

when o1.out is null and o2.out is not null

then ‘more than once a day’

when o2.out is null and o1.out is not null

then ‘once a day’

when o2.out is null and o1.out is null

when o1.out > o2.out then ‘once a day’

when o1.out < o2.out then ‘more than once a day’

when o1.out = o2.out then ‘both’

(select point, date, out from outcome_o

where (point in (select distinct point from outcome

select distinct point from outcome_o))) as o1

(select point, left(convert(varchar, date, 121), 10) as date, sum(out) as out

where (point in (select distinct point from outcome

select distinct point from outcome_o))

group by point, left(convert(varchar, date, 121), 10)) as o2

on left(convert(varchar, o1.date, 121), 10) = o2.date and (o1.point = o2.point)

67. Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена.

select avg(price) from

(select k.code, k.model, k.price

from pc k inner join product p

on p.model = k.model and p.maker=’A’

select k.code, k.model, k.price

from laptop k inner join product p

on p.model = k.model and p.maker=’A’) as prices

68. Найдите средний размер диска ПК каждого из тех производителей, которые выпускают и принтеры. Вывести: maker, средний размер HD

select p.maker, avg(k.hd)

from pc k inner join product p

on (k.model = p.model) and

(p.maker in (select distinct maker from product where (type=’Printer’)))

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

with c as (select price, model from pc

select price, model from laptop

select price, model from printer)

select c.model from c

where c.price = (select max(price) from c)

select top 1 with ties model

from (select model, price from pc

select model, price from laptop

select model, price from printer) as prices

order by price desc

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

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

Galaxy QA Academy

Стань тестировщиком сегодня
Поддержи
Украину!
Практический тренинг по SQL

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

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

Хорошенько разберись с устройством таблиц перед тем как начать писать запросы. В любом случае возвращайся к схеме как только она тебе понадобиться

Рассматривается БД кораблей, участвовавших во второй мировой войне. Имеются следующие отношения:

Classes (class, type, country, numGuns, bore, displacement)
Ships (name, class, launched)
Battles (name, date)
Outcomes (ship, battle, result)

Корабли в «классах» построены по одному и тому же проекту, и классу присваивается либо имя первого корабля, построенного по данному проекту, либо названию класса дается имя проекта, которое не совпадает ни с одним из кораблей в БД. Корабль, давший название классу, называется головным.

Отношение Classes содержит имя класса, тип (bb для боевого (линейного) корабля или bc для боевого крейсера), страну, в которой построен корабль, число главных орудий, калибр орудий (диаметр ствола орудия в дюймах) и водоизмещение ( вес в тоннах).

В отношении Ships записаны название корабля, имя его класса и год спуска на воду.

В отношение Battles включены название и дата битвы, в которой участвовали корабли, а в отношении Outcomes – результат участия данного корабля в битве (потоплен-sunk, поврежден — damaged или невредим — OK).

Замечания. 1) В отношение Outcomes могут входить корабли, отсутствующие в отношении Ships. 2) Потопленный корабль в последующих битвах участия не принимает.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *