Sunteți pe pagina 1din 34

BAZE DE DATE

6. INSTRUCȚIUNEA SELECT ÎN MySQL

lect. univ. Tîrșu Valentina


Conținut

1. Instrucțiunea SELECT
2. Generarea listei de ieșire (proiecție)
3. Sortarea datelor (ORDER BY)
4. Selectarea datelor (SELECT)
5. Predicate de formare a expresiilor logice
6. Funcții MySQL
7. Gruparea datelor – GROUP BY
8. Gruparea datelor – HAVING
Obiective

 Să definească noțiunea proiecție la interogarea BD


 Să definească noțiunea selecție la interogarea BD
 Să aplice expresii logice la interogarea BD
 Să descrie funcțiile agregat
 Să aplice funcțiile agregat la interogarea BD
 Să efectuieze grupări după mai multe câmpuri la interogarea BD
1. Instrucțiunea SELECT

Caracteristici:
- rezultatul interogarii SELECT (result set) seamană cu un tabel;
- result set este un ansamblu de rânduri și coloane, fiecare coloană
are o denumire dată de server sau aleasă de catre noi;
- datele provin din una sau mai multe tabele, total sau parțial, astfel:
- Toate atributele tabelului indicat;
- Un set din atributele tabelului indicat (proiecția);
- O parte din înregistrărișe tabelului indicat (selecție);
- Prelucrări aplicate informatiilor din coloane (aplicarea funcțiilor predefinite).
1. Instrucțiunea SELECT

Sintaxa:
SELECT [{ ALL | DISTINCT }] { lista_coloane | * }
FROM nume_tabel1 [ AS alias1 ] [, nume_tabel2 [ AS alias2 ].,..]
[ WHERE conditie_selectare_inregistrari ]
[ GROUP BY { nume_coloana | expresie }.,.. ]
[ HAVING conditie_selectare_grup ]
[ { UNION [ALL] | INTERSECT | EXCEPT }
SELECT <interogare 2> ]
[ ORDER BY nume_camp1 | intreg [ ASC | DESC ]
[, nume_camp2 | intreg [ ASC | DESC ].,..]];

Exemplu:
select * from departs;
select name, post from emp;
1. Instrucțiunea SELECT

arte Descriere
Unul dintre următoarele predicate: ALL, DISTINCT, DISTINCTROW sau
TOP. Utilizați predicatul pentru a restricționa numărul de înregistrări
predicat
returnate. Dacă nu este specificat niciun predicat, valoarea implicită este
ALL.
Specifică faptul că sunt selectate toate câmpurile din tabelul sau tabelele
*
specificate.
Numele tabelului care conține câmpurile din care sunt selectate
tabel
înregistrările.
Numele câmpurilor care conțin datele pe care doriți să le regăsiți. Dacă
câmp1, câmp2 includeți mai multe câmpuri, acestea sunt regăsite în ordinea listată.

Numele de utilizat ca anteturi de coloană în locul numelor de coloană


alias1, alias2
originale din tabel.
Numele tabelului sau tabelelor care conțin datele pe care doriți să le
Expresie tabel
regăsiți.
1. Instrucțiunea SELECT
2. Generarea listei de ieșire (proiecție)
Sintaxa generală pentru lista de ieșiri:
[{all | distinct}] { * | expresie1 [alias1] [, expresie2 [alias2] .,..]}

Lista coloanelor extrase sunt amplasate între cuvintele cheie SELECT și FROM.
1. Afișarea tuturor coloanelor tabelului Project:
SELECT * FROM projects;
2. Afișarea angajaților cu indicarea funcției și departamenului din care fac parte:
SELECT e_depart e_fname, e_lname, e_post
FROM employees;
3. Afișarea angajaților cu indicarea postului și salariul acestora:
SELECT e_fname AS "Nume", e_lname AS "Prenume", e_post AS "Functia“,
e_salary*0.86 AS "Salariu"
FROM employees;
4. Afișați listei angajaților cu vârsta acestora:
SELECT e_fname AS "Nume", e_lname AS "Prenume",
YEAR(CURRENT_DATE())-YEAR(e_born) AS "Varsta"
FROM employees;
2. Generarea listei de ieșire (proiecție)
5. Afișarea funcțiilor și salariilor angajaților:
SELECT e_post, e_salary
FROM employees;

6. Afișarea înregistrărilor unicale cu referire la funcțiile și salariile angajaților:


SELECT DISTINCT e_post, e_salary
FROM employees;

7. Afișarea înregistrărilor unicale cu referire la departamente și funcțiile ce le încadrează:


SELECT DISTINCT e_depart, e_post
FROM employees;

8. Sarcină:
a) de afișat lista angajaților cu numele complet, data nașterii și adresa.
b) de afișat lista proiectelor cu șefii de proiect și compania ce a solicitat proiectul.
c) de afișat lista proiectelor,, perioada de realizare (în ani) și costul.
3. Sortarea datelor (ORDER BY)
1. Afișarea datelor din tabelul Project în ordinea datei de începere a proiectului:
SELECT * FROM projects
ORDER BY p_begin;
2. Sortarea angajaților în ordine crescătoare pentru fiecare departament:
SELECT e_depart, e_fname, e_lname
FROM employees
ORDER BY e_depart, e_fname;
3. Sortarea angajaților după salariu (de la cel mai mare la cel mai mic):
SELECT e_fname AS "Nume", e_lname AS "Prenume",
e_post AS "Functia", e_salary AS "Salariu“
FROM employees
ORDER BY 4 DESC;
4. Sortarea datelor după departamente, funcții și salarii:
SELECT e_depart AS "Departament", e_post AS "Functia", e_salary AS "Salariu„
FROM employees
ORDER BY 1, 3 DESC, 2;
Sarcină:
a) afișarea listei angajaților sortați după data nașterii.
b) afișarea listei proiectelor cu șefii de proiect, sortată după compania ce a solicitat proiectul și anul
4. Selectarea datelor (SELECT)
WHERE - conține condiții pentru selectarea înregistrărilor individuale. Condiția este o expresie logică și
poate lua una din cele 3 valori:
 TRUE – adevarat,
 FALSE – fals,
 NULL - valoare necunoscută, nedefinită (interpretată ca falsă). Condiția se formează prin aplicarea
diferiților operatori și predicate.

Operatori relaționali: =, >=, <>, !=, <=, >, <.

1. Afișarea listei angajaților departamentului Proiectare:


SELECT * FROM employees
WHERE e_depart = "Proiectare";
2. Afișarea proiectelor curente:
SELECT * FROM projects
WHERE p_end > current_date;
Sarcină:
a) afișarea listei proiectelor realizate de departamentul Design interior.
b) afișarea listei angajaților ce au un salariu mai mare de 1000 lei.
4. Selectarea datelor (SELECT)

Operatori logici
La formarea expresiilor logice ce includ două și mai multe criterii de selecție sunt utilizați următorii
operatori logici::
 AND – înmulțirea logică,
 OR – suma logică,
 NOT - valoare necunoscută, nedefinită (interpretată ca falsă). Condiția se formează prin aplicarea
diferiților operatori și predicate.

a b a AND b a b a OR b

0 0 0 0 0 0

0 1 0 a NOT a 0 1 1

1 0 0 0 1 1 0 1

1 1 1 1 0 1 1 1
4. Selectarea datelor (SELECT)
1. Afișarea listei angajaților departamentului Proiectare ce au un salariu mai mare de 8000 lei:
SELECT * FROM employees
WHERE e_depart = "Proiectare“ AND e_salary >10000;
.
2. Afișarea listei angajaților-bărbați cu anul nașterii după 1979:
SELECT * FROM employees
WHERE e_born > "1979-12-31" AND e_sex = "m";
3. Afișarea listei angajaților din departamentele: Design interior, Design exterior cu un salariu
mai mic de 8000 lei:
SELECT * FROM employees
WHERE (e_depart = "Design interior" OR e_depart = "Design exterior") AND e_salary < 8000;
4. Afișarea listei tuturor angajaților cu excepția angajaților departamentelor Financiar ;I Resurse
umane:
SELECT * FROM employees
WHERE NOT (e_depart = "Finaciar" OR e_depart = "Resurse umane");
4. Selectarea datelor (SELECT)
Sarcini:

1. Lista proiectelor curente ce au un cost mai mare de 2 mln. lei.

2. Lista angajaților, angajați în funcția de arhitect și arhitect principal.

3. Lista angajaților, angajați în funcția de secretar și au un salariu mai mare de


4000 lei.
4. Selectarea datelor (SELECT)
Rezolvări:

1.
SELECT * FROM projects
WHERE p_end > current_date AND p_cost > 2000000;

2. SELECT * FROM employees


WHERE e_post ="Arhitect" OR e_post = "Arhitect principal";

3. SELECT * FROM employees


WHERE e_post ="Secretar" AND e_salary > 4000;
5. Predicate de formare a expresiilor logice

Predicatul de intrări într-o listă de valori:


nume_coloană IN ( valoare1 [, valoare2,... ] )
expresie IN (valoare1 [, valoare2,... ] )

Exemple:
1. Lista angajaților ce au codul de angajare 7, 11, 13 și 20
SELECT * FROM employees
WHERE e_id IN (7, 11, 13, 20);

2. Lista angajaților ce dețin funcția de arhitect și arhitect principal


SELECT * FROM employees
WHERE e_post IN (“Arhitect”, “Arhitect principal” );
5. Predicate de formare a expresiilor logice

Predicatul de intrări într-un domeniu de valori:


nume_coloană BETWEEN valoare _min AND valoare_max
expresie BETWEEN valoare _min AND valoare_max
Valoarea minimă poate fi mai mică sau egală cu cea maximă.

Exemple:
1. Lista angajaților ce au codurile de angajare de 5 la 15:
SELECT * FROM employees
WHERE e_id BETWEEN 5 AND 15;

2. Lista angajaților ce au un salariu din intervalul 8 mii și 10 mii lei:


SELECT * FROM employees
WHERE e_salary BETWEEN 8000 AND 10000;
5. Predicate de formare a expresiilor logice
Predicat - șablon, pentru căutarea valorilor:
nume_coloană LIKE ‘sablon’
Acest predicat poate fi aplicat unui câmp de tipul CHAR sau VARCHAR.
Simboluri utilizate la crearea șabloanelor:
‘_’ - un oarecare symbol,
‘%’ - o oarecare cantitate de simboluri (inclusive și un simbol).
Exemple:
1. Lista tuturor angajaților – arhiteți:
SELECT * FROM employees
WHERE e_post LIKE “%arhitect%”;
2. Lista tuturor angajaților arhiteți specialiști, cu excepția arhitecților simpli:
SELECT * FROM employees
WHERE e_post
5. Predicate de formare a expresiilor logice
Predicat de căutare a valorilor necunoscute:
valoare IS [NOT] NULL
Dacă valoarea este nedefinită (NULL), atunci predicatul IS NULL va genera constanta TRUE, iar predicatul
IS NOT NULL va genera constanta FALSE.

Exemple:
1. Lista tuturor proiectelor ce nu au inregistrată data de finisarede facto:
SELECT * FROM projects
WHERE p_finish IS NULL;
5. Predicate de formare a expresiilor logice
Utilizarea predicatelor:
Sarcini:

1. Lista angajaților, prenumele cărora începe cu M.

2. Lista proiectelor ce au un cost din intervalul [10 mii : 1 mln.] lei.

3. Lista angajaților născuți în perioada anilor ’80.


5. Predicate de formare a expresiilor logice
Utilizarea predicatelor:
Rezolvări:

1. SELECT * FROM employees


WHERE upper(e_fname) LIKE "M%";

2. SELECT * FROM projects


WHERE p_cost BETWEEN 10000 AND 10000000;

3. SELECT e_fname AS "angajatul", e_post AS "Functia" , e_born AS "Anul nasterii“


FROM employees
WHERE e_born BETWEEN "1980-01-01" AND "1989-12-31";
5. Predicate de formare a expresiilor logice
Emiterea rezultatelor parțiale:
Sintaxa:
SELECT … [ORDER BY … ] [ LIMIT{număr | expresie} ]

SELECT * FROM employees


ORDER BY e_fname DESC
LIMIT 1, 10;
6. Funcții MySQL
Funcții agregat
COUNT - numărarea numărului de înregistrări. Se aplică înregistrărilor și câmpurilor de orice
tip. Are 3 formate de apel:
 count (*) - numărul liniilor rezultat;
 count (denumire_câmp) - numărul de valori care nu sunt nule pentru câmpul specificat.
 count (DISTINCT denumire _câmp ) - numărul de valori distincte care nu sunt NULL în
câmpul specificat.
MAX, MIN - definește valoarea maximă (minimă) a câmpului specificat în setul de rezultate.
Se aplică câmpurilor de orice tip.
SUM - definește suma aritmetică a valorilor câmpului numeric specificat în setul de
înregistrări rezultat.
AVG - determină media aritmetică a valorilor câmpului numeric specificat în setul de
înregistrări rezultat. Nu include valori NULL, iar suma valorilor câmpului este împărțită la
numărul de valori definite.
6. Funcții MySQL

Funcții pentru tipul DATE


DAYNAME (date) - numele (în engleză) a zilei din data specificată
MONTHNAME (date) - numele (în engleză) al lunii din data specificată
YEAR (date) - extrage anul din data specificată
HOUR (time) - extrage ora din timpul precizat
MINUTE (time) - extrage minutul din timpul precizat
SECOND (time) - extrage secunda din timpul precizat
CURDATE ( ) sau CURRENT_DATE() - întoarce data curentă în format 'YYYY-MM-DD'
CURTIME ( ) - întoarce ora curentă în format 'HH:MM:SS'
NOW ( ) sau SYSDATE ( ) - întoarce data și ora curentă în format 'YYYY-MM-DD HH:MM:SS'
DATE_ADD (date, INTERVAL expr type) unde date este o dată calendaristică sau un câmp de tip dată,
iar expr este un număr întreg care reprezintă numărul de zile (sau ore, minute, secunde, săptămâni, luni etc.)
care vor fi adăugate (sau scăzute) la data curentă.
Exemplu: SELECT date_add(now(),interval 3 day); - această comandă adaugă 3 zile la data curentă.
6. Funcții MySQL

Funcții pe șiruri de caractere


CONCAT (str1, str2,...) - concatenează șirurile primite ca argument, returnând șirul
rezultat.
LENGTH (str) - întoarce lungimea (numărul de caractere) a șirului primit ca argument.
LEFT (str, len) - întoarce un șir format din primele len caractere din șirul dat.
RIGHT (str,len) - întoarce un șir format din ultimele len caractere din șirul dat.
SUBSTRING (str, pos, len) sau MID (str, pos, len) - întorc subșirul de pe poziția pos,
de lungime len caractere din șirul str.
LTRIM (str) sau RTRIM (str) sau TRIM (str) - întoarce șirul str fără spațiile de la
început (LTRIM), sfârșit (RTRIM) sau din ambele părți (TRIM).
LOWER (str) sau UPPER (str) - întorc șirul str cu toate caracterele convertite la litere
mici, respectiv litere mari.
6. Exemple de utilizare a funcțiilor agregat.
1. Afișarea costului maximal și minimal al proiectelori:
SELECT max(p_cost) "Cost maximal", min(p_cost) "Cost minimal"
FROM projects;

2. Afișarea sumei achitate angajaților departamentului Design interior:


SELECT sum(e_salary) FROM employees
WHERE e_depart = "design interior";

3. Afișarea salariului mediu pentru angajatele entității economice:


SELECT avg(e_salary) FROM employees
WHERE e_sex = „f";

4. Afișarea datei de început pentru primul proiect și data de finisare al ultimului proiect:
SELECT min(p_begin), max(p_end)
FROM projects;
6. Exemple de utilizare a funcțiilor agregat.
5. Numărul de angajați:
SELECT count(*)
FROM employees;

6. Numărul de angajați pentru departamentul Design interior:


SELECT count(e_id) FROM employees
WHERE e_depart = "design interior";

7. Afișarea numărului de funcții distincte prevăzute la entitate:


SELECT count(DISTINCT e_post)
FROM employees

8. Sarcină: Numărul de proiecte care nu au înregistrată data de finisare – de facto (au fost finisate
în perioada prestabilită):
7. Gruparea datelor – GROUP BY

Funcțiile agregate sunt de obicei utilizate împreună cu clauza GROUP BY.


De exemplu, următoarea comandă contorizează numărul de angajați pe departamente:

SELECT e_depart, count(*) e_depart count(*)


FROM employees
Design exterior 5
GROUP BY e_depart;
Design interior 4
Finaciar 2
Proiectare 8
Resurse umane 1
7. Gruparea datelor – GROUP BY

Exemple de utilizare a clauzei GROUP BY:


1. De afișat salariu minimal și maximal pentru fiecare departament:
SELECT e_depart, min(e_salary) “salariu minim”, max(e_salary) “salariu maxim”
FROM employees
GROUP BY e_depart;
2. De afișatlista unicală cu funcții pentru fiecare departament:
SELECT e_depart, count(DISTINCT e_post) NrFunctii
FROM employees
GROUP BY e_depart;
3. Suma salariilor achitate pentru fiecare departament:
SELECT e_depart, sum(e_salary) AllSalary
FROM employees
GROUP BY e_depart;
4. Media salariilor achitate pentru fiecare funcție:
SELECT e_post, avg(e_salary) avgSalary
FROM employees
GROUP BY e_post;
7. Gruparea datelor – GROUP BY

Regula de utilizare a clauzei GROUP BY:


În lista de ieșire, la utilizarea instrucțiunii GROUP BY, vor fi specificate doar
funcțiile agregat, constante și câmpuri enumerate în GROUP BY.

De exemplu, nu puteți obține informații despre angajații care au cel mai mare salariu în
departamentul lor folosind această interogare:

SELECT e_depart, e_fname, max(e_salary) AS max_salary


FROM employees
GROUP BY e_depart;
Această interogare v-a genera salariul maxim pentru fiecare department, iar valoarea din
câmpul e_fname nu va corespunde salariului maxim.
7. Gruparea datelor – GROUP BY

Gruparea după mai multe câmpuri

1. Suma salariilor grupate pe departamente și funcții


SELECT e_depart, e_post, count(*), sum(e_salary) AS salary
FROM employees
GROUP BY e_depart, e_post;
ORDER BY e_depart;
2. Numărul de femei și bărbați pe departamente
SELECT e_depart, e_sex, count(*)
FROM employees
GROUP BY e_depart, e_sex
ORDER BY e_depart;
3. Sarcină: Informația despre salariul și numărul de angajați ce primesc același salariu.
8. Gruparea datelor – HAVING

 Clauza HAVING permite introducerea unor restricţii care sunt aplicate grupurilor de
tupluri, deci nu tuplurilor "individuale", aşa cum "face" clauza WHERE. Din tabelul
rezultat sunt eliminate toate grupurile care nu satisfac condiţia specificată.
 Clauza HAVING "lucrează" împreună cu o clauză GROUP BY, fiind practic o clauză
WHERE aplicată acesteia.
.
Exemplu: Lista departamentelor în care activează mai multe de 5 persoane:
SELECT e_depart, count(*) “personae”
FROM employees
GROUP BY e_depart
HAVING count(*)>5
Atenție! nu puteți specifica funcții agregate în clauza WHERE - este o eroare de sintaxă!

Sarcină: De afișat lista departamentelor, care au înregistrat salariul mediu mai mare de 5000.
Recapitulare

 Relatați despre intrările/ieșirile interogărilor (SELECT).


 Descrieți sintaxa clauzei SELECT.
 Relatați despre clauza WHERE.
 Relatați despre clauza ORDER BY.
 Identificați operatorii utilizați la scrierea interogărilor.
 Descrieți tipurile de predicate utilizate la crearea expresiilor logice.
 Descrieți funcțiile agregate utilizate la crearea interogărilor.
 Relatați despre clauza GROUP BY și HAVING.
Bibliografie

 https://www.competentedigitale.ro/mysql/t4.php

S-ar putea să vă placă și