CAPIRE LOGICA DIETRO RISOLUZIONE QUERY

di il
4 risposte

CAPIRE LOGICA DIETRO RISOLUZIONE QUERY

Buonasera, scrivo in quanto non riesco a capire la logica che vi è dietro degli esercizi che attualmente mi vengono assegnati in un mini corso che sto frequentando, in particolare chiedo se qualcuno riuscirebbe a spiegarmi in modo semplice la logica che vi è dietro e del perchè si utilizzano determinate funzioni scritte in un determinato ordine. Quel che non riesco a capire è come scrivere in linquaggio SQL. Malgrado abbia la soluzione non riesco a capire perfettamente quale sia la logica che viene utilizzata per arrivare a 'stampare' la richiesta della traccia
Di seguito alcuni esercizi che mi sono proposti:

ENTITA':
REGISTA (CF, Nome, Cognome, Genere)
FILM (Titolo, Durata, Genere, Incasso, Budget)
ATTORE (CF, Nome, Cognome, Genere)

ASSOCIAZIONI:

DIRIGE (CF, Titolo, Anno)
RECITA (CF, Titolo, Anno, Compenso

a)Trovare gli attori che hanno recitato per il regista che ha diretto il maggior numero di film
b)Trovare i registi che hanno diretto il maggior numero di attori
c)Trovare il regista che ha diretto il film con il budget più alto
d)Trovare i registi che hanno diretto il maggior numero di attori

SOLUZIONE A:

SELECT A.CF
FROM Attore A, Recita, R, Film F, Dirige D
WHERE D.CF IN ( SELECT D1.CF
FROM Dirige D1
GROUP BY D1.CF
HAVING COUNT(D1.Titolo) >= ALL (SELECT COUNT (D2.Titolo)
FROM Dirige D2
GROUP BY D2.CF)

Qualcuno riuscirebbe a fare una mini guida su come scrivere la soluzione indicando chiaramente il perchè si scrive in un determinato modo (non mi importa la soluzione delle tracce,quella è presente nel file in mio possesso, mi interessa capire perchè si scrive in quel determinato modo).

Grazie in anticipo.

4 Risposte

  • Re: CAPIRE LOGICA DIETRO RISOLUZIONE QUERY

    Fra92 ha scritto:


    a)Trovare gli attori che hanno recitato per il regista che ha diretto il maggior numero di film
    SOLUZIONE A:
    SELECT A.CF
    FROM Attore A, Recita, R, Film F, Dirige D
    WHERE D.CF IN ( SELECT D1.CF
    FROM Dirige D1
    GROUP BY D1.CF
    HAVING COUNT(D1.Titolo) >= ALL (SELECT COUNT (D2.Titolo)
    FROM Dirige D2
    GROUP BY D2.CF)
    Devi 'spacchettare' mentalmente l'esecuzione delle query/subquery
    
    (SELECT COUNT (D2.Titolo)
                                                                         FROM Dirige D2
                                                                         GROUP BY D2.CF)
    
    Questa subquery estrae dalla tabella Dirige il conteggio dei film diretti da ogni registra. Ottieni in output una lista di valori numerici corrispondenti al n° di film diretti da ogni regista del tipo : 2,10,1,7,3 ...
    
    SELECT D1.CF
                             FROM Dirige D1
                             GROUP BY D1.CF
                             HAVING COUNT(D1.Titolo) >= ALL (2,10,1,7,3 ...)
    
    Questa query estrae gli ID dei registi che hanno diretto un numero di film maggiore/uguale al numero massimo di film diretti scaturito dal'esecuzione della query precedente (quindi 10). Prima vengono raggruppati i records in funzione dell'ID regista (tramite Group By) e poi sul conteggio dei film realizzati dal registra viene applicato il filtro per >= (tramite HAVING).
    A questo punto ottieni un 'resultset' che contiene solo gli ID dei registi con titoli diretti >= 10.
    
    SELECT A.CF
    FROM Attore A, Recita R, Film F, Dirige D
    WHERE D.CF IN (ID dei registi con film >=10)
    
    A questo punto questa query filtra il risultato ... Sono solo perplesso dal fatto che utilizzi 4 tabelle ma non vedo join
    Ottieni il risultato previsto?
  • Re: CAPIRE LOGICA DIETRO RISOLUZIONE QUERY

    La ringrazio per la celere risposta e devo dire che ora è tutto molto più chiaro, mi sembra di aver capito che la cosa migliore da fare sia partire dalla subquery più interna (in questo caso infatti lei è partito dalla conta dei film, ottenendo 10, usando l'esempio numerico da lei proposto), di conseguenza si risale a ritroso fino ad ottenere l'ID (CF) degli attori.

    Il corso non è focalizzato sui database quindi non utilizziamo alcun programma per verificare la corretta sintassi di quanto scritto pertanto non le so dire effettivamente se mandate in esecuzione queste query, esca il risultato previsto.
    Probabilmente è da qui che deriva la mia confusione, il fatto di non aver mai 'mandato in esecuzione' una query da me scritta e visto il risultato con esempi numerici/nomi/codici etc..
  • Re: CAPIRE LOGICA DIETRO RISOLUZIONE QUERY

    Bene che qualcosa sia più chiaro.
    'Male' che mi 'dai del Lei' : sui forum è consuetudine 'darsi del Tu'

    Ti consiglio di dare una lettura al manuale di MySQL per approfondire come vengono gestiti i DB.
  • Re: CAPIRE LOGICA DIETRO RISOLUZIONE QUERY

    Chiedo umilmente scusa
    Ho trovato un PDF online che fa al caso mio, penso che la pratica mi potrà aiutare molto.
    Un'ulteriore domanda, quando si passa ad una subquery, una una innestata, ho notato che molte volte nel FROM/WHERE si inserisce il numero dopo il nome della tabella alla quale si riferisce. Nel nostro caso è Dirige1,Dirige2. La numerazione a cosa si riferisce, quale è il criterio?
Devi accedere o registrarti per scrivere nel forum
4 risposte