2017-10-03 5 views
-1
Enroll (table): 

cid  sid grade gradepoint 
CS425  001 A  4.0 
CS595  001 B  3.0 
CS595  002 A  4.0 
EE401  001 A  4.0 
EE401  002 B  3.0 
EE401  004 A  4.0 
PHYS571 002 C  2.0 
PHYS571 004 A  4.0 

En utilisant l'algèbre relationnelle, l'opération est (excusez le manque de lettres grecques, je ne sais pas comment les ajouter sur le SO):Quel serait le résultat de cette opération sur ces tables?

select_(Enroll.gradepoint<x.gradepoint)^Enroll.cid=x.cid (Enroll x rho_x(Enroll)) 

Fondamentalement, il dit faire un produit cartésien de la table Enroll avec elle-même (renommer la deuxième instance de Enroll en "x"), puis sélectionnez uniquement les lignes où le cid correspond (bien sûr) et où le point de pondération est inférieur à lui-même. Mais cela n'a aucun sens. Cela ne se traduirait-il pas par un ensemble vide?

+0

Se pourrait-il que dans l'algèbre relationnelle, l'ordre * des termes dans le prédicat de la sélection ait réellement de l'importance? – JohnSmithy1266

+0

Non, @ JohnSmithy1266, l'ordre dans la sélection σ n'a pas d'importance, ni dans la projection π. Il n'y a pas d '«ordre de colonne» dans RA et l'accès est uniquement par nom d'attribut. Il n'y a pas non plus de dénomination d'attribut dot-prefix (utilisez-vous réellement SQL?) - quelle version de RA utilisez-vous? Je ne peux pas suivre votre notation. Par ρ (rho) renommer la relation «Enroll» à «x», je suppose que vous obtenez deux copies de chaque attribut découlant du produit cartésien. Vous correspondez uniquement à 'cid', donc vous aurez différents' sid's, 'grade's,' gradepoint's. – AntC

+0

@ Antec Je ne savais pas qu'il y avait différentes variations de RA. J'utilise la norme enseignée dans un cours de l'école supérieure, je suppose. – JohnSmithy1266

Répondre

1

Supposons que l'opérateur rename n (r) renvoie une valeur de table comme r mais avec de nouveaux noms d'attribut comme les anciens préfixés par n.. Ensuite, nous avons:

/* rows where 
    (cid, sid, grade, gradepoint) in Enroll 
and (x.cid, x.sid, x.grade, x.gradepoint) in Enroll 
and gradepoint < x.gradepoint and cid = x.cid 
*/ 
restrict gradepoint < x.gradepoint and cid = x.cid (
    Enroll times rename x (Enroll) 
    ) 

(Quelles sont les lignes de la forme (cid, sid, grade, gradepoint, x.cid, x.sid, x.grade, x.gradepoint).)

Malheureusement, ce commentaire ne dit rien au sujet de la situation d'affaires. Donc, non plus la table. Mais supposons que dans notre cas (cid, sid, grade, gradepoint) in Enroll quand in coursecidstudentsidgot gradegrade& grade point averagegradepoint. (Ceci est (caractéristique) prédicat de la table en termes d'affaires.) Ensuite, en remplaçant le in nous obtenons que cette requête est:

/* rows where 
    in course cid student sid got grade grade & grade point average gradepoint 
and in course x.cid student x.sid got grade x.grade & grade point average x.gradepoint 
and gradepoint < x.gradepoint and cid = x.cid 
*/ 

Chaque ligne d'une valeur de la table (résultat constant/variable ou requête) fait une déclaration de le brancher dans le prédicat de la table. (Et chaque ligne absente indique la négation/not de l'instruction de la brancher dans le prédicat.) Le concepteur donne les prédicats constants/variables et le prédicat de résultat de requête provient de ceux & les opérateurs de relation. (restrict & join s (y compris times & intersect) introduisons and, project introduit there exists, union introduit or, minus introduit and not, etc.)

Ici, la déclaration implique un cours et deux gradepoints, appartenant chacun à un étudiant différent . Il n'y a donc pas "où le point de pondération est inférieur à lui-même".

Forming a relational algebra query from an English description
Is there any rule of thumb to construct SQL query from a human-readable description?

(Un soi-disant « opérateur d'algèbre », comme vous le dites à « renommer » une valeur est vraiment un non-terminal langage de programmation pour l'attribution à une variable. C'est orthogonal à des valeurs d'algèbre & opérateurs.)

+0

J'essaie de comprendre votre réponse, mais je suis un peu confus. Je pense que vous pourriez avoir une désignation de code erronée, par exemple autour du mot "got" ou "in course". – JohnSmithy1266

+1

Votre commentaire n'est pas clair. Mais "en cours ..." n'est pas du code, c'est un * anglais *, c'est un gabarit ce que dit une rangée à propos de la situation de l'entreprise. Les lignes qui font une déclaration vraie vont dans la table. Nous disons, c'est ce que signifie la table; c'est le prédicat * (caractéristique) de la table en termes commerciaux. Avez-vous lu les liens? Je vais éditer quand je peux. * S'il vous plaît * lire votre titre et question et voir que ce n'est pas clair ce que vous demandez. Et adresse tous mes commentaires. – philipxy