drop database if exists facturacio;
create database facturacio;
use facturacio;
create table families(
fam varchar(20),
des varchar(50),
primary key(fam)) engine=innodb;
create table poblacions(
pob int,
nom varchar(20),
primary key(pob)) engine=innodb;
create table articles(
art varchar(20),
des varchar(50),
preu float(10,2),
fam varchar(20),
primary key(art),
foreign key(fam) references families(fam)) engine=innodb;
create table pro(
pro int,
dni varchar(9),
nom varchar(20),
pob int,
primary key(pro),
foreign key(pob) references poblacions(pob)) engine=innodb;
create table proveir(
art varchar(20),
pro int,
preu float(10,2),
primary key(art,pro),
foreign key(art) references articles(art),
foreign key(pro) references pro(pro)) engine=innodb;
insert into poblacions values(46401, "Poble numero 1");
insert into poblacions values(46402, "Poble numero 2");
insert into poblacions values(46403, "Poble numero 3");
insert into poblacions values(46404, "Poble numero 4");
insert into poblacions values(46405, "Poble numero 5");
insert into poblacions values(46406, "Poble numero 6");
insert into poblacions values(46407, "Poble numero 7");
insert into poblacions values(46408, "Poble numero 8");
insert into poblacions values(46409, "Poble numero 9");
insert into poblacions values(46410, "Poble numero 10");
insert into families values("F1", "Familia numero 1");
insert into families values("F2", "Familia numero 2");
insert into families values("F3", "Familia numero 3");
insert into families values("F4", "Familia numero 4");
insert into families values("F5", "Familia numero 5");
insert into families values("F6", "Familia numero 6");
insert into families values("F7", "Familia numero 7");
insert into families values("F8", "Familia numero 8");
insert into families values("F9", "Familia numero 9");
insert into families values("F10", "Familia numero 10");
insert into pro values(1, "851000001", "PROV1, S.A.", 46408);
insert into pro values(2, "851000002", "PROV2, S.A.", 46401);
insert into pro values(3, "851000003", "PROV3, S.A.", 46402);
insert into pro values(4, "851000004", "PROV4, S.A.", 46410);
insert into pro values(5, "851000005", "PROV5, S.A.", 46401);
insert into pro values(6, "851000006", "PROV6, S.A.", 46405);
insert into pro values(7, "851000007", "PROV7, S.A.", 46403);
insert into pro values(8, "851000008", "PROV8, S.A.", 46409);
insert into pro values(9, "851000009", "PROV9, S.A.", 46406);
insert into pro values(10, "851000010", "PROV10, S.A.", 46403);
insert into articles values("A1", "Article numero 1", 48.76, "F5");
insert into proveir values("A1", 1, 29.25);
insert into proveir values("A1", 2, 14.62);
insert into proveir values("A1", 3, 34.13);
insert into proveir values("A1", 4, 24.38);
insert into proveir values("A1", 5, 24.38);
insert into proveir values("A1", 6, 19.5);
insert into proveir values("A1", 7, 39.0);
insert into proveir values("A1", 8, 24.38);
insert into proveir values("A1", 9, 19.5);
insert into proveir values("A1", 10, 14.62);
insert into articles values("A2", "Article numero 2", 20.37, "F5");
insert into proveir values("A2", 1, 12.22);
insert into proveir values("A2", 2, 10.18);
insert into proveir values("A2", 3, 12.22);
insert into proveir values("A2", 4, 10.18);
insert into proveir values("A2", 5, 10.18);
insert into proveir values("A2", 6, 6.11);
insert into proveir values("A2", 7, 8.14);
insert into proveir values("A2", 8, 10.18);
insert into proveir values("A2", 9, 12.22);
insert into proveir values("A2", 10, 14.25);
insert into articles values("A3", "Article numero 3", 29.28, "F8");
insert into proveir values("A3", 1, 8.78);
insert into proveir values("A3", 2, 14.64);
insert into proveir values("A3", 3, 14.64);
insert into proveir values("A3", 4, 14.64);
insert into proveir values("A3", 5, 23.42);
insert into proveir values("A3", 6, 17.56);
insert into proveir values("A3", 7, 14.64);
insert into proveir values("A3", 8, 17.56);
insert into proveir values("A3", 9, 14.64);
insert into proveir values("A3", 10, 8.78);
insert into articles values("A4", "Article numero 4", 75.38, "F2");
insert into proveir values("A4", 1, 37.68);
insert into proveir values("A4", 2, 37.68);
insert into proveir values("A4", 3, 52.76);
insert into proveir values("A4", 4, 22.61);
insert into proveir values("A4", 5, 60.3);
insert into proveir values("A4", 6, 45.22);
insert into proveir values("A4", 7, 37.68);
insert into proveir values("A4", 8, 45.22);
insert into proveir values("A4", 9, 22.61);
insert into proveir values("A4", 10, 45.22);
insert into articles values("A5", "Article numero 5", 49.64, "F10");
insert into proveir values("A5", 1, 39.71);
insert into proveir values("A5", 2, 34.74);
insert into proveir values("A5", 3, 19.85);
insert into proveir values("A5", 4, 29.78);
insert into proveir values("A5", 5, 14.89);
insert into proveir values("A5", 6, 19.85);
insert into proveir values("A5", 7, 34.74);
insert into proveir values("A5", 8, 39.71);
insert into proveir values("A5", 9, 39.71);
insert into proveir values("A5", 10, 34.74);
insert into articles values("A6", "Article numero 6", 73.71, "F10");
insert into proveir values("A6", 1, 58.96);
insert into proveir values("A6", 2, 51.59);
insert into proveir values("A6", 3, 22.11);
insert into proveir values("A6", 4, 44.22);
insert into proveir values("A6", 5, 58.96);
insert into proveir values("A6", 6, 58.96);
insert into proveir values("A6", 7, 29.48);
insert into proveir values("A6", 8, 22.11);
insert into proveir values("A6", 9, 29.48);
insert into proveir values("A6", 10, 51.59);
insert into articles values("A7", "Article numero 7", 54.5, "F10");
insert into proveir values("A7", 1, 16.35);
insert into proveir values("A7", 2, 32.7);
insert into proveir values("A7", 3, 27.25);
insert into proveir values("A7", 4, 16.35);
insert into proveir values("A7", 5, 16.35);
insert into proveir values("A7", 6, 43.6);
insert into proveir values("A7", 7, 27.25);
insert into proveir values("A7", 8, 21.8);
insert into proveir values("A7", 9, 16.35);
insert into proveir values("A7", 10, 32.7);
insert into articles values("A8", "Article numero 8", 57.41, "F7");
insert into proveir values("A8", 1, 40.18);
insert into proveir values("A8", 2, 34.44);
insert into proveir values("A8", 3, 34.44);
insert into proveir values("A8", 4, 28.7);
insert into proveir values("A8", 5, 28.7);
insert into proveir values("A8", 6, 28.7);
insert into proveir values("A8", 7, 34.44);
insert into proveir values("A8", 8, 28.7);
insert into proveir values("A8", 9, 40.18);
insert into proveir values("A8", 10, 45.92);
insert into articles values("A9", "Article numero 9", 69.03, "F10");
insert into proveir values("A9", 1, 20.7);
insert into proveir values("A9", 2, 55.22);
insert into proveir values("A9", 3, 27.61);
insert into proveir values("A9", 4, 48.32);
insert into proveir values("A9", 5, 48.32);
insert into proveir values("A9", 6, 34.51);
insert into proveir values("A9", 7, 27.61);
insert into proveir values("A9", 8, 55.22);
insert into proveir values("A9", 9, 41.41);
insert into proveir values("A9", 10, 20.7);
insert into articles values("A10", "Article numero 10", 33.73, "F10");
insert into proveir values("A10", 1, 10.11);
insert into proveir values("A10", 2, 26.98);
insert into proveir values("A10", 3, 16.86);
insert into proveir values("A10", 4, 10.11);
insert into proveir values("A10", 5, 13.49);
insert into proveir values("A10", 6, 10.11);
insert into proveir values("A10", 7, 20.23);
insert into proveir values("A10", 8, 13.49);
insert into proveir values("A10", 9, 23.61);
insert into proveir values("A10", 10, 26.98);
-- ---------------------------------------------------
-- Exercici 1
-- ---------------------------------------------------
ALTER TABLE pro ADD COLUMN subministrador int;
ALTER TABLE pro ADD FOREIGN KEY (subministrador) REFERENCES pro(pro) ON DELETE
CASCADE ON UPDATE CASCADE;
UPDATE pro
SET subministrador = 9
WHERE pro = 10;
UPDATE pro
SET subministrador = 6
WHERE pro = 7 OR pro = 8;
UPDATE pro
SET subministrador = 1
WHERE pro = 2 or pro = 3 or pro = 4;
SELECT * FROM pro;
-- ---------------------------------------------------
-- Exercici 2
-- ---------------------------------------------------
SELECT *
FROM families
WHERE des LIKE "%PC%"
ORDER BY des DESC;
-- -------------------
-- ---------------------------------------------------
-- Exercici 3
-- ---------------------------------------------------
/*SELECT MAX(preu) * 1.12 AS "El més car amb IVA",
MIN(preu) * 1.12 AS "El més barat amb IVA",
MAX(preu) * 1.12 - MIN(preu) * 1.12 AS "Diferència amb IVA"
FROM articles;*/
SELECT MAX(preu) - MIN(preu) as "Diferència"
FROM articles;
SELECT *
FROM pro, poblacions
WHERE pro.pob = poblacions.pob;
SELECT count(*) AS "Nº proveïdors"
FROM pro
WHERE pob = NULL;
-- SELECT * FROM pro, poblacions WHERE pro.pob = poblacions.pob ORDER BY
poblacions.nom;
-- SELECT * FROM pro JOIN poblacions ON pro.pob = poblacions.pob;
-- He fet açò per a poder aplicar el left join. He borrat una població d'un
proveïdor. I després amb JOIN unisc les taules però amb LEFT li dic que també em
mostre aquells proveidors sense poble.
/*
UPDATE pro
SET pob = null
WHERE pro = 1;
*/
-- SELECT * FROM pro LEFT JOIN poblacions ON pro.pob = poblacions.pob;
-- ---------------------------------------------------
-- Exercici 4
-- ---------------------------------------------------
SELECT COUNT(pro) AS "Numero de proveidors"
FROM pro
WHERE pob is null;
-- ---------------------------------------------------
-- Exercici 5
-- ---------------------------------------------------
SELECT art, preu, "C" AS "Tipus" FROM proveir
UNION
SELECT art, preu, "V" AS "Tipus" FROM articles
ORDER BY art, Tipus DESC, preu;
-- SELECT art, preu, "Compra" AS Tipus FROM proveir UNION SELECT art, preu, "Venda"
AS Tipus FROM articles ORDER BY art, Tipus desc, preu;
-- ---------------------------------------------------
-- Exercici 6
-- ---------------------------------------------------
/*SELECT articles.art,
max(proveir.preu) as "El més car",
min(proveir.preu) as "El més barat",
avg(proveir.preu) as "Preu de cost mitjà"
from articles join proveir on articles.art = proveir.art
group by articles.art
having count(proveir.pro) > 2;*/
SELECT art, MIN(preu) AS "Mínim", MAX(preu) AS "Màxim", AVG(preu) AS "Mitjana"
FROM proveir
GROUP BY art
HAVING count(*) > 2;
-- SELECT * FROM proveir;
-- SELECT * FROM proveir ORDER BY pro;
-- SELECT * FROM proveir GROUP BY pro;
-- SELECT pro FROM proveir GROUP BY pro;
SELECT pro, MIN(preu) FROM proveir GROUP BY pro ORDER BY MIN(preu);
-- No pot anar un WHERE després d'un GROUP BY, haurem de canviar-lo per HAVING
-- SELECT pro, MIN(preu) FROM proveir GROUP BY pro WHERE pro = 10;
SELECT pro, MIN(preu) as preu_minim FROM proveir GROUP BY pro HAVING preu_minim <
10 ORDER BY preu_minim;
SELECT art as idArticles,
MIN(preu) as pMinim,
MAX(preu) as pMaxim,
AVG(preu) as pMitja,
COUNT(pro) AS qProveidors
FROM proveir
GROUP BY art
HAVING COUNT(pro) > 9;
-- ---------------------------------------------------
-- Exercici 7 - Mostra el codi de les poblacions on només hi ha un únic proveïdor.
-- ---------------------------------------------------
SELECT poblacions.pob AS "codi"
FROM poblacions JOIN pro ON pro.pob = poblacions.pob
GROUP BY poblacions.pob
HAVING count(*) = 1;
-- Hem de mostrar aquell poble que sols té un únic proveidor 09,06,05,02
SELECT * FROM pro;
SELECT pob FROM pro GROUP BY pob HAVING COUNT(pro) = 1;
-- ---
-- Exercici 8 - Obteniu el nom de cada proveïdor amb el nom de la seua població.
-- ---
select pro.nom, poblacions.nom from pro join poblacions on poblacions.pob =
pro.pob;
SELECT pro.nom, poblacions.nom FROM pro LEFT JOIN poblacions ON poblacions.pob =
pro.pob;
-- ---
-- Exercici 9 - Per cada proveïdor mostra el seu nom i la descripció dels articles
que subministra.
-- És a dir: eixiran 2 columnes: el nom del proveïdor i descripció de l’article.
-- Nota: Ho farem amb un tipus de JOIN perquè volem que també apareguen els
proveïdors
-- que no ens subministren cap article.
-- ---
select pro.nom as "Nom proveïdor", articles.des as "Descripció de l'article"
from pro left join proveir on proveir.pro = pro.pro
left join articles on proveir.art = articles.art;
-- --
-- Exercici 10 - Mostra el codi i descripció d'aquelles famílies que tenen algun
article subministrat per algun
-- proveïdor de Tavernes (assumim que és 46403).
-- --
select distinct families.fam, families.des
from families
join articles on families.fam = articles.fam
join proveir on articles.art = proveir.art
join pro on proveir.pro = pro.pro
where pro.pob = "46403";
-- --
-- Exercici 11 - Mostra parelles de proveïdors que siguen del mateix poble.
-- Caldrà mostrar el codi i el nom dels dos proveïdors i el codi del poble.
-- No han d’eixir parelles formades per un mateix proveïdor.
-- Per exemple, no deuria d’eixir la parella 3 i 3.
-- --
SELECT pro1.pro as "Codi(A)",pro1.nom as "Nom(A)",pro2.pro as "Codi(B)",pro2.nom as
"Nom(B)",pro1.pob as "Poblacio"
FROM pro as pro1
JOIN pro as pro2 ON pro1.pob=pro2.pob AND pro1.pro < pro2.pro;
--
-- Exercici 12 - Per a cada proveïdor mostra el seu nom i el nom del proveïdor que
el subministra.
--
select pro1.nom as "proveidor", pro2.nom as "subministrador"
from pro as pro1
join pro as pro2 on pro1.subministrador = pro2.pro;
--
-- Exercici 13 - Obteniu el codi i descripció de cada família,
-- així com els preus de venda mínim, màxim i mig dels articles d'eixa família.
--
select families.fam, families.des, min(articles.preu), max(articles.preu),
avg(articles.preu)
from families
join articles on families.fam = articles.fam
group by families.fam;