Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Erori
  • Exemple de interogări SQL în MariaDB (MySQL). Anexa D

Exemple de interogări SQL în MariaDB (MySQL). Anexa D

  • Traducere
  • Tutorial
Aveți nevoie de „SELECT * WHERE a = b FROM c” sau „SELECT WHERE a = b FROM c ON *”?

Dacă sunteți ca mine, atunci veți fi de acord: SQL este unul dintre acele lucruri care la prima vedere par ușor (se citește ca în engleză!), Dar din anumite motive trebuie să căutați pe google fiecare interogare simplă pentru a găsi sintaxa corectă.


Și apoi încep alăturarea, agregările, subinterogările și se dovedește complet aiurea. Pare cam asa:


SELECT membri.prenume || "" || members.lastname AS „Nume complet” FROM împrumuturi INNER JOIN membri ON members.memberid = borrowings.memberid INNER JOIN books ON books.bookid = borrowings.bookid WHERE borrowings.bookid IN (SELECTARE bookid FROM books WHERE stoc> (SELECT AVg (stock) ) DIN cărți)) GROUP BY membri.prenume, membri.nume;

Bue! Acest lucru va speria orice începător sau chiar un dezvoltator intermediar, dacă aceasta este prima dată când vede SQL. Dar nu este chiar atât de rău.


Este ușor de reținut ceea ce este intuitiv și, cu ajutorul acestui tutorial, sper să scad pragul de intrare SQL pentru începători, iar pentru cei experimentați să ofere un nou mod de a privi SQL.


Deși sintaxa SQL este aproape aceeași în diferite baze de date, acest articol folosește PostgreSQL pentru interogări. Câteva exemple vor funcționa în MySQL și alte baze de date.

1. Trei cuvinte magice

Există multe cuvinte cheie în SQL, dar SELECT, FROM și WHERE apar în aproape fiecare interogare. Puțin mai târziu, îți vei da seama că aceste trei cuvinte reprezintă cele mai fundamentale aspecte ale construirii interogărilor bazei de date, iar alte interogări, mai complexe, sunt doar suplimente pe deasupra lor.

2. Baza noastră

Să aruncăm o privire la baza de date pe care o vom folosi ca exemplu în acest articol:







Avem o bibliotecă de cărți și oameni. Există, de asemenea, un tabel special pentru contabilitatea cărților emise.

  • Tabelul de cărți stochează informații despre titlul, autorul, data publicării și disponibilitatea unei cărți. E simplu.
  • Tabelul „membri” conține numele și prenumele tuturor persoanelor care s-au înscris în bibliotecă.
  • Tabelul „împrumuturi” stochează informații despre cărțile împrumutate din bibliotecă. Coloana bookid se referă la identificatorul cărții selectate din tabelul „cărți”, iar coloana memberid se referă la persoana corespunzătoare din tabelul „membri”. Avem și o dată de emitere și o dată la care trebuie returnată cartea.

3. Cerere simplă

Să începem cu o întrebare simplă: avem nevoie numeși identificatori(id) din toate cărțile scrise de autorul „Dan Brown”


Cererea va fi astfel:


SELECTAȚI bookid AS „id”, titlu FROM cărți WHERE autor = „Dan Brown”;

Iar rezultatul este cam asa:


id titlu
2 Simbolul pierdut
4 Infern

Destul de simplu. Să aruncăm o privire la cerere pentru a înțelege ce se întâmplă.

3.1 FROM - de unde obținem datele

Acest lucru poate părea evident acum, dar FROM va fi foarte important mai târziu, când ajungem la alăturari și subinterogări.


FROM puncte către tabelul împotriva căruia interogați. Acesta poate fi un tabel existent (ca în exemplul de mai sus) sau un tabel creat din mers prin îmbinări sau subinterogări.

3.2 UNDE - ce date trebuie afișate

WHERE se comportă ca un filtru siruri de caractere pe care vrem să-l scoatem. În cazul nostru, dorim să vedem doar acele linii în care valoarea din coloana autor este „Dan Brown”.

3.3 SELECT - cum să afișați datele

Acum că avem toate coloanele de care avem nevoie din tabelul de care avem nevoie, trebuie să decidem cum să afișam aceste date. În cazul nostru, sunt necesare doar titlurile și identificatorii cărților, așa că exact asta suntem și alege folosind SELECT. În același timp, puteți redenumi coloana folosind AS.


Întreaga interogare poate fi vizualizată cu o diagramă simplă:


4. Conexiuni (uniuni)

Acum vrem să vedem titlurile (nu neapărat unice) ale tuturor cărților lui Dan Brown care au fost scoase din bibliotecă și când aceste cărți trebuie returnate:


SELECT books.title AS „Titlu”, borrowings.returndate AS „Data de întoarcere” FROM împrumuturi JOIN books ON borrowings.bookid = books.bookid WHERE books.author = „Dan Brown”;

Rezultat:


Titlu Data întoarcerii
Simbolul pierdut 2016-03-23 00:00:00
Infern 2016-04-13 00:00:00
Simbolul pierdut 2016-04-19 00:00:00

În cea mai mare parte, cererea este similară cu cea anterioară. cu exceptia DIN secțiuni. Înseamnă că cerem date dintr-un alt tabel... Nu accesăm nici tabelul de cărți, nici tabelul de împrumuturi. În schimb, ne referim la masa noua care a fost creat prin unirea celor două tabele.


împrumuturi JOIN books ON borrowings.bookid = books.bookid este un tabel nou care a fost format prin combinarea tuturor înregistrărilor din tabelele „cărți” și „împrumuturi” în care valorile bookid sunt aceleași. Rezultatul unei astfel de fuziuni va fi:



Și apoi interogăm acest tabel în același mod ca în exemplul de mai sus. Aceasta înseamnă că atunci când vă alăturați meselor, trebuie să vă faceți griji doar despre cum să faceți acea alăturare. Și atunci cererea devine la fel de clară ca în cazul „cererii simple” de la punctul 3.


Să încercăm o îmbinare cu două mese puțin mai complexă.


Acum vrem să obținem numele și prenumele persoanelor care au preluat din biblioteca cărții autoarei „Dan Brown”.


De data aceasta, să mergem de jos în sus:


Pasul Pasul 1- de unde luăm datele? Pentru a obține rezultatul pe care îl dorim, trebuie să unim tabelele „membru” și „cărți” cu tabelul „împrumuturi”. Secțiunea JOIN va arăta astfel:


împrumuturi JOIN books ON borrowings.bookid = books.bookid JOIN membri ON members.memberid = borrowings.memberid

Rezultatul conexiunii poate fi văzut la link.


Pasul 2- ce date aratam? Ne interesează doar datele în care autorul cărții este „Dan Brown”


WHERE books.author = „Dan Brown”

Pasul 3- cum afișăm datele? Acum că datele au fost primite, trebuie doar să afișați numele și prenumele celor care au luat cărțile:


SELECT membri.prenume AS „Nume”, membri.nume AS „Nume”

Super! Rămâne doar să combinăm cele trei componente și să facem cererea de care avem nevoie:


SELECTAȚI membri.prenume AS „Nume”, membri.nume AS „Nume” FROM împrumuturi JOIN books ON borrowings.bookid = books.bookid JOIN membri ON members.memberid = borrowings.memberid WHERE books.author = „Dan Brown”;

Care ne va oferi:


Nume Numele de familie
Mike Willis
Ellen Horton
Ellen Horton

Amenda! Dar numele se repetă (nu sunt unice). Vom rezolva acest lucru în curând.

5. Agregarea

Aproximativ vorbind, sunt necesare agregari pentru a converti mai multe rânduri într-unul singur... În același timp, în timpul agregării, este utilizată o logică diferită pentru diferite coloane.


Să continuăm cu exemplul nostru în care apar nume duplicate. Se poate observa că Ellen Horton a împrumutat mai mult de o carte, dar aceasta nu este cea mai bună modalitate de a arăta aceste informații. Se poate face o altă cerere:


SELECT members.firstname AS „First Name”, members.lastname AS „Last Name”, count (*) AS „Numărul de cărți împrumutate” FROM împrumuturi JOIN books ON borrowings.bookid = books.bookid JOIN members ON members.memberid = împrumuturi .memberid WHERE books.author = „Dan Brown” GROUP BY membri.prenume, membri.nume;

Ceea ce ne va da rezultatul dorit:


Nume Numele de familie Numărul de cărți împrumutate
Mike Willis 1
Ellen Horton 2

Aproape toate agregările vin cu o clauză GROUP BY. Acest lucru transformă un tabel care ar putea fi preluat printr-o interogare în grupuri de tabele. Fiecare grup corespunde unei valori unice (sau grup de valori) pentru coloana pe care am specificat-o în GROUP BY. În exemplul nostru, convertim rezultatul exercițiului anterior într-un grup de rânduri. Facem și o agregare cu count, care convertește mai multe rânduri într-o valoare întreagă (în cazul nostru, acesta este numărul de rânduri). Apoi această valoare este atribuită fiecărui grup.


Fiecare rând din rezultat este rezultatul agregării fiecărui grup.



Puteți ajunge la concluzia logică că toate câmpurile din rezultat ar trebui fie specificate în GROUP BY, fie agregarea ar trebui efectuată asupra lor. Deoarece toate celelalte câmpuri pot diferi unele de altele pe rânduri diferite, iar dacă le selectați cu SELECT, nu este clar care dintre valorile posibile ar trebui luate.


În exemplul de mai sus, funcția de numărare a procesat toate liniile (deoarece număram numărul de linii). Alte funcții precum sum sau max procesează doar șirurile specificate. De exemplu, dacă vrem să aflăm numărul de cărți scrise de fiecare autor, atunci avem nevoie de o interogare ca aceasta:


SELECTARE autor, suma (stoc) DIN cărți GROUP BY autor;

Rezultat:


autor sumă
Robin Sharma 4
Dan Brown 6
John verde 3
Amish tripathi 2

Aici, funcția sum procesează doar coloana stoc și calculează suma tuturor valorilor din fiecare grup.

6. Subinterogări


Subinterogările sunt interogări SQL obișnuite încorporate în interogări mai mari. Acestea sunt împărțite în trei tipuri în funcție de tipul rezultatului returnat.

6.1 Tabel bidimensional

Există interogări care returnează mai multe coloane. Un bun exemplu este interogarea din ultimul exercițiu de agregare. Ca o subinterogare, va returna pur și simplu un alt tabel față de care pot fi făcute noi interogări. Continuând din exercițiul anterior, dacă vrem să aflăm numărul de cărți scrise de autorul „Robin Sharma”, atunci una dintre modalitățile posibile este utilizarea subinterogărilor:


SELECT * FROM (SELECT autor, suma (stoc) FROM cărți GROUP BY autor) AS rezultate WHERE autor = "Robin Sharma";

Rezultat:



Poate fi scris ca: ["Robin Sharma", "Dan Brown"]


2. Acum să folosim acest rezultat într-o nouă interogare:


SELECT titlul, bookid FROM cărți WHERE autor IN (SELECT AUTOR FROM (SELECT autor, sumă (stoc) FROM cărți GROUP BY autor) AS rezultate WHERE sum> 3);

Rezultat:


titlu bookid
Simbolul pierdut 2
Cine va plânge când vei muri? 3
Infern 4

Acesta este la fel ca:


SELECTează titlul, cartea din cărțile WHERE autor IN ("Robin Sharma", "Dan Brown");

6.3 Valori individuale

Există interogări care au ca rezultat doar un rând și o coloană. Ele pot fi tratate ca valori constante și pot fi utilizate oriunde sunt utilizate valori, cum ar fi în operatorii de comparație. Ele pot fi, de asemenea, folosite ca tabele bidimensionale sau matrice cu un singur element.


Să obținem, de exemplu, informații despre toate cărțile care sunt în prezent peste media din bibliotecă.


Suma medie poate fi obținută astfel:


selectați media (stoc) din cărți;

Ceea ce ne oferă:


7. Operații de scriere

Cele mai multe scrieri de baze de date sunt destul de simple în comparație cu citirile mai complexe.

7.1 Actualizare

Sintaxa pentru o interogare UPDATE este semantic aceeași ca și pentru o interogare de citire. Singura diferență este că, în loc să selectăm coloanele SELECT, setăm valorile SET.


Dacă toate cărțile lui Dan Brown sunt pierdute, atunci trebuie să resetați valoarea cantității. Cererea pentru aceasta va fi astfel:


UPDATE cărți SET stoc = 0 WHERE autor = „Dan Brown”;

WHERE face la fel ca înainte: selectează rândurile. În loc de SELECT pe care l-am folosit când citim, acum folosim SET. Cu toate acestea, acum trebuie să specificați nu numai numele coloanei, ci și noua valoare pentru această coloană în rândurile selectate.


7.2 Ștergeți

O interogare DELETE este doar o interogare SELECT sau UPDATE fără nume de coloană. Serios. Ca și în cazul SELECT și UPDATE, clauza WHERE rămâne aceeași: selectează rândurile de șters. Operația de ștergere distruge întregul rând, așa că nu are sens să specificați coloane separate. Deci, dacă decidem să nu resetam numărul cărților lui Dan Brown, ci să ștergem toate înregistrările, atunci putem face următoarea solicitare:


DELETE FROM books WHERE autor = „Dan Brown”;

7.3 Inserare

Poate singurul lucru care diferă de alte tipuri de interogări este INSERT. Formatul este:


INSERT INTO x (a, b, c) VALORI (x, y, z);

Unde a, b, c sunt numele coloanelor, iar x, y și z sunt valorile care trebuie introduse în acele coloane, în aceeași ordine. Practic asta este.


Să aruncăm o privire la un exemplu concret. Iată o interogare INSERT care umple întregul tabel „cărți”:


INSERT INTO cărți (bookid, titlu, autor, publicat, stoc) VALORI (1, „Scion of Ikshvaku”, „Amish Tripathi”, „06-22-2015”, 2), (2, „The Lost Symbol”, „ Dan Brown "," 22-07-2010 ", 3), (3," Who Will Cry When You Die? "," Robin Sharma "," 06-15-2006 ", 4), (4," Inferno " , „Dan Brown”, „05-05-2014”, 3), (5, „Fault in our Stars”, „John Green”, „01-03-2015”, 3);

8. Verificare

Am ajuns la final, vă propun un mic test. Aruncă o privire la această solicitare chiar la începutul articolului. Poți să-ți dai seama? Încercați să îl descompuneți în clauze SELECT, FROM, WHERE, GROUP BY și luați în considerare componentele individuale ale subinterogărilor.


Iată-l, într-o formă mai lizibilă:


SELECT membri.prenume || "" || members.lastname AS „Nume complet” FROM împrumuturi INNER JOIN membri ON members.memberid = borrowings.memberid INNER JOIN books ON books.bookid = borrowings.bookid WHERE borrowings.bookid IN (SELECTARE bookid FROM books WHERE stoc> (SELECT AVg (stock) ) DIN cărți)) GROUP BY membri.prenume, membri.nume;

Această interogare returnează o listă a persoanelor care au verificat o carte din bibliotecă care are un total peste medie.


Rezultat:


Numele complet
Lida Tyler

Sper că ai reușit să-ți dai seama fără probleme. Dar dacă nu, aș aprecia comentariile și feedback-ul dumneavoastră, astfel încât să pot îmbunătăți această postare.

Etichete: Adăugați etichete

Tipuri de dateSQL(Cum inpgca în standard)

Tipuri de șiruri

Tipuri de date numerice

Tipuri de date monetare, cu caractere, binare

tip boolean. Enumerări

Exemple de cele mai simple interogări SQL

Interogări de bază SELECT

Instrucțiunea SQL SELECT este cea mai importantă și mai frecvent utilizată instrucțiune. Este conceput pentru a prelua informații din tabelele bazei de date. Sintaxa simplificată pentru instrucțiunea SELECT este următoarea.

SELECTAȚI [TOATE | DISTINCT] select_item_commalist

DE LA table_reference_commalist

[WHERE expresie_condițională]

[GROUP BY column_name_commalist]

[AVÂND expresie_condițională]

[COMANDAȚI DE order_item_commalist]

Elementele dintre paranteze drepte pot lipsi din cerere.

Cuvântul cheie SELECT spune bazei de date că clauza este o cerere de extragere.

După cuvântul SELECT, sunt enumerate denumirile câmpurilor (lista de atribute), al căror conținut este solicitat, separate prin virgule.

Cuvântul cheie necesar din clauza SELECT este cuvântul FROM (de la). Cuvântul cheie FROM este urmat de o listă de nume de tabel, separate prin virgulă, din care sunt preluate informații.

De exemplu, selectați titlul, descrierea filmului

Orice interogare SQL trebuie să se termine cu „;” (punct şi virgulă). Rezultatul acestei interogări va fi un tabel...

Ordinea coloanelor din acest tabel corespunde ordinii câmpurilor specificate în interogare

Dacă trebuie să afișați valorile tuturor coloanelor tabelului, puteți folosi simbolul „*” (asterisc) în loc să enumerați numele acestora.

SELECT * FROM film;

În acest caz, rezultatul executării interogării va fi întregul tabel de film.

Încă o dată, să fim atenți la faptul că tabelele obținute ca urmare a interogării SQL nu îndeplinesc pe deplin definiția unei relații relaționale. În special, ele pot conține tupluri (șiruri) cu aceleași valori de atribut.

De exemplu, interogarea „lista numelor actorilor” poate fi scrisă după cum urmează.

selectează prenume de la actor;

Rezultatul său va fi un tabel, tabelul conține aceleași rânduri. Pentru a exclude înregistrările duplicate din rezultatul interogării SELECT, utilizați cuvântul cheie DISTINCT (diferit).

Dacă o interogare SELECT preia mai multe câmpuri, atunci DISTINCT elimină rândurile duplicate în care valorile tuturor câmpurilor selectate sunt identice.

Cererea anterioară poate fi scrisă după cum urmează.

selectați prenume distinct de la actor;

Ca rezultat, obținem un tabel în care sunt excluse rândurile duplicate.

Cuvântul cheie ALL, spre deosebire de DISTINCT, are efectul opus, adică atunci când este utilizat, liniile duplicate sunt incluse în rezultat. Modul specificat de cuvântul cheie ALL este activat în mod implicit; prin urmare, practic nu este utilizat în acest scop în interogările reale.

Folosirea clauzei definite de cuvântul cheie WHERE (unde) în instrucțiunea SELECT vă permite să specificați o expresie de condiție (predicat) care ia o valoare adevărată sau falsă pentru valorile câmpurilor rândurilor de tabel la care se referă instrucțiunea SELECT . Clauza WHERE determină ce rânduri din tabelele specificate trebuie selectate. Tabelul, care este rezultatul interogării, include numai acele rânduri pentru care condiția (predicatul) specificată în clauza WHERE este evaluată ca adevărată.

Exemplu: scrieți o interogare care selectează numele de familie ale tuturor actorilor numiți PENELOPE

selectați numele de familie de la actor

unde prenume = "PENELOPE";

În condițiile specificate în clauza WHERE, operațiile de comparare definite de operatori = (egal),> (mai mare decât),< (меньше), >= (mai mare sau egal),<- (меньше или равно), <>(nu este egal), precum și operatorii logici AND, OR și NOT.

De exemplu, o solicitare de a obține numele și descrierile filmelor - scurtmetraje (mai scurte de 60 de minute), a căror închiriere costă mai puțin de 3 USD, va arăta astfel:

selectați titlul, descrierea filmului

unde lungimea< 60 and rental_rate < 3

Rezultatul acestei interogări este:

inchiriere - inchiriere

inventar - inventar, stocuri

magazin- stoc, magazin

Limbajul SQL este folosit pentru a prelua date din baza de date. SQL este un limbaj de programare care seamănă foarte mult cu engleza, dar conceput pentru programe de gestionare a bazelor de date. SQL este folosit în fiecare interogare din Access.

Înțelegerea modului în care funcționează SQL vă ajută să creați interogări mai precise și facilitează remedierea interogărilor care returnează rezultate incorecte.

Acest articol face parte dintr-o serie despre SQL for Access. Descrie elementele de bază ale utilizării SQL pentru a prelua date și oferă exemple de sintaxă SQL.

În acest articol

Ce este SQL?

SQL este un limbaj de programare pentru lucrul cu seturi de fapte și relații dintre ele. Programele de gestionare a bazelor de date relaționale, cum ar fi Microsoft Office Access, utilizează SQL pentru a manipula datele. Spre deosebire de multe limbaje de programare, SQL este ușor de citit și de înțeles chiar și pentru începători. La fel ca multe limbaje de programare, SQL este un standard internațional recunoscut de organismele de standardizare precum ISO și ANSI.

Seturile de date sunt descrise în SQL pentru a ajuta la răspunsul la întrebări. Sintaxa corectă trebuie utilizată atunci când utilizați SQL. Sintaxa este un set de reguli care vă permit să combinați corect elementele unei limbi. Sintaxa SQL se bazează pe sintaxa engleză și partajează multe elemente cu sintaxa Visual Basic pentru aplicații (VBA).

De exemplu, o instrucțiune SQL simplă care preia o listă de nume de familie ale persoanelor de contact numite Mary ar putea arăta astfel:

SELECTAȚI Nume
DIN Contacte
WHERE Prenume = „Maria”;

Notă: Limbajul SQL este folosit nu numai pentru a efectua operațiuni asupra datelor, ci și pentru a crea și modifica structura obiectelor bazei de date, cum ar fi tabelele. Partea din SQL care este utilizată pentru a crea și modifica obiectele bazei de date se numește Data Description Language DDL. DDL nu este acoperit în acest articol. Pentru mai multe informații, consultați articolul Crearea și modificarea tabelelor sau a indecșilor folosind o interogare de definire a datelor.

Instrucțiuni SELECT

Instrucțiunea SELECT este folosită pentru a descrie un set de date în SQL. Conține o descriere completă a setului de date care urmează să fie preluat din baza de date, inclusiv următoarele:

    tabele care conțin date;

    legături între date din diferite surse;

    câmpurile sau calculele pe baza cărora sunt selectate datele;

    condiții de selecție care trebuie îndeplinite de datele incluse în rezultatul interogării;

    necesitatea si metoda de sortare.

Propoziții SQL

O instrucțiune SQL este alcătuită din mai multe părți numite clauze. Fiecare clauză dintr-o instrucțiune SQL are un scop diferit. Sunt necesare câteva sugestii. Următorul tabel listează instrucțiunile SQL care sunt utilizate cel mai des.

Clauza SQL

Descriere

Obligatoriu

Definește câmpurile care conțin datele dorite.

Definește tabele care conțin câmpurile specificate în clauza SELECT.

Specifică criteriile de selectare a câmpurilor care trebuie îndeplinite de toate înregistrările incluse în rezultate.

Determină ordinea de sortare a rezultatelor.

Într-o instrucțiune SQL care conține funcții agregate, identifică câmpurile pentru care clauza SELECT nu calculează o valoare rezumativă.

Doar dacă există astfel de câmpuri

Într-o instrucțiune SQL care conține funcții agregate, definește condițiile care se aplică câmpurilor pentru care clauza SELECT calculează o valoare rezumativă.

termeni SQL

Fiecare instrucțiune SQL este compusă din termeni care pot fi comparați cu părți de vorbire. Următorul tabel listează tipurile de termeni SQL.

Termenul SQL

Parte comparabilă de vorbire

Definiție

Exemplu

identificator

substantiv

Numele folosit pentru a identifica obiectul bazei de date, cum ar fi numele unui câmp.

Clienți. [Număr de telefon]

operator

verb sau adverb

Un cuvânt cheie care reprezintă sau modifică o acțiune.

constant

substantiv

O valoare care nu se modifică, cum ar fi un număr sau NULL.

expresie

adjectiv

O combinație de identificatori, operatori, constante și funcții concepute pentru a calcula o singură valoare.

> = Bunuri. [Preț]

Clauze SQL de bază: SELECT, FROM și WHERE

Formatul general al instrucțiunilor SQL:

SELECTează câmpul_1
DIN tabelul_1
UNDE criteriul_1
;

Note:

    Access ignoră întreruperile de linie în instrucțiunile SQL. Indiferent, este recomandat să începeți fiecare propoziție pe o linie nouă, astfel încât instrucțiunea SQL să fie ușor de citit, atât pentru persoana care a scris-o, cât și pentru toți ceilalți.

    Fiecare instrucțiune SELECT se termină cu punct și virgulă (;). Punctul și virgulă poate apărea fie la sfârșitul ultimei propoziții, fie pe o linie separată la sfârșitul instrucțiunii SQL.

Exemplu în Access

Următorul exemplu arată cum ar putea arăta o instrucțiune SQL în Access pentru o interogare de selectare simplă.

1. Clauza SELECT

2. clauza FROM

3. clauza WHERE

Să parcurgem exemplul propoziție cu propoziție pentru a înțelege cum funcționează sintaxa SQL.

clauza SELECT

SELECT, Companie

Aceasta este o clauză SELECT. Conține o declarație (SELECT) urmată de doi identificatori ("[Adresa de e-mail]" și "Companie").

Dacă identificatorul conține spații sau caractere speciale (de exemplu, „Adresă de e-mail”), acesta trebuie inclus între paranteze drepte.

În clauza SELECT, nu trebuie să specificați tabelele care conțin câmpurile și nu puteți specifica criteriile de selecție care trebuie îndeplinite de datele incluse în rezultate.

Într-o instrucțiune SELECT, clauza SELECT vine întotdeauna înaintea clauzei FROM.

clauza FROM

DIN Contacte

Aceasta este o clauză FROM. Conține un operator (FROM) urmat de un identificator (Contacte).

Câmpurile pentru selecție nu sunt specificate în clauza FROM.

clauza WHERE

WHERE Oraș = „Seattle”

Aceasta este o clauză WHERE. Conține operatorul (UNDE) urmat de expresia (Oraș = „Rostov”).

Există multe lucruri pe care le puteți face cu clauzele SELECT, FROM și WHERE. Pentru mai multe informații despre utilizarea acestor sugestii, consultați următoarele articole:

Sortarea rezultatelor: ORDER BY

Ca și în cazul Microsoft Excel, Access poate sorta rezultatele interogărilor într-un tabel. Folosind clauza ORDER BY, puteți, de asemenea, specifica modul în care sunt sortate rezultatele atunci când se execută interogarea. Dacă se folosește o clauză ORDER BY, aceasta trebuie să apară la sfârșitul instrucțiunii SQL.

Clauza ORDER BY conține o listă de câmpuri de sortat, în aceeași ordine în care va fi aplicată sortarea.

De exemplu, să presupunem că doriți mai întâi să sortați rezultatele după câmpul Companie în ordine descrescătoare și apoi, dacă există înregistrări cu aceeași valoare a câmpului Companie, sortați-le după câmpul Adresă de e-mail în ordine crescătoare. Clauza ORDER BY ar arăta astfel:

COMANDA DE COMPANIA DESC,

Notă:În mod implicit, Access sortează valorile în ordine crescătoare (de la A la Z, de la cel mai mic la cel mai mare). Pentru a sorta valorile în ordine descrescătoare, trebuie să specificați cuvântul cheie DESC.

Pentru mai multe informații despre clauza ORDER BY, consultați articolul Clauza ORDER BY.

Lucrul cu date Pivot: clauze GROUP BY și HAVING

Uneori trebuie să lucrați cu date agregate, cum ar fi vânzările lunare totale sau cele mai scumpe articole din stoc. Pentru a face acest lucru, o funcție de agregare este aplicată câmpului din clauza SELECT. De exemplu, dacă interogarea are ca rezultat numărul de adrese de e-mail pentru fiecare companie, clauza SELECT ar putea arăta astfel:

Capacitatea de a utiliza o anumită funcție de agregare depinde de tipul de date din câmp și de expresia dorită. Pentru mai multe informații despre funcțiile de agregare disponibile, consultați articolul Funcții de agregare SQL.

Specificarea câmpurilor neutilizate într-o funcție agregată: clauza GROUP BY

Când utilizați funcții de agregare, de obicei trebuie să creați o clauză GROUP BY. Clauza GROUP BY specifică toate câmpurile care nu au aplicată o funcție de agregare. Dacă funcțiile agregate sunt aplicate tuturor câmpurilor dintr-o interogare, atunci nu trebuie să creați o clauză GROUP BY.

Clauza GROUP BY trebuie să urmeze imediat clauza WHERE sau FROM dacă nu există nicio clauză WHERE. În clauza GROUP BY, câmpurile sunt specificate în aceeași ordine ca și în clauza SELECT.

Să continuăm cu exemplul anterior. Dacă clauza SELECT aplică funcția de agregare numai câmpului [Adresă de e-mail], atunci clauza GROUP BY va arăta astfel:

GRUP DE COMPANIE

Pentru mai multe informații despre clauza GROUP BY, consultați articolul Clauza GROUP BY.

Limitarea valorilor agregate folosind condiții de grupare: clauza HAVING

Dacă trebuie să specificați condiții pentru a restricționa rezultatele, dar câmpul la care doriți să aplicați este utilizat într-o funcție agregată, nu puteți utiliza clauza WHERE. Folosiți în schimb clauza HAVING. Clauza HAVING funcționează la fel ca și clauza WHERE, dar este folosită pentru datele agregate.

De exemplu, să presupunem că aplicați o funcție AVG (care calculează media) la primul câmp dintr-o clauză SELECT:

SELECT COUNT (), Companie

Dacă doriți să limitați rezultatele interogării pe baza valorii funcției COUNT, nu puteți aplica o condiție de filtru acelui câmp din clauza WHERE. În schimb, condiția ar trebui plasată în clauza HAVING. De exemplu, dacă doriți ca interogarea să returneze rânduri numai dacă compania are mai multe adrese de e-mail, puteți utiliza următoarea clauză HAVING:

AVÂND NUMĂRARE ()> 1

Notă: O interogare poate include atât o clauză WHERE, cât și o clauză HAVING, cu criteriile pentru câmpurile care nu sunt utilizate în funcțiile agregate specificate în clauza WHERE și condiții pentru câmpurile care sunt utilizate în funcțiile agregate din clauza HAVING.

Pentru mai multe informații despre clauza HAVING, consultați articolul Clauza HAVING.

Combinarea rezultatelor interogării: operator UNION

Operatorul UNION este folosit pentru a vizualiza toate datele returnate de interogări de selecție multiple, similare, în același timp ca un set concatenat.

Operatorul UNION vă permite să combinați două instrucțiuni SELECT într-una singură. Instrucțiunile SELECT care trebuie îmbinate trebuie să aibă același număr și aceeași ordine de câmpuri de ieșire cu aceleași tipuri de date sau compatibile. Când executați o interogare, datele din fiecare set de câmpuri potrivite sunt combinate într-un singur câmp de ieșire, astfel încât rezultatul interogării are același număr de câmpuri ca fiecare instrucțiune SELECT individual.

Notă:În interogările union, tipurile de date numerice și text sunt compatibile.

Folosind operatorul UNION, puteți specifica dacă rândurile duplicate, dacă există, trebuie incluse în rezultatele interogării. Pentru a face acest lucru, utilizați cuvântul cheie ALL.

O interogare pentru a combina două instrucțiuni SELECT are următoarea sintaxă de bază:

SELECTează câmpul_1
DIN tabelul_1
UNIUNE
SELECTează câmpul_a
DIN tabel_a
;

De exemplu, să presupunem că aveți două tabele numite „Produse” și „Servicii”. Ambele tabele conțin câmpuri cu numele produsului sau serviciului, informații despre preț și garanție, precum și un câmp care indică exclusivitatea produsului sau serviciului oferit. Deși există diferite tipuri de garanții în tabelele Produse și Servicii, informațiile de bază sunt aceleași (există o garanție de calitate pentru produse sau servicii individuale). Puteți utiliza următoarea interogare de îmbinare pentru a combina patru câmpuri din două tabele:

SELECTAȚI numele, prețul, warranty_available, exclusive_offer
DIN Produse
UNIREA TOȚI
SELECTAȚI numele, prețul, garanția_disponibilă, oferta_exclusivă
DE LA Servicii
;

Pentru mai multe informații despre combinarea instrucțiunilor SELECT folosind operatorul UNION, consultați articolul

Solicitările sunt scrise fără ghilimele, deoarece MySQL, MS SQLși PostGree sunt diferite.

Interogare SQL: obținerea câmpurilor specificate (obligatorii) dintr-un tabel

SELECT ID, country_title, count_people FROM table_name

Primim o listă de înregistrări: TOATE țările și populația lor. Numele câmpurilor obligatorii sunt separate prin virgule.

SELECT * FROM table_name

* denotă toate câmpurile. Adică vor fi impresii TOT câmpuri de date.

Interogare SQL: scoateți înregistrări dintr-un tabel, excluzând duplicatele

SELECTAȚI DISTINCT country_title FROM table_name

Primim o listă de înregistrări: țările în care se află utilizatorii noștri. Pot exista mulți utilizatori dintr-o singură țară. În acest caz, aceasta este cererea dumneavoastră.

Interogare SQL: afișarea înregistrărilor dintr-un tabel conform unei condiții specificate

SELECT ID, country_title, city_title FROM table_name WHERE count_people> 100000000

Primim o listă de înregistrări: țări în care numărul de persoane este mai mare de 100.000.000.

Interogare SQL: afișarea înregistrărilor dintr-un tabel cu ordonare

SELECT ID, city_title FROM table_name ORDER BY city_title

Primim o listă de înregistrări: orașe în ordine alfabetică. La începutul lui A, la sfârșitul lui I.

SELECT ID, city_title FROM table_name ORDER BY city_title DESC

Obținem o listă de înregistrări: orașe în sens invers ( DESC) O.K. La început I, la sfârșit A.

Interogare SQL: numărarea numărului de înregistrări

SELECTAȚI COUNT (*) FROM table_name

Obținem numărul (numărul) de înregistrări din tabel. În acest caz, NU există o listă de înregistrări.

Interogare SQL: scoateți intervalul necesar de înregistrări

SELECT * FROM table_name LIMIT 2, 3

Obținem 2 (a doua) și 3 (a treia) înregistrări din tabel. Solicitarea este utila la crearea navigarii pe pagini WEB.

Interogări SQL cu condiții

Ieșirea înregistrărilor dintr-un tabel în funcție de o condiție dată folosind operatori logici.

Interogare SQL: construcție ȘI

SELECT ID, city_title FROM table_name WHERE țară = „Rusia” ȘI petrol = 1

Primim o listă de înregistrări: orașe din Rusia ȘI au acces la petrol. Când se utilizează operatorul ȘI, atunci ambele condiții trebuie să se potrivească.

Interogare SQL: construcție SAU

SELECT ID, city_title FROM table_name WHERE country = „Rusia” SAU country = „SUA”

Primim o listă de înregistrări: toate orașele din Rusia SAU STATELE UNITE ALE AMERICII. Când se utilizează operatorul SAU, atunci cel puțin o condiție trebuie să se potrivească.

Interogare SQL: ȘI NU construi

SELECT ID, user_login FROM table_name WHERE country = "Rusia" AND NOT count_comments<7

Primim o listă de înregistrări: toți utilizatorii din Rusia ȘI cine a facut NU MAI PUȚIN 7 comentarii.

Interogare SQL: construcție IN (B).

SELECT ID, user_login FROM table_name WHERE country IN ("Rusia", "Bulgaria", "China")

Primim o listă de înregistrări: toți utilizatorii care locuiesc în ( ÎN) (Rusia, sau Bulgaria sau China)

Interogare SQL: NU ÎN construcție

SELECT ID, user_login FROM table_name WHERE country NOT IN ("Rusia", "China")

Primim o listă de înregistrări: toți utilizatorii care nu locuiesc în ( NU ÎN) (Rusia sau China).

Interogare SQL: construcție IS NULL (valori goale sau NOT goale)

SELECT ID, user_login FROM table_name WHERE starea ESTE NULL

Primim o listă de înregistrări: toți utilizatorii pentru care starea nu este definită. NULL este un subiect separat și, prin urmare, este verificat separat.

SELECT ID, user_login FROM table_name WHERE starea NU ESTE NULL

Obținem o listă de înregistrări: toți utilizatorii în care starea este definită (NU ZERO).

Interogare SQL: construct LIKE

SELECT ID, user_login FROM table_name WHERE nume de familie LIKE „Ivan%”

Primim o listă de înregistrări: utilizatori al căror nume de familie începe cu combinația „Ivan”. Semnul % înseamnă ORICE număr de ORICE caractere. Pentru a găsi semnul%, trebuie să utilizați „Ivan \%” care evade.

Interogare SQL: BETWEEN construct

SELECT ID, user_login FROM table_name WHERE salariul INTRE 25000 SI 50000

Primim o listă de înregistrări: utilizatori care primesc salarii de la 25.000 la 50.000 inclusiv.

Există o mulțime de operatori logici, așa că studiați documentația serverului SQL în detaliu.

Interogări SQL complexe

Interogare SQL: combinarea mai multor interogări

(SELECT id, user_login FROM table_name1) UNION (SELECT id, user_login FROM table_name2)

Primim o listă de înregistrări: utilizatori care sunt înregistrați în sistem, precum și acei utilizatori care sunt înregistrați separat pe forum. Interogările multiple pot fi combinate cu operatorul UNION. UNION acționează ca SELECT DISTINCT, adică elimină valorile duplicat. Pentru a obține absolut toate înregistrările, trebuie să utilizați operatorul UNION ALL.

Interogare SQL: numărarea valorilor câmpului MAX, MIN, SUM, AVG, COUNT

Ieșire de unul, valoarea maximă a contorului din tabel:

SELECTARE MAX (contor) FROM table_name

Ieșire de unul, valoarea minimă a contorului din tabel:

SELECTARE MIN (contor) FROM table_name

Afișarea sumei tuturor valorilor contorului în tabel:

SELECTAȚI SUMA (contor) FROM table_name

Afișarea valorii medii a contorului în tabel:

SELECTAȚI AVG (contor) FROM table_name

Afișarea numărului de contoare din tabel:

SELECTARE COUNT (contor) FROM table_name

Afișarea numărului de contoare din atelierul nr. 1, în tabel:

SELECT COUNT (contor) FROM table_name WHERE birou = "Magazin # 1"

Acestea sunt cele mai populare comenzi. Se recomandă, acolo unde este posibil, să folosiți interogări SQL de acest fel pentru calcul, deoarece niciun mediu de programare nu poate compara viteza de procesare a datelor decât serverul SQL însuși atunci când procesează propriile date.

Interogare SQL: gruparea înregistrărilor

SELECTAȚI continentul, SUMA (țara_zonă) FROM Țara GROUP BY continent

Primim o listă de înregistrări: cu numele continentului și cu suma zonelor tuturor țărilor lor. Adica daca exista un director de tari in care fiecare tara isi are inregistrata aria, atunci folosind clauza GROUP BY, puteti afla dimensiunea fiecarui continent (pe baza gruparii pe continent).

Interogare SQL: folosind mai multe tabele prin alias

SELECTAȚI o.număr_comandă, o.sumă_plătită, c.companie FROM comenzi AS o, client AS cu WHERE o.custno = c.custno AND c.city = "Tyumen"

Primim o listă de înregistrări: comenzi de la clienți care locuiesc numai în Tyumen.

De fapt, cu o bază de date proiectată corespunzător de acest tip, interogarea este cea mai frecventă, prin urmare a fost introdus un operator special în MySQL, care funcționează de multe ori mai rapid decât codul scris mai sus.

SELECT o.order_no, o.amount_paid, z.company FROM comenzi AS o LEFT JOIN client AS z ON (z.custno = o.custno)

Subinterogări imbricate

SELECT * FROM table_name WHERE salariu = (SELECT MAX (salariu) FROM angajat)

Obținem o singură înregistrare: informații despre utilizatorul cu salariul maxim.

Atenţie! Subinterogările imbricate sunt unul dintre blocajele din serverele SQL. Împreună cu flexibilitatea și puterea lor, ele măresc semnificativ încărcarea serverului. Ceea ce duce la o încetinire catastrofală a muncii altor utilizatori. Cazurile de apeluri recursive cu interogări imbricate sunt foarte frecvente. Prin urmare, recomand insistent să NU folosiți interogări imbricate, ci să le împărțiți în altele mai mici. Sau utilizați combinația LEFT JOIN de mai sus. Pe lângă acest tip de solicitare, cererile sunt un focar crescut de breșe de securitate. Dacă decideți să utilizați subinterogări imbricate, atunci trebuie să le proiectați foarte atent și să faceți rulările inițiale pe copii ale bazelor de date (baze de date de testare).

Interogările SQL modifică datele

Interogare SQL: INSERT

Instrucțiuni INTRODUCE vă permit să inserați înregistrări într-un tabel. Cu cuvinte simple, creați o linie cu date în tabel.

Opțiunea numărul 1. Instrucțiunea este adesea folosită:

INSERT INTO table_name (id, user_login) VALUES (1, "ivanov"), (2, "petrov")

In masa " table_name„2 (doi) utilizatori vor fi introduși deodată.

Opțiunea numărul 2. Este mai convenabil să folosești stilul:

INSERT table_name SET id = 1, user_login = "ivanov"; INSERT table_name SET id = 2, user_login = "petrov";

Acest lucru are avantajele și dezavantajele sale.

Principalele dezavantaje:

  • Multe interogări SQL mici rulează puțin mai lent decât o interogare SQL mare, dar alte interogări vor fi puse în coadă pentru service. Adică, dacă o interogare SQL mare este executată timp de 30 de minute, atunci în tot acest timp restul interogărilor vor fuma bambus și vor aștepta rândul lor.
  • Solicitarea se dovedește a fi mai masivă decât versiunea anterioară.

Principalele avantaje:

  • În timpul interogărilor SQL mici, alte interogări SQL nu sunt blocate.
  • Ușurință de citit.
  • Flexibilitate. În această opțiune, nu puteți urmări structura, ci puteți adăuga doar datele necesare.
  • Când formați arhive în acest fel, puteți copia cu ușurință o linie și o puteți rula prin linia de comandă (consolă), astfel nu restaurând întreaga ARHIVĂ.
  • Stilul de scriere este similar cu declarația UPDATE, ceea ce face mai ușor de reținut.

Interogare SQL: UPDATE

UPDATE table_name SET user_login = "ivanov", user_surname = "Ivanov" WHERE id = 1

In masa " table_name„În înregistrarea cu id = 1, valorile câmpurilor user_login și user_surname vor fi modificate la valorile specificate.

Interogare SQL: DELETE

DELETE FROM table_name WHERE id = 3

Înregistrarea cu numărul de identificare 3 va fi ștearsă din tabelul table_name.

  1. Se recomandă să scrieți toate numele câmpurilor cu litere mici și, dacă este necesar, să le separați cu un spațiu forțat „_” pentru compatibilitate cu diferite limbaje de programare precum Delphi, Perl, Python și Ruby.
  2. Scrieți comenzile SQL cu majuscule pentru a fi lizibile. Amintiți-vă întotdeauna că alte persoane pot citi codul după dvs. și, cel mai probabil, dumneavoastră înșivă după N interval de timp.
  3. Numiți câmpurile de la începutul substantivului și apoi acțiunea. De exemplu: city_status, user_login, user_name.
  4. Încercați să evitați cuvintele alternative în diferite limbi care pot cauza probleme în SQL, PHP sau Perl, cum ar fi (nume, număr, link). De exemplu: linkul poate fi folosit în MS SQL, dar este rezervat în MySQL.

Acest material este o referință scurtă pentru munca de zi cu zi și nu pretinde a fi o sursă super mega autorizată, care este sursa principală de interogări SQL pentru o anumită bază de date.

Expresii de tabel subinterogările sunt denumite și sunt utilizate acolo unde se așteaptă ca tabelul să existe. Există două tipuri de expresii de tabel:

    tabele derivate;

    expresii de tabel generalizate.

Aceste două forme de expresii de tabel sunt discutate în următoarele subsecțiuni.

Tabele derivate

Tabel derivat este o expresie de tabel inclusă în clauza FROM a interogării. Tabelele derivate pot fi folosite atunci când aliasurile de coloană nu sunt fezabile deoarece traducătorul SQL procesează o altă instrucțiune înainte ca aliasul să fie cunoscut. Exemplul de mai jos încearcă să folosească un alias de coloană într-o situație în care o altă clauză este procesată înainte ca aliasul să fie cunoscut:

UTILIZAȚI SampleDb; SELECTARE MONTH (EnterDate) ca enter_month FROM Works_on GROUP BY enter_month;

Încercarea de a executa această interogare va avea ca rezultat următorul mesaj de eroare:

Mesajul 207, Nivel 16, Stare 1, Rând 5 Nume de coloană invalid „enter_month”. (Msj 207: Nivel 16, Stare 1, Rând 5 Nume de coloană nevalid enter_month)

Cauza erorii este că clauza GROUP BY este procesată înainte ca lista SELECT asociată să fie procesată, iar alias-ul coloanei enter_month nu este cunoscut la procesarea acestui grup.

Această problemă poate fi rezolvată folosind un tabel derivat care conține interogarea anterioară (fără clauza GROUP BY), deoarece clauza FROM este executată înaintea clauzei GROUP BY:

UTILIZAȚI SampleDb; SELECT enter_month FROM (SELECT MONTH (EnterDate) ca enter_month FROM Works_on) AS m GROUP BY enter_month;

Rezultatul executării acestei interogări va fi astfel:

De obicei, expresia tabelului poate fi plasată oriunde în instrucțiunea SELECT unde ar putea apărea numele tabelului. (Rezultatul unei expresii de tabel este întotdeauna un tabel sau, în cazuri speciale, o expresie.) Următorul exemplu arată utilizarea unei expresii de tabel în lista select a unei instrucțiuni SELECT:

Rezultatul acestei interogări:

Expresii de tabel generalizate

Expresie comună de tabel (CTE) este o expresie de tabel cu nume acceptată de limbajul Transact-SQL. Expresiile de tabel generice sunt utilizate în următoarele două tipuri de interogări:

    nerecursiv;

    recursiv.

Aceste două tipuri de solicitări sunt discutate în secțiunile următoare.

OTB și interogări nerecursive

Puteți utiliza formularul OTB nerecursiv ca alternativă la tabelele și vizualizările derivate. De obicei, OTB este definit de CU clauzeși o interogare opțională care face referire la numele folosit în clauza WITH. Cuvântul cheie WITH este ambiguu în Transact-SQL. Pentru a evita ambiguitatea, terminați instrucțiunea care precede clauza WITH cu punct și virgulă.

UTILIZAȚI AdventureWorks2012; SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue> (SELECT AVG (TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR (OrderDate) = "2005") ȘI Freight> (SELECT AVG (TotalDue) FROM Sales.SalesOrderHeader "YEAR005WHERE) 2,5;

Interogarea din acest exemplu selectează comenzi ale căror taxe totale (TotalDue) sunt mai mari decât media pentru toate taxele și ale căror taxe de transport (Freight) sunt mai mari de 40% din media taxelor. Proprietatea principală a acestei interogări este volumul său, deoarece subinterogarea trebuie scrisă de două ori. O modalitate posibilă de a reduce dimensiunea construcției de interogare este de a crea o vizualizare care conține o subinterogare. Dar această soluție este oarecum dificilă, deoarece necesită crearea unei vizualizări și apoi ștergerea acesteia după încheierea execuției interogării. Cea mai bună abordare ar fi crearea unui OTB. Exemplul de mai jos demonstrează utilizarea OTB non-recursivă, care prescurtează definiția interogării de mai sus:

UTILIZAȚI AdventureWorks2012; WITH price_calc (year_2005) AS (SELECT AVG (TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR (OrderDate) = "2005") SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue> (SELECT year_2005 FROM price.0calc;) /2 Fre2 price.0calc;

Sintaxa pentru clauza WITH în interogările nerecursive este:

Parametrul cte_name reprezintă numele OTB care identifică tabelul rezultat, iar parametrul column_list reprezintă lista de coloane din expresia tabelului. (În exemplul de mai sus, OTB este numit price_calc și are o coloană, year_2005.) Parametrul inner_query reprezintă o instrucțiune SELECT care definește setul de rezultate al expresiei de tabel corespunzătoare. Expresia de tabel definită poate fi apoi utilizată în interogarea exterioară outer_query. (Interogarea exterioară din exemplul de mai sus utilizează OTB price_calc și coloana sa year_2005 pentru a simplifica interogarea dublu imbricată.)

OTB și interogări recursive

Această secțiune prezintă material de complexitate crescută. Prin urmare, atunci când îl citiți pentru prima dată, este recomandat să îl săriți peste el și să reveniți la el mai târziu. OTB-urile pot implementa recursiuni, deoarece OTB-urile pot conține referințe la ei înșiși. Sintaxa de bază OTB pentru o interogare recursivă arată astfel:

Parametrii cte_name și column_list au aceeași semnificație ca în OTB pentru interogările nerecursive. Corpul clauzei WITH este format din două interogări combinate de operator UNIREA TOȚI... Prima interogare este apelată o singură dată și începe să acumuleze rezultatul recursiunii. Primul operand al operatorului UNION ALL nu se referă la OTB. Această interogare se numește interogare de referință sau sursă.

A doua cerere conține un link către OTB și reprezintă partea sa recursivă. Din această cauză, se numește membru recursiv. În primul apel către partea recursivă, referința OTB reprezintă rezultatul interogării de referință. Membrul recursiv folosește rezultatul primului apel la interogare. După aceea, sistemul apelează din nou partea recursivă. Un apel către un membru recursiv este terminat atunci când un apel anterior la acesta returnează un set de rezultate gol.

Operatorul UNION ALL concatenează șirurile acum acumulate, precum și șirurile suplimentare adăugate de apelul curent membrului recursiv. (Prezența operatorului UNION ALL înseamnă că rândurile duplicate nu vor fi eliminate din rezultat.)

În cele din urmă, parametrul outer_query definește o interogare exterioară care utilizează OTB pentru a obține toate apelurile către uniunea ambilor membri.

Pentru a demonstra un formular OTB recursiv, folosim tabelul Avion definit și completat cu codul prezentat în exemplul de mai jos:

UTILIZAȚI SampleDb; CREATE TABLE Airplane (ContainingAssembly VARCHAR (10), ContainedAssembly VARCHAR (10), QuantityContained INT, UnitCost DECIMAL (6,2)); INSERT INTO Airplane VALUES ("Avion", "Fuselaj", 1, 10); INSERT INTO Airplane VALUES ("Avion", "Aripi", 1, 11); INSERT INTO Airplane VALUES ("Avion", "Coada", 1, 12); INSERT INTO Airplane VALUES („Fuselaj”, „Salon”, 1, 13); INSERT INTO Airplane VALUES („Fuselaj”, „Cabină”, 1, 14); INSERT INTO Airplane VALUES („Fuselaj”, „Nas”, 1, 15); INSERT INTO Airplane VALUES ("Salon", NULL, 1.13); INSERT INTO Airplane VALUES ("Cabină", ​​NULL, 1, 14); INSERT INTO Airplane VALUES („Nas”, NULL, 1, 15); INSERT INTO Airplane VALUES ("Aripi", NULL, 2, 11); INSERT INTO Airplane VALUES ("Coada", NULL, 1, 12);

Tabelul Avion are patru coloane. Coloana ContainingAssembly identifică ansamblul, iar coloana ContainedAssembly identifică piesele (una după alta) care alcătuiesc ansamblul corespunzător. Figura de mai jos oferă o ilustrare grafică a unui posibil tip de aeronavă și a părților sale constitutive:

Tabelul Avion este format din următoarele 11 rânduri:

Exemplul de mai jos arată clauza WITH utilizată pentru a defini o interogare care calculează costul total al fiecărui ansamblu:

UTILIZAȚI SampleDb; WITH list_of_parts (ansamblu1, cantitate, cost) AS (SELECT ContainingAssembly, QuantityContained, UnitCost FROM Airplane WHERE ContainedAssembly IS NULL UNION ALL SELECT a.ContainingAssembly, a.QuantityContained, CAST (l.cantitate * l.cost AS DECIMAL) ) FROM list_of_pieces l, Avion a WHERE l.assembly1 = a.ContainedAssembly) SELECT assembly1 "Parte", cantitatea "Cantitate", cost "Preț" FROM list_of_pieces;

Clauza WITH definește o listă OTB numită list_of_parts cu trei coloane: asamblare1, cantitate și cost. Prima instrucțiune SELECT din exemplu este apelată o singură dată pentru a păstra rezultatele primului pas al procesului recursiv. Instrucțiunea SELECT de pe ultima linie a exemplului afișează următorul rezultat.

Top articole similare