SQL tutorial by snoop

SQL tutorial by snoop

offline
  • m4rk0  Male
  • Administrator
  • Administrator tech foruma
  • Marko Vasić
  • Gladijator - Maximus Decimus Meridius
  • Pridružio: 14 Jan 2005
  • Poruke: 15766
  • Gde živiš: Majur (Colosseum)

0. lekcija - baza podataka i SQL jezik - http://www.mycity.rs/phpbb/viewtopic.php?t=8457
1. lekcija - kreiranje tabele - http://www.mycity.rs/phpbb/viewtopic.php?t=8542
2. lekcija - Insert - http://www.mycity.rs/phpbb/viewtopic.php?t=12734
3. lekcija - Select - http://www.mycity.rs/phpbb/viewtopic.php?t=13077
4. lekcija - Where - http://www.mycity.rs/phpbb/viewtopic.php?p=182401
5. lekcija - Update - http://www.mycity.rs/phpbb/viewtopic.php?t=17511
6. lekcija - Delete - http://www.mycity.rs/phpbb/viewtopic.php?t=17512

A.
Appendix 1 - Advanced SQL-ing - http://www.mycity.rs/phpbb/viewtopic.php?t=17513




0. lekcija - baza podataka i SQL jezik


Baza podataka sluzi da skladisti zeljene podatke, da te podatke organizuje po tabelama, i da ih zatim jednostavno i brzo dostavi 'klijentu' koji trazi te podatke...

Verovatno se pitate kako sve to funkcionise...

Postoji na jednoj strani server [gde se cuvaju podaci] - i postoji na drugoj strani klijent [koji trazi podatke od servera].

Komunikacija izmedju klijenta i servera se odvija SQL jezikom!
SQL sintaksa je veoma jednostavna, i razumljiva.
Dakle, klijent posalje 'upit' serveru - i server posalje klijentu odgovor - tj. zeljene podatke iz baze.

Evo jednog najprostijeg primera SQL upita [to se takodje zove i SQL query, ili samo query] :
SELECT ime FROM tabela_korisnici WHERE prezime='Stojkovic';
Server ce vratiti podatak klijentu:
Predrag

Tako sve to funkcionise...
Klijent trazi, ili salje, podatke... server obradi zahtev, i posalje odgovor klijentu...

--------

SQL se uglavnom primenjuje u programskim jezicima.
Dakle, program trazi/salje podatke serveru, server obradi zahtev, i vrati rezultat programu.
To je i svrha baza podataka, da brzo i efikasno skladisti podatke i radi sa njima.

U svakom programskom jeziku postoje funkcije/klase/komponente za povezivanje sa SQL bazom.
Ako vam treba pomoc oko povezivanja - napisite ovde u kom programskom jeziku programirate, i koju SQL bazu koristite, pa cemo pokusati da resimo vas problem.

-------

Ja cu da radim po MySQL sintaksi, posto to jedino i poznajem..
SQL sintakse se u principu ne razlikuju mnogo, tako da ce 99% toga raditi na svim SQL bazama.

Ako na svom racunaru nemate ni jednu bazu - instalirajte MySQL [linux korisnici to imaju] - http://dev.mysql.com/downloads/mysql/4.1.html
Uputstvo za instalaciju - http://www.mycity.rs/phpbb/viewtopic.php?t=57
Bilo je dosta reci o MySQL instalaciji - tako da mozete pogledati ovaj forum [i eventualno PHP forum].
Ako imate problema sa instalacijom, prijavite ih odmah... mada nije neophodno da imate instaliranu bazu... mozete i samo ovako teorijski da ucite, ali je ipak preporucljivo da sve to imate, i sami experimentisete, i sami radite sa bazom podataka [kada dovoljno naucite]...
Pa da posle krenemo sa prvom lekcijom...

-------

O SQL jeziku i sintaksi - u sledecoj lekciji!

--------

Navigation
----------------------------------
prev | next




1. lekcija - kreiranje tabele


1) Organizacija podataka

Baza podataka se sastoji iz [vise] tabela...
Dakle, podaci su u bazi organizovani po tabelama [a jedna baza moze imati mnogo tabela]

Same tabele sadrze podatke... u pitanju su obicne dvodimenzionalne tabele...
Na vrhu su polja [kolone]... (na primer: Ime, Prezime, Godiste...) a na dole se redjaju podaci...

Primer:
tabela1 : -------------------------------------------- |  Ime       |  Prezime       |  Godiste   | -------------------------------------------- | Predrag    |  Stojkovic   |  83        | | Petar      |  Petrovcic     |  84        | | Jasmina    |  Nikolic       |  80        | --------------------------------------------

--------------------------------------------------------------

2) Tipovi polja

Polja [kolone] imaju svoj 'tip', tako da se tacno zna koji tip podataka moze da ide u koje polje.
Na primer... u polju 'Godiste' moze da se upise samo broj... ne moze tekst... jer je polje predvidjeno samo za brojcane vrednosti.

Najcesce korisceni tipovi su (MySQL):
INT - za brojeve
REAL - za brojeve sa decimalama
CHAR - za samo jedan karakter
VARCHAR - za vise karaktera (do 255), s tim sto se navede broj karaktera za polje, recimo - VARCHAR(30)
TINYTEXT - za tekst do 256 karaktera
TEXT - za tekst do 65.000 karaktera
BLOB - za 'binarni' sadrzaj [do 65k bajta]...
MEDIUMTEXT, MEDIUMBLOB, BIGTEXT, BIGBLOB - sve isto, samo su polja veca...
DATE - za datume
TIME - za vreme...

Ako bismo hteli da kreiramo onu gore tabelu, iz primera... polja bi bila ovako 'organizovana' :
Ime - bilo bi tipa TINYTEXT, ili eventualno VARCHAR(20) ako bi smo hteli da ustedimo prostor, posto ne postoje imena duza od 20 slova
Prezime - isto kao i za Ime, TINYTEXT, ili VARCHAR(20)
Godiste - tu cemo staviti INT, posto se upisuju samo brojcane vrednosti

Za Access korisnike: umesto INT staviti NUMBER, i umesto TINYTEXT staviti STRING

---------------------------------------------------------------

3) Kreiranje tabele

Kao sto smo rekli u prethodnoj lekciji... sve operacije sa bazom se obavljaju SQL komandama...
Komanda za kreiranje tabele je CREATE TABLE.

SQL query, koji trebamo da posaljemo serveru, da bi kreirali bazu, je :
CREATE TABLE tabela1 ( ime VARCHAR(20), prezime VARCHAR(20), godiste INT );

Server ce naravno poslati odgovor da je tabela "tabela1" uspesno kreirana...

Za one koji zele jos neke sitnice da saznaju (koje vama za sada nisu bitne) :
1) http://www.w3schools.com/sql/sql_create.asp
2) http://www.mysql.com/doc/en/CREATE_TABLE.html
3) http://www.google.com/search?hl=en&lr=&q=create+table

------------------------------------------------------------

4) Za one kojima je dosadno (i koji trce ispred vremena)

Ovo ispod cemo sve uciti posebno, u sledecim lekcijama...

Tabela se puni na sledeci nacin:
INSERT INTO tabela1 (ime, prezime, godiste) VALUES ('Mika', 'Kostic', 80);
Opsirnije: http://www.w3schools.com/sql/sql_insert.asp

Tabela se cita na sledeci nacin... primeri:
SELECT * FROM tabela1; SELECT ime FROM tabela1; SELECT ime, godiste FROM tabela1; SELECT ime, prezime FROM tabela1; SELECT ime, prezime FROM tabela1 WHERE godiste>80;
Opsirnije: http://www.w3schools.com/sql/sql_select.asp

Napominjem ponovo, ovo su samo primeri, da vam nije dosadno, za one koji zele da pozure sa lekcijama.
Sve cemo ovo posebno objasniti, u sledecim lekcijama.


Navigation
----------------------------------
prev | next




2. lekcija - insert

INSERT je SQL naredba/upit za dodavanje novih zapisa u bazu podataka.
sintaxa INSERT naredbe je sledeca:

INSERT INTO ime_tabele [(spisak_atributa)] VALUES (spisak_vrednosti_atributa);

atribut je ime kolone (u ovoj tabeli, atributi su: ime, prezime i godiste.

INSERT naredba dodaje spisak_vrednosti_atributa u ime_tabele. spisak_atributa je neophodan ako zelite da dodate samo neka polja. ako zelim da dodam samo ime i prezime, ali ne i godiste (pod uslovom da se za polje godiste dozvoljava da bude ne uneseno).
SQL upit:

INSERT INTO tabela1 (ime, prezime) VALUES ('Slobodan','Kasic');

ovaj sql upit ce generisati ovakvu tabelu


tabela1 : -------------------------------------------- |  Ime       |  Prezime       |  Godiste   | -------------------------------------------- | Predrag    |  Stojkovic   |  83        | | Petar      |  Petrovcic     |  84        | | Jasmina    |  Nikolic       |  80        | | Slobodan   |  Kasic         |            | --------------------------------------------

SQL nije casesensitive i nije bitno da li cete napisati InSeRt/INSERT/INSeRt/insert, potpuno je svejedno, ali ja pisem velikim slovima radi preglednosti, nista vise.
za atribute nikada ne stavljajte nesto kao text, string ili neki drugi tip polja, jer moze doci do greske pri izvrsavanju upita. malo je teze pronaci takvu gresku jer se ne nadas da je to problem Smile.ako je tip polja/atributa string/text, u INSERT upitu (a i ostalih upita), morate da stavite ' i ', ako je u pitanju broj, onda je bez '.


Navigation
----------------------------------
prev | next




3. lekcija - select

Select upit sluzi kako bi iz neke tabele 'izvadili' selektovali neki zapis ili vise zapisa po nekom odredjenom

kriterijumu.
sintaxta select upita je sledeca:

SELECT * FROM ime_tabele [WHERE id=13];

znak * znaci da cemo iz tabele ime_tabele da selektujemo sve atribute, a ime_tabele je zapravo ime tabele u kojoj se

nalaze ti selektovani atributi.

ako zelimo da iz tabele selektujemo sve korisnike koji su rodjeni 83 godine upit bi izgledao ovako:

SELECT * FROM tabela1 WHERE Godiste=83;

kao rezultat ovog upita, dobicemo ovakvu tabelu

-------------------------------------------- |  Ime       |  Prezime       |  Godiste   | -------------------------------------------- | Predrag    |  Stojkovic   |  83        | --------------------------------------------

ova tabela je virtuelna tabela i nalazi se u memoriji racunara.

bazu cemo azurirati (update jos nismo radili, za dva casa)

UPDATE tabela1 SET Godiste=83 WHERE Prezime='Kasic';

ovaj sql upit ce u vec postojeci zapis, dodati ono prazno poje koje je bilo (Godiste)
cela tabela izgleda ovako:

-------------------------------------------- |  Ime       |  Prezime       |  Godiste   | -------------------------------------------- | Predrag    |  Stojkovic   |  83        | | Petar      |  Petrovcic     |  84        | | Jasmina    |  Nikolic       |  80        | | Slobodan   |  Kasic         |  83        | --------------------------------------------

kada se sada izvrsi isti onaj SELECT upit, virtuelna tabela ce biti ovakva:

-------------------------------------------- |  Ime       |  Prezime       |  Godiste   | -------------------------------------------- | Predrag    |  Stojkovic   |  83        | | Slobodan   |  Kasic         |  83        | --------------------------------------------

sa ovakvim rezultatom upita, mozete da radite sta vam je volja. da ga sortirate ili ispisujete negde.

ako zelite da izracunate (izbrojite) koliko zapisa ima u tabeli sledeci sql upit resava to:

SELECT count(*) FROM tabela1;

rezultat upita ce biti broj 4.

postoje i malo komplikovaniji delovi SELECT upita (ugnjezdeni upiti)

hipoteticka situacija:
imate dve tabele. u jednoj spisak CD/DVD, a u drugoj grupa u kojoj isti pripadaju.
tabele ce ovako nekako izgledati:

tabela: cddvd -------------------------------------------- | Broj       |  Ime           |  Grupa     | -------------------------------------------- | 1          |  Worms         |  1         | | 2          |  Flash         |  2         | | 3          |  Linux         |  3         | | 4          |  VS.NET        |  4         | --------------------------------------------

tabela: grupa ------------------------------- | Broj       |  Ime           | ------------------------------- | 1          |  Igre          | | 2          |  Programi      | | 3          |  OSystems      | | 4          |  Programiranje | -------------------------------

ovako realizovana tabela sprecava neke od anomalija (anomalije pri brisanju, dodavanj i azuriranju)

mozgli smo to uraditi i sa jednom tabelom stim sto bi onda u atributu Grupa zapravo bilo ime grupe, ali to nije

dobro. tako se ne radi zbog pomenutih anomalija (o njima kasnije)

ove dve tabele su spojene sa atributima Grupa (iz prve tabele) i Broj (iz druge tabele)

select cddvd.broj,cddvd.ime,grupa.ime from cddvd,grupa where cddvd.broj=grupa.broj;

ovaj sql upit ce vam dati ono sto zelite.
tabela je ovakva

tabela: virtuelana ----------------------------------------------- | Broj       |  Ime           |  Grupa        | ----------------------------------------------- | 1          |  Worms         |  Igre         | | 2          |  Flash         |  Programi     | | 3          |  Linux         |  OSystems     | | 4          |  VS.NET        |  Programiranje| -----------------------------------------------

sve sto vam je potrebno je tu, a jos plus ste izbegli anomalije. malo je sql upit komplikovaniji, ali nije problem.

znaci, ono sto zelite da se prikaze u tabeli, morate navesti posle SELECT-a. kada radite sa dve ili vise tabela,

najbolje je da atribut pisete kao ime_tabele.ime_atributa da ne bi bilo zabune, a i da izbegnete greske, posebno ako

u dve tabele imate isti atribut (kao u mom slucaju Broj).
ovo je nesto sto ja najcesce koristim. ima tu jos ugnjezdenih f-ja. neke ne znam ni sam kako se koriste Smile

npr.

SELECT max(Broj) FROM grupa;

vraca broj 4 posto je on najveci broj u atributu Broj

slucaj sa min(broj), vratice 1, kao najmanji.

Navigation
----------------------------------
prev | next




4. lekcija - Where


Posle malo duze pauze, nastavljam sa zapocetim poslom (za koji, BTW, jos nisam placen Mr. GreenVery Happy).
Potrudicu se da objasnim sto je moguce bolje.


WHERE je klauzula uslova. Sa WHERE odreduje koje zapise cete brisati, selektovati, azurirati...
Opciona je, ali ako postoji, mora da ide posle FROM some_table naredbe.

Primer 1.0
SELECT * FROM Table1 WHERE id=1;

Ovo prevedeno na obican jezik glasi: Izaberi sva polja iz tabele Table1 gde je id jednako 1.
WHERE mozete da kombinujete sa logickim izrazima tipa AND, OR, NOT.

Primer 1.1 (Selektuje sve zapise iz tabele Table1 gde je id 1 i 4)
SELECT * FROM Table1 WHERE id=1 AND id=4;

Primer 1.1 (Selektuje sve zapise iz tabele Table1 gde je id ili 1 ili 4)
SELECT * FROM Table1 WHERE id=1 OR id=4;

WHERE klauzula moze da sadrzi GROUP BY i ORDER BY klauzule.
GROUP BY ime_atributa za grupisanje po tom atributu

ORDER BY ime_atributa za prikazivanje u opadajucem (DESC) ili rastucem (ASC) redosledu.

WHERE klauzula takodje moze da sadrzi i drugu SELECT klauzulu (ne u MySQLu).
Ono sto je bitno kod ovakvog nacina pisanja SQL upita jeste da u jednom delu SQL upita izjednacite polje sa poljem iz drugog SQL upita (istog tipa) po kojem zelite da povezete te dve tabele.

Primer 1.2
SELECT * FROM Tabela1 WHERE id1=(SELECT id2 FROM Tabela2 WHERE UserName='NekiUser';)

Ovaj SQL upit ne radi nista pametno, ali sam samo hteo da pokazem syntaxu kako se pise.

Isti ovaj rezultat mozete postici na drugi nacin (ako neke baze podataka ne podrzavaju ugnjezdene upite kao mySQL npr.)

Primer 1.3
SELECT * FROM Table1,Table2 WHERE Table1.id1=Table2.id2 AND UserName='NekiUser';

U ovom slucaju morate navesti ime_tabele.ime_atributa kako bi 'rekli' iz koje tabele da uzima podatke. Ovo isto moze i vama pomoci, posebno ako upit ne radi kako treba.
Ako ne zelite da pisete ime_tabele.ime_atributa, onda morate da proverite da ime svakog polja iz obe tabele bude unikatno kako ne bi doslo do gresaka. (Ovo se ne preporucuje)
Rezultat oba ova upita je isti.

Neke baze (MSSQL) kada poredite dva stringa u WHERE klauzuli, 'traze' da umesto = bude klauzula LIKE.

Bilo u slucaju koriscenja ugnjezdenog upita ili SQL upita iz Primera 1.3 kada SQL upit treba da vrati vise zapisa onda se umesto = koristi klauzula IN.
U klauzuli WHERE mozete da kombinujete logicke operacije po ovoj semi:
Argument1 OperatorUporedjivanja Argument2 i tako u nedogled Smile.

WHERE u DELETE

Sama DELETE klauzula ne bi bila ni malo upotrebljiva ako ne bi imali WHERE klauzulu osim u slucaju da zelimo da obrisemo sve zapise iz tabele.
Kada zelite neki odredjeni zapis (ili logicku kombinaciju zapisa) da obrisete iz tabele, u DELETE klauzulu morate da 'ukljucite' WHERE klauzulu.

Primer 1.4
DELETE FROM Table1 WHERE UserName='NekiTamoUser';

Ovaj SQL upit ce obrisati citav jedan zapis iz tabele Table1 gde je atribut UserName = NekiTamoUser.

WHERE u UPDATE

Kao i DELETE, ni UPDATE ne bi bio upotrebljiv bez WHERE, osim ako ne zelimo da jednu promenu preslikamo na sve u tabeli.
Ako zelite da azurirate samo jedan zapis ili logicku kombinaciju vise zapisa koristite WHERE unutar UPDATE klauzule.

Primer 1.5 (Azuriranje zapisa gde je id=14)
UPDATE SET ime_atributa=vrednost_atributa WHERE id=14;

Primer 1.6 (Azuriranje zapisa gde je id=14 i id=10 ukupno dve promene ime_atributa sa vrednost_atributa)
UPDATE SET ime_atributa=vrednost_atributa WHERE id=14 AND id=10;

Mislim da je to sve. Ako sam nesto zaboravio, dopunite me Very Happy


Navigation
----------------------------------
prev | next




5. lekcija Update

O UPDATEu nema sta puno da se kaze. (bar koliko ja znam Smile).
UPDATE klauzula sluzi za menjanje vrednosti jednog ili vise zapisa po nekom odredjenom kriterijumu.

Sadrzi WHERE uslov pomocu kojeg se menjaju neki atributi zapisa.

UPDATE tabela SET ime_atributa1=vrednost_atributa1, ime_atributa2=vrednost_atributa2, ime_atributaN=vrednost_atributaN;


Posle spiska atributa cija vrednost treba da se promeni/izmeni, treba da stoji WHERE koji odredjuje koji zapis ce biti UPDATE-ovan.
Ako izostavimo WHERE uslov, svi zapisi u tabeli ce biti isti.

UPDATE tabela SET grupa='industrija koze' WHERE id=14;

Ovaj sql upit ce promeniti vrednost atributa grupa u industrija koze svim zapisima kojima je ID=14.


Navigation
----------------------------------
prev | next



6. lekcija - Delete

Kao i za UPDATE, ni o DELETE nema mnogo stosta da se kaze.
DELETE sluzi za brisanje svih (time se ne brise definicija tabele, nego samo zapisi u njoj) zapisa ili samo selektovanih zapisa pomocu uslova.

DELETE FROM tabela;

Ovaj sql upit brise sve zapise iz tabele.
Da bi ipak obrisali samo zeljeni zapis, treba se dodati uslov WHERE.

DELETE FROM tabela WHERE id=14;

Ovaj sql upit brise sve zapise ciji je ID=14.


Navigation
----------------------------------
prev | Appendix 1




Advanced SQL-ing Very Happy

Zamislite sledecu situaciju.
Zelite da napravite nesto, da kazemo katalog knjiga (strucna literatura Smile).
Izmedju ostalog, ta aplikacija treba da sadrzi i ime knjige i grupu u kojoj pripada radi lakseg pronalazenja iste.
Vidjao sam da su neki sve te informacije (ime knjige, grupa, korisnik koji je uzeo knjigu...) dodavali u jednu tabelu. To nije dobro resenje jer se tu javljaju tri osnovne (i jedine) anomalije.

1. Pri dodavanju zapisa
2. Azuriranju zapisa (Update)
3. Brisanju zapisa

Stim sto jos pravite redudantne podatke (bespotrebno ponavljanje zapisa/podataka).

Da obajsnim svaku od anomalija.

1. Anomalija pri dodavanju zapisa:
Uzmimo primer ove nase aplikacije za knjige.
Ako imamo tabelu u kojoj su smesteni korisnici te biblioteke i tabelu u kojoj su smestene knjige.
Radnik koji radi u knjizari, ne moze da doda zapise o nekom korisniku osim ako taj korisnik ne uzme neku knjigu.
Zasto?
Zato sto se to sve nalazi u jednoj tabeli, a zamislite kako bi izgledala ta jedna tabela kada bi pola zapisa bilo prazno i jos bi se i ponavljali neki. Stim sto se pri projektovanju baze, za neka polja stavlja da ne mogu da prime null vrednost. Drugim recima, MORATE da upisete nesto.
Takvo polje bi bilo za ime knjige, grupu. Korisnik koji je uzeo knjigu je opciono.
Kako bi se zapis dodao u bazu, sva tri polja moraju biti popunjena (pored onih ostalih).

Isto to vazi i za knjige. Ne mozemo dodati novu knjigu ako nemamo kome da je iznajmimo.

2. Anomalije pri azuriranju zapisa:
Kada promenimo ime knjige (iz bilo kod razloga) npr. tek posle nekoliko godina Smile smo shvatili da nismo lepo napisali naslov knjige.
Sve te izmene moramo da vrsimo onoliko koliko je neko puta uzimao knjigu sto moze da dovede do greske i samim tim ne validnih podataka.

To isto vazi i za grupe i korisnike......

3. Anomalije pri brisanju zapisa:
Ako nam je neka knjiga slucajno ispala sa mosta Smile i naravno unistena, ljudi u knjizari (pored naplate stete Smile) moraju i da obrisu knjigu koja je bila prva knjiga u biblioteci staroj nekoliko

vekova Smile.
Da bi obrisali tu knjigu, moraju da brisu onoliko puta koliko je neko iznajmio tu knjigu. Samim tim (brisanjem) gube se informacije o korisnicima koji su uzimali tu knjigu.

Ista stvar je i sa grupama i korisnicima......


'Tri tabele' To the rescue Smile

Ipak, postoji nacin da se resi sve ovo.
U nasem slucaju (knjige, grupe i korisnici) trebamo da napravimo tri tabele.
Jedna tabela za spisak svih knjiga sa svim njenim informacijama (sta god vam padne na pamet).
Tabela sa spiskom svih mogucih grupa (beletristika, kompjuteri, kompjuterska filozofija Smile...)
I tabela sa spiskom korisnika koji bi trebalo da uzimaju te knjige sa svim njihovim informacijama.
Kontrolni broj, broj dece...

U tabeli za knjige treba da se dodaju jos dva atributa (pored onih sa informacijama za knjige) za grupe i korisnike preko kojih ce se tabela knjige povezivati sa abelom grupe i tabelom

korisnici.

Sve tri tabele imaju atribut ID koji je primarni kljuc. Ime knjige je obavezno polje (ono not null) kao i grupaID dok je korisnikID opciono.

knjige +----------------------------------------------------------+ |  id  |  ime knjige          |  grupaID    |  korisnikID  | +----------------------------------------------------------+ |  01  |  kompjuterska fil.   |  01         |              | |  02  |  tom sojer           |  02         |              | |  03  |  dig. integr. el.    |  03         |              | +----------------------------------------------------------+


grupe +-----------------------------+ |  id  |  ime grupe           | +-----------------------------+ |  01  |  kompjuteri          | |  02  |  lektira             | |  03  |  elektronika         | +-----------------------------+


korisnici +----------------------------+ |  id  |  ime korisnika      | +----------------------------+ |  01  |  Mika               | |  02  |  Pera               | |  03  |  Sima               | +----------------------------+


Tabele izgledaju ovako.
Kada zelimo da dodamo novog korisnika, Sve njegove informacije dodajemo u tabelu korisnici.
Kada zelimo da dodamo grupu, sve informacije o grupi dodajemo u tabelu grupe.
Isto tako i za knjige.

Kada dodje neki korisnik (Mika npr.) i zeli da uzme knjigu 'kompjuterska filozofija', operater zapisuje te podatke u tabelu knjige i to za tu knjigu koju je taj korisnik uzeo.

Tabela izgleda ovako:

knjige +-------------------------------------------------------+ |  id  |  ime knjige         |  grupaID  |  korisnikID  | +-------------------------------------------------------+ |  01  |  kompjuterska fil.  |  01       |  01          | |  02  |  tom sojer          |  02       |              | |  03  |  dig. integr. el.   |  03       |              | +-------------------------------------------------------+

Vidimo da je Mika povezan sa knjigom koju je uzeo preko njegovog ID (iz tabele korisnici) i ID iz tabele knjige tako da se zna ko je uzeo koju knjigu.

Kad bi ovo trebali da ispisemo, dobili bismo ne bas razumne podatke (mislim ovo, 01, 03, 10003, 383....).
Za ispisivanje pravih podataka, treba nam malo komplikovaniji SQL upit, ali radi posao.

Teorijski opis SQL upita:
SQL upit treba da selektuje sve iz tabele knjige gde je grupaID=ID id tabele grupe I gde je korisnikID=ID iz tabele korisnici.

Prakticni opis SQL upita:
SELECT * FROM knjige,grupe,korisnici WHERE knjige.grupaID=grupe.ID AND knjige.korisniciID=korisnici.ID;

Posle ovog SQL upita, normalno mozemo da pristupamo poljima i da ih ispisujemo gde treba.
Ako niko nije uzeo ni jednu knjigu, SQL upit nece vratiti ni jedan zapis.

To bi bilo to. Za sada. Ako imate nekih pitanja, slobodno pitajte.

Izvinjavam se zbog neurednosti tabela. Primetio sam tek kada sam postovao ovde, a sada me mrzi da ih ispravljam Smile.
Update: Sredio sam tabele Smile.

Navigation
----------------------------------
prev | ...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 1047 korisnika na forumu :: 49 registrovanih, 7 sakrivenih i 991 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Bokiboks, Boris90, ccoogg123, DPera, DragoslavS, dushan, Džordžino, esx66, FileFinder, hooraay, hyla, janbo, JOntra, Još malo pa deda, Kaplar2, Kibice, kolle.the.kid, Kubovac, ladro, laganini123, laki_bb, laurusri, ljuba, Luka Blažević, maiden6657, marsovac 2, mercedesamg, Mercury, Mi lao shu, milanovic, Miloš Popadić, Misirac, mrvica78, nikoladim, Nobunaga, operniki, ozzy, royst33, Srle993, stegonosa, Tas011, VJ, Vlada1389, Vlada78, zeo, Zerajic, zlaya011, žeks62