Select (SQL)
SQL SELECT vaicājums atgriež rezultātu kopu ar ierakstiem no vienas vai vairākām tabulām (kā arī skatiem vai citiem objektiem).[1][2] SELECT vaicājums ir visbiežāk izmantotais datu manipulēšanas valodas (DML) priekšraksts.
Tā kā SQL ir deklaratīva valoda, SELECT vaicājumi apraksta tikai vēlamo rezultātu kopu, nevis to, kā šo rezultātu aprēķināt. Datubāzu pārvaldības sistēma (DBPS) vaicājumu pārveido vaicājuma plānā, kas var atšķirties starp izpildēm, DBPS versijām un dažādiem DBPS izstrādātājiem. Par labākā iespējamā izpildes plāna atrašanu atbild vaicājuma optimizētājs.
SELECT teikuma galvenās sastāvdaļas (klauzas) ir šādas:
SELECT— atlasīto kolonu un/vai izteiksmju saraksts. Tas aptuveni atbilst relāciju algebras projekcijas darbībai.AS— neobligāts kolonas vai izteiksmes aizstājvārds (relāciju algebras pārdēvēšanas darbība).FROM— tabulu saraksts, no kurām iegūt datus.WHERE— nosacījumi, kas ierobežo atlasāmos ierakstus (relāciju algebras atlases darbība).GROUP BY— grupēšanas izteiksme, kas ļauj katrai grupai piemērot agregātfunkciju.HAVING— nosacījumi, kas filtrē grupas, kuras izveidojaGROUP BYklauza.ORDER BY— kārtošanas izteiksme, kas nosaka atgriezto ierakstu secību.
Aiz atslēgas vārda SELECT uzskaita atlasāmās kolonas un/vai izteiksmes. Šeit var lietot speciālu simbolu *, kas nozīmē visas kolonas no tabulas (-ām).
Aiz atslēgas vārda FROM uzskaita tabulas (skatus, materializētos skatus, pagaidu tabulas), no kurām atlasa ierakstus. FROM klauzā var iekļaut neobligātus JOIN apakšnosacījumus, kas nosaka tabulu savienošanas noteikumus.
Atslēgas vārds WHERE nav obligāts, un aiz tā rakstāmie nosacījumi var ierobežot atlasāmos ierakstus — atlasa tikai tos ierakstus, kas atbilst nosacījumiem.
Grupēšanas izteiksme grupē ierakstus pa atlasāmajām kolonām un/vai izteiksmēm. Parasti to lieto kopā ar agregātfunkcijām, piemēram, COUNT(*) — skaits, SUM(kolona) — summa, MAX(kolona) — maksimālā vērtība, MIN(kolona) — minimālā vērtība, AVG(kolona) — vidējā vērtība.
HAVING klauzā raksta nosacījumus, kas tālāk ierobežo atlasāmos ierakstus, kuri jau ir sagrupēti. Tā kā HAVING darbojas ar GROUP BY rezultātiem, šajā klauzā var lietot agregātfunkcijas.
Kārtošanas izteiksme nodrošina atlasīto datu sakārtošanu noteiktā kārtībā (augošā vai dilstošā). Ja ORDER BY klauzas nav, atgriezto ierakstu kārtība ir atkarīga no datubāzu pārvaldības sistēmas īstenojuma.
Piemēri
[labot | labot pirmkodu]Šis vienkāršais SELECT vaicājums atgriež visus ierakstus no tabulas Gramata, kuros kolonnas cena vērtība pārsniedz 100,00. Rezultāts sakārtots augošā secībā pēc nosaukuma. Zvaigznīte (*) atlasīto kolonu sarakstā norāda, ka rezultātā jāiekļauj visas tabulas kolonas.
SELECT *
FROM Gramata
WHERE cena > 100.00
ORDER BY nosaukums;
Nākamais piemērs parāda vairāku tabulu vaicājumu ar grupēšanu un agregēšanu — atgriež grāmatu sarakstu un katras grāmatas autoru skaitu:
SELECT Gramata.nosaukums AS Nosaukums,
COUNT(*) AS Autoru_skaits
FROM Gramata
JOIN Gramatas_autors
ON Gramata.isbn = Gramatas_autors.isbn
GROUP BY Gramata.nosaukums;
SQL ļauj atlasīto kolonu sarakstā lietot izteiksmes, piemēram, lai katram ierakstam aprēķinātu papildu vērtību:
SELECT isbn,
nosaukums,
cena,
cena * 0.21 AS pvn
FROM Gramata
WHERE cena > 100.00
ORDER BY nosaukums;
Apakšvaicājumi
[labot | labot pirmkodu]Vaicājumus var ligzdot — viena vaicājuma rezultātu var izmantot citā vaicājumā ar salīdzinājuma vai agregēšanas funkciju palīdzību. Ligzdotu vaicājumu sauc par apakšvaicājumu. Lai gan tabulu savienojumi (JOIN) bieži ir aprēķinu ziņā efektīvāki, apakšvaicājumi ievieš izpildes hierarhiju, kas dažkārt ir noderīga vai nepieciešama. Šajā piemērā AVG agregātfunkcija saņem apakšvaicājuma rezultātu:
SELECT isbn,
nosaukums,
cena
FROM Gramata
WHERE cena < (SELECT AVG(cena) FROM Gramata)
ORDER BY nosaukums;
Ja apakšvaicājumā tiek izmantotas vērtības no ārējā vaicājuma, to sauc par korelēto apakšvaicājumu.
Kopš 1999. gada SQL standarts atļauj WITH klauzas — nosauktus apakšvaicājumus, kurus pazīst arī kā vienkopas tabulas izteiksmes (common table expressions). Vienkopas tabulas izteiksmes var būt arī rekursīvas — tās var atsaukties uz pašām sevi, kas ļauj veikt koka vai grafa struktūras šķērsošanu.
Atvasinātas tabulas
[labot | labot pirmkodu]Atvasināta tabula ir apakšvaicājums, kas atrodas FROM klauzā. Atvasinātā tabula darbojas kā parasta tabula — no tās var atlasīt datus vai to var savienot ar citām tabulām. Šādu konstrukciju dažkārt sauc arī par iekļauto skatu.
Rezultātu skaita ierobežošana
[labot | labot pirmkodu]Bieži vien ir lietderīgi norādīt maksimālo atgriežamo ierakstu skaitu — piemēram, testēšanai vai lai pārmērīgi nepatērētu resursus, ja vaicājums atgriež vairāk datu nekā paredzēts. Pieeja šim uzdevumam atšķiras pēc DBPS.
ISO standartā SQL:2003 rezultātu skaitu var ierobežot, izmantojot:
- kursorus;
- SQL loga funkciju pievienošanu
SELECTpriekšrakstam.
SQL:2008 standartā ieviesta FETCH FIRST klauza:
SELECT *
FROM T
FETCH FIRST 10 ROWS ONLY;
Šo klauzu atbalsta IBM Db2, PostgreSQL, Oracle 12c un citas mūsdienu DBPS. Arī Microsoft SQL Server 2008 un jaunākās versijas atbalsta FETCH FIRST, taču tas tiek uzskatīts par daļu no ORDER BY klauzas, kas šajā gadījumā ir obligāta:
SELECT *
FROM T
ORDER BY kolona DESC
OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;
Daudzām DBPS ir savas, ar standartu nesaderīgas sintakses. Piemēram, MySQL, PostgreSQL, SQLite un MariaDB izmanto LIMIT klauzu:
SELECT * FROM T LIMIT 10 OFFSET 20;
Microsoft SQL Server un MS Access vēsturiski lieto TOP atslēgvārdu (SELECT TOP 10 * FROM T), bet Oracle līdz 12c versijai — ROWNUM nosacījumu WHERE klauzā.
Loga funkcijas
[labot | labot pirmkodu]Loga funkcija (window function) ir agregātfunkcija, kas tiek piemērota rezultātu kopas daļai (logam). Atšķirībā no parastās GROUP BY agregēšanas, loga funkcijas saglabā oriģinālos ierakstus rezultātā. Loga funkciju izsaukums vienmēr ietver OVER klauzu, kas nosaka loga robežas un kārtošanu.
Piemēram, izteiksme aprēķina visu to pilsētu iedzīvotāju skaita summu, kuru pilsetas vērtība sakrīt ar pašreizējā ieraksta vērtību:
SUM(iedzivotaji) OVER (PARTITION BY pilseta)
Plaši izmantotās loga funkcijas ietver ROW_NUMBER() (piešķir unikālu numuru katram ierakstam) un RANK() (piešķir kārtas numuru, vienādu vērtību gadījumā saglabājot vienādu rangu).
Vaicājuma izpildes secība
[labot | labot pirmkodu]Saskaņā ar ANSI SQL, SELECT priekšraksta klauzas tiek apstrādātas šādā loģiskā secībā (kas atšķiras no rakstīšanas secības):[3]
FROM— izveido sākotnējo tabulu kopu un veic Dekarta reizinājumu.ON— piemēro savienojuma nosacījumus.JOIN— pievieno ārējās savienošanas ierakstus, ja norādīts ārējais savienojums.WHERE— filtrē ierakstus pēc norādītajiem nosacījumiem.GROUP BY— grupē ierakstus pēc norādītajām kolonām.HAVING— filtrē grupas.SELECT— izvēlas izvades kolonas un izteiksmes.DISTINCT— likvidē dublētos ierakstus.ORDER BY— sakārto rezultātu.
Šī izpildes secība izskaidro, kāpēc, piemēram, WHERE klauzā nevar atsaukties uz SELECT sarakstā definētiem aizstājvārdiem — WHERE tiek izpildīts pirms SELECT.
Atsauces
[labot | labot pirmkodu]- ↑ «SELECT (Transact-SQL)». Microsoft Learn (angļu). Skatīts: 2026-05-23.
- ↑ «SELECT Statement». MySQL 8.0 Reference Manual (angļu). Skatīts: 2026-05-23.
- ↑ Itzik Ben-Gan, Lubor Kollar, Dejan Sarka. Inside Microsoft SQL Server 2005: T-SQL Querying (angļu). Microsoft Press, 2006.
