Diferència entre revisions de la pàgina «LEFT JOIN, RIGHT JOIN»

De wikijoan
Salta a la navegació Salta a la cerca
 
(Hi ha una revisió intermèdia del mateix usuari que no es mostren)
Línia 1: Línia 1:
 +
__TOC__
 
=LEFT JOIN=
 
=LEFT JOIN=
 
*https://www.sqltutorial.org/sql-left-join/
 
*https://www.sqltutorial.org/sql-left-join/
Línia 119: Línia 120:
 
</pre>
 
</pre>
  
 
+
=SELF JOIN=
 +
*https://www.sqltutorial.org/sql-self-join/
 +
Són les consultes entre dues taules que són la mateixa, o consultes recursives. Són molt importants i les expliquem en el següent apartat:
 +
*[[Consultes recursives: bikeshop]]
 
{{Autor}}, febrer 2022
 
{{Autor}}, febrer 2022

Revisió de 19:10, 8 feb 2022

LEFT JOIN

No tots els països tenen ciutats associades. La informació de les ciutats està en la taula location. Si volem veure TOTS els països, i també les ciutats d'aquells països que en tenen, haurem de fer un LEFT JOIN on el country està en el cantó esquerre:

SELECT c.country_name, c.country_id, l.country_id, l.city
FROM countries c
LEFT JOIN locations l
ON l.country_id = c.country_id;

+--------------------------+------------+------------+---------------------+
| country_name             | country_id | country_id | city                |
+--------------------------+------------+------------+---------------------+
| Argentina                | AR         | NULL       | NULL                |
| Australia                | AU         | NULL       | NULL                |
| Belgium                  | BE         | NULL       | NULL                |
| Brazil                   | BR         | NULL       | NULL                |
| Canada                   | CA         | CA         | Toronto             |
| Switzerland              | CH         | NULL       | NULL                |
| China                    | CN         | NULL       | NULL                |
| Germany                  | DE         | DE         | Munich              |
| Denmark                  | DK         | NULL       | NULL                |
...

Podem modificar la consulta per veure quins països no tenen cap ciutat:

SELECT c.country_name, c.country_id
FROM countries c
LEFT JOIN locations l
ON l.country_id = c.country_id
WHERE city IS NULL;

+--------------+------------+
| country_name | country_id |
+--------------+------------+
| Argentina    | AR         |
| Australia    | AU         |
| Belgium      | BE         |
| Brazil       | BR         |
| Switzerland  | CH         |
...

Podem fer un doble LEFT JOIN amb les taules regions, countries i locations:

SELECT r.region_name, c.country_name, l.street_address, l.city
FROM regions r
LEFT JOIN countries c ON c.region_id = r.region_id
LEFT JOIN locations l ON l.country_id = c.country_id;

+------------------------+--------------------------+------------------------------------------+---------------------+
| region_name            | country_name             | street_address                           | city                |
+------------------------+--------------------------+------------------------------------------+---------------------+
| Europe                 | Belgium                  | NULL                                     | NULL                |
| Europe                 | Switzerland              | NULL                                     | NULL                |
| Europe                 | Germany                  | Schwanthalerstr. 7031                    | Munich              |
| Europe                 | Denmark                  | NULL                                     | NULL                |
| Europe                 | France                   | NULL                                     | NULL                |
...

Podria donar-se el cas de què hi haguessin regions que no tenen països, i aleshores també sortirien a la llista.

RIGHT JOIN

És exactament el mateix que el LEFT JOIN, però el paper de la taula esquerra i dreta canvien.

Per fer la mateixa select que abans podem fer:

SELECT c.country_name, c.country_id, l.country_id, l.city
FROM locations l
RIGHT JOIN countries c
ON l.country_id = c.country_id;

+--------------------------+------------+------------+---------------------+
| country_name             | country_id | country_id | city                |
+--------------------------+------------+------------+---------------------+
| Argentina                | AR         | NULL       | NULL                |
| Australia                | AU         | NULL       | NULL                |
| Belgium                  | BE         | NULL       | NULL                |
| Brazil                   | BR         | NULL       | NULL                |
| Canada                   | CA         | CA         | Toronto             |
| Switzerland              | CH         | NULL       | NULL                |
...

FULL OUTER JOIN: no existeix a MySQL

Podria passar que hi haguessin països que no tinguessin ciutats, i ciutats que no tinguessin països. Aleshores, si volguéssim veure tots els països i totes les ciutats, encara que no tinguin ciutat o país associat, podem fer un FULL OUTER JOIN. En MySQL no exiteix com a tal, però es fa ajuntant un LEFT JOIN i un RIGHT JOIN.

Primer de tot, provoquem que hi hagi locations que no tinguin un país associat, permetent valors nuls a country_id:

ALTER TABLE locations MODIFY country_id CHAR(2) NULL;

update locations set country_id=NULL where city IN ('Seattle','Toronto','Munich');

I la consulta queda:

SELECT c.country_name, c.country_id, l.country_id, l.city
FROM countries c
LEFT JOIN locations l
ON l.country_id = c.country_id
UNION 
SELECT c.country_name, c.country_id, l.country_id, l.city
FROM countries c
RIGHT JOIN locations l
ON l.country_id = c.country_id;

+--------------------------+------------+------------+---------------------+
| country_name             | country_id | country_id | city                |
+--------------------------+------------+------------+---------------------+
...
| Netherlands              | NL         | NULL       | NULL                |
| Singapore                | SG         | NULL       | NULL                |
| United Kingdom           | UK         | UK         | Oxford              |
| United Kingdom           | UK         | UK         | London              |
| United States of America | US         | US         | South San Francisco |
| United States of America | US         | US         | Southlake           |
| Zambia                   | ZM         | NULL       | NULL                |
| Zimbabwe                 | ZW         | NULL       | NULL                |
| NULL                     | NULL       | NULL       | Seattle             |
| NULL                     | NULL       | NULL       | Toronto             |
| NULL                     | NULL       | NULL       | Munich              |
+--------------------------+------------+------------+---------------------+

SELF JOIN

Són les consultes entre dues taules que són la mateixa, o consultes recursives. Són molt importants i les expliquem en el següent apartat:


creat per Joan Quintana Compte, febrer 2022