Ответы на задачи по SQL
Найдите пары моделей PC, имеющих одинаковые скорость и RAM. В результате каждая пара указывается только один раз, т.е. (i,j), но не (j,i), Порядок вывода: модель с большим номером, модель с меньшим номером, скорость и RAM.
SELECT DISTINCT B.model AS model, A.model AS model, A.speed, A.ram
FROM PC AS A, PC B
WHERE A.speed = B.speed AND A.ram = B.ram and A.model < B.model
Задание: 17
Найдите модели ПК-блокнотов, скорость которых меньше скорости любого из ПК. Вывести: type, model, speed
Select distinct type,laptop.model,speed from laptop inner join product on laptop.model= product.model
Задание: 18
Найдите производителей самых дешевых цветных принтеров. Вывести: maker, price
SELECT DISTINCT maker,price FROM printer inner JOIN product ON printer.model= product.model
WHERE price = (select min(price)from printer where color = ‘y’ ) and color = ‘y’
Задание: 19
Для каждого производителя найдите средний размер экрана выпускаемых им ПК-блокнотов. Вывести: maker, средний размер экрана.
Select maker ,avg(screen)as Avg_screen
from laptop inner join product on laptop.model = product.model group by maker
Задание: 20
Найдите производителей, выпускающих по меньшей мере три различных модели ПК. Вывести: Maker, число моделей
Select maker , count(model) as Count_Model from product where type = ‘pc’ group by maker
having count(model) >= 3
Задание: 21
Найдите максимальную цену ПК, выпускаемых каждым производителем. Вывести: maker, максимальная цена.
Select maker , max(price)as Max_price from pc inner join product on pc.model= product.model
Задание: 22
Для каждого значения скорости ПК, превышающего 600 МГц, определите среднюю цену ПК с такой же скоростью. Вывести: speed, средняя цена.
Select speed , avg(price) as Avg_price from pc where speed > 600 group by speed
Задание: 23
Найдите производителей, которые производили бы как ПКсо скоростью не менее 750 МГц, так и ПК-блокноты со скоростью не менее 750 МГц.Вывести: Maker
select distinct maker from pc inner join product on pc.model = product.model
where pc.speed >= 750 and maker in (select maker
from laptop inner join product on laptop.model = product.model where laptop.speed >= 750)
Задание: 24
Перечислите номера моделей любых типов, имеющих самую высокую цену по всей имеющейся в базе данных продукции.
SELECT model FROM(
SELECT distinct model, price FROM laptop WHERE laptop.price = (SELECT MAX(price) FROM laptop)
SELECT distinct model, price FROM pc WHERE pc.price = (SELECT MAX(price) FROM pc)
SELECT distinct model, price FROM printer WHERE printer.price = (SELECT MAX(price) FROM printer)
WHERE t.price=(SELECT MAX(price) FROM (
SELECT distinct price FROM laptop WHERE laptop.price = (SELECT MAX(price) FROM laptop)
SELECT distinct price FROM pc WHERE pc.price = (SELECT MAX(price) FROM pc)
SELECT distinct price FROM printer WHERE printer.price = (SELECT MAX(price) FROM printer)
Задание: 25
Найдите производителей принтеров, которые производят ПК с наименьшим объемом RAM и с самым быстрым процессором среди всех ПК,имеющих наименьший объем RAM. Вывести: Maker
SELECT distinct product.maker FROM product WHERE product.type=’Printer’
SELECT distinct product.maker FROM product INNER JOIN pc ON pc.model=product.model
WHERE product.type=’PC’ AND pc.ram=(SELECT MIN(ram) FROM pc)
AND pc.speed = (SELECT MAX(speed) FROM (SELECT distinct speed FROM pc
WHERE pc.ram=(SELECT MIN(ram) FROM pc)) as t)
Задание: 26
Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена.
SELECT t1.c/t1.d FROM( SELECT SUM(t.a) as c, SUM(t.b) as d FROM(
SELECT SUM(pc.price) as a, COUNT(pc.code) as b FROM pc
INNER JOIN product ON pc.model=product.model WHERE product.maker=’A’
SELECT SUM(laptop.price) as a, COUNT(laptop.code) as b FROM laptop
INNER JOIN product ON laptop.model=product.model WHERE product.maker=’A’) as t) as t1
Задание: 27
Найдите средний размер диска ПК каждого из тех производителей, которые выпускают и принтеры. Вывести: maker, средний размер HD.
select maker,avg(hd) from product inner join pc on product.model=pc.model
where maker in(select maker from product where type=’printer’) group by maker
Задание: 28
Найдите средний размер диска ПК (одно значение для всех) тех производителей, которые выпускают и принтеры. Вывести: средний размер HD
select avg(hd) from product inner join pc on product.model = pc.model
where maker in(select maker from product where type=’printer’)
Задание: 29
В предположении, что приход и расход денег на каждом пункте приема фиксируется не чаще одного раза в день [т.е. первичный ключ (пункт, дата)], написать запрос с выходными данными (пункт, дата, приход, расход). Использовать таблицы Income_o и Outcome_o.
select t.point, t.date, SUM(t.inc), sum(t.out) from( select point, date, inc, null as out from Income_o
select point, date, null as inc, Outcome_o.out from Outcome_o) as t group by t.point, t.date
Задание: 30
В предположении, что приход и расход денег на каждом пункте приема фиксируется произвольное число раз (первичным ключом в таблицах является столбец code), требуется получить таблицу, в которой каждому пункту за каждую дату выполнения операций будет соответствовать одна строка.Вывод: point, date, суммарный расход пункта за день (out), суммарный приход пункта за день (inc).Отсутствующие значения считать неопределенными (NULL).
select point, date, SUM(sum_out), SUM(sum_inc)
from( select point, date, SUM(inc) as sum_inc, null as sum_out from Income Group by point, date
select point, date, null as sum_inc, SUM(out) as sum_out from Outcome Group by point, date ) as t
group by point, date order by point
Задание: 31
Для классов кораблей, калибр орудий которых не менее 16 дюймов, укажите класс и страну.
Select class , country from classes where bore >= 16
Задание: 32
Одной из характеристик корабля является половина куба калибра его главных орудий (mw). С точностью до 2 десятичных знаков определите среднее значение mw для кораблей каждой страны, у которой есть корабли в базе данных.
Select country, cast(avg((power(bore,3)/2)) as numeric(6,2)) as weight
from (select country, classes.class, bore, name from classes left join ships on classes.class=ships.class
select distinct country, class, bore, ship from classes t1 left join outcomes t2 on t1.class=t2.ship
where ship=class and ship not in (select name from ships) ) a
where name!=’null’ group by country
Задание: 32 > вариант 2
select country, cast(avg(bore*bore*bore/2) AS NUMERIC(6,2)) as mw from (
select C.class, S.name, C.country, C.bore from classes as c join ships as s on c.class=s.class
select C.class, O.ship, C.country, C.bore from classes as c join outcomes as o on c.class=o.ship ) as G
group by country
Укажите корабли, потопленные в сражениях в Северной Атлантике (North Atlantic). Вывод: ship.
Select ship from outcomes,battles where result= ‘sunk’ and battle = ‘North Atlantic’ group by ship
Задание: 34
По Вашингтонскому международному договору от начала 1922 г. запрещалось строить линейные корабли водоизмещением более 35 тыс.тонн. Укажите корабли, нарушившие этот договор (учитывать только корабли c известным годом спуска на воду). Вывести названия кораблей.
Select name from classes,shipswhere launched>=1922 and displacement>35000 and type=’bb’ and
Задание: 35
В таблице Product найти модели, которые состоят только из цифр или только из латинских букв (A-Z, без учета регистра).Вывод: номер модели, тип модели.
SELECT model, type FROM product
WHERE model NOT LIKE ‘%[^0-9]%’ OR model NOT LIKE ‘%[^a-z]%’
Задание: 36
Перечислите названия головных кораблей, имеющихся в базе данных (учесть корабли в Outcomes).
Select name from ships where
select ship as name from classes,outcomes where classes.class = outcomes.ship
Задание: 37
Найдите классы, в которые входит только один корабль из базы данных (учесть также корабли в Outcomes).
Select class from(select name,class from ships
select class as name,class from classes,outcomes where classes.class=outcomes.ship) A
group by class having count(A.name)=1
Задание: 38
Найдите страны, имевшие когда-либо классы обычных боевых кораблей (‘bb’) и имевшие когда-либо классы крейсеров (‘bc’).
Select distinct country from classes where type=’bb’
Select distinct country from classes where type=’bc’
Задание: 39 >
Найдите корабли, «сохранившиеся для будущих сражений»; т.е. выведенные из строя в одной битве (damaged), они участвовали в другой, произошедшей позже.
select distinct ccc.sh from ( select aaa.ship as sh, aaa.[date] as d1, bbb.[date] as d2 from (
select ship, [date] from outcomes as o inner join battles as b on o.battle=b.name where result = ‘damaged’) as aaa inner join (select ship,
[date] from outcomes as o inner join battles as b on o.battle=b.name) as bbb on aaa.ship=bbb.ship
where bbb.date > aaa.date) as ccc
Вариант 2 : Задание: 39
select distinct B.ship
from(select * from outcomes left join battles on battle=name where result=’damaged’)as B
where exists (select shipfrom outcomes left join battles on battle=name
where ship=B.ship and B.date Задание: 40 Найдите класс, имя и страну для кораблей из таблицы Ships, имеющих не менее 10 орудий. Select classes.class , name,country from classes inner join ships on classes.class = ships.class where numguns >= 10 Задание: 41 Для ПК с максимальным кодом из таблицы PC вывести все его характеристики (кроме кода) в два столбца:- название характеристики (имя соответствующего столбца в таблице PC);- значение характеристики select ‘speed’ as m, CAST(speed as char) as a from pc where code >= all(select code from pc) select ‘model’ as m, CAST(model as char) as a from pc where code >= all(select code from pc) select ‘ram’ as m, CAST(ram as char) as a from pc where code >= all(select code from pc) select ‘hd’ as m, CAST(hd as char) as a from pc where code >= all(select code from pc) select ‘cd’ as m, CAST(cd as char) as a from pc where code >= all(select code from pc) select ‘price’ as m, CAST(price as char) as a from pc where code >= all(select code from pc) Вариант 2 : Задание: 41 select characteristics, value cast(model as varchar(max)) as model, cast(speed as varchar(max)) as speed, cast(ram as varchar(max)) as ram, cast(hd as varchar(max)) as hd, cast(cd as varchar(max)) as cd, cast(price as varchar(max)) as price from pc where code in (select max(code) from pc)) as A unpivot(value for characteristics in (model, speed, ram, hd, cd, price)) as unpvt Задание: 42 Найдите названия кораблей, потопленных в сражениях, и название сражения, в котором они были потоплены. Select ship,battle from outcomes where result =’sunk’ Задание: 43 Укажите сражения, которые произошли в годы, не совпадающие ни с одним из годов спуска кораблей на воду. select name from battles where DATEPART(yy, date) not in (select DATEPART(yy, date) from battles join ships on DATEPART(yy, date)=launched) Задание: 44 Select name from ships where name like ‘R%’ Select name from battles where name like ‘R%’ Select ship from outcomes where ship like ‘R%’ Задание: 45 Найдите названия всех кораблей в базе данных, состоящие из трех и более слов (например, King George V). Считать, что слова в названиях разделяются единичными пробелами, и нет концевых пробелов. Select name from ships where name like ‘% % %’ Select ship from outcomes where ship like ‘% % %’ Задание: 46 Укажите названия, водоизмещение и число орудий кораблей, участвовавших в сражении при Гвадалканале (Guadalcanal). select name as n, displacement as d, numguns as ng from ships inner join classes on ships.class=classes.class where name in (select ship from outcomes where battle = ‘Guadalcanal’) select ship as n, displacement as d, numguns as ng from outcomes inner join classes on outcomes.ship=classes.class where battle = ‘Guadalcanal’ and ship not in (select name from ships) select ship as n, null as d, null as ng from outcomes where battle = ‘Guadalcanal’ and ship not in (select name from ships) and ship not in (select class from classes) Задание: 47 Пронумеровать строки из таблицы Product в следующем порядке: имя производителя в порядке убывания числа производимых им моделей (при одинаковом числе моделей имя производителя в алфавитном порядке по возрастанию), номер модели (по возрастанию).Вывод: номер в соответствии с заданным порядком, имя производителя (maker), модель (model) select ROW_NUMBER() OVER(ORDER BY co desc, m, model) no, m, model from ( Select one.maker as m, model, co from product as one join (Select maker, count(model) as co from product group by maker) as two on one.maker=two.maker ) as ddd Задание: 48 Найдите классы кораблей, в которых хотя бы один корабль был потоплен в сражении. Select class as n from ships where name in(select ship from outcomes where result=’sunk’) Select ship as n from outcomes where ship not in(Select name from ships) and ship in(Select class from classes) and result=’sunk’ Задание: 49 Найдите названия кораблей с орудиями калибра 16 дюймов (учесть корабли из таблицы Outcomes). select name from ships where class in( Select class from classes where bore=16) select ship from outcomes where ship in( Select class from classes where bore=16) Задание: 50 Найдите сражения, в которых участвовали корабли класса Kongo из таблицы Ships. SELECT distinct battle FROM Classes inner JOIN Ships ON ships.class = classes.class inner JOIN Outcomes ON Classes.class=Outcomes.ship or Ships.name=Outcomes.ship WHERE classes.class = ‘Kongo’ Задание: 51 Найдите названия кораблей, имеющих наибольшее число орудий среди всех имеющихся кораблей такого же водоизмещения (учесть корабли из таблицы Outcomes). select NAME from(select name as NAME, displacement, numguns from ships inner join classes on ships.class = classes.class select ship as NAME, displacement, numguns from outcomes inner join classes on outcomes.ship= classes.class) as d1 inner join (select displacement, max(numGuns) as numguns from ( select displacement, numguns from ships inner join classes on ships.class = classes.class select displacement, numguns from outcomes inner join classes on outcomes.ship= classes.class) as f group by displacement) as d2 on d1.displacement=d2.displacement and d1.numguns =d2.numguns Задание: 52 Определить названия всех кораблей из таблицы Ships, которые могут быть линейным японским кораблем, имеющим число главных орудий не менее девяти, калибр орудий менее 19 дюймов и водоизмещение не более 65 тыс.тонн Select distinct name from ships inner join classes cl on ships.class=cl.class Задание: 53 Определите среднее число орудий для классов линейных кораблей.Получить результат с точностью до 2-х десятичных знаков. select cast(avg(numguns*1.0) as numeric(4,2)) as Avg_numGuns from classes where type=’bb’ Задание: 54 С точностью до 2-х десятичных знаков определите среднее число орудий всех линейных кораблей (учесть корабли из таблицы Outcomes). SELECT CAST(AVG(numguns*1.0) AS NUMERIC (4,2)) as AVG_nmg FROM (SELECT ship, type, numguns FROM Outcomes LEFT JOIN Classes ON ship = class SELECT name, type, numguns FROM Ships as S INNER JOIN Classes as C ON c.class = s.class ) AS T Задание: 55 Для каждого класса определите год, когда был спущен на воду первый корабль этого класса. Если год спуска на воду головного корабля неизвестен, определите минимальный год спуска на воду кораблей этого класса. Вывести: класс, год. select C.class, min(launched) from ships as S right join classes as C on s.class=c.class group by C.class Задание: 56 Для каждого класса определите число кораблей этого класса, потопленных в сражении. Вывести: класс и число потопленных кораблей. select classes.class, count(T.ship) from classes left join(select ship, class from outcomes left join ships on ship=name where result=’sunk’union select ship, class from outcomes left join classes on ship=class where result=’sunk’) as T on classes.class=T.classgroup by classes.class Задание: 57 Для классов, имеющих потери в виде потопленных кораблей и не менее 3 кораблей в базе данных, вывести имя класса и число потопленных кораблей. select class as cls, count(class) as sunked from( select C.class, O.ship from classes as C join outcomes as O on C.class=O.ship where O.result=’sunk’ select S.class, O.ship from outcomes as O join ships as S on S.name=O.ship where O.result=’sunk’) as T where class in ( select distinct X.class from (select C.class, O.ship from classes as C join outcomes as O on C.class=O.ship select C.class, S.name from classes as C join ships as S on C.class=S.class) as X group by X.class having count(X.class)>=3 ) group by class Задание: 58 Для каждого типа продукции и каждого производителя из таблицы Product c точностью до двух десятичных знаков найти процентное отношение числа моделей данного типа данного производителя к общему числу моделей этого производителя. Вывод: maker, type, процентное отношение числа моделей данного типа к общему числу моделей производителя select main_maker ,main_type ,CONVERT(NUMERIC(6,2),((sub_num*100.00)/(total_num*100.00)*100.00)) from (select count(p5.model) total_num ,p5.maker main_maker from product p5 group by p5.maker) p6 JOIN (select p3.maker sub_maker ,p3.type main_type ,count(p4.model) sub_num from (select p1.maker maker, p2.type type from product p1 cross join product p2 group by p1.maker, p2.type) p3 left join product p4 on p3.maker = p4.maker and p3.type = p4.type group by p3.maker,p3.type) p7 ON p7.sub_maker = p6.main_maker Задание: 59 select a.point, case when o is null then i else i-o end remain FROM (select point, sum(inc) as i from Income_o group by point) as A left join (select point, sum(out) as o from Outcome_o group by point) as B on A.point=B.point Задание: 59 > Вариант 2 Посчитать остаток денежных средств на каждом пункте приема для базы данных с отчетностью не чаще одного раза в день. Вывод: пункт, остаток. select A.point, (COALESCE (si, 0) — COALESCE (so, 0) ) from (select point, sum(inc) as si from income_o as i group by point) as A full join (select point, sum(out) as so from outcome_o as o group by point) as B on A.point=B.point Задание: 60 Посчитать остаток денежных средств на начало дня 15/04/01 на каждом пункте приема для базы данных с отчетностью не чаще одного раза в день. Вывод: пункт, остаток. Замечание. Не учитывать пункты, информации о которых нет до указанной даты. select a.point, case when o is null then i else i-o end remain FROM (select point, sum(inc) as i from Income_o where ‘20010415’ > date group by point) as A left join (select point, sum(out) as o from Outcome_o where ‘20010415’ > date group by point) as B on A.point=B.point Задание: 61 select (select sum(inc) from income_o) — (select sum(out) from outcome_o) as remain Задание: 62 Посчитать остаток денежных средств на всех пунктах приема на начало дня 15/04/01 для базы данных с отчетностью не чаще одного раза в день. select (select sum(inc) from income_o where ‘20010415’ > date) (select sum(out) from outcome_o where ‘20010415’ > date) as remain Задание: 63 Определить имена разных пассажиров, когда-либо летевших на одном и том же месте более одного раза. select name from Passenger where ID_psg in(Select Left([ol],CHARINDEX ( ‘ ‘, ol)) from ( Select CAST(concat(ID_psg,’ ‘, place) AS VARCHAR(30)) as ol, trip_no as o, ID_psg as psg from Pass_in_trip ) as lll group by ol having count(o)>1) Задание: 64 Используя таблицы Income и Outcome, для каждого пункта приема определить дни, когда был приход, но не было расхода и наоборот.Вывод: пункт, дата, тип операции (inc/out), денежная сумма за день Select income.point, income.date, ‘inc’ as operation, sum(income.inc) from income left join outcome on income.point=outcome.point and income.date=outcome.date where outcome.date is null group by income.point, income.date Select outcome.point, outcome.date, ‘out’ as operation, sum(outcome.out) from income right join outcome on income.point=outcome.point and income.date=outcome.date where income.date is null group by outcome.point, outcome.date Задание: 67 Найти количество маршрутов, которые обслуживаются наибольшим числом рейсов. Замечания. 1) A — B и B — A считать РАЗНЫМИ маршрутами. 2) Использовать только таблицу Trip select count(qqq) as qty from ( select town_from as qqq, town_to, count(plane) as cp from Trip group by town_from, town_to having count(plane) >= all(select count(plane) from Trip group by town_from, town_to) ) as tab Задание: 71 Найти тех производителей ПК, все модели ПК которых имеются в таблице PC. select p.maker from product p where p.type=’pc’ group by p.maker having count(DISTINCT p.model) = ( select count(DISTINCT pc.model) from pc where pc.model in ( select DISTINCT pr.model from product pr where pr.maker=p.maker )) Задание: 74 Вывести классы всех кораблей России (Russia). Если в базе данных нет классов кораблей России, вывести классы для всех имеющихся в БД стран. Вывод: страна, класс select c.country, c.class from classes c where c.country like (case when (select count(*) from classes c where c.country=’Russia’ group by c.country) is not null THEN (‘Russia’) else (‘%’) end) Задание: 80 Найти производителей компьютерной техники, у которых нет моделей ПК, не представленных в таблице PC. select distinct maker from product where maker not in ( select maker from product where model in ( select model from product where type=’pc’ except select model from pc ) ) Задание: 85 Найти производителей, которые выпускают только принтеры или только PC. При этом искомые производители PC должны выпускать не менее 3 моделей. select maker from ( select maker from product where type=’printer’ except select maker from product where type=’laptop’ except select maker from product where type=’pc’ ) as T select maker from ( select maker from product inner join pc on pc.model=product.model group by maker having count(maker)>=3 except select maker from product where type=’laptop’ except select maker from product where type=’printer’ ) as S Задание: 89 Найти производителей, у которых больше всего моделей в таблице Product, а также тех, у которых меньше всего моделей. Вывод: maker, число моделей select maker, count(maker) from product group by maker having count(maker) in ( select max(D.cnt) from ( select maker, count(maker) as cnt from product group by maker ) as D select min(F.cnt) from ( select maker, count(maker) as cnt from product group by maker ) as F ) Задание: 91 Используя таблицу Product, определить количество производителей, выпускающих по одной модели. select count(*) from ( select maker from product group by maker having count(model)=1 ) as Q Знание SQL необходимо любому back-end разработчику, независимо от языка программирования. В данном выпуске продемонстрирован список вариантов решений задач популярного сайта sql-ex.ru. Перед выполнением задач, необходимо понимать структуру sql запроса: Оператор HAVING позволяет выполнить фильтрацию групп, то есть определяет, какие группы будут включены в выходной результат. Использование HAVING во многом аналогично применению WHERE. Только если WHERE применяется для фильтрации строк, то HAVING — для фильтрации групп. 1. Найдите номер модели, скорость и размер жесткого диска для всех ПК стоимостью менее 500 дол. Вывести: model, speed и hd select model, speed, hd from pc where price < 500 2. Найдите производителей принтеров. Вывести: maker SELECT maker FROM Product WHERE type = ‘Printer’ GROUP BY maker 3. Найдите номер модели, объем памяти и размеры экранов ПК-блокнотов, цена которых превышает 1000 дол. Select model, ram, screen from laptop where price > 1000 4. Найдите все записи таблицы Printer для цветных принтеров. Select * from printer where color = ‘y’ 5. Найдите номер модели, скорость и размер жесткого диска ПК, имеющих 12x или 24x CD и цену менее 600 дол. Select model, speed, hd from pc where (cd = ’12x’ or cd = ’24x’) and price < 600 6. Для каждого производителя, выпускающего ПК-блокноты c объёмом жесткого диска не менее 10 Гбайт, найти скорости таких ПК-блокнотов. Вывод: производитель, скорость. Select distinct p.maker as maker, l.speed as speed from laptop l join product p on l.model = p.model where l.hd >= 10 7. Найдите номера моделей и цены всех имеющихся в продаже продуктов (любого типа) производителя B (латинская буква). Select distinct p.model, pc.price from product p join pc on p.model = pc.model where maker = ‘B’ union Select distinct p.model, l.price from product p join laptop l on p.model = l.model where maker = ‘B’ union Select distinct p.model, pr.price from product p join printer pr on p.model = pr.model where maker = ‘B’ 8. Найдите производителя, выпускающего ПК, но не ПК-блокноты. select maker from product where type = ‘pc’ except select maker from product where type = ‘laptop’ или select distinct maker from product where type = ‘pc’ and maker not in (SELECT maker from product where type = ‘laptop’) 9. Найдите производителей ПК с процессором не менее 450 Мгц. Вывести: Maker Select distinct p.maker from product p join pc pc on p.model = pc.model where pc.speed >= ‘450’ 10. Найдите модели принтеров, имеющих самую высокую цену. Вывести: model, price SELECT DISTINCT model, price FROM printer where price = (SELECT MAX(price) FROM printer) 11. Найдите среднюю скорость ПК. SELECT AVG(speed) FROM PC 12. Найдите среднюю скорость ПК-блокнотов, цена которых превышает 1000 дол. Select AVG(speed) from laptop where price > ‘1000’ 13. Найдите среднюю скорость ПК, выпущенных производителем A Select avg(pc.speed) from pc join product p on pc.model = p.model where maker = ‘A’ 14. Найдите класс, имя и страну для кораблей из таблицы Ships, имеющих не менее 10 орудий. Select s.class, s.name, c.country from classes c join ships s on c.class = s.class where numguns >= ’10’ 15. Найдите размеры жестких дисков, совпадающих у двух и более PC. Вывести: HD SELECT hd FROM PC group by hd having count(model) >= 2 16. Найдите пары моделей PC, имеющих одинаковые скорость и RAM. В результате каждая пара указывается только один раз, т.е. (i,j), но не (j,i), Порядок вывода: модель с большим номером, модель с меньшим номером, скорость и RAM. SELECT DISTINCT A.model AS model, B.model AS model, A.speed As speed, A.ram As ram FROM PC AS A, PC B WHERE A.speed = B.speed AND A.ram = B.ram AND A.model > B.model 17. Найдите модели ПК-блокнотов, скорость которых меньше скорости каждого из ПК. Вывести: type, model, speed 18. Найдите производителей самых дешевых цветных принтеров. Вывести: maker, price Select distinct p.maker, pr.price from product p join printer pr on p.model = pr.model where pr.price = (SELECT MIN(price) 19. Для каждого производителя, имеющего модели в таблице Laptop, найдите средний размер экрана выпускаемых им ПК-блокнотов. Select p.maker, AVG(l.screen) from product p join laptop l on p.model = l.model group by p.maker 20. Найдите производителей, выпускающих по меньшей мере три различных модели ПК. Вывести: Maker, число моделей ПК. Select maker, count(model) as Count_Model from product WHERE type = ‘pc’ group by maker having count(model) >= 3 21. Найдите максимальную цену ПК, выпускаемых каждым производителем, у которого есть модели в таблице PC. Select p.maker, max(pc.price) as max_price from product p join pc pc on p.model = pc.model group by maker 22. Для каждого значения скорости ПК, превышающего 600 МГц, определите среднюю цену ПК с такой же скоростью. Вывести: speed, средняя цена. Select speed, avg(price) from pc where speed > ‘600’ group by speed 23. Найдите производителей, которые производили бы как ПК Select p.maker from product p join pc pc on p.model = pc.model where pc.speed >= ‘750’ intersect Select p.maker from product p join laptop l on p.model = l.model where l.speed >= ‘750’ 24. Перечислите номера моделей любых типов, имеющих самую высокую цену по всей имеющейся в базе данных продукции. WITH all_model AS ( 25. Найдите производителей принтеров, которые производят ПК с наименьшим объемом RAM и с самым быстрым процессором среди всех ПК, имеющих наименьший объем RAM. Вывести: Maker select distinct p.maker from product p join pc on p.model = pc.model where pc.ram = (select min(ram) from pc) and pc.speed = (SELECT MAX(speed) FROM pc WHERE ram = (SELECT MIN(ram) FROM pc)) and p.maker in (SELECT maker FROM product WHERE type = ‘printer’) 26. Найдите среднюю цену ПК и ПК-блокнотов, выпущенных производителем A (латинская буква). Вывести: одна общая средняя цена. SELECT AVG(price) as Avg_price FROM (SELECT price 27. Найдите средний размер диска ПК каждого из тех производителей, которые выпускают и принтеры. Вывести: maker, средний размер HD. SELECT p.maker, avg(pc.hd) from product p join pc pc on p.model = pc.model WHERE pc.model IN (SELECT model FROM pc) AND maker IN ( 28. Используя таблицу Product, определить количество производителей, выпускающих по одной модели. select count(maker) as qty from (SELECT distinct maker 29. В предположении, что приход и расход денег на каждом пункте приема фиксируется не чаще одного раза в день [т.е. первичный ключ (пункт, дата)], написать запрос с выходными данными (пункт, дата, приход, расход). Использовать таблицы Income_o и Outcome_o. Select i.point, i.date, inc, out from income_o i left join outcome_o o on i.point = o.point and i.date = o.date 30. В предположении, что приход и расход денег на каждом пункте приема фиксируется произвольное число раз (первичным ключом в таблицах является столбец code), требуется получить таблицу, в которой каждому пункту за каждую дату выполнения операций будет соответствовать одна строка. select point, date, SUM(sum_out), SUM(sum_inc) 31. Для классов кораблей, калибр орудий которых не менее 16 дюймов, укажите класс и страну. Select class, country from classes where bore >= ’16’ 32. Одной из характеристик корабля является половина куба калибра его главных орудий (mw). С точностью до 2 десятичных знаков определите среднее значение mw для кораблей каждой страны, у которой есть корабли в базе данных. Select country, cast(avg((power(bore,3)/2)) as numeric(6,2)) as weight 33. Укажите корабли, потопленные в сражениях в Северной Атлантике (North Atlantic). Вывод: ship. Select ship from outcomes where result = ‘sunk’ and battle = ‘North Atlantic’ 34. По Вашингтонскому международному договору от начала 1922 г. запрещалось строить линейные корабли водоизмещением более 35 тыс.тонн. Укажите корабли, нарушившие этот договор (учитывать только корабли c известным годом спуска на воду). Вывести названия кораблей. Select distinct name from classes, ships where launched >=1922 and displacement>35000 and type=’bb’ and 35. В таблице Product найти модели, которые состоят только из цифр или только из латинских букв (A-Z, без учета регистра). Select model, type from product where model NOT LIKE ‘%[^0-9]%’ OR model NOT LIKE ‘%[^a-z]%’ 36. Перечислите названия головных кораблей, имеющихся в базе данных (учесть корабли в Outcomes). Select distinct c.class from classes c join outcomes o on c.class = o.ship 37. Найдите классы, в которые входит только один корабль из базы данных (учесть также корабли в Outcomes). select class from (Select distinct c.class, o.ship as name from classes c join outcomes o on c.class = o.ship Select class from(select class, name from ships 38. Найдите страны, имевшие когда-либо классы обычных боевых кораблей (‘bb’) и имевшие когда-либо классы крейсеров (‘bc’). SELECT country FROM classes where type = ‘bb’ 39. Найдите корабли, `сохранившиеся для будущих сражений`; т.е. выведенные из строя в одной битве (damaged), они участвовали в другой, произошедшей позже. select distinct B.ship select distinct o.ship from outcomes o join battles b on o.battle = b.name where o.result = ‘damaged’ AND 40. Найти производителей, которые выпускают более одной модели, при этом все выпускаемые производителем модели являются продуктами одного типа. Вывести: maker, type select maker, type from product SELECT distinct maker, max(type) as type 41. Для каждого производителя, у которого присутствуют модели хотя бы в одной из таблиц PC, Laptop или Printer, with D as Select distinct P.maker, 42. Найдите названия кораблей, потопленных в сражениях, и название сражения, в котором они были потоплены. Select ship, battle from outcomes where result = ‘sunk’ 43. Укажите сражения, которые произошли в годы, не совпадающие ни с одним из годов спуска кораблей на воду. select name from battles where DATEPART(yy, date) not in (select DATEPART(yy, date) SELECT distinct b.name 44. Найдите названия всех кораблей в базе данных, начинающихся с буквы R. Select name from ships where name like ‘R%’ 45. Найдите названия всех кораблей в базе данных, состоящие из трех и более слов (например, King George V). Select name from ships where name like ‘% % %’ 46. Для каждого корабля, участвовавшего в сражении при Гвадалканале (Guadalcanal), вывести название, водоизмещение и число орудий. SELECT DISTINCT ship, displacement, numguns 47. Определить страны, которые потеряли в сражениях все свои корабли. WITH out AS (SELECT * SELECT fin.country SELECT out.s_country, COUNT(out.ship) AS num_ships 48. Найдите классы кораблей, в которых хотя бы один корабль был потоплен в сражении. select class 49. Найдите названия кораблей с орудиями калибра 16 дюймов (учесть корабли из таблицы Outcomes). select s.name from ships s join classes c on s.name=c.class or s.class = c.class where c.bore = 16 50. Найдите сражения, в которых участвовали корабли класса Kongo из таблицы Ships. Select distinct o.battle from ships s join outcomes o on s.name = o.ship where s.class = ‘kongo’ 51. Найдите названия кораблей, имеющих наибольшее число орудий среди всех имеющихся кораблей такого же водоизмещения (учесть корабли из таблицы Outcomes). select NAME from(select name as NAME, displacement, numguns from ships inner join classes on ships.class = classes.class union select ship as NAME, displacement, numguns from outcomes inner join classes on outcomes.ship= classes.class) as d1 inner join (select displacement, max(numGuns) as numguns from ( select displacement, numguns from ships inner join classes on ships.class = classes.class union select displacement, numguns from outcomes inner join classes on outcomes.ship= classes.class) as f group by displacement) as d2 on d1.displacement=d2.displacement and d1.numguns =d2.numguns 52. Определить названия всех кораблей из таблицы Ships, которые могут быть линейным японским кораблем, имеющим число главных орудий не менее девяти, калибр орудий менее 19 дюймов и водоизмещение не более 65 тыс.тонн select s.name from ships s join classes c on s.class = c.class where country = ‘japan’ and (numGuns >= ‘9’ or numGuns is null) and (bore < '19' or bore is null) and (displacement
53. Определите среднее число орудий для классов линейных кораблей. Получить результат с точностью до 2-х десятичных знаков. Select CAST(AVG(numguns*1.0) AS NUMERIC(6,2)) as Avg_nmg from classes where type = ‘bb’ 54. С точностью до 2-х десятичных знаков определите среднее число орудий всех линейных кораблей (учесть корабли из таблицы Outcomes). select CAST(AVG(numguns*1.0) AS NUMERIC(6,2)) as AVG_nmg from (select ship, numguns, type from Outcomes join classes on ship = class 55. Для каждого класса определите год, когда был спущен на воду первый корабль этого класса. Если год спуска на воду головного корабля неизвестен, определите минимальный год спуска на воду кораблей этого класса. Вывести: класс, год. Select c.class, min(s.launched) from classes c left join ships s on c.class = s.class group by c.class 56. Для каждого класса определите число кораблей этого класса, потопленных в сражениях. Вывести: класс и число потопленных кораблей. SELECT c.class, COUNT(s.ship) Найдите номер модели, скорость и размер жесткого диска ПК, имеющих 12х или 24х CD и цену менее 600 дол. Select model ,speed , hd from pc where (cd = ’12x’ or cd = ’24x’) and price < 600
Укажите производителя и скорость ПК-блокнотов с жестким диском объемом не менее 10 Гбайт.
Select maker, speed from Product inner join Laptop on Product.model = Laptop.model Найдите номера моделей и цены всех продуктов (любого типа) выпущенных производителем A (латинские буквы). Select laptop.model , laptop.price from laptop inner join product on laptop.model = product.model Найдите производителя, продающего ПК, но не ПК-блокноты. select maker from product where type=’PC’ and maker not in Найдите производителей ПК с процессором не менее 450 Мгц. Вывести: Maker Select maker from pc inner join product on pc.model = product.model where speed >= 450 Найдите принтеры, имеющие самую высокую цену. Вывести: model, price Select avg(speed) from pc inner join product on pc.model= product.model where maker = ‘A’ Для каждого значения скорости найдите среднюю стоимость ПК с такой же скоростью процессора. Вывести: скорость, средняя цена. Select speed , avg(price) from pc group by speed SELECT DISTINCT maker,price FROM printer inner JOIN product ON printer.model= product.model Для каждого производителя найдите средний размер экрана выпускаемых им ПК-блокнотов. Вывести: maker, средний размер экрана. Select maker ,avg(screen)as Avg_screen Найдите максимальную цену ПК, выпускаемых каждым производителем. Вывести: maker, максимальная цена. Select maker , max(price)as Max_price from pc inner join product on pc.model= product.model Для каждого значения скорости ПК, превышающего 600 МГц, определите среднюю цену компьютера с такой же скоростью. Вывести: speed, средняя цена Select speed , avg(price) as Avg_price from pc where speed > 600 group by speed Найдите средний размер диска ПК каждого из тех производителей, которые выпускают и принтеры. Вывести: maker, средний размер HD select maker,avg(hd) from product inner join pc on product.model=pc.model Укажите имена и страны для классов кораблей, калибр орудий которых не менее 16 дюймов. По Вашингтонскому международному договору от начала 1922 г. запрещалось строить линейные корабли водоизмещением более 35 тыс.тонн. Укажите корабли, нарушившие этот договор. Вывести названия кораблей. Select name Укажите названия, водоизмещение и число орудий, кораблей участвовавших в сражении при Гвадалканале (Guadalcanal) Перечислите названия головных кораблей, имеющихся в базе данных (учесть корабли в Outcomes) Select name Найдите класс, имя и страну для кораблей из таблицы Ships, имеющих не менее 10 орудий. Select classes.class , name,country Найдите названия кораблей, потопленных в сражениях, и название сражения, в котором они были потоплены. Select ship,battle select class Найдите сражения, в которых участвовали корабли класса Kongo SELECT distinct battle Для классов, имеющих потери в виде потопленных кораблей и не менее 3 кораблей в базе данных, вывести имя класса и число потопленных кораблей. select class as cls, count(class) as sunked from( Для каждого класса определите число кораблей этого класса, потопленных в сражении. Вывести: класс и число потопленных кораблей. Для каждого класса определите год, когда был спущен на воду первый корабль этого класса. Если год спуска на воду головного корабля неизвестен, определите минимальный год спуска на воду кораблей этого класса. Если для класса год спуска на воду кораблей данного класса неизвестен вывести значение NULL. Вывести: класс, год. Определите среднее число орудий для классов линейных кораблей. Получить результат с точностью до 2-х десятичных знаков. select cast(avg(numguns*1.0) as numeric(4,2)) as Avg_numGuns from classes where type=’bb’ Найдите названия кораблей, имеющих наибольшее число орудий среди всех кораблей такого же водоизмещения (учесть корабли из таблицы Outcomes). Вес снаряда (в фунтах), выпускаемого орудием, примерно равен половине куба его калибра (в дюймах). Определите средний вес снарядов для кораблей каждой страны. SELECT DISTINCT Classes.country, ( SELECT AVG( pen.p ) FROM Найдите названия кораблей с орудиями калибра 16 дюймов select name from ships Найдите классы кораблей, в которых хотя бы один корабль был потоплен в сражении Select class as n from ships where name in(select ship from outcomes where result=’sunk’) Укажите сражения, в которых участвовало по меньшей мере три корабля одной и той же страны Найдите названия всех кораблей в базе данных, начинающихся с буквы R Select name Найдите пары моделей PC, имеющих одинаковые скорость и RAM. В результате каждая пара указывается только один раз, т.е. (i,j), но не (j,i), Порядок вывода: модель с большим номером, модель с меньшим номером, скорость и RAM. SELECT distinct pc1.model, pc2.model, pc1.speed, pc1.ram Найдите ПК-блокноты, скорость которых меньше скорости любого ПК. Вывести: ctype, model, speed Select distinct type,laptop.model,speed from laptop inner join product on laptop.model= product.model В предположении, что приход и расход денег на каждом пункте приема фиксируется не чаще одного раза в день [т.е. первичный ключ (пункт, дата)], написать запрос с выходными данными (пункт, дата, приход, расход). Использовать таблицы Income_o и Outcome_o. В предположении, что приход и расход денег на каждом пункте приема фиксируется произвольное число раз [в обе таблицы добавлен первичный ключ code] , написать запрос с выходными данными (point, date, out, inc), в котором каждому пункту за каждую дату соответствует одна строка. Использовать таблицы Income и Outcome. select point, date, SUM(sum_out), SUM(sum_inc) Подсчитать остаток денежных средств на каждом пункте приема для базы данных с отчетностью не чаще одного раза в день. Вывод: пункт, остаток. Использовать таблицы Income_o и Outcome_o. select a.point, case when o is null then i else i-o end remain FROM (select point, sum(inc) as i Подсчитать остаток денежных средств на начало дня 15 апреля 2001 года на каждом пункте приема для базы данных с отчетностью не чаще одного раза в день. Вывод: пункт, остаток. Использовать таблицы Income_o и Outcome_o. select a.point, case when o is null then i else i-o end remain FROM (select point, sum(inc) as i Посчитать остаток денежных средств на всех пунктах приема для базы данных с отчетностью не чаще одного раза в день. Использовать таблицы Income_o и Outcome_o. SELECT sum(inc)-(SELECT sum(out) FROM Outcome_o) FROM Income_o Посчитать остаток денежных средств на всех пунктах приема на начало дня 15 апреля 2001 года для базы данных с отчетностью не чаще одного раза в день. Использовать таблицы Income_o и Outcome_o. SELECT 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 команды. Задание: 50 (Serge I: 2002-11-05) select distinct battle from outcomes Решение задач по SQL
SELECT столбцы FROM таблица [WHERE условие_фильтрации_строк] [GROUP BY столбцы_для_группировки] [HAVING условие_фильтрации_групп] [ORDER BY столбцы_для_сортировки]
FROM printer where color = ‘y’) and pr.color = ‘y’
Вывести: maker, средний размер экрана.
Вывести: maker, максимальная цена.
со скоростью не менее 750 МГц, так и ПК-блокноты со скоростью не менее 750 МГц. Вывести: Maker
SELECT model, price FROM pc
UNION ALL
SELECT model, price FROM printer
UNION ALL
SELECT model, price FROM laptop )
SELECT distinct model
FROM all_model WHERE price = ALL ( SELECT max(price) FROM all_model)
FROM PC WHERE model IN (SELECT model FROM product WHERE maker=’A’ AND type=’PC’) UNION ALL SELECT price
FROM Laptop
WHERE model IN (SELECT model FROM product WHERE maker=’A’ AND
type=’Laptop’)
) AS prods
SELECT maker FROM product WHERE type=’printer’) group by maker или select p.maker, avg(pc.hd) as avg_hd from product p join pc on p.model = pc.model where p.maker in (select maker from product where type = ‘printer’) group by p.maker
FROM product group by maker having count(model) = 1) AS prod или select distinct count(maker) as qty from product where maker in (Select maker from product group by maker having count(model) = 1)
union
Select o.point, o.date, inc, out from income_o i right join outcome_o o on i.point = o.point and i.date = o.date
Вывод: point, date, суммарный расход пункта за день (out), суммарный приход пункта за день (inc). Отсутствующие значения считать неопределенными (NULL).
from( select point, date, SUM(inc) as sum_inc, null as sum_out from Income Group by point, date
Union
select point, date, null as sum_inc, SUM(out) as sum_out from Outcome Group by point, date ) as t
group by point, date order by point
from (select country, classes.class, bore, name from classes left join ships on classes.class=ships.class
union all
select distinct country, class, bore, ship from classes t1 left join outcomes t2 on t1.class=t2.ship
where ship=class and ship not in (select name from ships) ) a
where name!=’null’ group by country
ships.class = classes.class
Вывод: номер модели, тип модели.
union
Select distinct c.class from classes c join ships s on c.class = s.class where s.class = s.name
union
Select distinct c.class,s.name from classes c join ships s on c.class = s.class) as main_class group by class having count(main_class.name) = 1
union
select class, ship as name from outcomes join classes on classes.class = outcomes.ship) as A
group by class having count(A.name)=1
INTERSECT
SELECT country FROM classes where type = ‘bc’
from(select * from outcomes left join battles on battle=name where result=’damaged’) as B
where exists (select ship from outcomes left join battles on battle=name
where ship=B.ship and B.date
FROM battles join outcomes on outcomes.battle = battles.name
WHERE battles.date > b.date and outcomes.ship = o.ship)
EXISTS (SELECT battles.date
FROM battles join outcomes on outcomes.battle = battles.name
WHERE battles.date > b.date and outcomes.ship = o.ship)
where maker in (SELECT maker FROM
(SELECT maker, type FROM Product GROUP BY maker, type) Alias
group by maker having count(maker) = 1) group by maker, type having count(type)>1
FROM product
GROUP BY maker
HAVING COUNT(distinct type) = 1 AND COUNT(model) > 1
определить максимальную цену на его продукцию.
Вывод: имя производителя, если среди цен на продукцию данного производителя присутствует NULL, то выводить для этого производителя NULL,
иначе максимальную цену.
(select model, price from PC
union
select model, price from Laptop
union
select model, price from Printer)
CASE WHEN MAX(CASE WHEN D.price IS NULL THEN 1 ELSE 0 END) = 0 THEN
MAX(D.price) END
from Product P
right join D on P.model=D.model
group by P.maker
from battles join ships on DATEPART(yy, date)=launched)
FROM Outcomes o right JOIN
battles b ON o.ship = b.name where DATEPART(yy, b.date) not in (select launched from ships)
union
Select ship from outcomes where ship like ‘R%’
Считать, что слова в названиях разделяются единичными пробелами, и нет концевых пробелов.
union
Select ship from outcomes where ship like ‘% % %’
FROM classes LEFT JOIN ships ON classes.class=ships.class RIGHT JOIN outcomes ON classes.class=ship OR ships.name=ship
WHERE battle=’Guadalcanal’
FROM outcomes JOIN (SELECT ships.name s_name, classes.class s_class, classes.country s_country
FROM ships FULL JOIN classes
ON ships.class = classes.class
) u
ON outcomes.ship=u.s_class
UNION
SELECT *
FROM outcomes JOIN (SELECT ships.name s_name, classes.class s_class, classes.country s_country
FROM ships FULL JOIN classes
ON ships.class = classes.class
) u
ON outcomes.ship=u.s_name)
FROM (
SELECT DISTINCT t.country, COUNT(t.name) AS num_ships
FROM (
select distinct c.country, s.name
from classes c
inner join Ships s on s.class= c.class
union
select distinct c.country, o.ship
from classes c
inner join Outcomes o on o.ship= c.class) t
GROUP BY t.country
FROM out
WHERE out.result=’sunk’
GROUP BY out.s_country) fin
from classes t1 left join outcomes t2 on t1.class=t2.ship where result=’sunk’
union
select class
from ships left join outcomes on ships.name=outcomes.ship where result=’sunk’
union
select o.ship from outcomes o join classes c on o.ship=c.class where c.bore = 16
union
select name, numguns, type from ships s join classes c on c.class = s.class) as x where type = ‘bb’
FROM classes c
LEFT JOIN (SELECT o.ship, sh.class
FROM outcomes o
LEFT JOIN ships sh ON sh.name = o.ship
WHERE o.result = ‘sunk’) AS s ON s.class = c.class OR s.ship = c.class
GROUP BY c.class ArtVk & Bugtrack
where hd >= 10
where product.maker= ‘ A ‘
union
Select pc.model , pc.price from pc inner join product on pc.model = product.model
where product.maker= ‘ A ‘
union
Select printer.model , printer.price from printer inner join product on printer.model = product.model
where product.maker= ‘ A ‘
( select maker from product where type = ‘Laptop’) group by maker
group by maker
select model, price from printer where price = (select max(price) from printer)
Найдите среднюю скорость ПК. Вывести таблицу из одной колонки и одной строки.
select avg (speed) from pc
Найдите среднюю скорость ПК-блокнотов, цена которых превышает 1000 дол.
Select avg(speed) from laptop where price > 1000
Найдите среднюю скорость ПК, выпущенных производителем A
group by maker
Найдите размеры жестких дисков, совпадающих у двух и более PC. Вывести: HD
Select hd from pc group by hd having count(model)>1
Найдите производителей самых дешевых цветных принтеров. Вывести: maker, price
WHERE price = (select min(price)from printer where color = ‘y’ ) and color = ‘y’
from laptop inner join product on laptop.model = product.model group by maker
group by maker
where maker in(select maker from product where type=’printer’) group by maker
Select class , country
from classes
where bore >= 16
Укажите корабли, потопленные в сражениях в Северной Атлантике (North Atlantic). Вывод: ship
Select ship
from Outcomes
where battle = ‘North Atlantic’ and result=’sunk’;
from classes,ships
where launched>=1922 and displacement>35000 and type=’bb’ and
ships.class = classes.class1. SELECT Outcomes.ship, Classes.displacement, Classes.numGuns
2. FROM Classes RIGHT JOIN
3. Outcomes ON Classes.class = Outcomes.ship
4. WHERE Outcomes.battle = 'Guadalcanal';
from ships
where
union
select ship as name
from classes,outcomes
where classes.class = outcomes.ship
from classes inner join ships on classes.class = ships.class
where numguns >= 10
from outcomes
where result =’sunk’
Найдите страны, корабли которых имеют наибольшее число орудий.
SELECT country, max(numguns)
FROM classes;
Найдите классы кораблей, в которых хотя бы один корабль был потоплен в сражении.
from classes t1 left join outcomes t2 on t1.class=t2.ship where result=’sunk’
union
select class
from ships left join outcomes on ships.name=outcomes.ship where result=’sunk’
FROM Classes
inner JOIN Ships ON ships.class = classes.class
inner JOIN Outcomes ON Classes.class=Outcomes.ship or Ships.name=Outcomes.ship
WHERE classes.class = ‘Kongo’
select C.class, O.ship from classes as C join outcomes as O on C.class=O.ship where O.result=’sunk’
union
select S.class, O.ship from outcomes as O join ships as S on S.name=O.ship where O.result=’sunk’) as T
where class in ( select distinct X.class from (select C.class, O.ship from classes as C join outcomes as O on C.class=O.ship
union
select C.class, S.name from classes as C join ships as S on C.class=S.class) as X group by X.class
having count(X.class)>=3 ) group by class1. SELECT aa.class, SUM(aa.sunks) Sunks
2. FROM (
3. -- 1
4. SELECT c.class, COUNT(a.ship) sunks
5. FROM Outcomes a INNER JOIN
6. Ships b ON a.ship = b.name INNER JOIN
7. Classes c ON b.class = c.class
8. WHERE a.result = 'sunk'
9. GROUP BY c.class
10.UNION
11.-- 2
12.SELECT c.class, COUNT(a.ship)
13.FROM Outcomes a INNER JOIN
14.Classes c ON a.ship = c.class
15.WHERE a.result = 'sunk'
16.GROUP BY c.class
17.UNION
18.-- 3
19.SELECT c.class, 0
20.FROM Classes c
21.) aa
22.GROUP BY aa.class
1. SELECT C.class , launched
2. FROM Classes C ,
3. (SELECT name , class , launched
4. FROM Ships
5. UNION
6. SELECT ship , ship , NULL
7. FROM Outcomes O
8. WHERE NOT EXISTS (SELECT *
9. FROM Ships S
10. WHERE S.class = O.ship
12. UNION
13. SELECT ship , ship , MIN(launched)
14. FROM Ships S ,
15. Outcomes O
16. WHERE S.class = O.ship
17. GROUP BY ship
18. ) S
19.WHERE C.class = S.name;
1. SELECT name
2. FROM (SELECT O.ship AS name, numGuns, displacement
3. FROM Outcomes O INNER JOIN
4. Classes C ON O.ship = C.class AND
5. O.ship NOT IN (SELECT name
6. FROM Ships
8. UNION
9. SELECT S.name AS name, numGuns, displacement
10. FROM Ships S INNER JOIN
11. Classes C ON S.class = C.class
12. ) OS INNER JOIN
13. (SELECT MAX(numGuns) AS MaxNumGuns, displacement
14. FROM Outcomes O INNER JOIN
15. Classes C ON O.ship = C.class AND
16. O.ship NOT IN (SELECT name
17. FROM Ships
19. GROUP BY displacement
20. UNION
21. SELECT MAX(numGuns) AS MaxNumGuns, displacement
22. FROM Ships S INNER JOIN
23. Classes C ON S.class = C.class
24. GROUP BY displacement
25. ) GD ON OS.numGuns = GD.MaxNumGuns AND
26. OS.displacement = GD.displacement;
(
SELECT (c1.bore*c1.bore*c1.bore)/2 AS p FROM Classes AS c1, Ships AS s1
WHERE c1.class=s1.class AND c1.country = Classes.country
AND c1.bore IS NOT NULL
UNION ALL
SELECT (c2.bore*c2.bore*c2.bore)/2 FROM Classes AS c2, Outcomes
WHERE c2.country = Classes.country AND c2.class=Outcomes.ship
AND c2.bore IS NOT NULL
AND Outcomes.ship NOT IN ( SELECT ss.name FROM Ships AS ss )
) AS pen
WHERE pen.p IS NOT NULL
) AS weight
FROM Classes
WHERE Classes.country IS NOT NULL
(учесть корабли из таблицы Outcomes)
join classes on classes.class=ships.class
where bore=’16’
union
select ship from outcomes
join classes on classes.class=outcomes.ship
where bore=’16’
union
Select ship as n from outcomes
where ship not in(Select name from ships) and ship in(Select class from classes) and result=’sunk’1. SELECT AA.name AS bat
2. FROM (SELECT O.battle AS name, C.country, COUNT(O.ship) AS cnt
3. FROM Outcomes O, Ships S, Classes C
4. WHERE O.ship = S.name AND
5. C.class = S.class
6. GROUP BY O.battle, C.country
7. ) AA
8. WHERE AA.cnt >= 3;
from ships
where name like ‘R%’
union
Select name
from battles
where name like ‘R%’
union
Select ship
from outcomes
where ship like ‘R%’
FROM pc AS pc1, pc AS pc2
WHERE pc1.model>pc2.model AND pc1.speed=pc2.speed AND pc1.ram=pc2.ram;
where speed < (select MIN(speed) from pc)
from( select point, date, SUM(inc) as sum_inc, null as sum_out from Income Group by point, date
Union
select point, date, null as sum_inc, SUM(out) as sum_out from Outcome Group by point, date ) as t
group by point, date order by point
from Income_o group by point) as A left join (select point, sum(out) as o from Outcome_o group by point) as B on A.point=B.point
from Income_o where ‘20010415’ > date group by point) as A left join (select point, sum(out) as o
from Outcome_o where ‘20010415’ > date group by point) as B on A.point=B.point
(SELECT sum(inc) FROM Income_o WHERE date <'2001-04-15')
—
(SELECT sum(out) FROM Outcome_o WHERE date <'2001-04-15')
AS remain Упражнения по SQL
четверг, 16 апреля 2020 г.
Найдите сражения, в которых участвовали корабли класса Kongo из таблицы Ships.
where ship in (select name
from ships
where )Популярные сообщения
Команда SELECT
Команды SQL
Условия в SQL
Функции SQL
Основа SQL
Меню SQL
Ссылки
Примеры
Архив блога
