MySQL PARTECIPA al Tutorial: INTERNO, ESTERNO, SINISTRA, DESTRA, CROCE

Anonim

Cosa sono i JOINS?

I join aiutano a recuperare i dati da due o più tabelle di database. Le tabelle sono reciprocamente correlate utilizzando chiavi primarie ed esterne.

Nota: JOIN è l'argomento più frainteso tra gli esperti di SQL. Per motivi di semplicità e facilità di comprensione, utilizzeremo un nuovo database per fare pratica con il campione. Come mostrato di seguito

id nome di battesimo cognome movie_id
1 Adamo fabbro 1
2 Ravi Kumar 2
3 Susan Davidson 5
4 Jenny Adrianna 8
6 Lee Pong 10
id titolo categoria
1 ASSASSIN'S CREED: EMBERS Animazioni
2 Real Steel (2012) Animazioni
3 Alvin and the Chipmunks Animazioni
4 Le avventure di Tin Tin Animazioni
5 Sicuro (2012) Azione
6 Safe House (2012) Azione
7 GIA 18+
8 Scadenza 2009 18+
9 L'immagine sporca 18+
10 Marley e io Romanza

Tipi di join

Cross JOIN

Cross JOIN è una forma più semplice di JOIN che abbina ogni riga di una tabella di database a tutte le righe di un'altra.

In altre parole, ci fornisce combinazioni di ogni riga della prima tabella con tutti i record nella seconda tabella.

Supponiamo di voler ottenere tutti i record dei membri rispetto a tutti i record di film, possiamo usare lo script mostrato di seguito per ottenere i risultati desiderati.

SELECT * FROM `movies` CROSS JOIN `members`

L'esecuzione dello script precedente in MySQL workbench ci dà i seguenti risultati.

 
id title id first_name last_name movie_id
1 ASSASSIN'S CREED: EMBERS Animations 1 Adam Smith 1
1 ASSASSIN'S CREED: EMBERS Animations 2 Ravi Kumar 2
1 ASSASSIN'S CREED: EMBERS Animations 3 Susan Davidson 5
1 ASSASSIN'S CREED: EMBERS Animations 4 Jenny Adrianna 8
1 ASSASSIN'S CREED: EMBERS Animations 6 Lee Pong 10
2 Real Steel(2012) Animations 1 Adam Smith 1
2 Real Steel(2012) Animations 2 Ravi Kumar 2
2 Real Steel(2012) Animations 3 Susan Davidson 5
2 Real Steel(2012) Animations 4 Jenny Adrianna 8
2 Real Steel(2012) Animations 6 Lee Pong 10
3 Alvin and the Chipmunks Animations 1 Adam Smith 1
3 Alvin and the Chipmunks Animations 2 Ravi Kumar 2
3 Alvin and the Chipmunks Animations 3 Susan Davidson 5
3 Alvin and the Chipmunks Animations 4 Jenny Adrianna 8
3 Alvin and the Chipmunks Animations 6 Lee Pong 10
4 The Adventures of Tin Tin Animations 1 Adam Smith 1
4 The Adventures of Tin Tin Animations 2 Ravi Kumar 2
4 The Adventures of Tin Tin Animations 3 Susan Davidson 5
4 The Adventures of Tin Tin Animations 4 Jenny Adrianna 8
4 The Adventures of Tin Tin Animations 6 Lee Pong 10
5 Safe (2012) Action 1 Adam Smith 1
5 Safe (2012) Action 2 Ravi Kumar 2
5 Safe (2012) Action 3 Susan Davidson 5
5 Safe (2012) Action 4 Jenny Adrianna 8
5 Safe (2012) Action 6 Lee Pong 10
6 Safe House(2012) Action 1 Adam Smith 1
6 Safe House(2012) Action 2 Ravi Kumar 2
6 Safe House(2012) Action 3 Susan Davidson 5
6 Safe House(2012) Action 4 Jenny Adrianna 8
6 Safe House(2012) Action 6 Lee Pong 10
7 GIA 18+ 1 Adam Smith 1
7 GIA 18+ 2 Ravi Kumar 2
7 GIA 18+ 3 Susan Davidson 5
7 GIA 18+ 4 Jenny Adrianna 8
7 GIA 18+ 6 Lee Pong 10
8 Deadline(2009) 18+ 1 Adam Smith 1
8 Deadline(2009) 18+ 2 Ravi Kumar 2
8 Deadline(2009) 18+ 3 Susan Davidson 5
8 Deadline(2009) 18+ 4 Jenny Adrianna 8
8 Deadline(2009) 18+ 6 Lee Pong 10
9 The Dirty Picture 18+ 1 Adam Smith 1
9 The Dirty Picture 18+ 2 Ravi Kumar 2
9 The Dirty Picture 18+ 3 Susan Davidson 5
9 The Dirty Picture 18+ 4 Jenny Adrianna 8
9 The Dirty Picture 18+ 6 Lee Pong 10
10 Marley and me Romance 1 Adam Smith 1
10 Marley and me Romance 2 Ravi Kumar 2
10 Marley and me Romance 3 Susan Davidson 5
10 Marley and me Romance 4 Jenny Adrianna 8
10 Marley and me Romance 6 Lee Pong 10

INNER JOIN

Il JOIN interno viene utilizzato per restituire righe da entrambe le tabelle che soddisfano la condizione specificata.

Supponiamo di voler ottenere l'elenco dei membri che hanno noleggiato film insieme ai titoli dei film da loro noleggiati. Puoi semplicemente usare un INNER JOIN per quello, che restituisce le righe di entrambe le tabelle che soddisfano determinate condizioni.

SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`

L'esecuzione dello script precedente give

 
first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me

Nota che lo script dei risultati sopra può essere scritto come segue per ottenere gli stessi risultati.

SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`

JOIN esterno

I MySQL Outer JOIN restituiscono tutti i record corrispondenti da entrambe le tabelle.

Può rilevare record che non hanno corrispondenza nella tabella unita. Restituisce valori NULL per i record della tabella unita se non viene trovata alcuna corrispondenza.

Sembra confuso? Diamo un'occhiata a un esempio:

UNISCI A SINISTRA

Supponiamo ora di voler ottenere i titoli di tutti i film insieme ai nomi dei membri che li hanno noleggiati. È chiaro che alcuni film non sono stati noleggiati da nessuno. Possiamo semplicemente usare LEFT JOIN per lo scopo.

LEFT JOIN restituisce tutte le righe della tabella a sinistra anche se non sono state trovate righe corrispondenti nella tabella a destra. Se non sono state trovate corrispondenze nella tabella a destra, viene restituito NULL.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`

L'esecuzione dello script sopra in MySQL workbench dà. Puoi vedere che nel risultato restituito che è elencato sotto quello per i film che non sono noleggiati, i campi del nome del membro hanno valori NULL. Ciò significa che nessun membro corrispondente ha trovato la tabella dei membri per quel particolare film.

 
title first_name last_name
ASSASSIN'S CREED: EMBERS Adam Smith
Real Steel(2012) Ravi Kumar
Safe (2012) Susan Davidson
Deadline(2009) Jenny Adrianna
Marley and me Lee Pong
Alvin and the Chipmunks NULL NULL
The Adventures of Tin Tin NULL NULL
Safe House(2012) NULL NULL
GIA NULL NULL
The Dirty Picture NULL NULL
Note: Null is returned for non-matching rows on right

PARTECIPA A DESTRA

RIGHT JOIN è ovviamente l'opposto di LEFT JOIN. RIGHT JOIN restituisce tutte le colonne della tabella a destra anche se non sono state trovate righe corrispondenti nella tabella a sinistra. Dove non sono state trovate corrispondenze nella tabella a sinistra, viene restituito NULL.

Nel nostro esempio, supponiamo che sia necessario ottenere i nomi dei membri e i film da loro noleggiati. Ora abbiamo un nuovo membro che non ha ancora noleggiato nessun film

SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`

L'esecuzione dello script precedente in MySQL workbench fornisce i seguenti risultati.

 
first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me
NULL NULL Alvin and the Chipmunks
NULL NULL The Adventures of Tin Tin
NULL NULL Safe House(2012)
NULL NULL GIA
NULL NULL The Dirty Picture
Note: Null is returned for non-matching rows on left

Clausole "ON" e "USING"

Negli esempi di query JOIN sopra, abbiamo utilizzato la clausola ON per abbinare i record tra le tabelle.

La clausola USING può essere utilizzata anche per lo stesso scopo. La differenza con USING è che deve avere nomi identici per le colonne corrispondenti in entrambe le tabelle.

Nella tabella "movies" finora abbiamo utilizzato la sua chiave primaria con il nome "id". Abbiamo fatto riferimento allo stesso nella tabella "membri" con il nome "movie_id".

Rinominiamo il campo "id" delle tabelle "film" per avere il nome "id_film". Lo facciamo per avere nomi di campo identici.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

Quindi usiamo USING con l'esempio di LEFT JOIN sopra.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )

Oltre a usare ON e USING con JOINs puoi usare molte altre clausole MySQL come GROUP BY, WHERE e persino funzioni come SUM , AVG , ecc.

Perché dovremmo usare i join?

Ora potresti pensare, perché usiamo JOIN quando possiamo fare la stessa attività eseguendo query. Soprattutto se hai una certa esperienza nella programmazione di database, sai che possiamo eseguire le query una per una, usa l'output di ciascuna nelle query successive. Ovviamente è possibile. Ma usando i JOIN, puoi portare a termine il lavoro usando solo una query con qualsiasi parametro di ricerca. D'altra parte MySQL può ottenere prestazioni migliori con i JOIN poiché può utilizzare l'indicizzazione. Il semplice utilizzo di una singola query JOIN invece di eseguire più query riduce il sovraccarico del server. L'uso di più query invece porta a più trasferimenti di dati tra MySQL e applicazioni (software). Inoltre richiede più manipolazioni dei dati anche alla fine dell'applicazione.

È chiaro che possiamo ottenere migliori prestazioni di MySQL e delle applicazioni utilizzando i JOIN.

Sommario

  • I JOINS ci consentono di combinare i dati di più di una tabella in un unico set di risultati.
  • I JOINS hanno prestazioni migliori rispetto alle query secondarie
  • INNER JOINS restituiscono solo le righe che soddisfano i criteri specificati.
  • OUTER JOINS può anche restituire righe in cui non sono state trovate corrispondenze. Le righe senza corrispondenza vengono restituite con la parola chiave NULL.
  • I principali tipi di JOIN includono Inner, Left Outer, Right Outer, Cross JOINS ecc.
  • La clausola utilizzata di frequente nelle operazioni JOIN è "ON". La clausola "USING" richiede che le colonne corrispondenti abbiano lo stesso nome.
  • I JOINS possono essere utilizzati anche in altre clausole come GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS ecc.