# Harjoitukset

Tehtävä:
Hae osastojen tunnukset ja nimet lajiteltuna osaston nimen mukaan.

Vastaus:
SELECT ostun, osnimi
FROM osasto
ORDER BY osnimi;


Tehtävä:
Missä eri sijaintipaikoissa on projekteja (hae PROJEKTI-taulusta)?

Vastaus:
SELECT DISTINCT sijainti
FROM projekti;

(Huom. Jos käytät Accessia, DISTINCTROW muutettava DISTINCT sanaksi SQL-näkymässä tai kyselyn rakennenäytön tyhjällä alueella hiiren oikealla näppäimellä
saatavasta pikavalikosta ominaisuudet ja sieltä YKSILÖLLISET ARVOT = Kyllä)


Tehtävä:
Hae henkilöiden nimet, kunta ja palkka; palkkasarakkeen otsikoksi kkpalkka.

Vastaus:
SELECT enimi, snimi, kunta, palkka AS kkpalkka
FROM henkilo;


Tehtävä:
Lajittele edellinen tehtävä kunnan ja sukunimen mukaan.

Vastaus:
SELECT enimi, snimi, kunta, palkka AS kkpalkka
FROM henkilo
ORDER BY kunta, snimi;


Tehtävä:
Hae henkilöt (nimi ja tutkinto), joiden tutkinto on 'Yo'.

Vastaus:
SELECT snimi, enimi, tutkinto
FROM henkilo
WHERE tutkinto = 'Yo';


Tehtävä:
Keillä henkilöillä on pienempi palkka kuin 2960.
Hae sukunimi ja palkka.

Vastaus:
SELECT enimi, snimi, palkka
FROM henkilo
WHERE palkka < 2960;


Tehtävä:
Ota mukaan myös ne, joiden palkka on 2960. Lajittele palkan mukaan laskevasti.

Vastaus:
SELECT enimi, snimi, palkka
FROM henkilo
WHERE palkka <= 2960
ORDER BY palkka DESC;


Tehtävä:
Hae osaston 3 henkilöistä (nimi, kunta, osasto) ne, jotka ovat Turusta. Lajittele ensisijaisesti sukunimen mukaan ja toissijaisesti etunimen mukaan.

Vastaus:
SELECT enimi, snimi, kunta, ostun
FROM henkilo
WHERE ostun = 3
AND kunta = 'TURKU'
ORDER BY snimi, enimi;


Tehtävä:
Hae turkulaiset ja ne, joiden palkka on 2800.
Htun, nimi, kunta ja palkka.

Vastaus:
SELECT htun, snimi, enimi, kunta, palkka
FROM henkilo
WHERE kunta = 'TURKU'
OR palkka = 2800;


Tehtävä:
Hae ne henkilöt, joiden palkka ei ole 2800.

Vastaus:
SELECT * 
FROM henkilo
WHERE palkka <> 2800;


Tehtävä:
Hae osaston 3 henkilöistä (nimi, kunta, osasto ja veropros.) ne, jotka ovat tamperelaisia tai joiden veroprosentti on 22.

Vastaus:
SELECT snimi, enimi, kunta, ostun, veropros
FROM henkilo
WHERE ostun = 3
AND (kunta = 'TAMPERE' OR veropros = 22);


Tehtävä:
Hae ne henkilöt, joilla on tutkinto Yo tai FK ja joiden palkka on 3100 tai 2800.

Vastaus:
SELECT snimi, enimi, tutkinto, palkka
FROM henkilo
WHERE (tutkinto = 'Yo' OR tutkinto = 'FK') 
AND (palkka = 3100 OR palkka = 2800);


Tehtävä:
Hae henkilöt, joiden kunta alkaa T -kirjaimella.

Vastaus:
SELECT htun, snimi, enimi, kunta
FROM henkilo
WHERE kunta like 'T*';

Huom. Access ei hyväksy %-jokerimerkkiä vaan *-merkin. Muissa ympäristöissä käsky olisi:
SELECT *
FROM henkilo
WHERE kunta LIKE 'T%';


Tehtävä:
Hae projektit, joiden nimessä esiintyy merkkijono 'RA'.

Vastaus:
SELECT * 
FROM projekti
WHERE pnimi LIKE '*RA*';

Huom. Access ei hyväksy %-jokerimerkkiä vaan *-merkin. Muissa ympäristöissä käsky olisi:
SELECT *
FROM projekti
WHERE pnimi LIKE '%RA%';


Tehtävä:
Hae henkilöt, joiden sukunimen TOINEN kirjain EI ole e.

Vastaus:
SELECT *
FROM henkilo
WHERE snimi NOT LIKE '?e*';

Huom. Access ei hyväksy %-jokerimerkkiä vaan *-merkin eikä _-jokerimerkkiä vaan ?-merkin. Muissa ympäristöissä käsky olisi:
SELECT *
FROM henkilo
WHERE snimi NOT LIKE '_e%';


Tehtävä:
Hae henkilöt, joiden veroprosentti on välillä 22 ja 31. Lajittele veroprosentin mukaan. (Käytä BETWEEN-määrettä).

Vastaus:
SELECT htun, snimi, enimi, veropros
FROM henkilo
WHERE veropros BETWEEN 22 AND 31
ORDER BY veropros;


Tehtävä:
Hae henkilöt (htun, nimi, veropros), joiden veroprosentti on 31 tai 24,5 tai 37 (käytä IN-määrettä). Lajittele veroprosentin mukaan.

Vastaus:
SELECT htun, snimi, enimi, veropros
FROM henkilo
WHERE veropros IN (31, 24.5, 37)
ORDER BY veropros;


Tehtävä:
Hae henkilöt (htun, nimi, tutkinto), joilla tutkinto puuttuu (on NULL).

Vastaus:
SELECT htun, snimi, enimi, tutkinto
FROM henkilo
WHERE tutkinto IS NULL;


Tehtävä:
Hae henkilöt, joiden tutkinto ei ole FK.

Vastaus:
SELECT htun, snimi, enimi, tutkinto
FROM henkilo
WHERE tutkinto <> 'FK';


Tehtävä:
Hae suurin ja pienin annettu prioriteetti. Laita otsikoksi maksimi ja minimi.

Vastaus:
SELECT MAX(priorit) AS maksimi, MIN(priorit) AS minimi
FROM projekti;

-- koostefunktiot (aggregate functions): 5 kpl ANSI SQL2-standardissa: MIN, MAX, COUNT, SUM ja AVG


Vastaus:
SELECT Count(*) AS [Projektien määrä]
FROM PROJEKTI;

SELECT COUNT(*) 
FROM projekti;


Tehtävä:
Mikä on veroprosenttien keskiarvo. Laita otsikoksi (sarakkeen aliasnimi) 'ka'.

Vastaus:
SELECT AVG(veropros) AS ka
FROM henkilo;


Tehtävä:
Paljonko tekee palkkapotti yhteensä. Laita otsikoksi (sarakkeen aliasnimi) 'palkat_yht'.

Vastaus:
SELECT SUM(palkka) AS palkat_yht
FROM henkilo;


Tehtävä:
Montako erilaista prioriteetin arvoa on PROJEKTI-taulussa. Laita otsikoksi 'lkm'.

Vastaus:
-- Kirjan mallivastauksen syntaksi Ei toimi Accessissa: SELECT COUNT(DISTINCT priorit)
FROM PROJEKTI;

-- seuraavalla tavalla vastaus saadaan Accessissa: 
-- 1. tee alla oleva kysely ja tallenna se nimellä PRIORITEETIT:
SELECT DISTINCT priorit FROM proj
WHERE priorit is not null;
-- 2. Käytetään ylläolevaa erikseen tallennettua kyselyä (prioriteetit) tietolähteenä:
SELECT Count(*) AS [Erilaisten prioriteettien määrä]
FROM prioriteetit;


Tehtävä:
Mitä eroa on prioriteettien keskiarvon laskevissa käskyissä? Miksi?
SELECT AVG(priorit)
FROM projekti

SELECT SUM(priorit)/COUNT(*)
FROM projekti

Jos jälkimmäinen jakolasku antaa kokonaisluvun, laita SUM(priorit)* 1.0

Vastaus:
Ensimmäinen (parempi vaihtoehto) laskee prioriteettien keskiarvon ottaen huomioon vain rivit, joissa prioriteetin arvo on annettu.
TULOS: 2,2

Toinen jakaa annettujen prioriteettien summan taulun kokonaisrivimäärällä.
TULOS: 1,833333


Tehtävä:
Hae henkilo-taulun sukunimistä 3 ensimmäistä merkkiä.

Vastaus:
SELECT MID(snimi,1,3) AS alku
FROM henkilo;

-- Tämä syntaksi ei toimi Access:ssa:
SELECT SUBSTRING(snimi,1,3) 
FROM henkilo;
-- ANSI-standardin mukaan:
 SUBSTRING(snimi FROM 1 TO 3)
-- Oracle, DB2:
SELECT SUBSTR(snimi,1,3) AS alku
FROM henkilo


Tehtävä:
Hae henkilo-taulusta suku- ja etunimet yhdistettynä seuraavan mallin mukaisesti: Virta, Jukka. Laita aliasnimeksi 'nimi'.

Vastaus:
SELECT snimi + ', ' + enimi AS nimi
FROM henkilo;

-- Oracle, DB2: 
SELECT snimi || ', ' || enimi AS nimi
FROM henkilo;
-- MySQL:
SELECT CONCAT(snimi, ', ', enimi) AS nimi
FROM henkilo


Tehtävä:
Yrityksen henkilöiden tunniste muodostetaan ottamalla sukunimestä kaksi ja etunimestä kaksi merkkiä; tunnisteen pitää olla isoilla kirjaimilla. Esimerkki: Jukka Virta  saa tunnuksen VIJU. Laita otsikoksi ht. Muodosta tunniste kaikille henkilöille.

Vastaus:
SELECT UCase(Mid(snimi,1,2) + Mid(enimi,1,2)) AS ht
FROM henkilo;

-- SQL Server:
SELECT UPPER(SUBSTRING(snimi,1,2) + SUBSTRING(enimi,1,2)) AS ht
FROM henkilo

MySQL:
SELECT UPPER(CONCAT(SUBSTRING(snimi,1,2), SUBSTRING(enimi,1,2))) AS ht
FROM henkilo

-- Oracle, DB2: 
SSELECT UPPER(SUBSTR(snimi,1,2) || SUBSTR(enimi,1,2)) AS ht
FROM henkilo


Tehtävä:
Hae henkilöt, jotka ovat tulleet töihin (pvm) 12.5.1993: htun, snimi, enimi, pvm

Vastaus:
SELECT htun, snimi, enimi, pvm
FROM henkilo
WHERE henkilo.pvm = #5/12/1993#;

-- Oracle, DB2:
SELECT htun, snimi, enimi, pvm
FROM henkilo
WHERE pvm = '12.5.1993'

-- SQL Server, MySQL:
SELECT htun, snimi, enimi, pvm
FROM henkilo
WHERE pvm = '1993-5-12'


Tehtävä:
Laske palkat yhteen kunnittain (hae kunta ja palkkasumma)

Vastaus:
SELECT kunta, Sum(palkka) AS Summa_palkka
FROM henkilo
GROUP BY kunta;

SELECT kunta, SUM(palkka)
from henkilo
GROUP BY kunta;


Tehtävä:
Montako projektia on kussakin  sijaintipaikassa? Hae sijaintipaikka ja projektien määrä (otsikoksi lkm).

Vastaus:
SELECT sijainti, COUNT(*) AS lkm
FROM projekti
GROUP BY sijainti;


Tehtävä:
Missä sijaintipaikoissa on vähintään kaksi projektia? Hae sijaintipaikka ja projektien määrä (otsikoksi lkm).

Vastaus:
SELECT sijainti, COUNT(*) AS lkm
FROM projekti
GROUP BY sijainti
HAVING COUNT(*) >= 2;


Tehtävä:
Htun-sarakkeen toinen merkki tarkoittaa tiettyä henkilötyyppiä. Laske tämän tyypin mukaan ryhmiteltynä palkkasummat ja henkilöiden lukumäärä ko tyyppiä kohti.

Vastaus:
SELECT MID(htun,2,1) AS tyyppi, sum(palkka) AS summa, 
COUNT(*) AS lkm
FROM henkilo
GROUP BY MID(htun,2,1);

-- SQL Server, MySQL:
SELECT SUBSTRING(htun,2,1) AS tyyppi, sum(palkka) AS summa, COUNT(*) AS lkm
FROM henkilo
GROUP BY SUBSTRING(htun,2,1)
-- ORACLE, DB2:
SELECT SUBSTR(htun,2,1) AS tyyppi, sum(palkka) AS summa, 
COUNT(*) AS lkm
FROM henkilo
GROUP BY SUBSTR(htun,2,1)


Tehtävä:
Laske henkilöiden verot palkan ja veroprosentin avulla. Sarakkeet htun, snimi, enimi, palkka, veropros, vero. Lajittele lasketun veron mukaan laskevaan järjestykseen.

Vastaus:
SELECT htun, snimi, enimi, palkka, veropros, 
palkka*veropros/100 AS vero
FROM henkilo
ORDER BY palkka*veropros/100 DESC

-- muissa DBMS:ssa voidaan käyttää sarakkeen aliasnimeä lajittelussa: 
SELECT htun, snimi, enimi, palkka, veropros, 
palkka*veropros/100 AS vero
FROM henkilo
ORDER BY vero DESC


Tehtävä:
Mikä on minimi- ja maksimipalkan erotus ja montako prosenttia maksimipalkka on suurempi kuin minimipalkka.

Vastaus:
SELECT MAX(palkka) As Suurin, MIN(palkka) AS Pienin, MAX(palkka) - MIN(palkka) AS Ero, Format((MAX(palkka) - MIN(palkka)) * 100 / MIN(palkka), "##0.00")  AS Pros        
FROM henkilo;
----------- Tässä on käytetty FORMAT -funktiota prosenttiarvon muotoiluun --------
------- Format funktion nimettyjä formaatteja on käytetty alla olevissa esimerkeissä

SELECT MAX(palkka) - MIN(palkka) AS Ero,
Format((MAX(palkka) - MIN(palkka)) * 100/ MIN(palkka), "Standard")  AS Pros        
FROM henkilo;

SELECT MAX(palkka) - MIN(palkka) AS Ero,
Format((MAX(palkka) - MIN(palkka)) / MIN(palkka), "Percent")  AS Pros        
FROM henkilo;


Tehtävä:
Hae nimet ja palkat niistä henkilöistä, joiden palkka 10% korotettuna menisi yli 7900.

Vastaus:
SELECT snimi, palkka
FROM henkilo
WHERE palkka * 1.1 > 7900;


Tehtävä:
Palkka jaettuna henkilön iällä on eräs tunnusluku. Paljonko on kunkin henkilön palkka / ikä
Tulokseen nimi ja tunnusluku.
Lajittele tämän tunnusluvun mukaan LASKEVAAN järjestykseen.

Vastaus:
SELECT snimi, FORMAT(palkka/(1998-svuosi),"####,00") AS TunnusLuku, 
palkka, (1998-svuosi) as ikä
FROM henkilo
ORDER BY 2 DESC;

--- parempi olisi:
SELECT snimi, Val(Format([palkka]/(Year(Date())-[svuosi]),"#,#00")) AS TunnusLuku, palkka, Year(Date())-[svuosi] AS Ikä
FROM henkilo
ORDER BY 2 DESC;


Tehtävä:
Hae henkilön 2245 projektien nimet ja tuntimäärät. Vihje: tarvitaan 2 taulua.

Vastaus:
SELECT pr.pnimi, prhe.tunnit
FROM projekti pr INNER JOIN proj_henk prhe
  ON pr.ptun = prhe.ptun
WHERE prhe.htun = '2245';

---- Huom: kun käytetään useita tauluja, on hyvä tapa laittaa kaikkiin tietoihin näkyviin myös taulun nimi: "taulu.sarake"

-- Vanha syntaksi: SELECT pnimi, tunnit
FROM projekti, proj_henk
WHERE projekti.ptun = proj_henk.ptun
AND htun = "2245";


Tehtävä:
Hae projektien nimet, henkilötunnukset ja kunkin henkilön tehdyt ja suunnitellut tunnit per projekti (ei siis summia). Lajittele projekteittain.

Vastaus:
SELECT pr.pnimi, prhe.htun, 
       prhe.tunnit, prhe.tunnit_suun
FROM projekti pr INNER JOIN proj_henk prhe
  ON pr.ptun = prhe.ptun
ORDER BY pr.pnimi;

-- Vanha syntaksi: SELECT pnimi, snimi, tunnit
FROM henkilo, projekti, proj_henk
WHERE henkilo.htun = proj_henk.htun
AND projekti.ptun = proj_henk.ptun
ORDER BY pnimi;


Tehtävä:
Hae osastojen nimet ja tunnukset sekä henkilöistä snimi, enimi, kunta, palkka; mukaan vain ne, joiden palkka on 2800. Lajittele osaston nimen ja henkilön nimen mukaan.

Vastaus:
SELECT os.osnimi, os.ostun, he.snimi, he.enimi, 
       he.kunta, he.palkka
FROM osasto os INNER JOIN henkilo he ON os.ostun = he.ostun
WHERE he.palkka <= 2800
ORDER BY os.osnimi, he.snimi, he.enimi;


Tehtävä:
Hae projektien nimet, niiden henkilöt (nimellä) ja kunkin henkilön tehdyt ja suunnitellut tunnit per projekti (ei siis summia).
Lajittele projekteittain ja henkilöittäin.

Vastaus:
SELECT pr.pnimi, pr.ptun, prhe.htun, 
       prhe.tunnit, prhe.tunnit_suun
FROM projekti pr INNER JOIN proj_henk prhe
  ON pr.ptun = prhe.ptun
ORDER BY pr.pnimi;

-- Vanha syntaksi: SELECT pnimi, snimi, tunnit
FROM henkilo, projekti, proj_henk
WHERE henkilo.htun = proj_henk.htun
AND projekti.ptun = proj_henk.ptun
ORDER BY pnimi;


Tehtävä:
Hae henkilöittäin henkilön nimi, tunnus ja tehdyt tunnit yhteensä (otsikko YHT) sekä henkilön projektien lukumäärä (rivejä per henkilö prhe-taulussa)

Vastaus:
SELECT he.snimi, he.htun, SUM(ph.tunnit) AS yht, COUNT(*) AS lkm
FROM henkilo he INNER JOIN proj_henk ph
  ON he.htun = ph.htun
GROUP BY he.snimi, he.htun;


Tehtävä:
Hae kaikki projektit, niistä ptun, pnimi ja tunnit yhteensä. 
Ota mukaan myös ne projektit, joilla EI ole tunteja (eli P5 ja P6).

Vastaus:
SELECT pr.ptun, pnimi, SUM(ph.tunnit) AS yht
FROM projekti pr LEFT JOIN proj_henk ph
  ON pr.ptun = ph.ptun
GROUP BY pr.ptun, pnimi;

----- JOS HALUAISITKIN HAKEA NE PROJETIT JOILLA EI OLE HENKILÖITÄ
SELECT projekti.ptun, projekti.pnimi, Sum(proj_henk.tunnit) AS TuntiSumma
FROM projekti LEFT JOIN proj_henk ON projekti.ptun = proj_henk.ptun
WHERE proj_henk.htun IS NULL
GROUP BY projekti.ptun, projekti.pnimi;

----- Oraclessa toimii myös
SELECT projekti.ptun, projekti.pnimi, SUM(proj_henk.tunnit) AS TuntiSumma
FROM projekti, proj_henk
WHERE projekti.ptun = proj_henk.ptun(+)
GROUP BY projekti.ptun, projekti.pnimi;

----- SQL Serverissä toimii myös
SELECT projekti.ptun, projekti.pnimi, SUM(proj_henk.tunnit) AS TuntiSumma
FROM projekti, proj_henk
WHERE projekti.ptun *= proj_henk.ptun
GROUP BY projekti.ptun, projekti.pnimi;


Tehtävä:
Hae projekteittain ptun, pnimi, tunnit, ja  toteutuneiden ja suunniteltujen tuntien erotus helsinkiläisistä ja kuopiolaisista projekteista. Otsikoi sopivasti.

Vastaus:
SELECT pr.ptun, pr.pnimi, SUM(ph.tunnit) AS tunnit, SUM(ph.tunnit) - SUM(ph.tunnit_suun) AS erotus
FROM projekti pr INNER JOIN proj_henk ph
  ON pr.ptun = ph.ptun
WHERE sijainti IN ('HELSINKI','KUOPIO')
GROUP BY pr.ptun, pr.pnimi;


Tehtävä:
Hae osastoittain osaston nimi ja tunnus ja osaston palkkasumma ja keskiarvopalkka (otsikot min, max ja ka).

Vastaus:
SELECT os.osnimi, os.ostun, 
       SUM(he.palkka) AS sum, AVG(he.palkka) AS ka
FROM osasto os LEFT JOIN henkilo he
  ON os.ostun = he.ostun
GROUP BY os.osnimi, os.ostun;


Tehtävä:
Listaa projektin P4 nimi ja ne projektit, joiden prioriteetti on suurempi TAI yhtäsuuri kuin projektin P4.

Vastaus:
SELECT X.pnimi, Y.pnimi, X.ptun, Y.ptun
FROM projekti X, projekti Y
WHERE X.ptun = 'P4'
AND Y.priorit >= X.priorit;
------ Otetaan näkyviin myös X.ptun ja Yptun tuloksen havainnollistamiseksi ---


Tehtävä:
Hae alle 300 tuntia yhteensä tehneiden henkilöiden nimet.

Vastaus:
SELECT henkilo.snimi
FROM henkilo, proj_henk
WHERE henkilo.htun = proj_henk.htun
GROUP BY snimi
HAVING SUM(proj_henk.tunnit) < 300;


Tehtävä:
Listaa projektin P2 nimi ja sijainti sekä niiden projektien nimet, joilla on sama sijainti kuin P2:lla.

Vastaus:
SELECT X.pnimi, X.sijainti, Y.pnimi, X.ptun, Y.ptun
FROM projekti AS X, projekti AS Y
WHERE X.ptun='P2'
AND X.sijainti=Y.sijainti AND x.ptun <> y.ptun;
------ Otetaan näkyviin myös X.ptun ja Y.ptun tuloksen havainnollistamiseksi ----

----- tai alikyselynä:
SELECT pnimi, sijainti FROM proj
WHERE ptun="P2" OR sijainti=
(select sijainti from projekti where ptun = 'P2';)


Tehtävä:
Hae samaan tulosjoukkoon sijaintipaikoittain kaikki henkilöt ja projektit.
(sijaintipaikka/kunta, htun/ptun).
Rivillä pitää näkyä, onko kyseessä henkilö vai projekti.
Järjestys sijaintipaikoittain.
Tuloksen malli on alla (laita sarakeotsikot ensimmäiseen SELECT-lauseeseen):

kunta         tun        tyyppi
--------------   -----       --------------
HELSINKI        P2   PROJEKTI
HELSINKI        P3   PROJEKTI
HELSINKI        2245 HENKILO
HELSINKI        2884 HENKILO
KUOPIO          P5   PROJEKTI
TAMPERE         3546 HENKILO
TAMPERE         3547 HENKILO
TURKU           P1   PROJEKTI
TURKU           P4   PROJEKTI
TURKU           2134 HENKILO
TURKU           2234 HENKILO
TURKU           2345 HENKILO
                P6   PROJEKTI

Vastaus:
SELECT kunta, htun AS tun, 'HENKILO ' AS tyyppi
FROM henkilo
UNION
SELECT sijainti, ptun, 'PROJEKTI' 
FROM projekti
ORDER BY kunta, tun;


Tehtävä:
Hae projektien tunnus, nimi ja sijainti. Jos sijainti on NULL, korvaa se tekstillä "<ei ole>"
(ree funktiolla tai UNIONilla).

Vastaus:
SELECT ptun, pnimi, sijainti
FROM projekti
WHERE sijainti IS NOT NULL
UNION
SELECT ptun, pnimi, '<ei ole>  '
FROM projekti
WHERE sijainti IS NULL;

-- Sama tulos funktiolla ilman union -lausetta:
SELECT ptun, pnimi, IIF(sijainti, sijainti, "<EI OLE>")
FROM PROJEKTI;


Tehtävä:
Toiseen järjestelmään tehtävää otosta varten laitetaan alle 2800 tai tasan 2800 olevat palkat omaan sarakkeeseensa ja yli 2800 olevat omaansa, alla olevan mallin mukaisesti. Tee kysely.

SNIMI  PIENIP SUURIP
---------- ---------- ----------
Joki          0       3100
Jokinen    2800        0
Järvi          0       2960
Meri        2800         0
Metsä          0    3100
Ranta     2650       0
Virta       2800       0

Vastaus:
SELECT snimi, palkka AS pienip , 0 AS suurip 
FROM henkilo 
WHERE palkka <= 2800
UNION
SELECT  snimi, 0 AS pienip, palkka AS suurip 
FROM henkilo 
WHERE palkka> 2800;

-- huom: nollan sijaan käskyssä voi kirjoittaa myös avainsanan NULL, jolloin tulosjoukkoon tulee NULL-arvoja


Tehtävä:
Hae ne projektit (nimellä), joilla on sama prioriteetti kuin P5:lla.
Käytä alikyselyä.

Vastaus:
SELECT pnimi, priorit
FROM projekti
WHERE priorit = 
(SELECT priorit 
FROM projekti
WHERE ptun = 'P5');


Tehtävä:
Hae maksimipalkkaiset henkilöt.
Nimi ja palkka.

Vastaus:
SELECT snimi, palkka
FROM henkilo
WHERE palkka =
(SELECT MAX(palkka) FROM henkilo);

SELECT henkilo.snimi, henkilo.palkka AS Suurin
FROM henkilo
GROUP BY henkilo.snimi, henkilo.palkka
HAVING henkilo.palkka=(SELECT MAX(palkka) from henkilo;);


Vastaus:
SELECT pnimi
FROM projekti
WHERE projekti.ptun IN
(SELECT ptun 
FROM proj_henk
WHERE proj_henk.htun = '2134');
------------------------------ Sama tulos liitoksella ------
SELECT projekti.pnimi
FROM proj_henk INNER JOIN projekti ON proj_henk.ptun = projekti.ptun
WHERE proj_henk.htun='2134';


Tehtävä:
Hae niiden henkilöiden nimet, joiden projekteista ainakin yksi on prioriteetiltaan 3 TAI 1.

Vastaus:
SELECT SNIMI 
FROM henkilo
WHERE htun IN ( SELECT htun FROM proj_henk 
                          WHERE ptun IN ( SELECT ptun FROM projekti
                                                     WHERE priorit IN (1,3)
                                                   )
                          );


Tehtävä:
Hae henkilön 2245 projektien nimet käyttäen EXISTS -alikyselyä.

(Mieti vaihtoehtoja saman tuloksen aikaansaamiseksi)

Vastaus:
SELECT pnimi
FROM projekti
WHERE EXISTS
(SELECT * 
FROM proj_henk
WHERE proj_henk.ptun = projekti.ptun
AND proj_henk.htun='2134');
----------- käyttäen EXISTS -alikyselyä (Voi olla hidas) ---------------------------
----------------------------- Sama tulos liitoksella (Yleensä Nopein)  -----------
SELECT projekti.pnimi
FROM proj_henk INNER JOIN projekti ON proj_henk.ptun = projekti.ptun
WHERE proj_henk.htun='2134';
---------------------------- Sama tulos IN -alikyselyllä (Yleensä Hitain)  -----------
SELECT pnimi
FROM proj
WHERE projekti.ptun IN
(SELECT ptun 
FROM proj_henk
WHERE proj_henk.htun = '2134');


Tehtävä:
Hae projektit, joiden prioriteetti on suurempi TAI yhtäsuuri kuin sijaintipaikkansa keskiarvo.

Vastaus:
SELECT pnimi, sijainti, priorit
FROM projekti A
WHERE priorit >=
(SELECT AVG(priorit)
FROM projekti B
WHERE A.sijainti = B.sijainti);


Tehtävä:
Hae sijaintipaikoittain korkeimman prioriteetin omaavat projektit.
(nimi, sijainti ja prioriteetti)

Vastaus:
SELECT pnimi, sijainti, priorit
FROM projekti A
WHERE priorit = 
(SELECT MAX(priorit)
FROM projekti B
WHERE A.sijainti = B.sijainti)


Tehtävä:
Keillä henkilöillä on pienempi palkka kuin kaikilla helsinkiläisillä (ALL)

Vastaus:
SELECT * FROM henkilo
WHERE palkka < ALL (
SELECT palkka FROM henkilo
WHERE kunta = 'HELSINKI') ;

--- toinen vaihtoehto:
SELECT * FROM henkilo
WHERE palkka <
(SELECT min(palkka) FROM henkilo
WHERE kunta = 'helsinki')


Tehtävä:
Keillä henkilöillä on pienempi palkka kuin kaikilla helsinkiläisillä.
Käytä NOT EXISTS -alikyselyä.

(Ole tarkkana vertailuehdon operaattorin suunnan valinnassa)

Vastaus:
SELECT *
FROM henkilo A
WHERE NOT EXISTS
(SELECT *
FROM henkilo B
WHERE kunta = 'HELSINKI'
AND A.palkka >= B.palkka);

--------- Sama tulos < ALL -vertailulla ----------------------
SELECT *
FROM henkilo
WHERE palkka < ALL (
SELECT palkka 
FROM henkilo
WHERE kunta = 'HELSINKI') ;


Tehtävä:
Perusta taulu PRTUNNIT, jossa on sarakkeet PTUN, PNIMI ja YHT
(yht on tietotyyppiä Kokonaisluku eli integer).
Merkitse PTUN perusavaimeksi.
(Jos tuotteesi sitä vaatii, perusta vielä UNIQUE INDEX ptun sarakkeelle)

Vastaus:
create table prtunnit (
ptun TEXT(4) CONSTRAINT prtunnit_ind PRIMARY KEY,
pnimi text(10) ,
yht  integer 
);


Tehtävä:
Lisää tauluun HENK sarake PUHENLINNRO (15 merkkiä).

Vastaus:
ALTER  TABLE henkilo 
ADD puhelinnro TEXT(15);

(sarake tulee tauluun viimeiseksi!)


Tehtävä:
Lisää PROJ tauluun tarkistus (CHECK), joka määrittelee priorit -sarakkeen sallituiksi arvoiksi 1,2,3 ja 4. 
Kokeile toimiiko tarkistus.

Vastaus:
-- TÄMÄ EI ONNISTU, ACCESS EI TUNNE CHECK -avainsanaa --------
ALTER TABLE PROJ
ADD CONSTRAINT priorit_tark CHECK priorit IN (1, 2, 3, 4);

----- Valitse Tietokantaikkunasta Taulukot välilehti ja valitse taulukko PROJ
----- valitse taulukon rakenteen ylläpito valitse sitten tietokenttä PRIORIT
----- kirjoita ikkunan alaosasta löytyvään KELPOISUUSSÄÄNTÖ kohtaan
----- alla oleva tarkistuslauseke

1 OR 2 OR 3 OR 4 OR IS NULL


Tehtävä:
Lisää tauluun PROJ projekti P7 TARJOUS, jonka sijainti on LAHTI; projektin prioriteettia EI tiedetä.

Vastaus:
-- Kun annat tämän seuraavan käskyn kyselyn SQL -näkymäikkunassa
-- ACCESS muuntaa kyselyn tyypiksi automaattisesti LIITTÄMISKYSELY
---- (Voit valita kyselyn tyypin myös valmiiksi Kysely -valikosta)

INSERT INTO projekti VALUES
('P7', 'TARJOUS', Null, 'LAHTI');


Tehtävä:
Lisää kaikkien turkulaisten projektien prioriteettia yhdellä.

Vastaus:
UPDATE proj
SET priorit = priorit + 1
WHERE sijainti = 'TURKU';

---- Jos vaihdat ykkösen paikalle esim 5:n, pitäisi prioriteetin arvoaluetarkistuksen
---- laueta ja ilmoittaa päivityksen epäonnistumisesta (KOKEILE)

HUOM!! JOS PRIORITEETTI ON ENNESTÄÄN NULL, EI se siitä mihinkään kasva!!
KOSKA: Tuntematon arvo + 1 on yhäkin Tuntematon arvo !!!!!
(KOKEILE vaihtamalla Turun paikalle 'LAHTI')


Tehtävä:
Poista projekti–taulusta P6-tunnuksella oleva projekti


Tehtävä:
Vie perustamaasi PRTUNNIT tauluun kustakin projektista 
projektin tunnus, nimi ja tehdyt tunnit yhteensä.

Vastaus:
-- HUOM!! tuntien summa on nimettävä AS YHT, jotta homma toimisi
-- SIIS summa on nimettävä samoin kuin se PRTUNNIT taulun sarake, johon summa halutaan tallentaa.
-- Jos et käytä IIF -funktiota summan tuloksen käsittelyyn, tallentuu niiden projektien kohdalle, joilla ei ole tunteja proj_henk -taulussa, prtunnit tauluun yht -sarakkeeseen Null 

INSERT INTO prtunnit
SELECT projekti.ptun, pnimi, IIF(SUM(tunnit),SUM(tunnit),0) AS yht
FROM projekti LEFT JOIN proj_henk ON projekti.ptun = proj_henk.ptun
GROUP BY projekti.ptun, pnimi;


Tehtävä:
Korota projektin P2 henkilöiden palkkaa 10%

Vastaus:
UPDATE henkilo
SET palkka = palkka * 1.1
WHERE htun IN
(SELECT htun FROM proj_henk WHERE ptun = 'P2');


Vastaus:
DELETE FROM proj_henk
WHERE ptun = 'P4' AND htun IN 
(SELECT htun FROM henkilo WHERE snimi = 'Joki');

---- Vaihtoehtoinen tapa -------------------------------------------
DELETE FROM proj_henk
WHERE ptun = 'P4'
AND EXISTS (
SELECT * FROM henkilo WHERE proj_henk.htun = henkilo.htun AND snimi = 'Järvi');


Tehtävä:
Pikkuprojektit hajasijoitetaan:
Aseta niiden projektien sijainniksi OULU ja prioriteetiksi 4,
joissa on korkeintaan kaksi henkilöä.

Vastaus:
UPDATE proj
SET sijainti = 'OULU', priorit = 4
WHERE 2 >=
(SELECT COUNT(*) FROM proj_henk WHERE proj_henk.ptun=projekti.ptun)

----  Alla oleva versio EI siirrä projekteja, joissa EI ole henkilöitä
UPDATE proj
SET sijainti = 'OULU', priorit = 4
WHERE ptun IN
(SELECT htun FROM proj_henk 
GROUP BY htun 
HAVING COUNT(*) <= 2)


Tehtävä:
(Peruskurssin kokeen tehtävä 6.) FinnInnossa selkiytetään osastojakoa.
Seuraavien henkilöiden nimikkeeksi on muutettava "Osastonjohtaja":
          Veli Taivainen, Heikki Aalto, Markku Luukkonen, Heikki Palomaa,
          Adolf Karell ja Anssi Lappalainen

KOPIOI ensin taulu HENKREK tietokannasta HENKREK.MDB

Ratkaise tehtävä HENKREK -taulun parametroidulla päivityskyselyllä, joka ensin
kysyy Henkilön Sukunimen ja Etunimen ja päivittää sitten henkilön tehtävän
arvoksi "Osastonjohtaja"

Vastaus:
UPDATE henkrek
SET tehtävä = "Osastonjohtaja"
WHERE sukunimi = AnnaSukunimi 
AND etunimi = AnnaEtunimi;

--- Tehdään samat tietojen muutokset hieman monimutkaisemmin
--- Luodaan ensin TYHJÄ aputaulu YLENNETYT

SELECT sukunimi, etunimi, tehtävä INTO Ylennetyt
FROM henkrek WHERE 1=2;

--- Tallennetaan luotuun tauluun ylennettävien nimet, avaamalla taulukko ACCESS:n
--- tietokantaikkunan Taulukot -välilehdeltä, ja kirjoittamalla halutut nimet ja  
--- henkilöiden uudet tehtävät. (KÄYTÄ KOPIOI ja LIITÄ -TOIMINTOA APUNA)
--- Sitten TARKISTETAAN tiedot ja suljetaan tallennusikkuna.
--- HUOM: Käytännössä nämä tiedot voitaisiin ehkä ladata jostain toisesta
--- tietojärjestelmästä tähän aputauluun, jolloin tarkistus riittäisi!

--- Tarkistetaan nimitiedot vielä sql -haulla, jossa liitetään yhteen taulut Henkrek 
--- ja Ylennetyt:

SELECT Y.sukunimi, Y.etunimi, Y.tehtävä AS UusiTehtävä, H.tehtävä AS VanhaTehtävä
FROM ylennetyt Y, henkrek H
WHERE Y.Sukunimi = H.Sukunimi
AND       Y.Etunimi = H.Etunimi;

--- Jos kyselyn tuloksessa on 6 riviä, joissa tiedot on oikein, niin
--- TALLENNA KYSELY NIMELLÄ Ylennys ja sitten anna seuraava SQL -komento:

UPDATE Ylennys
SET VanhaTehtävä = UusiTehtävä;

--- Voit vielä kerran tarkistaa tuloksen ajamalla kyselyn Ylennys. Tuloksessa kaikkien pitäisi nyt olla Osastonjohtajia. 
SEURAAVALLA YLENNYSKIERROKSELLA TARVITAAN VAIN Ylennetyt -taulun
tietojen päivittäminen ajan tasalle ja ylläolevan UPDATE -komennon antaminen.
PS. Tämä komento kannattanee tallentaa esim. nimelle Ylennä.


Tehtävä:
Perusta näkymä hesa, joka hakee henkilo-taulusta helsinkiläiset, mukaan sarakkeet tässä järjestyksessä: snimi, enimi, htun, kunta ja pvm. Kokeile uutta näkymääsi.

Vastaus:
CREATE VIEW hesa  AS
SELECT snimi, enimi, htun, kunta, pvm
FROM henkilo;

-- huom. Accessissa näkymää vastaa kysely, joka tallennetaan jollakin nimellä


Tehtävä:
Perusta näkymä v_prtunnit, jonka avulla saa kustakin projektista sarakkeet projektin tunnus, nimi ja tehdyt tunnit yhteensä.

Vastaus:
CREATE VIEW v_prtunnit (ptun, pnimi, tunnityht)  AS
SELECT pr.ptun, pr.pnimi, SUM(ph.tunnit)
FROM projekti pr LEFT JOIN proj_henk ph
  ON pr.ptun = ph.ptun
GROUP BY pr.ptun, pr.pnimi;


Tehtävä:
Perusta näkymä PROJEKTIT, josta saa suoraan projektin nimen ja sijainnin, projektiin kuuluvien henkilöiden nimet, palkat ja tunnit projektia kohti. (EI siis summattuja tunteja)

Vastaus:
SELECT pnimi, sijainti, snimi, palkka, tunnit
FROM projekti, henkilo, proj_henk
WHERE projekti.ptun = proj_henk.ptun
AND henkilo.htun = proj_henk.htun;
----- Tallenna yllä oleva kysely nimellä PROJEKTIT


Tehtävä:
Tee näkymä HLOTILANNE, josta saa henkilön projektitilanteen:
henkilön nimi, kunta, henkilön tehdyt tunnit yhteensä ja
suunnitellut tunnit yhteensä sekä
edellisten erotus.
Kokeile tekemääsi näkymää.

Vastaus:
----- Tallenna alla oleva kysely nimellä HLOTILANNE

SELECT snimi, kunta, SUM(tunnit) AS yhttunnit, 
              SUM(tunnit_suun) AS suuntunnit, 
              SUM(tunnit_suun) - SUM(tunnit) AS erotus
FROM henkilo, proj_henk
WHERE henkilo.htun = proj_henk.htun
GROUP BY snimi, kunta;


Tehtävä:
Hae henkilön nimi, tunnit, suunnitellut tunnit ja näiden erotus, 
erotuksen mukaan laskevassa järjestyksessä.
Käytä edellisen tehtävän näkymää.

Vastaus:
SELECT snimi, yhttunnit, suuntunnit, erotus
FROM hlotilanne
ORDER BY erotus DESC;


Tehtävä:
Hae henkilön nimi, palkka sekä palkan prosentuaalinen osuus henkilön kunnan palkkapotista.
Siis DETALJI ja SUMMA samalle riville!

Jatkotehtävä:
MITEN LAJITTELET TULOSTIETORIVIT PROSENTTISOSUUDEN MUKAAN?

Vastaus:
----- Tallenna ensin alla oleva kysely nimellä KUNTASUM -------------------
SELECT kunta, SUM(palkka) AS palksumma
FROM henkilo
GROUP BY kunta;

------ Hae sitten liitoksen avulla ------------------------
------ HUOMATKAA: Kun FORMAT -lauseessa on mukana %-merkki
------ muotoiltava luku kerrotaan automaattisesti 100:lla 

SELECT snimi, palkka, FORMAT(palkka/palksumma, "###.00%") AS Pros
FROM henkilo, kuntasum
WHERE henkilo.kunta = kuntasum.kunta;

---- tai hae suoraan liittämällä henkilötaulu itseensä --------------
---- Tässä on käytetty erilaista prosenttisarakkeen muotoilutapaa
SELECT  A.snimi, A.palkka, INT(100 * 100*A.palkka/SUM(B.palkka))/100 AS Pros
FROM henkilo A, henkilo B
WHERE A.kunta = B.kunta
GROUP BY A.snimi, A.palkka;


LAJITTELURATKAISU1:
Lisää yllä olevaan kyselyyn lajittelulause muodossa:  ORDER BY 3;
Siinä numero 3 viittaa lajittelusarakkeen järjestysnumeron select lauseessa.

LAJITTELURATKAISU2:
Tallenna ylläoleva kysely nimellä SUMMALAJITTELU1 ja tee uusi kysely:
SELECT pros, snimi, palkka
FROM summalajittelu1
ORDER BY pros DESC;


Tehtävä:
Hae projektien nimet, niiden henkilöt nimellä ja kunkin henkilön tunnit per projekti. Lajittel projekteittain.
KÄYTÄ HYVÄKSI NÄKYMÄÄ PROJEKTIT.

Vastaus:
SELECT pnimi, snimi, tunnit
FROM projektit
ORDER BY pnimi;


Tehtävä:
Hae Projektit-näkymän avulla henkilöiden projektiluettelo, josta näkyy henkilöä kohti, mihin projekteihin hän kuuluu ja paljonko on tunteja.

Vastaus:
SELECT snimi, pnimi, tunnit
FROM projektit
ORDER BY snimi;


# omat_tehtävät

tehtävä:
Tähän voit kirjoittaa haluamasi ratkaistavan ongelman


tehtävä:
Muista TAULUN TIETOJEN YLLÄPITO 7 mallivaustauksen virhe:
Muista TAULUN TIETOJEN YLLÄPITO 5 mallivaustauksen virhe:

vastaus:
Oikea muoto:

UPDATE Ylennys
SET VanhaTehtävä = UusiTehtävä;

UPDATE proj
SET sijainti = 'OULU', priorit = 4
WHERE ptun IN
(SELECT htun FROM prhe 
GROUP BY htun 
HAVING COUNT(*) <= 2)


tehtävä:
Uudelleenjärjestäminen kannattaa !!!
SQLOPAS2.MDB  
ennen pakkaamista: 1868 kt
pakkaamisen jälkeen: 336 kt


tehtävä:
Tässä vasen hakasulku [ tässä tähti * ja tässä oikea haka ]


# UudetVastaukset

Tehtävä:
Hae maksimipalkkaiset henkilöt.
Nimi ja palkka.

Vastaus:
SELECT snimi, palkka
FROM henk
WHERE palkka =
(SELECT MAX(palkka) FROM henk);

SELECT henk.snimi, henk.palkka AS Suurin
FROM henk
GROUP BY henk.snimi, henk.palkka
HAVING henk.palkka=(SELECT MAX(palkka) from henk;);


Tehtävä:
Hae kaikki projektit, niistä ptun, pnimi ja tunnit yhteensä. 
Ota mukaan myös ne projektit, joilla EI ole tunteja (eli P5 ja P6). 
Käytä tuotteesi tukemaa ulkoliitossyntaksia.

Vastaus:
----- OIKEA VASTAUS ACCESS:llä
SELECT proj.ptun, proj.pnimi, Sum(prhe.tunnit) AS TuntiSumma
FROM proj LEFT JOIN prhe ON proj.ptun = prhe.ptun
GROUP BY proj.ptun, proj.pnimi;

----- JOS HALUAISITKIN HAKEA NE PROJETIT JOILLA EI OLE HENKILÖITÄ
SELECT proj.ptun, proj.pnimi, Sum(prhe.tunnit) AS TuntiSumma
FROM proj LEFT JOIN prhe ON proj.ptun = prhe.ptun
WHERE prhe.htun IS NULL
GROUP BY proj.ptun, proj.pnimi;

----- OIKEA VASTAUS ORACLE:lla tai SQLBASE:lla
SELECT proj.ptun, proj.pnimi, SUM(prhe.tunnit) AS TuntiSumma
FROM proj, prhe
WHERE proj.ptun = prhe.ptun(+)
GROUP BY proj.ptun, proj.pnimi;

----- OIKEA VASTAUS SQL SERVER:llä
SELECT proj.ptun, proj.pnimi, SUM(prhe.tunnit) AS TuntiSumma
FROM proj, prhe
WHERE proj.ptun *= prhe.ptun
GROUP BY proj.ptun, proj.pnimi;

--- VÄÄRIÄ VASTAUKSIA ACCESS:llä
--- NÄMÄ EIVÄT TUO HENKILÖTTÖMIÄ PROJEKTEJA
SELECT proj.ptun, proj.pnimi, Sum(prhe.tunnit) AS TuntiSumma
FROM proj INNER JOIN prhe ON proj.ptun = prhe.ptun
GROUP BY proj.ptun, proj.pnimi;

SELECT proj.ptun, proj.pnimi, Sum(prhe.tunnit) AS TuntiSumma
FROM proj RIGHT JOIN prhe ON proj.ptun = prhe.ptun
GROUP BY proj.ptun, proj.pnimi;


Tehtävä:
Mikä on minimi- ja maksimipalkan erotus ja montako prosenttia maksimipalkka on suurempi kuin minimipalkka.

Vastaus:
----------- Tässä on käytetty FORMAT -funktiota prosenttiarvon muotoiluun --------
SELECT MAX(palkka) As Suurin, MIN(palkka) AS Pienin, MAX(palkka) - MIN(palkka) AS Ero, Format((MAX(palkka) - MIN(palkka)) * 100 / MIN(palkka), "##0.00")  AS Pros        
FROM henk;

------- Format funktion nimettyjä formaatteja on käytetty alla olevissa esimerkeissä
SELECT MAX(palkka) - MIN(palkka) AS Ero,
Format((MAX(palkka) - MIN(palkka)) * 100/ MIN(palkka), "Standard")  AS Pros        
FROM henk;

SELECT MAX(palkka) - MIN(palkka) AS Ero,
Format((MAX(palkka) - MIN(palkka)) / MIN(palkka), "Percent")  AS Pros        
FROM henk;


Tehtävä:
Listaa projektin P2 nimi ja sijainti sekä niiden projektien nimet, joilla on sama sijainti kuin P2:lla.

Vastaus:
------ Otetaan näkyviin myös X.ptun ja Y.ptun tuloksen havainnollistamiseksi ----
SELECT X.pnimi, X.sijainti, Y.pnimi, X.ptun, Y.ptun
FROM proj AS X, proj AS Y
WHERE X.ptun='P2' AND X.sijainti=Y.sijainti AND x.ptun <> y.ptun;

----- tai alikyselynä:
SELECT pnimi, sijainti FROM proj
WHERE ptun="P2" OR sijainti=
(select sijainti from proj where ptun = 'P2';)


Tehtävä:
Keillä henkilöillä on pienempi palkka kuin kaikilla helsinkiläisillä (ALL)

Vastaus:
SELECT * FROM henk
WHERE palkka < ALL (
SELECT palkka FROM henk
WHERE kunta = 'HELSINKI') ;

--- toinen vaihtoehto:
SELECT * FROM henk
WHERE palkka <
(SELECT min(palkka) FROM henk
WHERE kunta = 'helsinki')


Tehtävä:
Montako erilaista prioriteetin arvoa on PROJ -taulussa.

Vastaus:
Testaa alla oleva kysely ja tallenna se nimellä PRIORITEETIT
SELECT DISTINCT priorit FROM proj
WHERE priorit is not null;

Käytetään ylläolevaa erikseen tallennettua kyselyä (prioriteetit) tietolähteenä
SELECT Count(*) AS [Erilaisten prioriteettien määrä]
FROM prioriteetit;
--------------- Kirjan mallivastauksen syntaksi Ei toimi Access:ssä ------------
SELECT COUNT(DISTINCT priorit)
FROM proj;


Tehtävä:
Palkka jaettuna henkilön iällä on eräs tunnusluku. Paljonko on kunkin henkilön palkka / ikä
Tulokseen nimi ja tunnusluku.
Lajittele tämän tunnusluvun mukaan LASKEVAAN järjestykseen.

Vastaus:
SELECT snimi, FORMAT(palkka/(1998-svuosi),"####,00") AS TunnusLuku, 
              palkka, (1998-svuosi) as ikä
FROM henk
ORDER BY 2 DESC;

--- parempi olisi:
SELECT snimi, Val(Format([palkka]/(Year(Date())-[svuosi]),"#,#00")) AS TunnusLuku, palkka, Year(Date())-[svuosi] AS Ikä
FROM henk
ORDER BY 2 DESC;


# VERSIO

Muutosten kuvaus:
Tein käyttöliittymään lisäyksen: opiskelija pässee katsomaan sekä mallivastauksen että oman kyselyn lopputuloksen


Muutosten kuvaus:
Muokkasin käyttöliittymää + lisäsin käynnistykseen nk. Splash Screenin


Muutosten kuvaus:
Pientä siistimistä (esim. alussa näkyvä nk. Splash screen), korjattu pikanäppäin Ctrl + F1


