Înțeleg sql

În acest capitol, vă veți întoarce de la utilizarea ușoară a interogărilor pentru a prelua valori din baza de date și a determina cum puteți utiliza aceste valori pentru a obține informații de la acestea. Acest lucru se face folosind funcții agregate sau generale care iau grupuri de valori de la podea și le reduc la o singură valoare. Veți învăța cum să utilizați aceste funcții, cum să definiți grupurile de valori la care vor fi aplicate și cum să determinați care grupuri sunt selectate pentru ieșire. Veți vedea, de asemenea, în ce condiții puteți combina valorile câmpului cu aceste informații într-o singură interogare.







CE ESTE FUNCȚIILE UNITĂȚII?

Interogările pot genera o valoare de grup generică a câmpurilor, la fel ca valoarea unui câmp. Acest lucru se face folosind funcții agregate. Funcțiile agregate produc o singură valoare pentru întregul grup al tabelului. Există o listă a acestor funcții:

CUM UTILIZATI FUNCTIILE AGREGATE?

funcțiile agregate sunt folosite ca numele câmpurilor din clauza SELECT din interogare, dar cu o singură excepție, ei iau numele de podea ca argumente. Numai câmpurile numerice pot fi utilizate cu SUM și AVG. Cu COUNT, MAX și MIN, pot fi utilizate câmpuri numerice sau caracter. Atunci când este utilizat cu câmpuri de caractere, MAX, MIN și le va traduce în ASCII echivalent, care trebuie să raporteze că va marca primul MIN, MAX și ultima valoare în ordine alfabetică (problema ordonare alfabetică este discutată mai detaliat în Capitolul 4).

Pentru a găsi suma tuturor achizițiilor noastre în tabelul Comenzi, putem introduce următoarea interogare, cu ieșirea din Figura 6.1:

Aceasta, desigur, diferă de alegerea câmpului la care se returnează o singură valoare, indiferent de numărul de rânduri din tabel. Din această cauză, funcțiile și câmpurile agregate nu pot fi selectate în același timp până când se utilizează clauza GROUP BY (descrisă mai jos). Găsirea sumei medii este ca o operație (rezultatul următorului interogatoriu este prezentat în Figura 6.2):

COUNTRY SPECIALE ATTRIBUTE

Funcția COUNT este ușor diferită de toate. Contorizează numărul de valori din această coloană sau numărul de rânduri din tabel. Atunci când ia în considerare valorile coloanelor, este utilizat cu DISTINCT pentru a număra numerele diferitelor valori din acest câmp. Am putea folosi, de exemplu, pentru a număra numerele vânzătorilor descrise în mod curent în tabelul de comandă (ieșirea este prezentată în Figura 6.3):

UTILIZAREA DISTINCTULUI

Notați în exemplul de mai sus că DISTINCT urmat de numele câmpului cu care este aplicat este plasat în paranteze, dar nu imediat după SELECT, ca și înainte. Această utilizare a DISTINCT cu COUNT aplicată coloanelor individuale necesită standardul ANSI, dar un număr mare de programe nu necesită o astfel de cerință.

Puteți selecta mai multe conturi (COUNT) ale câmpurilor folosind DISTINCT într-o singură cerere, care, așa cum am văzut în capitolul 3 nu sunt efectuate atunci când selectați un rând folosind distincți. DISTINCT poate fi utilizat în acest fel, cu orice funcție agregată, dar cel mai adesea este folosită cu COUNT. Cu MAX și MIN, pur și simplu nu va avea nici un efect, iar AVG și SUM, ați utilizat de obicei pentru a include valori duplicat, deoarece acestea sunt în mod legal valori totale și medii efective ale tuturor coloanelor.

UTILIZÂND COUNT CU LINII, NU VALORI

Pentru a calcula numărul total de rânduri dintr-un tabel, utilizați funcția COUNT cu un asterisc în locul denumirii podelei, ca în exemplul următor, ieșirea din care este prezentat în Figura 6.4:

COUNT cu un asterisc include atât NULL cât și duplicat, din acest motiv DISTINCT nu poate fi utilizat. DISTINCT poate produce numere mai mari decât COUNT sex special, care șterge toate rândurile care au date redundante sau NULL în acest câmp. DISTINCT nu se aplică cu COUNT (*), deoarece nu are efect într-o bază de date bine concepută și acceptată. Într-o astfel de bază de date, nu ar trebui să existe rânduri care să fie complet goale sau duplicate (primele nu conțin date și acestea sunt complet redundante). Dacă, pe de altă parte, există încă rânduri complet goale sau redundante, probabil că nu doriți ca COUNT să ascundă aceste informații de la dvs.

INCLUZIREA DUPLICATELOR ÎN FUNCȚII AGREGATE

Funcțiile agregate pot, de asemenea (în majoritatea implementărilor) să utilizeze argumentul ALL, care este plasat în fața numelui câmpului, ca DISTINCT, dar înseamnă opus: - includeți duplicate. ANSI nu permite acest lucru tehnic pentru COUNT, însă multe implementări slăbesc această limitare.







Până în prezent * este singurul argument care include valori NULL și este utilizat numai cu COUNT; alte funcții decât COUNT ignoră valorile NULL în orice caz. Următoarea comandă va calcula (COUNT) numărul de valori non-NULL din câmpul de rating din tabelul Client (inclusiv repetările):

AGREGATE CONSTRUITE PE EXPRESII SCALARE

Înainte de aceasta, ați folosit funcții agregate cu câmpuri unice ca argumente. De asemenea, puteți utiliza funcții agregate cu argumente care constau în expresii scalare care includ unul sau mai multe câmpuri. (Dacă faceți acest lucru, DISTINCT nu este permis.) Să presupunem că tabela are ordine de o coloană care stochează soldul precedent (câmpul blnc) pentru fiecare client. Trebuie să găsiți acest sold actual prin adăugarea valorii achizițiilor la soldul anterior. Puteți găsi cel mai mare sold neplătit după cum urmează:

Pentru fiecare rând din tabel, această interogare va adăuga blnc și amt pentru acest client și va alege cea mai mare valoare pe care o va găsi. Desigur, atâta timp cât clienții pot avea mai multe comenzi, soldul neplătit este estimat separat pentru fiecare comandă. Poate că ordinul cu o dată ulterioară va avea cel mai mare sold restant. În caz contrar, balanța veche trebuie selectată ca în interogarea de mai sus.

De fapt, există o mulțime de situații în SQL, unde puteți utiliza expresii scalare cu câmpuri sau în loc de câmpuri, după cum veți vedea în Capitolul 7.

OFERTE GROUP BY

Clauza GROUP BY vă permite să definiți un subset de valori într-un câmp special în ceea ce privește un alt câmp și să aplicați funcția agregată unui subset. Aceasta vă oferă posibilitatea de a combina câmpurile și funcțiile agregate într-o singură clauză SELECT. De exemplu, să presupunem că doriți să găsiți cea mai mare cantitate de achiziții primite de fiecare vânzător. Puteti face o cerere separata pentru fiecare dintre ele selectand MAX (amt) din tabelul Order pentru fiecare valoare a campului snum. GROUP BY, cu toate acestea, vă va permite să le puneți pe toate într-o singură comandă:

GROUP BY aplică funcții agregate indiferent de seria de grupuri care sunt definite folosind valoarea câmpului ca întreg. În acest caz, fiecare grup constă din toate rândurile cu aceeași valoare a snumului de câmp și funcția MAX este aplicată separat pentru fiecare grup. Această valoare a câmpului în care se aplică GROUP BY are, prin definiție, o singură valoare pe grup de ieșire, la fel ca și funcția agregată. Rezultatul este compatibilitatea care permite combinarea agregatelor și câmpurilor în acest fel.

De asemenea, puteți utiliza GROUP BY cu mai multe câmpuri. Perfecțiunea este exemplul de mai sus, presupunând că doriți să vedeți cel mai mare număr de achiziții primite de fiecare vânzător în fiecare zi. Pentru a face acest lucru, trebuie să grupați tabelul de comandă după datele vânzătorului și să aplicați funcția MAX pentru fiecare grup, cum ar fi:

Desigur, grupurile goale, în zilele în care vânzătorul actual nu avea comenzi, nu vor fi afișate în producție.

OFERTĂ CU

Să presupunem că, în exemplul precedent, doriți să vedeți numai suma maximă de achiziții a cărei valoare depășește 3000.00 USD. Nu puteți utiliza funcțiile agregate într-o propoziție unde (dacă nu utilizați un subinterogare, descris mai târziu), pentru că predicatele sunt evaluate în ceea ce privește o singură linie, și funcțiile agregate sunt evaluate în ceea ce privește grupurile de rânduri. Aceasta înseamnă că nu puteți face așa ceva:

Aceasta va fi o abatere de la interpretarea strictă a ANSI. Pentru a vedea costul maxim al achizițiilor care depășesc 3000 RON, puteți utiliza clauza HAVING. Clauza HAVING definește criteriile utilizate pentru a elimina anumite grupuri de la ieșire, la fel cum face clauza WHERE pentru rânduri individuale.

Argumentele din clauza HAVING respectă aceleași reguli ca în clauza SELECT, care constă din comenzi folosind GROUP BY. Acestea trebuie să aibă o valoare pe grup de ieșire. Următoarea comandă va fi dezactivată:

Câmpul unic nu poate fi apelat de clauza HAVING, deoarece poate (și chiar are) mai mult de o valoare pe grup de ieșire. Pentru a evita această situație, clauza HAVING trebuie să se refere numai la agregatele și câmpurile selectate de GROUP BY. Există o modalitate corectă de a face interogarea de mai sus (ieșirea este prezentată în Figura 6.8):

NU FACEȚI unități INVESTIȚIONALE

Într-o interpretare strictă a ANSI SQL, nu puteți utiliza agregatul agregat. Să presupunem că doriți să aflați ce zi a fost cea mai mare cantitate de achiziții. Dacă încercați să faceți acest lucru, echipa dvs. va fi probabil respinsă. (Unele implementări nu impun această restricție, ceea ce este avantajos, deoarece agregatele imbricate pot fi foarte utile, chiar dacă acestea sunt oarecum problematice.) În comanda de mai sus, de exemplu, USM urmează să fie aplicat fiecărui sex în grup Odate, și MAX la toate grupurile, care produce o singură valoare pentru toate grupurile. Cu toate acestea, clauza GROUP BY implică faptul că ar trebui să existe o linie de ieșire pentru fiecare grup de gen odate.

Acum folosiți interogările puțin diferit. Capacitatea de a primi, mai degrabă decât de a plasa valori, este foarte puternică. Aceasta înseamnă că nu trebuie să urmați anumite informații dacă puteți formula o cerere astfel încât să poată fi primită. Interogarea vă va oferi rezultate minute pe minut, în timp ce masa generală sau medie va fi bună doar după un anumit timp după modificarea acesteia. Acest lucru nu ar trebui să sugereze că funcțiile agregate pot suplini complet necesitatea de a urmări informații precum acesta.

Puteți aplica aceste agregate grupurilor de valori definite de o clauză GROUP BY. Aceste grupuri au valoarea domeniului în ansamblu și pot locui întotdeauna în cadrul altor grupuri care au valoarea întregului domeniu. În același timp, predicatele sunt încă folosite pentru a determina care rânduri ale funcției agregate sunt aplicate. Împreună, aceste caracteristici fac posibilă producerea de agregate bazate pe subseturi de valori puternic definite în domeniu. Apoi puteți defini o altă condiție pentru a exclude anumite rezultate ale grupului cu clauza HAVING.

Acum. când deveniți un cunoscător al multora cum interogarea produce valori, vă vom arăta în Capitolul 7. câteva lucruri pe care le puteți face cu valorile pe care le produce.

Lucrul cu SQL







Articole similare

Trimiteți-le prietenilor: