Internet Windows Android

Interogări folosind funcția exists. Folosind operatorul EXISTS

SQL vă permite să imbricați interogări unul în celălalt. De obicei, o subinterogare returnează o singură valoare, care este testată pentru a vedea dacă predicatul este adevărat.

Tipuri de condiții de căutare:
. Comparație cu rezultatul subinterogării (=, >=)
. Verificarea dacă rezultatele unei subinterogări aparțin (IN)
. Test de existență (EXISTĂ)
. Comparație multiplă (cantitativă) (ORICE, TOATE)

Note despre interogările imbricate:
. O subinterogare trebuie să selecteze doar o coloană (cu excepția unei subinterogări cu un predicat EXISTS), iar tipul său de date rezultat trebuie să se potrivească cu tipul de date al valorii specificate în predicat.
. În unele cazuri, puteți utiliza cuvântul cheie DISTINCT pentru a vă asigura că obțineți o singură valoare.
. Nu puteți include o clauză ORDER BY și UNION într-o subinterogare.
. O subinterogare poate apărea fie în stânga, fie în dreapta termenului de căutare.
. Subinterogările pot folosi funcții de agregare fără o clauză GROUP BY care returnează automat o valoare specială pentru orice număr de rânduri, un predicat IN special și expresii bazate pe coloane.
. Ori de câte ori este posibil, îmbinările tabelului JOIN ar trebui să fie folosite în loc de subinterogări.

Exemple de interogări imbricate:

SELECT * FROM Comenzi WHERE SNum=(SELECT SNum FROM SalesPeople WHERE SNum='Motika')
SELECTAȚI * FROM Comenzi WHERE SNum IN (SELECT SNum FROM SalesPeople WHERE City='Londra')
SELECT * FROM Comenzi WHERE SNum=(SELECT DISTINCT SNum FROM Comenzi WHERE CNum=2001)
SELECT * FROM Comenzi WHERE Amt>(SELECT AVG(Amt) FROM Comenzi WHERE Odate=10/04/1990)
SELECT * FROM Client WHERE CNum=(SELECT SNum+1000 FROM SalesPeople WHERE SNum='Serres')

2) Subinterogări aferente

În SQL, puteți crea subinterogări cu o referință de tabel dintr-o interogare exterioară. În acest caz, subinterogarea este executată de mai multe ori, o dată pentru fiecare rând de tabel din interogarea exterioară. Deci este important ca subinterogarea să folosească un index. Subinterogarea se poate referi la același tabel ca și cel exterior. Dacă interogarea exterioară returnează un număr relativ mic de rânduri, atunci subinterogarea asociată va funcționa mai rapid decât cea fără legătură. Dacă subinterogarea returnează un număr mic de rânduri, atunci interogarea asociată va rula mai lent decât cea fără legătură.

Exemple pentru subinterogări asociate:

SELECT * FROM SalesPeople Main WHERE 1(SELECT AVG(Amt) FROM Comenzi O2 WHERE O2.CNum=O1.CNum) // returnează toate comenzile mai mari decât valoarea medie a comenzii pentru acest client

3) EXISTĂ predicat

Forma de sintaxă: EXISTĂ ()

Predicatul ia subinterogarea ca argument și evaluează la adevărat dacă subinterogarea are o ieșire, în caz contrar evaluează la fals. Subinterogarea este executată o dată și poate conține mai multe coloane, deoarece valorile acestora nu sunt verificate, dar rezultatul prezenței rândurilor este pur și simplu fixat.

Note despre predicatul EXISTĂ:
. EXISTS este un predicat care returnează TRUE sau FALSE și poate fi folosit singur sau cu alte expresii booleene.
. EXISTS nu poate folosi funcții agregate în subinterogarea sa.
. În subinterogările corelate (relatate, dependente - Corelate), predicatul EXISTS este executat pentru fiecare rând al tabelului exterior.
. Puteți combina predicatul EXISTS cu îmbinări de tabel.

Exemple pentru predicatul EXISTS:

SELECT * FROM Client WHERE EXISTS(SELECT * FROM Client WHERE City='San Jose') - returnează toți clienții dacă vreunul dintre ei locuiește în San Jose.
SELECT DISTINCT SNum FROM Client First WHERE NU EXISTĂ (SELECT * FROM Customer Send WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) - Returnează numărul de vânzători care au servit un singur client.
SELECTARE DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Client S WHERE EXISTENT (SELECT * FROM Customer T WHERE S.SNum=T.SNum AND S.CNumT.CNum AND F.SNum=S.SNum) - returneaza numerele, numele și orașele de reședință ale tuturor vânzătorilor care au servit mai mulți cumpărători.
SELECT * FROM SalesPeople Frst WHERE EXISTIST (SELECT * FROM Customer Send WHERE Frst.SNum=Send.SNum AND 1

4) Predicate de comparație cantitativă

Forma de sintaxă: (=|>|=|) ORICE|TOȚI ()

Aceste predicate folosesc o subinterogare ca argument, totuși, în comparație cu predicatul EXISTS, ele sunt folosite împreună cu predicate relaționale (=,>=). În acest sens, ele sunt similare cu predicatul IN, dar se aplică doar subinterogărilor. Standardul permite utilizarea cuvântului cheie SOME în loc de ANY, dar nu toate SGBD-urile îl acceptă.

Note despre predicate de comparație:
. Predicatul ALL evaluează la TRUE dacă fiecare valoare selectată în timpul execuției subinterogării satisface condiția specificată în predicatul de interogare extern. Cel mai adesea este folosit cu inegalități.
. Predicatul ANY se evaluează la TRUE dacă cel puțin o valoare selectată în timpul execuției subinterogării satisface condiția specificată în predicatul interogare extern. Cel mai adesea este folosit cu inegalități.
. Dacă subinterogarea nu returnează rânduri, atunci ALL ia automat valoarea TRUE (se consideră că este îndeplinită condiția de comparare), iar pentru ANY - FALSE.
. Dacă comparația nu este TRUE pentru niciun rând și există unul sau mai multe rânduri nule, atunci ORICE returnează NECUNOSCUT.
. Dacă comparația nu este FALS pentru niciun rând și există unul sau mai multe rânduri nule, atunci ALL returnează NECUNOSCUT.

Exemple pentru predicatul de comparație cantitativă:

SELECT * FROM SalesPeople WHERE City=ANY(SELECT City FROM Client)
SELECTAȚI * FROM Comenzi WHERE Amt ALL(SELECTEȚI Evaluarea FROM Client WHERE Oraș='Roma')

5) Predicat de unicitate

UNIC | DISTINCT ()

Predicatul este folosit pentru a verifica unicitatea (absența duplicatelor) în ieșirea subinterogării. Mai mult, în predicatul UNIQUT, rândurile cu valori NULL sunt considerate unice, iar în predicatul DISTINCT, două valori nule sunt considerate egale între ele.

6) Predicatul de potrivire

MECI ()

Predicatul MATCH testează dacă valoarea unui șir de interogare se va potrivi cu valoarea oricărui șir returnat de la subinterogare. Această subinterogare diferă de predicatele IN și ANY prin aceea că vă permite să procesați potriviri „parțiale” (PARTIAL) care pot apărea printre rândurile care au o parte din valorile NULL.

7) Cereri in sectiunea FROM

De fapt, este acceptabil să folosiți o subinterogare oriunde este permisă o referință de tabel.

SELECT CName, Tot_Amt FROM Client, (SELECT CNum, SUM(Amt) AS Tot_Amt FROM Comenzi GROUP BY CNum) WHERE City='Londra' AND Customer.CNum=Comenzi.CNum
//subinterogare returnează cantitatea totală de comenzi plasate de fiecare cumpărător din Londra.

8) Interogări recursive

CU RECURSIV
Q1 AS SELECT … FROM … WHERE …
Q2 AS SELECT … FROM … WHERE …

În plus, puteți aplica EXISTĂ operator. Acest operator este adesea folosit cu subinterogări corelate pentru a testa dacă valoarea preluată de interogarea exterioară există în setul de rezultate preluat de interogarea internă. Dacă subinterogarea returnează cel puțin un rând, operatorul returnează TRUE . Dacă valoarea nu există, operatorul returnează FALSE . În consecință, folosind operatorul NOT EXISTS, se verifică dacă valoarea preluată de interogarea exterioară nu există în setul de rezultate preluat de interogarea interioară.

    Operatorul EXISTS verifică existența rândurilor în setul de rezultate al unei subinterogări.

    Dacă se găsește valoarea șirului de subinterogare:

    • căutarea nu continuă în interogarea interioară;

      condiția este marcată ca TRUE .

    Dacă valoarea șirului de subinterogare nu este găsită:

    • condiția este marcată ca FALS;

      căutarea continuă în interogarea interioară.

EXISTĂ operator

Toți operatorii logici lucrează cu instrucțiuni SELECT imbricate. Alternativ, puteți utiliza operatorul EXISTS. Acest operator este adesea folosit cu subinterogări corelate pentru a testa dacă valoarea preluată de interogarea exterioară există în setul de rezultate preluat de interogarea internă. Dacă subinterogarea returnează cel puțin un rând, operatorul returnează TRUE . Dacă valoarea nu există, operatorul returnează FALSE . În consecință, folosind operatorul NOT EXISTS, se verifică dacă valoarea preluată de interogarea exterioară nu există în setul de rezultate preluat de interogarea interioară.

Academia de Stat de Economie și Management din Novosibirsk

ATELIER DE LABORATOR PE DISCIPLINA

"BAZĂ DE DATE"

Lucrări de laborator N 7

„Limbajul bazei de date SQL: comenzi de manipulare a datelor»

NOVOSIBIRSK 2000

SQL este numele scurt pentru Structured Query Language. Din denumirea limbii reiese clar că scopul ei principal este de a genera cereri de informații din baza de date. Comenzile pentru selectarea datelor formează baza limbajului de manipulare a datelor DML - o parte integrantă a limbajului SQL. Cu toate acestea, DML constă în mai mult decât simple comenzi pentru a prelua date dintr-o bază de date. Există, de asemenea, comenzi pentru modificarea datelor, gestionarea datelor și altele.

Acest laborator acoperă elementele de bază ale limbajului DML. Vom respecta standardul SQL2 pe tot parcursul laboratorului.

Datorită faptului că SQL este un limbaj voluminos, vom lua în considerare doar comenzile principale. Diverse caracteristici specifice SQL sunt acoperite în laboratoarele ulterioare.

Pentru a efectua lucrări de laborator, trebuie să cunoașteți elementele de bază ale modelului de date relaționale, elementele de bază ale algebrei relaționale și calculului relațional și principiile de lucru cu MS SQL Server SGBD.

Ca rezultat al muncii de laborator, veți învăța cum să manipulați datele folosind comenzi SQL, luați în considerare dialectul limbajului implementat în SGBD-ul MS SQL Server.

INTRODUCERE

SQL conține o gamă largă de capabilități de manipulare a datelor, atât pentru crearea de interogări, cât și pentru actualizarea bazei de date. Aceste capabilități se bazează doar pe structura logică a bazei de date și nu pe structura fizică a acesteia, care este în concordanță cu cerințele modelului relațional.

Inițial, structura de sintaxă a SQL sa bazat (sau cel puțin părea să se bazeze) pe calculul relațional al lui Codd. Unirea a fost singura operație de algebră relațională acceptată.

În SQL2, pe lângă sintaxa similară de calcul relațional dezvoltată în standardul anterior, operațiile unire, intersecție, diferență și îmbinare sunt direct implementate. Operațiunile de selecție, proiecție și produs au fost (și continuă să fie) susținute aproape direct, în timp ce operațiunile de divizare și atribuire sunt susținute într-o formă mai greoaie.

Vom descrie mai întâi limbajul de interogare SQL și apoi operațiile sale de introducere și modificare a datelor. Operațiunile de modificare a datelor vor fi descrise în ultimul rând, deoarece structura lor se bazează într-o oarecare măsură pe structura limbajului de interogare.

Interogări simple

Pentru noi simpla cerere va exista o interogare care accesează doar un tabel al bazei de date. Interogările simple ne vor ajuta să ilustrăm structura de bază a SQL.

Cerere simplă. O interogare care accesează doar un tabel al bazei de date.

Anchetă: Cine lucrează ca tencuitori?

WHERE SKILL_TYPE = „Tencuitor”

Rezultat:

G. Rickover

Această interogare ilustrează cele trei cele mai comune fraze SQL: SELECT, FROM și WHERE. Deși le punem pe linii diferite în exemplul nostru, toate pot fi pe aceeași linie. Ele pot fi, de asemenea, indentate diferit, iar cuvintele din fraze pot fi separate printr-un număr arbitrar de spații. Luați în considerare caracteristicile fiecărei fraze.

Selectați. Clauza SELECT listează coloanele care ar trebui incluse în tabelul rezultat. Acestea sunt întotdeauna coloane ale unui tabel relațional. În exemplul nostru, tabelul rezultat este format dintr-o coloană (NUME), dar în general poate conține mai multe coloane; poate conține, de asemenea, valori sau constante calculate. Vom da exemple pentru fiecare dintre aceste opțiuni. Dacă tabelul rezultat ar trebui să conțină mai multe coloane, atunci toate coloanele necesare sunt listate după comanda SELECT, separate prin virgule. De exemplu, expresia SELECT WORKER_ID, NAME va avea ca rezultat un tabel format din coloanele WORKER_ID și NAME.

SELECT frază. Specifică coloanele tabelului rezultat.

Din. Clauza FROM specifică unul sau mai multe tabele care vor fi accesate de interogare. Toate coloanele enumerate în clauzele SELECT și WHERE trebuie să existe într-unul dintre tabelele enumerate în clauza FROM. În SQL2, aceste tabele pot fi definite direct în schemă ca tabele de bază sau vizualizări de date sau pot fi ele însele tabele fără nume rezultate din interogări SQL. În acest din urmă caz, interogarea este dată în mod explicit în comanda FROM.

Expresia FROM. Specifică tabelele existente la care se referă interogarea.

Unde. Clauza WHERE conține o condiție. pe baza cărora sunt selectate rândurile tabelului (tabelelor). În exemplul nostru, condiția este ca coloana SKILL_TYPE să conțină constanta „Plasterer” închisă în apostrofe, așa cum se face întotdeauna cu constantele text în SQL. Clauza WHERE este cea mai volatilă comandă SQL; poate conține multe condiții diferite. O mare parte din prezentarea noastră va fi dedicată ilustrării diferitelor constructe permise în clauza WHERE.

clauza WHERE. Specifică condiția pe baza cărora sunt selectate rândurile din tabelele specificate.

Interogarea SQL de mai sus este procesată de sistem în următoarea ordine: FROM, WHERE, SELECT. Adică, rândurile tabelului specificate în comanda FROM sunt plasate în zona de lucru pentru procesare. Clauza WHERE este apoi aplicată fiecărui rând în secvență. Toate rândurile care nu îndeplinesc clauza WHERE sunt excluse din considerare. Apoi acele rânduri care satisfac clauza WHERE sunt procesate de comanda SELECT. În exemplul nostru, NAME este selectat din fiecare astfel de rând și toate valorile selectate sunt afișate ca rezultate ale interogării.

Anchetă: Furnizați toate datele despre clădirile de birouri.

WHERE TYPE = „Birou”

Rezultat:

BLDG IDADDRESSTYPEQLTY LEVELSTATUS

str. Vyazov 312, 123 Birou 2 2

210 Berezovaya st. 1011 Office Z 1

111 Osinovaya st. 1213 Office 4 1

Un asterisc (*) într-o comandă SELECT înseamnă „întreaga linie”. Aceasta este o scurtătură la îndemână pe care o vom folosi des.

Anchetă: Care este salariul săptămânal al fiecărui electrician?

SELECTAȚI NUMELE, „Salariu săptămânal = ", 40 * HRLY_RATE

WHERE SKILL_TYPE = „Electrician”

Rezultat:

M. Faraday Salariu saptamanal = 500,00

H. Columb Salariu saptamanal = 620,00

Această interogare ilustrează utilizarea atât a constantelor de caractere (în exemplul nostru, „Salariul săptămânal = „), cât și a calculelor într-o comandă SELECT. În cadrul unei comenzi SELECT, puteți efectua calcule care folosesc coloane numerice și constante numerice, precum și operatori aritmetici standard (+, -, *, /), grupate după cum este necesar cu paranteze. Am inclus, de asemenea, o nouă comandă ORDER BY care sortează rezultatul interogării în ordine alfanumerică crescătoare după coloana specificată. Dacă doriți să sortați rezultatele în ordine descrescătoare, atunci trebuie să adăugați DESC la comandă. Clauza ORDER BY poate sorta rezultatele după mai multe coloane, unele în ordine crescătoare, altele în ordine descrescătoare. Coloana de sortare cheie primară este specificată mai întâi.

constantă de caractere. O constantă formată din litere, cifre și caractere „speciale”.

Anchetă: Cine are un tarif orar de la 10 la 12 USD?

UNDE HRLY_RATE >= 10 ȘI HRLY_RATE< - 12

Rezultat:

ID LUCRĂTOR NAME HRLY_RATE SKILL_TYPE SUPV_ID

Această interogare ilustrează unele dintre caracteristicile avansate ale comenzii WHERE: operatori de comparație și operația booleană AND. Cei șase operatori de comparație (=,<>(nu este egal),<, >, <=, >=). Operatorii booleeni AND (AND), OR (OR) și NOT (HE) pot fi utilizați pentru a crea condiții compuse sau pentru a anula o condiție. Parantezele pot fi folosite pentru a grupa condiții, așa cum este obișnuit în limbajele de programare.

Operatori de comparație =,<>, <, >, <=, >=.

Operații booleeneȘI (ȘI), SAU (SAU) și NU (EL) .

De asemenea, puteți utiliza operatorul BETWEEN (între) pentru a formula această interogare:

UNDE HRLY_RATE ÎNTRE 10 ȘI 12

BETWEEN poate fi folosit pentru a compara o anumită valoare cu alte două valori, prima dintre acestea fiind mai mică decât a doua, dacă valoarea comparată poate fi egală cu fiecare dintre valorile date sau cu orice valoare între ele.

Interogare: Listați tencuitori, acoperișori și electricieni.

WHERE SKILL_TYPE IN ("Tepcuitor", "Acoperiș", "Electrician")

Rezultat:

WORKER_ID NUME HRLY_RATE SKILL_TYPE SUPV_ID

1412 C. Nemo 13,75 Tencuitor 1520

2920 R. Garrett 10.00 Roofer 2920

1520 G. Rickover 11,75 Tencuitor 1520

Această interogare explică utilizarea operatorului de comparare IN (B). Condiția WHERE este adevărată dacă tipul de specialitate al rândului se află în setul între paranteze, adică dacă tipul de specialitate este tencuitor, acoperiș sau electrician. Vom vedea din nou operatorul IN în subinterogări.

Să presupunem că nu ne amintim exact ortografia specialității: „electrician” sau „inginer electronic” sau altceva. Caracterele wildcard care înlocuiesc șirurile de caractere nedefinite facilitează găsirea de ortografii inexacte într-o interogare.

Simboluri șablon. Caractere care înlocuiesc șiruri de caractere nedefinite.

Anchetă: Listați lucrătorii al căror tip de muncă începe cu Elek.

WHERE SKILL_TYPE LIKE ("Elek%)

Rezultat:

ID-UL LUCRĂTORULUI NUME HRLY_RATE SKILL_TYPE SUPV_ID

1235 M.Faraday 12.50 Electrician 1311

1311 H. Columb 15,50 Electrician 1311

Există două caractere wildcard în SQL: % (procent) și _ (subliniere). Literul de subliniere înlocuiește exact un caracter nedefinit. Procentul înlocuiește un număr arbitrar de caractere, începând de la zero. Când sunt folosite caractere joker, operatorul LIKE (like) este necesar pentru a compara variabilele caractere cu constante. Alte exemple:

NUME LIKE „__Columbus”

NUME LIKE „__K%”

Condiția din primul exemplu este adevărată dacă NUME este format din două caractere urmate de „Columbus”. În tabelul WORKER, toate numele încep cu o prima inițială și un punct. Astfel, cu această condiție, noi găsiți toți lucrătorii cu numele de familie „Columbus”. Condiția celui de-al doilea exemplu vă permite să găsiți toți angajații ale căror nume încep cu litera „K”.

Anchetă: Găsiți toate locurile de muncă care încep în următoarele două săptămâni.

UNDE START _DATA ÎNTRE CURRENT_DATE ȘI

Rezultat:(Să presupunem că data curentă este DATA CURENT = 10.10)

WORKER_ID BLDG_ID START_DATE NUM_ZILE

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Această interogare ilustrează utilizarea operatorului BETWEEN (între) cu valori de tip dată (data) și interval (interval). CURRENT_DATE este o funcție care returnează întotdeauna data de astăzi. Expresie

CURRENT_DATE + INTERVAL „14” ZI

adaugă un interval de două săptămâni la data curentă. Astfel, ASSIGNMENT este selectat (presupunând că astăzi este 10/10) dacă valoarea sa din coloana START_DATE este între 10/10 și 10/24. Acest lucru arată că putem adăuga valori de interval la câmpurile de date. În plus, putem înmulți valorile decalajului cu valori întregi. De exemplu, să presupunem că vrem să aflăm care va fi numărul de săptămâni într-un anumit număr de săptămâni (notat cu variabila NUM_WEEKS (NUMĂR DE SĂPTĂMÂNI)). O putem face astfel:

CURRENT_DATE + INTERVAL „7” ZI * NUM_WEEKS

2. Interogări cu mai multe tabele

Abilitatea de a lega elementele de date peste granițele aceluiași tabel este importantă în orice limbaj de bază de date. În algebra relațională, această funcție este realizată prin operația de îmbinare. Deși o mare parte din SQL se bazează direct pe calculul relațional, SQL leagă datele din tabele diferite în același mod în care o face operația de algebră relațională. Acum vom arăta cum se face acest lucru. Luați în considerare interogarea:

Anchetă:

Datele necesare pentru răspuns sunt în două tabele: LUCRĂTOR și MISSION. Soluția SQL necesită listarea ambelor tabele în clauza FROM și specificarea unui tip special de clauză WHERE:

SELECTAȚI SKILL_TYPE

DE LA MUNCITOR, MISSION

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID

ȘI BLDG_ID = 435

Ce se petrece aici? Trebuie să luăm în considerare două etape în procesarea unei cereri date de către sistem.

1. Ca de obicei, clauza FROM este procesată mai întâi. Totuși, în acest caz, deoarece în comandă sunt specificate două tabele, sistemul creează un produs cartezian al rândurilor acestor tabele. Aceasta înseamnă că se creează (logic) un singur tabel mare, format din coloanele ambelor tabele, în care fiecare rând al unui tabel este asociat cu fiecare rând al celuilalt tabel. În exemplul nostru, deoarece tabelul WORKER are cinci coloane și tabelul ASSIGNMENT are patru coloane, produsul cartezian generat de comanda FROM va avea nouă coloane. Numărul total de rânduri al produsului cartezian este m * n, unde m este numărul de rânduri din tabelul WORKER; iar n este numărul de rânduri din tabelul ASSIGNMENT. Deoarece sunt 7 rânduri în tabelul WORKER și 19 rânduri în tabelul ASSIGNMENT, produsul cartezian va conține 7x19 sau 133 de rânduri. Dacă în comanda FROM sunt listate mai mult de două tabele, atunci produsul cartezian al tuturor tabelelor specificate în comandă este creat.

produs cartezian. Rezultatul unirii fiecărui rând dintr-un tabel cu fiecare rând într-un alt tabel.

2. După crearea tabelului relațional gigant, sistemul aplică în continuare clauza WHERE ca înainte. Fiecare rând al tabelului creat de comanda FROM. este verificată cu condiția WHERE. Rândurile care nu îndeplinesc condiția sunt excluse din considerare. Clauza SELECT este apoi aplicată la rândurile rămase.

Clauza WHERE din interogarea noastră conține două condiții:

1. MUNCITOR. WORKER_ID = ASSIGNMENT.WORKER_ID

2.BLDG_ID = 435

Prima dintre aceste condiții este condiția de alăturare. Rețineți că, deoarece ambele tabele WORKER și ASSIGNMENT conțin o coloană numită WORKER_ID, produsul lor cartezian va conține două coloane cu acest nume. Pentru a distinge între ele, precedăm numele coloanei cu numele tabelului sursă, separând-o cu un punct.

Prima condiție înseamnă că în orice rând selectat, valoarea coloanei WORKER_ID din tabelul WORKER trebuie să se potrivească cu valoarea coloanei WORKER_ID din tabelul ASSIGNMENT. De fapt, unim două tabele prin WORKER_ID. Toate rândurile în care valorile acestor două coloane nu sunt egale sunt excluse din tabelul cu produse. Exact același lucru se întâmplă atunci când se efectuează operația de unire naturală a unei algebre relaționale. (Cu toate acestea, există încă o diferență față de o îmbinare naturală: SQL nu elimină automat coloana WORKER_ID suplimentară). Îmbinarea completă a acestor două tabele cu condiția suplimentară BLDG_ID = 435 este prezentată în fig. 1. Aplicarea comenzii SELECT va da în cele din urmă următorul rezultat al interogării:

TIP DE ABILITATE

Tencuitor

Acoperișor

Electrician

Orez. 1. Alăturarea tabelelor LUCRĂTOR și ATRIBUIRE

Acum vă vom arăta cum să asociați un tabel cu el însuși în SQL.

Anchetă: Listați angajații cu numele managerilor lor.

SELECTAȚI A.WORKER_NAME, B.WORKER_NAME

DE LA LUCRĂTORUL A, MUNCITORUL B

UNDE B.WORKER_ID = A.SUPV_ID

Clauza FROM din acest exemplu creează două „copii” ale tabelului WORKER, dându-le aliasurile A și B. Aliasul este un nume alternativ dat tabelului. Apoi, copiile A și B ale tabelului WORKER sunt conectate cu comanda WHERE cu condiția ca WORKER_ID în B și SUPV_ID în A să fie egale. Astfel, fiecare rând din A este alăturat rândului B care conține informații despre managerul de rând A (Fig. . 2).

Orez. 2. Unirea a două exemplare ale tabelului LUCRĂTOR

Selectând două nume de angajați din fiecare linie, obținem lista necesară:

A.NAMEB.NAME

M.Faraday H.Columbus

C.Nemo G.Rickover R.Garrett R.Garrett

P. Mason P. Mason G. Rickover G. Rickover H. Columbus H. Columbus J. Barrister P. Mason

Alias. Nume alternativ dat tabelului.

A.WORKER_NAME reprezintă un lucrător, iar B.WORKER_NAME reprezintă un manager. Vă rugăm să rețineți că unii lucrători sunt proprii manageri, ceea ce decurge din egalitatea WORKER_ID - SUPV_ID realizată în liniile lor.

În SQL, puteți lega mai mult de două tabele simultan:

Anchetă

SELECTAȚI WORKER_NAME

DE LA MUNCITOR, MESARE, CONSTRUIRE

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID ȘI ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID ȘI

TYPE = „Birou”

Rezultat:

M. Faraday

G. Rickover

J.Barrister

Rețineți că dacă un nume de coloană (de exemplu, WORKER_ID sau BLDG_ID) apare în mai multe tabele, atunci pentru a evita ambiguitatea, trebuie să precedăm numele coloanei cu numele tabelului sursă. Dar dacă numele coloanei apare într-un singur tabel, cum ar fi TYPE în exemplul nostru, atunci nu există nicio ambiguitate, astfel încât numele tabelului nu trebuie specificat.

Comenzile SQL din această interogare creează un tabel din trei tabele de baze de date relaționale. Primele două tabele sunt unite prin WORKER_ID, după care al treilea tabel este alăturat prin BLDG_ID tabelului rezultat. Condiție

TYPE = „Birou”

comanda WHERE are ca rezultat excluderea tuturor rândurilor, cu excepția rândurilor aferente clădirilor de birouri. Aceasta corespunde cerințelor cererii.

3. Subinterogări

Subinterogare. Solicitare în cadrul unei cereri

O subinterogare poate fi plasată în clauza WHERE a unei interogări, extinzând astfel capacitățile clauzei WHERE. Luați în considerare un exemplu.

Anchetă: Care sunt specialitățile muncitorilor încadrați în clădirea 435?

SELECTAȚI SKTLL_TYPE

FROM WORKER WHERE WORKER_ID IN

(SELECTARE WORKER_ID

UNDE BLDG_ID = 435)

Subinterogare în acest exemplu

(SELECTARE WORKER_ID

UNDE BLDG_ID = 435)

Se apelează o interogare care conține o subinterogare cerere externă sau cererea principală. Subinterogarea are ca rezultat următorul set de ID-uri de lucrător:

ID LUCRĂTOR

cerere externă. Interogarea principală, care conține toate subinterogările.

Acest set de ID-uri ia apoi locul unei subinterogări în interogarea exterioară. Din acest moment, interogarea exterioară este executată folosind setul creat de subinterogare. Interogarea exterioară procesează fiecare rând din tabelul WORKER conform clauzei WHERE. Dacă WORKER_ID al rândului se află în setul (IN) creat de subinterogare, atunci SKILL_TYPE al rândului este selectat și afișat în tabelul rezultat:

TIP DE ABILITATE

Tencuitor

Acoperișor

Electrician

Este foarte important ca clauza SELECT a subinterogării să conţină WORKER_ID şi numai WORKER_ID. În caz contrar, clauza WHERE a interogării externe, ceea ce înseamnă că WORKER_ID se află în setul de ID-uri de lucrător, nu ar avea sens.

Rețineți că subinterogarea se poate executa logic înainte ca interogarea principală să ia în considerare chiar și un singur rând. Într-un fel, interogarea secundară este independentă de interogarea principală. Poate fi executat ca o interogare completă. Spunem că o astfel de subinterogare nu este corelată cu interogarea principală. După cum vom vedea în curând, subinterogările pot fi corelate.

Subinterogare necorelată. O subinterogare a cărei valoare nu depinde de nicio interogare exterioară.

Iată un exemplu de subinterogare în interiorul unei subinterogări.

Anchetă: Listați lucrătorii desemnați în clădiri de birouri.

Din nou luăm în considerare interogarea cu care am aflat legătura.

SELECTAȚI LUCRĂTORUL_MAME

UNDE ÎN WORKER_ID

(SELECTARE WORKER_ID

UNDE ÎN BLDG_ID

WHERE TYPE = „Birou”))

Rezultat:

M. Faraday

G. Rickover

J.Barrister

Rețineți că nu trebuie să precedăm numele coloanelor oriunde cu numele tabelelor, deoarece fiecare subinterogare procesează unul și doar un tabel, deci nu poate exista ambiguitate.

Interogarea este executată în ordine din interior spre exterior. Adică, interogarea cea mai interioară (sau „cea mai de jos”) este executată mai întâi, apoi este executată subinterogarea care o conține și apoi interogarea exterioară.

Subinterogări corelate. Toate subinterogările discutate mai sus au fost independente de interogările principale în care au fost utilizate. Prin independență, înțelegem că subinterogările pot fi executate singure ca interogări complete. Ne întoarcem acum la o clasă de subinterogări ale căror rezultate pot depinde de rândul luat în considerare de interogarea principală. Astfel de subinterogări sunt numite subinterogări corelate.

Subinterogare corelată. O subinterogare al cărei rezultat depinde de rândul luat în considerare de interogarea principală.

Anchetă: Enumerați angajații ale căror tarife orare sunt mai mari decât cele ale managerilor lor.

SELECTAȚI WORKER_NAME

UNDE A.HRLY_RATE >

(SELECTARE B.HRLY_RATE

WHERE B.WORKER_ID = A.SUPV_ID)

Rezultat:

Pașii logici pentru executarea acestei interogări sunt:

1. Sistemul creează două copii ale tabelului LUCRĂTOR: copia A și copia B. După modul în care le-am definit, A se referă la muncitor, B la manager.

2. Sistemul se uită apoi la fiecare rând A. Acest rând este selectat dacă satisface clauza WHERE. Această condiție înseamnă că un rând va fi selectat dacă valoarea sa HRLY_RATE este mai mare decât HRLY_RATE generată de subinterogare.

3. Subinterogarea selectează o valoare HRLY_RATE din rândul B al cărei WORKER_ID este egal cu SUPV_ID al rândului A aflat în prezent în considerare de interogarea principală. Acesta este HRLY_RATE al managerului.

Rețineți că, deoarece A.HRLY_RATE poate fi comparat doar cu o singură valoare, subinterogarea trebuie să returneze o singură valoare. Această valoare variază în funcție de rândul A luat în considerare. Astfel, subinterogarea se corelează cu interogarea principală. Vom vedea mai multe exemple de subinterogări corelate mai târziu, când vom explora funcțiile încorporate.

operatori EXISTS și NOT EXISTS

Să presupunem că vrem să identificăm lucrătorii care nu sunt desemnați să lucreze la o clădire. La suprafață, se pare că o astfel de cerere poate fi făcută cu ușurință prin simpla negare a versiunii afirmative a cererii. Să presupunem, de exemplu, că suntem interesați de o clădire cu BLDG_ID 435. Luați în considerare interogarea:

SELECTAȚI WORKER_ID

UNDE BLDG_ID NU 435

Din păcate, aceasta este formularea greșită a soluției. Interogarea ne va oferi pur și simplu ID-urile lucrătorilor care lucrează la alte clădiri. Evident, unele dintre ele pot fi atribuite și clădirii 435.

Soluția bine formulată folosește operatorul NU EXISTĂ (nu există):

SELECTAȚI WORKER_ID

UNDE NU EXISTA

WHERE ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID AND

Rezultat:

WORKER_ID

Operatorii EXISTS și NOT EXISTS sunt întotdeauna plasați înaintea subinterogării. EXISTS evaluează ca adevărat dacă setul generat de subinterogare nu este gol. Dacă setul generat de subinterogare este gol, atunci EXISTS este fals. Operatorul NOT EXISTS, desigur, funcționează exact invers. Este adevărat dacă rezultatul subinterogării este gol, iar fals în caz contrar.

EXISTĂ operator. Returnează adevărat dacă setul de rezultate nu este gol.

operator NU EXISTĂ. Returnează adevărat dacă setul de rezultate este gol.

În acest exemplu, am folosit operatorul NOT EXISTS. Subinterogarea selectează toate acele rânduri din tabelul ASSIGNMENT în care WORKER_ID este același cu rândul considerat de interogarea principală și BLDG_ID este 435. Dacă acest set este gol, atunci rândul de lucru considerat de interogarea principală este selectat, deoarece aceasta înseamnă că acest muncitor nu lucrează la clădirea 435.

În soluția noastră, folosind o subinterogare corelată. Dacă folosim operatorul IN în loc de NOT EXISTS, ne putem descurca cu o subinterogare necorelată:

SELECTAȚI WORKER_ID

UNDE NU INTRODE WORKER_ID

(SELECTARE WORKER_ID

WHERE BLDG_ID = 435)

Această soluție este mai simplă decât soluția cu operatorul NU EXISTĂ. Se naște o întrebare firească de ce avem nevoie de EXISTĂ și NU EXISTĂ deloc. Răspunsul este că NU EXISTĂ este singura modalitate de a rezolva interogările care conțin cuvântul „fiecare” în condiție. Astfel de interogări sunt rezolvate în algebra relațională folosind operația de divizare, iar în calculul relațional - folosind cuantificatorul universal. Iată un exemplu de interogare care conține cuvântul „fiecare” în condiția:

Anchetă: Enumerați muncitorii desemnați pentru fiecare clădire.

Această întrebare poate fi implementată în SQL folosind dubla negație. Vom reformula interogarea pentru a include negativul dublu:

Anchetă: Enumerați angajații pentru care nu există o clădire căreia nu sunt alocate.

Am evidențiat dublu negativ. Este clar că această interogare este echivalentă logic cu cea anterioară.

Acum vrem să formulăm o soluție în SQL. Pentru a înțelege mai ușor soluția finală, vom da mai întâi o soluție unei probleme preliminare: problema identificării tuturor clădirilor pentru care ipoteticul lucrător, „1234” nu atribuit.

(I) SELECTAȚI BLDG_ID

UNDE NU EXISTA

ASSIGNMENT.WORKER_ID = 1234)

Am etichetat această interogare cu un (I), așa cum ne vom referi la ea mai târziu. Dacă nu există nicio clădire care să satisfacă această solicitare, atunci lucrătorul 1234 este repartizat fiecărei clădiri și, prin urmare, îndeplinește condițiile cererii inițiale. Pentru a rezolva interogarea originală, trebuie să generalizăm interogarea (I) de la un anumit lucrător 1234 la variabila WORKER_ID și să transformăm această interogare modificată într-o subinterogare a interogării mai mari. Iată o soluție:

(II) SELECTARE WORKER_ID

UNDE NU EXISTA

UNDE NU EXISTA

WHERE ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID AND

ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID)

Rezultat:

ID LUCRĂTOR

Rețineți că subinterogarea care începe la a patra linie de interogare (II) este identică cu interogarea (I) în care „1234” este înlocuit cu WORKER.WORKER_ID. Interogarea (II) poate fi citită după cum urmează:

Selectați WORKER_ID din WORKER dacă nu există nicio clădire căreia să nu fie atribuit WORKER_ID.

Aceasta corespunde condițiilor cererii inițiale.

Vedem că operatorul NOT EXISTS poate fi folosit pentru a formula acele interogări care au necesitat operația de împărțire în algebra relațională și cuantificatorul universal în calculul relațional. În ceea ce privește ușurința în utilizare, operatorul NOT EXISTS nu oferă niciun avantaj deosebit, adică interogările SQL care folosesc NOT EXISTS de două ori nu sunt mai ușor de înțeles decât soluțiile de algebră relațională cu operație de divizare sau soluțiile de calcul relațional cu cuantificator universal. Este nevoie de mai multe cercetări pentru a crea constructe de limbaj care să permită o modalitate mai naturală de a rezolva astfel de interogări.

Funcții încorporate

Luați în considerare aceste tipuri de întrebări:

Care sunt tarifele maxime și minime pe oră? Care este numărul mediu de zile în care angajații lucrează în clădirea 435? Care este numărul total de zile pentru lucrările de tencuială la Clădirea 312? Câte specialități diferite există?

Răspunsul la aceste întrebări necesită funcții agregate care privesc mai multe rânduri de tabel și produc o singură valoare. SQL are cinci astfel de funcții, numite funcții încorporate sau funcții set. Acestea sunt funcțiile SUM (suma), AVG (medie), COUNT (număr), MAX (maxim) și MIN (minim).

Funcție în linie (funcție de setare). Funcție statistică care operează pe mai multe rânduri: SUM (suma), AVG (medie), COUNT (număr), MAX (maxim), MIN (minim).

Anchetă: Care sunt tarifele maxime și minime pe oră?

SELECTAȚI MAX(HRLY_RATE), MIN(HRLY_RATE)

Rezultat: 17.40, 8.20

Funcțiile MAX și MIN operează pe o singură coloană a tabelului. Ei selectează valoarea maximă sau, respectiv, minimă din acea coloană. Formularea noastră de interogare nu conține o clauză WHERE. Pentru majoritatea solicitărilor, acesta poate să nu fie cazul, așa cum arată următorul exemplu.

Anchetă: Care este numărul mediu de zile în care angajații lucrează în clădirea 435?

SELECTAȚI AVG(NUM_DAYS)

WHERE BLDG_ID=435

Rezultat: 12.33

Anchetă: Care este numărul total de zile pentru lucrările de tencuială la Clădirea 312?

SELECTAȚI SUM(NUM_DAYS)

DIN MISSION, LUCRATOR

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID AND

SKILL_TYPE = „Tepcuitor” ȘI

Rezultat: 27

Soluția folosește o îmbinare între tabelele ASSIGNMENT și WORKER. Acest lucru este necesar deoarece SKILL_TYPE este în tabelul WORKER și BLDG_ID este în tabelul ASSIGNMENT.

Anchetă: Câte specialități diferite există?

SELECTAȚI NUMĂR (DISTINCT SKILL_TYPE)

Rezultat: 4

Deoarece aceeași specialitate poate fi repetată în mai multe rânduri diferite, cuvântul cheie DISTINCT (diferit) trebuie utilizat în această interogare pentru a împiedica sistemul să numere același tip de specialitate de mai multe ori. Operatorul DISTINCT poate fi folosit cu oricare dintre funcțiile încorporate, deși este, desigur, redundant cu funcțiile MAX și MIN.

DISTINCT. Un operator care exclude liniile duplicate.

Funcțiile SUM și AVG trebuie utilizate numai cu coloane numerice. Alte funcții pot fi utilizate atât cu date numerice, cât și cu caractere. Toate funcțiile, cu excepția COUNT, pot fi utilizate cu expresii calculate. De exemplu:

Anchetă: Care este salariul mediu pe săptămână?

SELECTAȚI AVG(40*HRLY_RATE)

Rezultat: 509.14

COUNT se poate referi la întregul rând, nu doar la o singură coloană :

Anchetă: Câte clădiri au nivelul de calitate 3?

SELECTARE NUMĂR (*)

DIN CĂLDIREA UNDE

Rezultat: 3

După cum arată toate aceste exemple, dacă există o funcție încorporată în comanda SELECT, atunci nimic altceva nu poate fi în această comandă SELECT. Singura excepție de la această regulă este cu clauza GROUP BY, pe care o vom analiza în curând.

GROUP BY și HAVING fraze

În management, sunt adesea necesare informații statistice despre fiecare grup dintr-o multitudine de grupuri. De exemplu, luați în considerare următoarea interogare:

Anchetă: Pentru fiecare manager, aflați tariful orar maxim în rândul subordonaților săi.

Pentru a rezolva această problemă, trebuie să împărțim lucrătorii în grupuri în funcție de managerii lor. Vom stabili apoi miza maximă în cadrul fiecărei grupe. În SQL se procedează astfel:

GROUP BY SUPV_ID

Rezultat:

SUPV_IDMAX(HRLY RATE)

La procesarea acestei interogări, sistemul împarte mai întâi rândurile tabelului WORKER în grupuri conform următoarei reguli. Rândurile sunt plasate în același grup dacă și numai dacă au același SUPV_ID. Clauza SELECT este apoi aplicată fiecărui grup. Deoarece există o singură valoare SUPV_ID în acest grup, nu există nicio ambiguitate SUPV_ID în grup. Pentru fiecare grup, instrucțiunea SELECT emite SUPV_ID și, de asemenea, calculează și emite valoarea MAX(HRLY_RATE). Rezultatul este prezentat mai sus.

Într-o instrucțiune SELECT cu funcții încorporate, pot apărea numai acele coloane care sunt incluse în clauza GROUP BY. Rețineți că SUPV_ID poate fi folosit în instrucțiunea SELECT deoarece este inclus în clauza GROUP BY.

Expresia GROUP BY. Indică faptul că rândurile trebuie împărțite în grupuri cu valori comune ale coloanelor specificate.

Clauza GROUP BY vă permite să efectuați anumite calcule complexe. De exemplu, este posibil să dorim să aflăm media acestor sume licitate maxime. Cu toate acestea, calculele cu funcții încorporate sunt restricționate în sensul că utilizarea funcțiilor încorporate în cadrul altor funcții încorporate nu este permisă. Deci o expresie ca

AVG(MAX(HRLY_RATE))

interzis. Implementarea unei astfel de solicitări va consta în două etape. Mai întâi trebuie să punem ofertele maxime într-un nou tabel, iar în al doilea pas să le calculăm media.

Cu comanda GROUP BY, puteți folosi comanda WHERE:

Anchetă: Pentru fiecare tip de clădire, aflați nivelul mediu de calitate între clădirile de statutul 1.

SELECTARE TIP, AVG(QLTY_LEVEL)

UNDE STARE = ​​1

Rezultat:

TYPEAVG(QLTY_LEVEL)

Magazin 1

Clădire de locuințe 3

Clauza WHERE este executată înaintea comenzii GROUP BY. Astfel, niciun grup nu poate conține un rând care are o stare diferită de 1. Rândurile de stare 1 sunt grupate după TIP, iar apoi se aplică o clauză SELECT fiecărui grup.

Expresia HAVING. Impune condiții grupurilor.

Putem aplica condiții și grupurilor create prin clauza GROUP BY. Acest lucru se face cu clauza HAVING. Să presupunem, de exemplu, că decidem să completăm una dintre interogările anterioare:

Anchetă: Pentru fiecare manager care are mai mult de un subordonat, aflați tariful maxim orar în rândul subordonaților săi.

Putem reflecta această condiție cu comanda HAVING corespunzătoare:

SELECTAȚI SUPV_ID, MAX(HRLY_RATE)

DIN GRUPUL DE LUCRĂTORI DIN SUPV_ID

AVÂND NUMĂRARE(*) > 1

Rezultat:

SUPV_ID MAX(HRLY_RATE)

Diferența dintre clauzele WHERE și HAVING este că WHERE se aplică rândurilor, în timp ce HAVING se aplică grupurilor.

O interogare poate conține atât o clauză WHERE, cât și o clauză HAVING. În acest caz, clauza WHERE este evaluată mai întâi, deoarece este evaluată înainte de grupare. De exemplu, luați în considerare următoarea modificare a interogării anterioare:

Anchetă: Pentru fiecare tip de clădire, aflați nivelul mediu de calitate între clădirile de statut 1. Luați în considerare doar acele tipuri de clădiri al căror nivel de calitate maxim nu depășește 3.

SELECTARE TIP, AVG(QLTY_JLEVEL)

UNDE STARE = ​​1

AVÂND MAX(QLTY_LEVEL)<= 3

Rezultat:

TYPEAVG(QLTY_LEVEL)

Magazin 1

Clădire de locuințe 3

Rețineți că, începând cu clauza FROM, frazele sunt executate în ordine, iar apoi se aplică clauza SELECT. De exemplu, clauza WHERE este aplicată tabelului BUILDING și toate rândurile în care STATUS nu este 1 sunt șterse. Rândurile rămase sunt grupate după TIP; toate rândurile cu aceeași valoare TYPE ajung în același grup. Acest lucru creează mai multe grupuri, câte unul pentru fiecare valoare TYPE. Clauza HAVING este apoi aplicată fiecărui grup, iar acele grupuri a căror valoare maximă a nivelului de calitate este mai mare de 3 sunt eliminate. În cele din urmă, clauza SELECT este aplicată grupurilor rămase.

7. Funcții și subinterogări încorporate

Funcțiile încorporate pot fi utilizate numai într-o clauză SELECT sau într-o instrucțiune HAVING. Cu toate acestea, o clauză SELECT care conține o funcție inline poate face parte dintr-o subinterogare. Luați în considerare un exemplu de astfel de subinterogare:

Anchetă: Care angajat are un tarif orar peste medie?

SELECTAȚI WORKER_NAME

UNDE HRLY_RATE >

(SELECTARE AVG(HRLY_RATE)

Rezultat:

H. Columb

Rețineți că interogarea secundară nu se corelează cu interogarea principală. Subinterogarea returnează exact o valoare - rata medie orară. Interogarea principală selectează un lucrător numai dacă oferta sa este mai mare decât media calculată.

Interogările corelate pot folosi și funcții încorporate:

Întrebare: Care dintre angajați are un tarif orar mai mare decât tariful orar mediu în rândul subordonaților aceluiași manager?

În acest caz, în loc să calculăm un tarif orar mediu pentru toți angajații, trebuie să calculăm tariful orar mediu pentru fiecare grup de angajați care raportează la același manager. Mai mult, calculul nostru trebuie făcut din nou pentru fiecare lucrător luat în considerare de interogarea principală:

SELECTAȚI A. WORKER_NAME

În acest tutorial, veți învăța cum să utilizați SQL stare EXISTĂ cu sintaxa si exemple.

Descriere

Clauza SQL EXISTS este utilizată împreună cu o subinterogare și este considerată satisfăcută dacă subinterogarea returnează cel puțin un rând. Poate fi folosit într-o instrucțiune SELECT, INSERT, UPDATE sau DELETE.

Sintaxă

Sintaxa pentru condiția EXISTS în SQL este:

Opțiuni sau Argumente

subinterogare subinterogare este o instrucțiune SELECT. Dacă subinterogarea returnează cel puțin o înregistrare în setul de rezultate, clauza EXISTS este evaluată la adevărat și condiția EXISTS va fi îndeplinită. Dacă subinterogarea nu returnează nicio înregistrare, clauza EXISTS este evaluată la fals și condiția EXISTS va eșua.

Notă

Instrucțiunile SQL care utilizează clauza EXISTS sunt foarte ineficiente deoarece subinterogarea este reluată pentru FIECARE rând din tabelul de interogări extern. Există modalități mai eficiente de a scrie majoritatea interogărilor care nu folosesc clauza EXISTS.

Exemplu - Utilizarea condiției EXISTS cu o instrucțiune SELECT

Să începem cu un exemplu care arată cum să folosiți condiția EXISTS cu o instrucțiune SELECT.

În acest exemplu, avem un tabel de clienți cu următoarele date:

Acum să găsim toate înregistrările din tabelul clienți unde există cel puțin o înregistrare în tabelul comenzi cu același customer_id . Rulați următoarea interogare SELECT:

Vor fi selectate 4 intrări. Iată rezultatele pe care ar trebui să le obțineți:

Număr de înregistrare client Nume numele de familie favorite_site
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
7000 Tom Croazieră oracle.com
8000 Johnny Depp NUL

În acest exemplu, există 4 înregistrări în tabelul clienți care au o valoare customer_id în tabelul comenzi.

Exemplu - Utilizarea condiției EXISTS cu o instrucțiune UPDATE

Să ne uităm la un exemplu care utilizează clauza EXISTS într-o instrucțiune UPDATE.
În acest exemplu, avem un tabel de produse cu următoarele date:

Acum să actualizăm tabelul summary_data cu valorile din tabelul de produse. Introduceți următoarea instrucțiune SQL:

PgSQL

5 intrări vor fi actualizate. Selectați din nou datele din tabelul summary_data:

PgSQL

SELECT * FROM sumar_date;

Acest exemplu va actualiza câmpul current_category din tabelul summary_data cu categorie_id din tabelul de produse în care se potrivesc valorile product_id. Primele 5 înregistrări din tabelul summary_data au fost actualizate.

prompt: Dacă nu am inclus clauza EXISTS, interogarea UPDATE ar actualiza câmpul current_category la NULL în rândul 6 al tabelului summary_data (deoarece tabelul de produse nu are o intrare unde product_id = 8).

Exemplu - Utilizarea condiției EXISTS cu o instrucțiune DELETE

Să ne uităm la un exemplu care utilizează condiția EXISTS într-o instrucțiune DELETE.

În acest exemplu, avem un tabel de clienți cu următoarele date:

Introduceți următoarea instrucțiune DELETE:

PgSQL

1 intrare va fi ștearsă. Selectați din nou datele din tabelul de comenzi:

PgSQL

SELECTAȚI * DIN comenzi;

SELECTAȚI *DIN comenzi;

Iată rezultatele pe care ar trebui să le obțineți.