-- 1

select nazwisko
from bokserzy, kat_wagowe
where waga between min and max and
      not exists (select 'x'
                  from walki
				  where ((bokser1 = bokserzy.id and zwyciezca = 2)or
				         (bokser2 = bokserzy.id and zwyciezca = 1)) and
				        kat_wag = kat_wagowe.id);
						
-- 2

select id, nazwa
from kat_wagowe
minus
select kat_wagowe.id, nazwa
from bokserzy, kat_wagowe
where waga between min and max;
						
-- 3

select a.x*100+b.x*10+c.x
from
  (select 1 x from dual
   union select 2 x from dual
   union select 3 x from dual
   union select 4 x from dual
   union select 5 x from dual
   union select 6 x from dual
   union select 7 x from dual
   union select 8 x from dual
   union select 9 x from dual
   union select 0 x from dual) a,
  (select 1 x from dual
   union select 2 x from dual
   union select 3 x from dual
   union select 4 x from dual
   union select 5 x from dual
   union select 6 x from dual
   union select 7 x from dual
   union select 8 x from dual
   union select 9 x from dual
   union select 0 x from dual) b,
  (select 1 x from dual
   union select 2 x from dual
   union select 3 x from dual
   union select 4 x from dual
   union select 5 x from dual
   union select 6 x from dual
   union select 7 x from dual
   union select 8 x from dual
   union select 9 x from dual
   union select 0 x from dual) c
where a.x*100+b.x*10+c.x <= 500
minus
select waga
from bokserzy; 

-- 4

select kluby.nazwa,
       nvl(sum(decode(kat_wagowe.nazwa, 'piorkowa', 1, 0)),0) piorkowa, 
       nvl(sum(decode(kat_wagowe.nazwa, 'ciezka', 1, 0)),0) ciezka, 
       nvl(sum(decode(kat_wagowe.nazwa, 'super ciezka', 1, 0)),0) superciezka
from kluby, bokserzy, kat_wagowe
where kluby.id = bokserzy.klub and
      bokserzy.waga between min and max 
group by kluby.nazwa
order by 1;

-- 5

select nazwisko, wzrost, nazwa, srednia
from (select avg(bokserzyw.wzrost) srednia, nazwa, min, max 
      from bokserzy bokserzyw, kat_wagowe
	  where bokserzyw.waga between min and max
	  group by kat_wagowe.nazwa, min, max),
     bokserzy
where waga between min and max and
      wzrost > srednia;

-- 6

select max(count(*)) 
from kluby, bokserzy, walki
where bokserzy.klub = kluby.id and
      ((bokserzy.id = bokser1 and zwyciezca = 1) or (bokserzy.id = bokser2 and zwyciezca = 2))
group by kluby.id, bokserzy.id;

-- 7

select klub, max(liczba_zwyciestw)
from (select kluby.id klub, count(*) liczba_zwyciestw
      from kluby, bokserzy, walki
      where bokserzy.klub = kluby.id and
            ((bokserzy.id = bokser1 and zwyciezca = 1) or (bokserzy.id = bokser2 and zwyciezca = 2))
      group by kluby.id, bokserzy.id)
group by klub;

-- 8

select klub, max(liczba_zwyciestw)
from (select kluby.id klub, count(*) liczba_zwyciestw
      from kluby, bokserzy, walki
      where bokserzy.klub = kluby.id (+) and
            ((bokserzy.id = bokser1 and zwyciezca = 1) or (bokserzy.id = bokser2 and zwyciezca = 2))
      group by kluby.id, bokserzy.id)
group by klub;

-- 9

select nazwa
from kluby
where not exists (select 'x'
                  from bokserzy
				  where klub = kluby.id);

select nazwa
from kluby
where 0 = (select count(*)
           from bokserzy
		   where klub = kluby.id);

-- 10

select nazwa
from kluby
where id <> all (select klub
                 from bokserzy);

--dobry przyklad, bo mozna zrozumiec:
---kiedy otrzymujemy null, a kiedy pusty wynik,
---co moze znaczyc ze cos jest rozne od szystkich wartosci w zbiorze zawierajacym null,
---ze po all/some moze byc jedna wartosc, a nawet zbior pusty
---nvl mozna zastosowac dla zbioru wartosc
---w oraclach do 8 null i to_number(null) to co innego, w 9 juz nie trzeba to_number
				 
select nazwa
from kluby
where id <> all (select klub
                 from bokserzy
				 minus
				 select to_number(null)
				 from dual
				 union
				 select id+1
				 from dual);

select nazwa
from kluby
where id <> all nvl((select klub
                     from bokserzy),0);
				 
-- 11

select nazwa
from kluby
minus
select nazwa
from kluby, bokserzy
where klub = kluby.id;

-- 12

select nazwa
from kluby, bokserzy
where klub (+) = kluby.id and
      klub is null;

-- 13

select nazwisko
from bokserzy bokserzyz
where 5 >= (select count(*)
            from bokserzy bokserzyw
			where (bokserzyw.waga > bokserzyz.waga) or
			      (bokserzyw.waga = bokserzyz.waga and bokserzyw.nazwisko > bokserzyz.nazwisko));
	  
-- 14

select nazwisko, wzrost
from bokserzy bokserzyz, (select count(*) x from bokserzy) wszystkich
where trunc((wszystkich.x - 1)/2) = (select count(*)
                                     from bokserzy bokserzyw
								     where bokserzyw.wzrost < bokserzyz.wzrost) and  
      trunc((wszystkich.x - 1)/2) = (select count(*)
                                     from bokserzy bokserzyw
								     where bokserzyw.wzrost > bokserzyz.wzrost);

-- 15

select b1.nazwisko, b1.wzrost
from bokserzy b1, bokserzy b2, bokserzy b3
where b1.wzrost < b2.wzrost and
      b1.wzrost > b3.wzrost
group by b1.nazwisko, b1.id, b1.wzrost
having  count(distinct b2.wzrost) = count(distinct b3.wzrost);
