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