IV praktikum Päringud - utSELECT eesnimi, perenimi, klubi, klubi.id, klubi.nimi FROM isik, klubi...
Transcript of IV praktikum Päringud - utSELECT eesnimi, perenimi, klubi, klubi.id, klubi.nimi FROM isik, klubi...
Andmebaasid
IV praktikum
Päringud
PÄRINGUD
SELECT
SELECT [DISTINCT]
{<veeruavaldised>}
FROM {<tabelid>}
[WHERE {<piirangud>}]
[GROUP BY {<veerud>}
[HAVING {<tingimus>}]]
[ORDER BY {<veerud>}];
SELECT eesnimi, perenimi
FROM isik;
Arvo Mets
Maari Mustikas
Pjotr Pustota
Kalle Kivine
Malle Maasikas
Linda Sammal
Arvo Angervaks
Andrei Sosnov
Helina Hiis
Henno Hiis
Irys Sisalik
Maria Murakas
Maria Medvedovna
Ilona Polje
Liis Metsonen
Taivo Remmelgas
Anna Ristik
Mihkel Maakamar
Artur Muld
Urmas Ubin
Jelena Pirn
Toomas Umnik
Nadja Puhasmaa
SELECT * FROM isik;
DISTINCT
SELECT DISTINCT eesnimi FROM isik;
SELECT DISTINCT eesnimi, perenimi
FROM isik ; ??
Arvo
Maari
Pjotr
Kalle
Malle
Linda
Andrei
Helina
Henno
Irys
Maria
Ilona
Liis
Taivo
Anna
Mihkel
Artur
Urmas
Jelena
Toomas
Nadja
SELECT DISTINCT klubi FROM isik;
51
54
59
57
58
55
Avaldised
Veerud
Konstandid
Lihtoperatsioonid (liitmine, järjest kirjutamine, ..)
Funktsioonid
Agregeerivad funktsioonid
Konstandid
SELECT nimi, 0, CURRENT DATE, NULL FROM klubi;
Musta kivi kummardajad 0 2014-10-21 null
Võitmatu Valge 0 2014-10-21 null
Ruudu Liine 0 2014-10-21 null
Laudnikud 0 2014-10-21 null
Ajurebend 0 2014-10-21 null
Valge Mask 0 2014-10-21 null
Operaatorid
SELECT perenimi || ', ' || eesnimi, klubi + id
FROM isik;
Angervaks, Arvo 136
Sosnov, Andrei 137
Hiis, Helina 134
Hiis, Henno 135
Sisalik, Irys 132
Murakas, Maria 136
……..
IF operaator
SELECT IF eesnimi='Maria' THEN
'***' ELSE eesnimi ENDIF,
perenimi FROM isik;
Arvo Mets
Maari Mustikas
Pjotr Pustota
Kalle Kivine
Malle Maasikas
Linda Sammal
Arvo Angervaks
Andrei Sosnov
Helina Hiis
Henno Hiis
Irys Sisalik
*** Murakas
*** Medvedovna
Ilona Polje
Liis Metsonen
Taivo Remmelgas
Anna Ristik
Mihkel Maakamar
Artur Muld
Urmas Ubin
Jelena Pirn
Toomas Umnik
Nadja Puhasmaa
Funktsioonid
SELECT
LEFT(eesnimi,1),
SUBSTRING(perenimi, 2, 4),
YEAR(CURRENT DATE)
FROM isik;
A ets 2014
M usti 2014
P usto 2014
K ivin 2014
M aasi 2014
L amma 2014
A nger 2014
A osno 2014
H iis 2014
H iis 2014
I isal 2014
M urak 2014
M edve 2014
I olje 2014
L etso 2014
T emme 2014
A isti 2014
M aaka 2014
A uld 2014
U bin 2014
J irn 2014
T mnik 2014
N uhas 2014
Agregeerivad funktsioonid
Count(*),
Count(distinct <veerg>)
Max(<avaldis>),
Min(<avaldis>)
Sum(<avaldis>)
NB! Ei saa kasutada niisama lihtsalt segiläbi
mitteagregeeritavate avaldistega!
SELECT eesnimi, COUNT(*) FROM isik; → VIGANE!
Agregeerivate f-nide näited
SELECT COUNT(*) FROM isik;
SELECT COUNT(DISTINCT eesnimi) FROM isik;
SELECT MIN(klubi), MAX(klubi) FROM isik;
SELECT MAX(eesnimi), MIN(perenimi) FROM isik;
SELECT AVG(klubi), SUM(IF klubi<id THEN klubi
ELSE id ENDIF) FROM isik;
Tulemustabeli veergude
nimed
SELECT perenimi || ', ' || eesnimi AS nimi FROM isik;
SELECT COUNT(*) AS arv FROM isik;
AS
Piiramine
WHERE {<loogiline avaldis>}
Loogiline avaldis:
[NOT] <avaldis> <operaator> <avaldis> |
<loogiline avaldis> [AND|OR] <loog.avald>
Operaatorid:
=, <, >, <> (!=) , ...., LIKE, IS, IN, BETWEEN,
...
SELECT * FROM isik WHERE klubi=55 OR klubi=57;
SELECT * FROM isik WHERE klubi IN (55,57);
SELECT * FROM isik WHERE klubi BETWEEN 55 AND 57;
SELECT * FROM isik WHERE isikukood IS NULL;
LIKE operaator
SELECT * FROM isik WHERE eesnimi LIKE 'm%';
SELECT * FROM isik WHERE eesnimi LIKE '_alle';
SELECT * FROM isik WHERE eesnimi LIKE
'a__[aeiouõäöü]%';
SELECT * FROM isik WHERE id LIKE '[8-9][1,3-4]';
LIKE ohud
SELECT * FROM klubi WHERE nimi LIKE 'valge mask';
SELECT * FROM klubi WHERE nimi = 'valge mask';
Viimasel juhul kasutatakse indeksit (kiirem)!
Alampäringud
SELECT * FROM turniir
WHERE EXISTS (SELECT * FROM partii WHERE
partii.turniir = turniir.id AND (valge = 72 OR must = 72));
Järjestamine
... ORDER BY <veerud> [ASC | DESC]
SELECT eesnimi FROM isik ORDER BY eesnimi ASC
SELECT eesnimi FROM isik ORDER BY eesnimi DESC
SELECT eesnimi, perenimi FROM isik ORDER BY perenimi, eesnimi;
SELECT eesnimi, perenimi FROM isik ORDER BY 2, 1;
Mitme tabeli sidumine
päringusse
... FROM <tabel1> [[AS] <alias1>], <tabel2>...
SELECT eesnimi, perenimi, klubi, klubi.id, klubi.nimi
FROM isik, klubi WHERE perenimi = 'Hiis';
Helina Hiis 55 59 Musta kivi kummardajad
Helina Hiis 55 57 Võitmatu Valge
Helina Hiis 55 55 Ruudu Liine
Helina Hiis 55 51 Laudnikud
Helina Hiis 55 54 Ajurebend
Helina Hiis 55 58 Valge Mask
Henno Hiis 55 59 Musta kivi kummardajad
Henno Hiis 55 57 Võitmatu Valge
Henno Hiis 55 55 Ruudu Liine
Henno Hiis 55 51 Laudnikud
Henno Hiis 55 54 Ajurebend
Henno Hiis 55 58 Valge Mask
SELECT eesnimi, perenimi, klubi, klubi.id,
klubi.nimi FROM isik, klubi WHERE perenimi = 'Hiis'
AND isik.klubi = klubi.id;
Helina Hiis 55 55 Ruudu Liine
Henno Hiis 55 55 Ruudu Liine
WHERE vs JOIN
...FROM isik JOIN klubi ON isik.klubi = klubi.id
WHERE perenimi = 'Hiis';
...FROM isik KEY JOIN klubi WHERE perenimi = 'Hiis';
AGA, kui on mitu välisvõtit samasse tabelisse:
SELECT * FROM isik KEY JOIN partii; – VIGANE!
“Loomulik side”
ABS otsib sarnaste nimedega veerge:
SELECT * FROM isik NATURAL JOIN klubi;
Toimub sidumine isik.id = klubi.id
Kes mängisid valgetega ja võitsid:
SELECT DISTINCT eesnimi, perenimi, valge_tulemus FROM
isik JOIN partii ON isik.id=partii.valge AND valge_tulemus=2;
Aga lisaks kõik teised isikud:
SELECT DISTINCT eesnimi, perenimi, valge_tulemus FROM
isik LEFT OUTER JOIN partii ON isik.id=partii.valge AND
valge_tulemus=2;
OUTER JOIN mured
Aeglane
Süntaks ebakindel (eri tootjatel eri arusaam)
Link OUTER JOIN Sybase arusaam OUTER JOIN
Tulemuses võib iga väli olla NULL
Grupeerimine
SELECT turniir, COUNT(*) FROM partii GROUP BY
turniir;
41 25
42 83
SELECT turniir.nimi, COUNT(*) FROM turniir, partii
WHERE turniir.id=partii.turniir GROUP BY turniir.nimi;
või
SELECT nimi, COUNT(*) FROM turniir KEY JOIN partii
GROUP BY nimi;
Kui palju on sama tähega algavaid perenimesid:
SELECT LEFT(perenimi,1) AS pn,
COUNT(*) AS arv FROM isik GROUP BY pn
ORDER BY arv DESC, pn ASC;
M 8
P 4
S 3
H 2
R 2
U 2
A 1
K 1
Palju on klubides liikmeid:
SELECT klubi.nimi, COUNT(*) FROM klubi KEY
JOIN
isik GROUP BY klubi.nimi ORDER BY klubi.nimi;
Ajurebend 4
Laudnikud 3
Musta kivi kummardajad 4
Ruudu Liine 3
Valge Mask 5
Võitmatu Valge 4
Piirang grupile - HAVING
Piirang agregeeritud väärtusele
Milliseid eesnimesid on rohkem kui 1:
SELECT eesnimi, COUNT(*) AS arv FROM isik
GROUP BY eesnimi HAVING arv > 1;
Maria 2
Arvo 2
Mitu päringut - üks tulemus
SELECT <päring1>
UNION [ALL] SELECT <päring2> ...
[ORDER BY <järjestus>]
Päringud on ilma ORDER BY’ta!
Päringute SELECT-osa struktuur peab olema samasugune!
Väärtused kordusteta, kui tahate kõiki -> ALL
Mitu päringut - üks tulemus (Näide)
SELECT LEFT(perenimi,1), COUNT(*),'p' FROM isik
GROUP BY LEFT(perenimi,1)
UNION ALL
SELECT LEFT(eesnimi,1), COUNT(*),'e' FROM isik
GROUP BY LEFT(eesnimi,1)
ORDER BY 2 DESC, 1;
Millist tähte kasutatakse enam nime alguses?
Vaadelda nii pere- kui ka eesnimesid. Järjestada tulemus
– nime algustäht, esinemiste arv ja ‘p’ või ‘e’ (perenimi /
eesnimi) mitte kasvavalt korduste arvu järgi.
Ülesanne nr 4
Seletuseks järgnevatele ülesannetele:
• Info saada ühe päringuga.
• Konstante, mida küsimuses pole küsitud, mitte kasutada.
• Visuaalset vaatlemist mitte kasutada!
• Päring peab andma täpse tulemuse.
• Kirjutage enda jaoks päringud üles!
1. Leida klubi ‘Laudnikud’ liikmete nimekiri (eesnimi, perenimi) tähestiku
järjekorras.
2. Leida klubi ‘Laudnikud’ liikmete arv.
3. Leida V-tähega algavate klubide M-tähega algavate eesnimedega isikute
perekonnanimed (ja ei muud).
4. Leida kõige esimesena alanud partii algusaeg.
5. Leida partiide mängijad (valge ja must), mis algasid 04. märtsil ajavahemikus
9:00 kuni 11:00.
6. Leida valgetega võitnute (valge_tulemus=2) nimed (eesnimi, perenimi), kus
partii kestis 9 kuni 11 minutit (vt funktsiooni datediff()).
7. Leida rohkem kui 1 kord esinevad perekonnanimed (ja ei muud).
8. Leida klubid, kus on alla 4 liikme.
9. Leida kõigi Arvode poolt valgetega mängitud partiide arv.
10. Leida kõigi Arvode poolt valgetega mängitud partiide arv turniiride lõikes.
11. Leida kõigi Mariade mustadega mängitud mängudest saadud punktide arv
(tulemus = 2 on võit ja annab 1 punkti, tulemus = 1 on viik ja annab pool punkti).
12. Leida partiide keskmine kestvus turniiride kaupa (tulemuseks on tabel 2
veeruga: turniiri nimi, keskmine partii pikkus)