Esercizio di Algebra relazionale - SQL

di il
10 risposte

Esercizio di Algebra relazionale - SQL

Buon giorno . Devo risolvere un esercizio di algebra relazionale e trasformarlo in SQL .

Considerare la seguente base di dati relativa ad album, cantanti e vendite:
Album(Codice, Cantante, Titolo)
Vendite(Album, Anno, CopieVendute)

4. Trovare i cantanti che hanno inciso almeno due dischi diversi nello stesso anno.

In algebra relazionale ho realizzato questo tipo di interrogazione :

?Codice2,Tit2,Alb2,Anno2,CV2? Codice,Titolo, Album,Anno , CopieVendute(Album)
p Cantante( sAnno=Anno2?Codice <> Codice2(Album |X| Vendite))

Vorrei trasformarlo in SQL Con ACCESS pero non ci riesco . Le tabelle sono le seguenti

Album

Codice Titolo Cantante
1 Miguel Dalida
2 Il tuo bacio è come un rock Adriano celentano
3 Donna amante mia Umberto Tozzi


Vendite
Album Anno Copievendute

Miguel 1967 1000
Alla conquista dell'America 1987 2000
Arrivederci 2007 50000

10 Risposte

  • Re: Esercizio di Algebra relazionale - SQL

    Ma ci hai provato? Cosa hai scritto?
  • Re: Esercizio di Algebra relazionale - SQL

    Secondo me le tabelle non andrebbero strutturate così, ma le vedrei così:
    Cantanti
    IDCantante (numerazione automatica, chiave primaria)
    Cantante

    Album
    IDAlbum (numerazione automatica, chiave primaria)
    Titolo
    IDCantante (numerico)
    Anno
    CopieVendute

    Relazione Cantanti uno-a-molti Album attraverso il campo IDCantante.

    Io non so usare SQL, ma Access offre altri strumenti per arrivarci ugualmente. Puoi usare una query che si chiama "query di ricerca duplicati" (esiste una apposita procedura guidata) da applicare sul campo Titolo...questo nella maniera più semplice possibile. Se si ritiente che un Titolo (per problemi di omonimia) sia stato prodotto da più Cantanti, la ricerca duplicati deve essere effettuata sulla coppia Titolo-IDCantante.
    Dopo aver controllato che questa query funziona, puoi andare a leggere l'SQL sottostante.

    P.S.: credo di aver semplificato il discorso strettamente alla domanda. Vorrei aggiungere che se un Album viene inciso da molti Cantanti, deve cambiare la relazione Cantanti molti-a-molti Album, attraverso una tabella di congiunzione che si potrebbe chiamare AlbumCantanti.
  • Re: Esercizio di Algebra relazionale - SQL

    Grazie per aver risposto pero' non seguo piu' il ragionamento .
    L'unica cosa certa che avevo era la struttura delle tabelle .

    Le tabelle secondo il mio ragionamento sono corrette anche' perche' ho risolto le prime tre domande trasformando l'algebra in SQL e non ho avuto problemi .

    In ogni modo trasformando le istruzioni di algebra relazionale in SQL sono arrivato a questo punto :


    SELECT Codice as Codice2 , Titolo as Titolo2 , Cantante as Cantante2 , Copievendute as CV2 , Anno as Anno2 , Album as Album2
    FROM Album , Vendite


    Mi viene fuori il JOIN come una grande tabella con tutti gli attributi ripetuti .
    Il problema che si presenta e' come confrontare per esempio Codice con Codice2 .
    Appena provo con WHERE , c'e' sempre qualcosa di sbagliato . Sono davvero in difficolta'
  • Re: Esercizio di Algebra relazionale - SQL

    FabioPOl ha scritto:


    Le tabelle secondo il mio ragionamento sono corrette anche' perche' ho risolto le prime tre domande trasformando l'algebra in SQL e non ho avuto problemi.
    Limitatamente al voler rispondere alle singole domande dei tuoi quiz, può darsi che vada bene lo stesso.
    Il discorso della NORMALIZZAZIONE, ossia la corretta organizzazione dei campi nelle tabelle e le conseguenti relazioni, va affrontato come ho detto io...di conseguenza anche la costruzione delle query diventa più snella.
  • Re: Esercizio di Algebra relazionale - SQL

    L' esercizio mi impone di strutturare le tabelle come da descrizione . Non posso cambiare gli attributi come piace a me . Nell' esercizio vengono anche evidenziate le relazioni . Album , Anno e Codice.
    Comunque Grazie per l'interessamento
  • Re: Esercizio di Algebra relazionale - SQL

    FabioPOl ha scritto:


    L' esercizio mi impone di strutturare le tabelle come da descrizione . Non posso cambiare gli attributi come piace a me . Nell' esercizio vengono anche evidenziate le relazioni . Album , Anno e Codice.

    FabioPOl ha scritto:


    Considerare la seguente base di dati relativa ad album, cantanti e vendite:
    Album(Codice, Cantante, Titolo)
    Vendite(Album, Anno, CopieVendute)
    Forse vuoi dirmi che lo stesso Album "Il tuo bacio è come un rock" viene analizzato in più anni e non solo nell'Anno di uscita. Però questo andava chiarito per bene.
    Perdona le mie pignolerie, ma mi lascio trasportare dal MIO modo di concepire questi database (ne ho uno molto simile è più vasto...da normalizzare ad hoc necessariamente, altrimenti non ci si raccapezza).
    Nel frattempo mi sono perso. Le tabelle sono solo quelle due del primo post? La relazione è una sola? Ma dove sta? Fra quali campi?
  • Re: Esercizio di Algebra relazionale - SQL

    Giusta osservazione . Ho riletto il testo e mi sono accorto che qualcosa effettivamente non quadra. In effetti dovrebbe esserci una relazione tra la tabella Album e la tabella Vendite . La relazione e' necessariamente individuata tra l'attributo Album.Codice e Vendite.Album
    esempio

    Album
    Codice Cantante Titolo
    1 Celentano Il mio bacio e' come un rock

    Vendite
    Album Anno Copievendute
    1 1966 20000

    Naturalmente le informazioni sono inventate . Credo che adesso le tabelle siano corrette . Praticamente sono legate dagli attributi Codice e Album.
  • Re: Esercizio di Algebra relazionale - SQL

    Ho tentato di ricostruire secondo le tue indicazioni. Non ho avuto modo di testare, ma ragionando per piccoli passi:

    1. Ho prima creato una Query1 (di selezione) che include entrambe le tabelle con i seguenti campi: Codice, Cantante, Titolo, Anno, CopieVendute. Questo il suo SQL
    SELECT Album.Codice, Album.Cantante, Album.Titolo, Vendite.Anno, Vendite.CopieVendute
    FROM Album INNER JOIN Vendite ON Album.Codice = Vendite.Album;
    2. Ho creato una "query di ricerca duplicati" su Query1 che punta sulla coppia campi Cantante-Anno. L'SQL che ne è venuto fuori è questo
    SELECT First(Query1.[Cantante]) AS CantanteCampo, First(Query1.[Anno]) AS AnnoCampo, Count(Query1.[Cantante]) AS NumDuplicati
    FROM Query1
    GROUP BY Query1.[Cantante], Query1.[Anno]
    HAVING (((Count(Query1.[Cantante]))>1) AND ((Count(Query1.[Anno]))>1));
  • Re: Esercizio di Algebra relazionale - SQL

    Molto bravo e ti ringrazio. Non ho tempo di provare l'esercizio per oggi . domani lo provo .
    Ho visto che hai utilizzato l'INNER JOIN per confrontare le ennuple e secondo me e' un'idea geniale .
    Grazie ancora sei davvero bravo
  • Re: Esercizio di Algebra relazionale - SQL

    Buon giorno Osvaldo . Il programma in Access non funziona per qualche errore di sintassi.
    Il ragionamento e' corretto . Mi si blocca alla terza riga quando dice SELECT FIRST.
    Un errore l'ho trovato ed quello su Ccount . C'e' una C di troppo e l'ho cancellata pero' rimane sempre uno o piu' di uno errori di sintassi .Peccato spero di riuscire a correggerlo


    SELECT Album.Codice, Album.Cantante, Album.Titolo, Vendite.Anno, Vendite.CopieVendute
    FROM Album INNER JOIN Vendite ON Album.Codice = Vendite.Album
    SELECT FIRST (Query1.[Cantante] ) AS CantanteCampo , FIRST (Query1.[Anno]) AS AnnoCampo , count (Query1. [Cantante] ) AS NumDuplicati
    FROM Query1
    GROUP BY Query1.[Cantante], Query1.[Anno]
    HAVING ( ( (Count(Query1.[Cantante] ) )>1) AND ((Count(Query1.[Anno]))>1))
Devi accedere o registrarti per scrivere nel forum
10 risposte