Instrucţiunea SELECT

Sintaxa instrucţiunii SELECT (va fi extinsă în cursurile următoare prin adăugarea unor noi facilităţi):
SELECT (1) 
    FROM (2) 
    [WHERE (3)] 
    [GROUP BY (4) [HAVING (5)]] 
    [ORDER BY (6)] 
    [clauze (7)]
[{UNION [ALL] | INTERSECT | MINUS} instr_SELECT] ...
[FOR UPDATE (10)]
(1) [/* comentariu */] [{DISTINCT | UNIQUE | ALL}] lista (8)
Optiunile DISTINCT şi UNIQUE sunt sinonime.
(8) * | sursa.* | expresie [AS] [alias]
O valoare din expresie se califică prin sursa de date unde apare: nume_tabel, nume_view, nume_sinonim, alias de sursa de date (o expresie descrisă la (2))
Pentru nume_tabel, nume_view, nume_sinonim se poate folosi şi un nume de schemă.
Operatori în expresii Oracle
Operanzii pot fi: In lista de valori din instrucţiune se poate folosi şi expresia Case.
(2) Lista_expresii_sursa_date
unde un element din această listă poate fi:
  • [schema.]{nume_tabel | nume_view | nume_sinonim} [alias]
  • (subinterogare) [alias]
  • TABLE (colectie)
  • Expresii join:
    • sursa1 CROSS JOIN sursa2
    • sursa1 NATURAL JOIN sursa2
    • sursa1 [INNER] JOIN sursa2 {ON conditie_legatura (9) | USING (lista_coloane)}
    • sursa1 LEFT [OUTER] JOIN sursa2 {ON conditie_legatura (9) | USING (lista_coloane)}
    • sursa1 RIGHT [OUTER] JOIN sursa2 {ON conditie_legatura (9) | USING (lista_coloane)}
    • sursa1 FULL [OUTER] JOIN {sursa2 ON conditie_legatura (9) | USING (lista_coloane)}
  • alte situaţii, de la bazele de date relational_obiectuale
(9) conditie_simpla [op_logic cond_simpla]
unde conditie_simpla: expresie_1 op_relational expresie_2
Observaţie: Atenţie la optimizări
(3) [conditie_legatura (9) AND] conditie_filtrare
unde "conditie_filtrare" poate fi:
  • expresie_1 op_relational expresie_2, unde "op_relational" poate fi: =, >, >=, <, <=, <>
  • expresie [NOT] BETWEEN min AND max
  • [NOT] IN (lista)
  • expresie IS NULL
  • expresie [NOT] LIKE 'sablon'
    unde în şablon: "%" precizează orice şir de caractere, iar "_" precizează poziţia unui singur caracter
  • condiţie construită cu funcţia REGEXP_LIKE (utilizează expresiile regulare)
  • expresie [NOT] op_relational (interogare_SELECT cu 1 linie si 1 coloana)
  • expresie [NOT] IN (interogare_SELECT cu n linii si 1 coloana)
  • (expr1 [, expr2] ...) [NOT] IN (interogare_SELECT cu n linii si m coloane)
  • expresie [NOT] op_relational {ANY | ALL} (interogare_SELECT cu n linii si 1 coloana)
    Dacă subinterogarea nu are linii, condiţia va avea valoarea true dacă se foloseşte ALL şi false pentru ANY.
    Dacă subinterogarea are mai mult de o linie, este necesar ALL sau ANY în faţa ei.
  • [NOT] EXISTS (interogare_SELECT)
(4) lista de expresii
Pentru grupuri de înregistrări (precizate de clauza group by) se pot folosi următoarele funcţii de agregare în expresiile din (8):
  • AVG([DISTINCT | ALL] expn) - Calculează valoarea medie a expresiei numerice din argument, ignorând valorile null.
  • COUNT({*|[DISTINCT | ALL] exp}) - Determină numărul de înregistrări unde exp (argumentul) e diferit de null (toate sau cele distincte). Pentru a determina toate înregistrările se poate folosi * (inclusiv valorile null).
  • MAX([DISTINCT | ALL] exp) - Determină valoarea maximă a expresiei din argument, ignorând valorile null.
  • MIN([DISTINCT | ALL]expr) - Determină valoarea minimă a expresiei din argument, ignorând valorile null.
  • SUM([DISTINCT | ALL] expn) - Determină suma valorilor expresiei numerice din argument, ignorând valorile null.
  • VARIANCE([DISTINCT | ALL] expn) - Determină varianţa valorilor expresiei numerice din argument (masură a împraştierii valorilor în jurul valorilor medii), ignorând valorile null.
  • STDDEV([DISTINCT | ALL] expn) - Determină deviaţia standard a expresiei numerice din argument, ignorând valorile null (deviaţia standard = variance^0.5).
Obs. In Oracle se pot folosi funcţii de agregare ca argumente la alte funcţii de agregare (două nivele de agregare), exemplu:
select max(avg(media)) from infstud group by sectia;
şi va rezulta o singură valoare. Prima funcţie evaluată este avg şi se va realiza peste gruparea cu grupa, iar a doua funcţie este max, care se evaluează peste rezultatul anterior.
Obs. In Oracle există şi alte funcţii de agregare (GROUPIND SETS, ROLLUP, CUBE, etc.), sau funcţii definite de utilizator

Incepând cu Oracle 9i apare şi funcţia collect(expresie), care evaluează expresia din argument (ca şir de caractere) pentru fiecare înregistrare din grupare şi crează o colecţie cu aceste valori (exemple mai multe se vor da la descrierea tabelelor cu coloane de tip utilizator).
create or replace TYPE listas AS TABLE OF varchar2(30);
select sectia,cast(collect(trim(nume)) as listas) from infstud group by sectia;
(5) conditie_filtrare de la (3), la care se pot adăuga operanzi care sunt funcţii de agregare
(6) {coloana | expresie | pozitie} [{ASC | DESC}] [{NULLS FIRST | NULLS LAST}] [, ...]...
(7) Se va descrie într-un curs următor
(10) Se va descrie într-un curs următor

Operaţii pe multimi

Rezultatul unei instrucţiuni Select poate fi considerat ca o mulţime de înregistrări. Intre două mulţimi de înregistrări precizate în acest fel se pot folosi operatorii: Expresiile din select (din cele două mulţimi) trebuie să aibă acelaşi: număr, tip de dată (există şi unele tipuri compatibile).
Denumirea coloanelor din rezultat este precizată de prima instrucţiune select.
Nu există prioritate între operatori, se foloseşte prioritate de stânga. Pentru o altă ordine de evaluare se pot folosi parantezele.

Observaţie. Pentru a determina ordinea (indexul) în care sunt determinate înregistrările de instrucţiunea Select, se poate folosi pseudocoloana ROWNUM (indexul primei înregistrări este 1). Valoarea este asociată înainte de o eventuală sortare.
Exemplu:
select rownum,nume,prenume,media 
from (select * from infstud order by media desc) 
where rownum<100