Razširjeni select stavek
Iz E-študij, proste zakladnice študentskega znanja
Vaje:05.12.2005
RAZŠIRJENI SELECT STAVEK
SELECT [DISTINCT|ALL] seznam_atributov FROM tabele ali poizvedbe iz imenom WHERE logični pogoj GROUP BY seznam_atributov HAVING pogoj, ki ga izpolnujejo skupine ORDER BY atribut [ASC|DESC] ;ASC = naraščajoče; DESC = padajoče
Razlike med WHERE in HAVING
[ ] } [ ] } S1 [ P ] } [ ] } [ ] } [ ] } S2
[ ] } [ ] } [ P' ] } [ ] } [ ] } S3
P' = negacija Pja (ne izpolnuje pogoj)
1. Za vsako mesto izpišite najnižji procent provizije, ki ga ima nek agent iz tega mesta.
' izpiše samo procent
SELECT MIN(procent)
FROM agent
GROUP BY mesto;
' izpiše mesto in procent SELECT mesto, MIN(procent) FROM agent GROUP BY mesto;
2. Isto kot prej. Za vsako mesto razen Ljubljene.
SELECT mesto, MIN(procent)
FROM agent
GROUP BY mesto
HAVING mesto <> 'Ljubljana';
ali
SELECT mesto, MIN(procent) FROM agent GROUP BY mesto HAVING mesto NOT IN 'Ljubljana';
Opomba; HAVING - Lahko se uporablja skupinske atribute!
3. za vsak izdelek izpišite koliko krat je bil naročen!
SELECT iid, COUNT(*)
FROM narocilo
GROUP BY iid;
Opomba: * da izbereš vse podatke ozrioma vse vrstice;
4. Izpišite imena tistih mest v katerih živita vsaj po dva agenta.
SELECT mesto FROM agent GROUP BY mesto HAVING COUNT(aid) >= 2 ORDER BY mesto;
ali
SELECT mesto FROM agent GROUP BY mesto HAVING COUNT(aid) >= 2 ORDER BY mesto ASC;
Opomba: Ne mešat skupinske atribute in tiste normalne!!! Skupina kot celota.
POGLEDI (VIEW)
Sintaksa: CREATE VIEW ime_pogleda [(imena_atributov)] AS SELECT ...
Opomba: Imena št v (imena_atributov) mora biti enako ... v rezultatu! Priporočeno je da v SELECT stavku atribute, ki so podvojeni preimenuje!
Pogled lahko uničemo tako da ga zavrnemo:
DROP VIEW ime_pogleda;
CREATE VIEW vnarocilo AS -- narecimo pogled
SELECT *
FROM stranka s, agent a, izdelek i, narocilo n -- kartezičen produkt
WHERE s.sid=n.sid AND a.aid=n.aid AND i.iid=n.iid; -- izbedba stika med temi tabelami
CREATE VIEW vnarocilo SELECT s.sid, s.ime AS 'sime', s.mesto AS 'smesto', a.aid,a.ime AS 'aime', a.mesto AS 'amesto', i.iid, i.ime AS 'iime',i.mesto AS 'imesto', i.zaloga, i.cena, n.nid,n.mesto,n.kosov,n.koncna_cena;
Opomba: Morda ni pravilno kaj prepisalo (ta zadnji CREATE VIEW).
CREATE MATERIALIZE VIEW
Za materialni view!
INDEKSIRANJE
To nam pride prav predvsem za iskanje.
Z drevesnim indeksi lahko zmanjšamo same indekse!?!? Drevo optimalno dela če je pravilno uravnoteženo (predstavlji si drevo) - logaritmična
Če se tabele pogosto spreminjano naj se nebi splačalo INDEKSIRANJE.
Če gre za manjšo tabelo se tudi ne splača INDEKSIRANJE.
Sintaksa:
CREATE [UNIQUE] INDEX ime_indeksa
ON ime_Tabele (eznam_atributov);
Opomba: UNIQUE - določa (pričakuje) enolične vrednosti
Kako indekse uporabljamo? Ko mi uporabimo tabelo se ta indeks avtomatično uporabi, če je to smisenlo ali je to potrebno.
Ko se nekega indeksa naveličamo. Za brisanje, odstranjevanje!
Sintaksa:
DROP INDEX ime_indeksa;
Vrnimo se k tabeli naročila... Pogosto povezuje stranke, agente in izdelke. Ključ te tabele je ŠIFRA tabele. Do šifre mi nikoli ne dostopamo. Dostopamo pa do teh atributih zato bi bilo smisenlo te tri atribute indeksirati!
CREATE INDEX narocilo_index ON narocilo (sid,aid,iid);
Vprašanje je? Ali se dejansko splača?
To je boljše! Pohitri dostop! CREATE INDEX index_narocilo_sid ON narocilo (sid);
Kako je z pogledi in indeksi? Pogledi se ne morejo indeksirati. Indeksiramo po atributih po katerih se primerja poizvedba.