2,3 Algèbre (langage algébrique) BDD : Notations : R(X), S(Y) deux relations X et Y deux listes d'attributs t et s deux tuples de R et de S. RS relation résultat projection : -Syntaxe : <nom_relation_résultat> projection (nom_relation, liste d'attributs) -Sémantique Soit R(X) une relation, V C X RS Projection(R,V) = { t(v), t E R } exemple : Requete 1 : trouver les noms des pilotes : pilote1 projection(pilote, PLNOM) on a donc : pilote1 = PLNOM Miranda Marion Francis Tom Requete 2 : lister les noms et les salaires des pilotes pilote2 projection(pilote, PLNOM, salaire) on a donc : pilote2 = PLNOM SALAIRE Miranda nahn eliane lofti 12000 20000 3000 40000 Sélection : -Syntaxe : <nomrelationresultat> Selection(<nom_relation>, <nom_attribut> Θ constante ) Θ theta = { '=' ou '!=' ou '>' ou '<' ect } -Sémantique Soit A un attribut de R(X) et c une valeur E au dommane de A RS Selection (R/A Θ c) = Lt / t E R et t(a) Θ c vraie } Exemple : Requete 3 : Lister les pilotes habitant Paris pilote3 Selection(Pilote, VILLE = '' )
on a donc : pilote3 = PLNUM PLNOM PLPRENOM VILLE SALAIRE 1 2 5 8 7 Dupont taladoire bonfils marcenac lahire François Tom rené Lucas Laura Paris 10000 3000 50000 8000 80000 Jointure -Syntaxe : <nomrelaiton> jointure(<nomrelation1>,<nomrelation2>, A1 Θ A2 ) exemple : RS JOINTURE (pilote, vol/plnum=plnum) on a donc : (les deux tables coller ) requete 4 : Quels sont les noms des pilotes assurant des vols au départ de? R1 projection(pilote, PLNUM,PLNOM) R2 projection(vol, PLNUM, VILLE) R3 selection(r2 / VILLE = 'Paris') R4 jointure(r1,r3 /PLNUM = PLNUM ) On a donc R4 = PLNUM PLNOM PLNUM VILLE 1 5 6 Dupont taladoire bonfils 1 5 6 Paris Pour garder que le nom des pilotes on fait : R5 Projection(R4,PLNOM) Requete 5 : Quels sont les noms des pilotes qui conduisent des avions de capacité >250? R1 jointure (avion,vol / AVNUM = AVNUM) R2 sélection(r1 / CAPACITE > 250 ) R3 jointure (R2,Pilote / PLNUM = PLNUM ) R4 projection ( R3, PLNOM ) (juste mais deuxième solution meilleur ) Correction : R1 projection ( Pilote, PLNUM, PLNOM) R2 Projection ( Avion, AVNUM, CAPACITE) R3 Sélection (R2 / Capacité > 250 ) R4 Projection ( vol, AVNUM, PLNUM ) R5 jointure ( R1, R4/ PLNUM = PLNUM ) R6 jointure (R5, R3 / AVNUM = AVNUM ) R7 projection ( R6, PLNUM)
2.3.2 : Opérateurs ensemblistes : UNION INTERSECTION DIFFERENCE 2. relation compatibles : -même nombre d'attributs -attributs respectifs définis sur le même domaine syntaxes UNION : <nomrelation resultat> UNION (<nomrelation1><nomrelation2>) INTERSECTION : <nomrelation resultat> INTERSECTION(<nomrelation1><nomrelation2>) DIFFERENCE : <nomrelation resultat> DIFFERENCE (<nomrelation1><nomrelation2>) union : je met les tables ensembles intersection : tous les tuples en commun difference : on recupere tous ce qui n'est pas en commun entre les deux relation ex : Lister les noms d'avions de capacité > 250 ou localisé à : R1 sélection( avion/capacité > 250) //selection des avions de capacité > 250 R2 sélection ( avion / localisation = '' ) //selection des avions localisé à R3 union ( R1,R2) //union des deux tables R4 projection ( R3, AVNOM ) //on récupère que les nom de la dernière table Langage de requête SQL (structured query language) Vocabulaire : Relation table Attribut colonne tuple ligne domaine types = number(n), char (N), date (N) En SQL on peut faire des projection, des sélection, des jointures, des unions, des intersection mais aussi on peut utiliser des fonctions statistique, partition de données, tri 1. Sélection/ projection : SELECT liste de colonnes résultat FROM table WHERE condition exemple : projection : quelles sont toutes les infos sur les pilotes? SELECT * FROM PILOTE ; Conditions spécifiques IS NULL ( exemple : select PLNOM from PILOTE where VILLE is null) IN ( ex : select capacite from avion where avnom in ( 'A310', 'A320', ' A330' ) BETWEEN v1 AND v2 LIKE 'chaine générique' ( * : remplacer un caractère, % remplacer suite de caractère ) ( ex : select plnom like 'n %' ) Conditions complexe : Quels sont les vols au départ de Nice desservant Paris? SELECT * FROM vol WHERE villedep = 'nice' AND villearr = 'Paris' ;
Quels sont les noms des avions differents des airbus? SELECT avnom from avion where avnom NOT LIKE 'A3*0' 2. Fonctions statistiques : SUM() : somme AVG() : moyenne COUNT() : cardinalité MAX () : valeur maximale MIN () : valeur minimale Quels sont les salaires moyens des pilotes nicois? SELECT avg(salaire) AS moyenne_salaire FROM pilote WHERE ville = 'NICE' ; nombres de vols au départ de Nice? SELECT COUNT(volnum)/COUNT(*) FROM vol WHERE villedep ='NICE' 3. Tri des résultats ORDER BY colonne ( [ASC : ascendant et DESC : descendant ] ) Donner les noms des pilotes clermontois par ordre de salaire decroissant SELECT PLNOM FROM PILOTE WHERE ville = 'clermont' ORDER BY salaire [DESC] ; 4.Classification ou partitionnement GROUP BY organiser une table selon une colonne exemple : moyenne des salaires des pilotes par ville : select avg(salaire), ville from pilote group by ville /!\ AS moyenne permet que la colonne AVG(salaire) s appelle moyenne Recgerche dans les sous-tables : Select From GROUP BY having condition exemple : Donner le nombres de vols par pilote (s'il est superieur ou égal à 3 ) Select PLNUM, COUNT(VOLNUM) AS nb_vol FROM vol GROUP BY plnum HAVING COUNT(volnum) >= 3 ; 5 expression de la jointure : 6 expression des opérateur ensemblistes : UNION (or) select x from x where x=x UNION select x from x where y=x 7 expression de l'intersection INTERSECT (AND) 8 expression de diference : MINUS (NOT ) exercice :
1 : select intitule from epreuve 2 : select nom, age, sex from etudiant 3 : select * from manifestation where dateman > #12/04/99# 4 :SELECT nbetudiant FROM iut WHERE iut.adresse = «BELFORT» 5: SELECT * FROM etudiant, IUT where etudiant.noiut = IUT.noIUT AND iut.adresse = «belfort» 6 : SELECT NOM from etudiant where age IN ( select age from etudiant where nom= 'toto' ) ; on peut aussi écrire : SELECT E2.nom FROM Etudiant E1, Etudiant E2 WHERE E1.age = E2.age AND E1.nom = «toto» 7 : nombre d'épreuve par manif : Select count(numepreuve) from contenu group by numman 8 : Select Count (Etudiant.noEtuiant), nomiut from Etudiant, participe, iut where etudiant.noetudiant=participe.noetudiant and Etudiant.noIut=Iut.noIut group by nomiut 9 : select noetudiant, Manifestation from participe, Manifestation where noetudiant IN (select noetudiant from etudiant where nom=»toto» ) and Participe.numMan = Manifestation.numMan ; 8 correction :: Select numiut, count(distinct noetudiant) from participe p, Etudiant e where p.noetudiant =e.noetudiant group by e.noiut ; 9correction : select distinct m.nomman from manifestation m, participe p, etudiant e where m.numman = p.numman and p.noetudiant = e.noetudiant and e.nom=»toto» Partiel BDD 7/01/09 : question 1 : EMPRUNTE -dateretour -Etat EMPRUNTE : -dateemprunt OUVRAGE : -idouvrage -titre -anneeparution Est de TYPE : -idtype -libelle ABONNE : -noabonne -nom -prenom -adresse -age A pour edite AUTEUR : EDITEUR : -noauteur -nomauteur -Prenom -noediteur -NomEditeur
Question 2 : 1) select titre, nomediteur from ouvrage, editeur where noediteur IN (select noediteur from editeur where nomediteur = «editor» ) 2)select count(*) from date where dateemprunt => #12/12/2008 AND dateemprunt <= #15/12/2008 # ; 3) Select count( distinct noabonne ) from emprunt where dateretour = NULL 4) select titre from ouvrage where anneeparution in (SELECT anneeparution from Ouvrage where titre = «dahlia noir») ; OU select o1.titre from ouvrage o1, ouvrage o2 where o1.anneeparution = 02.anneeParution and o2.titre = «dalia noir» 5)select avg(age) from abonne inner join emprunte on emprunte.noabonne = Abonne.noabonne inner join ouvrage on ouvrage.idouvrage = emprunte.iouvrage inner join EST DE on EST DE id.ouvrage = ouvrage.idouvrage inner joint type on type.idtype = estde.idtype where ouvrage.titre = «le dalia noir» and type;libelle = «live» 6)select a.noabonne, a.nom, count(*) from emprunte em, abonne a, est de e, type t where em.noabonne and em.idouvrage = e.idouvrage and e.type )t.idtype and t.libelle = «livre» group by a.noabonne, a.nom ; 7) MCD Concert : requete SQL : 1) Select MoyenPaiement From vente ; 2) prix moyen des billets de concert de johnny hallyday à l'axone de montbéliard en 2012 : Select AVG(Billet.prix) from billet INNER JOIN Concert ON concert.concet_id = billet.concert_id INNER JOIN Artiste ON artiste.artiste_id = concert.concert_id INNER JOIN salle ON salle.salle_id = concert.salle_id WHERE Artiste.nomArtiste = «johnny hallyday» AND salle.nomsalle = «axone montbéliard» AND concert.date between «01/01/012» AND «31/12/2012» 3) Select Concert.date from concert INNER JOIN artiste on artiste.idartiste = concert.idartiste INNER JOIN salle on salle.idsalle = concert.idsalle
where artiste.nomartiste = «corneille» and salle.nomsalle = «axone» 4)noms des salles dans l'ordre décroissant de leur capacité SELECT nomsalle FROM salle ORDER BY capacite [DESC] 6) Nombre de concerts proposés dans chacune des salle de spectacless ( nom salle et nombre concert) select count(concert.idconcert), salle.nomsalle from salle, concert INNER JOINsalle ON salle.idsalle = Concert.idSalle group by salle.idsalle 7) select count(vente.vente_id) from Vente INNER JOIN Billet ON vente.billet_id = billet.billet_id INNER JOIN Concert ON concert.concert_id = billet.concert_id INNER JOIN Artiste ON artiste.artiste_id = concert.concert_id INNER JOIN salle ON salle.salle_id = concert.salle_id where artiste.nomartiste = «christophe mae» salle.nomsalle = «axone» Concert.dateConcert = «03/03/2012» 8) Chanteurs n'ayant jamais réalisé de concert à la cigale : SELECT nom_artiste FROM ARTISTE MINUS SELECT nom_artiste FROM ARTISTE INNER JOIN concert ON concert.id_artiste = artiste.id_artiste INNER JOIN salle ON salle.salle_id = concert.salle_id WHERE Salle.nomSalle = «cigale» 9)select concert_id from concert INNER JOIN Billet ON bille.idconcert = concert.idconcert INNER JOIN vente ON vente.billet_id = billet.billet_id group by Concert.idConcert HAVING count(vente.idvente) > 20000 10)