Estratto del documento

Esercizio query luglio

Si consideri il seguente schema biblioteca:

1) Le date di morte degli autori dei libri letti da Paolo Bianchi

SELECT DISTINCT A.datamorte

FROM Cliente AS C, Prestito AS P, Libro AS L, Autore AS A

WHERE L.codiceAL = A.codiceA AND C.ntess = P.ntessP AND P.codiceLP = L.codiceL AND C.nome = “Paolo” AND C.cognome = “Bianchi” AND P.res IS NOT NULL

2) I titoli dei libri di Emilio Salgari che hanno letto Giovanni Bianchi e Paolo Neri

SELECT DISTINCT L.titolo

FROM Cliente AS C, Prestito AS P, Libro AS L, Autore AS A

WHERE L.codiceAL = A.codiceA AND C.ntess = P.ntessP AND P.codiceLP = L.codiceL AND A.nome = “Emilio” AND A.cognome = “Salgari” AND P.res IS NOT NULL AND C.nome = “Giovanni” AND C.cognome = “Bianchi”

INTERSECT

SELECT DISTINCT L.titolo

FROM Cliente AS C, Prestito AS P, Libro AS L, Autore AS A

WHERE L.codiceAL = A.codiceA AND C.ntess = P.ntessP AND P.codiceLP = L.codiceL AND A.nome = “Emilio” AND A.cognome = “Salgari” AND P.res IS NOT NULL AND C.nome = “Paolo” AND C.cognome = “Neri”

3) Le età dei lettori che hanno dato il massimo giudizio tra quelli espressi su Pinocchio di Carlo Collodi

SELECT DISTINCT C.età

FROM Review AS R, Cliente AS C, Libro AS L, Autore AS A

WHERE L.codiceAL = A.codiceA AND C.ntess = R.ntessP AND R.codiceLR = L.codiceL AND L.titolo = “Pinocchio” AND A.nome = “Carlo” AND A.cognome = “Collodi” AND R.giudizio = (SELECT MAX (R1.giudizio) FROM Review AS R1, Libro AS L1, Autore AS A1 WHERE L1.codiceAL = A1.codiceA AND R1.codiceLR = L1.codiceL AND L1.titolo = “Pinocchio” AND A1.nome = “Carlo” AND A1.cognome = “Collodi”)

4) Tutti i nomi dei lettori che hanno letto prima un libro scritto da Emilio Salgari e poi uno scritto da Umberto Eco

SELECT DISTINCT C.nome, C.cognome

FROM Cliente AS C, Libro AS L, Autore AS A, Prestito AS P, Libro AS L1, Autore AS A1, Prestito AS P1

[Le tabelle libro, autore e prestito compaiono due volte perché vanno confrontate le date di restituzione di libri di due autori diversi presi da uno stesso cliente]

WHERE L.codiceAL = A.codiceA AND C.ntess = P.ntessP AND P.codiceLP = L.codiceL AND P1.ntessP = C.ntess AND P1.codiceLP = L1.codiceL AND L1.codiceAL = A1.codiceA AND A.nome = “Emilio” AND A.cognome = “Salgari” AND A1.nome = “Umberto” AND A1.cognome = “Eco” AND P.res < P1.res

5) Tutti gli indirizzi di posta elettronica, senza ripetizioni, per sollecitare chi ha in prestito un libro da almeno 30 giorni

SELECT DISTINCT C.indirizzo

FROM Cliente AS C, Prestito AS P WHERE C.ntess = P.ntessP AND P.res IS NULL AND P.prel <= now() – interval30day

[Data corrente – 30 giorni -> se è minore sono passati più di 30 giorni]

Ridondanza con libri, editori e ordini

Sapendo che il:

  • 1. Il costo di una scrittura è di 5 volte quello di una lettura,
  • 2. Vi sono 10000 libri e 200 editori,
  • 3. Per ogni editore vi sono 10 ordini in media

Le operazioni di interesse sono

  • Op1: costo globale degli ordini per un certo editore, eseguita 10 volte al giorno
  • Op2: inserire ordine ad un certo editore, eseguita 4 volte all'ora

Indicare se la ridondanza è conveniente dati i volumi e le operazioni descritte.

Tavola dei volumi

  • Libro -> 10000 righe
  • Editore -> 200 righe
  • Ordine -> 10*200= 2000 righe

Schema senza ridondanza

OP 1 – costo globale degli ordini per un certo editore, eseguita 10 volte al giorno

Facciamo la Tavola degli accessi, per capire quanti accessi in lettura e/o scrittura servono per eseguire questa op.

Accedo alla tabella Editore in lettura 1 volta per guardare il codiceeditore e alla tabella Ordine in lettura 10 volte perché per ogni editore vi sono in media 10 ordini.

  • Editore -> 1 accesso in Lettura
  • Ordine -> 10 accessi in Lettura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

α è il costo della scrittura che costa 5.

Il peso dell’operazione invece ha valore 1 sempre di solito

Costo Op1 senza Rid = 10 * 1 * (5 * 0 + 11) = 10 *11 = 110

OP 2 – inserire ordine ad un certo editore, eseguita 4 volte all’ora

Tavola Accessi

Accedo alla tabella Editore in lettura una volta per leggere il codiceeditore, poi accedo a Ordine in scrittura una volta per inserire un ordine

  • Editore -> 1 accesso in Lettura
  • Ordine -> 1 accesso in scrittura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

Costo Op2 senza Rid = (4 * 24) * 1 * (5 * 1 + 1) = 96 * 6 = 576

Il costo totale dello schema senza ridondanze è:

(Si sommano i costi delle 6 operazioni)

Tot costo schema senza rid = 110 + 576 = 686

Memoria dello schema senza ridondanza

Adesso vediamo quanta memoria mi occupa lo schema senza ridondanze.

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo dell’entità Libro

  • Cod. inventario: sarà un integer, quindi 4 bytes
  • Tipo: sarà un varchar, lungo sui 25 o 30 caratteri, sarà 30 bytes
  • Autore: sarà un varchar, lungo sui 50 caratteri, sarà 50 bytes
  • Scaffale: sarà un integer, quindi 4 bytes

Adesso sommo questi valori e moltiplico il risultato per il numero di record contenuti in Libro, ovvero 50000.

Libro = (4+30+50+4) * 50000= 4.400.000 bytes

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo dell’entità Editore

  • Codice: sarà un integer, quindi 4 bytes
  • Paese: sarà un varchar, lungo sui 25 o 30 caratteri, sarà 30 bytes
  • Indirizzo: sarà un varchar, lungo sui 50 caratteri, sarà 50 bytes

Adesso sommo questi valori e moltiplico il risultato per il numero di record contenuti in Editore, ovvero 100.

Editore = (4+30+50) * 100 = 8400 bytes

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo della relazione Ordine

  • Data: sarà un datetime, quindi 8 bytes
  • Costo: sarà uno smallint (arriva max a 32000), quindi 2 bytes

Adesso sommo questi valori e moltiplico il risultato per il numero di record contenuti in Ordine, ovvero 2000.

Ordine = (8+2) * 2000 = 20000 bytes

La memoria totale occupata dallo schema senza ridondanze è quindi 4.400.000 + 8400 + 20000 = 4.428.400 bytes

Schema con ridondanza

OP 1 – costo globale degli ordini per un certo editore, eseguita 10 volte al giorno

Facciamo la Tavola degli accessi, per capire quanti accessi in lettura e/o scrittura servono per eseguire questa op.

Accedo alla tabella Editore in lettura 1 volta per guardare il codiceeditore e il costocomplessivo.

  • Editore -> 1 accesso in Lettura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

α è il costo della scrittura che costa 5.

Il peso dell’operazione invece ha valore 1 sempre di solito.

Costo Op1 CON Rid = 10 * 1 * (5 * 0 + 1) = 10 *1 * 1 = 10

OP 2 – inserire ordine ad un certo editore, eseguita 4 volte all’ora

Tavola Accessi

Accedo alla tabella Editore in lettura una volta per leggere il codiceeditore e il costo complessivo, poi accedo a Ordine in scrittura una volta per inserire un ordine e in Editore una volta in scrittura per aggiornare il costo complessivo.

  • Editore -> 1 accesso in Lettura
  • Editore -> 1 accesso in Scrittura
  • Ordine -> 1 accesso in Scrittura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

Costo Op2 CON Rid = (4 * 24) * 1 * (5 * 2 + 1) = 96 * 11 = 1056

Memoria dello schema con ridondanza

Adesso vediamo quanta memoria mi occupa lo schema CON ridondanze.

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo dell’entità Libro.

Non avendo attributi in più rispetto all’altro schema, resterà identico.

  • Cod. inventario: sarà un integer, quindi 4 bytes
  • Tipo: sarà un varchar, lungo sui 25 o 30 caratteri, sarà 30 bytes
  • Autore: sarà un varchar, lungo sui 50 caratteri, sarà 50 bytes
  • Scaffale: sarà un integer, quindi 4 bytes

Adesso sommo questi valori e moltiplico il risultato per il numero di record contenuti in Libro, ovvero 50000.

Libro = (4+30+50+4) * 50000= 4.400.000 bytes

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo dell’entità Editore.

Questa cambia perché abbiamo un attributo in più.

  • Codice: sarà un integer, quindi 4 bytes
  • Paese: sarà un varchar, lungo sui 25 o 30 caratteri, sarà 30 bytes
  • Indirizzo: sarà un varchar, lungo sui 50 caratteri, sarà 50 bytes
  • Costo complessivo: sarà uno smallint (arriva max a 32000), quindi 2 bytes

Adesso sommo questi valori e moltiplico il risultato per il numero di record contenuti in Editore, ovvero 100.

Editore = (4+30+50+2) * 100 = 8600 bytes

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo della relazione Ordine.

Resta uguale all’altro schema.

  • Data: sarà un datetime, quindi 8 bytes
  • Costo: sarà uno smallint (arriva max a 32000), quindi 2 bytes

Adesso sommo questi valori e moltiplico il risultato per il numero di record contenuti in Ordine, ovvero 2000.

Ordine = (8+2) * 2000 = 20000 bytes

La memoria totale occupata dallo schema CON ridondanze è quindi 4.400.000 + 8600 + 20000 = 4.428.600 bytes

Confronto tra costi e memorie

Adesso confrontiamo i costi e le memorie e vediamo quale schema conviene, se con o senza ridondanza.

Tot costo schema senza rid = 686

Tot costo schema CON rid = 1056

(686/1056) * 100 = 64,9 % -> lo schema senza ridondanze ci costa il 100-64,9% = 35,1% in meno in termini di operazioni

Memoria senza ridondanza = 4.428.400 bytes

Memoria CON ridondanza = 4.428.600 bytes

(4.428.400/4.428.600) *100 = 99,9% -> lo schema senza ridondanze ci costa lo 0,1% in meno rispetto a quello con, in termini di memoria.

Concludiamo che lo schema SENZA ridondanza è il più conveniente, perché in termini di memoria rimane pressoché uguale, mentre in termini di operazioni fa risparmiare molto.

Dipendenze funzionali e terza forma normale

Si consideri lo schema:

Sapendo che:

  • 1. Esistono più copie di un opera dello stesso autore offerte dallo stesso distributore
  • 2. Tutte le copie della stessa opera hanno la stessa presentazione
  • 3. Copie della stessa opera possono apparire in più stand

Evidenziare le dipendenze funzionali presenti nello schema e trasformarlo in terza forma normale:

Opera(codice, numerocopia, tipo, distributore, nome, valore, presentazione)

Stand(codicestand, codiceopera, numerocopia, presentazione, datainiziouso, datafine)

Esercizio dipendenze

1) Ok

2) codiceopera -> presentazione

3) Ok

Tab Opera

Codice, numerocopia -> tipo, distributore, nome, valore, presentazione

Tab Stand

Codicestand, codiceopera -> numerocopia, presentazione, datainiziouso, datafine

Step 1A – semplifico parte dx

2) codiceopera -> presentazione

Tab Opera

Codice, numerocopia -> tipo

Codice, numerocopia -> distribuzione

Codice, numerocopia -> nome

Codice, numerocopia -> valore

Codice, numerocopia -> presentazione

Tab Stand

Codicestand, codiceopera -> numerocopia

Codicestand, codiceopera -> presentazione

Codicestand, codiceopera -> datainiziouso

Codicestand, codiceopera -> datafine

Step 1B – semplifico parte sx

2) codiceopera -> presentazione

Tab Opera

Codice, numerocopia -> tipo

Codice, numerocopia -> distribuzione

Codice, numerocopia -> nome

Codice, numerocopia -> valore

Codice, numerocopia -> presentazione

Tab Stand

Codicestand, codiceopera -> numerocopia

Codicestand, codiceopera -> presentazione

Codicestand, codiceopera -> datainiziouso

Codicestand, codiceopera -> datafine

Step 1C – ok

Step 2

F1= {codiceopera -> presentazione}

F2 = {Codice, numerocopia -> tipo, Codice, numerocopia -> distribuzione, Codice, numerocopia -> nome, Codice, numerocopia -> valore}

F3 = {Codicestand, codiceopera -> numerocopia, Codicestand, codiceopera -> datainiziouso, Codicestand, codiceopera -> datafine}

Infine trasformazione in tabelle in terza forma normale

OperaPresentazione (codiceopera, presentazione

Opera (Codice, numerocopia, tipo, distribuzione, nome, valore)

Stand (Codicestand, codiceopera, numerocopia, datainiziouso, datafine)

Esercizio query giugno

Si consideri il seguente schema Magazzino

table Grezzo( nome :varchar(20),dimensione: integer,scorta :integer check 0 <=scortacodp:integer autoincrement),

table Fornitore( nomeProd :varchar(20),email: varchar(50),citta:varchar(20) ,numeroordini: integer,codf: integer autoincrement),

table Produce( forn: references Fornitore(codf),parte : references Grezzo(codp),prezzo: integer) ,

table Ordini( mat: references grezzo(codP),forn: references Fornitore (codf),numero:integer,dataord : date NOT NULL,dataric: date)

table Qualità( forn: references Fornitore (codf),giudizio : tiny check 0<giudizio <10)

1) Il numero dei grezzi ordinati e non ricevuti da Bianchi ed il prezzo complessivo

SELECT SUM (O.numero) AS PezziOrdinati, SUM(O.numero * P.prezzo) AS PrezzoComplessivo

FROM Ordini AS O, Fornitore AS F, Produce AS P

WHERE O.forn = F.codf AND P.forn = F.codf AND O.mat = P.parte AND F.nomeProd = “Bianchi” AND O.dataric IS NULL

2) Il numero dei pezzi già ricevuti da ogni produttore

SELECT F.codf, SUM (O.numero) AS PezziRicevuti

FROM Ordini AS O, Fornitore AS F, Produce AS P

WHERE O.forn = F.codf AND P.forn = F.codf AND O.mat = P.parte AND O.dataric IS NOT NULL

GROUP BY F.codf

3) Gli email a cui ordinare i pezzi la cui scorta è inferiore a 50 ordinati per giudizio

SELECT DISTINCT F.email

FROM Grezzo AS G, Fornitore AS F, Qualita AS Q, Produce AS P

WHERE Q.forn = F.codf AND P.forn = F.codf AND P.parte = G.codp AND G.scorta < 50

ORDER BY Q.giudizio DESC (x ordinare dal più grande al più piccolo)

4) I fornitori di Pisa che possono fornire bulloni, con un prezzo inferiore alla media ed un giudizio di almeno 3

SELECT F.codf

FROM Grezzo AS G, Fornitore AS F, Qualita AS Q, Produce AS P,

WHERE Q.forn = F.codf AND P.forn = F.codf AND P.parte = G.codp AND F.città = “Pisa” AND G.nome = “bulloni” AND Q.giudizio >= 3 AND P.prezzo < (SELECT AVG(P1.prezzo) FROM Produce AS P1, Grezzo AS G2 WHERE P2.parte = G2.codp AND G2.nome = “bulloni”)

5) Scrivere un trigger che inserisce un ordine di 500 pezzi al fornitore con la qualità massima quando la quantità di Viti è inferiore a 50

CREATE TRIGGER InserisciOrdine

AFTER UPDATE OF scorta ON Grezzo

FOR EACH ROW

WHEN NEW.nome = “viti” AND NEW.scorta < 50

INSERT INTO Ordini (mat, forn, numero)

SELECT G.codp, F.codf, 500

FROM Grezzo AS G, Qualità AS Q, Fornitore AS F, Produce AS P

WHERE Q.forn = F.codf AND P.forn = F.codf AND P.parte = G.codp AND G.nome =”viti” AND Q.giudizio = (SELECT MAX (Q1.giudizio) FROM Qualita as Q1, Produce AS P1, Grezzo AS G1 WHERE Q1.forn = P1.forn AND P1.parte = G1.codp AND G1.nome = “viti”)

LIMIT 1

Esercizio operazioni

  • 1. Il costo di una scrittura è di 2 volte quello di una lettura,
  • 2. Vi sono 10000 libri e 30 editori,
  • 3. Per ogni editore vi sono 10 ordini in media

Le operazioni di interesse sono

  • Op1: costo globale degli ordini per un certo editore, eseguita 40 volte al giorno
  • Op2: inserire ordine ad un certo editore, eseguita 1 volte all'ora
  • Op3: cancellare ordine ad un certo editore eseguita 8 volte al giorno

Indicare se la ridondanza è conveniente dati i volumi e le operazioni descritte

Tavola dei volumi

  • Libro -> 10000 righe
  • Editore -> 30 righe
  • Ordine -> 30*10= 300 righe

Schema senza ridondanza

OP 1 – costo globale degli ordini per un certo editore, eseguita 40 volte al giorno

Facciamo la Tavola degli accessi, per capire quanti accessi in lettura e/o scrittura servono per eseguire questa op.

  • Editore -> 1 accesso in Lettura
  • Ordine -> 10 accessi in Lettura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

α è il costo della scrittura che costa 2.

Il peso dell’operazione invece ha valore 1 sempre di solito

Costo Op1 senza Rid = 40 * 1 * (2 * 0 + 11) = 40 *1 * 11 = 440

OP 2 – inserire ordine ad un certo editore, eseguita 1 volta l’ora

Tavola Accessi

Accedo alla tabella Editore in lettura una volta per leggere il codiceeditore, poi accedo a Ordine in scrittura una volta per inserire un ordine

  • Editore -> 1 accesso in Lettura
  • Ordine -> 1 accesso in scrittura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

Costo Op2 senza Rid = 24 * 1 * (2 * 1 + 1) = 24 * 3 = 72

OP 3 – cancellare ordine ad un certo editore eseguita 8 volte al giorno

Tavola Accessi

Accedo alla tabella Editore in lettura una volta per leggere il codiceeditore, accedo alla tabella Ordine in lettura una volta per trovare il record che voglio cancellare e in scrittura una volta per cancellare un ordine

  • Editore -> 1 accesso in lettura
  • Ordine -> 1 accesso in lettura
  • Ordine -> 1 accesso in scrittura

CostoOp = (frequenza operazione) * peso operazione (interattiva o batch) * (α * numero di accessi in scrittura + numero accessi in lettura)

Costo Op3 senza Rid = 8 * 1 * (2 * 1 + 2) = 8 * 4 = 32

Tot costo schema senza rid = 440 + 72 + 32 = 544

Memoria dello schema senza ridondanze

Adesso vediamo quanta memoria mi occupa lo schema senza ridondanze.

Supponiamo quanti caratteri e quindi bit può contenere ogni campo attributo dell’entità Libro

Cod. inventario: sarà un integer, quindi 4 bytes

Tipo: sarà un varchar, lungo sui 25 o 30 caratteri, sarà

Anteprima
Vedrai una selezione di 8 pagine su 32
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 1 Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 2
Anteprima di 8 pagg. su 32.
Scarica il documento per vederlo tutto.
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 6
Anteprima di 8 pagg. su 32.
Scarica il documento per vederlo tutto.
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 11
Anteprima di 8 pagg. su 32.
Scarica il documento per vederlo tutto.
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 16
Anteprima di 8 pagg. su 32.
Scarica il documento per vederlo tutto.
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 21
Anteprima di 8 pagg. su 32.
Scarica il documento per vederlo tutto.
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 26
Anteprima di 8 pagg. su 32.
Scarica il documento per vederlo tutto.
Esercizi di appelli svolti di Basi di dati e Laboratorio web Pag. 31
1 su 32
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher mariateresa200127 di informazioni apprese con la frequenza delle lezioni di Basi di dati e Laboratorio web e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Pisa o del prof Baiardi Fabrizio.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community