Both sides previous revisionPrevious revision | |
sql [2023/09/27 10:05] – katarina | sql [2023/11/27 10:25] (current) – external edit 127.0.0.1 |
---|
====SQL==== | ====SQL==== |
**SQL (Structured Query Language)** je programski jezik koji se koristi za spremanje i procesuiranje informacija u relacijskim bazama podataka. Relacijske baze podataka pohranjuju podatke u tablicama, gdje su redovi tablice N-torke (1 redak = 1 relacija), dok su stupci atributi relacija koje sve relacije u tablici posjeduju. | **SQL (Structured Query Language)** je jezik koji se koristi za spremanje i procesiranje informacija u relacijskim bazama podataka. Relacijske baze podataka pohranjuju podatke u tablicama, gdje su redovi tablice n-torke (1 redak - 1 relacija), dok su stupci atributi koje sve relacije u tablici posjeduju. \\ |
{{ ::sql_example_table.png?nolink&600 |Slika 1 - Primjer SQL baze podataka}} | Pretpostavimo da u bazi podataka postoji tablica Korisnici: \\ |
| |
Kada neki sustav ili web server mora pohranjivati veću količinu strukturiranih informacija, tada je prikladno koristiti relacijske baze podataka za pohranu i upravljanje željenim podatcima te se pomoću SQL upita dohvaćaju tražene informacije iz baze podataka, na primjer, korisnik je na Njuškalu zatražio prikaz svih stanova za kupnju s cijenom između dvjesto i tristo tisuća eura u Rijeci. Tada sustav zaprima zahtjev za dohvat svih relacija tipa stan s traženim atributima iz baze podataka sustava te zahtjev pretvara u SQL upit koji izvršava nad bazom podataka i dohvaćene informacije prosljeđuje nazad korisniku. | ^KorisnikID ^Prezime ^Ime ^Adresa ^Grad ^ |
| |1 | Anić | Ana | Branimirova 5 | Zagreb | |
| |2 | Markić | Marko | Ulica J.J. Strossmayera 6 | Osijek | |
| |3 | Larić | Lara | Ilica 15 | Zagreb | |
| |4 | Ivić | Ivo | Kalelarga 3 | Zadar | |
| |5 | Ivić | Ivo | Laginjina 7 | Zagreb | |
| |
Unutar iste baze podataka se često nalaze i podatci namijenjeni korisnicima, kao i važni podatci koje bi jedino administratori baza i drugi entiteti viših razina prava smjeli vidjeti i mijenjati. Isto tako neki podatci se smiju prikazivati korisnicima, ali se nikako ne smiju mijenjati od strane korisnika. Na primjer, u slučaju baze podataka jedne banke, svaki korisnik smije vidjeti samo stanje svojeg računa, te to isto stanje ne smije proizvoljno mijenjati,svojevoljnom promjenom vrijednosti u bazi podataka. Da bi se postavljena pravila održala, važno je adekvatno ograničiti mogućnosti i akcije korisnika različitih razina privilegija. Problemi nastaju kada su ova ograničenja neadekvatno implementirana, odnosno kada postoje načini za izvršenje nedozvoljenih akcija od strane korisnika bez adekvatnih privilegija. | |
\\ | |
\\ | \\ |
===SQL upiti=== | ===SQL upiti=== |
**SQL upiti** (eng. **queries**) su strukturirane i sintaksno ispravne SQL naredbe koje se šalju menadžeru relacijskih baza podataka i koji se od strane menadžera izvršavaju nad željenom bazom podataka radi dohvata, izmjene ili stvaranja novih podataka unutar baze podataka. SQL podržava četiri osnovne operacije nad podatcima, to su stvaranje, čitanje, izmjena i brisanje te njihovi ekvivalentni SQL izrazi: INSERT, SELECT, UPDATE i DELETE. Svaka operacija se izvršava nad jednom tablicom ili skupom tablica, što se unutar upita odabire naredbom FROM. Željena akcija se može dodatno specificirati nad skup relacija unutar tablice ili skupa tablica naredbom WHERE <uvjet>. Tablice nad kojima se vrše željene akcije se mogu na različite načine spajati naredbama kao što su UNION i JOIN. | **SQL upiti** (eng. //queries//) strukturirane su SQL naredbe kojima se upravlja podatcima relacijske baze podataka. Izvršavaju se radi dohvata, izmjene ili stvaranja novih podataka. SQL podržava četiri osnovne operacije nad podatcima, a to su čitanje (SELECT), izmjena (UPDATE), stvaranje (INSERT), i brisanje (DELETE). Ime operacije piše se odmah na početku upita. Svaka se operacija može izvršiti nad jednom ili više tablica unutar iste baze podataka. Zato se nakon odabira željene operacije u upitu dodaje naredba FROM u kojoj navodimo točno nad kojim tablicama izvodimo upit. Ako ne želimo izvesti upit nad cijelom tablicom, već samo nad nekim podatcima koji zadovoljavaju određeni uvjet, tad koristimo naredbu WHERE <uvjet>. Uvjeta može biti proizvoljno mnogo, a međusobno ih povezujemo logičkim operatorima (AND, OR).\\ |
| |
**__PRIMJER__ - SQL upit nad tablicom sa slike 1** | SQL je //case-insensitive//, dakle velika i mala slova interpretiraju se jednako (osim u znakovnim nizovima). Uobičajena je praksa pisati ključne riječi velikim slovima, a imena atributa malim slovima ili velikim početnim slovom. |
| \\ |
| \\ |
| \\ |
| **SELECT** naredba koristi se za dohvat podataka iz tablice bez njihovog mijenjanja. Odaberimo korisnike koji se zovu "Ivo" i prezivaju "Ivić". Oznaka za sve podatke je *. |
<code sql> | <code sql> |
SELECT Ime, Prezime FROM Korisnici WHERE Grad = "Zagreb" | SELECT * FROM Korisnici |
| WHERE Ime = "Ivo" AND Prezime="Ivić" |
</code> | </code> |
{{ ::sql_query_res.png?nolink&600 |}} | |
| Dobili smo: |
| |
| ^KorisnikID ^Prezime ^Ime ^Adresa ^Grad ^ |
| |4 | Ivić | Ivo | Kalelarga 3 | Zadar | |
| |5 | Ivić | Ivo | Laginjina 7 | Zagreb | |
| |
| Možemo odabrati i samo pojedinačne podatke. Primjerice, odaberimo samo imena i prezimena ljudi koji žive u Zagrebu. |
| <code sql> |
| SELECT Ime, Prezime |
| FROM Korisnici |
| WHERE Grad = "Zagreb" |
| </code> |
| |
| Rezultat izgleda ovako: |
| |
| ^Ime ^Prezime ^ |
| | Anić | Ana | |
| | Larić | Lara | |
| | Ivo | Ivić | |
| |
| Primijetimo da su se podatci naveli onim redom kojim su zadani u upitu, a ne onim kojim su u tablici. |
| \\ |
| \\ |
| \\ |
| **UPDATE** naredba koristi se kad želimo izmijeniti određeni podatak u tablici. Primjerice, promijenimo adresu Ane Anić u Branimirova 50. |
| <code sql> |
| UPDATE Korisnici |
| SET adresa = "Branimirova 50" |
| WHERE KorisnikID = 1 ; |
| </code> |
| Primijetimo oznaku kraja naredbe (;). Naravno, mogli smo staviti i bilo koji drugi uvjet koji ta n-torka zadovoljava (po imenu, prezimenu, adresi...), no uobičajeno je koristiti ID jer je on u pravilu nepromjenjiv. |
| |
| Izvršenjem gornje naredbe je prethodna n-torka (u kojoj je Anina adresa bila Branimirova 5) prebrisana ovom:\\ |
| |1 | Anić | Ana | Branimirova 50 | Zagreb |\\ |
| \\ |
| \\ |
| \\ |
| **INSERT** naredba koristi se za umetanje novih podataka u tablicu. Ako želimo unijeti novog korisnika, to ćemo napraviti na ovaj način: |
| <code sql> |
| INSERT INTO Korisnici VALUES |
| ('6', 'Marić', 'Marija', 'Ulica Ivana pl. Zajca 2', 'Split'); |
| </code> |
| Naravno, u stvarnosti se ID nikada ne unosi direktno, već je zadatak baze podataka da generira jedinstven identifikator za svaki nov podatak. Ako nakon ove naredbe izvedemo |
| <code sql> |
| SELECT * from Korisnici |
| </code> |
| Dobili smo: |
| ^KorisnikID ^Prezime ^Ime ^Adresa ^Grad ^ |
| |1 | Anić | Ana | Branimirova 5 | Zagreb | |
| |2 | Markić | Marko | Ulica J.J. Strossmayera 6 | Osijek | |
| |3 | Larić | Lara | Ilica 15 | Zagreb | |
| |4 | Ivićo | Ivo | Kalelarga 3 | Zadar | |
| |5 | Ivić | Ivo | Laginjina 7 | Zagreb | |
| |6 | Marić | Marija | Ulica Ivana pl. Zajca 2 | Split | |
| \\ |
| \\ |
| \\ |
| **DELETE** naredba koristi se za brisanje određene relacije. Recimo da želimo obrisati n-torku za Laru Larić. To ćemo izvesti na ovaj način: |
| <code sql> |
| DELETE FROM Korisnici |
| WHERE Ime = 'Lara' AND PREZIME = 'Laric' ; |
| </code> |
| |
| |
| Unutar baze podataka nalaze se podatci namijenjeni korisnicima, ali s njima su i osjetljivi podatci kojima bi samo administratori baza i drugi entiteti viših razina prava trebali imati pristup. Isto tako, neke podatke korisnik smije samo čitati, ali ih nikako se ne smije mijenjati. Uzmimo za primjer bazu podataka neke banke. Svaki korisnik smije vidjeti stanje samo svojeg svojeg računa, a ostalima ne bi smio imati pristup. Administrator baze podataka smije vidjeti stanja računa svih korisnika. Niti korisnik banke niti administrator ne smiju mijenjati stanje računa. Zato baze podataka implementiraju različita ograničenja kojima će spriječiti da korisnik radi nedozvoljene akcije. Ne smijemo se pouzdati u to da korisnici baze podataka neće pokušati napraviti nešto nedozvoljeno, već baza mora imati implementirana dovoljno stroga ograničenja koja će prepoznati i spriječiti svaki pokušaj neovlaštene akcije. |
| |
===Izvori=== | ===Izvori=== |