Commit ddb2b87c authored by GUICHON Joannes's avatar GUICHON Joannes
Browse files

Update Examen_TP_CS54-BD-Exam3.pdf, data.sql, correction.sql, README.md files

parent 6ee89e91
# Proposition correction bd 1A machine 2k21
Proposition de correction pour l'examen machine de BD de 1A 2k21.
Quelques erreurs peuvent encore s'y trouver cette correction ayant été réalisée rapidement.
\ No newline at end of file
Quelques erreurs peuvent encore s'y trouver cette correction ayant été réalisée rapidement.
---- Partie 1 ----
-- Question 1
DROP TABLE IF EXISTS compte CASCADE ;
DROP TABLE IF EXISTS typecompte CASCADE ;
DROP TABLE IF EXISTS CLIENT CASCADE ;
DROP TABLE IF EXISTS transactionBancaire CASCADE ;
CREATE TABLE CLIENT (
nomPrenom varchar primary key,
dateNaiss varchar,
adresse varchar,
profession varchar
);
CREATE TABLE typecompte (
nom varchar primary key check (nom in ('compte courant étudiant', 'compte courant', 'compte sur livret', 'compte actions')),
categorie varchar check (categorie in ('courant', 'épargne', 'titres')),
soldeMin float,
interet float check (interet between 0 and 100)
);
CREATE TABLE compte (
noCompte varchar primary key,
typeC varchar references typecompte (nom),
proprietaire varchar references client (nomPrenom),
solde float
);
CREATE TABLE transactionBancaire (
noCompte varchar references compte (noCompte),
dateT date DEFAULT current_date,
typeTransac varchar check (typeTransac in ('débit espèces', 'débit chèque', 'crédit espèces', 'crédit chèque')),
credit float,
debit float,
check((debit =0 and credit <>0) OR (debit <> 0 and credit =0)),
primary key(noCompte,dateT )
);
-- Question 2
Select column_name
from information_schema.columns
where table_name ='client' ;
-- Question 3
Select a.constraint_name,b.check_clause
from information_schema.constraint_column_usage as a,
information_schema.check_constraints as b
where a.table_name='client' ;
-- Question 4
-- cf fichier data.sql
select * from compte ;
select * from TRANSACTIONBANCAIRE ;
select * from typecompte ;
select * from client ;
--question 5
SELECT proprietaire FROM compte
WHERE proprietaire in (
SELECT nomPrenom FROM client
WHERE adresse like '%Nancy%' AND UPPER(profession) like 'ENSEIGNANT'
);
DELETE FROM TRANSACTIONBANCAIRE
where noCompte in (
SELECT noCompte FROM compte
WHERE proprietaire in (
SELECT nomPrenom FROM client
WHERE adresse like '%Nancy%' AND UPPER(profession) like 'ENSEIGNANT'));
DELETE FROM compte
WHERE proprietaire in (
SELECT nomPrenom FROM client
WHERE adresse like '%Nancy%' AND UPPER(profession) like 'ENSEIGNANT');
-- question 6
Select * from TRANSACTIONBANCAIRE
where NOCOMPTE in (
select nocompte
from compte as ec, TYPECOMPTE as et
where ec.TYPEC = et.NOM and (et.nom like 'compte courant'))
OR nocompte like 'C%' AND length(noCompte)<7;
-- Question 7
Alter table typecompte add CONSTRAINT cst_question6 check(interet > 0 and interet < 3);
-- Question 8
drop view IF EXISTS VueClients;
create view VueClients as (
select ecl.nomprenom, age(to_date(ecl.datenaiss, 'DD/MM/YYYY')), ecl.adresse, ecl.profession, ec.nocompte
FROM client as ecl, compte as ec
where ecl.nomprenom = ec.proprietaire and upper(ec.typec) like '%COMPTE COURANT%');
---question 9
select * from VueClients order by nomprenom asc;
-- Question 10
SELECT COUNT(nomPrenom),typec FROM Compte JOIN Client ON (proprietaire = nomPrenom)
GROUP BY Compte.typec;
-- Question 11
SELECT nomPrenom FROM Client JOIN Compte ON (proprietaire = nomPrenom)
WHERE nomPrenom IN (SELECT proprietaire FROM Compte WHERE typec = 'compte sur livret')
AND nomPrenom IN (SELECT proprietaire FROM Compte WHERE typec = 'compte courant')
AND nomPrenom IN (SELECT proprietaire FROM Compte WHERE typec = 'compte courant étudiant')
AND nomPrenom IN (SELECT proprietaire FROM Compte WHERE typec = 'compte actions');
-- Ici on a pas de résultats car on a pas de comptes actions--
-- Question 12
SELECT nomPrenom FROM Client
WHERE nomPrenom SIMILAR TO '[^o]*o[^o]*o[^o]*o[^o]*' -- on prend * fois pas de o puis 0 etc etc
OR nomPrenom LIKE '_______________'; -- On met 15 lettres au choix
-- Question 13
SELECT nomPrenom FROM Client
WHERE nomPrenom NOT IN (SELECT proprietaire FROM Compte);
-- question 14
select * from TRANSACTIONBANCAIRE t, COMPTE cpt, CLIENT cl
where t.nocompte = cpt.nocompte and cpt.proprietaire = cl.nomprenom and t.datet > to_date('20210401', 'YYYYMMDD') ;
-- question 15
SELECT COUNT (*) FROM client
WHERE adresse LIKE '%54000%' OR adresse LIKE '%54500%';
-- question 16
SELECT COUNT (*), profession FROM client
WHERE profession LIKE 'Enseignant'
AND adresse LIKE '%54000%'
GROUP BY (profession)
HAVING COUNT(*)>1;
-- question 17
SELECT c1.proprietaire, c1.typec from client as clt, compte c1, compte c2
WHERE c1.typec=c2.typec
AND c1.proprietaire=c2.proprietaire
AND c1.proprietaire=clt.nomprenom
AND c2.proprietaire=clt.nomprenom
AND clt.adresse LIKE '%Nancy%'
;
-- question 18
SELECT clt.nomprenom, sum(cmp.solde) from client clt, compte cmp
WHERE cmp.proprietaire=clt.nomprenom
group by (clt.nomprenom)
;
-- question 19
SELECT cmpt.solde, tb.nocompte, max(tb.datet), tb.typetransac, tb.credit FROM compte cmpt, transactionbancaire tb
WHERE cmpt.solde < 0
AND cmpt.nocompte=tb.nocompte
GROUP BY (cmpt.solde, tb.nocompte,tb.typetransac, tb.credit) ;
---- Partie 2 ----
-- Exo 1 --
-- Question 1
drop procedure IF EXISTS MajSolde();
CREATE PROCEDURE MajSolde() AS $$
DECLARE
i record;
BEGIN
FOR i in SELECT * FROM TRANSACTIONBANCAIRE LOOP
UPDATE Compte SET solde = solde+ i.credit - i.debit where Compte.noCompte = i.noCompte ;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- Question 2
Select solde, noCompte from compte;
CALL MajSolde();
Select solde, noCompte from compte;
-- Question 3
drop procedure IF EXISTS MajSolde_V2(nom varchar);
CREATE PROCEDURE MajSolde_V2(nom varchar) AS $$
DECLARE
i record;
BEGIN
FOR i in SELECT * FROM TRANSACTIONBANCAIRE LOOP
UPDATE Compte SET solde = solde+ i.credit - i.debit where Compte.noCompte = i.noCompte and proprietaire = nom ;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- question 4
Select solde, noCompte from compte where proprietaire = 'Marine Vogt';
CALL MajSolde_V2('Marine Vogt');
Select solde, noCompte from compte where proprietaire = 'Marine Vogt';
-- Exo 2 --
-- Question 1
drop procedure IF EXISTS FiltreClient(N integer);
CREATE PROCEDURE FiltreClient(N integer) AS $$
DECLARE
i record;
BEGIN
FOR i in SELECT * FROM CLIENT LOOP
if EXTRACT(YEAR FROM age(to_date(i.dateNaiss, 'DD/MM/YYYY')))>N then raise notice '% a plus de % ans et habite au %', i.nomPrenom, N, i.adresse;
end if;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- Question 2
CALL FiltreClient(25);
-- Exo 3 --
-- Question 1
CREATE OR REPLACE PROCEDURE Infos_Clients() AS $$
DECLARE
i record;
j record;
BEGIN
FOR i in SELECT * FROM CLIENT LOOP
for j in Select * from compte where proprietaire = i.nomprenom LOOP
raise notice 'M ou Mme % possède un % avec % euros de solde', i.nomPrenom, j.typec, j.solde;
END LOOP;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- Question 2
CALL Infos_Clients();
-- Exo 4 --
-- Question 1
CREATE OR REPLACE PROCEDURE Ouvrir_Nouveau_Compte(NOMPRENOM varchar, ID_COMPTE varchar, TYPE_COMPTE varchar) AS $$
BEGIN
if TYPE_COMPTE in (Select distinct nom from typecompte) and ID_COMPTE not in (select noCompte from compte)
then insert into COMPTE VALUES(ID_COMPTE, TYPE_COMPTE, NOMPRENOM, 0);
end if;
END;
$$ LANGUAGE plpgsql;
-- Question 2
CALL Ouvrir_Nouveau_Compte('Vincent Mollard', 'E-194-202', 'compte courant étudiant');
Select * from compte;
-- Exo 5 --
-- Question 1
CREATE OR REPLACE PROCEDURE CALCUL_DEPENSE(NOMPRENOM varchar) AS $$
DECLARE
i record;
som float;
BEGIN
som = 0. ;
FOR i in SELECT * FROM TRANSACTIONBANCAIRE
where dateT < CURRENT_DATE
LOOP
if i.noCompte in (select noCompte from Compte where proprietaire = NOMPRENOM) then
som = som + i.debit;
end if;
END loop;
raise notice 'M ou Mme % a eu des dépenses de % euros AU TOTAL', NOMPRENOM, som;
END;
$$ LANGUAGE plpgsql;
-- Question 2
-- On a modifié la question pour prendre un TOTAL ici car c'est ce que le prof m'a conseillé
CALL CALCUL_DEPENSE('Christophe Lemaire'); -- 0 pck il a eu que crédit
CALL CALCUL_DEPENSE('Amelie Dupont'); -- 50
\ No newline at end of file
-- Question 4
INSERT INTO CLIENT VALUES(
'Vincent Mollard',
'15/03/1997',
'45 Avenue Général Leclerc 54500 Vandoeuvre les Nancy',
'Etudiant'
);
INSERT INTO CLIENT VALUES(
'Bernard Maigret',
'10/12/1966',
'1 Place des Vosges 54000 Nancy',
'Enseignant'
);
INSERT INTO CLIENT VALUES(
'Olivier Durand',
'15/02/1989',
'21 Avenue de General Leclerc 54000 Nancy',
'Etudiant'
);
INSERT INTO CLIENT VALUES(
'Marine Vogt',
'12/12/1990',
'21 Avenue Jean Jaures 54500 Vandoeuvre les Nancy',
'Ingenieur d Ètude'
);
INSERT INTO CLIENT VALUES(
'Amelie Dupont',
'13/12/1986',
'1 Avenue de la RÈpublique 54000 Nancy',
'Enseignant'
);
INSERT INTO CLIENT VALUES(
'Olivier Lenort',
'27/01/1966',
'3 Place de la RÈpublique 54000 Nancy',
'Agent de sÈcuritÈ'
);
INSERT INTO CLIENT VALUES(
'Christophe Lemaire',
'15/01/1976',
'3 Place de la RÈpublique 63000 Clermont Ferrand',
'Enseignant'
);
INSERT INTO TYPECOMPTE VALUES(
'compte courant',
'courant',
-300,
1
);
INSERT INTO TYPECOMPTE VALUES(
'compte courant étudiant',
'courant',
-200,
0.5
);
INSERT INTO TYPECOMPTE VALUES(
'compte sur livret',
'épargne',
-1000,
2
);
INSERT INTO COMPTE VALUES(
'E-120-256',
'compte courant étudiant',
'Olivier Durand',
-100
);
INSERT INTO COMPTE VALUES(
'C-005-569',
'compte sur livret',
'Marine Vogt',
5260
);
INSERT INTO COMPTE VALUES(
'C-205-569',
'compte courant',
'Christophe Lemaire',
230
);
INSERT INTO COMPTE VALUES(
'L95129',
'compte sur livret',
'Amelie Dupont',
100
);
INSERT INTO COMPTE VALUES(
'C-125-199',
'compte courant',
'Olivier Lenort',
205
);
INSERT INTO COMPTE VALUES(
'C-425-299',
'compte courant',
'Bernard Maigret',
305
);
INSERT INTO TRANSACTIONBANCAIRE VALUES (
'L95129','04/03/2020', 'crédit espèces', 100, 0);
INSERT INTO TRANSACTIONBANCAIRE VALUES (
'L95129','01/12/2020', 'débit espèces', 0, 50);
INSERT INTO TRANSACTIONBANCAIRE VALUES (
'C-005-569','03/03/2021', 'crédit espèces', 150, 0);
INSERT INTO TRANSACTIONBANCAIRE VALUES (
'C-005-569','08/05/2021', 'crédit chèque', 230, 0);
INSERT INTO TRANSACTIONBANCAIRE VALUES (
'C-205-569','01/12/2021', 'crédit chèque', 100, 0);
INSERT INTO TRANSACTIONBANCAIRE VALUES (
'E-120-256','15/04/2021', 'crédit espèces', 100, 0);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment