Preuzmite baze podatka sql je to i više Beleške u PDF od Računarstvo i informatika samo na Docsity!
Unošenje podataka
Unos podataka
INSERT INTO FAKULTET(IME_FAK, SJEDISTE) VALUES ('PMF', 'PODGORICA')
INSERT INTO FAKULTET(IME_FAK, SJEDISTE) VALUES ('ETF', NULL)
INSERT INTO FAKULTET(IME_FAK) VALUES ('MTF')
Brisanje podataka
Brisanje podataka
DELETE FROM FAKULTET WHERE IME_FAK ='PMF'
Brisanje svih torki (OPASNO!) DELETE FROM STUDENT
Izmjena podataka (SQL)
Izmjena podataka
UPDATE FAKULTET SET FAKULTET.IME_FAK = 'FIL' WHERE FAKULTET.IME_FAK='PMF'
UPDATE STUDENT SET IME_FAK = 'FIL', GODINA= WHERE IME_FAK='PMF' AND BROJ_INDEKSA='34'
Indeks
- Indeks je struktura podataka koja služi za
efikasniji pristup podacima i sortiranje.
- Nedostatak je što usporava dodavanje i
brisanje zapisa.
- Indeks može biti na jednoj ili više kolona.
- Indeks je naješe neka varijanta B-stabla,
recimo B+-stablo.
UNIQUE indeks
- Unique indeks – ne dozvoljava duplikate
- Kod kreiranja primarnog kljua i unique
constraint-a kreira se unique indeks.
- Podrazumijeva se da nije UNIQUE.
Kreiranje i brisanje indeksa
(SQL)
- Kreiranje i brisanje indeksa (SQL) CREATE UNIQUE INDEX indsjed ON FAKULTET (SJEDISTE ASC)
CREATE INDEX indgod ON STUDENT (GODINA ASC)
DROP INDEX STUDENT.indgod
Klasterisani i neklasterisani
indeks
- CLUSTERED indeks – kod koga redosled zapisa u
listu odgovara fizikom poretku.
- NONCLUSTERED indeks – kod koga redosled
zapisa u listu ne mora odgovarati fizikom poretku.
- Može biti samo jedan CLUSTERED indeks na
tabeli!
- Indeks može biti
- CLUSTERED - NONCLUSTERED
- UNIQUE CLUSTERED - UNIQUE CLUSTERED
Indeks
CREATE UNIQUE CLUSTERED INDEX indstud ON STUDENT (JMBG ASC)
CREATE NONCLUSTERED INDEX indstud ON STUDENT (BRLK, GRAD)
FILLFACTOR, PAD_INDEX
- FILLFACTOR – procenat od 1 do 100
popunjenosti lista.
- Nije dobar ni preveliki i ni premali!
- PAD_INDEX – ako je ukljuena ova opcija,
FILLFACTOR se primjenjuje i na
unutrašnje vorove.
CREATE CLUSTERED INDEX indstud
ON STUDENT (JMBG ASC)
WITH PAD_INDEX, FILLFACTOR = 60
IGNORE_DUP_KEY
- IGNORE_DUP_KEY opcija dozvoljava da
se, kada INSERT reenicom unosimo torke
koje imaju duplikate na indeksnim kolona,
duplikati budu eliminisani. Ako ova opcija
nije postavljena kompletna INSERT
reenica se odbija.
CREATE INDEX indstud
ON STUDENT (JMBG ASC)
WITH IGNORE_DUP_KEY
STATISTICS_NORECOMPUTE
- Da se ne rauna automatski statistika
vezana za indeks.
- Ima smisla samo ako se tabela ne mijenja,
može loše uticati na optimizator upita.
CREATE INDEX indstud
ON STUDENT (JMBG ASC)
WITH STATISTICS_NORECOMPUTE
Indeksi, interaktivno
Is Null, Is not null
- Nai snabdjevae kojima ne znamo grad.
SELECT * FROM SNABDJEVAC WHERE GRAD IS NULL
- Nai snabdjevae kojima znamo grad.
SELECT * FROM SNABDJEVAC WHERE GRAD IS NOT NULL
Between
- Nai šifre i imena snabdjevaa iji je status izmeu 10 i 20.
SELECT * FROM SNABDJEVAC WHERE STATUS>=10 AND STATUS<=
ili
SELECT * FROM SNABDJEVAC WHERE STATUS BETWEEN 10 AND 20
Not Between
- Nai šifre i imena snabdjevaa iji je status ili manji od 10 ili vei od 20.
SELECT * FROM SNABDJEVAC WHERE STATUS<10 OR STATUS>
ili
SELECT * FROM SNABDJEVAC WHERE STATUS NOT BETWEEN 10 AND 20
In
- Nai šifre i imena snabdjevaa iji je status 10 ili 20 ili 30.
SELECT * FROM SNABDJEVAC WHERE STATUS=10 OR STATUS=20 OR STATUS=
ili
SELECT * FROM SNABDJEVAC WHERE STATUS IN (10,20,30)
Not In
- Nai šifre i imena snabdjevaa iji status nije ni 10 ni 20 ni 30. SELECT * FROM SNABDJEVAC WHERE STATUS<>10 AND STATUS<>20 AND STATUS<> ili SELECT * FROM SNABDJEVAC WHERE NOT (STATUS=10 OR STATUS=20 OR STATUS=30) ili SELECT * FROM SNABDJEVAC WHERE STATUS NOT IN (10,20,30)
Like
- Nai imena proizvoda koji poinju slovom P. SELECT P_IME FROM PROIZVOD WHERE P_IME LIKE 'P%' Primjer Ta no Neta no % nula ili više znakova a%a aa, aBa, aBBBa aBC %ab% abc, AABB, Xab aZb, bac ab% abcdefg, abc cab, aab _ Jedan znak a_a aaa, a3a, aBa aBBBa Opseg ili skup znakova [a-z] f, p, j 2, & [fpj] f, p, j 2, & Van opsega ili skupa [^a-z] 9, &, % b, a
Izrazi i ugraene funkcije
SELECT F_NO, KOL*1.
FROM ISPORUKA
SELECT F_NO, KOL*1.3 AS NOVO
FROM ISPORUKA
SELECT SIN(STATUS), LEFT(GRAD,3)
FROM SNABDJEVAC
Order by
SELECT * FROM ISPORUKA ORDER BY S_NO
SELECT * FROM ISPORUKA ORDER BY S_NO, F_NO
SELECT * FROM ISPORUKA ORDER BY S_NO ASC, F_NO DESC
SELECT * FROM ISPORUKA ORDER BY S_NO DESC, F_NO DESC
Agregatne funkcije
- Pravu snagu pokazuju sa grupisanjem.
- 5 osnovnih agregatnih funkcija:
Agregatne funkcije
• SELECT MAX(KOL) FROM ISPORUKA
• SELECT MIN(KOL) FROM ISPORUKA
• SELECT SUM (KOL) FROM ISPORUKA
• SELECT AVG(KOL) FROM ISPORUKA
• SELECT COUNT(*) FROM ISPORUKA
Grupisanje
Položio
121 Hem P1 8 150 Fiz P2 9
100 Fiz P2 10
130 Mat P2 7
100 Mat P1 6
Br_ind Predmet Profesor Ocjena
Grupisano po predmetu
150 Fiz P2 9
121 Hem P1 8
100 Fiz P2 10
130 Mat P2 7
100 Mat P1 6
Upiti sa više tabela
- Nai imena snabdjevaa iz Podgorice koji
imaju bar jednu isporuku.
SELECT S_IME FROM SNABDJEVAC, ISPORUKA WHERE SNABDJEVAC.S_NO=ISPORUKA.S_NO AND SNABDJEVAC.GRAD='Podgorica'
Upiti sa više tabela
- Nai imena snabdjevaa iz Podgorice koji
isporuuju bar jedan crveni proizvod.
SELECT S_IME FROM SNABDJEVAC, ISPORUKA, PROIZVOD WHERE SNABDJEVAC.S_NO=ISPORUKA.S_NO AND PROIZVOD.P_NO=ISPORUKA.P_NO AND SNABDJEVAC.GRAD='Podgorica' AND PROIZVOD.BOJA='Crvena'
Upiti nad više tabela
- Nai imena snabdjevaa iz Podgorice koji isporuuju bar jedan crveni proizvod fabrici iz Beograda.
SELECT S_IME FROM SNABDJEVAC, ISPORUKA, PROIZVOD, FABRIKA WHERE SNABDJEVAC.S_NO=ISPORUKA.S_NO AND PROIZVOD.P_NO=ISPORUKA.P_NO AND FABRIKA.F_NO=ISPORUKA.F_NO AND SNABDJEVAC.GRAD='Podgorica' AND PROIZVOD.BOJA='Crvena' AND FABRIKA.GRAD='Beograd'
INNER JOIN
- Spajanje se može izvesti i samo u FROM dijelu
SELECT S_IME FROM SNABDJEVAC INNER JOIN ISPORUKA ON SNABDJEVAC.S_NO=ISPORUKA.S_NO
SELECT * FROM (SNABDJEVAC INNER JOIN ISPORUKA ON SNABDJEVAC.S_NO=ISPORUKA.S_NO) INNER JOIN FABRIKA ON ISPORUKA.F_NO=FABRIKA.F_NO
INNER JOIN
- Nai imena snabdjevaa iz Podgorice koji isporuuju bar jedan crveni proizvod fabrici iz Beograda.
SELECT S_IME FROM ( (SNABDJEVAC INNER JOIN ISPORUKA ON SNABDJEVAC.S_NO=ISPORUKA.S_NO) INNER JOIN FABRIKA ON ISPORUKA.F_NO=FABRIKA.F_NO) INNER JOIN PROIZVOD ON ISPORUKA.P_NO= PROIZVOD.P_NO WHERE SNABDJEVAC.GRAD='Podgorica' AND PROIZVOD.BOJA='Crvena' AND FABRIKA.GRAD='Beograd'
Spajanje tabele sa sobom
- Nai sve mogue parove (P_IME, P_IME)
SELECT A.P_IME, B.P_IME FROM PROIZVOD A, PROIZVOD B
Upiti nad više tabela sa
grupisanjem
- Nai šifre snabdjevaa kao i broj isporuka
crvenih proizvoda.
SELECT S_NO, COUNT()*
FROM ISPORUKA, PROIZVOD
WHERE PROIZVOD.P_NO=ISPORUKA.P_NO AND PROIZVOD.BOJA='Crvena'
GROUP BY S_NO
OUTER JOIN
- Ukljuuje u rezultat i one koji nisu spojeni,
sa lijeve, desne strane ili obije strane.
SELECT * FROM SNABDJEVAC INNER JOIN PROIZVOD ON SNABDJEVAC.GRAD= PROIZVOD.GRAD
SELECT * FROM SNABDJEVAC LEFT OUTER JOIN PROIZVOD ON SNABDJEVAC.GRAD= PROIZVOD.GRAD
OUTER JOIN
SELECT * FROM SNABDJEVAC RIGHT OUTER JOIN PROIZVOD ON SNABDJEVAC.GRAD= PROIZVOD.GRAD
SELECT * FROM SNABDJEVAC FULL OUTER JOIN PROIZVOD ON SNABDJEVAC.GRAD= PROIZVOD.GRAD
Podupiti
- To su SELECT upiti unutar drugog upita
- Postoje dvije vrste podupita
- Nevezani podupiti (oni koji se raunaju nezavisno od spoljašnjeg upita)
- Vezani podupiti
Podupiti kao konstante
Podupit koji vraa jednu vrijednost se može koristiti svuda gdje i konstanta! Ispisati podatke o snabdjevaima uz informaciju o ukupnom broju isporuka SELECT , (SELECT COUNT() FROM ISPORUKA) AS BR_ISPORUKA FROM SNABDJEVAC
Ispisati podatke o snabdjevaima uz informaciju o ukupnom broju njihovih isporuka
SELECT , (SELECT COUNT() FROM ISPORUKA WHERE ISPORUKA.S_NO=SNABDJEVAC.S_NO) AS BR_ISPORUKA FROM SNABDJEVAC
Podupiti kao konstante
Nai one proizvode ijih je isporuka više nego 1/5 ukupnog broja isporuka
SELECT ISPORUKA.P_NO, COUNT() FROM ISPORUKA GROUP BY P_NO HAVING COUNT() > (SELECT COUNT(*) FROM ISPORUKA)/
- ovako mogu da se koriste podupiti koji vraaju tano jednu vrijednost!!!
Podupit EXISTS
- Nai one snabdjevae koji isporuuju bar nešto.
SELECT * FROM SNABDJEVAC WHERE EXISTS (SELECT * FROM ISPORUKA WHERE SNABDJEVAC.S_NO= ISPORUKA.S_NO)
Podupit NOT EXISTS
- Nai šifre onih snabdjevaa koji isporuuju sve crvene proizvode. SELECT ISPORUKA.S_NO FROM ISPORUKA WHERE NOT EXISTS (SELECT P_NO FROM PROIZVOD WHERE BOJA='Crvena' AND NOT EXISTS (SELECT * FROM ISPORUKA X WHERE X.S_NO= ISPORUKA.S_NO AND X.P_NO= PROIZVOD.P_NO) )
SLOŽENIJI INSERT
- INSERT INTO može da bude sa podupitom
INSERT INTO SNABDJEVAC(S_NO, S_IME, STATUS, GRAD)
SELECT S_NO+'d', S_IME, STATUS, GRAD FROM SNABDJEVAC
SELECT - INTO
- Kreiranje tabele pomou SELECT upita
- SELECT * INTO POMOCNA FROM
SNABDJEVAC
Složeniji UPDATE
- ALTER TABLE ISPORUKA ADD IME_SNAB VARCHAR(20)
- UPDATE ISPORUKA SET IME_SNAB = SNABDJEVAC.S_IME FROM SNABDJEVAC WHERE SNABDJEVAC.S_NO= ISPORUKA.S_NO
- UPDATE ISPORUKA SET IME_SNAB = (SELECT SNABDJEVAC.S_IME FROM SNABDJEVAC WHERE SNABDJEVAC.S_NO= ISPORUKA.S_NO) WHERE ISPORUKA.KOL>
SLOŽENIJI DELETE
- DELETE FROM POMOCNA FROM SNABDJEVAC WHERE SNABDJEVAC.S_NO= POMOCNA.S_NO
- DELETE FROM POMOCNA WHERE EXISTS(SELECT * FROM SNABDJEVAC WHERE SNABDJEVAC.S_NO= POMOCNA.S_NO)