Вы находитесь на странице: 1из 11

SELECT

1. Найдите номер модели, скорость и размер жесткого диска для всех ПК стоимостью менее
500 дол. Вывести: model, speed и hd

SELECT model, speed, hd


FROM PC
WHERE price<500

2. Найдите номер модели, объем памяти и размеры экранов ПК-блокнотов, цена которых
превышает 1000 дол.

SELECT model, ram, screen


FROM Laptop
WHERE price>1000

3. Найдите все записи таблицы Printer для цветных принтеров.

SELECT * FROM Printer


WHERE color = 'y'

4. Найдите производителей принтеров. Вывести: maker

SELECT maker FROM Product


WHERE type = 'Printer' GROUP BY maker

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, l.speed


FROM laptop l
JOIN product p ON p.model = l.model
WHERE l.hd >= 10

7. Найдите номера моделей и цены всех имеющихся в продаже продуктов (любого типа)
производителя B (латинская буква).

SELECT DISTINCT product.model, pc.price


FROM Product JOIN pc ON product.model = pc.model WHERE maker = 'B'
UNION
SELECT DISTINCT product.model, laptop.price
FROM product JOIN laptop ON product.model=laptop.model WHERE maker='B'
UNION
SELECT DISTINCT product.model, printer.price
FROM product JOIN printer ON product.model=printer.model WHERE maker='B'

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

SELECT DISTINCT maker


FROM product
WHERE type = 'pc'
EXCEPT
SELECT DISTINCT product.maker
FROM product
W type = 'laptop'

9. Найдите производителей ПК с процессором не менее 450 Мгц. Вывести: Maker

SELECT DISTINCT product.maker


FROM pc
INNER JOIN product ON pc.model = product.model
WHERE pc.speed >= 450

10. Найдите модели принтеров, имеющих самую высокую цену. Вывести: model, price

SELECT model, price


FROM printer
WHERE price =
(SELECT MAX(price)
FROM printer )

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

SELECT DISTINCT p1.model, p2.model, p1.speed, p1.ram


FROM pc p1, pc p2
WHERE p1.speed = p2.speed AND p1.ram = p2.ram AND p1.model > p2.model

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

SELECT DISTINCT p.type,p.model,l.speed


FROM laptop l
JOIN product p on l.model=p.model
WHERE l.speed<(select min(speed)
FROM pc)

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

SELECT DISTINCT product.maker, printer.price


FROM product, printer
WHERE product.model = printer.model
AND printer.color = 'y'
AND printer.price = (
SELECT MIN(price) FROM printer
WHERE printer.color = 'y'
)

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

SELECT
product.maker, AVG(screen)
FROM laptop
LEFT JOIN product ON product.model = laptop.model
GROUP BY product.maker

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

SELECT maker, COUNT(model)


FROM product
WHERE type = 'pc'
GROUP BY product.maker
HAVING COUNT (DISTINCT model) >= 3

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

SELECT product.maker, MAX(pc.price)


FROM product, pc
WHERE product.model = pc.model
GROUP BY product.maker

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

SELECT pc.speed, AVG(pc.price)


FROM pc
WHERE pc.speed > 600
GROUP BY pc.speed

18. Найдите производителей, которые производили бы как ПК со скоростью не менее 750


МГц, так и ПК-блокноты со скоростью не менее 750 МГц. Вывести: Maker

SELECT DISTINCT maker


FROM product t1 JOIN pc t2 ON t1.model=t2.model
WHERE speed>=750 AND maker IN
( SELECT maker
FROM product t1 JOIN laptop t2 ON t1.model=t2.model
WHERE speed>=750 )
19. Дима и Миша пользуются продуктами от одного и того же производителя. Тип Таниного
принтера не такой, как у Вити, но признак "цветной или нет" - совпадает. Размер экрана
Диминого ноутбука на 3 дюйма больше Олиного. Мишин ПК в 4 раза дороже Таниного
принтера. Номера моделей Витиного принтера и Олиного ноутбука отличаются только
третьим символом. У Костиного ПК скорость процессора, как у Мишиного ПК; объем
жесткого диска, как у Диминого ноутбука; объем памяти, как у Олиного ноутбука, а цена -
как у Витиного принтера. Вывести все возможные номера моделей Костиного ПК

select distinct k.model


from (select prod.maker, l.hd, l.screen
from product prod
join laptop l on l.model = prod.model) d,
(select prod.maker, pc.speed, pc.price
from product prod
join pc on pc.model = prod.model) m,
(select color, type, price
from printer) t,
(select model, color, type, price
from printer) v,
(select model, ram, screen
from laptop) o,
(select model, speed, ram, hd, price
from pc) k
where d.maker = m.maker
and t.type <> v.type and t.color = v.color
and d.screen = o.screen + 3
and m.price = 4 * t.price
and stuff(v.model, 3, 1, '') = stuff(o.model, 3, 1, '')
and k.speed = m.speed and k.hd = d.hd and k.ram = o.ram and k.price = v.price

20. Для каждого месяца (с учетом года) из таблицы Battles посчитать сколько раз повторяется
каждый день недели в этом месяце. Вывод: месяц (в формате "YYYY-ММ"), количество
понедельников, вторников, ...воскресений.

with tab as (select distinct year(date) yr, month(date) mnth,


datefromparts(year(date), month(date), 1) fst,
dateadd(dd, -1, dateadd(mm, 1, datefromparts(year(date), month(date), 1))) lst
from battles),
cte as (select yr, mnth, fst date
from tab
union all
select a.yr, a.mnth, dateadd(dd, 1, a.date)
from cte a
where date < (select lst from tab t where t.yr = a.yr and t.mnth = a.mnth)),
total as (select t.yr, t.mnth,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 0) Mon,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 1) Tue,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 2) Wed,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 3) Thu,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 4) Fri,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 5) Sat,
(select count(*)
from cte c
where c.yr = t.yr
and c.mnth = t.mnth
and (@@datefirst + datepart(dw, c.date) - 2) % 7 = 6) Sun
from tab t)

select substring(cast(datefromparts(yr, mnth, 1) as varchar), 1, 7) m, Mon, Tue, Wed, Thu, Fri,


Sat, Sun from total

21. Для таблицы Product получить результирующий набор в виде таблицы со столбцами
maker, pc, laptop и printer, в которой для каждого производителя требуется указать,
производит он (yes) или нет (no) соответствующий тип продукции. В первом случае (yes)
указать в скобках без пробела количество имеющихся в наличии (т.е. находящихся в
таблицах PC, Laptop и Printer) различных по номерам моделей соответствующего типа.

select maker,
iif(pc > 0, 'yes(' + cast(pc_cnt as varchar) + ')', 'no') pc,
iif(laptop > 0, 'yes(' + cast(laptop_cnt as varchar) + ')', 'no') laptop,
iif(printer > 0, 'yes(' + cast(printer_cnt as varchar) + ')', 'no') printer
from (
select tab.maker,
tab.pc,
(select count(distinct pc.model)
from product pr
join pc on pc.model = pr.model
where pr.maker = tab.maker) pc_cnt,
tab.laptop,
(select count(distinct l.model)
from product pr
join laptop l on l.model = pr.model
where pr.maker = tab.maker) laptop_cnt,
tab.printer,
(select count(distinct p.model)
from product pr
join printer p on p.model = pr.model
where pr.maker = tab.maker) printer_cnt
from (
select distinct prod.maker,
(select count(*)
from product pr
where pr.maker = prod.maker and pr.type = 'pc') pc,
(select count(*)
from product pr
where pr.maker = prod.maker and pr.type = 'laptop') laptop,
(select count(*)
from product pr
where pr.maker = prod.maker and pr.type = 'printer') printer
from product prod) tab) tab

22. Посчитать сумму цифр в номере каждой модели из таблицы Product Вывод: номер
модели, сумма цифр

select model, iif(p1 like '%[0-9]%', cast(p1 as integer), 0)


+ iif(p2 like '%[0-9]%', cast(p2 as integer), 0)
+ iif(p3 like '%[0-9]%', cast(p3 as integer), 0)
+ iif(p4 like '%[0-9]%', cast(p4 as integer), 0)
+ iif(p5 like '%[0-9]%', cast(p5 as integer), 0)
+ iif(p6 like '%[0-9]%', cast(p6 as integer), 0)
+ iif(p7 like '%[0-9]%', cast(p7 as integer), 0)
+ iif(p8 like '%[0-9]%', cast(p8 as integer), 0)
+ iif(p9 like '%[0-9]%', cast(p9 as integer), 0)
+ iif(p10 like '%[0-9]%', cast(p10 as integer), 0)
+ iif(p11 like '%[0-9]%', cast(p11 as integer), 0)
+ iif(p12 like '%[0-9]%', cast(p12 as integer), 0)
+ iif(p13 like '%[0-9]%', cast(p13 as integer), 0)
+ iif(p14 like '%[0-9]%', cast(p14 as integer), 0)
+ iif(p15 like '%[0-9]%', cast(p15 as integer), 0)
+ iif(p16 like '%[0-9]%', cast(p16 as integer), 0)
+ iif(p17 like '%[0-9]%', cast(p17 as integer), 0)
+ iif(p18 like '%[0-9]%', cast(p18 as integer), 0)
+ iif(p19 like '%[0-9]%', cast(p19 as integer), 0)
+ iif(p20 like '%[0-9]%', cast(p20 as integer), 0)
+ iif(p21 like '%[0-9]%', cast(p21 as integer), 0)
+ iif(p22 like '%[0-9]%', cast(p22 as integer), 0)
+ iif(p23 like '%[0-9]%', cast(p23 as integer), 0)
+ iif(p24 like '%[0-9]%', cast(p24 as integer), 0)
+ iif(p25 like '%[0-9]%', cast(p25 as integer), 0)
+ iif(p26 like '%[0-9]%', cast(p26 as integer), 0)
+ iif(p27 like '%[0-9]%', cast(p27 as integer), 0)
+ iif(p28 like '%[0-9]%', cast(p28 as integer), 0)
+ iif(p29 like '%[0-9]%', cast(p29 as integer), 0)
+ iif(p30 like '%[0-9]%', cast(p30 as integer), 0)
+ iif(p31 like '%[0-9]%', cast(p31 as integer), 0)
+ iif(p32 like '%[0-9]%', cast(p32 as integer), 0)
+ iif(p33 like '%[0-9]%', cast(p33 as integer), 0)
+ iif(p34 like '%[0-9]%', cast(p34 as integer), 0)
+ iif(p35 like '%[0-9]%', cast(p35 as integer), 0)
+ iif(p36 like '%[0-9]%', cast(p36 as integer), 0)
+ iif(p37 like '%[0-9]%', cast(p37 as integer), 0)
+ iif(p38 like '%[0-9]%', cast(p38 as integer), 0)
+ iif(p39 like '%[0-9]%', cast(p39 as integer), 0)
+ iif(p40 like '%[0-9]%', cast(p40 as integer), 0)
+ iif(p41 like '%[0-9]%', cast(p41 as integer), 0)
+ iif(p42 like '%[0-9]%', cast(p42 as integer), 0)
+ iif(p43 like '%[0-9]%', cast(p43 as integer), 0)
+ iif(p44 like '%[0-9]%', cast(p44 as integer), 0)
+ iif(p45 like '%[0-9]%', cast(p45 as integer), 0)
+ iif(p46 like '%[0-9]%', cast(p46 as integer), 0)
+ iif(p47 like '%[0-9]%', cast(p47 as integer), 0)
+ iif(p48 like '%[0-9]%', cast(p48 as integer), 0)
+ iif(p49 like '%[0-9]%', cast(p49 as integer), 0)
+ iif(p50 like '%[0-9]%', cast(p50 as integer), 0)
from (
select model,
substring(model, 1, 1) p1,
substring(model, 2, 1) p2,
substring(model, 3, 1) p3,
substring(model, 4, 1) p4,
substring(model, 5, 1) p5,
substring(model, 6, 1) p6,
substring(model, 7, 1) p7,
substring(model, 8, 1) p8,
substring(model, 9, 1) p9,
substring(model, 10, 1) p10,
substring(model, 11, 1) p11,
substring(model, 12, 1) p12,
substring(model, 13, 1) p13,
substring(model, 14, 1) p14,
substring(model, 15, 1) p15,
substring(model, 16, 1) p16,
substring(model, 17, 1) p17,
substring(model, 18, 1) p18,
substring(model, 19, 1) p19,
substring(model, 20, 1) p20,
substring(model, 21, 1) p21,
substring(model, 22, 1) p22,
substring(model, 23, 1) p23,
substring(model, 24, 1) p24,
substring(model, 25, 1) p25,
substring(model, 26, 1) p26,
substring(model, 27, 1) p27,
substring(model, 28, 1) p28,
substring(model, 29, 1) p29,
substring(model, 30, 1) p30,
substring(model, 31, 1) p31,
substring(model, 32, 1) p32,
substring(model, 33, 1) p33,
substring(model, 34, 1) p34,
substring(model, 35, 1) p35,
substring(model, 36, 1) p36,
substring(model, 37, 1) p37,
substring(model, 38, 1) p38,
substring(model, 39, 1) p39,
substring(model, 40, 1) p40,
substring(model, 41, 1) p41,
substring(model, 42, 1) p42,
substring(model, 43, 1) p43,
substring(model, 44, 1) p44,
substring(model, 45, 1) p45,
substring(model, 46, 1) p46,
substring(model, 47, 1) p47,
substring(model, 48, 1) p48,
substring(model, 49, 1) p49,
substring(model, 50, 1) p50
from product) tab

23. Вывести все записи из Outcome и Income, даты которых отстоят не менее чем на 2
календарных месяца от максимальной даты в обеих таблицах (т.е. при максимальной дате
2009-12-05 последняя выводимая дата должна быть меньше 2009-10-01). Выполнить
помесячное разбиение этих записей, присвоив порядковый номер каждому месяцу (с
учётом года), попавшему в выборку. Вывод: порядковый номер месяца, первый день
месяца в формате "yyyy-mm-dd", последний день месяца в формате "yyyy-mm-dd", код
записи, пункт, дата, сумма (для таблицы Outcome должна быть отрицательной)

with tab as (select code, point, date, inc summa


from income
union all
select code, point, date, -out
from outcome)

select dense_rank() over(order by datediff(mm, 0, date)) num,


replace(convert(varchar, dateadd(month, datediff(month, 0, date), 0), 102), '.', '-') startDate,
replace(convert(varchar, dateadd(dd, -1, dateadd(month, datediff(month, 0, date) + 1, 0)),
102), '.', '-') endDate,
code, point, date, summa
from tab
where date < dateadd(month, datediff(month, 0, (select max(date) from tab)) - 2, 0)

24. Пронумеровать строки из таблицы Product в следующем порядке: имя производителя в


порядке убывания числа производимых им моделей (при одинаковом числе моделей имя
производителя в алфавитном порядке по возрастанию), номер модели (по возрастанию).
Вывод: номер в соответствии с заданным порядком, имя производителя (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

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

select name from Ships


where name LIKE 'R%'
UNION
SELECT Ship From Outcomes
where Ship LIKE 'R%'

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


спуска кораблей на воду.

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

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


они были потоплены.

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

28. Найдите класс, имя и страну для кораблей из таблицы Ships, имеющих не менее 10
орудий.

Select Classes.class, Ships.name, Classes.country


from Ships inner join Classes
on Ships.class = Classes.class
where Classes.numGuns > = 10

29. Найдите страны, имевшие когда-либо классы обычных боевых кораблей ('bb') и имевшие
когда-либо классы крейсеров ('bc').

SELECT country
FROM classes
GROUP BY country
HAVING COUNT(DISTINCT type) = 2

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

select distinct battle from outcomes


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

DML
31. Добавить в таблицу PC следующую модель:
code: 20
model: 2111
speed: 950
ram: 512
hd: 60
cd: 52x
price: 1100

INSERT INTO pc (code, model, speed, ram, hd,cd,price)


VALUES(20,2111,950,512,60, '52x', 1100)

32. Добавить в таблицу Product следующие продукты производителя Z: принтер модели 4003,
ПК модели 4001 и блокнот модели 4002

INSERT INTO product (maker, type, model) VALUES


('Z', 'Printer', 4003), ('Z', 'PC', 4001), ('Z', 'Laptop', 4002)

33. Добавить в таблицу PC модель 4444 с кодом 22, имеющую скорость процессора 1200 и
цену 1350.

INSERT INTO pc (model, code, speed, price) VALUES


(4444,22,1200,1350)

34. Для каждой группы блокнотов с одинаковым номером модели добавить запись в таблицу
PC со следующими характеристиками: код: минимальный код блокнота в группе +20;
модель: номер модели блокнота +1000; скорость: максимальная скорость блокнота в
группе; ram: максимальный объем ram блокнота в группе *2; hd: максимальный объем hd
блокнота в группе *2; cd: значение по умолчанию; цена: максимальная цена блокнота в
группе, уменьшенная в 1,5 раза. Замечание. Считать номер модели числом.

INSERT INTO pc ( code, model, speed, ram, hd, price )


SELECT min ( code ) + 20,
model + 1000,
max ( speed ),
max ( ram ) * 2,
max ( hd ) * 2,
max ( price ) / 1.5
from laptop GROUP BY model

35. Удалить из таблицы PC компьютеры, имеющие минимальный объем диска или памяти.

DELETE FROM PC WHERE


pc.ram=(select MIN(ram) from pc) or
pc.hd=(select MIN(hd) from pc)