Dažkārt vaicājuma rezultātus var izmantot kā lauku citā vaicājumā vai kā kritēriju vaicājuma laukam. Piemēram, pieņemsim, ka vēlaties skatīt intervālu starp katra produkta pasūtījumiem. Lai izveidotu vaicājumu, kas rāda šo intervālu, jums ir jāsalīdzina katrs pasūtījuma datums ar citiem šī produkta pasūtījuma datumiem. Lai salīdzinātu šos pasūtījuma datumus, ir nepieciešams arī vaicājums. Varat ligzdot šo vaicājumu galvenajā vaicājumā, izmantojot apakšvaicājumu.
SQL skatā varat rakstīt apakšvaicājumu izteiksmē vai strukturētās vaicājumu valodas (Structured Query Language — SQL) priekšrakstā.
Tēmas šajā rakstā
- Vaicājuma rezultātu izmantošana kā lauks citā vaicājumā
- Apakšvaicājuma izmantošana par vaicājuma lauka kritēriju
- Bieži lietotie SQL atslēgvārdi, ko var izmantot ar apakšvaicājumu
Vaicājuma rezultātu izmantošana kā lauks citā vaicājumā
Apakšvaicājumu var izmantot kā lauka aizstājvārdu. Izmantojiet apakšvaicājumu kā lauka aizstājvārdu, ja vēlaties izmantot apakšvaicājuma rezultātus kā lauku galvenajā vaicājumā.
Piezīme
Apakšvaicājums, ko izmantojat kā lauka aizstājvārdu, nevar atgriezt vairākus laukus.
Varat izmantot apakšvaicājuma lauka aizstājvārdu, lai parādītu vērtības, kuras ir atkarīgas no citām vērtībām pašreizējā rindā, kas nav iespējams, neizmantojot apakšvaicājumu.
Piemēram, atgriezīsimies pie piemēra, kurā vēlaties skatīt intervālu starp katra produkta pasūtījumiem. Lai noteiktu šo intervālu, jums jāsalīdzina katrs pasūtījuma datums ar citiem šī produkta pasūtījuma datumiem. Vaicājumu, kas parāda šo informāciju, var izveidot, izmantojot datu bāzes veidni Northwind.
Cilnē Fails noklikšķiniet uz Jauns.
Sadaļā Pieejamās veidnes noklikšķiniet uz Paraugu veidnes.
Noklikšķiniet uz Northwind un pēc tam uz Izveidot.
Izpildiet norādījumus lapā Northwind Traders (objekta cilnē Sākuma ekrāns), lai atvērtu datu bāzi, pēc tam aizveriet pieteikšanās dialoglodziņu.
Cilnes Izveide grupā Vaicājumi noklikšķiniet uz Vaicājuma noformējums.
Noklikšķiniet uz cilnes Vaicājumi un pēc tam veiciet dubultklikšķi uz Preču pasūtījumi.
Veiciet dubultklikšķi uz laukiem Produkta ID un Pasūtījuma datums , lai tos pievienotu vaicājuma noformējuma režģim.
Režģa kolonnas Produkta IDrindā Kārtot atlasiet Augošā secībā.
Režģa kolonnas Pasūtījuma datumsrindā Kārtot atlasiet Dilstošā secībā.
Režģa trešajā kolonnā ar peles labo pogu noklikšķiniet uz rindas Lauks un pēc tam īsinājumizvēlnē noklikšķiniet uz Tālummaiņa .
Dialoglodziņā Tālummaiņa ierakstiet vai ielīmējiet šādu izteiksmi:
Prior Date: (SELECT MAX([Order Date]) FROM [Product Orders] AS [Old Orders] WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date] AND [Old Orders].[Product ID] = [Product Orders].[Product ID])Šī izteiksme ir apakšvaicājums. Katrai rindai apakšvaicājums atlasa visjaunāko pasūtījuma datumu, kas ir mazāk jaunāks par pasūtījuma datumu, kas jau ir saistīts ar rindu. Ievērojiet, kā izmantot atslēgvārdu AS, lai izveidotu tabulas aizstājvārdu un varētu salīdzināt vērtības apakšvaicājumā ar vērtībām pašreizējā galvenā vaicājuma rindā.
Režģa ceturtās kolonnas rindā Lauks ierakstiet šādu izteiksmi:
Interval: [Order Date]-[Prior Date]
Šī izteiksme aprēķina intervālu starp katra pasūtījuma datumu un iepriekšējā pasūtījuma datumu šim produktam, izmantojot iepriekšējā datuma vērtību, ko definējām, izmantojot apakšvaicājumu.Cilnes Noformējums grupā Rezultāti noklikšķiniet uz Izpildīt.
- Vaicājums tiek izpildīts un parāda produktu nosaukumu, pasūtījumu datumu, iepriekšējo pasūtījumu datumu un pasūtījuma datumu intervāla sarakstu. Rezultāti vispirms tiek kārtoti pēc produkta ID (augošā secībā) un pēc tam pēc pasūtījuma datuma (dilstošā secībā).
-
Piezīme
Tā kā Produkta ID ir uzmeklēšanas lauks, programma Access pēc noklusējuma rāda uzmeklēšanas vērtības (šajā gadījumā produkta nosaukumu), nevis faktiskos produkta ID. Lai gan tiek mainītas parādītās vērtības, kārtošanas secība netiek mainīta.
Aizveriet Northwind datu bāzi.
Apakšvaicājuma izmantošana par vaicājuma lauka kritēriju
Apakšvaicājumu var izmantot kā lauka kritēriju. Izmantojiet apakšvaicājumu kā lauka kritēriju, ja vēlaties izmantot apakšvaicājuma rezultātus, lai ierobežotu laukā parādītās vērtības.
Piemēram, pieņemsim, ka vēlaties pārskatīt to pasūtījumu sarakstu, kurus apstrādājuši darbinieki, kas nav tirdzniecības pārstāvji. Lai izveidotu šo sarakstu, katra pasūtījuma darbinieka ID ir jāsalīdzina ar to darbinieku ID sarakstu, kuri nav tirdzniecības pārstāvji. Lai izveidotu šo sarakstu un izmantotu to kā lauka kritēriju, ir jāizmanto apakšvaicājums, kā parādīts šajā procedūrā:
Atveriet Northwind.accdb un iespējojiet tā saturu.
Aizveriet pieteikšanās formu.
Cilnes Izveidot grupā Cits noklikšķiniet uz Vaicājuma noformējums.
Cilnē Tabulas veiciet dubultklikšķi uz Pasūtījumi un Darbinieki.
Tabulā Pasūtījumi veiciet dubultklikšķi uz lauka Darbinieka ID , Pasūtījuma ID un Pasūtījuma datums , lai tos pievienotu vaicājuma noformējuma režģim. Tabulā Darbinieki veiciet dubultklikšķi uz lauka Amats , lai to pievienotu noformējuma režģim.
Ar peles labo pogu noklikšķiniet uz kolonnas Darbinieka ID kritēriju rindas un pēc tam īsinājumizvēlnē noklikšķiniet uz Tālummaiņa .
Lodziņā Tālummaiņa ierakstiet vai ielīmējiet šādu izteiksmi:
IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative')Šis ir apakšvaicājums. Tā atlasa visus darbinieku ID, ja darbiniekam nav tirdzniecības pārstāvja amata nosaukuma, un nodrošina šo rezultātu kopu galvenajam vaicājumam. Pēc tam galvenais vaicājums pārbauda, vai rezultātu kopā ir darbinieku ID no tabulas Pasūtījumi.
Cilnes Noformējums grupā Rezultāti noklikšķiniet uz Izpildīt.
Vaicājums tiek izpildīts, un vaicājuma rezultāti parāda sarakstu ar pasūtījumiem, kurus apstrādājuši darbinieki, kas nav tirdzniecības pārstāvji.
Bieži lietotie SQL atslēgvārdi, ko var izmantot ar apakšvaicājumu
Ir vairāki SQL atslēgvārdi, kurus var izmantot ar apakšvaicājumu:
Piezīme
Šis saraksts nav pilnīgs. Apakšvaicājumā var izmantot jebkuru derīgu SQL atslēgvārdu, izņemot datu definīcijas atslēgvārdus.
VISI Klauzulā WHERE izmantojiet ALL, lai izgūtu rindas, kas atbilst nosacījumam, salīdzinot ar katru apakšvaicājuma atgriezto rindu.
Piemēram, pieņemsim, ka analizējat studentu datus koledžā. Studentiem ir jāsaglabā minimālais GPA, kas dažādās galvenajās daļās atšķiras. Specializācijas un to minimālie GPA tiek glabāti tabulā ar nosaukumu Specializācijas, un attiecīgā studentu informācija tiek glabāta tabulā ar nosaukumu Student_Records.
Lai skatītu sarakstu ar specialitātēm (un to minimālajiem GPA), kurās katrs students ar šo specialitāti pārsniedz minimālo GPA, varat izmantot šādu vaicājumu:SELECT [Major], [Min_GPA] FROM [Majors] WHERE [Min_GPA] < ALL (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);JEBKURŠ Klauzulā WHERE izmantojiet ANY, lai izgūtu rindas, kas atbilst nosacījumam, salīdzinot ar vismaz vienu apakšvaicājuma atgriezto rindu.
Piemēram, pieņemsim, ka analizējat studentu datus koledžā. Studentiem ir jāsaglabā minimālais GPA, kas dažādās galvenajās daļās atšķiras. Specializācijas un to minimālie GPA tiek glabāti tabulā ar nosaukumu Specializācijas, un attiecīgā studentu informācija tiek glabāta tabulā ar nosaukumu Student_Records.
Lai skatītu sarakstu ar specialitātēm (un to minimālajiem GPA), kurās jebkurš students ar šo specialitāti neatbilst minimālajam GPA, varat izmantot šādu vaicājumu:SELECT [Major], [Min_GPA] FROM [Majors] WHERE [Min_GPA] > ANY (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);Piezīme
Tam pašam mērķim varat izmantot arī atslēgvārdu SOME; atslēgvārds SOME ir sinonīms ANY.
PASTĀV Izmantojiet EXISTS klauzulā WHERE, lai norādītu, ka apakšvaicājumam jāatgriež vismaz viena rinda. Varat arī ievadīt EXISTS ar NOT, lai norādītu, ka apakšvaicājums nedrīkst atgriezt rindas.
Piemēram, šis vaicājums atgriež sarakstu ar produktiem, kas ir atrodami vismaz vienā esošā pasūtījumā:SELECT * FROM [Products] WHERE EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);Izmantojot NOT EXISTS, vaicājums atgriež sarakstu ar produktiem, kuri nav atrodami vismaz vienā esošajā pasūtījumā:
SELECT * FROM [Products] WHERE NOT EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);ŠAJĀ VALODĀ Izmantojiet IN klauzulā WHERE, lai pārbaudītu, vai vērtība galvenā vaicājuma pašreizējā rindā ir daļa no kopas, kuru atgriež apakšvaicājums. Varat arī ievadīt IN ar NOT, lai pārbaudītu, vai vērtība galvenā vaicājuma pašreizējā rindā nav daļa no kopas, ko atgriež apakšvaicājums.
Piemēram, šis vaicājums atgriež pasūtījumu sarakstu (ar pasūtījuma datumiem), kurus apstrādājuši darbinieki, kas nav tirdzniecības pārstāvji:SELECT [Order ID], [Order Date] FROM [Orders] WHERE [Employee ID] IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative');Izmantojot NOT IN, to pašu vaicājumu var uzrakstīt šādi:
SELECT [Order ID], [Order Date] FROM [Orders] WHERE [Employee ID] NOT IN (SELECT [ID] FROM [Employees] WHERE [Job Title]='Sales Representative');