Többtáblás lekérdezések
Végezd el az alábbi lekérdezést! Mi az egyes oszlopok jelentése?
SELECT * FROM konyvek__olvasok;
+----+-------------+-------------+-------------------+
| id | id__konyvek | id__olvasok | kolcsonzes_datuma |
+----+-------------+-------------+-------------------+
| 1 | 1 | 2 | 2012-04-12 |
| 2 | 1 | 4 | 2011-05-28 |
| 3 | 1 | 10 | 2016-01-20 |
| 4 | 2 | 1 | 2005-04-21 |
| 5 | 2 | 9 | 2001-01-02 |
| 6 | 3 | 1 | 2008-09-26 |
| 7 | 3 | 4 | 2010-10-10 |
...
| 42 | 10 | 1 | 2000-01-04 |
| 43 | 10 | 4 | 2001-05-17 |
| 44 | 10 | 7 | 2001-08-24 |
| 45 | 10 | 8 | 2001-10-18 |
| 46 | 10 | 11 | 2001-12-30 |
+----+-------------+-------------+-------------------+
45 rows in set (0.000 sec)
Táblák egyesítése
SELECT *
FROM konyvek__olvasok
LEFT JOIN konyvek
ON konyvek.id=konyvek__olvasok.id__konyvek;
+----+-------------+-------------+-------------------+------+-------------------------------------+---------------------------+------------+
| id | id__konyvek | id__olvasok | kolcsonzes_datuma | id | cim | szerzo | kiadas_eve |
+----+-------------+-------------+-------------------+------+-------------------------------------+---------------------------+------------+
| 1 | 1 | 2 | 2012-04-12 | 1 | Harry Potter és a Halál ereklyéi | J.K. Rowling | 2007 |
| 2 | 1 | 4 | 2011-05-28 | 1 | Harry Potter és a Halál ereklyéi | J.K. Rowling | 2007 |
| 3 | 1 | 10 | 2016-01-20 | 1 | Harry Potter és a Halál ereklyéi | J.K. Rowling | 2007 |
...
| 43 | 10 | 4 | 2001-05-17 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
| 44 | 10 | 7 | 2001-08-24 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
| 45 | 10 | 8 | 2001-10-18 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
| 46 | 10 | 11 | 2001-12-30 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
+----+-------------+-------------+-------------------+------+-------------------------------------+---------------------------+------------+
45 rows in set (0.000 sec)
Listázd a kölcsönzések történetét! Sorrendben is menne? És ha csak a 2016-osok érdekelnek?
SELECT kolcsonzes_datuma, cim, nev
FROM konyvek__olvasok
LEFT JOIN konyvek
ON konyvek.id=konyvek__olvasok.id__konyvek
LEFT JOIN olvasok
ON olvasok.id=konyvek__olvasok.id__olvasok;
+-------------------+-------------------------------------+---------------------+
| kolcsonzes_datuma | cim | nev |
+-------------------+-------------------------------------+---------------------+
| 2012-04-12 | Harry Potter és a Halál ereklyéi | Nagy Tímea |
| 2011-05-28 | Harry Potter és a Halál ereklyéi | Horváth Zsüliett |
| 2016-01-20 | Harry Potter és a Halál ereklyéi | Nagy Nándor |
| 2005-04-21 | Harry Potter és a Tűz Serlege | Kiss János |
| 2001-01-02 | Harry Potter és a Tűz Serlege | Sipos Tamás |
| 2008-09-26 | Twilight - Alkonyat | Kiss János |
...
| 2008-10-26 | Galaxis útikalauz stopposoknak | Kiss János |
| 2008-06-04 | Galaxis útikalauz stopposoknak | Rácz Júlia |
| 2000-01-04 | A kis herceg | Kiss János |
| 2001-05-17 | A kis herceg | Horváth Zsüliett |
| 2001-08-24 | A kis herceg | Rácz Júlia |
| 2001-10-18 | A kis herceg | Szűcs Nóra |
| 2001-12-30 | A kis herceg | Kiss János |
+-------------------+-------------------------------------+---------------------+
A következő feladathoz nézzük meg ezt a lekérdezést. Hogyan értelmezzük ennek eredményét? Mi van Vígh Andreával, aki egyetlen könyvet sem kölcsönzött ki?
SELECT
*
FROM
olvasok
LEFT JOIN
konyvek__olvasok
ON konyvek__olvasok.id__olvasok = olvasok.id
LEFT JOIN
konyvek
ON konyvek.id = konyvek__olvasok.id__konyvek;
+----+---------------------+------+-----+------+-------------+-------------+-------------------+------+-------------------------------------+---------------------------+------------+
| id | nev | nem | kor | id | id__konyvek | id__olvasok | kolcsonzes_datuma | id | cim | szerzo | kiadas_eve |
+----+---------------------+------+-----+------+-------------+-------------+-------------------+------+-------------------------------------+---------------------------+------------+
| 1 | Kiss János | F | 31 | 4 | 2 | 1 | 2005-04-21 | 2 | Harry Potter és a Tűz Serlege | J.K. Rowling | 2000 |
| 1 | Kiss János | F | 31 | 6 | 3 | 1 | 2008-09-26 | 3 | Twilight - Alkonyat | Stephenie Meyer | 2005 |
| 1 | Kiss János | F | 31 | 14 | 5 | 1 | 2011-03-22 | 5 | Középfölde formálása | J. R. R. Tolkien | 1986 |
| 1 | Kiss János | F | 31 | 23 | 7 | 1 | 2015-09-20 | 7 | A lány a vonaton | Paula Hawkins | 2015 |
| 1 | Kiss János | F | 31 | 27 | 8 | 1 | 2000-12-10 | 8 | Az alkimista | Paulo Coelho | 1988 |
| 1 | Kiss János | F | 31 | 42 | 10 | 1 | 2000-01-04 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
| 2 | Nagy Tímea | N | 17 | 1 | 1 | 2 | 2012-04-12 | 1 | Harry Potter és a Halál ereklyéi | J.K. Rowling | 2007 |
| 2 | Nagy Tímea | N | 17 | 15 | 5 | 2 | 2011-03-31 | 5 | Középfölde formálása | J. R. R. Tolkien | 1986 |
| 2 | Nagy Tímea | N | 17 | 34 | 9 | 2 | 2004-10-15 | 9 | Galaxis útikalauz stopposoknak | Douglas Adams | 1979 |
| 2 | Nagy Tímea | N | 17 | 35 | 9 | 2 | 2005-08-30 | 9 | Galaxis útikalauz stopposoknak | Douglas Adams | 1979 |
...
| 12 | Rácz Júlia | N | 16 | 22 | 6 | 12 | 2011-07-28 | 6 | A Da Vinci-kód | Dan Brown | 2003 |
| 12 | Rácz Júlia | N | 16 | 26 | 7 | 12 | 2016-04-17 | 7 | A lány a vonaton | Paula Hawkins | 2015 |
| 12 | Rácz Júlia | N | 16 | 33 | 8 | 12 | 2008-11-10 | 8 | Az alkimista | Paulo Coelho | 1988 |
| 12 | Rácz Júlia | N | 16 | 41 | 9 | 12 | 2008-06-04 | 9 | Galaxis útikalauz stopposoknak | Douglas Adams | 1979 |
| 13 | Vígh Andrea | N | 28 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 14 | Vígh Zsuzsanna | N | 26 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+----+---------------------+------+-----+------+-------------+-------------+-------------------+------+-------------------------------------+---------------------------+------------+
Módosítsuk a LEFT JOIN-t INNER JOIN-ra! Most mi a helyzet Vígh Andreával?
SELECT
*
FROM
olvasok
INNER JOIN
konyvek__olvasok
ON konyvek__olvasok.id__olvasok = olvasok.id
INNER JOIN
konyvek
ON konyvek.id = konyvek__olvasok.id__konyvek;
+----+---------------------+------+-----+----+-------------+-------------+-------------------+----+-------------------------------------+---------------------------+------------+
| id | nev | nem | kor | id | id__konyvek | id__olvasok | kolcsonzes_datuma | id | cim | szerzo | kiadas_eve |
+----+---------------------+------+-----+----+-------------+-------------+-------------------+----+-------------------------------------+---------------------------+------------+
| 1 | Kiss János | F | 31 | 4 | 2 | 1 | 2005-04-21 | 2 | Harry Potter és a Tűz Serlege | J.K. Rowling | 2000 |
| 1 | Kiss János | F | 31 | 6 | 3 | 1 | 2008-09-26 | 3 | Twilight - Alkonyat | Stephenie Meyer | 2005 |
| 1 | Kiss János | F | 31 | 14 | 5 | 1 | 2011-03-22 | 5 | Középfölde formálása | J. R. R. Tolkien | 1986 |
| 1 | Kiss János | F | 31 | 23 | 7 | 1 | 2015-09-20 | 7 | A lány a vonaton | Paula Hawkins | 2015 |
| 1 | Kiss János | F | 31 | 27 | 8 | 1 | 2000-12-10 | 8 | Az alkimista | Paulo Coelho | 1988 |
| 1 | Kiss János | F | 31 | 42 | 10 | 1 | 2000-01-04 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
| 2 | Nagy Tímea | N | 17 | 1 | 1 | 2 | 2012-04-12 | 1 | Harry Potter és a Halál ereklyéi | J.K. Rowling | 2007 |
...
| 11 | Kiss János | F | 21 | 46 | 10 | 11 | 2001-12-30 | 10 | A kis herceg | Antoine de Saint-Exupéry | 1943 |
| 12 | Rácz Júlia | N | 16 | 22 | 6 | 12 | 2011-07-28 | 6 | A Da Vinci-kód | Dan Brown | 2003 |
| 12 | Rácz Júlia | N | 16 | 26 | 7 | 12 | 2016-04-17 | 7 | A lány a vonaton | Paula Hawkins | 2015 |
| 12 | Rácz Júlia | N | 16 | 33 | 8 | 12 | 2008-11-10 | 8 | Az alkimista | Paulo Coelho | 1988 |
| 12 | Rácz Júlia | N | 16 | 41 | 9 | 12 | 2008-06-04 | 9 | Galaxis útikalauz stopposoknak | Douglas Adams | 1979 |
+----+---------------------+------+-----+----+-------------+-------------+-------------------+----+-------------------------------------+---------------------------+------------+
Megjegyzés
Ha két tábla összekapcsolásakor az összes rekordot ki akarjuk listázni, akkor a LEFT JOIN (vagy RIGHT JOIN-t) kell használni. Ezek, ha előfordulhatnak olyan rekordok, amelyeknek nincs párjuk a másik táblában NULL értékekkel töltik fel a sorokat. Az INNER JOIN ebben az esetben viszont csak azokat a rekordokat jeleníti meg, amelyekhez van hozzákapcsolható érték a másik táblában. Ezt látjuk Vígh Andrea esetében a fenti két példában.
Melyik olvasó hány könyvet kölcsönzött ki?
SELECT
nev, count(id__olvasok) AS darab
FROM
olvasok
LEFT JOIN
konyvek__olvasok
ON konyvek__olvasok.id__olvasok = olvasok.id
LEFT JOIN
konyvek
ON konyvek.id = konyvek__olvasok.id__konyvek
GROUP BY nev
ORDER BY darab DESC;
+---------------------+-------+
| nev | darab |
+---------------------+-------+
| Kiss János | 10 |
| Rácz Júlia | 7 |
| Horváth Zsüliett | 5 |
| Szűcs Nóra | 4 |
| Nagy Tímea | 4 |
| Nagy Nándor | 4 |
| Sipos Tamás | 3 |
| Kovács Elemér | 3 |
| Nagysándor József | 3 |
| Varga Elemér | 2 |
| Vígh Zsuzsanna | 0 |
| Vígh Andrea | 0 |
+---------------------+-------+
Mi változik, ha LEFT JOIN helyett INNER JOIN-nal oldjuk meg ezt a feladatot?
SELECT
nev, count(id__olvasok) AS darab
FROM
olvasok
INNER JOIN
konyvek__olvasok
ON konyvek__olvasok.id__olvasok = olvasok.id
INNER JOIN
konyvek
ON konyvek.id = konyvek__olvasok.id__konyvek
GROUP BY nev
ORDER BY darab DESC;
+---------------------+-------+
| nev | darab |
+---------------------+-------+
| Kiss János | 10 |
| Rácz Júlia | 7 |
| Horváth Zsüliett | 5 |
| Szűcs Nóra | 4 |
| Nagy Tímea | 4 |
| Nagy Nándor | 4 |
| Sipos Tamás | 3 |
| Kovács Elemér | 3 |
| Nagysándor József | 3 |
| Varga Elemér | 2 |
+---------------------+-------+