(4 linia aleasă)
Interogarea exterior selectează numele tuturor autorilor. Cerere de nivelul următor este numerele de identificare ale scriitorilor, iar interogarea cel mai interior returnează numerele de identificare ale cărților PC1035, PC8888 si PC9999.
Această solicitare poate fi de asemenea exprimat folosind compusul:
selectați au_lname, au_fname
de la autori, titluri, titleauthor
unde authors.au_id = titleauthor.au_id
și titles.title_id = titleauthor.title_id
și tipul = „popular_comp“
Podzaprocy pot fi imbricate în situațiile de modificare (update), eliminați (șterge) și se introduce (insert) precum și în alegerea operatorului.
Notă: Realizați următoarele exemple schimba conținutul pUBS2 bazei de date. Contactați administratorul de sistem pentru a obține exemplarul original al bazei de date.
În următoarea interogare dublează prețul tuturor cărților publicate de New Age Books. Această declarație modifică titlurile de masă. Aceasta se referă la o masă de editori subinterogarea.
preț stabilit = preț * 2
în cazul în care în pub_id
în cazul în care PUB_NAME = "New Age Books")
modificări echivalente din situațiile anterioare, care utilizează un compus după cum urmează:
preț stabilit = preț * 2
din titluri, editori
unde titles.pub_id = publishers.pub_id
și PUB_NAME = "Books New Age"
toate înregistrările de vânzări de cărți, aveți posibilitatea să eliminați de afaceri cu următoarea declarație selectați imbricate:
în cazul în care în title_id
în cazul în care tipul = „afaceri“)
Echivalent cu eliminarea anterioară a operatorului, folosind aceeași conexiune, după cum urmează:
din salesdetail, titluri
unde salesdetail.title_id = titles.title_id
și tipul = „afaceri“
Subinterogarilor poate fi, de asemenea, utilizate în situațiile condiționale. interogare anterioară care elimină toate înregistrările de vânzări de cărți de afaceri, poate fi rescrisă după cum urmează, pentru a verifica existența unor astfel de înregistrări înainte de distrugere:
dacă există (selectați title_id
în cazul în care tipul = „afaceri“)
în cazul în care în title_id
Există două tipuri de bază subinterogarilor:
· Subinterogarilor precedat funcționare comparație nemodificată și care returnează o singură valoare, numite expresii podzaprosami- (subinterogări scalare).
· Subinterogarilor care returnează o listă de valori, și sunt precedate de cuvântul cheie în (aparține) sau operațiunea de comparație, cuantificatorii modificate orice (unele) sau toate (toate), precum și subinterogari, verificarea existenței folosind cuantificatori există (există) se numesc cuantificate subinterogările predicate .
Subinterogarilor oricare dintre aceste tipuri pot fi fie corelate (repetarea) sau necorelate.
· Subinterogare necorelate poate fi calculată ca o solicitare independentă. Cu alte cuvinte, rezultatele interogării secundare sunt substituite în declarația principală (sau interogarea exterioară). Acest lucru nu înseamnă. SQL-server este efectueaza exact operatorii cu subinterogări. subcereri Nekorrelyatsionnye poate fi înlocuit cu un compus și va fi realizată ca o conexiune SQL-server.
· Subinterogările nu poate fi corelat efectuată ca cereri independente, deoarece acestea pot avea acces la datele din coloanele tabelului sunt indicate în lista de la o solicitare externă. subinterogările corelați sunt discutate în detaliu mai târziu în acest capitol.
Următoarele secțiuni ale acestui capitol tratează diferitele tipuri de sub-interogări.
Expresia subinterogare este precedat de unul dintre operatori de comparație =. = <>,>,> =, <. <или <= и они имеют следующую общую форму:
[Pornind de selectare a operatorului, inserare, modificare, ștergere sau subquery]
în cazul în care clauza operatsiya_sravneniya (subinterogare)
[Sfârșitul de selecție a operatorului, insera, actualiza, șterge sau subinterogare]
Subinterogare operație comparație nemodificată precedentă, adică operațiune fără comparație Cuantificator oricare sau toate. trebuie să returneze o singură valoare. În caz contrar, SQL-Server generează un mesaj de eroare.
În mod ideal, pentru a utiliza un subinterogare cu un operator de comparare nemodificată, utilizatorul ar trebui să fie suficient de bine pentru a ști datele din tabele și să înțeleagă natura problemei, pentru a fi siguri că va da o interogarea secundară valoare unică.
De exemplu, să presupunem că fiecare editor este situat într-un singur oraș. Apoi, pentru a găsi scriitori care trăiesc în oraș este publicarea Algodata Infosystems, trebuie să executați instrucțiunea cu o subinterogare precedată de o comparație pentru egalitate:
selectați au_lname, au_fname
unde pub_name = "Infosystems Algodata")
Cuptorul cu microunde Gourmet
Dar este ușor de utilizat?
Secretele din Silicon Valley
Drept vorbi despre Calculatoare
Putem combate stresul calculator!
Securitate emoțională: un nou algoritm
Baza de date Ghid Ocupat Executivului
Cincizeci de ani în Palatul Buckingham Bucătăriile
Gătitul cu calculatoare: BILANȚURILE mascată
Calculatoare fobica și non-fobice Persoane fizice: Comportamentul Variații
Ceapă, praz și usturoi: Secretele de gătit din Marea Mediterană
(Liniile selectate 14)
Pentru fiecare carte aleasă în interogare exterioară, interogarea interioară returnează o listă a avansurilor plătite editorului New Age Books. În interogarea exterioară se stabilește dacă există în această listă, o valoare mai mică decât avansul plătit pentru cartea în cauză. Cu alte cuvinte, în acest exemplu, căutarea pentru cărți cu un avans mai mare decât cea mai mică avansul plătit de către editura New Age Books.
În cazul în care nu se întoarce interogarea secundară valori, întreaga interogare este considerată eronată.
= Orice înseamnă egală cu o anumită valoare
selectați au_lname, au_fname
în cazul în care orașul = orice
(Linia selectată 21)
Același rezultat poate fi obținut cu ajutorul unui cuantificator! = Toate. care este echivalentă cu condiția să nu în:
selectați au_lname, au_fname
în cazul în care orașul! = toate
Cu condiția în subinterogările
în cazul în care în pub_id
în cazul în care tipul = „afaceri“)
(linii selectate 2)
Această afirmație este evaluată în două etape. În prima etapă interogarea interior returnează o listă de numere de editori care imprimă cărți de afaceri, și anume numerele 1389 și 0736. Într-o a doua etapă, aceste valori sunt substituite în interogarea exterioară pentru a găsi numele editorilor din tabelul de editori. În această etapă, o cerere este după cum urmează:
în cazul în care în pub_id ( "1389", "0736")
O altă modalitate de a specifica această solicitare prin subinterogare, după cum urmează:
în cazul în care „de afaceri“, în
unde pub_id = publishers.pub_id)
Rețineți că expresia după cuvântul cheie în cazul în care, poate fi o constantă sau un nume de coloană. Puteți utiliza, de asemenea, alte tipuri de expresii în care există, de asemenea, constante și numele coloanelor:
selectați PUB_NAME distincte
de la editori, titluri
unde publishers.pub_id = titles.pub_id
și tipul = „afaceri“
Deoarece această cerere, iar cererea cu o subinterogare va găsi editorii care publică cărți de afaceri. Ambele sunt valabile și produc aceleași rezultate, cu excepția faptului că acesta din urmă folosește cuvântul distincte. pentru a evita repetițiile.
Cu toate acestea, un avantaj al cererii de racordare la solicitarea cu o subinterogare este că rezultatul poate fi plasat în datele din diferite tabele în acest caz. De exemplu, pentru a include rezultatele numelui de carte de afaceri, puteți utiliza următoarea interogare pe conexiune:
selectați PUB_NAME, din titlu
de la editori, titluri
unde publishers.pub_id = titles.pub_id
și tipul = „afaceri“
Algodata Infosystems Ocupat Executiv Ghidul Baza de date
Algodata Infosystems de gătit cu calculatoare: Foi de calcul Balanța mascată
New Age cărți pentru a combate stresul calculator!
Algodata Infosystems Straight Talk About Calculatoare
(4 linia aleasă)
selectați au_lname, au_fname
în cazul în care starea = „CA“
în cazul în care royaltyper <30
(Selectați 1 linie)
Rețineți că atât interogarea interior și exterior, este necesar să se utilizeze mai multe condiții, în cazul în care clauza.
Cu utilizarea declarației este compus după cum urmează:
selectați au_lname, au_fname
de la autori, titleauthor
în cazul în care starea = „CA“
și authors.au_id = titleauthor.au_id
și royaltyper <30
Compusul poate fi exprimat folosind întotdeauna o subinterogare. Subinterogare poate fi adesea exprimată ca compus.
Subinterogarilor cu condiția notin
Subinterogarilor care precede termenii cheie nu (nu) a reveni, de asemenea, o listă de zero sau mai multe valori. Această expresie înseamnă „și nu și nu și nu.“
Următoarea interogare găsește numele editorilor care nu publică cărți de afaceri, adică solicita o cerere de returnare discutată la începutul secțiunii anterioare.
selectați PUB_NAME de la editori
în cazul în care nu pub_id în
în cazul în care tipul = „afaceri“)
Binnet hardley
(Selectați 1 linie)
Cu subcereri proviso notin, cuprinzând NULL
Subinterogare nu precedat. returnează o listă de valori pentru fiecare linie a unei cereri externe. În cazul în care valoarea câmpului specificat în interogare exterioară nu este conținută în această listă, nu în fraza este interpretat ca fiind adevărată (TRUE) și interogarea exterioară pune înregistrarea în considerare lista rezultată.
Cu toate acestea, în cazul în care lista de valori returnate de cererea internă (subinterogare), nu conține această valoare, dar conține o NULL valoare nulă, nu în interpretat în mod logic nedeterminat (NECUNOSCUT) termenii, deoarece, în acest caz, este imposibil de precizie operedelit aparținând valoare specificată la lista returnată. În acest caz, cererea externă nu include luarea în considerare a liniei (înregistrare) la rezultatul interogării.
Să ilustrăm acest lucru cu următorul exemplu, folosind baza de date pUBS2:
în cazul în care nu 100.00 $ în
unde titles.pub_id = publishers.pub_id)
(linii selectate 2)
Pentru a înțelege performanța acestei interogare, ia în considerare ordinea numelui fiecărui editor. Fie ca rezultat al interogării secundare cel puțin un rând cu același nume? Cu alte cuvinte, dacă verificarea existenței adevărate (TRUE)?
Ca urmare a cererii anterioare pe al doilea loc de publicare specificat Algodata Inforsystems, care are un număr de identificare 1389. Există cel puțin un rând în tabelul de titluri. în care câmpul are o valoare de pub_id în 1389 și valoarea câmpului de tip „business“? Dacă este așa, atunci editura „Algodata Inforsystems“ ar trebui să ajungă la rezultatul. O astfel de verificare se efectuează pentru fiecare editor.
Subinterogare precedat de un cuantificator existențial există. Acesta este comparat cu alte subinterogările următoarele caracteristici:
· Înainte de a exista cuvinte cheie nu ar trebui să fie nume de coloane, constante sau alte expresii.
· Subinterogare cu un cuantificator existențial returnează TRUE sau FALSE, și nu returnează date dintr-un tabel.
· Lista de selecție a interogării secundare este de multe ori constă dintr-un singur asterisc (*). Nu este necesar să se precizeze numele coloanelor, din moment ce a efectuat o verificare a existenței de rânduri, care îndeplinesc condițiile specificate în interogarea secundară. Și puteți specifica în mod explicit lista de selecție, în conformitate cu normele obișnuite.
Existentele Cuvântul cheie este foarte important, deoarece de multe ori nu există nici o modalitate alternativă de a selecta date fără a utiliza un subinterogare. Subinterogarilor care sunt precedate de un cuantificator există sunt identice întotdeauna corelate subinterogări (vezi. „Utilizarea subinterogări la acesta).
După cum sa menționat deja, o parte din cererile de cuantificatorul existențial nu poate fi exprimat în orice alt mod, dar toate cererile cu conditia sau cu un operator de comparare, completate de un cuantificator toate sau orice. poate fi exprimat folosind există o subinterogare. Următoarele sunt câteva exemple de operatori și echivalente cuantificată Exista si reformulare alternative.
selectați au_lname, au_fname
selectați au_lname, au_fname
Găsirea intersecție, și diferența de seturi, prin intermediul există
Subinterogarilor precedat cuantificatorii există și nu există. Acesta poate fi utilizat pentru a efectua două operații pe seturi: intersecție și diferență. Intersecția a două seturi constă din elementele care aparțin ambelor seturi. Diferența constă în elementele care aparțin numai primul set.
selectați oraș distinct
unde authors.city = publishers.city)
(Selectați 1 linie)
selectați oraș distinct
în cazul în care nu există
unde authors.city = publishers.city)
del Castillo Innes
(rândurile selectate 9)
Spre deosebire de exemplele discutate mai sus subinterogare în acest caz, să fie calculat independent de interogare principal. Acesta utilizează authors.au_id valoare. care este variabilă și depinde de linia care SQL Server consideră tabelul de autori.
Să luăm în considerare modul în care să se calculeze o solicitare anterioară. Primul Transact-SQL scanează fiecare rând din tabelul de autori și pentru a afla care dintre ele ar trebui să fie incluse în rezultatele, trimite valoarea corespunzătoare în sub-cererea internă. De exemplu, să presupunem că Transact-SQL scanează șir Cheryl Carson corespunzătoare. identificatorul (authors.au_id) este „238-95-7766“, astfel încât această valoare este substituită în cererea internă:
unde au_id = "238-95-7766"
Rezultatul este numărul 100, cu toate acestea, în acest caz, interogarea exterioară va arăta după cum urmează:
selectați au_lname, au_fname
100 unde în (100)
Cu Corelat subinterogare pot găsi tipurile de cărți care sunt publicate de mai multe edituri:
selectați t1.type distincte