Ligzdoti vaicājumi. Piemēri

  • Tulkošana
  • Apmācība
Vai jums ir nepieciešams “SELECT * WHERE a=b FROM c” vai “SELECT WHERE a=b FROM c ON *”?

Ja esat tāds pats kā es, jūs piekrītat: SQL ir viena no tām lietām, kas sākotnēji šķiet vienkārša (lasāma kā angļu valoda!), bet kaut kā jums ir jāmeklē Google katrs vienkāršais vaicājums, lai atrastu pareizo sintaksi.


Un tad sākas pievienošanās, apkopošana, apakšvaicājumi, un izrādās, ka tā ir pilnīga muļķība. Kaut kas tamlīdzīgs:


ATLASĪT dalībniekus.vārds || " " || members.lastname AS "Pilns vārds" NO aizņēmumiem IEKŠĒJS JOIN dalībnieki ON members.memberid=borrowings.memberid IEKŠĒJS JOIN grāmatas ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stock>(SELECT avg(stock) ) NO grāmatām)) GROUP BY dalībnieki.vārds, biedri.uzvārds;

Bue! Tas atbaidīs jebkuru iesācēju vai pat vidēja līmeņa izstrādātāju, ja viņš pirmo reizi redz SQL. Bet tas viss nav tik slikti.


Ir viegli atcerēties, kas ir intuitīvs, un ar šo ceļvedi es ceru pazemināt barjeru iesācējiem iekļūšanai SQL un piedāvāt tiem, kas jau ir pieredzējuši, jaunu veidu, kā aplūkot SQL.


Lai gan SQL sintakse dažādās datu bāzēs ir gandrīz vienāda, šajā rakstā vaicājumiem tiek izmantots PostgreSQL. Daži piemēri darbosies MySQL un citās datu bāzēs.

1. Trīs burvju vārdi

SQL ir daudz atslēgvārdu, bet SELECT, FROM un WHERE ir gandrīz katrā vaicājumā. Nedaudz vēlāk jūs sapratīsit, ka šie trīs vārdi ir vissvarīgākie datu bāzes vaicājumu veidošanas aspekti, bet citi, sarežģītāki vaicājumi ir tikai papildinājumi tiem.

2. Mūsu bāze

Apskatīsim datubāzi, kuru izmantosim kā piemēru šajā rakstā:







Mums ir grāmatu bibliotēka un cilvēki. Ir arī speciāla tabula izdoto grāmatu ierakstīšanai.

  • Tabulā "Grāmatas" tiek glabāta informācija par grāmatas nosaukumu, autoru, izdošanas datumu un pieejamību. Tas ir vienkārši.
  • Tabulā “Dalībnieki” - visu bibliotēkā reģistrējušos cilvēku vārdi un uzvārdi.
  • Tabulā “Aizņēmumi” tiek glabāta informācija par bibliotēkā paņemtajām grāmatām. Grāmatvedības sleja attiecas uz tabulā “grāmatas” uzņemtās grāmatas ID, bet sleja “Biedru identifikators” attiecas uz atbilstošo personu no tabulas “Dalībnieki”. Mums ir arī izdošanas datums un datums, kad grāmata ir jāatdod.

3. Vienkāršs pieprasījums

Sāksim ar vienkāršu pieprasījumu: mums vajag vārdus Un identifikatori(id) no visām grāmatām, kuras sarakstījis autors “Dan Brown”


Pieprasījums būs šāds:


SELECT bookid AS "id", nosaukums FROM books WHERE autors = Dens Brauns;

Un rezultāts ir šāds:


id virsraksts
2 Pazudušais simbols
4 Inferno

Pavisam vienkārši. Apskatīsim pieprasījumu, lai saprastu, kas notiek.

3.1 FROM — no kurienes mēs iegūstam datus

Šobrīd tas var šķist pašsaprotami, taču FROM būs ļoti svarīgi vēlāk, kad nonāksim pie pievienošanās un apakšvaicājumiem.


FROM punkti uz tabulu, lai vaicātu. Tā var būt esoša tabula (kā iepriekš minētajā piemērā) vai tabula, kas izveidota lidojuma laikā, izmantojot savienojumus vai apakšvaicājumus.

3.2 KUR - kādi dati tiek parādīti

WHERE vienkārši uzvedas kā filtrs līnijas, kuru mēs vēlamies izvadīt. Mūsu gadījumā mēs vēlamies redzēt tikai rindas, kurās autora kolonnas vērtība ir “Dan Brown”.

3.3 SELECT - kā parādīt datus

Tagad, kad mums ir visas vajadzīgās tabulas kolonnas, mums ir jāizlemj, kā tieši parādīt šos datus. Mūsu gadījumā mums ir nepieciešami tikai grāmatu nosaukumi un ID, tāpēc mēs to darām. izvēlamies izmantojot SELECT. Tajā pašā laikā kolonnu var pārdēvēt, izmantojot AS.


Visu vaicājumu var vizualizēt, izmantojot vienkāršu diagrammu:


4. Savienojumi (savienojumi)

Tagad mēs vēlamies redzēt visu to Dena Brauna grāmatu nosaukumus (ne vienmēr unikālos), kuras ir izņemtas no bibliotēkas, un to, kad šīs grāmatas ir jāatdod:


SELECT books.title AS "Nosaukums", borrowings.returndate AS "Atgriešanas datums" NO aizņēmumiem PIEVIENOTIES grāmatām ON borrowings.bookid=books.bookid WHERE books.author="Dan Brown";

Rezultāts:


Nosaukums Atgriešanās datums
Pazudušais simbols 2016-03-23 00:00:00
Inferno 2016-04-13 00:00:00
Pazudušais simbols 2016-04-19 00:00:00

Lielākoties pieprasījums ir līdzīgs iepriekšējam izņemot NO sadaļām. Tas nozīmē, ka mēs pieprasām datus no citas tabulas. Mēs nepiekļūstam ne “grāmatu” tabulai, ne “aizņēmumu” tabulai. Tā vietā mēs vēršamies pie jauns galds, kas tika izveidots, savienojot šīs divas tabulas.


aizņēmumi JOIN books ON aizguvumi.bookid=books.bookid — uzskatiet šo par jaunu tabulu, kas tika izveidota, apvienojot visus ierakstus no tabulām "grāmatas" un "aizņēmumi", kurās bookid vērtības ir vienādas. Šādas apvienošanas rezultāts būs:



Un tad mēs vaicājam šo tabulu tādā pašā veidā kā iepriekš minētajā piemērā. Tas nozīmē, ka, savienojot galdus, jums tikai jāuztraucas par to, kā izveidot savienojumu. Un tad pieprasījums kļūst tikpat skaidrs kā “vienkāršā pieprasījuma” gadījumā no 3. punkta.


Izmēģināsim nedaudz sarežģītāku savienojumu ar divām tabulām.


Tagad mēs vēlamies uzzināt to cilvēku vārdus un uzvārdus, kuri no bibliotēkas paņēma autora “Dena Brauna” grāmatas.


Šoreiz ejam no apakšas uz augšu:


1. darbība- kur mēs iegūstam datus? Lai iegūtu vajadzīgo rezultātu, jāsavieno tabulas “biedrs” un “grāmatas” ar tabulu “aizņēmumi”. Sadaļa JOIN izskatīsies šādi:


aizņēmumi PIEVIENOTIES grāmatām ON borrowings.bookid=books.bookid PIEVIENOTIES biedriem ON members.memberid=borrowings.memberid

Savienojuma rezultātu var redzēt saitē.


2. darbība- kādus datus mēs rādām? Mūs interesē tikai dati, kur grāmatas autors ir “Dens Brauns”


KUR books.author="Den Brown"

3. darbība- kā mēs parādām datus? Tagad, kad dati ir saņemti, jums tikai jāparāda to personu vārdi, kuri paņēma grāmatas:


ATLASĪT dalībniekus.vārds AS "Vārds", dalībnieki.uzvārds AS "Uzvārds"

Super! Atliek tikai apvienot trīs komponentus un iesniegt mums nepieciešamo pieprasījumu:


ATLASĪT biedrus.vārds AS "Vārds", biedri.uzvārds AS "Uzvārds" NO aizņēmumiem PIEVIENOTIES grāmatām ON aizņēmumiem.bookid=books.bookid PIEVIENOTIES biedriem ON members.memberid=borrowings.memberid WHERE books.author="Dan Brown";

Ko mums dos:


Vārds Uzvārds
Maiks Viliss
Elena Hortons
Elena Hortons

Lieliski! Bet nosaukumi atkārtojas (tie nav unikāli). Mēs to drīz izlabosim.

5. Apkopošana

Rupji runajot, Apkopojumi ir nepieciešami, lai pārvērstu vairākas rindas vienā. Tajā pašā laikā apkopošanas laikā dažādām kolonnām tiek izmantota atšķirīga loģika.


Turpināsim ar mūsu piemēru, kur parādās dublēti nosaukumi. Ir skaidrs, ka Elena Hortone paņēma vairāk nekā vienu grāmatu, taču tas nav labākais veids, kā parādīt šo informāciju. Varat iesniegt citu pieprasījumu:


IZVĒLĒTIES biedri.vārds AS "Vārds", biedri.uzvārds AS "Uzvārds", skaits(*) AS "Aizņemto grāmatu skaits" NO aizņēmumiem JOIN grāmatas ON aizņēmumi.bookid=books.bookid PIEVIENOTIES biedriem ON dalībnieki.memberid=aizņemumi .memberid WHERE grāmatas.author="Dan Brown" GROUP BY dalībnieki.vārds, dalībnieki.uzvārds;

Kas dos mums vēlamo rezultātu:


Vārds Uzvārds Aizņemto grāmatu skaits
Maiks Viliss 1
Elena Hortons 2

Gandrīz visos apkopojumos ir klauzula GROUP BY. Šī lieta pārvērš tabulu, ko var izgūt ar vaicājumu, tabulu grupās. Katra grupa atbilst unikālajai kolonnas vērtībai (vai vērtību grupai), ko norādījām GROUP BY . Mūsu piemērā mēs pārvēršam iepriekšējā uzdevuma rezultātu rindu grupā. Mēs veicam arī apkopošanu ar count , kas vairākas rindas pārvērš veselā skaitļā (mūsu gadījumā rindu skaitā). Pēc tam šī nozīme tiek piešķirta katrai grupai.


Katra rezultāta rinda atspoguļo katras grupas apkopojuma rezultātu.



Var nonākt pie loģiska secinājuma, ka visi rezultāta lauki ir vai nu jānorāda GROUP BY , vai arī jāveic agregācija. Tā kā visi pārējie lauki var atšķirties viens no otra dažādās rindās, un, ja tos atlasāt ar SELECT, nav skaidrs, kura no iespējamām vērtībām būtu jāņem.


Iepriekš minētajā piemērā skaitīšanas funkcija apstrādāja visas rindas (jo mēs skaitījām rindu skaitu). Citas funkcijas, piemēram, summa vai max, apstrādā tikai norādītās rindas. Piemēram, ja mēs vēlamies uzzināt katra autora sarakstīto grāmatu skaitu, mums ir nepieciešams šāds vaicājums:


SELECT autors, summa(krājums) FROM grāmatas GROUP BY autors;

Rezultāts:


autors summa
Robins Šarma 4
Dens Brauns 6
Džons Grīns 3
Amish Tripathi 2

Šeit summas funkcija apstrādā tikai krājumu kolonnu un aprēķina visu vērtību summu katrā grupā.

6. Apakšvaicājumi


Apakšvaicājumi ir parasti SQL vaicājumi, kas iegulti lielākos vaicājumos. Tie ir sadalīti trīs veidos atkarībā no atgrieztā rezultāta veida.

6.1 Divdimensiju tabula

Ir vaicājumi, kas atgriež vairākas kolonnas. Labs piemērs ir vaicājums no iepriekšējā apkopošanas uzdevuma. Tā kā tas ir apakšvaicājums, tas vienkārši atgriezīs citu tabulu, kurā var veikt jaunus vaicājumus. Turpinot iepriekšējo uzdevumu, ja vēlamies noskaidrot autora “Robina Šarma” sarakstīto grāmatu skaitu, tad viens no iespējamajiem veidiem ir izmantot apakšvaicājumus:


SELECT * FROM (SELECT autors, summa( krājums) FROM grāmatas GROUP BY author) AS rezultāti WHERE author="Robin Sharma";

Rezultāts:



Var rakstīt kā: ["Robins Šarma", "Dens Brauns"]


2. Tagad mēs izmantojam šo rezultātu jaunā vaicājumā:


SELECT virsraksts, bookid FROM books WHERE autors IN (SELECT autors FROM (SELECT autors, summa( krājums) FROM books GROUP BY author) AS rezultāti WHERE summa > 3);

Rezultāts:


virsraksts bookid
Pazudušais simbols 2
Kurš raudās, kad tu mirsi? 3
Inferno 4

Tas ir tāds pats kā:


IZVĒLĒTIES virsrakstu, grāmatiņu FROM books WHERE autors ("Robin Sharma", "Dan Brown");

6.3. Individuālās vērtības

Ir vaicājumi, kuru rezultāts ir tikai viena rinda un viena kolonna. Tās var uzskatīt par nemainīgām vērtībām, un tās var izmantot visur, kur tiek izmantotas vērtības, piemēram, salīdzināšanas operatoros. Tos var izmantot arī kā divdimensiju tabulas vai viena elementa masīvus.


Iegūsim, piemēram, informāciju par visām grāmatām, kuru skaits bibliotēkā pārsniedz pašreizējo vidējo.


Vidējo daudzumu var iegūt šādi:


atlasīt avg(stock) no grāmatām;

Ko mums dod:


7. Rakstīt operācijas

Lielākā daļa datu bāzes rakstīšanas operāciju ir diezgan vienkāršas, salīdzinot ar sarežģītākām lasīšanas darbībām.

7.1 Atjauninājums

UPDATE pieprasījuma sintakse semantiski ir tāda pati kā lasīšanas pieprasījumam. Vienīgā atšķirība ir tā, ka tā vietā, lai atlasītu kolonnas ar SELECT, mēs iestatām zināšanas ar SET.


Ja visas Dena Brauna grāmatas ir pazaudētas, jums ir jāatiestata daudzuma vērtība. Vaicājums par to būtu šāds:


UPDATE grāmatas SET stock=0 WHERE autors = Dens Brauns;

WHERE dara to pašu, ko iepriekš: atlasa rindas. SELECT vietā, ko izmantojām lasīšanas laikā, tagad mēs izmantojam SET. Taču tagad atlasītajās rindās ir jānorāda ne tikai kolonnas nosaukums, bet arī jauna šīs kolonnas vērtība.


7.2 Dzēst

DELETE vaicājums ir vienkārši SELECT vai UPDATE vaicājums bez kolonnu nosaukumiem. Nopietni. Tāpat kā SELECT un UPDATE, bloks WHERE paliek nemainīgs: tas atlasa dzēšamās rindas. Dzēšanas darbība iznīcina visu rindu, tāpēc nav jēgas norādīt atsevišķas kolonnas. Tātad, ja mēs nolemjam neatiestatīt Dena Brauna grāmatu skaitu, bet dzēst visus ierakstus pavisam, mēs varam iesniegt šādu pieprasījumu:


dzēst no grāmatām WHERE autors = Dens Brauns;

7.3. Ievietot

Varbūt vienīgais, kas atšķiras no cita veida vaicājumiem, ir INSERT. Formāts ir:


INSERT INTO x (a,b,c) VALUES (x, y, z);

Kur a , b , c ir kolonnu nosaukumi un x , y un z ir vērtības, kas jāievieto šajās kolonnās tādā pašā secībā. Tas būtībā arī viss.


Apskatīsim konkrētu piemēru. Šeit ir INSERT vaicājums, kas aizpilda visu "grāmatu" tabulu:


INSERT INTO grāmatas (grāmatas nosaukums, nosaukums, autors, publicēts, krājums) VĒRTĪBAS (1 "Scion of Ikshvaku", "Amish Tripathi","06-22-2015",2), (2 "The Lost Symbol"," Dens Brauns","07-22-2010",3), (3"Who Will Cry When You Die?","Robin Sharma","06-15-2006",4), (4"Inferno" "Dens Brauns","05-05-2014",3), (5 "The Fault in our Stars","Džons Grīns","01-03-2015",3);

8. Pārbaudiet

Esam nonākuši pie beigām, es ierosinu veikt nelielu pārbaudi. Apskatiet šo pieprasījumu pašā raksta sākumā. Vai varat to izdomāt? Mēģiniet to sadalīt sadaļās SELECT , FROM , WHERE , GROUP BY un apskatiet atsevišķus apakšvaicājumu komponentus.


Šeit tas ir lasāmākā formā:


ATLASĪT dalībniekus.vārds || " " || Members.lastname AS "Pilns vārds" NO aizņēmumiem IEKŠĒJS JOIN dalībnieki ON members.memberid=borrowings.memberid IEKŠĒJS JOIN grāmatas ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stock> (SELECT avg(stock) ) NO grāmatām)) GROUP BY dalībnieki.vārds, biedri.uzvārds;

Šis vaicājums atgriež sarakstu ar cilvēkiem, kuri ir izņēmuši grāmatu no bibliotēkas, kuru kopējais skaits pārsniedz vidējo.


Rezultāts:


Pilnais vārds
Lida Tailere

Es ceru, ka jums izdevās to izdomāt bez problēmām. Bet, ja nē, es priecāšos par jūsu komentāriem un atsauksmēm, lai es varētu uzlabot šo ziņu.

Birkas: pievienojiet atzīmes

Lekcijā tiek apspriesta apakšvaicājumu uzbūve un izmantošana datu izguves un maiņas laikā.

Apakšvaicājumi

SQL ļauj citiem DML priekšrakstiem izmantot apakšvaicājumus, kas ir iekšējie vaicājumi, ko definē priekšraksts SELECT.

Apakšvaicājums ir ļoti spēcīgs SQL valodas līdzeklis. Tas ļauj izveidot sarežģītas vaicājumu hierarhijas, kas tiek izpildītas atkārtoti rezultātu kopas veidošanas vai viena no datu modifikācijas operatoru izpildes procesā ( DZĒST, IEVIETOT, ATJAUNINĀT).

Parasti apakšvaicājumus dažreiz iedala trīs veidos, no kuriem katrs ir iepriekšējā sašaurinājums:

  • tabulas apakšvaicājums, atgriežot rindu un kolonnu kopu;
  • rindas apakšvaicājums, kas atgriež tikai vienu rindu, bet, iespējams, vairākas kolonnas (šādus apakšvaicājumus bieži izmanto iegultajā SQL);
  • skalārais apakšvaicājums, atgriežot vienas kolonnas vērtību vienā rindā.

Apakšvaicājums ļauj atrisināt šādus uzdevumus:

  • definējiet tabulai pievienoto rindu kopu katrai paziņojuma izpildei IEVIETOT;
  • nosaka CREATE VIEW izveidotajā skatā iekļautos datus;
  • definējiet operatora modificētās vērtības ATJAUNINĀT;
  • norādiet vienu vai vairākas vērtības priekšraksta SELECT klauzulās WHERE un HAVING;
  • definēt tabulu klauzulā FROM kā apakšvaicājuma izpildes rezultātu;
  • pieteikties saistītie apakšvaicājumi. Apakšvaicājums tiek uzskatīts par korelētu, ja predikātā ietvertajam vaicājumam ir atsauce uz vērtību no tabulas (ārēja vaicājumam), ko pārbauda predikāts.

Dažas DBVS (piemēram, Oracle DBVS) ļauj izveidot jaunas tabulas, pamatojoties uz apakšvaicājumu, izmantojot priekšrakstu CREATE TABLE.

Vienkāršs apakšvaicājuma izmantošanas piemērs ir šāds paziņojums:

Šajā paziņojumā apakšvaicājumam vienmēr ir jāatgriež viena vērtība, kas tiks pārbaudīta predikātā. Ja apakšvaicājums atgriež vairāk nekā vienu vērtību, DBVS parādīs kļūdas ziņojumu par SQL priekšraksta izpildi.

Ja apakšvaicājumā nav atlasīta neviena rinda, predikāts būs vienāds ar NEZINĀMS , ko lielākā daļa DBVS interpretē kā FALSE .

Standarts definē predikāta ierakstu formā "vērtības operatora apakšvaicājums". Tomēr dažas DBVS ļauj arī rakstīt predikātu, norādot apakšvaicājumu pa kreisi no salīdzināšanas operatora.

Piemēram:

Ļoti bieži ar apakšvaicājumiem tiek izmantotas apkopošanas funkcijas, kas nodrošina iespēju formulēt nosacījumu, piemēram, “lielāks par grupas vidējo vērtību”.

Piemēram:

Ja apakšvaicājuma rezultāts ir rindu grupa (tas notiek vienmēr, ja nosacījums negarantē iekšējā vaicājuma vērtības unikalitāti, ko pārbauda predikāts), tad jāizmanto operators IN, kas atlasa vienu vērtību no norādītais komplekts.

Piemēram:

Šajā gadījumā predikāts tiek novērtēts kā TRUE, ja vismaz viena no apakšvaicājumā atgrieztajām vērtībām atbilst nosacījumam.

Tomēr IN operatora izmantošanai ir arī daži semantiski trūkumi: vaicājumā nav skaidri noteikts, cik rindu vajadzētu būt vaicājuma rezultātam. Veidojot attiecības reālam datu modelim, tas var radīt neskaidrības un atkarību no pašiem datiem. Pretējā gadījumā, ja datu modelis pieņem tikai vienas rindas klātbūtni kā nemainīgu apakšvaicājuma rezultātu un attiecīgi izmanto salīdzināšanas operatoru =, un datu struktūra ļauj ievadīt vērtības, ja apakšvaicājuma rezultāts būs vairāk nekā viens rindu, tad, izmantojot šādu SQL operatoru Kādā brīdī var parādīties kļūda.

Ja vaicājums ietver vairāk nekā divas tabulas, lielākas skaidrības labad lauku nosaukumi dažkārt tiek kvalificēti ar tabulu nosaukumiem, norādot tos ar punktu. Standarts ļauj nekvalificēt lauka nosaukumu ar tabulas nosaukumu, ja nav neskaidrību (lauks vispirms tiek meklēts tabulā, kas norādīta pašreizējā vaicājuma klauzulā FROM, pēc tam ārējā vaicājumā utt.).

Ļoti bieži tā vietā, lai rakstītu SELECT priekšrakstu, izmantojot apakšvaicājumu, varat izmantot savienojumus. Tomēr praksē lielākā daļa DBVS veic apakšvaicājumus efektīvāk. Tomēr, izstrādājot programmu kopu ar kritiskām veiktspējas prasībām, izstrādātājam ir jāanalizē SQL priekšraksta izpildes plāns konkrētai DBVS.

Vismodernākās DBVS, piemēram, Oracle, nodrošina vairākus SQL priekšrakstus, kas ļauj novērtēt konkrēta SQL priekšraksta veiktspēju, kā arī noteikt šim priekšrakstam piemēroto optimizācijas līmeni.

Apakšvaicājumu var norādīt vai nu predikātā, kas definēts ar WHERE klauzulu, vai grupas predikātā, ko definē klauzula HAVING.

Piemēram:

Saistītie apakšvaicājumi

SELECT priekšrakstā iekšējais apakšvaicājums var atsaukties uz kolonnām no ārējā vaicājuma, kas norādīts klauzulā SELECT. Šis apakšvaicājums tiek izpildīts katrai tabulas rindai, nosakot nosacījumu tā iekļaušanai ģenerētajā rezultātu kopā.

Piemēram:

Šajā gadījumā katrai tabulas tbl1 rindai tiks pārbaudīts nosacījums, ka lauka f2 vērtība sakrīt ar tabulas tbl2 rindas vērtību, kur lauka f3 vērtība ir vienāda ar ārējā lauka f3 vērtību. tabula (tbl1). Šis ir vienkāršākais piemērs korelēts apakšvaicājums.

Ļoti bieži vēlaties, lai apakšvaicājumā tiktu izmantoti tie paši dati kā ārējā tabulā. Šajā gadījumā ir jāizmanto pseidonīmi.

Piemēram:

Kad korelēts apakšvaicājums klauzulā HAVING varat izmantot tikai apkopošanas funkcijas, jo katru reizi apakšvaicājuma izpildes laikā rindu grupēšanas rezultāts, pamatojoties uz galvenā vaicājuma apkopošanas funkcijām, darbojas kā atzīmētā rinda, kuras vērtības apakšvaicājumam ir piekļuve.

Piemēram:

Predikāta konstruēšana apakšvaicājumam, kas atgriež vairākas rindas

Ja predikātā vērtība ir jāsalīdzina ar noteiktu kopu, tad, kā parādīts iepriekš, varat izmantot operatoru IN.

Lai pārbaudītu, vai ir rindas, kas atbilst noteiktam apakšvaicājuma nosacījumam, tiek izmantots operators EXISTS.

Piemēram:

Šis vaicājums ģenerēs rezultātu kopu, kas nav tukša, tikai tad, ja datums ir ievadīts jebkurā tabulas kolonnas f4 vērtībā, piemēram: “10/11/2003”.

Operatora EXISTS izmantošanas priekšrocība ar apakšvaicājuma rezultātiem ir tāda, ka apakšvaicājums var atgriezt gan vairākas rindas, gan vairākas kolonnas.

Plkst korelēts apakšvaicājums Operators EXISTS tiks novērtēts katru reizi katrai ārējā vaicājuma rindai.

Standarts SQL-92 neparedz apkopošanas funkciju izmantošanu apakšvaicājumos, kuriem tiek lietots operators EXISTS. Tomēr dažas DBVS pieļauj šāda veida apakšvaicājumu.

Lai izmantotu apakšvaicājuma rezultātu predikātā, tiek izmantoti arī operatori ANY un ALL, kas tika detalizēti apspriesti iepriekšējās lekcijās.

Šeit ir operatora ANY izmantošanas piemērs:

Šis paziņojums norāda, ka rezultātu kopā tiks iekļautas visas rindas, kuru vērtība kolonnā f3 atrodas tabulā tbl2.

Apakšvaicājumu izmantošana datu modifikācijas paziņojumos

DML priekšraksti papildus priekšrakstam SELECT ietver priekšrakstus, kas ļauj mainīt datus tabulās. Šis ir operators IEVIETOT, kas veic vienas vai vairāku rindu pievienošanu tabulai, operatoram DZĒST, kas no tabulas noņem vienu vai vairākas rindas, un operatoru ATJAUNINĀT, kas maina tabulas kolonnu vērtības.

INSERT paziņojumu

Operators IEVIETOT

INSERT INTO tabulas_nosaukums [ (lauks .,:) ] ( VĒRTĪBAS (vērtība .,:) ) | apakšvaicājums | (NOKLUSĒJĀS VĒRTĪBAS);

Operators IEVIETOT tabulai var pievienot vienu vai vairākas rindas. Lauku saraksts (lauks .,:) norāda lauku nosaukumus un secību, kādā tajos tiek ievadītas vērtības no vērtību saraksta, kas definēts ar VALUES frāzi vai apakšvaicājuma izpildes rezultātā.

Sarakstu, kas definēts ar klauzulu VALUES, sauc par tabulas vērtību konstruktoru un norāda iekavās, atdalot ar komatiem.

Ja lauku saraksts (lauks .,:) ir izlaists, tad vērtību ievadīšanas secība atbildīs kolonnu secībai, kas norādīta priekšrakstā CREATE TABLE, veidojot šo tabulu.

Ja kolonnām, uz kurām attiecas NOT NULL ierobežojums, nav pievienojamo datu, DBVS ģenerē SQL priekšraksta izpildes kļūdu.

Nākamais operators IEVIETOT parāda rindu kopēšanu no tabulas tbl2, pamatojoties uz apakšvaicājumu:

INSERT INTO tbl1(f1,f2,f3) (SELECT f1,f2,f3 FROM tbl2);

Acīmredzot lauku saraksta norādītajam lauku skaitam un šo lauku datu tipiem jāsakrīt ar lauku skaitu un to datu tipiem tabulas vērtību konstruktorā vai apakšvaicājuma ģenerētajā rezultātu kopā.

DZĒST paziņojumu

Operators DZĒST SQL-92 standartā ir šāds oficiālais apraksts:

Operators DZĒST izmanto, lai dzēstu rindas no tabulas, kas norādīta ar nosacījumu WHERE (meklētā dzēšana) vai WHERE CURRENT OF (pozicionēta dzēšana).

Pozicionālā dzēšana, ko nosaka klauzula WHERE CURRENT OF, dzēšot rindas no kursora, tās attiecīgi tiek izdzēstas no datu bāzes tabulas, uz kuras šis kursors tika uzbūvēts.

Ja operators DZĒST piemērojot jebkuram skatam, dati tiek dzēsti arī no datu bāzes tabulas, kas izveidota, pamatojoties uz pēdējo.

Mēs nekad nedrīkstam aizmirst, ka, ja nav WHERE klauzulas vai predikāts WHERE klauzulā vienmēr tiek novērtēts kā TRUE, tad operators DZĒST no tabulas tiks noņemtas visas rindas.

UPDATE paziņojums

Operators ATJAUNINĀT SQL-92 standartā ir šāds oficiālais apraksts:

Operators ATJAUNINĀT izmanto, lai veiktu izmaiņas tabulas datos.

Izteiksme, ko izmanto kolonnas vērtības aprēķināšanai, var būt vienkārša izteiksme vai apakšvaicājums, kas atgriež vienu vērtību. Izteiksme var atsaukties uz maināmās kolonnas veco vērtību un citām pašreizējā ieraksta kolonnām.

Aprēķinot kolonnu vērtības, varat izmantot nosacījumu izteiksmi LIETAS un CAST izteiksme tipa liešanai.

Piemēram:

Nosacījuma izteiksme CASE

Nosacīta izteiksme LIETASļauj izvēlēties vienu no vairākām vērtībām, pamatojoties uz noteiktu nosacījumu.

Nosacīta izteiksme LIETAS ir šāds oficiālais apraksts:

( CASE ( izteiciens KAD expr THEN ( expr | NULL )) | ( WHEN expr THEN ( expr | NULL )) [ ELSE ( expr | NULL ) ] END) | ( NULLIF (ekspr1,ekspr2) ) | (KOALESCE (izteik.,:) )

Nosacīta izteiksme LIETAS var rakstīt attiecīgi četrās formās:

  • LIETAS ar izteicieniem. Piemēram:

    SELECT f1, CASE f3, KAD "abc", TAD "1_abc" BEIGAS NO tbl1;

  • LIETAS ar predikātiem. Piemēram:

    SELECT f1, CASE WHEN f3= "abc" TAD "1_abc" ELSE f3 END NO tbl1;

  • NULLIF - ja iekavās norādītās izteiksmes nesakrīt, tiek atlasīta pirmā no šīm vērtībām, pretējā gadījumā vērtība tiek iestatīta uz NULL. Piemēram:
  • COALESCE - atlasa pirmo vērtību, kas nav NULL sarakstā. Piemēram:

    INSERT INTO tbl1(f1,f2) VALUES (1+ COALESCE(SELECT MAX(f1) FROM tbl1, 0), 100);

Lai veiksmīgi izpildītu paziņojumu ATJAUNINĀT ir nepieciešami vairāki nosacījumi, tostarp šādi:

  • atbilstošu privilēģiju pieejamība;
  • skats prasa, lai tas būtu definēts kā mainīgs;
  • Mainot skatus, tiek piemēroti skata izveides laikā noteiktie ierobežojumi AR PĀRBAUDES OPTION vai WITH CASCADE CHECK OPTION;
  • tikai lasāmās transakcijās izmaiņas ir pieejamas tikai pagaidu tabulām;
  • izteiksmēs, ko izmanto vērtību noteikšanai, nedrīkst būt apakšvaicājumi ar apkopošanas funkcijām;
  • Atjaunināmam kursoram, kas norādīts klauzulā FOR UPDATE, katra atjaunināmā kolonna jānorāda arī kā FOR UPDATE ;
  • Kursorā ar klauzulu ORDER BY nevar modificēt šajā klauzulā norādītās kolonnas.

Apakšvaicājums ir vaicājums, kas ietverts cita vaicājuma WHERE atslēgvārda izteiksmē, lai vēl vairāk ierobežotu izvadi. Apakšvaicājumus sauc arī par ligzdotiem vaicājumiem. Tos izmanto, lai uzliktu nosacījumus izvades datiem. Apakšvaicājumus var izmantot ar priekšrakstiem SELECT, INSERT, UPDATE vai DELETE.

Dažos gadījumos tabulu saistīšanas vietā var izmantot apakšvaicājumu, tādējādi netieši saistot tabulas datus. Lietojot vaicājumā apakšvaicājumu, vispirms tiek izpildīts apakšvaicājums un tikai pēc tam tiek izpildīts to saturošais vaicājums, ņemot vērā apakšvaicājuma izpildes nosacījumus. Apakšvaicājumu var izmantot vai nu galvenā vaicājuma WHERE atslēgvārda izteiksmē, vai HAVING atslēgvārdu izteiksmē. Loģiskās un salīdzināšanas darbības, piemēram, =, >,<, о, IN, NOT IN, AND, OR и т п. можно использовать в подзапросе. Все, что применимо к обычному запросу, применимо и к подзапросу.

Veidojot apakšvaicājumus, jums jāievēro šādi noteikumi.

Apakšvaicājums jāiekļauj iekavās.

Apakšvaicājums var atsaukties tikai uz vienu kolonnu savā SELECT atslēgvārda izteiksmē, ja vien galvenais vaicājums neizmanto salīdzinājumu ar vairākām kolonnām no apakšvaicājuma.

Atslēgvārdu ORDER BY nevar izmantot apakšvaicājumā, lai gan galvenajā vaicājumā var izmantot ORDER BY. ORDER BY vietā apakšvaicājumā varat izmantot GROUP BY.

Apakšvaicājumu, kas atgriež vairākas datu rindas, var izmantot tikai operatoros, kas pieļauj vairākas vērtības, piemēram, IN.

Operatoru BETWEEN nevar izmantot apakšvaicājumā, bet to var izmantot pašā apakšvaicājumā. Apakšvaicājuma priekšraksta pamata sintakse ir šāda.

SELECT kolonnas_nosaukums FROM tabulas WHERE kolonnas_nosaukums = (SELECT kolonnas_nosaukums FROM tabulas WHERE nosacījumi);

Tāpat kā apakšvaicājumu var ligzdot galvenajā vaicājumā, apakšvaicājumu var ligzdot arī apakšvaicājumā. Galvenajā vaicājumā apakšvaicājums tiek izpildīts pirms galvenā vaicājuma izpildes, un tādā pašā veidā apakšvaicājumā vispirms tiks izpildīts tajā ievietotais apakšvaicājums.

Piemērs. Lai būtu jānosaka to priekšmetu skaits, kuru vērtējums pārsniedz skolēna vidējo atzīmi ar identifikatoru 301:

SELECT COUNT (DISTINCT subj_id), atzīmējiet FROM eksāmena_atzīmes GROUP BY atzīme HAVING atzīme > (SELECT AVG(atzīme) FROM eksāmena_atzīmes WHERE stud_id=301);

Ja priekšrakstā izmantojat vairākus apakšvaicājumus, pieprasījuma apstrādei nepieciešamais laiks palielinās un kļūdu iespējamība palielinās priekšraksta sarežģītības dēļ.

Saistītie apakšvaicājumi ir atļauti daudzās SQL implementācijās. Ja iekšējā vaicājumā izmantojat apakšvaicājumus, varat atsaukties uz tabulu, kuras nosaukums ir norādīts ārējā vaicājuma klauzulā FROM. Šādus apakšvaicājumus sauc par saistītiem. Saistītais apakšvaicājums tiek izpildīts vienu reizi katrai galvenās vaicājumu tabulas rindai šādi:



No tabulas tiek atlasīta rinda, kuras nosaukums ir norādīts ārējā vaicājumā;

Apakšvaicājums tiek izpildīts, un iegūtā vērtība tiek izmantota, lai parsētu šo rindu ārējā vaicājuma WHERE klauzulā;

Pamatojoties uz šī nosacījuma izvērtēšanas rezultātu, tiek pieņemts lēmums par rindas iekļaušanu/neiekļaušanu izvaddatos;

Procedūra tiek atkārtota nākamajā ārējās vaicājumu tabulas rindā.

GROUP BY klauzula ļauj grupēt ierakstus, kas atgriezti ar SELECT vaicājumu, pēc noteikta lauka vērtības. Izmantojot klauzulu HAVING, izvades laikā varat filtrēt šādas grupas. HAVING klauzulas predikāts tiek novērtēts nevis katrai rezultāta rindai, bet katrai izejas ierakstu grupai, ko veido ārējā vaicājuma klauzula GROUP BY.

SELECT eksāmena_datums, SUM(atzīme) FROM eksāmens_atzīmē GROUP BY eksāmena_datums

IR 10< (SELECT COUNT(mark) FROM exam_marks b

WHERE a.exam_date=b.exam_date);

Nepieciešams, pamatojoties uz eksāmenu_atzīmju tabulas datiem, noteikt skolēnu saņemto vērtējumu summu (atzīmju lauku vērtības), grupējot vērtējumu vērtības pēc eksāmenu datumiem un izslēdzot tās dienas, kad eksāmenus kārto skolēnu skaits. diena bija mazāka par desmit.

Kopsavilkums: apakšvaicājums ir vaicājums, kas tiek izpildīts cita vaicājuma ietvaros, lai iestatītu papildu nosacījumus izvaddatiem. Apakšvaicājumu var izmantot WHERE un HAVING atslēgvārdu izteiksmēs. Apakšvaicājumu sintakse praktiski neatšķiras no parastā vaicājuma sintakses ir tikai nelieli ierobežojumi. Viens no šiem ierobežojumiem ir aizliegums izmantot atslēgvārdu ORDER BY apakšvaicājumos, taču tā vietā varat izmantot GROUP BY, kas nodrošina gandrīz tādu pašu efektu. Apakšvaicājumi tiek izmantoti, lai ievietotu nosacījumus vaicājumos, par kuriem nav zināmi precīzi dati, tādējādi palielinot SQL jaudu un elastību.

SQL ļauj ligzdot vaicājumus savā starpā. Parasti apakšvaicājums atgriež vienu vērtību, kas tiek pārbaudīta, lai noskaidrotu, vai predikāts ir patiess.

Meklēšanas vienumu veidi:
. Salīdzinājums ar apakšvaicājuma rezultātu (=, >=)
. Pārbauda piederību apakšvaicājuma (IN) rezultātiem
. Esamības pārbaude (EXISTS)
. Vairāki (kvantitatīvi) salīdzinājumi (JEBKURS, VISI)

Piezīmes par ligzdotiem vaicājumiem:
. Apakšvaicājumā ir jāatlasa tikai viena kolonna (izņemot apakšvaicājumu ar predikātu EXISTS), un tā rezultāta datu tipam ir jāatbilst predikātā norādītās vērtības datu tipam.
. Dažos gadījumos varat izmantot DISTINCT atslēgvārdu, lai nodrošinātu vienas vērtības atgriešanu.
. Apakšvaicājumā nevar iekļaut klauzulu ORDER BY vai UNION.
. Apakšvaicājums var atrasties pa kreisi vai pa labi no meklēšanas nosacījuma.
. Apakšvaicājumos var izmantot apkopošanas funkcijas bez GROUP BY klauzulas, kas automātiski atgriež īpašu vērtību jebkuram rindu skaitam, īpašu IN predikātu un kolonnu izteiksmēm.
. Kad vien iespējams, apakšvaicājumu vietā izmantojiet tabulas JOIN savienojumus.

Ligzdoto vaicājumu piemēri:

SELECT * FROM Pasūtījumi WHERE SNum=(SELECT SNum FROM SalesPeople WHERE SName=’Motika’)
SELECT * FROM Pasūtījumi WHERE SNum IN (SELECT SNum FROM SalesPeople WHERE City=’London’)
SELECT * FROM Pasūtījumi WHERE SNum=(SELECT DISTINCT SNum FROM Orders WHERE CNum=2001)
SELECT * FROM Pasūtījumi WHERE Amt> (SELECT AVG(Amt) FROM Orders WHERE Odate=10/04/1990)
SELECT * FROM Customer WHERE CNum=(SELECT SNum+1000 FROM SalesPeople WHERE SName=’Serres’)

2) Saistītie apakšvaicājumi

SQL varat izveidot apakšvaicājumus, kas atsaucas uz tabulu no ārējā vaicājuma. Šajā gadījumā apakšvaicājums tiek izpildīts vairākas reizes, vienu reizi katrai tabulas rindai no ārējā vaicājuma. Tāpēc ir svarīgi, lai apakšvaicājumā tiktu izmantots indekss. Apakšvaicājums var piekļūt tai pašai tabulai kā ārējai. Ja ārējais vaicājums atgriež salīdzinoši nelielu rindu skaitu, saistītais apakšvaicājums būs ātrāks nekā nesaistītais. Ja apakšvaicājums atgriež nelielu skaitu rindu, saistītais vaicājums būs lēnāks nekā nesaistītais vaicājums.

Saistīto apakšvaicājumu piemēri:

SELECT * FROM SalesPeople Galvenā WHERE 1(SELECT AVG(Amt) FROM Orders O2 WHERE O2.CNum=O1.CNum) //atgriež visus pasūtījumus, kuru vērtība pārsniedz konkrētā klienta vidējo pasūtījuma vērtību

3) Predikāts PASTĀV

Sintaktiskā forma: PASTĀV ()

Predikāts izmanto apakšvaicājumu kā argumentu un novērtē kā patiesu, ja apakšvaicājumā ir izvade, un false citādi. Apakšvaicājums tiek izpildīts vienu reizi un var saturēt vairākas kolonnas, jo to vērtības netiek pārbaudītas, bet rindu klātbūtnes rezultāts tiek vienkārši reģistrēts.

Piezīmes par predikātu EXISTS:
. EXISTS ir predikāts, kas atgriež TRUE vai FALSE, un to var izmantot atsevišķi vai kopā ar citām Būla izteiksmēm.
. EXISTS savā apakšvaicājumā nevar izmantot apkopošanas funkcijas.
. Korelētajos apakšvaicājumos predikāts EXISTS tiek izpildīts katrai ārējās tabulas rindai.
. Predikātu EXISTS var apvienot ar tabulu savienojumiem.

Predikāta EXISTS piemēri:

SELECT * FROM Customer WHERE EXISTS (SELECT * FROM Customer WHERE City=’Sanhosē’) — atgriež visus klientus, ja kāds no viņiem dzīvo Sanhosē.
SELECT DISTINCT SNum FROM Customer First WHERE NOT EXISTS (SELECT * FROM Customer Send WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) — atgriež to pārdevēju skaitu, kuri apkalpojuši tikai vienu klientu.
SELECT DISTINCT F.SNum, SNum, F. City FROM SalesPeople F, Customer S WHERE EXISTS (SELECT * FROM Customer T WHERE S.SNum=T.SNum AND S.CNumT.CNum UN F.SNum=S.SNum) — atgriež visu pārdevēju, kuri apkalpoja vairākus klientus, numuri, vārdi un dzīvesvietas pilsētas.
SELECT * FROM SalesPeople Frst WHERE EXISTS (SELECT * FROM Klients Sūtīt WHERE Frst.SNum=Send.SNum UN 1

4) Kvantitatīvās salīdzināšanas predikāti

Sintaktiskā forma: (=|>|=|) JEBKĀRĀ|VISI ()

Šie predikāti kā argumentu izmanto apakšvaicājumu, tomēr, salīdzinot ar predikātu EXISTS, tie tiek lietoti kopā ar relāciju predikātiem (=,>=). Šajā ziņā tie ir līdzīgi IN predikātam, bet tiek izmantoti tikai ar apakšvaicājumiem. Standarts ļauj izmantot DAŽU atslēgvārdu, nevis JEBKURU, taču ne visas DBVS to atbalsta.

Piezīmes par salīdzināšanas predikātiem:
. Predikāts ALL tiek novērtēts kā TRUE, ja katra apakšvaicājuma izpildes laikā atlasītā vērtība atbilst nosacījumam, kas norādīts ārējā vaicājuma predikātā. To visbiežāk izmanto ar nevienlīdzību.
. Predikāts ANY tiek novērtēts kā TRUE, ja vismaz viena apakšvaicājuma izpildes laikā atlasītā vērtība atbilst nosacījumam, kas norādīts ārējā vaicājuma predikātā. To visbiežāk izmanto ar nevienlīdzību.
. Ja apakšvaicājums neatgriež nevienu rindu, tad VISI automātiski iegūst vērtību TRUE (tiek uzskatīts, ka salīdzināšanas nosacījums ir izpildīts), bet JEBKURAM tā iegūst vērtību FALSE.
. Ja salīdzinājums ir TRUE nevienai rindai un ir viena vai vairākas rindas ar NULL vērtību, tad ANY atgriež NEZINĀMS.
. Ja salīdzinājums ir FALSE nevienai rindai un ir viena vai vairākas rindas ar NULL vērtību, ALL atgriež NEZINĀMS.

Kvantitatīvā salīdzinājuma predikāta piemēri:

SELECT * FROM SalesPeople WHERE Pilsēta = ANY (IZVĒLIES Pilsētu NO klienta)
SELECT * FROM Pasūtījumi WHERE Amt ALL (SELECT Rating FROM Customer WHERE City='Rome')

5) Unikalitātes predikāts

UNIKĀLS|ATŠĶIRĪGS ()

Predikāts tiek izmantots, lai pārbaudītu apakšvaicājuma izejas datu unikalitāti (dublikātu neesamību). Turklāt UNIQUT predikātā virknes ar NULL vērtībām tiek uzskatītas par unikālām, un predikātā DISTINCT divas nenoteiktas vērtības tiek uzskatītas par vienādām viena ar otru.

6) Atbilstības predikāts

MATCH ()

Predikāts MATCH pārbauda, ​​vai vaicājuma virknes vērtība atbilst jebkuras apakšvaicājuma virknes vērtībai. Šis apakšvaicājums atšķiras no IN AND ANY predikātiem ar to, ka tas ļauj apstrādāt “daļējas” (PARTIAL) atbilstības, kas var rasties rindās, kurām ir dažas NULL vērtības.

7) Vaicājumi sadaļā NO

Faktiski ir likumīgi izmantot apakšvaicājumu visur, kur ir atļauta tabulas atsauce.

SELECT CName, Tot_Amt FROM Customer, (SELECT CNum, SUM(Amt) AS Tot_Amt FROM Orders GROUP BY CNum) WHERE Pilsēta=’Londona’ UN Customer.CNum=Pasūtījumi.CNum
//subquery atgriež katra klienta no Londonas veikto pasūtījumu kopējo summu.

8) Rekursīvie vaicājumi

AR REKURSĪVU
Q1 KĀ IZVĒLĒTIES … NO … KUR …
Q2 KĀ IZVĒLĒTIES … NO … KUR …

Apakšvaicājums attiecas uz īpašiem objektiem programmā 1C. Tās funkcionalitāte tiek izmantota, ja programmā nepieciešams ģenerēt un izpildīt īpaša veida vaicājumus datu bāzes tabulām. Lai iegūtu pieprasījuma rezultātu, vispirms pareizi jāsastāda pieprasījuma teksts, kurā tiks uzkrāta aktuālā informācija par datu iegūšanas avotiem. Tās var būt tabulas, īpaši lauki, unikālas grupas.

Mūsdienīga vaicājumu valoda programmai 1C

Ligzdotie vaicājumi ir rakstītas, izmantojot valodu, kurai ir savas īpašības un kas tajā pašā laikā ir līdzīga citām īpašām SQL valodām, piemēram, pēc savas sintakses. Galvenās atšķirīgās iezīmes vaicājuma valoda 1C tie ir:

  • Atsauces lauku atcelšana;
  • Netipisku pieprasījumu iespēja;
  • Sakārtošana pēc primitīvajiem veidiem;
  • Izmantojot konstrukciju "View";
  • Datu paraugu ņemšana pēc veidnes;
  • Grupu un kopsummu koplietošana;
  • Būvniecība ar nosacījumu “Kur”.

1C vaicājumu valodai ir arī citas atšķirīgas iezīmes, kas ļauj tai būt efektīvai.

Kas jums jāzina par ligzdotajiem vaicājumiem un vaicājumu valodu?

Profesionāla vaicājumu valodas dizaina izpēte ļauj ne tikai saprast, kam tā ir paredzēta vaicājuma valoda, bet arī iemācīties attēlot datu bāzes objektu kopu 2-dimensiju tabulu formātā, apstrādāt vaicājumu konsoli, veidot failus vaicājumu sarakstu glabāšanai un iepazīties ar specifiskajiem tabulu laukiem, kuriem ir atsauces tips. Un tas viss būs tikai pamatzināšanas par sistēmu ligzdotie vaicājumi 1C. Ir svarīgi apgūt grupas darbības, kas saistītas ar vaicājuma valodu, un iemācīties veikt pareizu atlasi no vairākiem datu avotiem.

Ligzdota vaicājuma piemērs

Apskatīsim vienu no iespējām ligzdotajam vaicājumam, kura pamatā ir vaicājumu apvienošana. Pieņemsim, ka ir dokumenti par ieņēmumiem un izdevumiem, un viena un tā pati juridiskā persona darbojas gan kā pārdevējs, gan kā pircējs. Mums ir jānoskaidro darījuma partnera kopējais parāds. Lai to izdarītu, mēs izmantojam efektīvo konstrukciju “UNITE ALLYTHY”.

Tabula "ARRIAGE"

Tabula "PATĒRIŅŠ"

Vispirms nosakām visus izdevumus, tad ienākumus pa juridiskajām personām. Otro pieprasījumu ievietojām ar “-” zīmi, tas ļaus pareizi sakļaut datus.

Darbības rezultāts:

Bet mums ir nepieciešams sabrukts rezultāts, ir nepieciešama grupēšana pēc juridiskām personām.

Tad ziņojuma rezultāts būs:

Runājot par izdevumu un ienākumu tabulām, piemēram, saskaņā ar Nomenklatūras direktoriju, ir jānovērš dublēšanās. Taču jūs nevarēsit apvienot katru pieprasījumu atsevišķi. Tāpēc jums ir jādara šādi:

Šajā gadījumā vaicājums tiek ievietots iekavās, to sauc par ligzdotu vaicājumu. Tas ļauj ne tikai grupēt mums būtiskos ierakstus, bet arī izslēgt līdzīgus elementus no diviem izmantotajiem apakšvaicājumiem.

Apvienojot divus vaicājumus, jāievēro noteiktas prasības. Pirmkārt, tas attiecas uz lauku skaitu. Ir nepieciešams, lai to skaits būtu identisks. Piemēram, ja datu tabulā “Izdevumi” bija norādīta Atlaide, bet Kvīts datos šāda elementa nebija, tad jāizmanto šāda konstrukcija:

Turpmāk būs jāpielāgo atlaides apmērs un jāveic nepieciešamā grupēšana.

Otrs obligātais nosacījums ir kārtība. Fakts ir tāds, ka lauku apvienošanas procedūra notiek stingri saskaņā ar to secību, tas ir, veidu, kā tie ir norādīti katrā secīgajā sadaļā. Lai mainītu pasūtījumu, mēs izmantojam šādu konstrukciju:

Starp citu, izmantojot Savienības konstrukciju, tas ir jānošķir no vairāku vaicājumu apvienošanas jēdziena. Apvienošana ļauj vertikāli savienot parauga rezultātus pa vienam no pirmā un pēc tam pāriet uz otro. Tādā veidā dati tiek iegūti divu tabulu informācijas apvienošanas dizaina rezultātā.




Tops