Gruparea în SQL: clauze GROUP BY, HAVING și funcții agregate. Funcții agregate SQL

Cum pot afla numărul de modele de PC produse de un anumit furnizor? Cum să determinați prețul mediu al computerelor care au același specificatii tehnice? Acestea și multe alte întrebări legate de unele informații statistice pot fi răspuns folosind funcții finale (agregate).. Standardul oferă următoarele funcții agregate:

Toate aceste funcții returnează o singură valoare. În același timp, funcțiile COUNT, MINŞi MAX aplicabil oricărui tip de date, în timp ce SUMĂŞi AVG sunt utilizate numai pentru câmpurile numerice. Diferența între funcție CONTA(*)Şi CONTA(<имя поля>) este că al doilea nu ia în considerare valorile NULL la calcul.

Exemplu. Găsiți prețul minim și maxim pentru computerele personale:

Exemplu. Găsiți numărul disponibil de computere produse de producătorul A:

Exemplu. Daca suntem interesati de cantitate diverse modele, produs de producătorul A, atunci interogarea poate fi formulată după cum urmează (folosind faptul că în tabelul Produs fiecare model este înregistrat o dată):

Exemplu. Găsiți numărul de modele diferite disponibile produse de producătorul A. Interogarea este similară cu cea anterioară, în care era necesar să se determine numărul total de modele produse de producătorul A. Aici trebuie să găsiți și numărul de modele diferite în masa PC (adică cele disponibile pentru vânzare).

Pentru a se asigura că numai valorile unice sunt utilizate la obținerea indicatorilor statistici, când argumentul funcţiilor agregate poate fi folosit parametru DISTINCT. Altul parametrul ALL este implicit și presupune că toate valorile returnate în coloană sunt numărate. Operator,

Dacă trebuie să obținem numărul de modele de PC produse toată lumea producător, va trebui să utilizați Clauza GROUP BY, urmând sintactic clauze WHERE.

Clauza GROUP BY

Clauza GROUP BY folosit pentru a defini grupuri de șiruri de ieșire cărora li se pot aplica funcții agregate (COUNT, MIN, MAX, AVG și SUM). Dacă această clauză lipsește și sunt utilizate funcții de agregare, atunci toate coloanele cu nume menționate în SELECTA, ar trebui incluse în funcții agregate, iar aceste funcții vor fi aplicate întregului set de rânduri care satisfac predicatul de interogare. În caz contrar, toate coloanele din lista SELECT nu sunt incluseîn agregat trebuie specificate funcţiile în clauza GROUP BY. Ca urmare, toate rândurile de interogare de ieșire sunt împărțite în grupuri caracterizate prin aceleași combinații de valori în aceste coloane.
După aceasta, funcțiile agregate vor fi aplicate fiecărui grup. Vă rugăm să rețineți că pentru GROUP BY toate valorile NULL sunt tratate ca fiind egale, de exemplu. la gruparea după un câmp care conține valori NULL, toate aceste rânduri vor intra într-un singur grup. Dacă dacă există o clauză GROUP BY , în clauza SELECT fără funcții agregate
, atunci interogarea va returna pur și simplu un rând din fiecare grup. Această caracteristică, împreună cu cuvântul cheie DISTINCT, poate fi utilizată pentru a elimina rândurile duplicate dintr-un set de rezultate.
Să ne uităm la un exemplu simplu:
SELECT model, COUNT(model) AS Cantitate_model, AVG(preț) AS Avg_price
DE LA PC

GROUP BY model;
În această solicitare, pentru fiecare model de PC se determină numărul și costul mediu al acestora. Toate rândurile cu aceeași valoare a modelului formează un grup, iar rezultatul SELECT calculează numărul de valori și valorile prețurilor medii pentru fiecare grup. Rezultatul interogării va fi următorul tabel: model Cantitate_model
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Avg_price

Dacă SELECT ar avea o coloană de dată, atunci ar fi posibil să se calculeze acești indicatori pentru fiecare dată specifică. Pentru a face acest lucru, trebuie să adăugați data ca coloană de grupare, iar apoi funcțiile agregate vor fi calculate pentru fiecare combinație de valori (model-data). Sunt mai multe specifice:

  • reguli pentru îndeplinirea funcţiilor agregate Dacă în urma cererii nu au primit rânduri
  • (sau mai mult de un rând pentru un anumit grup), atunci nu există date sursă pentru calcularea vreuneia dintre funcțiile agregate. În acest caz, rezultatul funcțiilor COUNT va fi zero, iar rezultatul tuturor celorlalte funcții va fi NULL. Argument functie de agregat nu poate conține în sine funcții agregate
  • (funcție din funcție). Aceste. într-o singură interogare este imposibil, să zicem, să se obțină maximul de valori medii. Rezultatul executării funcției COUNT esteîntreg
  • (ÎNTREG). Alte funcții agregate moștenesc tipurile de date ale valorilor pe care le procesează. Dacă funcția SUM produce un rezultat care este mai mare decât valoarea maximă a tipului de date utilizat,.

eroare Deci, dacă cererea nu conține clauze GROUP BY funcții agregate, Asta incluse în, sunt executate pe toate rândurile de interogare rezultate. Dacă cererea conţine Clauza GROUP BY, fiecare set de rânduri care are aceleași valori ale unei coloane sau ale unui grup de coloane specificate în Clauza GROUP BY, alcătuiește un grup și funcții agregate sunt efectuate pentru fiecare grupă separat.

AVÂND oferta

După aceasta, funcțiile agregate vor fi aplicate fiecărui grup. Vă rugăm să rețineți că pentru GROUP BY toate valorile NULL sunt tratate ca fiind egale, de exemplu. la gruparea după un câmp care conține valori NULL, toate aceste rânduri vor intra într-un singur grup. clauza WHERE definește un predicat pentru filtrarea rândurilor, apoi AVÂND oferta se aplică după grupare pentru a defini un predicat similar care filtrează grupurile după valori funcții agregate. Această clauză este necesară pentru a valida valorile care se obțin folosind functie de agregat nu din rândurile individuale ale sursei de înregistrare definite în clauza FROM, și de la grupuri de astfel de linii. Prin urmare, un astfel de control nu poate fi inclus în clauza WHERE.

Următoarele subsecțiuni descriu alte clauze de instrucțiuni SELECT care pot fi utilizate în interogări, precum și funcții agregate și seturi de instrucțiuni. Lasă-mă să-ți amintesc asta în acest moment Ne-am uitat la utilizarea clauzei WHERE, iar în acest articol ne vom uita la clauzele GROUP BY, ORDER BY și HAVING și vom oferi câteva exemple de utilizare a acestor clauze în combinație cu funcțiile de agregare care sunt acceptate în Transact-SQL.

Clauza GROUP BY

Oferi GROUP BY grupează un set selectat de rânduri pentru a produce un set de rânduri rezumative după valorile uneia sau mai multor coloane sau expresii. Un caz simplu de utilizare a clauzei GROUP BY este prezentat în exemplul de mai jos:

UTILIZAȚI SampleDb; SELECTARE Job FROM Works_On GROUP BY Job;

Acest exemplu selectează și grupează posturile de angajați.

În exemplul de mai sus, clauza GROUP BY creează un grup separat pentru toate valorile posibile (inclusiv Valoare NULL) coloana Job.

Utilizarea coloanelor într-o clauză GROUP BY trebuie să îndeplinească anumite condiții. Mai exact, fiecare coloană din lista de selecție a interogării trebuie să apară și în clauza GROUP BY. Această cerință nu se aplică constantelor și coloanelor care fac parte dintr-o funcție de agregare. ( Funcții agregate sunt discutate în subsecţiunea următoare.) Acest lucru are sens deoarece Doar coloanele din clauza GROUP BY au o singură valoare pentru fiecare grup.

Puteți grupa un tabel după orice combinație a coloanelor sale. Exemplul de mai jos demonstrează gruparea rândurilor din tabelul Works_on în două coloane:

UTILIZAȚI SampleDb; SELECTARE ProjectNumber, Job FROM Works_On GROUP BY ProjectNumber, Job;

Rezultatul acestei interogări:

Pe baza rezultatelor interogării, puteți vedea că există nouă grupuri cu diferite combinații de număr de proiect și poziție. Secvența de nume de coloane din clauza GROUP BY nu trebuie să fie aceeași cu cea din lista de coloane din SELECT.

Funcții agregate

Funcțiile agregate sunt utilizate pentru a obține valori totale. Toate funcțiile agregate pot fi împărțite în următoarele categorii:

    funcții agregate obișnuite;

    funcții agregate statistice;

    funcții agregate definite de utilizator;

    funcţii agregate analitice.

Aici ne vom uita la primele trei tipuri de funcții agregate.

Funcții agregate comune

Transact-SQL acceptă următoarele șase funcții agregate: MIN, MAX, SUMĂ, AVG, CONTA, COUNT_BIG.

Toate funcțiile agregate efectuează calcule pe un singur argument, care poate fi fie o coloană, fie o expresie. (Singura excepție este cea de-a doua formă a celor două funcții: COUNT și COUNT_BIG, și anume COUNT(*) și, respectiv, COUNT_BIG(*). Rezultatul oricărui calcul al funcției agregate este o valoare constantă, afișată într-o coloană separată de rezultat.

Funcțiile agregate sunt specificate în lista de coloane a instrucțiunii SELECT, care poate conține și o clauză GROUP BY. Dacă instrucțiunea SELECT nu are o clauză GROUP BY și lista coloanelor select conține cel puţin, o funcție de agregare, atunci nu trebuie să conțină coloane simple (cu excepția coloanelor care servesc drept argumente pentru funcția de agregare). Prin urmare, codul din exemplul de mai jos este incorect:

UTILIZAȚI SampleDb; SELECT Nume, MIN(Id) FROM Angajat;

Aici, coloana LastName din tabelul Employee nu ar trebui să fie în lista de selectare a coloanei, deoarece nu este un argument pentru funcția de agregare. Pe de altă parte, lista de selectare a coloanei poate conține nume de coloane care nu sunt argumente pentru funcția de agregare dacă acele coloane sunt argumente pentru clauza GROUP BY.

Un argument de funcție agregată poate fi precedat de unul dintre cele două cuvinte cheie posibile:

TOATE

Specifică faptul că calculele sunt efectuate pentru toate valorile din coloană. Aceasta este valoarea implicită.

DISTINCT

Specifică faptul că numai valorile unice ale coloanei sunt utilizate pentru calcule.

Funcțiile agregate MIN și MAX

Funcțiile agregate MIN și MAX calculează cea mai mică și, respectiv, cea mai mare valoare a unei coloane. Dacă o interogare conține o clauză WHERE, funcțiile MIN și MAX returnează cele mai mici și mai mari valori ale rândurilor care corespund condițiilor specificate. Exemplul de mai jos arată utilizarea funcției de agregare MIN:

UTILIZAȚI SampleDb; -- Returnează 2581 SELECT MIN(Id) AS „Valoarea minimă a ID” FROM Employee;

Rezultatul returnat în exemplul de mai sus nu este foarte informativ. De exemplu, numele de familie al angajatului care deține acest număr este necunoscut. Dar obțineți acest nume de familie în mod obişnuit nu este posibil deoarece, așa cum am menționat mai devreme, nu aveți voie să specificați în mod explicit coloana LastName. Pentru a obține și numele de familie al acestui angajat împreună cu cel mai mic număr de personal al unui angajat, se folosește o subinterogare. Exemplul de mai jos arată utilizarea unei astfel de subinterogări, în care subinterogarea conține instrucțiunea SELECT din exemplul anterior:

Rezultatul cererii:

Utilizarea funcției de agregare MAX este prezentată în exemplul de mai jos:

Funcțiile MIN și MAX pot accepta șiruri și date ca argumente. În cazul unui argument șir, valorile sunt comparate folosind ordinea reală de sortare. Pentru toate argumentele de date de tip „date”, cea mai mică valoare a coloanei este cea mai veche dată, iar cea mai mare valoare a coloanei este cea mai recentă.

Puteți utiliza cuvântul cheie DISTINCT cu funcțiile MIN și MAX. Înainte de a utiliza agregate functii MINși MAX exclud toate valorile NULL din coloanele argumentelor lor.

Funcția agregată SUM

Agregat Funcția SUM calculează valoare totală valorile coloanei. Argumentul acestei funcții agregate trebuie să fie întotdeauna un tip de date numerice. Utilizarea funcției de agregare SUM este prezentată în exemplul de mai jos:

UTILIZAȚI SampleDb; SELECT SUM (Buget) „Bugetul total” FROM Proiect;

Acest exemplu calculează suma totală a bugetelor pentru toate proiectele. Rezultatul cererii:

În acest exemplu, funcția agregată grupează toate valorile bugetului proiectului și determină valoarea lor totală. Din acest motiv, interogarea conține o funcție implicită de grupare (la fel ca toate interogările similare). Funcția de grupare implicită din exemplul de mai sus poate fi specificată explicit, așa cum se arată în exemplul de mai jos:

UTILIZAȚI SampleDb; SELECT SUM (Buget) „Bugetul total” FROM Project GROUP BY();

Utilizarea parametrului DISTINCT elimină toate valorile duplicate dintr-o coloană înainte de a aplica funcția SUM. De asemenea, toate valorile NULL sunt eliminate înainte de a aplica această funcție de agregare.

Funcția agregată AVG

Agregat Funcția AVG returnează media aritmetică a tuturor valorilor dintr-o coloană. Argumentul acestei funcții agregate trebuie să fie întotdeauna un tip de date numerice. Înainte ca funcția AVG să fie utilizată, toate valorile NULL sunt eliminate din argumentul său.

Utilizarea funcției de agregare AVG este prezentată în exemplul de mai jos:

UTILIZAȚI SampleDb; -- Returnează 133833 SELECT AVG (Buget) „Buget mediu pentru proiect” FROM Proiect;

Aici se calculează media aritmetică a valorii bugetului pentru toate bugetele.

Agregați funcțiile COUNT și COUNT_BIG

Agregat Funcția COUNT are două forme diferite:

COUNT(nume_coloană) COUNT(*)

Prima formă a funcției numără numărul de valori din coloana col_name. Dacă interogarea folosește cuvântul cheie DISTINCT, toate valorile duplicate din coloană sunt eliminate înainte de a utiliza funcția COUNT. Această formă a funcției COUNT nu ia în considerare valorile NULL atunci când se numără numărul de valori dintr-o coloană.

Utilizarea primei forme a funcției de agregare COUNT este prezentată în exemplul de mai jos:

UTILIZAȚI SampleDb; SELECT ProjectNumber, COUNT(DISTINCT Job) „Funcționează în proiect” FROM Works_on GROUP BY ProjectNumber;

Aici se numără numărul de posturi diferite pentru fiecare proiect. Rezultatul acestei interogări:

După cum puteți vedea din exemplul de interogare, valorile NULL nu au fost luate în considerare de funcția COUNT. (Suma tuturor valorilor din coloana poziției s-a dovedit a fi 7, nu 11, așa cum ar trebui să fie.)

A doua formă a funcției COUNT, adică. Funcția COUNT(*) numără numărul de rânduri dintr-un tabel. Și dacă instrucțiunile interogare SELECT cu funcția COUNT(*) conține o clauză WHERE cu o condiție, funcția returnează numărul de rânduri care îndeplinesc condiția specificată. Spre deosebire de prima versiune a funcției COUNT, a doua formă nu ignoră valorile NULL, deoarece această funcție operează pe rânduri, nu pe coloane. Exemplul de mai jos demonstrează utilizarea funcției COUNT (*):

UTILIZAȚI SampleDb; SELECTARE Job AS „Tipul de muncă”, COUNT(*) „Necesită muncitori” FROM Works_on GROUP BY Job;

Aici se calculează numărul de posturi din toate proiectele. Rezultatul cererii:

COUNT_BIG funcție similar cu funcția COUNT. Singura diferență dintre ele este tipul de rezultat pe care îl returnează: funcția COUNT_BIG returnează întotdeauna valori BIGINT, în timp ce funcția COUNT returnează valori de date INTEGER.

Funcții agregate statistice

Următoarele funcții alcătuiesc grupul de funcții agregate statistice:

VAR

Calculează varianța statistică a tuturor valorilor reprezentate într-o coloană sau expresie.

VARP

Calculează varianța statistică a populației tuturor valorilor reprezentate într-o coloană sau expresie.

STDEV

Calculează abaterea standard (care este calculată ca rădăcină pătrată din varianța corespunzătoare) a tuturor valorilor unei coloane sau expresii.

STDEVP

Calculează abaterea standard a populației tuturor valorilor dintr-o coloană sau expresie.

Funcții agregate definite de utilizator

Motorul de baze de date suportă, de asemenea, implementarea funcțiilor definite de utilizator. Această capacitate permite utilizatorilor să mărească funcțiile agregate ale sistemului cu funcții pe care le pot implementa și instala ei înșiși. Aceste funcții reprezintă o clasă specială de funcții definite de utilizator și sunt discutate în detaliu mai târziu.

AVÂND oferta

Într-o propoziție AVÂND definește o condiție care se aplică unui grup de rânduri. Astfel, această clauză are aceeași semnificație pentru grupuri de rânduri ca și clauza WHERE pentru conținutul tabelului corespunzător. Sintaxa clauzei HAVING este:

AVÂND stare

Aici parametrul condiție reprezintă condiția și conține funcții sau constante agregate.

Utilizarea clauzei HAVING împreună cu funcția de agregare COUNT(*) este ilustrată în exemplul de mai jos:

UTILIZAȚI SampleDb; -- Returnează „p3” SELECT ProjectNumber FROM Works_on GROUP BY ProjectNumber HAVING COUNT(*)

În acest exemplu, sistemul grupează toate rândurile după valorile coloanei ProjectNumber folosind clauza GROUP BY. După aceasta, numărul de rânduri din fiecare grup este numărat și sunt selectate grupurile care conțin mai puțin de patru rânduri (trei sau mai puțin).

Clauza HAVING poate fi folosită și fără funcții agregate, așa cum se arată în exemplul de mai jos:

UTILIZAȚI SampleDb; -- Returnează „Consultant” SELECTARE Job FROM Works_on GROUP BY Job HAVING Job LIKE „K%”;

Acest exemplu grupează rândurile tabelului Works_on după titlul postului și elimină acele locuri de muncă care nu încep cu litera „K”.

Clauza HAVING poate fi folosită și fără clauza GROUP BY, deși aceasta nu este o practică obișnuită. În acest caz, toate rândurile tabelului sunt returnate într-un singur grup.

clauza ORDER BY

Oferi COMANDA PENTRU determină ordinea de sortare a rândurilor din setul de rezultate returnat de interogare. Această propoziție are următoarea sintaxă:

Ordinea de sortare este specificată în parametrul col_name. Parametrul col_number este un indicator alternativ de ordine de sortare care identifică coloanele după ordinea în care apar în lista de selecție a instrucțiunii SELECT (1 este prima coloană, 2 este a doua coloană etc.). Parametrul ASC specifică sortarea în ordine crescătoare și parametrul DESC- în sens descendent. Valoarea implicită este ASC.

Numele coloanelor din clauza ORDER BY nu trebuie să se afle în lista de coloane selectate. Dar acest lucru nu se aplică interogărilor precum SELECT DISTINCT, deoarece în astfel de interogări, numele coloanelor specificate în clauza ORDER BY trebuie, de asemenea, specificate în lista coloanelor selectate. În plus, această clauză nu poate conține nume de coloane din tabele nespecificate în clauza FROM.

După cum puteți vedea din sintaxa clauzei ORDER BY, setul de rezultate poate fi sortat pe mai multe coloane. Această sortare este prezentată în exemplul de mai jos:

În acest exemplu, numerele departamentelor și numele angajaților sunt selectate pentru angajații al căror număr de personal este mai mic de 20.000 și sortate după nume și prenume. Rezultatul acestei interogări:

Coloanele din clauza ORDER BY pot fi specificate nu după numele lor, ci după ordinea lor în lista de selectare. În consecință, propoziția din exemplul de mai sus poate fi rescrisă după cum urmează:

Astfel de cale alternativă specificarea coloanelor după poziția lor în loc de nume este utilizată dacă criteriul de ordonare conține o funcție de agregare. (O altă modalitate este să folosiți numele coloanelor, care apar apoi în clauza ORDER BY.) Cu toate acestea, în clauza ORDER BY, se recomandă să specificați coloanele după numele lor, mai degrabă decât după numere, pentru a facilita actualizarea interogați dacă trebuie adăugate sau eliminate coloane din lista de selectare. Specificarea coloanelor în clauza ORDER BY după numerele lor este prezentată în exemplul de mai jos:

UTILIZAȚI SampleDb; SELECT ProjectNumber, COUNT(*) "Număr de angajați" FROM Works_on GROUP BY ProjectNumber ORDER BY 2 DESC;

Aici, pentru fiecare proiect, se selectează numărul de proiect și numărul de angajați care participă la acesta, ordonând rezultatul în ordine descrescătoare după numărul de angajați.

Transact-SQL plasează valori NULL la începutul listei atunci când sortați în ordine crescătoare și la sfârșitul listei când sortați în ordine descrescătoare.

Utilizarea clauzei ORDER BY pentru a pagina rezultatele

Afișarea rezultatelor interogării pe pagina curentă poate fi implementată fie în aplicație utilizator, sau instruiți serverul de baze de date să facă acest lucru. În primul caz, toate rândurile bazei de date sunt trimise către aplicație, a cărei sarcină este să selecteze rândurile necesare și să le afișeze. În al doilea caz, pe partea serverului, doar rândurile necesare pentru pagina curentă. După cum v-ați putea aștepta, crearea de pagini pe partea serverului oferă de obicei performanțe mai bune, deoarece... Numai rândurile necesare pentru afișare sunt trimise clientului.

Pentru a sprijini crearea paginilor pe partea serverului în SQL Server 2012 introduce două noi clauze de instrucțiune SELECT: OFFSET și FETCH. Aplicarea acestor două propoziții este demonstrată în exemplul de mai jos. Aici, din baza de date AdventureWorks2012 (pe care o găsiți în sursă), sunt preluate ID-ul companiei, titlul postului și ziua de naștere a tuturor angajatelor, sortând rezultatul după titlul postului în ordine crescătoare. Setul de rânduri rezultat este împărțit în pagini de 10 rânduri și este afișată a treia pagină:

Într-o propoziție OFFSET specifică numărul de linii de rezultat care trebuie sărit în rezultatul afișat. Acest număr este calculat după ce rândurile sunt sortate folosind clauza ORDER BY. Într-o propoziție FETCH NEXT specifică numărul de rânduri care îndeplinesc condiția WHERE și care sunt sortate pentru a fi returnate. Parametrul acestei clauze poate fi o constantă, o expresie sau rezultatul unei alte interogări. Clauza FETCH NEXT este similară cu FETCH MAINTI.

Scopul principal atunci când se creează pagini pe partea serverului este acela de a putea implementa formulare comune de pagină folosind variabile. Această sarcină poate fi efectuată folosind pachetul SQL Server.

Declarația SELECT și proprietatea IDENTITY

proprietatea IDENTITATE vă permite să definiți valori pentru o anumită coloană a tabelului sub forma unui contor care crește automat. Coloanele de tip de date numerice, cum ar fi TINYINT, SMALLINT, INT și BIGINT pot avea această proprietate. Pentru o astfel de coloană de tabel, Motorul de bază de date creează automat valori secvențiale pornind de la valoarea de pornire specificată. Prin urmare, proprietatea IDENTITATE poate fi utilizată pentru a crea valori numerice cu o singură cifră pentru o coloană selectată.

Un tabel poate conține doar o coloană cu proprietatea IDENTITY. Proprietarul tabelului are opțiunea de a specifica o valoare de pornire și o creștere, așa cum se arată în exemplul de mai jos:

UTILIZAȚI SampleDb; CREATE TABLE Product (Id INT IDENTITY(10000, 1) NOT NULL, Name NVARCHAR(30) NOT NULL, Price MONEY) INSERT INTO Product(Nume, Price) VALUES ("Produs1", 10), ("Product2", 15) , ("Produs3", 8), ("Produs4", 15), ("Produs5", 40); -- Returnează 10004 SELECT IDENTITYCOL FROM Product WHERE Nume = "Product5"; -- Similar cu declarația anterioară SELECT $identity FROM Product WHERE Nume = "Product5";

Acest exemplu creează mai întâi un tabel Product care conține o coloană Id cu o proprietate IDENTITY. Valorile din coloana Id sunt create automat de sistem, începând de la 10.000 și crescând în trepte de unitate pentru fiecare valoare ulterioară: 10.000, 10.001, 10.002 etc.

Mai multe funcții și variabile de sistem sunt asociate cu proprietatea IDENTITY. De exemplu, codul de exemplu folosește $variabila de sistem identitate. După cum puteți vedea din rezultatul acestui cod, această variabilă face referire automată la proprietatea IDENTITY. Îl poți folosi și în schimb functia sistemului IDENTITYCOL.

Valoarea inițială și incrementul unei coloane cu proprietatea IDENTITY pot fi găsite folosind funcțiile IDENT_SEEDŞi IDENT_INCR respectiv. Aceste funcții sunt utilizate după cum urmează:

UTILIZAȚI SampleDb; SELECT IDENT_SEED(„Produs”), IDENT_INCR(„Produs”)

După cum sa menționat deja, valorile IDENTITATE sunt setate automat de către sistem. Dar utilizatorul își poate specifica în mod explicit valorile pentru anumite rânduri prin alocarea parametrului IDENTITY_INSERT Valoare ON înainte de a introduce o valoare explicită:

SETARE IDENTITATE INSERT numele tabelului

Deoarece puteți utiliza parametrul IDENTITY_INSERT pentru a seta o coloană cu proprietatea IDENTITY la orice valoare, inclusiv o valoare duplicat, proprietatea IDENTITY nu impune, în general, unicitatea valorilor coloanei. Prin urmare, pentru a impune unicitatea valorilor coloanelor, ar trebui să utilizați Restricții UNICE sau CHEIE PRIMARĂ.

Când inserați valori într-un tabel după ce ați activat IDENTITY_INSERT, sistemul creează următoarea valoare a coloanei IDENTITY prin incrementul celei mai mari valori curente a acelei coloane.

Instrucțiunea CREATE SEQUENCE

Există mai multe dezavantaje semnificative în utilizarea proprietății IDENTITATE, dintre care cele mai semnificative sunt următoarele:

    aplicarea proprietății este limitată la tabelul specificat;

    noua valoare a coloanei nu poate fi obținută în alt mod decât prin aplicarea acesteia;

    proprietatea IDENTITATE poate fi specificată numai la crearea unei coloane.

Din aceste motive, SQL Server 2012 introduce secvențe care au aceeași semantică ca proprietatea IDENTITY, dar fără dezavantajele enumerate anterior. În acest context, o secvență este o funcționalitate a bazei de date care vă permite să specificați valori de contor pentru diferite obiecte de bază de date, cum ar fi coloane și variabile.

Secvențele sunt create folosind instrucțiuni CREAȚI SECVENȚA. Instrucțiunea CREATE SEQUENCE este definită în standardul SQL și este suportată de alte sisteme de baze de date relaționale, cum ar fi IBM DB2 și Oracle.

Exemplul de mai jos arată cum să creați o secvență în SQL Server:

UTILIZAȚI SampleDb; CREATE SECVENCE dbo.Sequence1 AS INT START CU 1 INCREMENTARE CU 5 MINVALUE 1 MAXVALUE 256 CYCLE;

În exemplul de mai sus, valorile Sequence1 sunt create automat de sistem, începând cu valoarea 1 și crescând cu 5 pentru fiecare valoare ulterioară. Astfel, în Oferta START este indicată valoarea inițială, iar în Oferta INCREMENTARE- pas. (Pasul poate fi fie pozitiv, fie negativ.)

În următoarele două propoziții opționale MINVALUEŞi MAXVALUE Este specificată valoarea minimă și maximă a obiectului secvență. (Rețineți că valoarea MINVALUE trebuie să fie mai mică sau egală cu valoarea inițială, iar valoarea MAXVALUE nu poate fi mai mare decât limita superioară a tipului de date specificat pentru secvență.) În clauză CICLU indică faptul că secvența se repetă de la început atunci când valoarea maximă (sau minimă pentru o secvență cu pas negativ) este depășită. În mod implicit, această clauză este setată la NO CYCLE, ceea ce înseamnă că depășirea valorii maxime sau minime a secvenței va genera o excepție.

Caracteristica principală a secvențelor este independența lor față de tabele, adică. ele pot fi utilizate cu orice obiect de bază de date, cum ar fi coloanele de tabel sau variabile. (Această proprietate are un efect pozitiv asupra stocării și, prin urmare, a performanței. Secvența specifică nu trebuie să fie stocată; este stocată doar ultima sa valoare.)

Noile valori ale secvenței sunt create folosind NEXT VALUE FOR expresii, a cărui aplicare este prezentată în exemplul de mai jos:

UTILIZAȚI SampleDb; -- Returnează 1 SELECTAȚI URMĂTOAREA VALOARE PENTRU dbo.sequence1; -- Returnează 6 (pasul următor) SELECT NEXT VALUE FOR dbo.sequence1;

Puteți utiliza expresia NEXT VALUE FOR pentru a atribui rezultatul unei secvențe unei variabile sau unei celule de coloană. Exemplul de mai jos arată cum să utilizați această expresie pentru a atribui rezultate unei coloane:

UTILIZAȚI SampleDb; CREATE TABLE Product (Id INT NOT NULL, Name NVARCHAR(30) NOT NULL, Price MONEY) INSERT INTO Product VALUES (NEXT VALUE FOR dbo.sequence1, "Product1", 10); INSERT INTO Product VALUES (URMĂTORUL VALOARE PENTRU dbo.sequence1, „Product2”, 15); --...

În exemplul de mai sus, creăm mai întâi un tabel de produse format din patru coloane. Apoi, două instrucțiuni INSERT inserează două rânduri în acest tabel. Primele două celule ale primei coloane vor avea valorile 11 și 16.

Exemplul de mai jos arată utilizarea unei vizualizări de director sys.secvente pentru a vizualiza valoarea curentă a unei secvențe fără a o folosi:

De obicei, instrucțiunea NEXT VALUE FOR este utilizată într-o instrucțiune INSERT pentru a determina sistemul să insereze valorile generate. Această expresie poate fi folosită și ca parte a unei interogări pe mai multe linii folosind clauza OVER.

Pentru a modifica o proprietate a unei secvențe existente, utilizați Instrucțiunea ALTER SEQUENCE. Una dintre cele mai importante utilizări ale acestei instrucțiuni este cu opțiunea RESTART WITH, care resetează secvența specificată. Exemplul de mai jos arată utilizarea ALTER SEQUENCE pentru a reseta aproape toate proprietățile Sequence1:

UTILIZAȚI SampleDb; ALTER SEQUENCE dbo.sequence1 RESTART CU 100 INCREMENTARE CU 50 MINVALUE 50 MAXVALUE 200 FĂRĂ CICLU;

Ștergerea unei secvențe folosind o instrucțiune SECVENȚA DE CĂDERARE.

Setați operatori

Pe lângă operatorii discutați mai devreme, Transact-SQL acceptă încă trei seturi de operatori: UNION, INTERSECT și EXCEPT.

operator UNION

operator UNION combină rezultatele a două sau mai multe interogări într-un singur set de rezultate care include toate rândurile care aparțin tuturor interogărilor din uniune. În consecință, rezultatul unării a două tabele este un tabel nou care conține toate rândurile incluse într-unul dintre tabelele originale sau în ambele tabele.

Forma generală a operatorului UNION arată astfel:

select_1 UNION select_2 ( select_3])...

Parametrii select_1, select_2, ... sunt instrucțiuni SELECT care creează o îmbinare. Dacă se utilizează opțiunea TOATE, sunt afișate toate rândurile, inclusiv duplicatele. Într-un operator UNION, parametrul ALL are aceeași semnificație ca într-o listă de selecție SELECT, dar cu o singură diferență: pentru o listă de selecție SELECT, acest parametru este utilizat implicit, dar pentru un operator UNION trebuie specificat explicit.

În a lui forma originala Baza de date SampleDb nu este potrivită pentru demonstrarea utilizării operatorului UNION. Prin urmare, această secțiune creează un nou tabel, EmployeeEnh, care este identic cu tabelul Employee existent, dar are o coloană suplimentară Oraș. Această coloană indică locul de reședință al angajaților.

Crearea tabelului EmployeeEnh ne oferă o bună oportunitate de a demonstra utilizarea clauzei ÎNîn instrucțiunea SELECT. Instrucțiunea SELECT INTO efectuează două operații. Mai întâi, este creat un nou tabel cu coloanele listate în lista SELECT. Apoi, rândurile din tabelul original sunt inserate în noul tabel. Numele tabelului nou este specificat în clauza INTO, iar numele tabelului sursă este specificat în clauza FROM.

Exemplul de mai jos arată cum să creați tabelul EmployeeEnh din tabelul Employee:

UTILIZAȚI SampleDb; SELECT * INTO EmployeeEnh FROM Employee; ALTER TABLE EmployeeEnh ADD City NCHAR(40) NULL;

În acest exemplu, instrucțiunea SELECT INTO creează tabelul EmployeeEnh, inserează toate rândurile din tabelul sursă Employee în acesta, iar apoi instrucțiunea ALTER TABLE adaugă coloana City la noul tabel. Dar coloana Oraș adăugată nu conține nicio valoare. Valorile din această coloană pot fi inserate utilizând Management Studio sau folosind următorul cod:

UTILIZAȚI SampleDb; UPDATE EmployeeEnh SET City = "Kazan" WHERE Id = 2581; UPDATE EmployeeEnh SET City = „Moscova” WHERE Id = 9031; UPDATE EmployeeEnh SET City = "Ekaterinburg" WHERE Id = 10102; UPDATE EmployeeEnh SET City = "Sankt Petersburg" WHERE Id = 18316; UPDATE EmployeeEnh SET City = "Krasnodar" WHERE Id = 25348; UPDATE EmployeeEnh SET City = "Kazan" WHERE Id = 28559; UPDATE EmployeeEnh SET City = "Perm" WHERE Id = 29346;

Acum suntem gata să demonstrăm utilizarea instrucțiunii UNION. Exemplul de mai jos arată o interogare pentru a crea o îmbinare între tabelele EmployeeEnh și Department folosind această declarație:

UTILIZAȚI SampleDb; SELECTAȚI Orașul AS „ORAS” FROM EmployeeEnh UNION SELECTAȚI Locația FROM Departament;

Rezultatul acestei interogări:

Numai tabelele compatibile pot fi alăturate folosind declarația UNION. Prin tabele compatibile, înțelegem că ambele liste de coloane selectate trebuie să conțină același număr de coloane, iar coloanele corespunzătoare trebuie să aibă tipuri de date compatibile. (În ceea ce privește tipurile de compatibilitate date INTși SMALLINT nu sunt compatibile.)

Rezultatul unei îmbinări poate fi ordonat numai utilizând clauza ORDER BY în ultima instructie SELECTAȚI așa cum se arată în exemplul de mai jos. Clauzele GROUP BY și HAVING pot fi folosite cu instrucțiuni separate SELECT, dar nu în uniunea în sine.

Interogarea din acest exemplu selectează angajații care fie lucrează în departamentul d1, fie au început să lucreze la proiect înainte de 1 ianuarie 2008.

Operatorul UNION acceptă parametrul ALL. Utilizarea acestei opțiuni nu elimină duplicatele din setul de rezultate. Puteți utiliza operatorul OR în loc de operatorul UNION dacă toate instrucțiunile SELECT unite de unul sau mai mulți operatori UNION se referă la același tabel. În acest caz, setul de instrucțiuni SELECT este înlocuit cu o singură instrucțiune SELECT cu un set de operatori SAU.

Operatorii INTERSECT și EXCEPT

Alți doi operatori pentru lucrul cu seturi, INTERSECTŞi CU EXCEPŢIA, determinați intersecția și respectiv diferența. Sub intersecție în acest context există un set de rânduri care aparțin ambelor tabele. Iar diferența dintre două tabele este definită ca fiind toate valorile care aparțin primului tabel și nu sunt prezente în al doilea. Exemplul de mai jos arată utilizarea operatorului INTERSECT:

Transact-SQL nu acceptă utilizarea parametrului ALL cu operatorul INTERSECT sau EXCEPT. Utilizarea operatorului EXCEPT este prezentată în exemplul de mai jos:

Rețineți că acești trei operatori setați au priorități de execuție diferite: operatorul INTERSECT are cea mai mare prioritate, urmat de operatorul EXCEPT și operatorul UNION are cea mai mică prioritate. Neatenție la prioritatea de execuție atunci când se utilizează multiple diferiți operatori deoarece lucrul cu seturi poate duce la rezultate neașteptate.

Expresii CASE

În domeniul programării aplicațiilor de baze de date, uneori este necesară modificarea reprezentării datelor. De exemplu, oamenii pot fi subdivizați prin codificarea lor în funcție de clasa lor socială, folosind valorile 1, 2 și 3, desemnând bărbați, femei și, respectiv, copii. Această tehnică de programare poate reduce timpul necesar implementării unui program. expresie CASE Limbajul Transact-SQL facilitează implementarea acestui tip de codificare.

Spre deosebire de majoritatea limbajelor de programare, CASE nu este o declarație, ci o expresie. Prin urmare, o expresie CASE poate fi folosită aproape oriunde în care Transact-SQL permite expresii. Expresia CASE are două forme:

    expresie CASE simplă;

    expresia de căutare CASE.

Sintaxa pentru o expresie CASE simplă este:

O instrucțiune cu o expresie CASE simplă caută mai întâi o listă cu toate expresiile din clauza CÂND prima expresie care se potrivește cu expresia_1, apoi execută cea corespunzătoare THEN clauza. Dacă nu există nicio expresie care să se potrivească în lista CÂND, acesta clauza ELSE.

Sintaxa expresiei de căutare CASE este următoarea:

ÎN în acest caz, caută prima condiție de potrivire și apoi execută clauza THEN corespunzătoare. Dacă niciuna dintre condiții nu îndeplinește cerințele, se execută clauza ELSE. Utilizarea unei expresii de căutare CASE este prezentată în exemplul de mai jos:

UTILIZAȚI SampleDb; SELECTează Numele Proiectului, CAZUL CÂND Buget > 0 ȘI Buget 100000 ȘI Buget 150000 ȘI Buget

Rezultatul acestei interogări:

Acest exemplu cântărește bugetele tuturor proiectelor și apoi afișează ponderile lor calculate împreună cu numele proiectelor corespunzătoare.

Exemplul de mai jos arată o altă modalitate de a utiliza o expresie CASE, în care clauza WHEN conține subinterogări care fac parte din expresie:

UTILIZAȚI SampleDb; SELECTează Nume Proiect, CAZ CÂND p1.Buget (SELECTARE AVG(p2.Buget) FROM Proiectul p2) THEN „peste medie” END „Categoria bugetară” FROM Proiectul p1;

Rezultatul acestei interogări este următorul:

prin valoarea coloanei Disciplina. Vom obține 4 grupuri pentru care putem calcula niște valori de grup, precum numărul de tupluri din grup, valoarea maximă sau minimă a coloanei Scor. Tabelul 5.7. Funcții agregate
Funcţie Rezultat
CONTA Numărul de rânduri sau valorile câmpului neblank pe care le-a selectat interogarea
SUMĂ Suma tuturor valorilor selectate pentru acest câmp
AVG Media aritmetică a tuturor valorilor selectate pentru acest câmp
MIN Cea mai mică dintre toate valorile selectate pentru acest câmp
MAX Cea mai mare dintre toate valorile selectate pentru acest câmp
R1
Numele complet Disciplina Nota
Grupa 1 Petrov F.I. Baze de date 5
Sidorov K. A. Baze de date 4
Mironov A.V. Baze de date 2
Stepanova K. E. Baze de date 2
Krylova T. S. Baze de date 5
Vladimirov V. A. Baze de date 5
Grupa 2 Sidorov K. A. Teoria informației 4
Stepanova K. E. Teoria informației 2
Krylova T. S. Teoria informației 5
Mironov A.V. Teoria informației Nul
Grupa 3 Trofimov P. A. Rețele și telecomunicații 4
Ivanova E. A. Rețele și telecomunicații 5
Utkina N.V. Rețele și telecomunicații 5
Grupa 4 Vladimirov V. A. Limba engleză 4
Trofimov P. A. Limba engleză 5
Ivanova E. A. Limba engleză 3
Petrov F.I. Limba engleză 5

Funcții agregate sunt folosite similar numelor de câmp într-o instrucțiune SELECT, dar cu o singură excepție: iau numele câmpului ca argument. CU Funcții SUMși AVG pot fi utilizate numai câmpuri numerice. Atât câmpurile numerice, cât și cele de caractere pot fi utilizate cu funcțiile COUNT , MAX și MIN. Când sunt utilizate cu câmpuri de caractere, MAX și MIN le vor traduce în codul ASCII echivalent și le vor procesa în ordine alfabetică. Unele SGBD-uri permit utilizarea agregatelor imbricate, dar aceasta este o abatere de la standardul ANSI cu toate consecințele care decurg.

De exemplu, puteți calcula numărul de studenți care au susținut examene la fiecare disciplină. Pentru a face acest lucru, trebuie să rulați o interogare grupată după câmpul „Disciplina” și să afișați ca rezultat numele disciplinei și numărul de rânduri din grup pentru această disciplină. Folosirea caracterului * ca argument pentru funcția COUNT înseamnă numărarea tuturor rândurilor din grup.

SELECTAȚI R1.Discipline, COUNT(*) FROM R1 GROUP BY R1.Discipline

Rezultat:

Dacă vrem să numărăm numărul de persoane care au promovat examenul la orice disciplină, atunci trebuie să excludem valorile incerte din raportul inițial înainte de grupare. În acest caz, cererea va arăta astfel:

Obtinem rezultatul:

În acest caz, linia cu studentul

Mironov A.V. Teoria informației Nul

nu se va încadra în setul de tupluri înainte de grupare, deci numărul de tupluri din grup de disciplinat " Teoria informației„va fi cu 1 mai puțin.

Poate fi folosit funcții agregate de asemenea, fără operația de pregrupare, caz în care întreaga relație este considerată ca un grup și pentru acest grup se poate calcula o valoare per grup.

Revenind din nou la baza de date „Sesiune” (tabelele R1, R2, R3), aflăm numărul de examene promovate cu succes:

Acest lucru este, desigur, diferit de selectarea unui câmp, deoarece o singură valoare este întotdeauna returnată, indiferent de câte rânduri sunt în tabel. Argument funcții agregate pot exista coloane separate de tabel. Dar pentru a calcula, de exemplu, numărul de valori distincte ale unei anumite coloane dintr-un grup, trebuie să utilizați cuvântul cheie DISTINCT împreună cu numele coloanei. Să calculăm numărul de note diferite primite la fiecare disciplină:

Rezultat:

Rezultatul poate include valoarea câmpului de grupare și mai multe funcții agregate, iar în condiții de grupare puteți utiliza mai multe câmpuri. În acest caz, grupurile sunt formate conform unui set de câmpuri de grupare specificate. Operațiile cu funcții de agregare pot fi aplicate pentru a uni mai multe tabele sursă. De exemplu, să punem întrebarea: stabiliți pentru fiecare grupă și fiecare disciplină numărul de studenți care au promovat cu succes examenul și punctajul mediu la disciplină.

Rezultat:

Nu putem folosi funcții agregateîn clauza WHERE deoarece predicatele sunt evaluate în termenii unei singure linii și funcții agregate- în ceea ce priveşte grupurile de linii.

Clauza GROUP BY vă permite să definiți un subset de valori dintr-un anumit câmp în termenii unui alt câmp și să aplicați o funcție de agregare subsetului. Acest lucru face posibilă combinarea câmpurilor și funcții agregateîntr-o singură clauză SELECT. Funcții agregate poate fi folosit atât în ​​expresia pentru ieșirea rezultatelor liniei SELECT, cât și în expresia pentru condiția de procesare a grupurilor HAVING generate. În acest caz, fiecare funcție agregată este calculată pentru fiecare grup selectat. Valori obținute din calcul funcții agregate, poate fi folosit pentru a afișa rezultatele corespunzătoare sau pentru a condiționa selecția grupurilor.

Să construim o interogare care să afișeze grupuri în care s-a primit mai mult de o notă negativă la o disciplină la examene:

Pe viitor, de exemplu, nu vom lucra cu baza de date „Sesiune”, ci cu baza de date „Bancă”, constând dintr-un tabel F, care stochează relația F care conține informații despre conturile din sucursalele unei anumite bănci:

F = (N, Nume complet, Sucursală, Data deschiderii, Data închiderii, Sold); Q = (Sucursală, Oraș);

întrucât pe această bază se poate ilustra mai clar lucrarea cu funcţii agregate şi grupare.

De exemplu, să presupunem că vrem să găsim soldul total al conturilor bancare. Puteți face o interogare separată pentru fiecare dintre ele selectând SUM(Sold) din tabelul pentru fiecare ramură. GROUP BY vă va permite totuși să le puneți pe toate într-o singură comandă:

SELECTARE Branch, SUM(Remaining) FROM F GROUP BY Branch;

Se aplică GROUP BY funcții agregate independent pentru fiecare grup definit folosind valoarea câmpului Branch. Grupul este format din rânduri cu aceeași valoare a câmpului Branch și

Utilizarea funcțiilor agregate

SQL definește multe funcții încorporate de diferite categorii, printre care un loc special este ocupat de funcțiile agregate, care operează pe valorile coloanelor de mai multe rânduri și returnează o singură valoare. Argumentele pentru agregarea funcțiilor pot fi atât coloane de tabel, cât și rezultatele expresiilor peste acestea. Funcțiile agregate în sine pot fi incluse în alte expresii aritmetice. Următorul tabel prezintă cele mai frecvent utilizate funcții agregate unare standard.


Formatul general al unei funcții agregate unare este următorul:

function_name([TOATE | DISTINCT] expresie)

unde DISTINCT indică faptul că funcția ar trebui să ia în considerare numai sensuri diferite argument și ALL - toate valorile, inclusiv duplicatele (această opțiune este utilizată implicit). De exemplu, funcția AVG cu cuvântul cheie DISTINCT pentru rândurile de coloană cu valorile 1, 1, 1 și 3 va returna 2, iar dacă cuvântul cheie ALL este prezent, va returna 1.5.

Funcțiile agregate sunt utilizate în clauzele SELECT și HAVING. Aici ne vom uita la utilizarea lor în clauza SELECT. În acest caz, expresia din argumentul funcției se aplică tuturor rândurilor din tabelul de intrare al clauzei SELECT. În plus, nu puteți utiliza atât funcții agregate, cât și coloane de tabel (sau expresii cu acestea) într-o clauză SELECT decât dacă aveți o clauză GROUP BY, pe care o vom analiza în secțiunea următoare.

Funcția COUNT are două formate. În primul caz, numărul de rânduri din tabelul de intrare este returnat, în al doilea caz, numărul de valori ale argumentului din tabelul de intrare:

  • CONTA(*)
  • COUNT(expresie)

Cel mai simplu mod de a utiliza această funcție este să numărați numărul de rânduri dintr-un tabel (toate sau cele care îndeplinesc o condiție specificată). Pentru aceasta, se folosește prima opțiune de sintaxă.

Interogare: numărul de tipuri de produse pentru care sunt disponibile informații în baza de date.

SELECTAȚI COUNT(*) AS „Numărul de tipuri de produse”

DE LA Produs

A doua versiune a sintaxei funcției COUNT poate lua numele unei singure coloane ca argument. În acest caz, se numără fie numărul tuturor valorilor din această coloană a tabelului de intrare, fie numai al celor care nu se repetă (folosind cuvântul cheie DISTINCT).

Interogare: Numărul de nume distincte conținute în tabelul Client.

SELECTARE NUMĂR (FNAME DISTINCT)

DE LA Client

Utilizarea funcțiilor agregate unare rămase este similară cu COUNT, cu excepția faptului că pentru funcțiile MIN și MAX, utilizarea cuvintelor cheie DISTINCT și ALL nu are sens. Cu funcțiile COUNT, MAX și MIN, pe lângă câmpurile numerice, pot fi folosite și câmpuri de caractere. Dacă argumentul unei funcții agregate nu conține valori, funcția COUNT returnează 0 și toate celelalte returnează NULL.

SELECTARE MAX (Data Comanda)

DIN

WHERE OrdDate"1.09.2010"

Misiunea pentru munca independenta: Indicați-o Limbajul SQL interogări pentru a prelua următoarele date:

  • Costul total al tuturor comenzilor;
  • Numărul de orașe diferite conținut în tabelul Client.

Poate efectua procesări de grup generalizate a valorilor câmpului. Acest lucru se face folosind funcții agregate. Funcțiile agregate produc o singură valoare pentru un întreg grup de tabele. SQL oferă următoarele funcții agregate:

  • CONTA– numără numărul de rânduri de tabel cu valori non-NULL ale câmpului specificat ca argument.
  • SUMĂ– calculează suma aritmetică toate valorile selectate pentru acest câmp.
  • AVG– face media tuturor valorilor selectate din acest câmp.
  • MAX– afișează cea mai mare valoare dintre toate valorile selectate pentru acest câmp.
  • MIN– afișează cea mai mică valoare dintre toate valorile selectate pentru acest câmp.

    Utilizarea funcțiilor agregate

    Funcțiile agregate sunt utilizate în mod similar cu numele câmpurilor din clauza SELECT a unei interogări, cu o singură excepție: ele iau numele câmpurilor ca argument. Numai câmpurile numerice pot fi folosite cu SUMĂŞi AVG. CU CONTA, MAX, Și MIN Pot fi utilizate atât câmpurile numerice, cât și câmpurile de caractere. Când este utilizat cu câmpuri de caractere MAXŞi MIN le va traduce în echivalentul ASCII. Aceasta înseamnă că MINîl va alege pe primul și MAX ultima valoare în ordine alfabetică.

    Pentru a găsi valoarea totală a vânzărilor în tabelul de vânzări, trebuie să scriem următoarea interogare:

    SELECTAȚI SUM(SSum) FROM Vânzări

    Ca rezultat obținem:

    Această interogare a numărat numărul de valori care nu sunt goale în câmpul SNum din tabelul Sells. Dacă rescriem interogarea după cum urmează:

    SELECTAȚI COUNT(SDate) FROM Sells

    Ca rezultat obținem:

    COUNT OF SDdate
    4

    Se obțin rezultate diferite de interogare atunci când se calculează ceea ce pare a fi același lucru, deoarece una dintre valorile câmpului SDate este goală ( NUL). Fiți atenți când utilizați astfel de interogări.