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

av Sofian Maabout -
Antall svar: 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

Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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))
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av Xavier Dupin -
Une question : le INNER JOIN est donc inutile ?
Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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.
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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.
Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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 ?
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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 

Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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.
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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 ?
Vedlegg Capture.PNG
Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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. 


Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av Jean Pierre Gardette -

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

Vedlegg BDD1.jpg
Som svar til Jean Pierre Gardette

Re: Ouverture du bal au forum BD Bloc4 DIU

av Sofian Maabout -
Vous avez dû dupliquer les insertions dans immeuble.
Faites: select * from Immeuble
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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 ?
Som svar til Jean Pierre Gardette

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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.

Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av Xavier Dupin -

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

Vedlegg Capture1.PNG
Vedlegg Capture2.PNG
Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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.
Som svar til Akka Zemmari

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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é ! 

Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av Sofian Maabout -

Vous éviterez donc à demander aux élèves d'écrire cette requête smiler  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). 

Som svar til Xavier Dupin

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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
Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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

Som svar til Sofian Maabout

Re: Ouverture du bal au forum BD Bloc4 DIU

av 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?