65 votes

Comment puis-je trouver MAX avec l'algèbre relationnelle?

Travailler avec des bases de données, comment puis-je trouver MAX en utilisant l'algèbre relationnelle ?

0 votes

4voto

Md. Rezwanul Haque Points 2164

Recherchez le MAX :

  • Stratégie :

    1. Trouvez les x qui ne sont pas le MAX.

      • Renommez la relation A en d afin que nous puissions comparer chaque A x avec tous les autres.
    2. Utilisez la différence d'ensemble pour trouver les A x qui n'ont pas été trouvés à l'étape précédente.
  • La requête est : entrez la description de l'image ici

0 votes

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.

0 votes

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.

1voto

Raju Points 614
 Projet x(A) - Projet A.x
(Sélectionner A.x < d.x (A x Renommer d(A)))

0voto

Ry- Points 29

Algèbre relationnelle (Filtrage par comparaison)

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

Étape 1 (Construction d'une table à interroger)

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 ALTALT 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

Étape 2 (Sélection)

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

Étape 3 (Obtention de notre table finale)

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

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.

Powered by:

X