11. subinterogările corelând
În acest capitol, vă vom prezenta la tipul de subinterogări pe care nu le-am discutat în Capitolul 10 - dedicat interogării secundare aferente. Vei învăța cum să utilizați sub-interogări corelate în interogarea WHERE și având. Asemănări și diferențe între subinterogările corelate și sindicatele vor fi discutate mai jos, și puteți crește cunoștințele de nume de alias-uri și prefixe de masă - atunci când acestea sunt necesare și cum să le folosească.
Cum de a forma corelarea subinterogare
Când utilizați sub-interogări cu SQL, puteți face referire la cererea interior o masă în clauza FROM a interogării exterioare. formând - subinterogare corelate. Când faceți acest lucru, este executat în mod repetat interogarea secundară, o dată pentru fiecare rând de interogare principal. Corelat subinterogare - unul dintr-un număr mare de concepte subtile în SQL din cauza complexității în evaluarea sa. Dacă vă puteți maestru, veți descoperi că el este foarte puternic, deoarece aceasta poate îndeplini funcții complexe, cu un set de instrucțiuni foarte concise.
CUM corelarea subinterogare
In exemplul de mai sus, „interior“ (interior) și „exterior“ (exterior), aliasuri, discutate în detaliu în Capitolul 9. Am ales aceste nume pentru claritate; ele se referă la cererile interne și externe, respectiv. Având în vedere că valoarea în cnum interogare exterioară schimbare cererea internă trebuie să fie efectuate separat pentru fiecare linie a unei cereri externe. Cererea externă String pentru care Figura 11.1 internă: Utilizarea subinterogare RELATIV
Cererea Nij va fi executat de fiecare dată, numit - actual candidat linie. În consecință, procedura de evaluare se realizează subinterogare corelată - este:
1. Selectați un rând din tabelul numit în interogare exterioară. Acest lucru va fi actualul candidat linie.
2. Salvați valoarea acestui candidat linie în numele alias în clauza FROM a interogării exterioare.
3. Efectuați interogarea secundară. Ori de câte ori este găsit alias pentru cererea externă (în acest caz, „exterior“), valoarea de a utiliza pentru candidat linia curentă. Folosind valorile de interogare candidat extern stroki- într-o subinterogare numit - link extern.
4. Rata de interogare exterior predicat pe baza rezultatelor interogării secundare efectuate la pasul 3. Se definește - în cazul în care un candidat șir este selectat pentru ieșire.
5. Repetați această procedură pentru următorul rând al tabelului unui candidat, și așa mai departe până când sunt verificate toate rândurile.
In exemplul de mai sus, SQL realizează următoarea procedură:
1. Se selectează un rând de la Hoffman masa de clienți. 2. Menține linia curentă drept candidat linie sub un pseudonim - „în afara“.
5. El repetă întreaga procedură, folosind șir Giovanni ca datele sale de candidat-line, și apoi stochează din nou până când fiecare rând din tabelul Clienții nu vor fi verificate.
După cum puteți vedea, calculând care execută SQL folosind aceste instrucțiuni simple - o gamă completă. Desigur, ai putea rezolva aceeași problemă folosind asocierea formularul de mai jos (de ieșire pentru această interogare este prezentată în figura 11.2): Vă rugăm să rețineți că Cisneros a fost selectat de două ori, o dată pentru fiecare comanda pe care o anumită dată. Am putea repara folosind SELECT DISTINCT in loc doar SELECT. Dar acest lucru nu este neapărat într-o variantă subinterogare. IN operatorul utilizat în interogarea secundară exemplu de realizare nu face nici o diferență între valorile care sunt selectate printr-o subinterogare, iar odată ce valorile sunt alese în mod repetat. Prin urmare, DISTINCT este opțională. Figura 11. Utilizarea Uniunilor 2 subinterogare în loc RELATIVA
Să presupunem că vrem să vedem numele și numerele tuturor vânzătorilor care au mai mult de un client. Următoarea interogare va face acest lucru pentru tine (de ieșire prezentată în figura 11.3): Vă rugăm să rețineți că clauza FROM a interogării secundare în acest exemplu nu utilizează un pseudonim. În lipsa unui nume de tabel sau alias prefix, SQL poate începe să accepte că oricare dintre câmpurile afișate în tabel cu numele specificat în clauza FROM a cererii curente. Dacă un câmp cu acest nume nu există (în cazul nostru - snum) la masă, SQL va verifica pentru cererile externe. Acesta este motivul pentru care, prefixul numele tabelă este de obicei necesară în corelați sub-interogări - pentru a anula această ipoteză. Alias-urile sunt, de asemenea, de multe ori solicitate pentru a vă oferi posibilitatea de a se referi la aceeași masă în interior și interogarea exterioară, fără nici o ambiguitate. Figura 11.3: vânzătorii Găsirea cu mulți clienți
UTILIZAREA RELATIV GĂSIȚI ERRORS subinterogările
Uneori este util pentru a efectua interogările care sunt special concepute pentru a găsi erori. Este întotdeauna posibil atunci când informațiile defect care pot fi introduse în baza de date, iar în cazul în care este introdus, este dificil să-l definească. Următoarea interogare nu produce nikako- de ieșire. El se uită la ordinele de masă pentru a vedea dacă același etaj și cnum snum în fiecare rând Clientilor de masă și afișează kazh- linia lovitură în cazul în care acest lucru nu este o coincidență. Cu alte cuvinte, cererea afla dacă dealerul creditate fiecare vânzare (el percepe câmp cnum ca cheia primară a tabelului Clienții, care nu va avea valori binare în acest tabel). Atunci când se utilizează un mecanism de integritate de referință (discutate în capitolul 19), puteți fi garantată de anumite erori de acest tip. Acest mecanism nu este întotdeauna disponibil, deși utilizarea sa este de dorit, în toate cazurile, eroarea de interogare de căutare descris mai sus, poate fi mai util.
TABEL COMPARATIV CU MINE
Puteți utiliza, de asemenea, o subinterogare corelată bazată pe aceeași tabelă ca interogarea principală. Acest lucru vă va oferi o oportunitate de a învăța unele forme complexe de informații produse. De exemplu, putem găsi toate comenzile cu valorile sumei de cumpărare peste media pentru clienții lor (de ieșire prezentată în figura 11.4): Figura 11.4: Corelarea cu un tabel
Desigur, în acest tabel mic eșantion care majoritatea clienților au doar o singură procedură, cele mai multe dintre valorile sunt ambele medii și, prin urmare, nu a fost selectat. Să introducă echipa într-un alt mod (de ieșire prezentată în figura 11.5): Figura 11.5: Selectează comenzile sunt> = valoarea medie a achizițiilor pentru clienții lor.
Diferența, desigur, că relațională predicatul principal operatorul include valori care sunt egale cu media (care, de obicei, înseamnă că acestea sunt - doar comenzi pentru datele clientului).
Subinterogarilor în clauza ATRIBUITE HAVING
Corelând subinterogare ASOCIATII SI
După cum ați ghicit, subinterogările în natură aproape de sindicate corelate - ambele includ verificarea in fiecare rânduri de tabel cu fiecare rând de altul (sau același pseudonim) tabel. Veți găsi că cele mai multe dintre operațiunile care pot fi efectuate cu unul dintre acestea vor lucra, de asemenea, cu cealaltă.
Cu toate acestea, există diferențe în aplicare între ele, cum ar fi nevoia menționată mai sus, în asociere cu utilizarea DISTINCT și opțional cu o subinterogare. Există, de asemenea, unele lucruri pe care oricine poate face acest lucru, deoarece acest lucru nu poate fi altul. Subcereri, de exemplu, se poate utiliza funcțiile agregate în predicatul, ceea ce face posibilă punerea în aplicare a tipului de exemplul anterior de operațiuni în care am învățat ordine de valoarea medie pentru clienții lor. Unificarea pe de altă parte, poate linii de ieșire din cele două tabele fiind comparate, în timp ce producția de subinterogările utilizate numai în predicate cereri externe. Ca o regulă, formularul de solicitare care pare cel mai intuitiv este, probabil, cel mai bun de a utiliza, dar este bine să cunoască atât tehnologia pentru acele situații în care una sau alta nu poate funcționa.
Tu se pot felicit cu măiestria o mare parte din conceptele discutate în SQL - RELATIVE interogării secundare. Ai văzut cum subinterogare corelată în legătură cu fuziunea, precum și modul în care acesta poate fi utilizat cu funcții agregate în clauza HAVING. În general, ați învățat acum toate tipurile subinterogarilor complet.
Următorul pas - o descriere a unor instrucțiuni SQL specifice. Ei iau subcereri ca argumente, la fel ca IN, dar spre deosebire, acestea sunt doar în subinterogările pot fi folosite. Prima dintre ele, prezentate în capitolul 12. - numit EXISTS.
cu SQL
1. Scrieți o comandă SELECT folosește o subinterogare corelată care selectează numele și numerele tuturor clienților cu cele mai mari scoruri pentru orașele lor.
2. Scrieți două interogări care va selecta toate vânzătorii (ca numele lor și numărul de telefon) pe care ei nu au serviciul pentru clienți în orașele lor. O cerere - folosind asociere și una - cu o subinterogare corelate. Care dintre soluțiile ar fi mai elegant?
(Sugestie: O modalitate de a face acest lucru este de a găsi toți clienții care nu sunt deservite de către vânzător și de a determina dacă fiecare dintre ele în orașul dealer.)