Forum pour la partie Bases de données du Bloc 4

Ouverture du bal au forum BD Bloc4 DIU

Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
Vastuste arv 26

Bonjour,

ceci pour annoncer officiellement l'ouverture du forum relatif à l'aspect Bases de Données.

Je comprends que la multiplication des canaux de discussion/échange ne simplifie pas les choses pour vous mais je suis malheureusement allergique à slack quand certains de mes collègues sont très à l'aise avec (je fais peut être partie de la vieille école).  Cependant, j'y vois un avantage dans le sens où les sujets abordés sont différents, du moins, devraient l'être.  

Bon courage à tous et ne pas hésiter à poser vos questions.

S. Maabout

Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Olivier Aumaire
3d je propose ca (si qqun peut vérifier: Pi profession,superficie(sigma occupant=rachel(personne jointure renommage nomgerant en nom (immeuble) jointure appart jointure occupant))
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin
Une question : le INNER JOIN est donc inutile ?
Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
INNER JOIN complètement inutile. Personnellement, je n'en parle jamais à mes étudiants. Historiquement, ça a été ajouté à la syntaxe SQL pour signifier au système (SGBD) que notre requête utilise une jointure non pas un produit cartésien. Il pourra exploiter cette information pour évaluer plus rapidement la requête. Et là on aborde le sujet de comment le SGBD fait-il pour évaluer "efficacement" les requêtes. Sans donner trop de détails, effectuer un produit cartésien suivi d'une sélection afin de réaliser une jointure est bien plus couteux (en temps d'exécution) que de réaliser une jointure. Les anciens SGBD n'étaient pas assez intelligents pour "deviner" que telle requête a besoin d'une jointure. Il fallait le leur dire explicitement en utilisant INNER JOIN. Actuellement, tous sont capables de "deviner" l'existence de jointure.
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin
Je viens de regarder le programme et les requetes SQL sont : SELECT, FROM, WHERE, JOIN
Cela signifie qu'il faut parler de JOIN car au bac, les élèves risquent d'en avoir.
Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
Je pense, et ce n'est que l'avis de quelqu'un qui n'a pas participé à la conception du programme, qu'il vaut mieux entrainer les élèves à utiliser SQL sans JOIN. Une fois qu'ils ont compris que ... FROM R1, R2 WHERE R1.A=R2.A ... n'est rien d'autre qu'une jointure, on pourra leur introduire la notation ... FROM R1 INNER JOIN R2 ON R1.A=R2.A pour dire que c'est une autre manière d'exprimer la même chose.
Bon courage pour expliquer/justifier l'intérêt de cette deuxième notation. Noter que pour l'algèbre, la justification était la simplification de l'écriture des requêtes et rien d'autre.

PS: Le seul intérêt de ce type de notation c'est quand on veut faire une "jointure externe" [LEFT ou RIGHT] OUTER JOIN. Opération non abordée dans le cours et à ma connaissance hors programme.
PPS: D'ailleurs, dans le programme c'est JOIN ou bien INNER JOIN ?
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin

Merci

Dans le programme c'est JOIN dont il est question. J'avais regardé le bouquin de Terminale NSI qui est sorti et dedans il parlait uniquement de INNER JOIN et je pensais même que c'était la même chose.

Xavier 

Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
Personnellement, je connais INNER JOIN et OUTER JOIN mais JOIN tout court je ne connais pas. Donc écrire dans le programme que JOIN doit être enseigné sans autre précision (INNER et OUTER ou seulement INNER) ce n'est pas suffisament précis.
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin

Dans ce manuel de NSI, ils ne parlent que de INNER JOIN en disant que INNER est facultatif.


Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin
Question 2c des exos SQL
Avec cette requete, j'obtiens les professions de Doug et de Ross malgré la demande que NomOccupant='Rachel'
Où est mon oubli ?
Manus Capture.PNG
Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Akka Zemmari

Je pense que vous avez juste oublié une jointure entre Personne et Occupant. Du coup, le résultat de votre requête est d'abord un produit cartésien entre la jointure de Immeuble et Personne ET la table Occupant. 


Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
La condition "NomOccupant = 'Rachel' " permet de sélectionner l'enregistrement de Occupant qui correspond à Rachel mais cet enregistrement sera associé à tous les immeubles. Vous avez ajouté une condition pour n'associer chaque immeuble qu'à la personne qui le gère mais vous n'avez pas ajouté de condition qui permet de n'associer à chaque occupant (et préciisément Rachel) à l'immeuble où il/elle habite.
Règle souvent vraie (à moins de vouloir effectuer un produit), si j'ai n tables dans la clause FROM, il y a au moins n-1 conditions de jointure dans la clause WHERE. Ici, on a 3 tables et on ne veut pas les associer n'importe comment:
*/ Chaque immeuble à la personne qui le gère (votre condition)
*/ Chaque Occupant au bon immeuble => Occupant.NomImmeuble = Immeuble.NomImmeuble
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Jean Pierre Gardette

Bonjour, Je ne comprends pas pourquoi j'obtiens un doublon avec cette requête..

Manus BDD1.jpg
Vastuses Jean Pierre Gardette

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
Vous avez dû dupliquer les insertions dans immeuble.
Faites: select * from Immeuble
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Jean Pierre Gardette
Je voudrais réinjecter le fichier creation_BD_immo mais je n'arrive pas à supprimer la base de donnée dans postgre. Comment procéder ?
Vastuses Jean Pierre Gardette

Re: Ouverture du bal au forum BD Bloc4 DIU

Akka Zemmari

Vous pouvez commencer par supprimer les tables :

drop table Immeuble;

drop table Appart;

drop table Personne;

drop table Occupant;

Ensuite, vous relancez le script et ça devrait être bon.

Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin

Le compteur Count comptabilise tous les apparts et pas seulement immeuble par immeuble

Manus Capture1.PNG
Manus Capture2.PNG
Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Akka Zemmari
Il vous manque une clause GROUP BY pour avoir le compte immeuble par immeuble.
Donc la bonne requête est :
SELECT NomImmeuble, COUNT(NoAppart)
FROM Appart
GROUP BY NomImmeuble.
Vastuses Akka Zemmari

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin

J'ai fini par comprendre que c'était avec GROUP BY mais comme ce n'est pas au programme de la Terminale NSI, j'essayais de le faire sans. Mais je n'y suis pas arrivé ! 

Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout

Vous éviterez donc à demander aux élèves d'écrire cette requête naeratus  Mon impression est que si l'on prend la partie SQL du programme, c'est finalement un sous-ensemble de l'algèbre relationnelle (ex: pas d'union pas de différence). 

Vastuses Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

Sofian Maabout
Vous pourriez par contre faire:
SELECT COUNT(NoAppart) AS NB_Apparts_De_Koudalou
FROM Appart
WHERE NomImmeuble = 'Koudalou'

Vous obtiendrez
------------------------
|Apparts_De_Koudalou|
------------------------
4
Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Xavier Dupin

Merci

C'est ce que j'avais réussi à faire mais c'est quand je remplaçais NomImmeuble='Koudalou' par NomImmeuble IN (SELECT NomImmeuble FROM Immeuble), c'était là que le comptage s'effectuait sur tout.

Il est vrai que le programme ne parle pas d'EXCEPT ou d'UNION. Et donc ces exemples là seront aussi à mettre de côté (ou à faire avec les élèves qui avancent vite).

Merci bcp

Vastuses Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

Benoit Barusseau
Bonjour, pour la question g.
Cela fonctionne avec SELECT NomImmeuble
FROM Immeuble
EXCEPT(
SELECT NomImmeuble
FROM (
SELECT DISTINCT Noappart, NomImmeuble
FROM Appart

EXCEPT

SELECT DISTINCT Noappart, NomImmeuble
FROM Occupant)
As T
)

Mais 1) n'y aurait-il pas une syntaxe plus simple?
2) quelles sont les regles de syntaxe , indentation etc?