MySQL JOINS Tutorial - Preklapanje MySQL Tabela

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.

Priprema za JOIN Lekciju -Pravimo dve nove Tabele

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 "poslato"

Tabela "poslato" ce skladistiti dokumente (oznake/sifre dokumenata) koje smo slali u nase prodavnice po gradovima. Nije bitno koji su dokumenti u pitanju, bitno je da su na neki nacin sistematizovani i oznaceni. Mogu biti bilo sta, otpremnice, racuni...

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>

Sta ima u tabelama "prodavnice" i "poslato" ?

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...