MySQL JOIN komanda se koristi kada zelite dobiti izvestaje na osnovu kriterijuma za izvlacenje podataka iz vise tabela.
Da bi MySQL JOIN komanda bla smislena u svakoj tabeli mora postojati primarni kljuc (posebna kolona).
Primarni kljuc za svaki red, tj. podatke u tabeli znaci da postoji jedinstven broj kojim se unikatno oznacava taj i samo taj red.
Ako za sve tabele napravimo primarni kljuc to znaci da ce nam izvlacenje izvestaja iz svih tabela biti znatno jednostavnije.
Prica o JOIN-ima je ozbiljna, trebaju nam dve nove tabele, potpuno identicne kao iz kursa o SQL-u i Access-u.
Prvo cemo napraviti bazu podataka "firma":
mysql> CREATE DATABASE firma;
Query OK, 1 row affected (0.02 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| firma |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.13 sec)
mysql>
Zatim pravimo tabelu "prodavnice":
mysql> use firma
Database changed
mysql> CREATE TABLE prodavnice (
-> p_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> gradovi CHAR (30),
-> prodavnice VARCHAR (30),
-> proizvod CHAR (30),
-> raspolozivo INT,
-> cena INT);
Query OK, 0 rows affected (0.34 sec)
mysql>
Provera strukture za tabelu "prodavnice":
mysql> DESCRIBE prodavnice;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| p_id | int(11) | NO | PRI | NULL | auto_increment |
| gradovi | char(30) | YES | | NULL | |
| prodavnice | varchar(30) | YES | | NULL | |
| proizvod | char(30) | YES | | NULL | |
| raspolozivo | int(11) | YES | | NULL | |
| cena | int(11) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
6 rows in set (0.14 sec)
mysql>
Popunjavamo tabelu "prodavnice" podacima:
MALA POMOC: Posto unosimo podatke direktno iz MySQL konzole, koristite strelicu GORE/DOLE da ne bi dva puta kucali INSERT INTO...i VALUES...
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Beograd', 'prbg1', 'Kafa', 121, 150);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Beograd', 'prbg2', 'Cigare', 50, 300);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Subotica', 'prsub1', 'Hleb', 43, 45);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Nis', 'prnis1', 'Hleb', 23, 55);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Kraljevo', 'prkrl1', 'Pavlaka', 155, 50);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Uzice', 'pruzi1', 'Mleko', 68, 90);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Majdanpek', 'prmaj1', 'Mleko', 91, 87);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Bor', 'prbor1', 'Pavlaka', 155, 50);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Kikinda', 'prkik1', 'Ajzaklija', 38, 650);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Obrenovac', 'prob1', 'Jabuke', 35, 120);
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Smederevo', 'prsm1', 'Ajvar', 28, 270);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Zrenjanin', 'przr1', 'Somun', 10, 59);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO prodavnice (p_id, gradovi, prodavnice, proizvod, raspolozivo, cena)
-> VALUES (NULL, 'Jagodina', 'prjg1', 'Bakalar', 29, 400);
Query OK, 1 row affected (0.03 sec)
mysql>
NAPOMENA: Postoji razlog zasto radimo sve iz MySQL konzole. Nije problem da koristimo neki GUI (graficki interfejs) za unos podataka u bazu, medjutim sada UCIMO, pa je bolje da sve odradimo preko tastature.
Pravimo tabelu:
mysql> CREATE TABLE poslato (
-> s_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> dokument INT,
-> p_id INT);
Query OK, 0 rows affected (0.16 sec)
mysql>
Provera tabele:
mysql> DESCRIBE poslato;
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| s_id | int(11) | NO | PRI | NULL | auto_increment |
| dokument | int(11) | YES | | NULL | |
| p_id | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql>
Malo pojasnjenja: s_id je redni broj u tabeli dokumenta koga unosimo, koji se oznacava nekim brojem (dokument INT). Svaki dokument je poslat nekj prodavnici koja ima jedinstven identifikator p_id iz tabele "prodavnice".
Vidite li sta je poenta kod p_id i s_id primarnih kljuceva ? Nema potrebe da DUPLIRAMO podatke u jednoj tabeli, kada ih ima u drugoj. Da smo hteli nesto menjati od podataka u tabeli "prodavnice", promenili bi podatak samo u toj tabeli, ne i u drugim tabelama. U tome je poenta primarnih kljuceva (id). Stedimo vreme relacijama medju tabelama.
Unecemo neke podatke u tabelu "poslato":
mysql> INSERT INTO poslato (s_id, dokument, p_id)
-> VALUES (NULL, 55210, 1);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO poslato (s_id, dokument, p_id)
-> VALUES (NULL, 32618, 1);
Query OK, 1 row affected (0.03 sec)
mysql> INSERT INTO poslato (s_id, dokument, p_id)
-> VALUES (NULL, 50687, 9);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO poslato (s_id, dokument, p_id)
-> VALUES (NULL, 49321, 4);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO poslato (s_id, dokument, p_id)
-> VALUES (NULL, 39658, 3);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO poslato (s_id, dokument, p_id)
-> VALUES (NULL, 41200, 11);
Query OK, 1 row affected (0.05 sec)
mysql>
mysql> SELECT * FROM prodavnice;
+------+-----------+------------+-----------+-------------+------+
| p_id | gradovi | prodavnice | proizvod | raspolozivo | cena |
+------+-----------+------------+-----------+-------------+------+
| 1 | Beograd | prbg1 | Kafa | 121 | 150 |
| 2 | Beograd | prbg2 | Cigare | 50 | 300 |
| 3 | Subotica | prsub1 | Hleb | 43 | 45 |
| 4 | Nis | prnis1 | Hleb | 23 | 55 |
| 5 | Kraljevo | prkrl1 | Pavlaka | 155 | 50 |
| 6 | Uzice | pruzi1 | Mleko | 68 | 90 |
| 7 | Majdanpek | prmaj1 | Mleko | 91 | 87 |
| 8 | Bor | prbor1 | Pavlaka | 155 | 50 |
| 9 | Kikinda | prkik1 | Ajzaklija | 38 | 650 |
| 10 | Obrenovac | prob1 | Jabuke | 35 | 120 |
| 11 | Smederevo | prsm1 | Ajvar | 28 | 270 |
| 12 | Zrenjanin | przr1 | Somun | 10 | 59 |
| 13 | Jagodina | prjg1 | Bakalar | 29 | 400 |
+------+-----------+------------+-----------+-------------+------+
13 rows in set (0.03 sec)
mysql>
Sadrzaj tabele "poslato":
mysql> SELECT * FROM poslato;
+------+----------+------+
| s_id | dokument | p_id |
+------+----------+------+
| 1 | 55210 | 1 |
| 2 | 32618 | 1 |
| 3 | 50687 | 9 |
| 4 | 49321 | 4 |
| 5 | 39658 | 3 |
| 6 | 41200 | 11 |
+------+----------+------+
6 rows in set (0.00 sec)
mysql>
Malo analize. Iz tabele "poslato" vidimo da je dokument pod rednim brojem 1, oznake: 55210 zavrsio u prodavnici p_id:1, tj. u Beogradu (prbg1), i tako redom...
Idemo sada na prvu pravu lekciju o JOIN-ima...
2014 © webprogramianje.net - Sva prava su zadržana. 




