Documente Academic
Documente Profesional
Documente Cultură
/* Scriei o instruciune SQL care s afieze produsele mai ieftine dect preul
mediu al tuturor produselor din baza de date (cmpuri afiate: id_produs,
denumire_produs i pret). */
SELECT id_produs, denumire_produs, pret,
(SELECT AVG(pret) FROM produse) AS pret_mediu
FROM produse
WHERE pret < (SELECT AVG(pret) FROM produse);
/* Scriei o instruciune SQL care s afieze produsele mai scumpe dect toate
produsle din categoria Imprimante (cmpuri afiate: id_produs, denumire_produs i
pret). */
SELECT id_produs, denumire_produs, pret FROM produse
WHERE pret > ALL(SELECT pret FROM produse
WHERE id_categorie = 3);
/* Scrieti o instructiune SQL prin care sa afisati capitalele tarilor din Africa in
care limba oficiala este Engleza sau Franceza */
SELECT a.Name, b.Name, a.Continent,
c.`Language`, c.IsOfficial
FROM country a, city b, countrylanguage c
WHERE a.Capital = b.ID
AND a.Code = c.CountryCode
AND a.Continent = 'Africa'
AND c.IsOfficial = 'T'
AND c.`Language` IN('French','English');
/* tarile din Europa cu suprafata mai mare decat suprafata medie a tuturor tarilor
din Europa; afisare: nume tara si suprafata */
SELECT AVG(SurfaceArea) FROM
country WHERE Continent = 'Europe';
/* managerii de departamente */
SELECT FIRST_NAME, LAST_NAME,
DEPARTMENT_ID
FROM employees a
WHERE EMPLOYEE_ID IN
(SELECT MANAGER_ID FROM departments)
/* produsele a caror cantitate totala comandata este mai mica decat 25*media
cantitatilor comandate ale tuturor produselor */
SELECT a.productName, SUM(b.quantityOrdered)
AS "Total Cantitate comandata"
FROM products a JOIN
orderdetails b
USING(productCode)
GROUP BY a.productName
HAVING SUM(quantityOrdered)
< 25*(SELECT AVG(quantityOrdered)
FROM orderdetails);
/* cel mai vechi si cel mai nou angajat din fiecare departament */
SELECT a.DEPARTMENT_NAME,
b.FIRST_NAME, b.LAST_NAME,
b.HIRE_DATE
FROM departments a JOIN
employees b
ON a.DEPARTMENT_ID = b.DEPARTMENT_ID
JOIN
(SELECT DEPARTMENT_ID, MAX(HIRE_Date)
AS maxim
FROM employees
GROUP BY DEPARTMENT_ID) AS c
ON b.DEPARTMENT_ID = c.DEPARTMENT_ID
JOIN
(SELECT DEPARTMENT_ID, MIN(HIRE_Date)
AS minim
FROM employees
GROUP BY DEPARTMENT_ID) AS d
ON b.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE b.HIRE_DATE IN(c.maxim,d.minim);
SUBINTEROGARI
/*Scrieti o instructiune SQL prin care sa afisati tarile cu mai mult de o limba
oficiala */
SELECT a.Name, a.Continent, COUNT(b.`Language`)
FROM country a JOIN countrylanguage b
ON a.Code = b.CountryCode
WHERE b.IsOfficial = 'T'
GROUP BY a.Name
HAVING COUNT(b.`Language`) > 1;
/* Scrieti o instructiune SQL prin care sa afisati produsele cu cele mai mici 10
totaluri de cantitati comandate */
SELECT productName, b.suma
FROM products a JOIN
(SELECT productCode,
SUM(quantityOrdered) as suma FROM
orderdetails GROUP BY productCode
ORDER BY SUM(quantityOrdered)
LIMIT 10) AS b
ON a.productCode = b.productCode
GROUP BY productName
ORDER BY b.suma;
/*Scrieti o instructiune SQL prin care sa afisati cel mai vechi si cel mai nou
angajat al companiei */
SELECT a.FIRST_NAME, a.LAST_NAME,
a.HIRE_DATE
FROM employees a
WHERE a.HIRE_DATE IN
((SELECT MIN(HIRE_DATE) FROM
employees),(SELECT MAX(HIRE_DATE) FROM
employees));
/* Scrieti o instructiune SQL prin care sa afisati departamentul cu cel mai mic
total al salariilor */
SELECT a.DEPARTMENT_NAME, SUM(b.SALARY)
FROM departments a, employees b
WHERE a.DEPARTMENT_ID = b.DEPARTMENT_ID
GROUP BY a.DEPARTMENT_NAME
HAVING SUM(salary) =
(SELECT SUM(salary) FROM employees
GROUP BY DEPARTMENT_ID ORDER BY
SUM(salary) LIMIT 1);
/* exemplu de tranzactie */
START TRANSACTION;
INSERT INTO countries
VALUES ('GR','Grecia',1),
('CY','Cipru',1),
('AT','Austria',1);
SAVEPOINT s1;
DELETE FROM countries
WHERE REGION_ID=2;
ROLLBACK TO s1;
START TRANSACTION;
INSERT INTO countries
VALUES ('IT','Italia',1),
('ES','Spania',1),
('FR','Franta',1);
COMMIT;
ROLLBACK;
PROCEDURI
/* procedura care primeste un continent si returneaza numele tarii cu cea mai mare
suprafata de pe acel continent, capitala acelei tari si suprafata tarii respective
*/
DELIMITER //
CREATE PROCEDURE suprafata(IN pContinent VARCHAR(20), OUT tara VARCHAR(50), OUT
capitala VARCHAR(60), OUT pSuprafata DOUBLE)
BEGIN
SELECT a.Name, a.SurfaceArea, b.Name/
INTO tara, pSuprafata, capitala
FROM country a JOIN city b
ON a.Capital = b.ID
WHERE a.Continent = pContinent
AND a.SurfaceArea = (SELECT
MAX(SurfaceArea) FROM country
WHERE Continent = pContinent);
END;
//
DELIMITER ;
CALL suprafata('Africa',@a,@b,@c);
SELECT
c.COUNTRY_NAME INTO tara
FROM departments a
JOIN locations b
ON a.LOCATION_ID = b.LOCATION_ID
JOIN countries c
ON b.COUNTRY_ID=c.COUNTRY_ID
WHERE a.DEPARTMENT_NAME = dept;
SELECT
ROUND(AVG(b.SALARY)) INTO sal
FROM departments a
JOIN employees b
ON a.DEPARTMENT_ID=b.DEPARTMENT_ID
WHERE a.DEPARTMENT_NAME = dept;
SELECT
CONCAT(FIRST_NAME,' ',LAST_NAME)
INTO manager
FROM employees
WHERE EMPLOYEE_ID =
(SELECT MANAGER_ID FROM departments
WHERE DEPARTMENT_NAME LIKE dept);
CALL exercitiu('IT',@a,@b,@c,@d);
SELECT @a AS "Numarul de angajati din departament",
@b AS "Tara in care se afla locatia",
@c AS "Salariul mediu din departament",
@d AS "Managerul departamentului";
DELIMITER //
CREATE FUNCTION comenzi_anotimp(nrcom INT(11)) RETURNS VARCHAR(100)
BEGIN
DECLARE rezultat VARCHAR(100);
DECLARE anotimp VARCHAR(15);
DECLARE an, luna, nr INT(4);
SELECT
YEAR(orderDate), MONTH(orderDate)
INTO an, luna
FROM orders
WHERE orderNumber = nrcom;
CASE
WHEN luna IN(3,4,5) THEN
SELECT COUNT(orderNumber)
INTO nr
FROM orders
WHERE status != 'Cancelled'
AND MONTH(orderDate) IN(3,4,5)
AND YEAR(orderDate) = an;
SET anotimp := 'primavara';
ELSE
SELECT COUNT(orderNumber)
INTO nr
FROM orders
WHERE status != 'Cancelled'
AND MONTH(orderDate) IN(1,2,12)
AND YEAR(orderDate) = an;
SET anotimp := 'iarna';
END CASE;
IF nr = 0 THEN
SET rezultat := 'Numarul de comanda introdus nu exista!';
ELSE
SET rezultat := CONCAT('In anotimpul ',anotimp,' din anul ',an,' au fost
',nr,' comenzi neanulate');
END IF;
RETURN rezultat;
END;
//
DELIMITER ;
SELECT comenzi_anotimp(10248);
/* deschiderea cursorului */
OPEN cursor_useri;
SET @ok := 1; /*
WHILE @ok = 1 DO /*
FETCH cursor_useri
INTO nume, username;
INSERT INTO t1
VALUES(nume, username);
END WHILE;
CLOSE cursor_useri;
END;
//
DELIMITER ;
CALL useri();
UPDATE products
SET quantityInStock = stoc_actual - stoc_nou
WHERE productCode = OLD.productCode;
ELSE
SET mesaj := CONCAT('Stoc indisponibl! Din acest produs mai sunt in
stoc ',stoc_actual,' bucati.');
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = mesaj;
END IF;
END IF;
END;
//
DELIMITER ;
UPDATE orderdetails
SET quantityOrdered = 2730
WHERE productCode = 'S18_1749'
AND orderNumber = 10100;
UPDATE orderdetails
SET quantityOrdered = 2770
WHERE productCode = 'S18_1749'
AND orderNumber = 10100;
UPDATE orderdetails
SET quantityOrdered = 20
WHERE productCode = 'S18_1749'
AND orderNumber = 10100;
DELIMITER //
CREATE PROCEDURE pret_maxim(IN id_cat INT(2), OUT den VARCHAR(50),
OUT pret_max DOUBLE(7,2))
BEGIN
SELECT denumire_produs, pret INTO den, pret_max FROM produse
WHERE pret = (SELECT MAX(pret) FROM produse
WHERE id_categorie = id_cat)
AND id_categorie = id_cat;
END;
//
DROP PROCEDURE pret_maxim;
CALL pret_maxim(1,@d,@p);
SELECT @d AS denumire, @p AS pret_maxim;
CALL pret_maxim(2,@d,@p);
SELECT @d AS denumire, @p AS pret_maxim;
/* trigger la INSERT in tabela comenzi
in cazul in care cantitatea comandata dintr-un produs depaseste
cantiatea din tabela produse este afisat un mesaj de eroare,
altfel sa se realizeze update pe cantitate in tabela produse */
DELIMITER //
CREATE TRIGGER verificare_stoc BEFORE INSERT ON comenzi FOR EACH ROW
BEGIN
DECLARE id_prod, cant INT DEFAULT 0;
DECLARE mesaj VARCHAR(50);
SET mesaj := '';
SELECT id_produs, cantitate INTO id_prod, cant FROM produse WHERE
id_produs = NEW.id_produs;
IF cant >= NEW.cantitate THEN
CALL actualizare_stoc(id_prod,NEW.cantitate);
ELSE
SET mesaj := 'Cantitatea comandata nu este disponibila in stoc!';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = mesaj;
END IF;
END;
//
DELIMITER //
CREATE PROCEDURE actualizare_stoc(IN id INT, IN c INT)
BEGIN
UPDATE produse SET cantitate = cantitate - c WHERE id_produs = id;
END;
//
SELECT compara2(10,8);
SELECT compara2(5,5);