Che aspetto ha l'output di un'istruzione JOIN?


8

Volevo usare i join da un po ', ma ho problemi a visualizzare l'output, quindi so come utilizzarlo.

Diciamo che ho 2 tavoli:

CREATE TABLE Cities (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    city tinyblob
);

CREATE TABLE Users (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username TINYBLOB,
    city INT UNSIGNED,
    FOREIGN KEY (city) REFERENCES Cities (id)
);

Se la mia applicazione deve eseguire una query SQL per ottenere i dati del profilo di un utente, come utilizzerei un join per ottenere la città associata al record di un utente e come apparirebbe il record generato?

Risposte:


12

Ogni risultato di un'operazione SQL è funzionalmente una nuova tabella, indipendentemente dal fatto che sia archiviato sul disco o in memoria

La funzione di un join è di "unire" due tabelle insieme in una terza tabella sintetica che (di solito) esiste solo in memoria durante il tempo in cui viene inviata all'applicazione.

Il motivo per utilizzare un join è quello di ridurre le anomalie dei dati , assicurando che i dati vengano visualizzati in un'unica posizione nel database.

Considera quanto segue:

Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)

Qui, ogni volta che il governo cambia i codici postali (cosa che accade completamente troppo frequentemente per i gusti degli sviluppatori di database *) la tabella delle persone dovrà essere aggiornata in modo tale che tutti i vecchi codici postali appartengano correttamente alla città corretta e al nuovo codice postale.

In questo caso, lo stesso codice postale si trova in più tuple della tabella e, se la tabella è modificabile manualmente, sarà soggetta a gravi anomalie di aggiornamento poiché le nuove combinazioni città / codice postale vengono immesse senza che il database nel suo insieme venga aggiornato.

Avendo invece tre tabelle, otteniamo gli stessi dati, ma con maggiore flessibilità e affidabilità (a scapito di alcune prestazioni, sebbene le domande di "denormalizzazione adeguata" siano un argomento per un'altra serie di risposte).

Person ( PersonID Integer Primary Key, FName String, LName String)

City ( CityID Integer Primary Key, City String, State String, ZipCode String )

Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`

E possiamo ottenere una singola "tabella" da quanto sopra attraverso la seguente query: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Questo ci consente di aggiornare le singole tabelle ogni volta che cambia qualcosa di specifico su di esse, senza corrompere il resto dei dati associati.

An INNER JOINè il tipo predefinito di join. In parole povere nota: "combina le tuple in cui questo record dalla tabella a corrisponde a questo record dalla tabella b" Gli altri tipi di join sono OUTER JOINSe ciò che è noto come a CARTESIAN PRODUCT. Un join esterno è "Prendi tutto dalla tabella sinistra o destra (come specificato) e dove corrisponde l'altra tabella, uniscilo. Dove non corrisponde, riempilo con valori null" E un prodotto cartesiano (senza entrare nell'algebra relazionale è: prendi ogni possibile combinazione di tuple in entrambe le tabelle e le emette in una tabella, senza far corrispondere nulla.

* Più che mai, specialmente nel caso di spostare i confini dei codici postali a causa della gerrymandering


6

Penso che tu stia cercando

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

che ti darebbe

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

ma non crederci sulla parola: provalo sul tuo database e vedi cosa ottieni!


3

In breve, l'istruzione SQL sarà:

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn saranno i campi che vorresti recuperare - da una o entrambe le schede.


La parentesi non è obbligatoria, rende la query più difficile da leggere.
Spredzy

1
@Spredzy Reverse è il caso per me, Parenthesis aumenta la leggibilità per me
Sathyajith Bhat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.