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. ClauzaFROMnume_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)