Unul dintre cele mai mari beneficii ale utilizării bazelor de date relaționale, cum ar fi MySQL, este că structura sa relațională vă permite să stocați cu ușurință și să interogați informații pe mai multe tabele.

Să explorăm cum să extrageți exact datele pe care le doriți din mai multe tabele de baze de date și diferitele îmbinări disponibile care vă permit să extrageți rezultatele exacte pe care le doriți.

Inițializați baza de date eșantion

Acest lucru nu este necesar, dar dacă doriți să urmați împreună cu exemplele din acest articol, puteți inițializa o bază de date mostră local cu comenzile de mai jos ale terminalului:

git clona https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> SELECT COUNT (*) DIN clienți;

Ar trebui să obțineți un rezultat afirmând că există 2000 de rânduri în cadrul Clienți masa.

Implicit / Inner Join

Alăturarea implicită utilizată în Baze de date MySQL se numește unirea INNER și este cea mai comună și directă. Această asociere returnează toate înregistrările pentru care există înregistrări potrivite în ambele tabele și respinge toate celelalte înregistrări.

instagram viewer

Cum să vă conectați la o bază de date MySQL cu Java

Java oferă JDBC ca parte a Java SDK. În acest articol, să analizăm detaliile conectării la o bază de date MySQL și efectuarea de interogări cu aceasta.

De exemplu, dacă doriți să vedeți numele și prenumele clientului, plus suma și data comenzii pentru toate comenzile mai mari de 1000 USD, puteți utiliza următoarea declarație SQL:


SELECTAȚI
c.id, c.first_name, c.last_name, o.sum, o.created_at
DIN
clienți c, comenzi o
UNDE
o.customer_id = c.id ȘI o.suma> = 1000;

Câteva note cu privire la interogarea de mai sus:

  • Sunt selectate cinci coloane diferite, trei din tabelul clienților și două din tabelul comenzilor.
  • În cadrul clauzei FROM, cele două tabele sunt definite, dar sunt completate cu literele „c” și „o”. Acestea specifică pur și simplu aliasuri în SQL, pot fi orice doriți și sunt utilizate pentru a scurta interogarea SQL.
  • o.customer_id = c.id este aspectul de asociere al interogării și asigură o corelație adecvată între clienți și comenzi.

Mai jos este un mod diferit și din punct de vedere tehnic mai corect din punct de vedere sintactic de a scrie aceeași interogare:


SELECTAȚI
c.id, c.first_name, c.last_name, o.sum, o.created_at
DIN
clienți c comenzi INNER JOIN o
PE
client_id = c.id
UNDE
o.sum>> 1000;

Interogarea de mai sus tinde să fie puțin mai ușor de citit, deoarece puteți vedea cu ușurință îmbinarea dintre clienți și tabelul comenzilor. Totuși, din toate punctele de vedere, aceste două interogări sunt aceleași și vor produce exact aceleași înregistrări.

STÂNGA Alătură-te

Alăturările din stânga vor returna toate înregistrările din tabelul din stânga care se potrivesc și cu înregistrările din tabelul din dreapta și vor respinge toate celelalte înregistrări. De exemplu, poate doriți să vedeți suma totală a vânzărilor pentru fiecare produs din baza de date, puteți încerca să utilizați o interogare precum:


SELECTAȚI
p.name, sum (item.amount) AS tamount
DIN
comenzi_articole articol LEFT JOIN produse p
PE
item.product_id = p.id
GROUP BY item.product_id ORDER BY tamount DESC

Aceasta are ca rezultat o vizualizare frumoasă în două coloane care arată numele produsului cu suma totală a vânzărilor și funcționează conform așteptărilor. Interogarea a parcurs toate produsele din tabelul comenzi_elemente, le-a alăturat înregistrărilor din tabelul de produse și a returnat suma totală a vânzărilor fiecăruia.

DREAPTA Se alătură

Folosind exemplul de mai sus, observați faptul că interogarea de mai sus a returnat doar 19 înregistrări, în timp ce există un total de 22 de produse în baza de date. Acest lucru se datorează faptului că interogarea a început cu tabelul orders_items și a lăsat-o la tabelul de produse și deoarece unele produse nu au fost niciodată comandate, nu există înregistrări ale produselor respective în comenzile_elemente masa.

Ce se întâmplă dacă doriți să obțineți o listă a tuturor produselor cu sume de vânzări, inclusiv a produselor care nu au fost comandate? Încercați o alăturare corectă cu următoarea interogare:


SELECTAȚI
p.name, sum (item.amount) AS tamount
DIN
articole comenzi_articole ÎNREGISTRARE DREPT p
PE
item.product_id = p.id
GRUPA PE P.ID COMANDĂ ÎNTRE DESCĂRĂTORI

Este mai bine, iar interogarea returnează acum cele 22 de produse complete, dintre care trei au o sumă de nul. Acest lucru se datorează faptului că, în loc de a utiliza comenzi_iteme ca tabel principal care se alătură la tabelul de produse, unirea dreaptă răstoarnă comanda și alătură tabelul de produse la tabelul comenzi_iteme.

Îmbinări multiple într-o interogare

Uneori aveți nevoie să uniți trei sau mai multe tabele împreună pentru a obține un anumit set de rezultate.

De exemplu, poate doriți o listă cu toți clienții care au achiziționat cuptorul cu microunde (codul produsului nr. 1), inclusiv numele și data comenzii. Acest lucru necesită o SELECȚIE pe trei tabele care se poate face folosind două îmbinări cu următoarea interogare:


SELECTAȚI
c.first_name, c.last_name, o.sum, o.created_at
DIN
clienți c comenzi INNER JOIN o
PE
c.id = o.customer_id INNER JOIN ordine_items element
PE
item.order_id = o.id
UNDE
item.product_id = 1 COMANDĂ DE o.created_at;

Această interogare returnează toate cele 426 de comenzi ale cuptorului cu microunde și funcționează conform așteptărilor. Mai întâi se potrivește cu toți clienții la comenzile lor respective, apoi cu alte întrebări care rezultă din potrivirea tuturor comenzilor doar cu cele din tabelul comenzilor_elemente care conțin produsul cu microunde (ID # 1).

Nu utilizați niciodată subinterogări cu clauze IN

Ca un rezumat rapid, cu orice preț ar trebui să evitați întotdeauna utilizarea subinterogărilor cu interogările dvs. SQL, cum ar fi:

SELECT prenume, prenume FROM clienți WHERE id IN (SELECT client_id FROM comenzi WHERE status = 'aprobat' ȘI sumă <100);

Întrebările precum cele de mai sus sunt foarte ineficiente, utilizează un număr mare de resurse și ar trebui evitate pe cât posibil. În schimb, utilizați îmbinări adecvate așa cum este subliniat în secțiunile de mai sus. De exemplu, interogarea de mai sus trebuie rescrisă ca:

SELECT c.first_name, c.last_name DIN clienți c LEFT JOIN comenzi o ON o.customer_id = c.id WHERE o.status = 'aprobat' ȘI o.sumt <100;

Economisiți timp cu SQL Joins

Sperăm că acest articol vă va ajuta să vă arătați puterea bazelor de date relaționale, cum ar fi MySQL, și cum să construiți Interogări SQL care recuperează înregistrări din mai multe tabele dintr-o singură interogare folosind uniri, permițându-vă să extrageți rezultatele exacte dorite.

Ați învățat trei asocieri diferite în SQL, cum să aliasați numele coloanelor și tabelelor, să folosiți mai multe asocieri într-o singură interogare și de ce ar trebui să evitați subinterogările. Nu vă mai grăbiți niciodată încercând să compilați manual diferite seturi de date într-unul și începeți să utilizați îmbinări pentru a vă impresiona colegii de lucru și pentru a economisi timp.

E-mail
10 moduri de a crea documente Google frumoase

Google Docs este acum o centrală de birou. Cu ajutorul acestor suplimente, puteți face ca Google Docs să arate frumos și elegant.

Subiecte asemănătoare
  • Programare
  • SQL
  • Bază de date
Despre autor
Matt Dizak (13 articole publicate)Mai multe de la Matt Dizak

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Încă un pas…!

Vă rugăm să confirmați adresa de e-mail în e-mailul pe care tocmai vi l-am trimis.

.