Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les...

16
Consultes amb múltiples taules Miquel Boada 25-11-2016

Transcript of Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les...

Page 1: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Consultes ambmúltiples taules

Miquel Boada25-11-2016

Page 2: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Objectius1. Subconsultes

Coneixements previs• Model Entitat-Relació.• Model relacional.• Transformació del model Entitat-Relació al model relacional.• Sistemes gestors de bases de dades (SGBD).• Creació de base de dades.• Creació de taules.• Instrucció select

Requisits previs• Ordinador amb MySQL server instal·lat.• Client MySQL server (MySQL Workbench per la representació gràfica).• Connexió al servidor des del client • Una base de dades creada.

Autor: Miquel Boada Pàgina 2 de 16

Page 3: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

SQL - SelectConsultes amb múltiples taules.............................................................................................................1Objectius....................................................................................................................................................2Coneixements previs................................................................................................................................2Requisits previs.........................................................................................................................................2Subconsultes.............................................................................................................................................6

Restriccions..........................................................................................................................................6 Exemples..............................................................................................................................................7

Consultes amb múltiples taules.............................................................................................................8 Format instrucció..............................................................................................................................10 Select … Join.......................................................................................................................................10 Inner Join : exemples........................................................................................................................11 Simplificació anotació.......................................................................................................................11

Noms columnes............................................................................................................................11 Àlies taules.....................................................................................................................................12

Funcionament JOIN...........................................................................................................................12 PAS 1: Producte cartesià entre les dues taules.........................................................................13 PAS 2: Selecció files segons ON..................................................................................................13 PAS 3: Selecció columnes.............................................................................................................14

Left Join/ Right Join.................................................................................................................................15 Left / Right join : exemples...............................................................................................................15

PAS 1: Producte cartesià entre les dues taules.........................................................................15 PAS 2: Selecció files.......................................................................................................................16 PAS 3: Eliminació files duplicades...............................................................................................16

Autor: Miquel Boada Pàgina 3 de 16

Page 4: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Per a realitzar les diferents consultes es partirà del següent model ER i la seva conversió almodel físic.

Superhero Planet

Les instruccions per a crear la base de dades , les taules i les dades es detallen a continuació.Tenir en compte que la força i la intel·ligència es generen mitjançant un número aleatori i, pertant, aquests valors diferiran dels valors mostrats en la taula anterior.

Autor: Miquel Boada Pàgina 4 de 16

Page 5: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

create database if not exists dbheroes;use dbheroes;

create table planet ( namep varchar(20), mass decimal(6,2) not null, primary key(namep)) engine=innodb;

create table superheroe( nameh varchar(40), planet varchar(20), intelligence decimal(4,2) not null, strong decimal(4,2) not null, primary key(nameh)) engine=innodb;

insert into planet values ("Mercury",0.06),("Venus",0.82),("Earth",1),("Mars",0.11),("Jupiter",317.8),("Saturn",95.2),("Uranus",14.6),("Neptune",17.2);

alter table superheroe add constraint fk_superhero_planet foreign key (planet) references planet(namep) on delete restrict on update cascade;

insert into superhero values("Superman","earth",round(rand()*100,2),round(rand()*100,2)),("Batman","earth",round(rand()*100,2),round(rand()*100,2)),("Spiderman","earth",round(rand()*100,2),round(rand()*100,2)),("Thor","earth",round(rand()*100,2),round(rand()*100,2)),("Hal Jordan",NULL,round(rand()*100,2),round(rand()*100,2)),("Wonder Woman","earth",round(rand()*100,2),round(rand()*100,2)),("Captain America",NULL,round(rand()*100,2),round(rand()*100,2)),("Martian Manhunter","Mars",round(rand()*100,2),round(rand()*100,2));

Autor: Miquel Boada Pàgina 5 de 16

Page 6: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Subconsultes.En algunes ocasions ens interessa obtenir les files d'una taula resultants de l'execuciód'una altra consulta. Per exemple, si es vol saber el nom del superheroi més intel·ligent,primer caldrà buscar quin és el valor màxim d'intel·ligència i posteriorment seleccionartots els herois que tenen aquesta intel·ligència. Com es pot comprovar en el disseny deltext , el procés consta de dues fases:

1. Obtenir la intel·ligència màxima de la taula.

select max(intelligence) from superhero;

2. Seleccionar els herois que tenen la intel·ligència màxima

select nameh from superhero where …. -- Consulta inacabada!

Per a enllaçar les dues seleccions ho fem a la clausula where. El format de la instrucció és:

select columnes from taula --Instrucció de subconsulta

where columa operador (select agregat(columna) from taula [where condició])

• columnes: columnes dels quals es vol obtenir el valor.• columna: columna que ha de retornar la subconsulta.• operador: operador de comparació (>,<,=,...)• agregat: funció a aplicar a la consulta.• taula: taula o taules sobre la qual es vol fer la consulta.• condició: condició de la subconsulta.

Restriccions• La subconsulta només pot retornar una columna d'una taula. • La subconsulta només pot retornar una única fila.

Autor: Miquel Boada Pàgina 6 de 16

Page 7: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

ExemplesVideo: Subconsulta

-- El nom de tots els superherois que tenen la màxima intel·ligència select nameh from superhero

where intelligence=(select max(intelligence) from superhero);-- El nom de tots els superherois que tenen la una intel·ligència superior a la mitjana -- i estan associats al planeta 'earth'

select nameh from superherowhere intelligence>(select avg(intelligence) from superhero)

and planet='earth'-- El nom de tots els herois que tenen una intel·ligència superior a la mitjana dels-- herois del planeta 'earth'

select nameh from superherowhere intelligence>(select avg(intelligence)

from superhero where planet='earth');

Autor: Miquel Boada Pàgina 7 de 16

Page 8: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Consultes amb múltiples taulesQuan es vol realitzar una consulta en una base de dades és habitual voler obtenir la informacióde columnes emmagatzemades en diferents taules. Quan es volen consultar múltiples tauleses pot fer utilitzant la notació (SQL:1989) o bé la notació (SQL:1992) que és l'estàndard queaplicarem en aquest document. El motiiu d'utilitzar aquesta notació més moderna és per quèfacilita la lectura i comprensió de la consulta i, per tant, és una millor opció.Per a enllaçar diferents taules es poden utilitzar diferents mètodes: Inner join, Left join, Rightjoin, Outer join. Tot i que l'objectiu de cada una d'elles és diferent, la funcionalitat és la mateixaper a tots els mètodes.Els diferents tipus d'enllaç que es poden establir entre les diferents taules es representen en lasegüent taula mitjançant imatges i l'opció associada a cada una d'elles.

Autor: Miquel Boada Pàgina 8 de 16

Page 9: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Intersecció entre els dos conjunts: elements conjunts aambdós conjunts.Clausula: INNER JOIN

Elements només del conjunt esquerra. Directiva: LEFT JOIN

Elements només del conjunt esquerra. Directiva: LEFT JOIN (Sense NULL de TB)

Elements només del conjunt dret. Directiva: RIGHT JOIN

Elements només del conjunt dret. Directiva: RIGHT JOIN (Sense NULL de TA)

Autor: Miquel Boada Pàgina 9 de 16

Page 10: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Elements del conjunt esquerra i dret no comunsDirectiva: OUTER JOIN

Elements dels dos conjuntsDirectiva: UNION

Format instruccióEn una instrucció SQL Select es poden incloure una o més directives «JOIN». A més, es podencombinar aquestes sentències en una mateixa instrucció. Per a cada instrucció «JOIN» calindicar la taula amb la qual es fa l'enllaç i la condició amb la qual s'enllaça la taula: aquestacondició normalment és entre la clau forana i la clau primària de les taules implicades.Utilitzem «ON» per a expressar la condició d'enllaç. En el següent recuadre es mostra el format de la instrucció SELECT amb la clàusula JOINintegrada.

SELECT [ALL | DISTINCT ] select_expr1 [, select_expr2 ...] [FROM table_reference [INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | table_reference ON condition [INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | table_reference ON condition...]] [WHERE where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], …]

Select … JoinQuan s'utilitza la clàusula «JOIN» en una instrucció SQL , cal tenir en compte que la nostraconsulta podrà obtenir informació dels camps o columnes de totes les taules referenciadesdirectament en la clàusula «FROM» o en la pròpia clàusula «JOIN». L'ordre en què

Autor: Miquel Boada Pàgina 10 de 16

Page 11: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

s'especifiquen les taules és indiferent. Les instruccions «Select * from T1 INNER JOIN T2 ON …...» i«Select * from T2 INNER JOIN T1 ON …...» són equivalents.

Inner Join : exemples

-- Obtenir totes les columnes de la taula planet i superheroe on el planeta indicat en la taula superheroe (clauforana) coincideixi amb el nom del planet (namep) de la taula planet.Select * from planet

INNER JOIN superheroe ON planet.namep = superheroe.planet;

Com es pot observar en l'execució , els valors de la columna «namep» i «planet» coincideixen(són les dues columnes que hem utilitzat per a interseccionar les dues taules). Per a eliminarles columnes duplicades l'única opció que hi ha és la d'especificar individualment les columnesa retornar.Podem combinar el join per a filtrar els resultats amb la clàusula «WHERE».

Select superheroe.*, mass from planet INNER JOIN superheroe ON planet.namep = superheroe.planet

where intelligence>50

Simplificació anotació

Noms columnesPer altra banda , la notació (taula.camp) només és necessària si el nom de les columnes és elmateix amb les taules que formen part de la consulta. En les taules «planet» i «superheroe» nohi ha cap nom de columna repetit. Les instruccions anteriors es poden simplificar utilitzantnomés els noms de les columnes.

Select superheroe.*, mass from planet

Autor: Miquel Boada Pàgina 11 de 16

TA: Planet

TB: superhero

Page 12: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

INNER JOIN superheroe ON namep = planet where intelligence>50

Àlies taulesSi entre les taules hi ha molts columnes repetides la inclusió del nom de la taula pot complicarla lectura de la mateixa. El llenguatge SQL ens permet associar un àlies a una taula i poderutilitzar aquest àlies en qualsevol lloc de la consulta. Per assignar un àlies podem fer-hoespecificant directament el nom de l'àlies al costat de la taula o bé utilitzant la paraula AS per aseparar el nom de la taula del propi àlies. L'especificació de l'àlies es pot fer utilitzant majúscules, minúscules o majúscules i minúsculesperò cal tenir en compte que en Linux l'àlies és case sensitive i, per tant, caldrà mantenir elmateix format en tota la sentència.

-- Utilització d'àlies amb AS Select S.*, mass from planet AS P

inner join superheroe AS S on P.namep = S.planet where S.intelligence>50;-- Utilització d'àlies sense especificar ASSelect S.*, mass from planet P

inner join superheroe S on P.namep = S.planet where S.intelligence>50;

Funcionament JOINQuan s'executa una instrucció select que conté la directiva JOIN , el sistema realitza una sèriede taules intermitjes sobre les quals realitza una sèrie d'operacions. La comprensió de comfunciona el sistema és important per a poder entendre millor les instruccions JOIN.Per a simular el funcionament utilitzarem una base de dades amb dues taules amb els valorssegüents:

Base de dades

TA TB

La taula A (TA) disposa d'un únic camp que és l'identificador primariLa taula B (TB) té dos camps, IdB que és l'identificador primari iTAIdA , que és la clau forana a la taula A.

IdA IdB TAIdA

1 A 1

2 B 2

3 C 3

La sentència de la qual es simula el procés és:Select IdB, TAIdA from TA inner join TB on IdA=TAIdA;

Autor: Miquel Boada Pàgina 12 de 16

Page 13: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

PAS 1: Producte cartesià entre les dues taulesEn primer lloc es genera una taula intermitja on s'emmatgatzema el producte cartesià de lesdues taules. Això és, la combinació de cada una de les files de la taula A amb cada una de lesfiles de la taula B.

Taula temporal 1: producte cartesià

IdA (TA)1 IdB (TB) TAIdA (TB)

1 A 1

2 B 1

3 C 1

1 A 2

2 B 2

3 C 2

1 A 3

2 B 3

3 C 3

PAS 2: Selecció files segons ONSeleccionar aquelles files que compleixen la condició especificada en la clàusula «ON». En elnostre cas, aquelles que la primera columna i la tercera continguin el mateix valor.

Taula temporal 2: Clàusula ON

IdA (TA) IdB (TB) TAIdA (TB)

1 A 1

2 B 1

3 C 1

1 A 2

2 B 2

3 C 2

1 A 3

2 B 3

3 C 3

1 Entre parèntesis s'indica la taula a la qual pertany la col·lumna

Autor: Miquel Boada Pàgina 13 de 16

Page 14: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Taula temporal 2 (final) : Clàusula ON

IdA (TA) IdB (TB) TAIdA (TB)

1 A 1

2 B 2

3 C 3

Exemple: Video - join i producte cartesià

PAS 3: Selecció columnesGenerar la tercera taula amb les columnes que realment s'han seleccionat.

Taula temporal 3: selecció columnes Taula temporal 3 (final): selecció columnes

IdA (TA) IdB (TB) TAIdA (TB) IdB (TB) TAIdA (TB)

1 A 1 A 1

2 B 2 B 2

3 C 3 C 3

L'última taula generada és el resultat final de la consulta i conté les dades que visualitzaràl'usuari. Aquest exemple s'ha realitzat amb una consulta simple. Per a veure els diferentsprocessos involucrats en una consulta determinada , podeu incloure la paraula clau EXPLAINabans de la instrucció select.

Explain select IdB, TAIdA from TA inner join TB on IdA=TAIdA;

Autor: Miquel Boada Pàgina 14 de 16

Page 15: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

Left Join/ Right JoinTornant a l'exemple dels superherois volem obtenir tots els planetes queno tenen cap heroi assignat. La consulta , a nivell de conjunts, seria la dela imatge, on TA és la taula de planetes i TB és la taula de superherois. Pera realitzar aquest tipus de consulta cal utilitzar «Left o Right» join, segonssi es volen escollir els elements de l'esquerra (TA) o de la dreta (TB).

Left / Right join : exemples

-- Obtenir tota la informació dels planetes amb el nom del superheroi -- que tenen assignatSelect distinct p.*, s.nameh from planet AS p left join superheroe AS s on p.namep=s.planet;Select distinct p.*, s.nameh from superheroe AS s right join planet AS p on p.namep=s.planet;

Planet Superheroe

Nom Mass Nameh Planet Strong Intelligence

Venus 0.82 Superman Earth 60 50

Earth 1 Batman Earth 50 70

PAS 1: Producte cartesià entre les dues taulesEn primer lloc es genera una taula intermitja on s'emmatgatzema el producte cartesià de lesdues taules , igual que amb inner join. En aquest cas, s'inclouen les files amb valor NULL per lataula dreta (si fem left join) o esquerra (si fem right join).

Producte Cartesià

Nom Mass Nameh Planet Strong Intelligence

Venus 0.82 Superman Earth 60 50

Venus 0.82 Batman Earth 50 70

Earth 1 Superman Earth 60 50

Earth 1 Batman Earth 50 70

Venus 0.82 NULL NULL NULL NULL

Earth 1 NULL NULL NULL NULL

Autor: Miquel Boada Pàgina 15 de 16

Page 16: Consultes amb múltiples taules utilitzant left, right i inner join. Funcionament intern de les consultes. Subconsultes. Utilització àlies.

Desenvolupament aplicacions multiplataforma (DAM)

Mòdul 2 – Bases de dades - UF2 - llenguatges SQL: DML i DDL

Tema 4 – Consultes amb múltiples taules

PAS 2: Selecció filesEs seleccionen totes les files de la taula de l'esquerra. Per aquelles files que tinguin informaciócomuna a les dues taules relacionades amb left join, s'eliminaran aquelles que no compleixinla condició especificada en la clausula «on», excepte que el camp de la segona taula siguiNULL. Si la nostra condició és que el nom del planeta sigui el mateix:

Selecció files que compleixen inner join o NULL

Nom Mass Nameh Planet Strong Intelligence

Venus 0.82 Superman Earth 60 50

Venus 0.82 Batman Earth 50 70

Earth 1 Superman Earth 60 50

Earth 1 Batman Earth 50 70

Venus 0.82 NULL NULL NULL NULL

Earth 1 NULL NULL NULL NULL

PAS 3: Eliminació files duplicadesS'esborren totes aquelles columnes que la primary key tingui valor NULL sempre i quan hi hagiuna altra fila que tingui els mateixos valors però sense valor NULL.

Selecció files que compleixen inner join o NULL

Nom Mass Nameh Planet Strong Intelligence

Earth 1 Superman Earth 60 50

Earth 1 Batman Earth 50 70

Venus 0.82 NULL NULL NULL NULL

Earth 1 NULL NULL NULL NULL

L'última fila de la taula s'elimina perquè la fila (Earth,1) ja existeix en la taula amb valorsdiferents de NULL; primera i segona fila de la taula.

Autor: Miquel Boada Pàgina 16 de 16