|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Consultes amb m煤ltiples taulesJoan Puigcerver Ib谩帽ez Introducci贸露Fins ara hem realitzat consultes No obstant aix貌, les bases de dades relacionals estan pensades per relacionar les dades de m煤ltiples taules, navegant les claus foranes i combinant la informaci贸 per extraure dades que complixen condicions m茅s complexes. Hi ha diferents maneres de combinar m煤ltiples taules, per貌 la m茅s elegant 茅s mitjan莽ant la cl脿usula Documentaci贸 Documentaci贸 oficial sobre
Taules i dades d'exemple露Tots els exemples es realitzaran amb les seg眉ents taules i dades:
Producte cartesi脿 o
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Taula Categoria | Taula Producte | ||||
|---|---|---|---|---|---|
| ID Categoria | Nom | ID Producte | ID Categoria | Nom | Preu |
| 1 | Forn | 1 | 1 | Barra de p脿 | 0.70 |
| 1 | Forn | 2 | 1 | Past铆s de xocolate | 5.30 |
| 1 | Forn | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 1 | Forn | 4 | NULL | Piles AA | 1.50 |
| 1 | Forn | 5 | 4 | Pera | 0.30 |
| 1 | Forn | 6 | 4 | Pl脿tan | 0.50 |
| 2 | Beguda | 1 | 1 | Barra de p脿 | 0.70 |
| 2 | Beguda | 2 | 1 | Past铆s de xocolate | 5.30 |
| 2 | Beguda | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 2 | Beguda | 4 | NULL | Piles AA | 1.50 |
| 2 | Beguda | 5 | 4 | Pera | 0.30 |
| 2 | Beguda | 6 | 4 | Pl脿tan | 0.50 |
| 3 | Higiene | 1 | 1 | Barra de p脿 | 0.70 |
| 3 | Higiene | 2 | 1 | Past铆s de xocolate | 5.30 |
| 3 | Higiene | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 3 | Higiene | 4 | NULL | Piles AA | 1.50 |
| 3 | Higiene | 5 | 4 | Pera | 0.30 |
| 3 | Higiene | 6 | 4 | Pl脿tan | 0.50 |
| 4 | Fruta | 1 | 1 | Barra de p脿 | 0.70 |
| 4 | Fruta | 2 | 1 | Past铆s de xocolate | 5.30 |
| 4 | Fruta | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 4 | Fruta | 4 | NULL | Piles AA | 1.50 |
| 4 | Fruta | 5 | 4 | Pera | 0.30 |
| 4 | Fruta | 6 | 4 | Pl脿tan | 0.50 |
El SGBD retornar脿 el producte cartesi脿 entre dues taules si:
-
Realitzem un
JOINoCROSS JOINsense cap condici贸. !!! example "Exemple" -
Realitzem una consulta amb m煤ltiples taules en la cl脿usula
FROM. !!! example "Exemple"
Combinaci贸 interna o INNER JOIN露
El producte cartesi脿 ens retorna totes les possibles combinacions entre diferents taules i
molts dels resultats no estan relacionats entre s铆. Per filtrar els resultats i retornar
sols aquells registres que s铆 que estan relacionats entre si, cal utilitzar INNER JOIN,
que permet especificar una condici贸 per especificar com es relacionen els registres
de les diferents taules. Normalment aquesta condici贸 utilitza les claus foranes definides.
La cl脿usula INNER JOIN t茅 la seg眉ent sintaxi:
INNER JOIN: Especifica la taula que es dessitja combinar. Es pot especificar un 脿lies.ON: Especifica els atributs que formen la relaci贸 entre les dues taules. Especifica la condici贸 de filtratge.
Informaci贸
Es poden definir 脿lies en les taules per poder referenciar les taules d'una maner脿 m茅s f脿cil i c貌moda.
Exemple
La intersecci贸 entre les taules Categoria i Producte ens retorna els productes relacionats amb les categories als quals pertanyen.
| Taula Categoria | Taula Producte | ||||
|---|---|---|---|---|---|
| ID Categoria | Nom | ID Producte | ID Categoria | Nom | Preu |
| 1 | Forn | 1 | 1 | Barra de p脿 | 0.70 |
| 1 | Forn | 2 | 1 | Past铆s de xocolate | 5.30 |
| 2 | Beguda | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 4 | Fruta | 5 | 4 | Pera | 0.30 |
| 4 | Fruta | 6 | 4 | Pl脿tan | 0.50 |
Aquest resultat es pot obtindre mitjan莽ant la consulta:
SELECT c.id_categoria, c.nom, p.id_producte, p.id_categoria, p.nom, p.preu
FROM categoria c
INNER JOIN producte p
ON p.id_categoria = c.id_categoria;
ON que relacione la taula Producte amb la taula Categoria mitjan莽ant la clau forana
id_categoria.
Combinaci贸 externa: LEFT JOIN露
La combinaci贸 externa LEFT JOIN retorna aquells registres que estan relacionats en les dues taules (INNER JOIN), per貌
tamb茅 retorna els valors de la primera taula que no estan relacionats amb elements de la segona taula.
La cl脿usula LEFT JOIN t茅 una sintaxi equivalent a INNER JOIN:
Exemple
El LEFT JOIN entre les taules Categoria i Producte ens retorna les categories relacionades amb els
productes que tenen, per貌 tamb茅 aquelles categories que no tenen cap producte.
| Taula Categoria | Taula Producte | ||||
|---|---|---|---|---|---|
| ID Categoria | Nom | ID Producte | ID Categoria | Nom | Preu |
| 1 | Forn | 1 | 1 | Barra de p脿 | 0.70 |
| 1 | Forn | 2 | 1 | Past铆s de xocolate | 5.30 |
| 2 | Beguda | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 3 | Higiene | NULL | NULL | NULL | NULL |
| 4 | Fruta | 5 | 4 | Pera | 0.30 |
| 4 | Fruta | 6 | 4 | Pl脿tan | 0.50 |
Aquest resultat es pot obtindre mitjan莽ant la consulta:
Combinaci贸 externa: RIGHT JOIN露
La combinaci贸 externa RIGHT JOIN retorna aquells registres que estan relacionats en les dues taules (INNER JOIN),
per貌 tamb茅 retorna els valors de la segona taula que no estan relacionats amb elements de la primera taula.
脡s exactament el mateix que un LEFT JOIN per貌 en el altre sentit.
La cl脿usula RIGHT JOIN t茅 una sintaxi equivalent a INNER JOIN:
Exemple
El RIGHT JOIN entre les taules Categoria i Producte ens retorna les categories relacionades amb els
productes que tenen, per貌 tamb茅 aquells productes que no tenen cap categoria.
| Taula Categoria | Taula Producte | ||||
|---|---|---|---|---|---|
| ID Categoria | Nom | ID Producte | ID Categoria | Nom | Preu |
| 1 | Forn | 1 | 1 | Barra de p脿 | 0.70 |
| 1 | Forn | 2 | 1 | Past铆s de xocolate | 5.30 |
| 2 | Beguda | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| NULL | NULL | 4 | NULL | Piles AA | 1.50 |
| 4 | Fruta | 5 | 4 | Pera | 0.30 |
| 4 | Fruta | 6 | 4 | Pl脿tan | 0.50 |
Aquest resultat es pot obtindre mitjan莽ant la consulta:
Combinaci贸 externa: FULL JOIN露
La combinaci贸 externa FULL JOIN retorna aquells registres que estan relacionats en les dues taules (INNER JOIN),
per貌 tamb茅 retorna els valors de de les dues taules que no estan relacionats amb elements de l'altra taula (LEFT JOIN i RIGHT JOIN).
No existeix la cl脿usula FULL JOIN, per貌 podem obtindre el resultat mitjan莽ant
la cl脿usula UNION, que retorna els registres presents en dues consultes:
SELECT columns
FROM table1 t1
LEFT JOIN table2 t2
ON t1.attr = t2.attr
UNION
SELECT columns
FROM table1 t1
RIGHT JOIN table2 t2
ON t1.attr = t2.attr
Exemple
El FULL JOIN entre les taules Categoria i Producte ens retorna les categories relacionades amb els
productes que tenen, per貌 tamb茅 aquells productes que no tenen cap categoria i les categories que no tenen cap producte.
| Taula Categoria | Taula Producte | ||||
|---|---|---|---|---|---|
| ID Categoria | Nom | ID Producte | ID Categoria | Nom | Preu |
| 1 | Forn | 1 | 1 | Barra de p脿 | 0.70 |
| 1 | Forn | 2 | 1 | Past铆s de xocolate | 5.30 |
| 2 | Beguda | 3 | 2 | Botella d'aigua 50cL | 0.80 |
| 3 | Higiene | NULL | NULL | NULL | NULL |
| NULL | NULL | 4 | NULL | Piles AA | 1.50 |
| 4 | Fruta | 5 | 4 | Pera | 0.30 |
| 4 | Fruta | 6 | 4 | Pl脿tan | 0.50 |
Aquest resultat es pot obtindre mitjan莽ant la consulta:
SELECT c.id_categoria, c.nom, p.id_producte, p.id_categoria, p.nom, p.preu
FROM categoria c
LEFT JOIN producte p
ON p.id_categoria = c.id_categoria
UNION
SELECT c.id_categoria, c.nom, p.id_producte, p.id_categoria, p.nom, p.preu
FROM categoria c
RIGHT JOIN producte p
ON p.id_categoria = c.id_categoria;
Bibliografia露
- https://es.wikipedia.org/wiki/Sentencia_JOIN_en_SQL
- https://stackoverflow.com/questions/4796872/how-can-i-do-a-full-outer-join-in-mysql