SELECT <things_to_be_displayed> -- așa-numita „Proiecție” - în principal o listă de nume de coloane
FROM <tablename> -- nume de tabel sau de vizualizare și aliasurile acestora
WHERE <where_clause> -- așa-numita „Restricție” sau „condiție de căutare”
GROUP BY <group_by_clause>
HAVING <having_clause>
ORDER BY <order_by_clause>
OFFSET <offset_clause>
FETCH <fetch_first_or_next_clause>;
Cu excepția primelor două elemente, toate celelalte sunt opționale. Succesiunea elementelor de limbaj este obligatorie. În anumite locuri din cadrul comenzii pot porni noi comenzi SELECT – într-o manieră recursivă.
Proiecție (specificare coloanele rezultate)
În partea de proiecție a comenzii SELECT, specificați o listă de coloane, operații care lucrează pe coloane, funcții, valori fixe sau comenzi SELECT noi.
-- C/Comentariile în stilul Java sunt posibile în cadrul comenzilor SQL
SELECT id, /* numele unei coloane */
concat(firstname, lastname), /* funcția concat() */
weight + 5, /* operația de adăugare */
'kg' /* o valoare */
FROM person;
SGBD va prelua zece rânduri, fiecare dintre ele constând din patru coloane.
Putem amesteca secvența de coloane în orice ordine sau le putem prelua de mai multe ori.
SELECT id, lastname, lastname, 'weighs', weight, 'kg'
FROM person;
Asteriscul ‘*’ este o abreviere pentru lista tuturor coloanelor.
SELECT * FROM person;
Pentru coloanele numerice, putem aplica operatorii numerici obișnuiți +, -, * și /. Există, de asemenea, o mulțime de funcții predefinite în funcție de tipul de date: putere, sqrt, modulo, funcții șir, funcții de dată.
Unicitate prin cuvântul cheie DISTINCT
Este posibil să compactați rezultatul în sensul valorilor unice folosind cuvântul cheie DISTINCT. În acest caz, toate rândurile rezultate, care ar fi identice, vor fi comprimate într-un singur rând. Cu alte cuvinte: duplicatele sunt eliminate – la fel ca în teoria mulțimilor.
-- preia zece rânduri
SELECT lastname
FROM person;
-- preia doar șapte rânduri. Valorile duplicat sunt aruncate.
SELECT DISTINCT lastname
FROM person;
-- Sfat:
-- Cuvântul cheie „DIstinct” se referă la totalitatea rândurilor rezultate, pe care le puteți imagina
-- ca o concatenare a tuturor coloanelor. Urmează direct în spatele cuvântului cheie SELECT.
-- Următoarea interogare duce la zece rânduri, deși trei persoane au același nume de familie.
SELECT DISTINCT lastname, firstname
FROM person;
-- din nou doar șapte rânduri
SELECT DISTINCT lastname, lastname
FROM person;
Aliasuri pentru numele coloanelor
Uneori dorim să dăm coloanelor rezultate nume mai descriptive. Putem face acest lucru alegând un alias în cadrul proiecției. Acest alias este noul nume din setul de rezultate. GUI-urile arată aliasul ca etichetă de coloană.
-- Cuvântul cheie „AS” este opțional
SELECT lastname AS family_name, weight AS weight_in_kg
FROM person;
Funcții
Există funcții predefinite pentru utilizare în proiecții (și în alte poziții). Cele mai frecvent utilizate sunt:
- count(<columnname>|’*’): Numără numărul de rânduri rezultate.
- max(<columnname>): Cea mai mare valoare din <column> a setului de rezultate. Aplicabil si pe șiruri.
- min(<columnname>): Cea mai mică valoare din <column> a setului de rezultate. Aplicabil si pe șiruri.
- sum(<columnname>): Suma tuturor valorilor dintr-o coloană numerică.
- avg(<columnname>): Media unei coloane numerice.
- concat(<columnname_1>, <columnname_2>): Concatenarea a două coloane. Alternativ, funcția poate fi exprimată prin operatorul „||” : <columnname_1> || <columnname_2>
SQL standard și fiecare SGBD oferă mult mai multe funcții.
Trebuie să facem diferența între acele funcții care returnează o valoare pe rând, cum ar fi concat() și cele care returnează doar un rând pe un set de rezultate complet, cum ar fi max(). Primul poate fi amestecat în orice combinație cu nume de coloane, așa cum se arată în primul exemplu al acestei pagini. Cu cele mai recente, există o problemă: dacă le amestecăm cu un nume de coloană obișnuit, SGBD recunoaște o contradicție în interogare. Pe de o parte, ar trebui să recupereze exact o valoare (într-un rând), iar pe de altă parte, ar trebui să recupereze o mulțime de valori (într-o mulțime de rânduri). Reacția SGBD diferă de la furnizor la furnizor. Unii aruncă un mesaj de eroare în timpul execuției – în conformitate cu standardul SQL -, alții oferă rezultate suspecte.
-- merge bine
SELECT lastname, concat(weight, ' kg')
FROM person;
-- verificați reacția SGBD-ului dvs. Ar trebui să arate un mesaj de eroare.
SELECT lastname, avg(weight)
FROM person;
-- un amestec legal de funcții rezultând într-un rând cu 4 coloane
SELECT min(weight), max(weight), avg(weight) as average_1, sum(weight) / count(*) as average_2
FROM person;
SELECT în SELECT
Dacă vrem cu adevărat să vedem rezultatul unei funcții orientate pe set de rezultate în combinație cu coloane de mai mult de un rând, putem începe un SELECT foarte nou într-o locație în care – în cazuri simple – apare un nume de coloană. Acest al doilea SELECT este o comandă absolut independentă. Fiți atenți: va fi executat pentru fiecare rând rezultat al primului SELECT!
-- preia 10 rânduri; observați paranteza suplimentară pentru a delimita cele două SELECT unul de celălalt.
SELECT lastname, (SELECT avg(weight) FROM person)
FROM person;
-- Calculează procentul greutății fiecărei persoane în raport cu greutatea medie a tuturor persoanelor
SELECT lastname,
weight,
weight * 100 / (SELECT avg(weight) FROM person) AS percentage_of_average
FROM person;
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns