0% au considerat acest document util (0 voturi)
37 vizualizări19 pagini

SQL

Documentul conține instrucțiuni SQL pentru gestionarea unei baze de date numită 'firma8', incluzând operațiuni de creare, citire, actualizare și ștergere a datelor. Se detaliază structura tabelei 'angajati', precum și interogări pentru a insera, actualiza și selecta date despre angajați, inclusiv condiții specifice pentru filtrarea rezultatelor. De asemenea, sunt prezentate funcții de agregare și manipulare a datelor, cum ar fi calcularea salariilor și vârstei angajaților.

Încărcat de

teasteptjoi
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
37 vizualizări19 pagini

SQL

Documentul conține instrucțiuni SQL pentru gestionarea unei baze de date numită 'firma8', incluzând operațiuni de creare, citire, actualizare și ștergere a datelor. Se detaliază structura tabelei 'angajati', precum și interogări pentru a insera, actualiza și selecta date despre angajați, inclusiv condiții specifice pentru filtrarea rezultatelor. De asemenea, sunt prezentate funcții de agregare și manipulare a datelor, cum ar fi calcularea salariilor și vârstei angajaților.

Încărcat de

teasteptjoi
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

-- Acesta este un comentariu

-- un comentariu incepe cu --

/*
aici
avem
un comentariu
pe mai multe randuri
*/

-- DDL
-- CREATE
-- sa se creeze baza de date firma
create database firma8;
-- DELETE
-- sa se sterga baza de date firma
drop database firma8;
-- sa se se specifice ce baza de date vom utiliza
use firma8;
-- use numele_bazei de date ESTE PRIMA INSTRUCTIUNE PE CARE O EXECUTATI
CAND INTRATI IN APLICATIE
-- READ
-- sa se afiseze o lista a bazelor de date
show databases;

/* tabela angajati
id int(11)
nume varchar(255)
data_nasterii date
pozitie varchar(255)
departament varchar(255)
salariu int(11)
*/
create table angajati
(
id int primary key auto_increment,
nume varchar(255),
data_nasterii date,
pozitie varchar(255),
departament varchar(255),
salariu int default 2500
);
-- sa se afiseze o descriere a structurii tabelei angajati
describe angajati;
-- auto_incrementul functioneaza pe principiul last insert id
-- daca ultimul inserat a fost 7 o sa insereze 8

-- sa se afiseze o lista a tabelelor din baza de date firma


show tables;
-- sa se afiseze tabela ce contine coloana pozitie din baza de date firma
select table_name from
information_schema.columns
where column_name='pozitie' and table_schema='firma8';

-- UPDATE
-- sa se insereze o noua coloana in tabela angaajti numita obs
alter table angajati add column obs varchar(255) default 'obs1';
-- sa se schimbe coloana obs in observatii si sa fie dupa data_nasterii
alter table angajati change column obs observatii varchar(100)
default null after data_nasterii;
-- sa se stearga coloana observatii;
alter table angajati drop column observatii;

-- DDL
-- create-ul este cu create
-- read-ul este cu show
-- update-ul este cu alter
-- delete-ul este cu drop
-- DML

/*
id nume data_nasterii pozitie departament salariu
1 Bogdan Florea 1983-03-27 Programator Soft 5000
2 Ana Patrascu 1987-12-12 Secretara Marketing 2500
3 George Mihalache 1977-09-14 Director Management 8500
4 Carmelita Stoian 1983-06-06 Vanzator Sales 5000
5 Andrei Ionescu 1982-08-15

*/
-- sa se insereze datele de mai sus
-- create-ul din DML --> insert
/* tabela angajati
id int(11)
nume varchar(255)
data_nasterii date
pozitie varchar(255)
departament varchar(255)
salariu int(11)
*/
insert into angajati values
(1 ,'Bogdan Florea', '1983-03-27', 'Programator', 'Soft', 5000),
(null,'Ana Patrascu', '1987-12-12', 'Secretara', 'Marketing', 2500),
(null, 'George Mihalache', '1977-09-14','Director', 'Management', 8500);
-- ordinea pe care o am la inserare corespunde ordinii de la crearea tabelului
-- pentru a avea o alta ordine trebuie trecuta noua ordine
-- sa se afiseze datele inserate
select * from angajati;
-- sa se insereze Carmelita Stoian
insert into angajati(data_nasterii, pozitie, salariu, nume, departament,id) values
('1983-06-06','Vanzator',5000, 'Carmelita
Stoian','Sales',4);

insert into angajati(nume, data_nasterii, id) values


("Andrei Ionescu","1982-08-15",5);

-- Proiectati o interogare ce va insera 3 angajati in departamentul Sales


-- Inspector, 4500, 9 septembrie 2000, Cristian Harabor
-- Ion Ion Harabor, 19 decembrie 2000, 9650, Director
-- Manager, 2000 9 aprilie, 7650, Maria Harabor

insert into angajati(pozitie,salariu, data_nasterii,nume, departament,id) values


("inspector", 4500, "2000-09-09","Cristian Harabor","sales",6);
insert into angajati (salariu,pozitie,data_nasterii,departament,nume,id) values
(9650 ,"director", "2000-12-19","sales", "Ion Ion Harabor",7);
insert into angajati(nume,pozitie,salariu,departament,data_nasterii,id) values
("Maria Harabor", "manager", 7650,"sales", "2000-04-09",8);

-- sa se dea functia de programator lui Andrei Ionescu


update angajati set pozitie="Programator" where id=5;

-- Proiectati o interogare ce va afisa: id-ul, numele si data nasterii tuturor angajatilor.


select id, nume, data_nasterii from angajati;
-- intre select si from trecem numele coloanelor sau formulele
-- dupa from trecem numele tabelei / tabelelor din care fac parte coloanele

-- sa se afiseze id, numele si anul nasterii pentru toti angajatii


select id , nume , year(data_nasterii) as anul_nasterii from angajati;

-- sa se afiseze toti angajatii cu salariul mai mare decat 3000


select * from angajati where salariu >3000;
-- in where punem filtru(conditiile pe care trebuie sa le respecte)

-- sa se afiseze toti angajatii din sales


select * from angajati where departament="Sales";

-- sa se afiseze toti angajatii nascuti inainte de 89


select * from angajati where data_nasterii<'1989-01-01';
select id, nume, year(data_nasterii) as anul_nasterii from angajati where
year(data_nasterii)<1989;
select id, nume, year(data_nasterii) as anul_nasterii from angajati having anul_nasterii<1989;
-- sa se afiseze toti angajatii nascuti inainte de 89 din departamentul sales
select * from angajati where departament="Sales" and year(data_nasterii)<1989;
select *,year(data_nasterii) as anul_nasterii from angajati
where departament="Sales" having anul_nasterii<1989;
-- cand avem mai multe conditii intre conditii punem and

-- SA SE AFISEZE TOTI ANGAJATII DE LA SOFT SI SALES


select * from angajati where departament ='soft' or departament='sales';
select * from angajati where departament in ('soft','sales');

-- sa se afiseze toti angajatii cu salariul intre 2500 si 5000 inclusiv

select * from angajati where salariu >=2500 and salariu<=5000;


select * from angajati where salariu between 2500 and 5000;

select id, nume, departament, salariu from angajati where salariu>6000 and (departament =
"soft" or departament = "sales");

-- 8. Proiectati o interogare ce va afisa toti angajatii cu pozitia ‘Programator’ sau ‘Manager’.


select * from angajati where pozitie="Programator" or pozitie="Manager";
select * from angajati where pozitie in ("PrOgraMaTor","Manager");
-- sa se afiseze toti angajatii de la soft si sales si pe pozitia de programator sau drector
select * from angajati where departament in("Soft","Sales") and pozitie in("Programator",
"Director");

-- sa se afiseze toti angajatii ce nu sunt programatori sau directori


select * from angajati where pozitie<>'programator' and pozitie<>'director';
select * from angajati where pozitie!='programator' and pozitie!='director';
select * from angajati where pozitie not in('programator','director');
select * from angajati where not pozitie in('programator','director');

-- sa se afiseze data curenta


select now();

-- 1. Sa se afiseze toti angajatii nascuti dupa 2000 din departamentul soft si sales de pe pozitia
de director
SELECT *, year(data_nasterii) AS anul_nasterii FROM angajati
WHERE departament IN ('Sales', 'Soft') AND pozitie IN ('Director') HAVING
anul_nasterii>=2000 ;

-- 2. Sa se afiseze toti angajatii nascuti intr-o luna de iarna


SELECT *, month(data_nasterii) as luna_nasterii FROM angajati
WHERE month(data_nasterii) IN (12, 01, 02);

-- 3. Sa se afiseze toti angajatii cu salariul intre 3000 si 6000 din departamentul soft si sales
SELECT * FROM angajati WHERE departament IN ('Soft', 'Sales') AND salariu BETWEEN
3000 AND 6000;

-- 4. Sa se afiseze toti angajatii nascuti in zodia leu


SELECT *, date_format(data_nasterii, '%m-%d') AS ziua_luna FROM angajati
HAVING ziua_luna BETWEEN '07-23' AND '08-22';

select * from angajati


where (month(data_nasterii) = 7 and day(data_nasterii)>=23)
or (month(data_nasterii) = 8 and day(data_nasterii)<=23);

SELECT dayofyear(now()); -- returneaza ziua din analyze


SELECT * FROM angajati WHERE dayofyear(data_nasterii) BETWEEN dayofyear('2000-
07-23') and dayofyear('2000-08-22');

-- functii de rotunjire
-- round()
select round(4.4);
-- rotunjire aritmetica ( ce depaseste 0.5 este in plus, ce este sub este in minus)
-- floor() sau rotunjirea in minus
select floor(4.999);
-- ceil() sau rotunjirea in plus
select ceil(4.0001);

-- datediff() calculeaza diferenta intre 2 date calendaristice


-- sa se afiseze numarul de zile ramase pana la craciun
select datediff('2025-12-24', now()); -- diferenta se calculeaza in zile

-- sa se afiseze numele, data_nasterii si varsta rotunjita pentru toti angajatii


select nume,data_nasterii, floor(datediff(now(), data_nasterii)/365.25) as varsta from angajati;

-- sa se afiseze toti angajatii cu varsta cuprinsa intre 30 si 41 de ani;


select nume,data_nasterii, floor(datediff(now(), data_nasterii)/365.25) as varsta from angajati
having varsta between 30 and 41;

-- sa se afiseze toti angajatii cu varsta cuprinsa intre 30 si 50 de ani pe pozitie de director sau
manager
select nume, pozitie, floor(datediff(now(), data_nasterii)/365) as varsta from angajati where
pozitie = "director" or pozitie = "manager" having varsta between 30 and 50 ;
select nume, pozitie, floor(datediff(now(), data_nasterii) / 365) as varsta from angajati where
(pozitie = 'manager' or pozitie = 'director')
and floor(datediff(now(), data_nasterii) / 365) between 30 and 50;
select id, nume, pozitie, floor(datediff(now(), data_nasterii)/365) as varsta from angajati
where pozitie in ("director","manager") having varsta between 30 and 50;

-- sa se afiseze toti angajatii cu salariul intre 1000 si 4000 si cu varsta intre 20 si 40


select nume, salariu, floor(datediff(now(), data_nasterii)/365) as varsta from angajati where
salariu between 1000 and 4000 having varsta between 20 and 40;

-- sa se afiseaze toti angajatii ordonati dupa salariu


select * from angajati order by salariu asc;
select * from angajati order by salariu desc;

-- sa se afiseze valoarea celui mai mare salariu


select salariu from angajati order by salariu desc limit 1; -- prin limit 1 am adus o singura
linie (prima)

-- FUNCTII TOTALIZATOARE (DE AGREGARE)


-- sa se afiseze valoarea celui mai mare salariu
select max(salariu) from angajati;
-- sa se afiseze valoaera celui mai mic salariu
select min(salariu) from angajati;
-- sa se afiseze suma salariilor
select sum(salariu) from angajati;
-- sa se afiseze media salariilor
select avg(salariu)from angajati;
-- sa se afiseze numarul de angajati;
select count(id) from angajati;
-- contorizarea va recomand sa o faceti dupa elementul unic
-- sa se afiseze cel mai bine platit angajat din dep sales
select nume, salariu, departament from angajati
where salariu =(select max(salariu)from angajati where departament='sales') and departament
= 'sales';
-- conditiile din interogarea de baza este obligatoriu a fi trecute si in subinterogare

-- sa se afiseze cel mai prost platit angajat de pe pozitia de director sau manager
select * from angajati
where salariu = (select min(salariu) from angajati where pozitie in ( 'director', 'manager')) and
pozitie in ( 'director', 'manager');

-- sa se afiseze cel mai varstnic angajat din firma

select *, floor(datediff(now(), data_nasterii)/365.25) as varsta from angajati


having varsta = (select max(floor(datediff(now(), data_nasterii)/365.25))from angajati);

-- sa se afiseze cel mai tanar angajat din departamentul sales sau soft
SELECT *, floor(datediff(now(), data_nasterii)/365.25) AS varsta from angajati
where departament in ('SALES', 'Soft')
having varsta = (select min(floor(datediff(now(), data_nasterii)/365.25))from angajati where
departament in ('SALES', 'Soft'));

Select * from angajati;


update angajati set data_nasterii='2021-12-12' where id=2;

-- sa se afiseze suma salariilor pe departamente


select departament, sum(salariu) from angajati
group by departament;

-- ORDINEA OPERANZIOR IN SELECT


-- SELECT -> FROM CU JOIN-URI-> WHERE -> GROUP BY -> HAVING -> ORDER
BY -> LIMIT
-- sa se afiseze departamentul cu cea mai mica suma a salariilor
select departament, sum(salariu) as total_salariu from angajati
group by departament
having total_salariu = (select sum(salariu) as total_salariu from angajati group by
departament order by total_salariu asc limit 1);
-- pozitia cu cel mai mic numar de angajati
select pozitie, count(id) as nr_angajati from angajati
group by pozitie
having nr_angajati = (select count(id) as nr_angajati from angajati group by pozitie order by
nr_angajati asc limit 1);
-- sa se afiseze cel mai bine platit angajat nascut inainte de 1989;
select * from angajati where year(data_nasterii)<1989 and salariu =(select max(salariu) from
angajati where year(data_nasterii)<1989);

-- functii pentru siruri de caractere


-- left() returneaza un numar fix de caractere de la stanga la dreapta
select left("abecedar",2);

-- right() retunrneaza un numar fix de caractere de la dreapta la stanga


select right("abecedar",5);

-- mid() returneaza un numar fix de caractere de stanga la dreapta pornind la un anumit


caracter
select mid("abecedar",3,4);

-- length() returneaza numarul de caractere din ce este format sirul de caractere


select length("abecedar");
select length(" ana are mere ");

-- trim() elimina spatiile goale de la stanga sau de la dreapta


select length(trim(" ana are mere "));

-- locate() localizeaza primul caracter cautat intr-un sir


select locate('o', 'a fost odata ca in povesti');

-- replace() inlocuieste un sir de caractere cu alt sir de caractere intr-un sir


select replace('ana are mere', 'ana','dana');
select replace('ana are banane', 'ana ','dana ');

-- substring_index() afiseaza tot ceea ce parcurge pana la intalnirea celui de-al n-lea caracter
cautat
select substring_index('a fost odata ca in povesti a fost ca niciodata','f',-2);

-- sa se afiseze toti angajatii al caror dep incepe cu s


select * from angajati where departament like 's%';

-- concat() retunrneaza mai multe siruri de caractere concatenate


select concat("ana ","are"," mere");
-- upper() lower() scriu sirul de caractere cu litere mari sau litere mici
select upper("ana are mere");
-- reverse() returneaza un sir de caractere inversat
select reverse("ana are mere");

select * from angajati


where nume like 'b%';
select * from angajati
where left(nume,1) = 'b';
select * from angajati
where locate('b',nume) =1;
select * from angajati
where mid(nume,1,1) = 'b';
select * from angajati
where substring_index(nume,'B',1)='';

select * from angajati


where right(replace(nume, right(nume, length(nume)-1),""),1)="B";
select * from angajati
where right(reverse(nume),1)="b";

-- sa se afiseze numele de familie al angajatilor


select *, substring_index(nume, ' ', -1) from angajati;

select *, trim(left(nume, ( length(nume) -length(substring_index(nume, ' ', -1)))))


from angajati;

select *, trim(replace(nume, substring_index(nume,' ',-1),''))from angajati;

-- sa se afiseze cel mai bine platit angajat al carui nume de familie incepe cu h
SELECT nume, salariu FROM angajati
WHERE SUBSTRING_INDEX(nume, ' ', -1) LIKE 'H%' AND salariu=(SELECT
MAX(salariu) FROM angajati WHERE SUBSTRING_INDEX(nume, ' ', -1) LIKE 'H%');

-- sa se afiseze cel mai bine platit angajat dintr-un departament ce incepe cu s si are varsta
intre 20 si 30 de ani
SELECT nume, salariu, departament, data_nasterii From angajati
WHERE Departament LIKE 'S%' AND floor(datediff(now(), data_nasterii)/365.25) between
20 and 30
and salariu=(select max(salariu)From angajati
WHERE Departament LIKE 'S%' AND floor(datediff(now(), data_nasterii)/365.25) between
20 and 30 )
;

-- sa se afiseze departamentul cu cel mai mare numar de angajati pentru departamentele al


caror nume incepe cu litera s
SELECT departament, COUNT(id) AS nr_angajati FROM angajati
where departament like 's%'
GROUP BY departament HAVING nr_angajati=
(SELECT COUNT(id) AS nr_angajati FROM angajati where departament like 's%'
GROUP BY departament ORDER BY nr_angajati desc limit 1);

-- sa se afiseze angajatul cu cel mai mic salariu dintre persoanele aflate in dep sales
-- nascute dupa 200
select nume, salariu, departament, data_nasterii from angajati
where departament = 'sales' and year(data_nasterii)>=2000 and salariu =
(select min(salariu)from angajati where departament ='sales' and year(data_nasterii) >=2000);
-- sa se afiseze toti angajatii ce au salariul mai mare decat media salariul pe firma
select nume, salariu from angajati
where salariu > ( select avg(salariu) from angajati);
-- sa se afiseze media salariilor pe departamente pentru departamentele management si
marketing
select avg(salariu), departament from angajati
where departament in ('management','marketing')
group by departament;

-- sa se afiseze cel mai bine platit angajat ce face parte parte din dep management sau
marketing si a caror pozitie incepe cu d sau savepoint

select * from angajati


where departament in ('management', 'marketing')
and (pozitie like 'd%' or pozitie like 's%')
and salariu = (select max(salariu)from angajati where departament in ('management',
'marketing')and (pozitie like 'd%' or pozitie like 's%'));

-- TEMA

-- 1. Sa se afiseze cel mai mic salariu dintre persoanele aflate in departamentul sales al caror
nume de familie incepe cu litera h
SELECT nume, salariu, departament FROM angajati
WHERE departament='sales' AND SUBSTRING_INDEX(nume, ' ', -1) LIKE 'H%' AND
salariu=
(SELECT MIN(salariu) FROM angajati WHERE departament='sales' AND
SUBSTRING_INDEX(nume, ' ', -1) LIKE 'H%');

-- 2. Sa se afiseze cel mai tanar angajat al carui nume de familie incepe cu h


SELECT nume, floor(datediff(now(), data_nasterii)/365.25) AS varsta FROM angajati
WHERE SUBSTRING_INDEX(nume, ' ', -1) LIKE 'H%' HAVING varsta=
(SELECT min(floor(datediff(now(), data_nasterii)/365.25)) FROM angajati WHERE
SUBSTRING_INDEX(nume, ' ', -1) LIKE 'H%'); -- sa se afiseze cine este cel mai tanar Leu
-- sa se afiseze prenumele persoanelor ce au varsta mai mare de 45 de ani

select *, trim(replace(nume, substring_index(nume,' ',-1),'')) as prenume from angajati


where floor(datediff(now(), data_nasterii)/365.25)>45;

-- sa se afiseze toti angajatii ce urmeaza sa isi serbeze ziua de nastere in luna curenta

select * from angajati


where (month(data_nasterii) = 2 and day(data_nasterii)between 8 and 28);

select * from angajati


where (month(data_nasterii)=month(now()) and day(data_nasterii)>day(now()));
-- sa se afiseze cel mai varstnic angajat dintr-un departament ce incepe cu litera s
-- sa se afiseze pozitia cu cea mai mare medie a salariilor
-- media de varsta pe pozitii
select pozitie, floor(avg(datediff(now(), data_nasterii)/365)) as varsta_medie from angajati
group by pozitie;

-- departamentul cu cea mai mare medie de varsta


select departament, floor(avg(datediff(now(), data_nasterii)/365)) as varsta_medie from
angajati group by departament
having varsta_medie = (select floor(avg(datediff(now(), data_nasterii)/365)) as varsta_medie
from angajati group by departament order by varsta_medie desc limit 1);
-- sa se afiseze prenumele persoanelor ce au varsta mai mare de 45 de ani

select *, trim(replace(nume, substring_index(nume,' ',-1),'')) as prenume from angajati


where floor(datediff(now(), data_nasterii)/365.25)>45;

-- sa se afiseze toti angajatii ce urmeaza sa isi serbeze ziua de nastere in luna curenta

select * from angajati


where (month(data_nasterii) = 2 and day(data_nasterii)between 8 and 28);

select * from angajati


where (month(data_nasterii)=month(now()) and day(data_nasterii)>day(now()));
-- sa se afiseze toti angajatii ce au salariul mai mare decat media salariilor pe firma

select * from angajati


where salariu > (select avg(salariu) from angajati);

-- sa se afiseze toti angajatii ce au salariul mai mare decat media salariilor aferente
dapartamentelor din care fac parte

select * from angajati as a


where [Link] > (select avg([Link]) from angajati as b where
[Link]=[Link]);

-- toti angajati care au salariu mai mare decat media salariilor pe firma
select nume, salariu from angajati
where salariu > (select avg(salariu) from angajati);

-- toti angajatii ce au varsta mai mare decat media de varsta de pe pozitii similare
select [Link], [Link], floor(datediff(now(), a.data_nasterii)/365) as varsta from angajati as
a
having varsta >=(select floor(avg(datediff(now(),b.data_nasterii)/365)) as varsta from
angajati as b where [Link]=[Link]);
use firma8;
-- sa se afiseze numele si data angajarii pentru fiecare angajat
ALTER TABLE angajati add column data_angajarii date;
select * from angajati;
alter table angajati drop column obs;
select rand(); -- genereaza numere aleatorii intre 0 si 1
select date_add('2025-02-08', interval-365 day);
select date_add('2025-02-08', interval+5 year);
SELECT floor(rand()*2000);
select date_add('2025-02-08', interval-floor(rand()*2000) day);
update angajati set data_angajarii=date_add('2025-02-08', interval-floor(rand()*2000) day);
select nume, data_angajarii from angajati;
-- sa se afiseze media de vechime pe departamente
select departament, floor(avg(datediff(now(),data_angajarii)/365)) as vechime from angajati
group by departament;
select departament, floor(avg(datediff(now(),data_angajarii)/365)) as ani,
floor((avg(datediff(now(),data_angajarii)/365)-
floor(avg(datediff(now(),data_angajarii)/365)))*12) as luni from angajati
group by departament;

select departament, concat(floor(avg(datediff(now(),data_angajarii)/365)), ' ani si ',


floor((avg(datediff(now(),data_angajarii)/365)-
floor(avg(datediff(now(),data_angajarii)/365)))*12), ' luni') as vechime from angajati
group by departament;

-- sa se construiasca coloana prenume

alter table angajati add column prenume varchar(255) after nume;

select * from angajati;

-- sa se completeze coloana prenume

update angajati set prenume = trim(replace(nume, substring_index(nume,' ',-1),''));

-- sa se completeze coloana nume. aceasta instructiune se ruleaza o sa singura data dupa ce


verificam completarea coloanei prenume

update angajati set nume = substring_index(nume,' ',-1);

-- sa se afiseze cine este cel mai vechi inspector

select *, floor(datediff(now(), data_angajarii)/365.25)as ani from angajati


where pozitie = 'inspector'
having ani = (select max(floor(datediff(now(), data_angajarii)/365.25))as ani from angajati
where pozitie = 'inspector');

-- sa se afiseze departamentul cu cea mai mare medie de varsta la angajare

select departament, floor(avg(datediff(data_angajarii,data_nasterii)/365.25)) as


varsta_angajare from angajati
group by departament
having varsta_angajare = (select floor(avg(datediff(data_angajarii,data_nasterii)/365.25)) as
varsta_angajare from angajati
group by departament order by varsta_angajare desc limit 1);

-- sa se afiseze numarul de angajati pe departamente

select departament, count(id) from angajati


group by departament;

-- sa se afiseze departamentul cu cel mai mic numar de angajati


select departament, count(id) as numar_angajati from angajati
group by departament
having numar_angajati = (select count(id) as numar_angajati from angajati group by
departament order by numar_angajati asc limit 1);

-- angajatul cu cel mai mare salariu din departamentul soft si ang cu cel mai mare sal din
sales
select nume, departament, salariu from angajati
where departament ='soft'
and salariu = (select max(salariu) from angajati where departament ='soft')
union
select nume, departament, salariu from angajati
where departament ='sales'
and salariu = (select max(salariu) from angajati where departament ='sales')
union
select nume, departament, salariu from angajati
where departament ='marketing'
and salariu = (select max(salariu) from angajati where departament ='marketing');

-- sa se afiseze angajatul cu cel mai mare salariu de pe fiecare departament


select [Link], [Link], [Link] from angajati a
where [Link] = (select max([Link]) from angajati b where [Link]=[Link]);

-- sa se actualizeze dep lui ionescu in soft


update angajati set departament = 'soft' where id=5;
-- sa se afiseze angajatul cu cel mai mic salariu din firma
select nume, salariu from angajati
where salariu = (select min(salariu) from angajati);
-- sa se afiseze media salariilor pe pozitii
select avg(salariu), pozitie from angajati
group by pozitie;
-- sa se afiseze numarul de angajati pe departamente
select count(id), departament from angajati
group by departament;
-- sa se afiseze dep cu cel mai mare nr de angajati
select departament, count(id) as numar_angajati from angajati
group by departament having numar_angajati=(select count(id) as numar_angajati from
angajati
group by departament order by numar_angajati desc limit 1);
-- sa se afiseze pozitia cu cea mai mare medie a salariilor
select pozitie, avg(salariu) as medie from angajati
group by pozitie having medie=(select avg(salariu) as medie from angajati
group by pozitie order by medie desc limit 1);

-- sa se afiseze toti angajatii ce au vechimea mai mare decat media vechimii pe firma
select *, floor(datediff(data_angajarii, data_nasterii)/365.25) as vechime from angajati
having vechime>(select floor(avg(datediff(data_angajarii, data_nasterii)/365.25 )) from
angajati);
-- sa se afiseze cel mai mic salariu aferent pozitiei de director sau amnager
select salariu, pozitie from angajati
where pozitie in ('Director', 'Manager') and salariu=(select min(salariu) from angajati where
pozitie in ('Director', 'Manager'));
-- sa se afiseze cel mai vechi angajat de pe fiecare pozitie

select *, floor(datediff(a.data_angajarii,a.data_nasterii)/365.25) as vechime from angajati as a


having vechime = (select max(floor(datediff(b.data_angajarii,b.data_nasterii)/365.25)) as
vechime from angajati as b where [Link]=[Link]);

select *, floor(datediff(data_angajarii,data_nasterii)/365.25) as vechime from angajati


having vechime = (select max(floor(datediff(b.data_angajarii,b.data_nasterii)/365.25)) as
vechime from angajati as b where [Link]=[Link]);

-- sa se actualizeze pozitia celui mai vechi inspector in manager


update angajati set pozitie ='Manager'
where id =(select id from (select* from angajati) as a where pozitie ='inspector' and
floor(datediff(data_angajarii,data_nasterii)/365) =
(select max(floor(datediff(data_angajarii,data_nasterii)/365)) from (select* from angajati) as
b where pozitie ='inspector'));

-- toti angajatii al caror prenume se termina in litera a


select * from angajati
where prenume like '%a';
-- sa se modifice numele dep din soft in software
update angajati set departament = 'software' where departament ='soft';

-- Id, nume, prenume, pozitia si varsta sub denumirile: ID, nume angajat, prenume angajat,
pozitia ocupata si Varsta
select id as ID, "nume" as "nume angajat", 'prenume' as 'prenume angajat', `pozitie` as
`pozitia ocupata`, floor(datediff(now(),data_nasterii)/365) as 'Varsta' from angajati;
-- ghilimele oblice se folosesc pentru numele de coloane, tabele.
-- sa se creasca salariul angajatilor din software cu 5%
update angajati set salariu = salariu*1.05 where departament = 'software';

-- TEMA

-- sa se realizeze o interogare ce micsoreaza salariile angajatilor de la sales cu 10%


update angajati set salariu = salariu*0.9 where departament = 'sales';

-- sa se afiseze varsta medie, vechimea medie, varsta la angajare medie, salariu mediu, salariu
mxim, salariul minim, suma salariilor pe departamente
select departament,
avg(datediff(now(),data_nasterii)/365) as varsta_medie,
avg(datediff(now(),data_angajarii)/365) as vechime_medie,
avg(datediff(data_angajarii,data_nasterii)/365) as varsta_angaj,
avg(salariu) as sal_mediu,
max(salariu) as sal_max,
min(salariu) as sal_min,
sum(salariu) as suma_sal
from angajati
group by departament
order by departament;
-- sa se afiseze cei mai vechi angajati de pe fiecare pozitie
-- sa se afiseze departametul cu cei mai multi directori

-- PASI PENTRU CREAREA TABELEI DEPARTAMENTE

-- PAS 1: CREAREA TABELI DEPARTAMENTE CU ID INT SI NUME_DEPARTAMENT


VARCHAR
-- PAS 2: COMPLETAT CU DATE TABELA DEPARTAMENTE (DEPARTAMENTELE
UNICE)
-- PAS 3: INTRODUCERE COLOANA ID_DEPARTAMENT IN TABELA ANGAJATI
-- PAS 4: POPULARE CU DATE COLOANA ID_DEPARTAMENT IN TABELA
ANGAJATI
-- PAS 5: STERS COLOANA DEPARTAMENT DIN ANGAJATI
-- PAS 6: CREAREA LEGATURILOR DINTRE TABELA ANGAJATI SI TABELA
DEPARTAMENTE

-- Pasul 1
create table departamente
(
id_departament int primary key auto_increment,
nume_departament varchar(255) not null unique
);

-- PAS 2
insert into departamente (nume_departament,id_departament) (select distinct departament,
null from angajati);
SELECT * FROM DEPARTAMENTE;

-- Pasul 3: inseram id_departament in tabelul angajati


alter table angajati add column id_departament int after pozitie;

-- Pasul 4: popularea cu date


update angajati as a set a.id_departament = (select b.id_departament from departamente as b
where [Link]= b.nume_departament);
select * from angajati;

-- Pasul 5: stergerea coloanei departament


alter table angajati drop column departament;

-- PAS 6: CREAREA LEGATURILOR DINTRE TABELA ANGAJATI SI TABELA


DEPARTAMENTE
alter table angajati add foreign key fk1(id_departament)
references departamente(id_departament) on delete cascade on update cascade;
-- on delete cascade (daca se va sterge un departament din tabela departamente se vor sterge
si angajatii corespunzatori din tabela angajati);

-- sa se insereze departamentul contabilitate


insert into departamente values(5, "Contabilitate");
select * from departamente;
select * from angajati;
insert into angajati (id, nume, prenume, data_nasterii, pozitie, salariu, data_angajarii) values
(9,"Bogdanovici","Bogdan","1992-05-08","Programator",8600,"2018-05-08");

-- sa se afiseze toate datele din tabela angajati si departamente


select * from angajati,departamente; -- pe fiecare angajat la trecut prin fiecare deprtament
(produs cartezian)
select * from angajati join departamente;

-- inner join (aduce elementele comune din cele doua tabela (departamentele cu angajati))
select * from angajati as a
inner join departamente as d
on a.id_departament=d.id_departament;
-- left join(aduce elementele comune si necomune din tabela din stanga lui join )
select * from angajati as a
left join departamente as d
on a.id_departament=d.id_departament;
-- right join(aduce elementele comune si necomune din tabela din dreapta lui join )
select * from angajati as a
right join departamente as d
on a.id_departament=d.id_departament;

select * from angajati as a left join departamente as d


on a.id_departament=d.id_departament
union
select * from angajati as a right join departamente as d
on a.id_departament=d.id_departament;

-- nr de angajati pe departament
-- la count e bine sa trecem intotdeauna elementul unic (id-ul)
select count([Link]) as nr_angajati, d.nume_departament
from angajati a
right join departamente d on a.id_departament=d.id_departament
group by d.nume_departament;

-- count(*) numara inclusiv randurile nule


select count(*) as nr_angajati, d.nume_departament
from angajati a
right join departamente d on a.id_departament=d.id_departament
group by d.nume_departament;

-- departamentele cu cel mai mic numar de angajati, exceptie departamentele fara angajati
select count(id) as nr_angajati, d.nume_departament
from angajati a
join departamente d on a.id_departament=d.id_departament
group by d.nume_departament
having nr_angajati = (select count(id) as nr_angajati from angajati group by id_departament
order by nr_angajati asc limit 1);

-- departamentele ce nu au niciun angajat


select count(id) as nr_angajati, d.nume_departament
from angajati a
right join departamente d on a.id_departament=d.id_departament
group by d.nume_departament
having nr_angajati = 0;

-- sa se afiseze suma salariilor pentru departamentele ce incep cu litera s pe departamente

select d.nume_departament, sum([Link]) as suma_salariilor from angajati as a


inner join departamente as d on a.id_departament=d.id_departament
where d.nume_departament like's%'
group by d.nume_departament;

select * from angajati;

-- sa se afiseze cel mai mic salariu al departamentului Sales si cui apartine

select [Link], [Link], [Link], d.nume_departament from angajati as a


inner join departamente as d on a.id_departament=d.id_departament
where d.nume_departament='sales'
and [Link]= (select min([Link]) from angajati as a inner join departamente as d on
a.id_departament=d.id_departament where d.nume_departament='sales');

-- sa se afiseze vechimea medie pe departamente

select d.nume_departament, floor(avg(datediff(now(),a.data_angajarii)/365.25)) as


vechime_medie from angajati as a
right join departamente as d on a.id_departament=d.id_departament
group by d.nume_departament;

-- sa se afiseze cel mai tanar angajat de la departamentul Sales

select d.nume_departament, [Link], [Link], floor(datediff(now(),a.data_nasterii)/365.25)


as varsta from angajati as a
inner join departamente as d on a.id_departament=d.id_departament
where d.nume_departament='sales'
having varsta = (select min(floor(datediff(now(),a.data_nasterii)/365.25)) as varsta from
angajati as a
inner join departamente as d on a.id_departament=d.id_departament
where d.nume_departament='sales');

-- angajatii ce au salariul mai mare decat media salariilor de pe firma


select [Link], [Link], [Link]
from angajati a
having [Link] > (select avg(salariu) from angajati);

-- angajatii ce au salariul mai mare decat media salariilor din dep din care fac parte
select [Link], [Link], [Link]
from angajati a
join departamente d on a.id_departament=d.id_departament
having [Link] > (select avg([Link]) from angajati as b join departamente d on
b.id_departament=d.id_departament and a.id_departament=b.id_departament);

-- cea mai mare medie a sal pe departamente luand in calcul doar departamentele ce incep cu
litera 's'
select avg([Link]) as medie_salariu, d.nume_departament
from angajati a
join departamente d on a.id_departament=d.id_departament
where d.nume_departament like 's%'
group by d.nume_departament
having medie_salariu =(select avg([Link]) as medie_salariu from angajati a
join departamente d on a.id_departament=d.id_departament
where d.nume_departament like 's%'
group by d.nume_departament order by medie_salariu desc limit 1);

-- cea mai mica suma a salariilor pe departamente luand in calcul doar persoanele nascute
inainte de 1989
select sum([Link]) as suma_salariu, d.nume_departament
from angajati a
join departamente d on a.id_departament=d.id_departament
where year(a.data_nasterii) < '1989'
group by d.nume_departament
having suma_salariu = (select sum([Link]) as suma_salariu from angajati a
join departamente d on a.id_departament=d.id_departament
where year(a.data_nasterii) < '1989'
group by d.nume_departament
order by suma_salariu asc limit 1);

-- sa se afiseze numarul de angajati de pe pozitia de director sau manager ce fac parte dintr-un
departament ce incep cu litera s
select count([Link]), [Link] from angajati as a inner join departamente as d on
a.id_departament=d.id_departament
where [Link] in ('Director', 'Manager') and d.nume_departament like 's%'
group by [Link];

-- sa se afiseze cel mai bine platit angajat de pe fiecare pozitie

select [Link], [Link], [Link], [Link] from angajati as a


where [Link] = (select max([Link]) from angajati as b where [Link]=[Link]);

-- sa se afiseze cea mai mare medie a salariilor pe departamente luand in calcul doar angajati
ce sunt pe pozitii ce incep cu litera M
select avg([Link]) as medie_salariu, d.nume_departament from angajati as a
join departamente d on a.id_departament=d.id_departament
where pozitie like 'm%'
group by d.nume_departament
having medie_salariu = (select avg([Link]) as medie_salariu from angajati as a
join departamente d on a.id_departament=d.id_departament
where pozitie like 'm%'
group by d.nume_departament
order by medie_salariu desc limit 1);

-- sa se afiseze toti angajatii ce sunt manageri si fac parte dintr-un departament ce are suma
salariilor mai mare de 10k

select [Link], [Link], [Link], d.nume_departament from angajati as a


join departamente d on a.id_departament=d.id_departament
where pozitie = 'Manager'
and (select sum([Link]) as buget from angajati as b where
a.id_departament=b.id_departament)>10000;

-- sa se afiseze toate departamentele cel mai putin de 2 angajati


select count([Link]) as nr_angajati, d.nume_departament from angajati as a right join
departamente as d on a.id_departament=d.id_departament
group by d.nume_departament
having nr_angajati<=2;

-- sa se afiseze cel mai bine platit angajat nascut inainte de 1989 si este barbat
select salariu, data_nasterii, nume, prenume from angajati
where year(data_nasterii)<1989 and prenume not like '%a' and salariu=(select max(salariu)
from angajati where year(data_nasterii)<1989 and prenume not like '%a');
-- cel mai cea mai , neaparat subinterogare

select * from departamente;

-- sa se afiseze departamentul cu cei mai multi directori


select d.nume_departament, count([Link]) as nr_directori from angajati as a inner join
departamente as d on a.id_departament=d.id_departament
where [Link] in ('Director')
group by d.nume_departament
having nr_directori=(Select count(id) as nr_directori from angajati where pozitie in
('Director') group by id_departament order by nr_directori desc limit 1);

-- sa se afiseze cea mai mare suma a salariilor unui departament ce are in componenta sa
manager sau directori
select sum([Link]) as suma_salariu, d.nume_departament from angajati as a inner join
departamente as d on a.id_departament=d.id_departament
where [Link] in ('Director', 'Manager')
group by d.nume_departament
having suma_salariu=(select sum([Link]) as sum_sal from angajati as a inner join
departamente as d on a.id_departament=d.id_departament
where [Link] in ('Director', 'Manager') group by d.nume_departament order by
sum_sal desc limit 1);
-- tema
-- sa se afiseze toate departamentele care au in componenta cel putin un barbat
-- sa se afiseze suma salariilor pe departamente acolo unde suma depaseste 4800
-- sa se afiseze cea mai mare medie a salariilor pentru persoanele nascute dupa 1989 si dupa
2018 si fac parte din departamentul sales pe pozitii
-- sa se afiseze nr femeilor pe departamente
-- sa se afiseze dep cu cea mai mare medie a salariilor atata timp cat au in componenta cel
putin un barbat
-- sa se afiseze cel mai bine platit barbat de pe pozitia de director
-- sa se afiseze toti angajati ce sunt mai tineri decat cel mai bine platit barbat
-- sa se afiseze nr de barbati din departamentul soft
-- sa se afiseze cel mai bien platit barbat din fiecare departament

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