5 4 7 grup prin utilizarea frazei
Explicație. Din punct de vedere conceptual, GROUP BY operatorul (grup) rearanjează frazei prezentate tabelul DIN, în secțiuni, sau grupuri, astfel încât fiecare grup toate rândurile au aceeași valoare a câmpului specificat în fraza GROUP BY. Aceasta, desigur, nu înseamnă că tabelul este rearanjat fizic în baza de date. În acest SP rândurile din tabelul cu exemplul grupate, astfel încât un grup include toate rândurile pentru articolele P1 la altul, toate rândurile pentru elementele P2, și așa mai departe. D. În plus, fiecare tabel rearanjate grup, mai degrabă decât pentru fiecare linie sursă de tabel se aplică SELECT expresie. Fiecare expresie din fraza SELECT trebuie să accepte o singură valoare pentru grup, adică. E. Poate fi fie de către câmpul specificat în GROUP propoziție BY sau o expresie aritmetică, inclusiv acest domeniu, constant sau funcția, cum ar fi SUM, care operează toate valori ale acestui domeniu într-un grup, iar aceste valori se reduce la o singură valoare.
Rândurile din tabel pot fi grupate în funcție de orice combinație de domeniile sale. Secțiunea 5.6 este un exemplu care ilustrează gruparea mai mult de un câmp. Rețineți că clauza GROUP BY nu implică ORDER BY (comanda). Pentru a asigura ordonarea rezultatului acestui exemplu, prin numărul de o parte, ar trebui să specifice ORDER BY DETALII clauza camerei după expresia GROUP BY. Dacă câmpul pe care se realizează valorile grupului, conține valori nule, fiecare dintre care dă naștere unui grup separat.
5.4.8. UTILIZARE clauza WHERE cu GROUP BY
Eliberat pentru fiecare detalii furnizate de numărul și valoarea totală a livrărilor, cu excepția livrărilor S1 furnizor:
SELECT NOMER_DETALI, USM (NUMBER)
UNDE NOMER_POSTAVSCHIKA = 'S1'
GROUP BY NOMER_DETALI;
Rândurile care nu satisfac fraza în care, înainte de a fi eliminate orice grupare.
5.4.9. UTILIZAREA HAVING
Da numere pentru toate piesele furnizate de mai mult de un furnizor (același exemplu ca în 5.2.5).
GROUP BY NOMER_DETALI
AVÂND COUNT (*)> 1;
Expresie HAVING joacă același rol pentru grupurile, și în cazul în expresie pentru rânduri. (Desigur, dacă expresia este specificat HAVING, acesta trebuie să fie specificate, și termenii GROUP BY.) Cu alte cuvinte, au folosit pentru a exclude grupurile, la fel ca și atunci când sunt utilizate pentru a exclude linii. Exprimarea în HAVING trebuie să accepte o singură valoare pentru grup.
În exemplul 5.2.5 a fost demonstrat că această interogare poate fi formulată fără GROUP BY (fara HAVING) folosind un subinterogare corelate. Cu toate acestea, exemplul 5.2.5 se bazează într-adevăr pe o oarecum diferită percepție a logicii asociate cu determinarea răspunsul la această întrebare. De asemenea, este posibil să se formuleze o interogare, utilizând în esență aceeași logică ca și în grupul de realizare BY / HAVING, dar fără utilizarea explicită a frazelor GROUP BY și, în general, clauzele CARE AU:
SELECT NOMER_DETALI DISTINCT
UNDE SPY.NOMER_DETALI = SPX.HOMEP_DETALI);
O altă variantă de realizare, în care, în loc cu ajutorul tabelului SPX P, este probabil mai clar:
(SELECT COUNT (NOMER_POSTAVSCHIKA)
UNDE NOMER_DETALI = P. NOMER_DETALI);
O altă formulare implică utilizarea EXISTS:
UNDE SPX. NOMER_DETALI = R. NOMER_DETALI
UNDE SPY. NOMER_DETALI = R. NOMER_DETALI
ȘI SPY. NOMER_POSTAVSCHIK = SPX. NOMER_
Toate aceste alternative sunt, în unele privințe preferabilă de realizare GROUP BY / AVÂND datorită faptului că acestea sunt cel puțin în mod logic mai bine înțeleasă, și, în special, nu necesită aceste constructe lingvistice suplimentare. obiective ale textului original în limbaj natural - „Ia-numere de piese pentru toate piesele furnizate de mai mult de un furnizor“ - fără îndoială, nu este clar faptul că gruparea în sine este ceea ce este necesar pentru a răspunde la această întrebare, și în ea, într-adevăr, nu este nevoie. Nici nu este imediat evident că condiția necesară pentru a avea, dar nu și condiția WHERE. Opțiunea GROUP-BY / AVÂND mai mult ca o instrucțiune de procedură pentru rezolvarea problemei decât formularea logică clară a creaturilor sale. Pe de altă parte, nu se poate nega faptul că versiunea GROUP-BY / AVÂND mai laconică. Mai mult, la rândul lor, sunt unele dintre sarcinile de aceeași natură generală, pentru care GROUP BY și având pur și simplu inadecvate, motiv pentru care ar trebui să utilizați una dintre abordările alternative. Un exemplu al acestei probleme este prezentată în Exercițiu 5,24.
În cele din urmă, GROUP BY modele tind să o limitare serioasă - funcționează doar pe un singur nivel. Este imposibil să se împartă fiecare dintre aceste grupuri în grupe de nivel inferior, și așa mai departe. D. Și apoi aplică o anumită funcție standard, cum ar fi SUM sau AVG pentru fiecare nivel de grupare 16.
5.5. ASOCIERE
Uniunea a două seturi este mulțimea tuturor elementelor care aparțin una sau ambele seturi originale. Deoarece raportul este setat (set de linii), se poate construi combinarea a două relații. Rezultatul va fi un set format din toate rândurile incluse în nici una sau ambele relației originale. În cazul în care, cu toate acestea, acest rezultat în sine trebuie să fie alte moduri, mai degrabă decât pur și simplu un amestec eterogen de siruri de caractere, două relații originale ar trebui să fie compatibile pentru a combina. Informal vorbind, în ambele linii privințe, ar trebui să fie aceeași „formă“. În ceea ce privește SQL, voi doi sunt foi de calcul compatibile cu privire la asocierea (operatorul UNION poate fi aplicat acestora), dacă și numai dacă:
a) au același număr de coloane, de exemplu, m;
b) pentru toți i (i = 1,2 m) coloană i-lea al primului tabel și coloana i-lea al doilea tabel au exact același tip de date .;
- în cazul în care zecimala tipul de date (p, q), atunci p trebuie să fie;
aceeași pentru ambele coloane și q trebuie să fie aceeași pentru ambele coloane;
- în cazul în care tipul • CHAR a datelor (n), atunci n trebuie să fie. aceeași pentru ambele coloane;
- în cazul în care tipul de date-VARCHAR; (n), atunci n trebuie să fie aceeași pentru ambele coloane;
- Dacă NOT NULL este specificată pentru oricare dintre aceste coloane, aceleași specificații ar trebui să fie pentru o altă coloană.
5.5.1. Interogările care necesită utilizarea UNION
Pentru a elibera numerele pieselor care au o greutate de 16 de lire sterline sau S2 furnizorul de mai multe disponibile (sau ambele).
Explicație. Clauza SELECT expresie folosită în ordinea în care acestea sunt scrise, cu excepția fraza SELECT în sine, care este aplicată între HAVING și ORDER BY, dacă este cazul. În acest exemplu, prin urmare, este posibil să ne imaginăm că rezultatul este după cum urmează.
1. DE LA. Ca urmare a Prelucrării clauza FROM creează un nou tabel, care este produsul cartezian al tabelelor P și SP.
2. UNDE. La pasul 1, toate rândurile sunt excluse rezultat care nu îndeplinesc intrarea unde. În acest exemplu, liniile excluse nu satisface predicatul:
R.NOMER-DETALII SI R.TSVET SP.HOMEP_DETALI = IN ( 'Red', 'Blue') ȘI SP.KOAH5ECTBO> 200.
3. GROUP BY. După pasul 2 este grupat de valori de câmp (câmpuri) indicate în fraza GROUP BY. În exemplul nostru, acest câmp R.NOMER-PIESE R.VES și R.TSVET. Notă. Teoretic, ca și câmpul de grupare ar fi suficientă pentru a utiliza numai R.NOMER-DETALII, ca R.VES și R.TSVET unic determinată de numărul parte. Cu toate acestea, sistemul DB2 nu este conștient de acest ultim fapt, și dacă R.VES R.TSVET și va fi omisă în GROUP BY teză, o condiție de eroare se produce, deoarece acestea sunt incluse în fraza SELECT. Principala problemă aici este că sistemul DB2 nu suportă cheile primare. A se vedea. Anexa A.
4. Având. Grupurile care nu satisfac condiția SUM (numărul)> 350 fiind excluse din rezultatul obținut la etapa 3.
5. SELECT. Fiecare grup obținut în etapa 4 pentru a citi generează un singur rând de rezultat. În primul rând, grupul alocat numărul reperului, greutatea, culoarea și valoarea maximă a livrărilor. În al doilea rând, greutatea convertită în grame. În al treilea rând, locațiile corespunzătoare care rezultă rânduri se introduc „greutatea în grame =“ două constante șir și „volum maxim de livrare =“.
6. ORDER BY. După pasul 5 este comandat în conformitate cu specificația ORDER BY expresie pentru a obține un rezultat final.
Desigur, cererea este destul de complex de mai sus, dar imaginați-vă ce face treaba. Program regulat, de exemplu, în limba COBOL care efectuează același loc de muncă, s-ar putea ajunge la nouă pagini, în comparație cu doar nouă linii de mai sus. În acest caz, lucrările necesare pentru a se asigura că acest program a devenit operațional, mult mai mult decât este necesar pentru a formula o interogare în limbaj SQL a formei de realizare. Cele mai multe cereri va fi, în practică, desigur, în orice caz, este mult mai ușor decât cu el.
EXERCITII
Ca și în capitolul precedent. Toate exercițiile următoare se bazează pe baza datelor furnizor-piese-de fabricație (a se vedea. Exercițiile din capitolul 3). În fiecare dintre ele pe care doriți să înregistrați instrucțiunea SELECT pentru o interogare, cu excepția exercitarea 15-18 și 26. Pentru comoditate, repetăm aici, structura bazei de date luate în considerare:
S (NOMER_POSTAVSCHIKA, NUME, stat, oraș)
P (NOMER_DETALI, nume, culoare, greutate, CITY)
J (NOMER_IZDELIYA, numele și locația)
SPJ (NOMER_POSTAVSCHIKA, NOMER_DETALI, NOMER_IZDELIYA,
În fiecare secțiune, exercițiile sunt aranjate aproximativ în ordinea crescătoare a complexității. Ar trebui să încerce să facă cel puțin unele dintre exercițiile pulmonare din fiecare grup. Exerciții sunt destul de dificil 12-18.
5.1. Da numele produselor, care sunt furnizate cu furnizorul de piese S1.
5.2. Componentele de culoare Issue furnizate de furnizorul S1.
5.3. Lista pieselor furnizate pentru orice produs din Londra.
5.4. Emiterea unui număr de produse, utilizând cel puțin o parte furnizat de către furnizorul S1.
5.5. Emiterea unui număr de furnizori care furnizează cel puțin o parte furnizate de cel puțin un furnizor, care furnizează cel puțin un element de culoare roșie.
5.6. Emiterea unui număr de furnizori care au condiții mai puțin decât cea a S1 furnizor.
5.7. Emiterea unui număr de furnizori care furnizează piese pentru orice produs cu o parte P1 într-o cantitate mai mare decât volumul mediu de detalii aprovizionare P1 pentru acest produs. Notă. În acest exercițiu, trebuie să utilizați funcția standard a AVG.
5.8. Se repetă 5.3 și utilizați în decizia dvs. există deja.
5.9. Se repetă 5.4 și utilizați în decizia dvs. există deja.
5.10. Enumerați produsele care nu livrează nici un furnizor de piese de culoare roșie de la Londra.
5.11. Lista produsele pentru care detaliile complete ale furnizorului S1 livrează.
5.12. Lista pieselor furnizate pentru toate produsele din Londra.
5.13. Emiterea unui număr de furnizori care furnizează același element pentru toate produsele.
5.14. Lista produselor pentru care să furnizeze cel puțin toate piesele sunt disponibile de la furnizor S1.
Pentru următoarele patru exerciții (5.15-5.18), converti date SQL SELECT limba înapoi în echivalentul său în limbaj natural.
5,15. SELECT NOMER_IZDELIYA DISTINCT
UNDE NU EXISTĂ
UNDE SPJY.NOMER_IZDELIYA = SPJX. NOMER_
paginația documentului final publicat va fi diferit. articol apare, iar editorul. Titlul Referințele trebuie. C ++ adnotat manual de referință. Reading, Masa: Addison -WesleyPublishingCompany. Inc Kunz, J. C. M. J. Clayton, și.
20Nar49; AF11777. Helene Weigel Brecht (W), Barbara Brecht. PublishingCompany. angajator pentru închiriere. 0 251pr50; 11150R60. West PublishingCompany E Avocații Co-operative PublishingCompany. Jr. 0 17NovV9; 13R473. Addison Galeria de American Art.
și P.B. Galvin - Sistem de operare Concepte - Addison -WesleyPublishingCompany. A.S. Godbole - Sisteme de operare - Tata McGraw. Un curs în primul rând statistică matematică, AddisonWesleyPublishingCompany. 1973 4. B.L.Van der Waerden, matematică.
u Penulis Sears, Francis W. Penerbit California. Addison -WesleyPublishingCompany Tahun 1982 Jumlah 1 eksemplar Subyek. f Penulis Feynman, Richard P. Penerbit California. Addison -WesleyPublishingCompany Tahun 1963 Jumlah 4 eksemplar Subyek.