Comanda SELECT
realizează una dintre cele mai frecvente operații asupra unui tabel dintr-o bază de date, respectiv extragerea înregistrărilor care respectă anumite criterii. Sintaxa parțială este:
SELECT obiecte_selectate [FROM nume_tabel] [WHERE conditie] [ORDER BY nume_coloana [ASC|DESC]] [LIMIT [poz_initiala],[nr_inregistrari]]
unde:
obiecte_selectate
– reprezintă obiectele pe care utilizatorul dorește să le vadă. Pot fi:- toate coloanele unui tabel –
*
- o parte a coloanelor – o lista cu numele acestora, separate prin virgulă
- expresii care pot folosi nume de coloane – lista de expresii separate prin virgulă
- alte expresii MySQL
- toate coloanele unui tabel –
nume_tabel
– reprezintă tabelul din care se extrag anumite coloane. ClauzaFROM
nume_tabel este obligatorie dacă în lista de obiecte avem coloane.
Exemple
Următorul exemplu selectează toate coloanele tabelului elevi
mysql> select * from elevi; +----+-------------+-------+-------+-------+-------+ | id | nume | clasa | nota1 | nota2 | media | +----+-------------+-------+-------+-------+-------+ | 1 | Popescu Ion | 12 | 7 | 8 | 0.00 | | 2 | Ionescu Ana | 11 | 7 | 9 | 0.00 | | 3 | Pop Vasile | 12 | 10 | 9 | 0.00 | +----+-------------+-------+-------+-------+-------+ 3 rows in set (0.00 sec)
Următorul exemplu selectează coloanele nume
și clasa
din același tabel.
mysql> select nume , clasa from elevi; +-------------+-------+ | nume | clasa | +-------------+-------+ | Popescu Ion | 12 | | Ionescu Ana | 11 | | Pop Vasile | 12 | +-------------+-------+ 3 rows in set (0.00 sec)
Următorul exemplu selectează coloana nume
și o expresie calculată (media notelor), în două variante. Observați în al doilea exemplu prezența clauzei AS
, și efectul ei.
mysql> select nume , (nota1+nota2)/2 from elevi; +-------------+-----------------+ | nume | (nota1+nota2)/2 | +-------------+-----------------+ | Popescu Ion | 7.5000 | | Ionescu Ana | 8.0000 | | Pop Vasile | 9.5000 | +-------------+-----------------+ 3 rows in set (0.09 sec)
mysql> select nume , (nota1+nota2)/2 as Media from elevi; +-------------+--------+ | nume | Media | +-------------+--------+ | Popescu Ion | 7.5000 | | Ionescu Ana | 8.0000 | | Pop Vasile | 9.5000 | +-------------+--------+ 3 rows in set (0.00 sec)
Clauza WHERE
Clauza WHERE
permite selectarea înregistrărilor care respectă anumite condiții.
Exemple
Următorul exemplu selectează înregistrările corespunzătoare elevilor din clasa a 12-a.
mysql> select * from elevi where clasa=12; +----+-------------+-------+-------+-------+-------+ | id | nume | clasa | nota1 | nota2 | media | +----+-------------+-------+-------+-------+-------+ | 1 | Popescu Ion | 12 | 7 | 8 | 0.00 | | 3 | Pop Vasile | 12 | 10 | 9 | 0.00 | +----+-------------+-------+-------+-------+-------+ 2 rows in set (0.00 sec)
Următorul exemplu selectează numele elevilor din clasa a 12-a care au media cel puțin 8
.
mysql> select nume from elevi where clasa=12 and (nota1+nota2)/2>=8; +------------+ | nume | +------------+ | Pop Vasile | +------------+ 1 row in set (0.00 sec)
Următorul exemplu selectează elevii al căror nume conține șirul @'escu'@
mysql> select * from elevi where nume like '%escu%'; +----+-------------+-------+-------+-------+-------+ | id | nume | clasa | nota1 | nota2 | media | +----+-------------+-------+-------+-------+-------+ | 1 | Popescu Ion | 12 | 7 | 8 | 0.00 | | 2 | Ionescu Ana | 11 | 7 | 9 | 0.00 | +----+-------------+-------+-------+-------+-------+ 2 rows in set (0.00 sec)
Ordonarea înregistrărilor
Implicit, comanda SELECT
extrage înregistrările în ordinea fizică a acestora. Acest comportament poate fi modificat utilizând clauza ORDER BY
. Ordonarea este crescătoare sau descrescătoare, în funcție de prezența clauzelor ASC
– ordine crescătoare, implicită, sau DESC
– ordine descrescătoare. Clauza ORDER BY
nu poate apărea în comandă înaintea clauzei WHERE
Exemple
Următorul exemplu selectează elevii alfabetic după nume.
mysql> select * from elevi order by nume ; +----+-------------+-------+-------+-------+-------+ | id | nume | clasa | nota1 | nota2 | media | +----+-------------+-------+-------+-------+-------+ | 2 | Ionescu Ana | 11 | 7 | 9 | 0.00 | | 3 | Pop Vasile | 12 | 10 | 9 | 0.00 | | 1 | Popescu Ion | 12 | 7 | 8 | 0.00 | +----+-------------+-------+-------+-------+-------+ 3 rows in set (0.46 sec)
Următorul exemplu selectează numele și media elevilor din clasa a 12-a, descrescător după medie.
mysql> select nume as 'Numele si prenumele', (nota1+nota2)/2 as 'Media' -> from elevi -> where clasa=12 -> order by (nota1+nota2) desc -> ; +---------------------+--------+ | Numele si prenumele | Media | +---------------------+--------+ | Pop Vasile | 9.5000 | | Popescu Ion | 7.5000 | +---------------------+--------+ 2 rows in set (0.00 sec)
Limitarea rezultatelor
În anumite situații (rezultatul interogării este prea mare), se dorește limitarea numărului de înregistrări. Acest lucru este posibil prin intermediul clauzei LIMIT
. Aceasta poate avea 1 sau 2 parametri și nu poate apărea înaintea clauzelor WHERE
și ORDER BY
.
- dacă avem un singur parametru, acesta reprezintă numărul de înregistrări care vor fi întoarse
- dacă avem doi parametri, primul reprezintă numărul de ordine al primei înregistrări întoarse, iar al doilea reprezintă numărul de înregistrări întoarse
Exemple
mysql> select * from elevi limit 2 ; +----+-------------+-------+-------+-------+-------+ | id | nume | clasa | nota1 | nota2 | media | +----+-------------+-------+-------+-------+-------+ | 1 | Popescu Ion | 12 | 7 | 8 | 0.00 | | 2 | Ionescu Ana | 11 | 7 | 9 | 0.00 | +----+-------------+-------+-------+-------+-------+ 2 rows in set (0.00 sec)
mysql> select * from elevi limit 1,2 ; +----+-------------+-------+-------+-------+-------+ | id | nume | clasa | nota1 | nota2 | media | +----+-------------+-------+-------+-------+-------+ | 2 | Ionescu Ana | 11 | 7 | 9 | 0.00 | | 3 | Pop Vasile | 12 | 10 | 9 | 0.00 | +----+-------------+-------+-------+-------+-------+ 2 rows in set (0.00 sec)