0% au considerat acest document util (0 voturi)
59 vizualizări13 pagini

MYSQL Practice

Documentul conține mai multe instrucțiuni SQL care interoghează și returnează date din diverse tabele relaționale, utilizând concepte ca subinterogări, JOIN, GROUP BY și altele.

Încărcat de

Aur
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 DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
59 vizualizări13 pagini

MYSQL Practice

Documentul conține mai multe instrucțiuni SQL care interoghează și returnează date din diverse tabele relaționale, utilizând concepte ca subinterogări, JOIN, GROUP BY și altele.

Încărcat de

Aur
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 DOC, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 13

/* Scriei o instruciune SQL care s afieze numrul de produse din fiecare

categorie(cmpuri afiate: id_categorie, denumire i numr produse). */


SELECT c.id_categorie, denumire, COUNT(id_produs) AS nr_produse
FROM categorii c JOIN produse p
ON c.id_categorie = p.id_categorie
GROUP BY c.id_categorie;

/* 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);

/* Creai o tabel virtual actualizabil care s stocheze toi clienii din


provincie. */
CREATE VIEW clienti_provincie AS
SELECT * FROM clienti WHERE localitate <> 'Bucuresti';

/* Scriei o instruciune SQL care s afieze clienii care au comandat aceeai


cantitate dintr-un produs ntr-o comand cu primul client introdus n baza de date
(valoarea minim din cmpul id_client). Cmpuri afiate: nume_client (conine
cmpurile nume i prenume din tabela clienti), localitate i cantitate comandat.
*/
SELECT CONCAT_WS(" ",nume,prenume) AS nume_client,
localitate, cantitate FROM clienti c JOIN comenzi com
ON c.id_client = com.id_client
WHERE cantitate IN(SELECT cantitate FROM comenzi
WHERE id_client = (SELECT MIN(id_client) FROM comenzi));

/*Creai o tabel virtual actualizabil care s stocheze toi clienii care au


comandat tablete. */
CREATE VIEW tablete AS
SELECT c.id_client, nume, prenume, denumire_produs FROM
clienti c JOIN comenzi com
ON c.id_client = com.id_client
JOIN produse p ON com.id_produs = p.id_produs

/* afisarea numarului de orase din fiecare tara */


SELECT b.Name, COUNT(a.ID) AS "Numar orase"
FROM city a RIGHT JOIN country b
ON a.CountryCode = b.Code
GROUP BY b.Name
ORDER BY COUNT(a.ID) DESC;

/* limbile oficiale vorbite in Africa */


SELECT a.Name, a.Continent,
b.`Language`, b.IsOfficial
FROM country a, countrylanguage b
WHERE a.Code = b.CountryCode
AND a.Continent = 'Africa'
AND b.IsOfficial = 'T'
ORDER BY a.Name;

/* capitalele monarhiilor din Europa */


SELECT a.Name, a.Continent, a.GovernmentForm,
b.Name AS Capitala
FROM country a JOIN city b
ON a.Capital = b.ID
WHERE a.Continent = 'Europe'
AND a.GovernmentForm LIKE '%monarchy%';

/* afisare angajati de la locatiile din America */


SELECT e.FIRST_NAME, e.LAST_NAME,
c.CITY, b.COUNTRY_NAME, a.REGION_NAME
FROM regions a, countries b,
locations c, departments d, employees e
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND d.LOCATION_ID = c.LOCATION_ID
AND c.COUNTRY_ID = b.COUNTRY_ID
AND b.REGION_ID = a.REGION_ID
AND a.REGION_NAME LIKE 'America%';

/* totalul salariilor angajatilor pe fiecare tara */


SELECT d.COUNTRY_NAME, SUM(a.SALARY) AS
"Total salarii"
FROM employees a, departments b,
locations c, countries d
WHERE a.DEPARTMENT_ID = b.DEPARTMENT_ID
AND b.LOCATION_ID = c.LOCATION_ID
AND c.COUNTRY_ID = d.COUNTRY_ID
GROUP BY d.COUNTRY_NAME
ORDER BY SUM(a.SALARY) DESC;

/* functiile angajatilor din departamentele IT si SALES */


SELECT DISTINCT a.DEPARTMENT_NAME, c.JOB_TITLE
FROM departments a
JOIN employees b
ON a.DEPARTMENT_ID = b.DEPARTMENT_ID
JOIN jobs c
ON c.JOB_ID = b.JOB_ID
WHERE a.DEPARTMENT_NAME LIKE '%IT%'
OR a.DEPARTMENT_NAME LIKE '%Sales%'

/* clientii fara comenzi */


SELECT a.customerName, b.orderNumber
FROM customers a
LEFT JOIN orders b
ON a.customerNumber = b.customerNumber
WHERE b.orderNumber IS NULL;

/* angajatii care nu au interactionat cu clienti */


SELECT a.lastName, a.firstName, a.jobTitle,
b.customerNumber AS "Nume client"
FROM employees a LEFT JOIN
customers b
ON a.employeeNumber = b.salesRepEmployeeNumber
WHERE b.customerNumber IS NULL
UNION
SELECT a.lastName, a.firstName, a.jobTitle,
b.customerName
FROM employees a RIGHT JOIN
customers b
ON a.employeeNumber = b.salesRepEmployeeNumber
WHERE a.employeeNumber IS NULL;

/* 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');

/* Scrieti o instructiune SQL prin care sa afisati clientii cu mai mult de 2


comenzi */
SELECT a.customerName,
COUNT(b.orderNumber) AS "Numar comenzi"
FROM customers a JOIN orders b
ON a.customerNumber = b.customerNumber
GROUP BY a.customerName
HAVING COUNT(b.orderNumber) > 2
ORDER BY COUNT(b.orderNumber);

/* capitalele din Europa; afisare: nume oras */


SELECT name
FROM city
WHERE ID IN
(SELECT Capital FROM country
WHERE Continent LIKE 'Euro%');

/* 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';

SELECT Name, SurfaceArea FROM


country
WHERE SurfaceArea > (SELECT AVG(SurfaceArea) FROM
country WHERE Continent = 'Europe')
AND Continent = 'Europe';

/* tarile cu cea mai mare populatie de pe fiecare continent */


SELECT Continent, MAX(Population)
FROM country
GROUP BY Continent;

SELECT a.Name, a.Continent, a.Population


FROM country AS a,
(SELECT Continent, MAX(Population)
AS maxim
FROM country
GROUP BY Continent) AS b
WHERE a.Continent = b.Continent
AND Population IN(b.maxim);

/* angajatii de la locatiile din Canada */


SELECT FIRST_NAME, LAST_NAME
FROM employees
WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID FROM departments
WHERE LOCATION_ID IN
(SELECT LOCATION_ID FROM locations
WHERE COUNTRY_ID =
(SELECT COUNTRY_ID FROM countries
WHERE COUNTRY_NAME LIKE 'Canada')));

/* managerii de departamente */
SELECT FIRST_NAME, LAST_NAME,
DEPARTMENT_ID
FROM employees a
WHERE EMPLOYEE_ID IN
(SELECT MANAGER_ID FROM departments)

/* angajatii si managerii lor; SELF JOIN */


SELECT
CONCAT(ang.FIRST_NAME,' ',ang.LAST_NAME)
AS "Nume angajat",
CONCAT(mng.FIRST_NAME,' ',mng.LAST_NAME)
AS "Nume manager"
FROM employees ang LEFT JOIN employees mng
ON ang.MANAGER_ID = mng.EMPLOYEE_ID;

/* angajatii si managerii lor; subinterogari*/


SELECT
CONCAT(ang.FIRST_NAME,' ',ang.LAST_NAME)
AS "Nume angajat", ang.MANAGER_ID
FROM employees ang
WHERE ang.MANAGER_ID IN
(SELECT mng.EMPLOYEE_ID FROM
employees mng);

/* angajatii care nu sunt manageri - utilizare operator NOT IN */


SELECT FIRST_NAME, LAST_NAME
FROM employees
WHERE employee_ID
NOT IN
(SELECT MANAGER_ID FROM employees);

/* angajatii care nu sunt manageri - utilizare operator NOT EXISTS */


SELECT FIRST_NAME, LAST_NAME
FROM employees mng
WHERE NOT EXISTS
(SELECT FIRST_NAME, LAST_NAME
FROM employees ang
WHERE ang.MANAGER_ID = mng.EMPLOYEE_ID);
/* angajatii de la biroul din Boston */
SELECT lastName, firstName
FROM employees
WHERE officeCode IN
(SELECT officeCode FROM offices
WHERE city = 'Boston');

/* produsele cu stocul mai mare decat al tuturor produselor Ford */


SELECT productName, quantityInStock
FROM products
WHERE quantityInStock >
(SELECT MAX(quantityInStock)
FROM products WHERE productName
LIKE '%Ford%');

/* 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);

/* crearea unei tabele temporare ce va contine capitalele din America de Nord */


CREATE TEMPORARY TABLE capitale
AS
SELECT a.Name, a.Continent,
b.Name AS capitala
FROM country a JOIN city b
ON a.Capital = b.ID
WHERE a.Continent LIKE '%North%';

/* afisarea inregistrarilor din tabela temporara */


SELECT * FROM capitale;

DROP TEMPORARY TABLE capitale;

/* 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 @a AS "Tara", @b AS "Capitala",


@c AS "Suprafata";

/* Implementai o procedur stocat care va primi ca valoare de intrare un nume de


departament i va returna numrul de angajai din acel departament, ara n care
i desfoar activitatea angajaii din acel departament, salariul mediu al
angajailor din acel departament, precum i numele managerului departamentului
respectiv. */
USE company;

DROP PROCEDURE IF EXISTS exercitiu;


DELIMITER **
CREATE PROCEDURE exercitiu1(IN dept VARCHAR(30), OUT nr INT(3), OUT tara
VARCHAR(40), OUT sal INT(10), OUT manager VARCHAR(50))
BEGIN
SELECT
COUNT(b.EMPLOYEE_ID) INTO nr
FROM departments a
JOIN employees b
ON a.DEPARTMENT_ID=b.DEPARTMENT_ID
WHERE a.DEPARTMENT_NAME = dept;

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);

IF tara IS NULL THEN


SET tara := 'Unknown';
END IF;
IF sal IS NULL THEN
SET sal := 0;
END IF;
IF manager IS NULL THEN
SET manager := 'Unknown';
END IF;
END;
**
DELIMITER ;

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";

/* Implementati o functie care primeste un numar de comanda (orderNumber) si


returneaza numarul de comenzi neanulate (status != 'Cancelled') din anotimpul
corespunzator comenzii introduse si din anul corespunzator comenzii introduse;
Exemplu:
Valoarea returnata va fi de forma: In anotimpul primavara din anul 2004 au fost 20
de comenzi neanulate */

DROP FUNCTION IF EXISTS comenzi_anotimp;

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';

WHEN luna BETWEEN 6 AND 8 THEN


SELECT COUNT(orderNumber)
INTO nr
FROM orders
WHERE status != 'Cancelled'
AND MONTH(orderDate) IN(6,7,8)
AND YEAR(orderDate) = an;
SET anotimp := 'vara';

WHEN luna BETWEEN 9 AND 11 THEN


SELECT COUNT(orderNumber)
INTO nr
FROM orders
WHERE status != 'Cancelled'
AND MONTH(orderDate) IN(9,10,11)
AND YEAR(orderDate) = an;
SET anotimp := 'toamna';

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);

/* procedura care afiseaza angajatii si un username pentru fiecare angajat; */


DELIMITER //
CREATE PROCEDURE useri()
BEGIN
DECLARE nume, username VARCHAR(100);

DECLARE cursor_useri CURSOR FOR


SELECT
CONCAT(lastName,' ', firstName),
SUBSTR(email,1,LOCATE('@',email)-1)
FROM employees;

DECLARE CONTINUE HANDLER FOR NOT FOUND


BEGIN
SET @ok := 0;
END;
DROP TEMPORARY TABLE IF EXISTS t1;
CREATE TEMPORARY TABLE t1(
nume VARCHAR(100),
username VARCHAR(100)
);

/* 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;

SELECT * FROM t1;

END;
//
DELIMITER ;

CALL useri();

/* trigger-ul se va declansa automat inainte de efectuarea de comenzi UPDATE pe


tabele orderdetails */
DELIMITER //
CREATE TRIGGER actualizare_stoc BEFORE UPDATE ON orderdetails FOR EACH ROW
BEGIN
DECLARE stoc_actual, stoc_nou INT(5);
DECLARE mesaj VARCHAR(100);
IF NEW.quantityOrdered <> OLD.quantityOrdered THEN
SELECT quantityInStock INTO stoc_actual
FROM products
WHERE productCode = OLD.productCode;

SET stoc_nou = NEW.quantityOrdered - OLD.quantityOrdered;

IF stoc_nou <= stoc_actual THEN

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;

SELECT * FROM products


WHERE productCode = 'S18_1749';

UPDATE orderdetails
SET quantityOrdered = 2770
WHERE productCode = 'S18_1749'
AND orderNumber = 10100;

UPDATE orderdetails
SET quantityOrdered = 20
WHERE productCode = 'S18_1749'
AND orderNumber = 10100;

/* procedura care primeste un id de categorie si returneaza


produsul (denumire, pret) cel mai scump din categoria respectiva */

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;
//

DROP TRIGGER verificare_stoc;

INSERT INTO comenzi (id_produs, id_client, cantitate)


VALUES (1,2,3);

INSERT INTO comenzi (id_produs, id_client, cantitate)


VALUES (1,2,8);

INSERT INTO comenzi (id_produs, id_client, cantitate)


VALUES (1,2,7);

/* trigger la UPDATE in tabela angajati


daca varsta la momentul angajarii nu este 18 ani afisam un mesaj de
eroare */
DELIMITER $$
CREATE TRIGGER verifica_varsta BEFORE UPDATE ON angajati FOR EACH ROW
BEGIN
DECLARE m VARCHAR(70);
IF YEAR(NEW.data_angajarii) - YEAR(NEW.data_nasterii) < 18 THEN
SET m := 'Persoana nu are 18 ani!';
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = m;
END IF;
END;
$$

UPDATE angajati SET data_nasterii = '1990-10-20' WHERE id_angajat = 1;

UPDATE angajati SET data_nasterii = '2000-07-05' WHERE id_angajat = 2;


/* functie care compara doua numere si returneaza un sir de caractere in functie de
valoarea celor doua numere */
DELIMITER $$
CREATE FUNCTION compara2(a INT, b INT) RETURNS VARCHAR(20)
BEGIN
DECLARE sir VARCHAR(20);
CASE
WHEN a = b THEN SET sir := '=';
WHEN a > b THEN SET sir := '>';
ELSE SET sir := '<';
END CASE;
SET sir := CONCAT_WS(" ",a,sir,b);
RETURN sir;
END;
$$

SELECT compara2(10,8);
SELECT compara2(5,5);

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