Extragerea datelor din mai multe tabele

Material de referință pentru limbile de programare majore și aspectul site-ului.

O tehnică gata de a crea site-uri dinamice simple și complexe, folosind PHP și MySQL.

Dezvoltarea de site-uri web sub "cheie".

Dezvoltarea de fragmente separate de site-uri, sfaturi cu privire la aspectele legate de aspectul paginilor web și programarea web.

Instrumentul bazat pe web

magazin web

Servicii Web

Grafica web

Resursele web

Extragerea datelor din mai multe tabele







Vrei să ții pasul cu evenimentele care au loc pe site? Abonați-vă pentru a primi ultimele știri și articole.

Uită-te la Google

Extragerea datelor din mai multe tabele

Extragerea datelor din mai multe tabele

Aceste date sunt stocate în tabele diferite, deoarece se referă la diferite obiecte reale. Acesta este unul dintre principiile unui proiect bun de baze de date.

Deși la prima vedere operația de conectare este destul de simplă, de fapt este una dintre cele mai complexe și delicate aspecte ale SQL. În MySQL sunt implementate mai multe tipuri diferite de conexiuni, fiecare dintre acestea fiind conceput pentru anumite scopuri.

Conectarea simplă a două mese

Să începem cu Sidorov Vladimir căutare:

mysql> selectați comenzile. ordine, comenzi, sumă, comenzi.date
-> de la clienți, comenzi
-> unde customers.name = 'Sidorov Vladimir'
-> și clienții. customerid = orders.customerid;

Rezultatul va fi:

Mai multe puncte trebuie menționate aici.

Prin listarea a două tabele, specificați și tipul conexiunii, poate chiar și fără să o cunoașteți. O virgulă între numele tabelei este echivalentă cu construcțiile INNER JOIN (conexiune internă) sau CROSS JOIN (cross-connect). Acest tip de conexiune se numește de asemenea o îmbinare completă sau un produs cartesian de tabele. Aceasta înseamnă următoarele: "Luați tabelele specificate și le faceți una mare". O masă mare ar trebui să conțină un șir pentru orice combinație posibilă de rânduri din fiecare tabel listată în listă, indiferent dacă are sens sau nu. Cu alte cuvinte, obținem un tabel în care fiecare rând al tabelului clientului este mapat la fiecare rând al tabelului de comenzi, indiferent de ce comenzi au făcut anumiți clienți.

În majoritatea cazurilor, o astfel de conexiune nu are prea mult sens. De regulă, avem nevoie de șiruri care coincid cu adevărat, adică Când comenzile specifice corespund clienților cu care au fost făcuți.

Acest lucru se realizează prin plasarea condiției de îmbinare în clauza WHERE. Acesta este un tip special de afirmație condiționată care explică care atribute reflectă relația dintre cele două tabele. În acest caz, condiția noastră de conectare a fost următoarea:

și clienții. customerid = orders.customerid

care cere MySQL să pună în tabelul rezultat numai acele linii pentru care clientul din tabelul clientului este clientul tabelului de comenzi.

Prin inserarea acestei condiții în interogare, am obținut, în esență, o conexiune de tip diferit - o conexiune de egalitate.

Notați notația punctului, pe care am folosit-o pentru a specifica coloana specifică a unui anumit tabel. De exemplu, customers.customerid se referă la coloana clientid din tabelul Clienți și comenzi.customerid se referă la coloana clientid din tabelul de comenzi.

Notarea punctului este necesară atunci când numele coloanelor sunt ambigue, ceea ce se întâmplă dacă aceleași nume apar în mai multe tabele.

Ca extensie, îl puteți folosi pentru a distinge numele coloanelor din diferite baze de date. În exemplul nostru, notația arată ca table.column (table.column). De asemenea, puteți să specificați database.table.column (database_data.table.column), de exemplu, pentru a verifica o condiție, cum ar fi:

Pe de altă parte, o notație de punct poate fi aplicată tuturor referințelor la coloanele din interogare. Acest lucru deseori elimină durerile de cap inutile, mai ales când anchetele devin mai complexe. MySQL nu necesită acest lucru, dar cererile citibile nu sunt atât de rău. Dacă observați, respectăm acest principiu în toate exemplele noastre, luați cel puțin o astfel de condiție:







clienții. nume = 'Sidorov Vladimir'

Coloana nume este prezentă numai în tabelul clienților, deci nu trebuie să specificați, dar este, în general, mai clară.

Alăturați-vă la trei sau mai multe mese

Intrarea într-un număr mare de mese nu este mai dificilă decât aderarea la două mese. Principala regulă este că trebuie să combinați mesele în perechi, luând în considerare condițiile uniunii. Aceasta poate fi reprezentată ca relația dintre tabelele din fiecare pereche.

De exemplu, dacă doriți să aflați care dintre clienții au comandat cărți de dezvoltare a site-urilor Web folosind PHP și Mysql, trebuie să urmăriți aceste relații într-un număr mic de mese.

Va trebui să găsiți clienți care au plasat cel puțin o comandă care conține comanda_iteme corespunzătoare cărții de dezvoltare a site-urilor Web folosind PHP și Mysql. Din tabelul cu clienții, trecem la tabelul de comenzi, folosind clientid, ca și în cazurile anterioare. Din tabelul de ordine din tabelul order_items, folosind orderid. De la order_items - în tabelul cărților pentru cartea dorită, ghidată de numărul ISBN. După ce toate legăturile sunt stabilite, putem cere cărți cu cuvântul "Dezvoltare" în titlu și pentru a obține numele clienților care au cumpărat oricare dintre aceste cărți ca rezultat.

Să analizăm interogarea care efectuează acțiunile descrise:

mysql> selectați customers.name
-> de la clienți, comenzi, order_items, cărți
-> where customers.customerid = orders.customerid
-> și orders.orderid = order_items.orderid
-> și order_items.isbn = books.isbn
-> și books.title ca '% Dezvoltare%';

Această interogare va returna următorul rezultat:

Rețineți că am urmărit datele din patru tabele diferite, iar pentru a face acest lucru cu egalitate, au fost necesare trei condiții diferite de îmbinare. În mod obișnuit, fiecare pereche de tabele necesită o condiție de îmbinare, astfel încât numărul de condiții de asociere pe unitate este mai mic decât numărul de tabele care urmează să fie fuzionate. Această regulă de ansamblu poate fi utilă atunci când depanați interogări care rulează erratic. Verificați termenii și condițiile și asigurați-vă că ați urmat întotdeauna calea dorită, de la ceea ce știți deja - la ceea ce trebuie să știți.

Găsirea rândurilor necorespunzătoare

Un alt tip comun de conexiune în Mysql este o conexiune din stânga.

În exemplele anterioare, au fost selectate numai acele rânduri în care a fost observată corespondența dintre tabele. Cu toate acestea, sunt necesare și linii care nu se potrivesc. De exemplu, trebuie să găsiți clienți care nu au făcut comenzi sau cărți pe care nimeni nu le-a comandat.

Cea mai simplă versiune a răspunsului la o astfel de întrebare în Mysql implică utilizarea unei conexiuni din stânga, în care căutarea rândurilor este efectuată în funcție de condiția de conectare specificată a celor două tabele. Dacă nu există un rând de potrivire în tabelul din dreapta, se adaugă un șir de valoare zero în rezultatul din coloanele corespunzătoare.

mysql> selectați clienții. customerid, customers.name, comenzi. IDComandă
-> de la clienți
-> pe clienți.customerid = comenzi. CodClient;

Această interogare SQL utilizează o conexiune stânga pentru tabelele clienților și comenzilor. Sintaxa sa privind condițiile de conectare este oarecum diferită. Condiția de conectare este indicată în construcția specială ON.

Iată rezultatul interogării:

Din rezultatul este clar că pentru Alekseev Ivan nu există identificator de ordine corespunzător, deoarece câmpul ordonat este NULL.

Dacă trebuie doar să găsiți clienți care nu au comandat nimic, puteți realiza acest lucru executând o verificare NULL în câmpul cheie primară a tabelului din dreapta (în acest caz, orderid)? deoarece șirurile cu valori reale nu pot conține valoarea NULL:

mysql> selectați clienții. clienți, clienți. nume
-> de la clienți
-> folosind (clientid)
-> unde ordinele. ordinea este NULL;

Rezultatul interogării este după cum urmează:

Probabil ați observat că în acest exemplu am folosit o sintaxă ușor diferită pentru condiția de conectare. Conexiunea la stânga acceptă sintaxa ON, care a fost folosită în primul exemplu, și sintaxa USING, care a fost utilizată în cea de-a doua. Sintaxa de UTILIZARE nu implică specificarea tabelului din care provine atributul de conexiune, astfel încât, pentru a putea fi folosit, coloanele din ambele tabele trebuie denumite identic.

Utilizarea altor nume de tabele: pseudonime

Adesea este foarte convenabil și, uneori, este necesar să se facă referire la tabelele cu nume diferite. Aceste nume se numesc aliasuri. Ele pot fi create chiar la începutul interogării și apoi folosite după cum este necesar. Aliasurile sunt foarte convenabile, este ca o comandă rapidă pe desktop. Aruncati o privire la modul in care o cerere voluminoasa, considerata de noi mai devreme, rescrisa folosind pseudonime, arata ca:

mysql> selectați c.name
-> de la clienți ca, comenzi ca, order_items ca, cărți ca
-> unde c.customerid = o.customerid
-> și o.orderid = oi.orderid
-> și oi. isbn = b.isbn
-> și b.title ca '% Dezvoltare%';

Pentru a atribui un alias într-un tabel, utilizați constructul AS. În plus, pot fi acordate pseudonime coloanelor, dar vom reveni la aceasta după ce luăm în considerare funcțiile generalizate.

Alias-uri de masă sunt necesare atunci când masa este asociată cu ea însăși. Sună mult mai amenințător și mai misterios decât este cu adevărat. Și această abordare este foarte convenabilă pentru a găsi rânduri în același tabel, în care există alte valori de care avem nevoie. Dacă doriți să găsiți clienți care locuiesc în același oraș, de exemplu, pentru a crea un club de cititori, puteți atribui două pseudonime diferite aceluiași tabel (clienți):

mysql> select c1.name, c2. nume, c1. oraș
-> de la clienți ca c1, clienți ca c2
-> unde c1. oraș = c2. oraș
-> și c1.name! = c2.name;

Pretindem că tabelul clienților este două tabele diferite, c1 și c2, și le realizăm conexiunea pe coloana orașului. A doua condiție, c1.name! = C2.name, este necesară pentru a împiedica compararea clientului.

Sumar după tipul conexiunii

În tabel sunt enumerate diferitele tipuri de conexiuni considerate anterior. Există și alte câteva tipuri, dar conexiunile indicate în tabel sunt utilizate cel mai des.







Articole similare

Trimiteți-le prietenilor: