In ogni vero database relazionale, tuttol'informazione è divisa in tabelle separate. Molte delle tabelle hanno stabilito relazioni nel circuito tra loro. Tuttavia, con l'aiuto delle query Sql, è abbastanza possibile creare una connessione tra i dati che non sono contenuti nello schema. Ciò viene eseguito eseguendo un'operazione di join join, che consente di creare relazioni tra qualsiasi numero di tabelle e di connettere anche dati apparentemente disparati.
In questo articolo parleremo in modo specifico della connessione esterna sinistra. Prima di iniziare a descrivere questo tipo di connessione, aggiungiamo alcune tabelle al database.
Diciamo che il nostro database ha informazionisulle persone e il loro patrimonio immobiliare. Le informazioni di base si basano su tre tabelle: Popoli (persone), Realtà (beni immobili), Realty_peoples (la tabella con la relazione a chi delle persone quale proprietà appartiene). Supponiamo che i seguenti dati siano memorizzati in tabelle per le persone:
popoli | ||||
id | L_name | f_nome | Middle_name | compleanno |
1 | Ivanova | Daria | B. | 16.07.2000 |
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 |
3 | Evgenin | Alexander | Federovich | 30.04.1964 |
4 | Annina | amare | P. | 31.12.1989 |
5 | Gerasimovsky | sperare | P. | 14.03.1992 |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 |
Immobiliare:
immobili | |
id | indirizzo |
1 | Arkhangelsk, st. Voronina, 7, ap 6 |
2 | Arkhangelsk, st. Severodvinskaya, 84, App. 9, stanza. 5 |
3 | Regione di Arkhangelsk, Severodvinsk, ul. Lenina, D. 134, apt. 85 |
4 | Regione di Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
5 | Arkhangelsk, pl. Terekhin, D. 89, apt. 13 |
Per le relazioni, le persone sono proprietà immobiliari:
Realty_peoples | ||
id_peoples | id_realty | tipo |
7 | 3 | Comune proprietà comune |
8 | 3 | Comune proprietà comune |
3 | 5 | proprietà |
7 | 1 | proprietà |
5 | 4 | Proprietà condivisa |
6 | 4 | Proprietà condivisa |
La connessione sinistra ha la seguente sintassi:
Table_A LEFT JOIN table_B [{ON predicato} | {USING elenco_con iltolbtsov}] |
E sembra questo:
E questa espressione è tradotta come "Seleziona tuttosenza righe di eccezione dalla tabella A e dalla tabella B, vengono visualizzate solo le righe corrispondenti al predicato. Se nella tabella B non esisteva alcuna coppia per le righe della tabella A, allora riempire le colonne Null risultanti con i valori. "
Molto spesso, quando viene eseguita la connessione a sinistra, viene specificato ON, USING viene utilizzato solo quando i nomi di colonna per i quali è pianificata la connessione sono gli stessi.
Con l'aiuto della connessione a sinistra, possiamo vedere se tutte le persone nella lista dei Popoli hanno beni immobili. Per fare ciò, eseguire il seguente esempio nel sql di join sinistro:
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type DAI POPOLI SINISTRA: Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
E otteniamo il seguente risultato:
Query1 | ||||||
id | L_name | f_nome | Middle_name | compleanno | id_realty | tipo |
1 | Ivanova | Daria | B. | 16.07.2000 | ||
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 | ||
3 | Evgenin | Alexander | Federovich | 30.04.1964 | 5 | proprietà |
4 | Annina | amare | P. | 31.12.1989 | ||
5 | Gerasimovsky | sperare | P. | 14.03.1992 | 4 | Proprietà condivisa |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Proprietà condivisa |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 1 | proprietà |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 3 | Comune proprietà comune |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Comune proprietà comune |
Come potete vedere, Ivanova Darya, Pugin Vladislav e Annina Lyubov non hanno alcun diritto registrato al settore immobiliare.
E cosa otterremmo usando un join di Inner join? Come sai, esclude le righe non corrispondenti, quindi tre persone del nostro campione finale semplicemente cadono:
Query1 | ||||||
id | L_name | f_nome | Middle_name | compleanno | id_realty | tipo |
3 | Evgenin | Alexander | Federovich | 30.04.1964 | 5 | proprietà |
5 | Gerasimovsky | sperare | P. | 14.03.1992 | 4 | Proprietà condivisa |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Proprietà condivisa |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 1 | proprietà |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 3 | Comune proprietà comune |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Comune proprietà comune |
Sembrerebbe che anche la seconda opzione rispondacondizioni del nostro compito. Tuttavia, se continuiamo ad aggiungere sempre più tavoli, tre persone dal risultato spariranno irrimediabilmente. Pertanto, in pratica, quando si combinano più tabelle, le connessioni sinistra e destra vengono utilizzate molto più spesso di Inner join.
Continuiamo a considerare esempi con left join sql. Unisciti al tavolo con gli indirizzi delle nostre proprietà:
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type, Realty.address DALLE POPOLI SINISTRA UNISCITI Realty_peoples ON Peoples.id = Realty_peoples.id_peoples LEFT JOIN Realty ON Realty.id = Realty_peoples.id_realty |
Ora otteniamo non solo la forma del diritto, ma anche gli indirizzi del settore immobiliare:
Query1 | |||||||
id | L_name | f_nome | Middle_name | compleanno | id_realty | tipo | indirizzo |
1 | Ivanova | Daria | B. | 16.07.2000 | |||
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 | |||
3 | Evgenin | Alexander | Federovich | 30.04.1964 | 5 | proprietà | Arkhangelsk, pl. Terekhin, D. 89, apt. 13 |
4 | Annina | amare | P. | 31.12.1989 | |||
5 | Gerasimovsky | sperare | P. | 14.03.1992 | 4 | Proprietà condivisa | Regione di Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Proprietà condivisa | Regione di Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 3 | Comune proprietà comune | Regione di Arkhangelsk, Severodvinsk, ul. Lenina, D. 134, apt. 85 |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 1 | proprietà | Arkhangelsk, st. Voronina, 7, ap 6 |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Comune proprietà comune | Regione di Arkhangelsk, Severodvinsk, ul. Lenina, D. 134, apt. 85 |
Gli errori principali consentiti con il join esterno sinistro delle tabelle sono due:
Considera il primo errore. Prima di risolvere qualsiasi problema, vale la pena capire chiaramente cosa esattamente vogliamo ottenere come risultato. Nell'esempio sopra, abbiamo eliminato tutte le persone, ma abbiamo perso assolutamente informazioni sull'oggetto sotto il numero 2, da cui il proprietario non è stato trovato.
Se spostassimo le tabelle nei posti della query e iniziassimo con "... Da parte di Realty, lasciate Peoples ...", non perderemmo una proprietà singola, che non si può dire delle persone.
Ma non avere paura della connessione sinistra, passare a pieno esterno, che è incluso nei risultati e la corrispondenza, e non le righe.
Dopo tutto, il volume dei campioni è spesso molto grande ed extradati effettivi a nulla. La cosa principale - per capire cosa si vuole ottenere un risultato: di tutte le persone con una lista di loro proprietà a disposizione o l'intero elenco delle proprietà con i loro proprietari (se presente).
Il secondo errore è anche legato alla perdita di dati e non sempre immediatamente ovvio.
Torniamo alla query, quando usiamo la connessione di sinistra dati ricevuti su tutte le persone e le loro proprietà immobiliari esistenti. Ricorda quanto segue con l'esempio di sql di join sinistro:
DAI POPOLI SINISTRA: Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
Supponiamo di voler perfezionare la query e non di produrre dati, dove il tipo di legge è "Proprietà". Se aggiungiamo semplicemente, applicando left join sql, un esempio della seguente condizione:
...
Dove tipo <> "Proprietà" |
perderemo dati su persone che non hanno alcun immobile, perché il valore vuoto di Null non si confronta in questo modo:
Query1 | ||||||
id | L_name | f_nome | Middle_name | compleanno | id_realty | tipo |
5 | Gerasimovsky | sperare | P. | 14.03.1992 | 4 | Proprietà condivisa |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Proprietà condivisa |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 3 | Comune proprietà comune |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Comune proprietà comune |
Per evitare che si verifichino degli errori per questo motivo, è meglio specificare la condizione di selezione immediatamente dopo la connessione. Suggeriamo di considerare il seguente esempio con il join sinistro sql.
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type DALLE POPOLI LISTA SINISTRA Realty_peoples ON (Peoples.id = Realty_peoples.id_peoples AND type <> "Property") |
Il risultato è il seguente:
Query1 | ||||||
id | L_name | f_nome | Middle_name | compleanno | id_realty | tipo |
1 | Ivanova | Daria | B. | 16.07.2000 | ||
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 | ||
3 | Evgenin | Alexander | Federovich | 30.04.1964 | ||
4 | Annina | amare | P. | 31.12.1989 | ||
5 | Gerasimovsky | sperare | P. | 14.03.1992 | 4 | Proprietà condivisa |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Proprietà condivisa |
7 | Sukhanovskaya | giuria | A. | 25.09.1976 | 3 | Comune proprietà comune |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Comune proprietà comune |
Quindi, eseguendo un semplice esempio con il join di sinistra sql, abbiamo ottenuto un elenco di tutte le persone, deducendo inoltre, quale di loro ha un immobile in proprietà condivisa / condominiale.
Per concludere vorrei nuovamenteper sottolineare che è necessario prendere responsabilmente la scelta di qualsiasi informazione dal database. Molte sfumature si sono aperte davanti a noi con l'uso di left join sql un semplice esempio, la cui spiegazione è una - prima di iniziare a comporre anche una query elementare, dobbiamo capire attentamente cosa esattamente vogliamo ottenere come risultato. Buona fortuna!
</ p>