select * from trenerzy select * from zawodnicy order by kraj asc, waga desc, nazwisko select imie, kraj, waga from zawodnicy order by 2,3 -- niepoprawna technika select imie, kraj, waga , left(imie,1) from zawodnicy order by kraj,waga , left(imie,1) -- str 10 , cw 7-12 select * from zawodnicy order by kraj select * from zawodnicy order by data_ur desc select imie + ' ' + nazwisko + ' (' + kraj + ')' from zawodnicy order by nazwisko SELECT * from trenerzy order by data_ur_t desc select * from zawodnicy order by waga / POWER(wzrost/100.0,2) -- wypisz zawodnikow w kolejnosci pory roku w jakiej się urodzi a w obrębie danej pory -- roku posortuj wg liczby złożonej z ostatniej cyfry wzrostu i id_zawodnika select *, right(wzrost,1)+ convert(varchar,id_zawodnika) from zawodnicy order by case when MONTH(data_ur) >=3 and MONTH(data_ur)<=5 then 1 when MONTH(data_ur) between 6 and 8 then 2 when MONTH(data_ur) in (9,10,11) then 3 else 4 end, convert(int, right(wzrost,1)+ convert(varchar,id_zawodnika)) --filtorwanie danych select from where -- tworzymy 1 (ewentualnie złożony) warunek order by go select *, iif(kraj='pol','polska','inny') from zawodnicy where kraj = 'pol' or kraj='ger' select *,iif(kraj='pol',1,0) from zawodnicy where left(kraj,1) = 'a' and ( and or ) -- str 11 cw 13-20 select * from zawodnicy where kraj in ('ger' ,'aut') select * from zawodnicy where waga/POWER(wzrost/100.0,2) <20 select * from zawodnicy where DATEDIFF(yy,data_ur,getdate()) < 35 select * from zawodnicy where len(imie) = 4 select * from trenerzy where data_ur_t is null select * from zawodnicy where month(data_ur) in (1,2,3,11,12) select * from zawodnicy where month(data_ur) not between 4 and 10 select * from zawodnicy where CHARINDEX('n',nazwisko)>0 or CHARINDEX('w',nazwisko)>0 -- dodatkowe: --1) wypisz tylko tych zawodników, którzy jescze nie mieli w tym roku urodzin -- i posortuj w kolejności obchodzenia urodzin select * from zawodnicy where GETDATE() < DATEFROMPARTS(year(getdate()),month(data_ur),day(data_ur)) order by month(data_ur), day(data_ur) --2) wypisz tych zawodnikow, ktorzy mają pierwszą i ostatnią literę nazwiska taką samą select * from zawodnicy where left(nazwisko,1) = right(nazwisko,1) ------------------ -- grupowanie danych -- -- agragacja danych -- select len(imie) from zawodnicy select * from zawodnicy select sum(waga), count(waga), count(imie), count(id_trenera), count(*) from zawodnicy select len(imie), sum(waga) from zawodnicy /* select | from | where | group by | order by */ select kraj, waga, count(*), sum(wzrost) from zawodnicy group by kraj, waga /* jeżeli grupuję po kolumnie {A,B..D} to mogę te kolumny wyświetlić w SELECT jeżeli chcę wyświetlić kolumny {E,F,..G} to muszę je zagregować */ -- str 20 cw 37-41 select kraj, count(*) from zawodnicy group by kraj select kraj, max(wzrost) from zawodnicy group by kraj select kraj, count(wzrost) from zawodnicy where wzrost>180 group by kraj select kraj, avg(wzrost) from zawodnicy group by kraj order by avg(wzrost) --41 select kraj , count(iif(wzrost>180,1,null)) wysc, sum(iif(wzrost<175,1,0)) niscy from zawodnicy group by kraj -- dodatkowe: --1) pogrupuj zawdoników po pierwszej literce imienia i wyświetl ilu ich jest select left(imie,1), count(imie) from zawodnicy group by left(imie,1) --2) podaj ilu zawodników urodziło się w poszczególnych dniach --tygodnia( pon, wt... niedz) -- posortuj malejąco select DATEPART(dw,data_ur) , count(*) from zawodnicy group by DATEPART(dw,data_ur)--format(data_ur,'dddd') select format(data_ur,'dddd') , DATEPART(dw,data_ur) from zawodnicy -- wypisz dla kazdego kraju srednia wzrostu select kraj, avg(wzrost) from zawodnicy where wzrost > 171 group by kraj select kraj, avg(wzrost) from zawodnicy group by kraj having avg(wzrost)>171 --str 20 cw 43 select kraj , count(*) from zawodnicy where wzrost >=180 group by kraj having count(*)>1 -- podzapytania -- select imie, nazwisko from (select imie, nazwisko, wzrost from (select imie, nazwisko ,wzrost, waga+1 q from zawodnicy) t) w /* 1) podzapytanie musi mieć nawiasy i alias 2) każda kolumna w podzapytaniu musi być jakkolwiek nazwana 3) możemy odwołać się tylko do kolumn, które zostały zdefiniowane w podzapytaniu */ select imie, nazwisko , waga/POWER(wzrost/100.0,2) bmi from zawodnicy where waga/POWER(wzrost/100.0,2)>=20 -- a gdybyśmy chcieli to samo zrobić z użyciem podzapytania ? -- bez definiowania drugi raz bmi? select * from (select imie, nazwisko , waga/POWER(wzrost/100.0,2) bmi from zawodnicy) t where bmi >=20 /* podzapytania mogą być w: 1) from - musimy definiować alias 2) select - nie musimy definiować aliasu 3) where - nie musimy definiować aliasu */ select imie , nazwisko , (select wzrost from zawodnicy where wzrost > 182) from zawodnicy select imie , nazwisko , (select imie_t from trenerzy t where t.id_trenera=z.id_trenera ) from zawodnicy z -- str 28 , cw 51-53 -- 1) WYPISZ zawodnikow, ktroych waga jest wieksza od sredniej wagi wszystkich -- zawodnikow select * from zawodnicy where waga > (select AVG(waga) from zawodnicy) -- 2) wypisz zawodnikow, ktorych waga jest wieksza od sredniej wagi zawodnikow -- z kraju zawodnika select * from zawodnicy z where waga > (select AVG(waga) from zawodnicy where kraj = z.kraj) -- 3) podaj imię i nazwisko najwyzszego zawodnika select imie, nazwisko, wzrost from zawodnicy where wzrost = (select MAX(wzrost) from zawodnicy) -- dodatkowe : --1) sprawdź w ilu zawodach uczestniczył każdy zawodnik select imie, nazwisko, (select COUNT(*) from uczestnictwa u where z.id_zawodnika = u.id_zawodnika) from zawodnicy z --2) wypisz zawodników, których wzrost jest drugi co do wielkości -- odp: Michael UHRMANN i Janne AHONEN -- najpierw znajdzmy wzrost najwiekszy -- potem znajdzmy wszystkie wzrosty mneijsze od tego wzrostu wczesniej znalezionego -- i z tych wzrostow znajdzmy najwyzszy -- ostatecznie znajdz zawodnika, ktorego wzrost jest rowny temu znalezionemu wzrostowi select imie, nazwisko from zawodnicy where wzrost = (select max(wzrost) from zawodnicy where wzrost < (select MAX(wzrost) from zawodnicy)) -------------- -- złączenia - join -- select imie, imie_t, id_zawodnika, z.id_trenera, t.id_trenera from zawodnicy z , trenerzy t where z.id_trenera = t.id_trenera -- to jest złączenie: inner join select z.imie, z.nazwisko, z.kraj, t.imie_t, t.nazwisko_t from zawodnicy z join trenerzy t on z.id_trenera=t.id_trenera select z.imie, z.nazwisko, z.kraj, t.imie_t, t.nazwisko_t from zawodnicy z left join trenerzy t on z.id_trenera=t.id_trenera -- left join [inna tabela] [alias] on [warunek zlaczenia] select z.imie, s.nazwa_skoczni from zawodnicy z right join skocznie s on left(z.kraj,1) = left(s.kraj_skoczni,1) select * from skocznie select * from zawody -- str 26 select * from zawodnicy where id_trenera is null select t.* from zawodnicy z right join trenerzy t on t.id_trenera = z.id_trenera where z.id_trenera is null 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 -- http://tomaszles.pl/2018/04/19/diagram-bazy/ /* 1) dla kazdego trenera wypisz ile razy odwiedzil dane miasto w czasie zawodow */ select nazwa , nazwa_miasta, COUNT(*) from ( select t.imie_t + ' ' + t.nazwisko_t nazwa, m.nazwa_miasta from trenerzy t left join zawodnicy z on z.id_trenera = t.id_trenera left join uczestnictwa u on z.id_zawodnika = u.id_zawodnika left join zawody zw on zw.id_zawodow = u.id_zawodow left join skocznie s on s.id_skoczni= zw.id_skoczni left join miasta m on m.id_miasta= s.id_miasta ) tab group by nazwa, nazwa_miasta /*2) wypisz zawodnikow i trenerow ktorzy urodzili się w tym samym dniu tygodnia*/ select z.imie , z.nazwisko, t.imie_t, t.nazwisko_t, FORMAT(z.data_ur,'dddd','pl-pl') from zawodnicy z join trenerzy t on DATEPART(dw,z.data_ur) = DATEPART(dw,t.data_ur_t) /* 3) wypisz WSZYSTKIE dni tygodnia (od pon do niedz) i napisz ilu zawodnikow się urodziło danego dnia*/ select d.n, COUNT( z.nazwisko) from (select FORMAT(DATEFROMPARTS(2000,1, id_zawodnika+2),'dddd') n,id_zawodnika from zawodnicy where id_zawodnika < 8) d left join zawodnicy z on d.n = FORMAT(z.data_ur,'dddd') group by d.n,d.id_zawodnika order by d.id_zawodnika /*4) stwórz tabliczkę mnożenia od 1 do 100, każdy wiersz to jedno równanie 1x1=1; 1x2=2...... 9x9=81 ...10x10=100 */ select format(z1.id_zawodnika,'00') + ' x '+ format(z2.id_zawodnika,'00') + ' = ' + format(z1.id_zawodnika* z2.id_zawodnika ,'00') from zawodnicy z1, zawodnicy z2 where z1.id_zawodnika < 11 and z2.id_zawodnika < 11 /*5) wypisz ternerów i zawodników którzy mają taką samą długość imienia */ select z.imie, t.imie_t from zawodnicy z join trenerzy t on len(z.imie) = len(t.imie_t /* 6) wypisz ilu zawodników skakało na danej skoczni -- wypisz tylko te skocznie gdzie skakało więcej niż -- 2 zawodników, posortuj wg. liczby zawodników */ select s.nazwa_skoczni, COUNT(z.id_zawodnika) from skocznie s left join zawody zaw on s.id_skoczni = zaw.id_skoczni left join uczestnictwa u on u.id_zawodow = zaw.id_zawodow left join zawodnicy z on z.id_zawodnika= u.id_zawodnika group by s.nazwa_skoczni having COUNT(z.id_zawodnika)>2 /*7) dla kazdego miasta wypisz kiedy odbyły się pierwsze zawody , jeżeli nie odbyły się nigdy napisz: brak danych */ go select nazwa_miasta, iif(suma is null,'bd',format(suma,'dd/MM/yyyy')) from (select m.nazwa_miasta, MIN( z.data) suma from miasta m left join skocznie s on m.id_miasta= s.id_miasta left join zawody z on z.id_skoczni = s.id_skoczni group by m.nazwa_miasta) tt /* select from join where group by order by */