Oracle dzien2



select * 
from zawodnicy , trenerzy
where zawodnicy.id_trenera = trenerzy.id_trenera

select * 
from zawodnicy z, trenerzy t
where z.id_trenera = t.id_trenera


select * from zawodnicy

select * from trenerzy


select *
from zawodnicy z join trenerzy t on z.id_trenera = t.id_trenera


select *
from zawodnicy z left join trenerzy t on z.id_trenera = t.id_trenera


select *
from zawodnicy z right join trenerzy t on z.id_trenera = t.id_trenera


select z.imie, t.imie_t, z.kraj
from trenerzy t left join  zawodnicy z on z.id_trenera = t.id_trenera


select *
from zawodnicy z full join trenerzy t on z.id_trenera = t.id_trenera


select *
from zawodnicy z cross join trenerzy t 


select *
from zawodnicy z join trenerzy t using (id_trenera)


select *
from zawodnicy z natural join trenerzy t 



select * 
from zawodnicy , trenerzy
where zawodnicy.id_trenera(+) = trenerzy.id_trenera

select * 
from zawodnicy , trenerzy
where zawodnicy.id_trenera = trenerzy.id_trenera(+)


 
 --cw 1 
 
 select z.imie, z.nazwisko, t.imie_t, t.nazwisko_t
 from zawodnicy z join trenerzy t on z.kraj = t.kraj


-- cw 2 

select  z.id_zawodow , s.nazwa, m.nazwa_miasta, za.imie
from zawody z join skocznie s on z.id_skoczni = s.id_skoczni
              join miasta m on m.id_miasta = s.id_miasta
              join zawodnicy za on za.kraj = s.kraj_s
                 
                 
-- Trenerzy trenuja zawodnikow, zawodnicy uczestnicza w zawodach, zawody odbywaja sie na pewnych skoczniach, a skocznie znajduja sie w miastach 

select distinct t.imie_t || ' ' || t.nazwisko_t, m.nazwa_miasta
from trenerzy t join zawodnicy z on z.id_trenera=t.id_trenera
                join uczestnictwa u on u.id_zawodnika = z.id_zawodnika 
                join zawody zw on zw.id_zawodow = u.id_zawodow 
                join skocznie s on s.id_skoczni = zw.id_skoczni
                join miasta m on m.id_miasta = s.id_miasta
                
 -- 3 rodzaje relacji 
 --1) relacja 1 do *  
 --2) relacja * do *
 --3) relacja 1 do 10
 
 -- c4
 select z1.imie || ' ' || z1.nazwisko, z2.imie || ' ' || z2.nazwisko
 from zawodnicy z1 join zawodnicy z2 on z1.kraj = z2.kraj
 where z1.nazwisko = 'MA£YSZ' and z1.nazwisko <> z2.nazwisko
 
 --cw 5
 select z1.imie || ' ' || z1.nazwisko, z2.imie || ' ' || z2.nazwisko
 from zawodnicy z1 join zawodnicy z2 on z1.id_zawodnika > z2.id_zawodnika
 
 -- cw6 
 
  select z1.imie || ' ' || z1.nazwisko, z2.imie || ' ' || z2.nazwisko, z1.wzrost, z2.wzrost
 from zawodnicy z1 join zawodnicy z2 on z1.kraj = z2.kraj
 where z1.wzrost > z2.wzrost
 
 -- cw7 
 
 select *
 from zawodnicy
 where id_trenera is null
 
 -- cw8 
 
 select distinct t.*
 from zawodnicy z join trenerzy t on z.id_trenera = t.id_trenera
 where z.id_trenera is not null  
 
 
 select z1.imie, z2.imie
 from zawodnicy z1 join zawodnicy z2 on substr(z1.imie,1,1) = substr(z2.imie,1,1) and z1.id_zawodnika <> z2.id_zawodnika
 
 -- wypisz pary zawodnioww i trenerow , urodzonych tego samego dnia tygodnia 
 
 
 select z.nazwisko, t.nazwisko_t, to_char(z.data_ur, 'Day')
 from zawodnicy z join trenerzy t on to_char(z.data_ur, 'Day') = to_char(t.data_ur_t,'Day')
 
 -- wypisz trenerow, ktorzy sa starsi o przynajmniej 5 lat od zawodnikow 
 
 
 select * from zawodnicy natural join trenerzy 
 
 select z.nazwisko, t.nazwisko_t, z.data_ur, t.data_ur_t
 from zawodnicy z join trenerzy t on z.id_trenera = t.id_trenera and add_months(z.data_ur,-60) > t.data_ur_t  

 select z.nazwisko, t.nazwisko_t, z.data_ur, t.data_ur_t
 from zawodnicy z join trenerzy t on z.id_trenera = t.id_trenera and add_months(z.data_ur,60) > t.data_ur_t    
 
 
 
 select z.imie, z.nazwisko from 
     (select imie, nazwisko, kraj
     from zawodnicy ) z
 
 select imie, nazwisko, bmi
     from
     (select imie, nazwisko, waga/power(wzrost/100,2) bmi
     from zawodnicy ) t
 where bmi > 20

              
select nazwisko, count(nazwa) ile from 
    (select z.nazwisko, s.nazwa
    from zawodnicy z join uczestnictwa u on z.id_zawodnika  = u.id_zawodnika
                     join zawody zw on zw.id_zawodow = u.id_zawodow 
                     join skocznie s on s.id_skoczni = zw.id_skoczni) k
group by nazwisko
order by ile desc


-- 1) podzapytanie w sekcji from 
-- 2) w sekcji select 
-- 3) w sekcji where 


select imie, nazwisko, (select avg(wzrost) from zawodnicy where kraj =z.kraj )
from zawodnicy z


select imie, nazwisko, wzrost
from zawodnicy 
where wzrost > (select avg(wzrost) from zawodnicy)


-- cw 1 

select * from zawodnicy 
where wzrost = (select max(wzrost) from zawodnicy)

-- cw2 

select * from zawodnicy 
where  waga= (select waga from zawodnicy where nazwisko = 'ALBORN')

select * from zawodnicy 
where  waga in (select waga from zawodnicy where kraj = 'POL')

select * from zawodnicy 
where  waga > all (select waga from zawodnicy where kraj = 'POL')


select id_zawodow, 
    (select (select nazwa_miasta from miasta where id_miasta = s.id_miasta) 
    from skocznie s where id_skoczni = z.id_skoczni) k
from zawody  z

select id_zawodow, m.nazwa_miasta
from zawody z join skocznie s on z.id_skoczni = s.id_skoczni
              join miasta m on m.id_miasta = s.id_miasta
             
-- cw 6 

select kraj, sum( case when wzrost >180 then 1 else 0 end )
from zawodnicy 
group by kraj


select tabA.kraj, nvl(tabB.ile,0)  from 
    (select kraj
    from zawodnicy 
    group by kraj) tabA
left join 
    (select kraj, count(*) ile
    from zawodnicy 
    where wzrost > 180
    group by kraj) tabB
on tabA.kraj = tabB.kraj

select kraj , (select count(*) from zawodnicy where kraj = z.kraj and wzrost >180)
from zawodnicy z
group by kraj


-- zadania 

-- 1) wypisz nazwiska trenerow, ktorzy trenuja przynjamniej 2 zawodnikow, ktorych wzrost wynosi ponizej 175 

select t.nazwisko_t, count(*)
from trenerzy t join zawodnicy z on z.id_trenera = t.id_trenera
where wzrost < 175
group by t.nazwisko_t
having count(*)>1

-- 2) wypisz zawodnikow, ktorzy startowali rzadziej niz srednia startow w ich druzynie 


-- potrzebujemy 1) liczba startow dla kazdego zawodnika 2) dla kazdego kraju policzyc srednia liczba startow 


select z.nazwisko, z.kraj, count(u.id_uczestnictwa) ileStartow
from zawodnicy z join uczestnictwa u on z.id_zawodnika = u.id_zawodnika 
group by z.id_zawodnika,z.nazwisko, z.kraj

-- zeby policzyc srednia musimy znac sume startow / ile zawodnikow w kraju 

select tabSumaStartow.kraj, tabSumaStartow.sumaStartow/ tabLiczbaZawodnikow.ile sredniaLiczbaStartow
from
    (select z.kraj, count(u.id_uczestnictwa) sumaStartow
    from zawodnicy z join uczestnictwa u on z.id_zawodnika = u.id_zawodnika 
    group by kraj) tabSumaStartow
join
    (select kraj, count(id_zawodnika)  ile
    from zawodnicy 
    group by kraj) tabLiczbaZawodnikow
on tabSumaStartow.kraj = tabLiczbaZawodnikow.kraj

-- ostateczne rozwiazanie 
select tabZawodnicy.nazwisko, tabZawodnicy.ileStartow, tabSrednieStarty.sredniaLiczbaStartow
from
    (select z.nazwisko, z.kraj, count(u.id_uczestnictwa) ileStartow
    from zawodnicy z join uczestnictwa u on z.id_zawodnika = u.id_zawodnika 
    group by z.id_zawodnika,z.nazwisko, z.kraj) tabZawodnicy
join
    (select tabSumaStartow.kraj, tabSumaStartow.sumaStartow/ tabLiczbaZawodnikow.ile sredniaLiczbaStartow
    from
        (select z.kraj, count(u.id_uczestnictwa) sumaStartow
        from zawodnicy z join uczestnictwa u on z.id_zawodnika = u.id_zawodnika 
        group by kraj) tabSumaStartow
    join
        (select kraj, count(id_zawodnika)  ile
        from zawodnicy 
        group by kraj) tabLiczbaZawodnikow
    on tabSumaStartow.kraj = tabLiczbaZawodnikow.kraj) tabSrednieStarty
on tabZawodnicy.kraj = tabSrednieStarty.kraj
where  tabZawodnicy.ileStartow> tabSrednieStarty.sredniaLiczbaStartow

-- 3) Podaj ilu zawodnikow urodzilo sie w kazdej z pór roku (zima to 12,1,2) 
select poraRoku, count(*)
from
    (select z.nazwisko, 
    case
        when nrMsc in (12,1,2) then 'zima'
        when nrMsc between 3 and 5 then 'wisona'
        when nrMsc < 9 then 'lato'
        else 'jesien'
    end poraRoku
    from 
        (select nazwisko,  extract(month from data_ur) nrMsc
        from zawodnicy) z) k
group by poraRoku









select count(*) from zawody

select * from miasta