Sunteți pe pagina 1din 5

-- Azi vom aborda:

-- valori NULLe

-- grupari si calcule bazate pe grupari. Functii agregat.

-- UNIONs cu grupari si (sub)totaluri

-- jonctiuni externe

-- valori NULLe

SELECT *

FROM customer

-- sa se afiseze doar clientii care NU au fax

SELECT *

FROM customer

WHERE fax IS NULL

-- sa se afiseze toti clientii. Pentru cei care au fax sa se afiseze numarul de fax.

-- Pentru cei care nu au fax (adica fax IS NULL), sa se afiseze textul 'fara fax' in loc de NULL

-- folosim functia COALESCE(param1, param2, param3, ....). Functia returneaza primul parametru care
este NENUL.

SELECT customerid, firstname, lastname, address, COALESCE(fax, 'fara fax')

FROM customer

-- grupari si calcule bazate pe grupari. Functii agregat.

-- functiile agregat ofera valori sintetice obtinute pe baza mai multor inregistrari/valori

--cati artisti avem in baza de date?

SELECT COUNT(*)

FROM artist
--cate albume avem in baza de date?

SELECT COUNT(*)

FROM album

--care sunt albumele pe fiecare artist in parte?

SELECT *

FROM artist ar INNER JOIN album ab ON ar.artistid=ab.artistid

ORDER BY ar.name

--cate albume a produs fiecare artist in parte?

SELECT name, COUNT(albumid) AS NrAlbume

FROM artist ar INNER JOIN album ab ON ar.artistid=ab.artistid

GROUP BY name

ORDER BY name

--care este artistul care a produse cele mai multe albume?

SELECT name, COUNT(albumid) AS NrAlbume

FROM artist ar INNER JOIN album ab ON ar.artistid=ab.artistid

GROUP BY name

ORDER BY NrAlbume DESC

LIMIT 1

--care sunt artistii care au produs cel putin 5 albume?

SELECT name, COUNT(albumid) AS NrAlbume

FROM artist ar INNER JOIN album ab ON ar.artistid = ab.artistid

GROUP BY name

HAVING COUNT(albumid)>=5

-- functii agregat: SUM, MAX, MIN, COUNT, AVG


-- care este durata totala (in milisecunde) a melodiilor pe care le avem in portofoliu

SELECT SUM(track.milliseconds) AS TotalDurata

FROM track

--care este durata totala (IN ORE) a melodiilor pe care le avem in portofoliu

SELECT SUM(track.milliseconds)/1000/60/60

FROM track

--care sunt melodiile care au durata mai mare de 3 minute?

SELECT *

FROM track

WHERE track.milliseconds/60000 > 3

-- UNIONs cu grupari si (sub)totaluri

-- Care sunt vanzarile zilnice pe fiecare client in parte?

SELECT lastname as DenClient, invoicedate AS Zi, SUM(il.quantity * il.unitprice) AS vanzari

FROM customer c INNER JOIN invoice i ON c.customerid=i.customerid INNER JOIN invoiceline il ON


i.invoiceid=il.invoiceid

GROUP BY lastname, invoicedate

ORDER BY 1,2

-- Sa se obtina o situatie cu vanzarile zilnice pe fiecare client in parte si subtotalurile cumulate

-- pentru fiecare client.

SELECT lastname, invoicedate, SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

GROUP BY lastname, invoicedate


UNION

SELECT lastname || '-SUBTOTAL', null, SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

GROUP BY lastname

ORDER BY 1,2

-- Sa se obtina o situatie cu vanzarile zilnice pe fiecare client in parte, subtotalurile cumulate

-- pentru fiecare client si totalul general al vanzarilor pe toti clientii si pe toate zilele.

SELECT lastname, invoicedate, SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

GROUP BY lastname, invoicedate

UNION

SELECT lastname || '-SUBTOTAL', null, SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

GROUP BY lastname

UNION

SELECT 'Zz-Total', null, SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

ORDER BY 1,2

--varianta de afisare doar a subtotalurilor si a Z-ului final

SELECT lastname || '-SUBTOTAL', SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

GROUP BY lastname
UNION

SELECT 'Zz-Total', SUM(quantity * unitprice)

FROM customer c INNER JOIN invoice i ON c.customerid = i.customerid INNER JOIN invoiceline il ON
i.invoiceid = il.invoiceid

ORDER BY 1,2

--jonctiuni externe (OUTER JOIN)

-- Care sunt artistii din baza de date pentru care nu avem albume in portofoliu?

SELECT *

FROM artist a LEFT OUTER JOIN album ab ON a.artistid = ab.artistid

WHERE albumid IS NULL

--Care sunt clientii din baza de date pentru care nu am emis nicio factura?

SELECT *

FROM customer c LEFT OUTER JOIN invoice i ON c.customerid=i.customerid

WHERE invoiceid IS NULL

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