Limbajul de interogare structurat (sql)

Capitolul 3. Interogări utilizând mai multe tabele

Un subset imbricat este o subchetare închisă în paranteze și imbricată în fraza WHERE (HAVING) a clauzei SELECT sau a altor clauze care utilizează clauza WHERE. Un subset imbricat poate conține o altă subcâmplare imbricată în fraza WHERE (HAVING) și așa mai departe. Previzibil, subinterogare imbricate este creat pentru a atunci când se selectează rândurile tabelei de formate de interogarea principală ar putea utiliza datele din celelalte tabele (de exemplu, selecția de feluri de mâncare din meniu pentru a utiliza datele privind prezența produselor în depozit pensia).

Există subqueries simple și corelate imbricate. Acestea sunt incluse în fraza WHERE (HAVING) utilizând IN, EXISTS sau una dintre condițiile de comparație (= <> | | <| <= |> |> =). Subcheile simple imbricate sunt gestionate de sistemul "bottom-up". Prima subcotare de nivel inferior este procesată mai întâi. Setul de valori obținut ca rezultat al execuției sale este utilizat la implementarea unui subquery de nivel superior, etc.

Solicitările cu subdotări corelate sunt procesate în ordine inversă. Mai întâi, primul rând al tabelului de lucru format din interogarea principală este selectat și sunt selectate valorile acelor coloane care sunt utilizate în subdotarea imbricată (subdotări imbricate). Dacă aceste valori satisfac condițiile din subdotarea imbricată, atunci șirul selectat este inclus în rezultat. Apoi este selectată a doua linie, etc. până când rezultatul este inclus toate rândurile care satisface subquery imbricate (secvențe de subqueries imbricate).

Trebuie remarcat faptul că SQL are o redundanță mare în sensul că oferă adesea mai multe moduri diferite de formulare a aceleiași interogări. Prin urmare, în multe exemple ale acestui capitol, vor fi utilizate formulările conceptuale ale interogărilor, pe care le cunoaștem deja din capitolul precedent. Și în ciuda faptului că unele dintre ele sunt puse în aplicare cu succes cu ajutorul conexiunilor, va fi în continuare aici sunt opțiunile lor folosind subinterogări imbricate. Acest lucru se datorează necesității de a explora principiul detaliat al creării și executarea subinterogarilor imbricate, deoarece există mai multe probleme (în special în eliminarea și modificarea datelor), care nu pot fi realizate într-un alt mod. În plus, diferitele formulare ale aceleiași interogări necesită resurse de memorie diferite pentru execuția lor și pot diferi în mod semnificativ în timpul implementării în diferite DBMS-uri.

Sub-cerințele simple imbricate sunt folosite pentru a reprezenta un set de valori care ar trebui examinate în unele predicate IN, după cum se ilustrează în exemplul următor: dați numele și starea furnizorilor produsului cu numărul 11, adică roșii.

SELECT Nume, Stare
De la furnizori
WHERE PS IN
(SELECT PS
FROM Supplies
Unde PR = 11);

După cum sa menționat deja la punctul 3.3.1. Atunci când se procesează o interogare completă, sistemul execută în principal o subdotare imbricată. Această subcheie produce un număr de numere de furnizori care furnizează produsul cu codul OL = 11, și anume setul (1, 5, 6, 8). Prin urmare, solicitarea inițială este echivalentă cu o astfel de interogare simplă:

SELECT Nume, Stare
De la furnizori
CÂND PS IN (1, 5, 6, 8);

Un subtip cu mai multe niveluri de cuibare poate fi ilustrat prin același exemplu. Să fie obligat să nu învețe pe furnizorii produsului 11, așa cum sa făcut în cererile anterioare, dar furnizorii de tomate care sunt produsul cu numărul 11. Pentru a face acest lucru,

SELECT Nume, Stare
De la furnizori
WHERE PS IN
(SELECT PS
FROM Supplies
Unde este PR
(SELECT PR
Din produse
WHERE Produs = "Tomate"));

În acest caz, rezultatul subtotalității interioare este doar o valoare (11). După cum am arătat mai sus, sub-nivelul următorului nivel dă rezultatul (1, 5, 6, 8). Ultimul, cel mai exterior SELECT, calculează rezultatul final de mai sus. În general, este permisă orice adâncime de cuibărire a subchetărilor.

Același rezultat se poate obține prin conectare

SELECT Nume, Stare
Din furnizori, livrări, produse
WHERE Furnizori PS = consumabile.
AND DELIVERY.PR = Produse.PR
ȘI Produs = "Tomate";

Atunci când această interogare compactă este executată, sistemul trebuie să proceseze simultan datele din trei tabele, în timp ce în exemplul anterior aceste tabele sunt procesate la rândul lor. În mod natural, pentru implementarea lor sunt necesare diferite resurse de memorie și de timp, dar acest lucru nu poate fi resimțit atunci când lucrați cu o cantitate limitată de date în baza de date exemplară PANSION.

Emiteți numărul furnizorilor care furnizează cel puțin un produs furnizat de furnizor 6.

SELECTAREA DISTINCTULUI PS
FROM Supplies
Unde este PR
(SELECT PR
FROM Supplies
Unde MS = 6);

SELECTAREA DISTINCTULUI X.PS
FROM Supplies X
Unde X.PR IN
(SELECT Y.PR
FROM Supplies Y
Unde Y.PS = 6);

Aici, X și Y sunt aliasuri masă arbitrare din tabelul de aprovizionare definite în clauza FROM și folosite ca calificative explicite în clauzele SELECT și WHERE. Amintiți-vă că aliasurile sunt definite numai într-o singură interogare.

Emiteți numărul furnizorilor localizați în același oraș ca și furnizorul cu numărul 6.

SELECT PS
De la furnizori
Unde City =
(SELECT City
De la furnizori
Unde MS = 6);

În interogări similare, puteți utiliza și alți operatori de comparare (<>, <=, <,>= sau>), cu toate acestea, dacă o subdotare încorporată returnează mai mult de o valoare și operatorul IN nu este utilizat, va apărea o eroare.

Eliberați numele și statutul furnizorilor de produs cu numărul 11.

SELECT Nume, Stare
De la furnizori
Unde 11 IN
(SELECT PR
FROM Supplies
WHERE SW = Furnizori.PS);

Această subcotare diferă de cea discutată în secțiunea 3.3.2 prin faptul că subdotarea imbricată nu poate fi procesată înainte de procesarea unui subdotar extern. Acest lucru se datorează faptului că subdotarea imbricată depinde de valoarea furnizorilor.PC și se modifică deoarece sistemul verifică diferitele rânduri din tabelul Furnizori. Prin urmare, din punct de vedere conceptual, procesarea se realizează după cum urmează:

Sistemul verifică primul rând din tabelul Furnizori. Să presupunem că acesta este șirul de furnizori cu numărul 1. Apoi valoarea Vendors.PC va avea în momentul de față o valoare de 1 și sistemul va procesa interogarea internă

(SELECT PR
FROM Supplies
Unde MS = 1);

rezultând o mulțime de (9, 11, 12, 15). Acum, sistemul poate finaliza procesarea de către furnizor, cu numărul 1. Exemple de valori pentru numele și statutul SS = 1 (hrănitoare și de piață) va avea loc dacă și numai dacă PR = 11 va aparține acestui set, care este în mod evident adevărat.

  • Apoi, sistemul va repeta procesarea de acest tip pentru următorul furnizor etc. până când sunt luate în considerare toate rândurile tabelului Furnizori.
  • Asemenea subdotări se numesc corelate, deoarece rezultatul lor depinde de valorile definite în subdiviziunea exterioară. Prin urmare, procesarea subdotării corelate trebuie repetată pentru fiecare valoare extrasă din subansamblul extern, mai degrabă decât executată o dată pentru totdeauna.

    Luați în considerare un exemplu de folosire a aceluiași tabel într-o subdiviziune externă și o subcotare corelată.

    Eliberați numărul tuturor produselor furnizate de un singur furnizor.

    SELECTAREA DISTINCTULUI X.PR
    FROM Supplies X
    Unde X.print nu este în
    (SELECT Y.PR
    FROM Supplies Y
    Unde Y.PS <> X.PS);

    Acțiunea acestei cereri poate fi ilustrată după cum urmează: „alternativ pentru fiecare rând de Supplies de masă, să zicem X, izola valoarea numărul produsului (OL), dacă și numai dacă valoarea nu este inclusă în anumite linie, să zicem, Y, aceeași masă, iar valoarea coloanei numărul furnizorului (PS) în rândul Y nu este egal cu valoarea sa pe linia X ".

    Rețineți că în această formulare trebuie utilizat cel puțin un pseudonim - fie X, fie Y -.

    Cuantificatorul EXISTĂ (există) este un concept împrumutat din logica formală. În SQL, predicatul cu quantifier existența este reprezentat de expresia EXISTS (SELECT * FROM.).

    O astfel de expresie este considerată adevărată numai atunci când rezultatul calculului "SELECT * FROM" este un set neimpozabil, adică când există o intrare în tabel specificată în clauza FROM a subchetei care satisface clauza WHERE a subchetei. (Practic, acest subansamblu va fi întotdeauna un set corelat.)

    Să luăm în considerare exemple. Eliberați numele furnizorilor care livrează produsul cu numărul 11.

    SELECT Nume
    De la furnizori
    CARE EXISTĂ
    (SELECT *
    FROM Supplies
    WHERE IS = Furnizori.PP
    Și PR = 11);

    Sistemul selectează secvențial rândurile tabelului Furnizori, selectează valorile din coloanele Nume și PS și apoi verifică dacă condiția existenței este adevărată, i. E. Tabelul Supply conține cel puțin o linie cu o valoare PR = 11 și o valoare MS egală cu valoarea MS selectată din tabelul Furnizori. Dacă condiția este îndeplinită, valoarea rezultată a coloanei Nume este inclusă în rezultat.

    Să presupunem că primele câmpuri de valoare Numele și SS sunt, respectiv, „satisfăcătoare“ și 1. Ca și în linie Tabelul de alimentare are un PR = 11 și SS = 1, valoarea „satisfăcătoare“ ar trebui să fie inclusă în rezultatul.

    Deși acest prim exemplu arată doar o altă modalitate de a formula o interogare pentru o sarcină care poate fi rezolvată în alte moduri (folosind IN sau operatorul de conexiune), EXISTS este una dintre cele mai importante caracteristici SQL. De fapt, orice cerere care este exprimată prin IN poate fi formulată alternativ și folosind EXISTS. Cu toate acestea, declarația inversă este nedreaptă.

    Eliberați numele și statutul furnizorilor care nu se livrează cu numărul de produs 11.

    SELECT Nume, Stare
    De la furnizori
    Unde nu există
    (SELECT *
    FROM Supplies
    WHERE IS = Furnizori.PP
    Și PR = 11);

    Acum, după ce a face cunoștință cu diferite formulări de sub-interogări și alias-urile sunt mai ușor de înțeles textul și implementarea algoritmului de interogare (punctul 3.1.), Furnizorilor de produse alimentare Syrnikov care furnizează aceste produse la un cost mai mic imbricate:

    SELECT produsul, prețul, titlul, statutul
    Din produse, ingrediente, vase, livrări, furnizori
    WHERE Продукты.ПР = Состав.ПР
    AND Состав.БЛ = Блюда.БЛ
    Și consumabile.
    Și consumabile PS = Furnizori.
    Și bucătărie = "Cheesers"
    ȘI prețul = (SELECT MIN (Preț)
    FROM Supplies X
    WHERE X.PR = Livrări.PR);

    În mod natural, aceasta este o subcotare corelată: aici este determinat mai întâi prețul minim al produsului, care face parte din Syrnikov, iar apoi furnizorul său este găsit.

    În acest exemplu, vom ajunge să ne familiarizăm cu subînțelegerile imbricate, sugerând să încercăm să realizăm o serie de interogări folosind mecanismul unor asemenea subruturi:

    1. Eliberați numele tuturor felurilor de mâncare din carne.
    2. Dați numărul tuturor feluri de mâncare, care includ roșiile.
    3. Oferiți feluri de mâncare, produse pentru care sunt furnizate de compania agricolă SUMMER.

    Articole similare