Travailler avec des bases de données, comment puis-je trouver MAX en utilisant l'algèbre relationnelle ?
Supposons que A avait une autre colonne y
, et que l'on vous demande de sélectionner y
avec max
x
, comment feriez-vous cela ? Merci.
Travailler avec des bases de données, comment puis-je trouver MAX en utilisant l'algèbre relationnelle ?
Supposons que A avait une autre colonne y
, et que l'on vous demande de sélectionner y
avec max
x
, comment feriez-vous cela ? Merci.
Veuillez utiliser du texte, pas des images/liens, pour le texte (y compris le code, les tables et les ERDs). Utilisez une image uniquement pour faciliter la lecture du texte et/ou pour ce qui ne peut pas être donné en texte. Et ne donnez jamais de diagramme sans légende/clé. Utilisez les fonctions d'édition pour intégrer directement, pas de liens, si vous avez les autorisations - rendez votre publication autonome.
Récemment, cette question est apparue comme matériel de pratique dans un module de base de données et lorsque je cherchais de l'aide, je n'ai trouvé aucune bonne réponse. La réponse de "Md. Rezwanul Haque" est correcte mais elle n'est pas vraiment expliquée car elle repose sur des connaissances préalables (Si vous ne comprenez pas le Produit Cartésien).
Donc, voici la réponse avec mon explication, j'espère que cela rendra les choses plus faciles pour certains :
TABLEAU : PERSONNES
PERSONNES.nom PERSONNES.age
'Jack' 16
'Megan' 15
'Harry' 14
'Lilly' 16
'Michael' 8
L'idée est de "Collect what you don't want and remove it from what you have; leaving you with what you want."
Lors du filtrage à l'aide de la SÉLECTION
, nous ne pouvons comparer que ce qui se trouve dans le Tuple que nous avons. Cela signifie que nous devons ajouter à ces tuples les données avec lesquelles nous voulons les comparer.
Donc, nous devrions fusionner notre Table PERSONNES
avec les données avec lesquelles nous voulons comparer. Cela peut être fait à l'aide de l'opérateur x (Produit Cartésien)
Quelque chose comme ceci : PERSONNES x PERSONNES
cependant nous ne pouvons pas le faire car le tableau résultant ressemblerait à ceci :
TABLEAU : PERSONNES x PERSONNES
PERSONNES.nom PERSONNES.age PERSONNES.nom PERSONNES.age
'Jack' 16 'Jack' 16
Nous avons des noms d'attributs en double
cela signifie que nous devons créer une Copie
de la Table PERSONNES
, une qui a un nom différent que nous pouvons référencer. Sinon, nous ne pouvons pas utiliser l'opérateur de Produit Cartésien x
car il exige que tous les attributs soient uniques dans le tableau résultant, vous ne pouvez pas avoir deux attributs PERSONNES.nom
.
C'est là que nous utiliserions l'opérateur RENOMMER
qui ressemblerait à ceci :
PERSONNES ⨯ (ρ ALT (PERSONNES))
Ici, ce que j'ai fait est d'utiliser le Produit Cartésien
pour fusionner PERSONNES
et ALT
où ALT
est PERSONNES renommée
en ALT
Cela nous donnerait un Tableau qui ressemble un peu à ceci :
TABLEAU : PERSONNES x ALT
PERSONNES.nom PERSONNES.age ALT.nom ALT.age
'jack' 16 'jack' 16
'jack' 16 'megan' 15
'jack' 16 'harry' 14
'jack' 16 'lilly' 16
'jack' 16 'michael' 8
(Le tableau résultant est (PERSONNES.taille * PERSONNES.taille) = 5*5 où la taille est le nombre de tuples) Où chaque valeur de PERSONNES
est mise en regard de chaque valeur de ALT
Maintenant, nous pouvons filtrer toutes les valeurs et récupérer celles que nous ne voulons pas. Donc disons que je veux seulement les personnes les plus âgées dans PERSONNES
cette question peut être reformulée en : Uniquement les personnes qui ne sont pas plus jeunes que quelqu'un
donc nous ne récupérons que ceux qui sont plus jeunes que quelqu'un. Nous faisons cela parce que il est plus facile d'interroger pour ce que nous ne voulons pas que pour ce que nous voulons
.
Ainsi, notre Prédicat
serait : PERSONNES.age < ALT.age
où nous sélectionnons uniquement ceux qui sont plus jeunes que quelqu'un
.
Si nous inversions le Prédicat
en PERSONNES.age > ALT.age
nous obtiendrions un mélange de personnes qui ne sont pas les plus âgées, mais qui sont plus âgées qu'au moins une personne
. Cela pourrait nous aider à obtenir la personne la plus jeune
Cela nous donne une SÉLECTION
comme ceci:
(σ (PERSONNES.age < ALT.age) (PERSONNES x (ρ ALT (PERSONNES))))
Cela produirait un TABLEAU comme ceci:
TABLEAU : (σ (PERSONNES.age < ALT.age) (PERSONNES x (ρ ALT (PERSONNES))))
PERSONNES.age PERSONNES.nom ALT.nom ALT.age
'megan' 15 'jack' 16
'megan' 15 'lilly' 16
'harry' 14 'jack' 16
'harry' 14 'megan' 15
'harry' 14 'lilly' 16
'michael' 8 'jack' 16
'michael' 8 'megan' 15
'michael' 8 'harry' 14
'michael' 8 'lilly' 16
Où les résultats sont des personnes qui sont plus jeunes que quelqu'un, et à qui elles sont plus jeunes. Cependant, notre requête est : Uniquement les personnes qui ne sont pas plus jeunes que quelqu'un
ce qui est exactement l'opposé de cela. Ainsi, ce n'est pas notre objectif, nous devons en faire un peu plus. Si vous deviez :
π PERSONNES.nom PERSONNES.age (σ (PERSONNES.age < ALT.age) (PERSONNES x (ρ ALT (PERSONNES))))
Cela nous donnerait un tableau composé de megan, harry et michael
c'est un tableau composé de : Uniquement les personnes qui sont plus jeunes que quelqu'un
maintenant nous avons un tableau qui ne contient que Uniquement les personnes qui sont plus jeunes que quelqu'un
mais ce que nous voulons est Uniquement les personnes qui ne sont pas plus jeunes que quelqu'un
donc ce que nous devons faire est de supprimer toutes les personnes qui sont plus jeunes que quelqu'un de la Table PERSONNES pour nous donner uniquement celles qui ne sont pas plus jeunes que quelqu'un
.
Donc nous devons utiliser l'opération de Soustraction
pour enlever ces Tuples de notre table PERSONNES
. Ce qui nous donne notre Requête Finale de :
PERSONNES - (π PERSONNES.nom PERSONNES.age (σ (PERSONNES.age < ALT.age) (PERSONNES x (ρ ALT (PERSONNES))))
Ce qui produit le Tableau suivant:
PERSONNES - (π PERSONNES.nom PERSONNES.age (σ (PERSONNES.age < ALT.age) (PERSONNES x (ρ ALT (PERSONNES))))
PERSONNES.nom PERSONNES.age
'jack' 16
'lilly' 16
Où Jack et Lilly sont les seules personnes dans PERSONNES qui ne sont PAS plus jeunes que quelqu'un
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Algèbre relationnelle d'agrégation (Maximum)