sql >> Databáze >  >> RDS >> Mysql

Kdy použít LEFT JOIN a kdy INNER JOIN?

Je v tom nějaký háček? Ano existuje -- levá spojení jsou formou vnějšího spojení, zatímco vnitřní spojení jsou formou vnitřního spojení.

Zde jsou příklady, které ukazují rozdíl. Začneme základními údaji:

mysql> select * from j1;
+----+------------+
| id | thing      |
+----+------------+
|  1 | hi         |
|  2 | hello      |
|  3 | guten tag  |
|  4 | ciao       |
|  5 | buongiorno |
+----+------------+

mysql> select * from j2;
+----+-----------+
| id | thing     |
+----+-----------+
|  1 | bye       |
|  3 | tschau    |
|  4 | au revoir |
|  6 | so long   |
|  7 | tschuessi |
+----+-----------+

A zde uvidíme rozdíl mezi vnitřním a levým spojením:

mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing     | id | thing     |
+----+-----------+----+-----------+
|  1 | hi        |  1 | bye       |
|  3 | guten tag |  3 | tschau    |
|  4 | ciao      |  4 | au revoir |
+----+-----------+----+-----------+

Hmm, 3 řádky.

mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing      | id   | thing     |
+----+------------+------+-----------+
|  1 | hi         |    1 | bye       |
|  2 | hello      | NULL | NULL      |
|  3 | guten tag  |    3 | tschau    |
|  4 | ciao       |    4 | au revoir |
|  5 | buongiorno | NULL | NULL      |
+----+------------+------+-----------+

Páni, 5 řad! Co se stalo?

Vnější spojení, například left join zachovat řádky, které se neshodují - takže řádky s id 2 a 5 jsou zachovány levým spojovacím dotazem. Zbývající sloupce jsou vyplněny hodnotou NULL.

Jinými slovy, levá a vnitřní spojení nejsou zaměnitelná.



  1. GROUP_CONCAT s limitem

  2. Rozdíl mezi sys.objects, sys.system_objects a sys.all_objects na serveru SQL Server

  3. MariaDB FIELD() vs FIND_IN_SET():Jaký je rozdíl?

  4. VLOŽTE HODNOTY KAM NEEXISTUJE