Che materia stai cercando?

Riassunto Basi Dati

Appunti di sistemi informativi e basi dati basati su appunti personali del publisher presi alle lezioni della prof.ssa Diamantini dell’università degli Studi del Politecnico delle Marche - Univpm, facoltà di Ingegneria. Scarica il file in formato PDF !

Esame di Basi di dati e sistemi informativi docente Prof. C. Diamantini

Anteprima

ESTRATTO DOCUMENTO

Quando non è possibile trovare attributi che siano chiavi primasie si introduce un attributo

aggiuntivo (codice, id...).

Vincolo d'integrità referenziale (foreign key) fra un insieme di attributi X di una relazione R1 è

un'altra relazione R2 è soddisfatta se i valori su X di ciascuna tupla del'istanza R1 compaiono come

valori della chiave primaria dell'istanza di R2.

ALGEBRA RELAZIONALE

E' un linguaggio procedurale, basato su concetti di tipo algebrico.

Sostanzialmente, è costituito da un insieme di operatori, defiiti su relazioni che producono ancora

relazioni come risultati. In questo modo è possibile costituire espressioni che coinvolgono più

operatori, allo scopo di formulare interrogazioni anche complesse.

Operatori insiemistici:

Le relazioni sono insiemi, quindi ha senso definire su di esse gli operatori insiemistici tradizionali di

unione, differenza e intersezione.

Per ottenere come risultato una elazione (cioè un insieme di tuple omogenee) consideriamo

ammissibili solo applicazioni degli operatori insiemistici a coppie di operandi definite sugli stessi

attributi. L'unione di relazioni su schemi diversi sarebbe un insieme di tuple disomogenee. Un

insieme di tuple non omogenee non è una relazione.

-l'unione di due relazioni r1 e r2 definite sullo stesso insieme di attributi X è indicata con r1Ur2 ed

è una relazione ancora su X contenente le tuple che appartengono a r1 oppure a r2, oppure ad

entrambe. ∩

-l'intersezione di r1(x) e r2(x) è indicata con r1 r2 ed è una relazione su X contenente le tuple

che appartengono sia a r1 che a r2.

-la differenza di r1(x) e r2(x) è indicata con r1-r2 ed è una relazione su X contenente te tuple che

appartengono a r1 e non appartengono a r2.

Altri operatori:

-Ridenominazione: operatore monadico (con un solo argomento). Ha come obiettivo quello di

adeguare i nomi degli attributi a seconda delle necessità, in particlare al fine di facilitare le

operazioni insiemistiche. Modifica lo schema lasciando inalterata l'istanza delll'operando.

RENattr.rid+attr(relazione)

-Selezione e Proiezione: operatori monadici. Svolgono funzioni che potremmo definire

complementari (ortogonali). Sono entrambe definite su un operando e producono come risultato una

porzione dell'operando. Più precisamente, la selezione produce un sottoinsieme di tuple, su tuti gli

attributi, mentre la proiezione da un risultato cui contribuiscono tutte le tuple. Ma su un

sottoinsieme di attributi.

Selezione: SELcondizione(operando) il risultato contiene tutte le tuple dell'operando che soddisfano

la condizione

proiezione: PROSlistaattributi (operando) il risultato contiene tuple che si ottengono applicando

l'operatore restrizione t[x] ad ognuna delle tuple dell'operando.Una proiezione contiene al più tante

tuple quante l'operando. Se la proiezione è fatta su una superficie allora contiene tutte le tuple

dell'operazione .

Join: è l'operatore che permete di correlare dati contenuti in relazioni diverse, confrontando i valori

contenuti in esse e utilizzando quindi la caratteristica fondamentale del modello, quella di essere

basato su valori.

-join naturale: è un'operatore che correla dati in relazione sull'unione degli insiemi di attributi degli

operandi e le sue tuple sono ottenute combinando le tuple degli operandi con valori uguali sugli

attributi comuni. Def: il join naturale r1 join r2 è una relazione definita su x1 U x2, come segue:

€ X1 U X2 | T1 € R1 e T2 € R2 con T[X1] = T1 e T[X2] = T2}

R1 join R2 = { T

Il grado della relazione ottenuta come risultato è minore o uguale della somma dei gradi

dei due operandi perchè gi attributi omonimi delgli operandi compaiono una sola volta nel

risultato.

Cardinalità join: conpresa tra 0 e |R1| x |R2|.

-Se il join è completo contiene un numero di tuple pari al massimo tra |R1| e |R2|.

-Se X1 ∩ X2 contiene una chiave per R2 allora il join di R1(X1) e R2(X2) contiene al

massimo |R1| tuple.

-Se X1 ∩ 2 coincide con una chiave per R2 e sussiste il vincolo di riferimento tra X1 ∩ 2 in

R1 e la chiave di R2 allora il join di R1(X1) e R2(X2) contiene |R1| tuple.

Proprietà: commutativo, associativo.

Prodotto cartesiano = join che contiene le tuple ottenute combinando in tutti i modi

possibili le tuple degli operandi. Operatore definito su relazioni che non hanno attributi in

comune.

-join esterno: estende con valori nulli le ennuple che verrebbero tagliate fuori da un

join(interno) .

Esistono 3 varianti:

-sinistro: mantiene tutte le tuple del primo operando, estendendole con valori nulli

-destro: mantiene tutte le tuple del secondo operando, estendendole con valori nulli se

necessario.

-completo: mantiene le tuple di entrambi gli operandi.

Porprietà join naturale:

-commutativo e associativo

-se X1 = X2 il join coincide con l'intersezione.

-se gli insiemi di attributi sono disgiunti (no attributi in comune) il join diventa un prodotto

cartesiano

-theta-join: il prodotto cartesiano ha senso solo se è seguito da una selezione che centra

l'attenzione su tuple correlate secondo le esigenze. Questa operazione viene chiamata

theta-join. La selezione serve per centrare l'attenzione su tuple correlate secondo le

esigenze. R1 Xf R2 f è la condizione.

Se f è un'uguaglianza si parla di equi-join. Il theta-join è importante perche è

implementato nei DBMS a differenza del join naturale. Un join naturale può essere

simulato con un aridenominazione (per ottenere schemi disgiunti), un equi-join

(uguaglianza sugli attributi corrispondenti. Quelli che sono stati ridenominati) e una

proiezione (per eliminare gi attributi doppi).

Le interrogazioni su uno schema di base di dati R vengono formulate con espressioni i cui

atomi sono (nomi di) relazioni in R.

VISTE

Può risultare utile mettere a disposizione degli utenti rappresentazioni diverse per gli stessi

dati. Nel modello relazionale, la tecnica prevista a questo scopo è quella delle relazioni

derivate. È possibile che una relazione derivata sia funzione di altre relazioni derivate, a

condizione che esista un ordinamento fra le relazioni derivate tale che ogni relazione sia

definita solo in termini di relazioni di base e di relazini derivate che la precedono

nell'ordinamento.

Due tipi di relazioni derivate:

viste materializzate: relazioni derivate effettivamente memorizzate nella base di dati

relazioni virtuali (viste): relazioni definite per mezzo di funzioni non memorizzate nella

base di dati, ma utilizzabili nelle interrogazioni come se lo fossero.

Le viste materializzate hanno il vantaggio di essere immediatamente disponibili per le

interrogazioni, ma è spesso oneroso mantenere il loro contenuto allineato con quello dele

relazioni da cui derivano. Quindi i sistemi attuali forniscono quasi solo meccanismi per la

gestione di relazioni virtuali. Le viste vengono definite nei sistemi relazionali per mezzo di

espressioni del linguaggio interrogazionale.

Vantaggi:

- espressioni molto complesse possono essere definite tramite viste

-attraverso la definizione di autorizzazioni di accesso rispetto ale viste, è possibile

introdurre meccanismi per la protezione della privatezza

-in occasione della ristrutturazione della base di dati, può risultare conveniente definire

viste che corrispondano a relazioni sostituite da altre e perciò non più presenti dopo la

ristrutturazione stessa, ma ricavabili dalle nuove relazioni.

CALCOLO RELAZIONALE

Si fa riferimento a una famiglia di linguaggi di interrogazione, basati sul calcolo dei

predicati del primo ordine, che hanno le caratteristiche di esser dichiarativi, cioè di

specificare le proprietà del risultato delle interrogazzioni, anzichè la procedura seguita per

generarlo.

Calcolo sui domini

le espressioni hanno la forma: {A1 = x1... An = xn| f }; A1 = x1... An = xn sono attributi

distinti. X1...Xn sono varibili distinte.

Per fare delle fomule composte si possono usare congiunzioni, disgiunzioni,

negazioni(not), quantificatore esistenziale(esiste) e quantificatore universale (ogni).

Il calclo su domini ha gossi difetti:

-tante variabili.

-espressioni senza senso dipendenti dal dominio. Se cambio dominio cambia il risultato.

Algebra e calcolo sono equivalenti, ad ogni espressione ne corrisponde un equivalente

nell'altro "linguaggio".

Calcolo su ennuple con dichiarazioni di range.

Per superare le limitazioni del calcolo su domini dobbiamo ridurre le variabili e far si che i

valori provengano dalla base di dati.

Le espressioni hanno la forma: {TarghetList, RangeList, Formula}

TargetLIst: ha elementi del tipo x. Z con x variabile e z sequenza di attributi.

RangeList: elenca le ariabili libere della formula ognuna con il relativo campodi variabilità.

Formula: ha atomi di contronto (x.a = v.l...), connettivi e quantificatori.

SQL: CONCETTI BASE (Structured Query Language)

Contiene al suo interno sia le funzionalità di un Data Definition Language, DDL (un

insieme di comandi per la definizione dello schema di una base di dati relazionale), sia

quelle di un Data Manipulation Language, DML (un insieme di comandi per la modifica e

l'interrogazione dell'istanza di una base di dati.

-domini elementari:

character(lunghezza): permette di rappresentare caratteri o strighe

numeric(): rappresenta numeri a base decimale es: numeric(6,4) =[-99.9999,99.9999]

decimal(): rappresenta numeri a base decimale es: decimal(4) =[-9.999,9.999]

float(cifre per la mantissa):

real

double precision

date: ammette campi years, month, day

time: ammette campi hour, minuter, second

timestamp: tutti i campi da years a second

boolean: true o false

-creazione schema

create schema [NomeSchema][[autorization]autorizzazione]

{DefElementoSchema}

autorizzazione rappresenta nome utente proprietario dello schema

nome schema puo essere omesso

-definizione tabelle

create table dipartimento

( nome varchar(20) primary key,

indirizzo varchar(20),

città varchar(20)

)

-definizione domini

create domain NomeDominio as TipoDiDato

[NomeDiDefault]

[Vincolo]

la definizione di nuovi domini permette di associare un insieme di vincoli a un nome di

dominio, importante quando si dve ripetere la stessa definizione di dominio in diverse

tabelle.

Valore di default = valore che deve assumere l'attributo quando viene inserita una riga

nella tabella senza che sia specificato un valore per l'attributo stesso.

-vincoli intrarelazionali

vincoli = proprietà che devono esere verificate da ogni istanza della base di dati.

Not null: assenza di informazioni.

Unique: impone che i valori dell'attributo siano una (super)chiave, cioè righe differenti della

tabella non possono avere gli stessi valori.

Primary key: per definire la chiave primaria della relazione, i valori non possono assumere

il valore nullo.

-vincoli interrelazionali

vincoli di integrità referenziale = foreign key = chiave esterna. Questo vincolo crea un

legame tra i valori di un attributo della tabella su cui è definito (interna) e i valori di un

attributo di un'altra tabella (esterna). Se c'è un solo attributo coinvolto si può usare il

costrutto sintattico "references", con il quale si specificano la tabella esterna e l'attributo

della tabella esterna al quale l'attributo in questione deve essere legato, altrimenti quando

il legame è formato da un insieme di attributi, fa uso invece dell'attributo "foreign key".

Le operazioni sulla tabella esterna che possono introdurre delle violazioni solo le

modifiche del valore dell'attributo riferito e la cancellazione delle righe.

Cascade: il nuovo valore dell'attributo della tabella esterna viene riportato su tutte le

corrispondenti righe della tabella interna.

Per le operazioni di modifica è possibile reagire nei seguenti modi:

Set null: all'attributo referente viene assegnato il valore nullo al posto del valore modificato

nea tabella esterna.

Set default: all'attributo referente viene assegnato il valore di default al posto del valore

modificato nella tabella esterna.

No action: l'azine di modifica non vienen consentita e il sistema non ha quindi bisogno di

riparare la violazione.

Per le violazioni prodotte dalla cancellazione di un elemento della tabella esterna si ha a

disposizione lo stesso insieme di relazioni.

-modifica degli schemi

alter: permette di modificare e schemi di tabelle.

Drop: permette di rimuovere componenti come schemi, domini, tabelle, viste o asserzioni.

INTERROGAZIONI IN SQL

select: interrogazione semplice

es: estrarre lo stipendio degli imiegati di cognome Rossi

select stipendio as salario

from impiegato

where cognome = 'Rossi'

es: estrarre tutte le informazioni relative agli impiegati di cognome rossi

select *

from impiegato

where cognome = rossi

Quando si desidera formulare un'interrogazione che coinvolge righe appartenenti a più

tabelle, si pone come argomento della clausola from l'insieme di tabelle alle quali si vuole

accedere.

La clausola where ammette come argomento un'espressione booleana costruita

combinando predicati semplici con gli operatori and, or, not. Ciascun predicato semplice

usa operatori =,<>,<,>,<=,>= per confrontare da un lato un'espressione costruita a partire

dai valori degli atributi per la riga, e dall'altro lato un valore costante o un'altra espressione.

Per l'eliminazine dei duplicati è specificata la parola chiave "distinct" da porre dopo la

parola chiave select.

Es: select distict città

from persona

where cognome = 'rossi'

join interni ed esterni

join:

Un'operazione di JOIN unisce il contenuto di una o più tabelle con l'origine specificata nella clausola FROM;

il suo funzionamento è infatti basato sull'uso della clausola FROM e si presenta immediatamente accanto,

in un'operazione di selezione:

SELECT <campi>

FROM <origine>

<tipo di join> <origine>

[ ON <campo> <relazione> <campo> ]

inner join:

La forma di JOIN più semplice, combina dei criteri per estrarre soltanto le righe che

presentano i campi indicati in entrambe le origini. È possibile stabilire un JOIN interno che

relazioni i due gruppi di persone e riporti soltanto quelle che costituiscono sia figura di

personale sia figura di dipendente. La rappresentazione SQL di questa situazione può

essere la presente:

SELECT p.nome, p.cognome, p.ruolo, d.nome, d.cognome, d.ruolo

FROM personale p INNER JOIN dipendenti d

ON p.nome=d.nome AND p.cognome=d.cognome AND p.ruolo=d.ruolo

left outer join:

Questo JOIN esterno tiene conto di tutte le righe che soddisfano la relazione ed include

anche quelle righe presenti nella tabella che si trova a sinistra del JOIN, riempiendo i

campi della seconda tabella con NULL. Data l'analisi della situazione aziendale potremmo

voler estrarre tutti i nominativi del personale, mostrando la loro relazione di dipendenza

con l'azienda e per far ciò useremo una query SQL del genere:

SELECT p.nome, p.cognome, p.ruolo, d.nome, d.cognome, d.ruolo

FROM personale p LEFT JOIN dipendenti d

ON p.nome=d.nome AND p.cognome=d.cognome AND p.ruolo=d.ruolo

right outer join

Il caso opposto del precedente è quello che riporta quelle righe che si trovano nella tabella

indicata a destra del JOIN e riempie i campi non corrispondenti della prima tabella con il

valore NULL. Analizzando ancora una volta il nostro problema potremmo cercare di

ottenere l'elenco di tutti i dipendenti, segnalando anche quelli che non son considerati

personale dell'azienda. Basterà sostituire alla query precedente il LEFT con il RIGHT:

SELECT p.nome, p.cognome, p.ruolo, d.nome, d.cognome, d.ruolo

FROM personale p RIGHT JOIN dipendenti d

ON p.nome=d.nome AND p.cognome=d.cognome AND p.ruolo=d.ruolo

full outer join

L'ultimo tipo di JOIN esterno è il FULL JOIN, che mettendo assieme sia LEFT che RIGHT

comprende quindi tutti i dati presenti in entrambe le origini indicate, cioè includendo le

righe presenti nella prima tabella ma non nella seconda, quelle presenti nella seconda

tabella ma non nella prima, oltre che naturalmente tutte quelle che soddisfano la relazione.

L'analisi della nostra problematica potrebbe ad esempio richiedere l'estrazione di tutto il

personale e di tutti i dipendenti e ciò può essere esposto con una selezione del genere:

SELECT p.nome, p.cognome, p.ruolo, d.nome, d.cognome, d.ruolo

FROM personale p FULL JOIN dipendenti d

ON p.nome=d.nome AND p.cognome=d.cognome AND p.ruolo=d.ruolo

cross join

Un JOIN particolare non supportato da tutti i database è quello incrociato, in realtà il più

semplice perché non richiede la specifica dei campi con cui effettuare la relazione e

pertanto permuta tutte le righe in modo che ciascuna riga presente nella prima tabella

abbia una corrispondenza con tutte le righe nella seconda tabella; il numero di righe

risultati è quindi dato dalla moltiplicazione del numero di righe nella prima tabella col

numero di righe presenti nella seconda tabella.

Utilizza una sintassi del genere:

SELECT p.nome, p.cognome, p.ruolo, d.nome, d.cognome, d.ruolo

FROM personale p CROSS JOIN dipendenti d

SQL permette un ordinamento delle righe del risultato di un'interrogazione tramite la

clausola "order by" asc/desc, con la quale si chiude l'interrogazione

es: select *

from automobile

order by marca desc, modello

Count: Consente di restituire il numero di elementi di un gruppo.

Es: select count(*)

from impiegato

where dipart = 'produzione'

il risultato è il conteggio delle righe che compaiono nella tabella

5 operatori aggreganti: count, sum, max, min, avg

sum: restituisce la somma dei valori posseduti dall'espressione

max e min: restituiscono il valore massimo e minimo

avg: restituisce la media dei valori

es: select sum(stipendio)

from impiegato

where dipart = ' amministrazione '

group by: serve a specificare quali sono i campi sui cui effettuare i raggruppamenti

estrarre la somma degli stipendi di tuttigli impiegati dello stesso dipartimento:

select dipart, sum(stipendi)

from impiegato

group by dipartimento

La clausola HAVING

Decisamente più interessante è il funzionamento di GROUP BY in congiunzione alla

clausola HAVING la quale consente di impostare un filtro sui valori raggrupati.

Supponiamo, volendo fare un esempio, di dover lavorare sulla tabella "ordini" di un

ipotetico sito di e-commerce così strutturata:

•id

•cliente

•prodotto

•prezzo

Supponiamo ora di voler estrarre da questa tabella l'elenco dei clienti che hanno speso più

di 1.000 Euro:

SELECT id_cliente, SUM(prezzo) AS spesa

FROM ordini

GROUP BY id_cliente

HAVING spesa >= 1000;

Ovviamente possiamo realizzare con HAVING anche condizioni complesse utilizzando i

classici operatori AND e OR tipici della clausola WHERE, ad esempio possiamo decidere

di visualizzare solo i clienti che hanno speso almeno 1000 euro oppure hanno effettuato

almeno 3 acquisti:

SELECT id_cliente, SUM(id) AS acquisti, SUM(prezzo) AS spesa

FROM ordini

GROUP BY id_cliente

HAVING spesa >= 1000 OR acquisti >= 3;

CHECK

È possibile creare un vincolo CHECK come parte della definizione della tabella quando si

crea una tabella. Se la tabella esiste già, è possibile aggiungere un vincolo CHECK.

Tabelle e colonne possono includere più vincoli CHECK.

Se è già presente un vincolo CHECK, è possibile modificarlo o eliminarlo. È possibile, ad

esempio, modificare l'espressione utilizzata dal vincolo CHECK in una colonna della

tabella.

CHECK (CreditRating >= 1 AND CreditRating <= 5)

VISTE

Le viste sono delle QUERY memorizzate con un proprio nome che possono essere

considerate simili a tabelle virtuali. Sono una via efficace per mostrare informazioni che

arrivano da una più tabelle. Le analogie tra tabelle e viste sono parecchie, ma dobbiamo

considerare le limitazioni ed i requisiti necessari per poter utlizzare le viste. Creare una

view è una cosa piuttosto semplice, esiste una istruzione CREATE VIEW appositamente

usata per questo scopo. Vediamone la sintassi ed anche un esempio:

CREATE VIEW [ < nome_database > . ] [ < proprietario > . ] nome_vista [ ( colonna [ ,…n ]

) ]

[ WITH < attributi_vista > [ ,…n ] ]

AS

istruzione_SELECT

[ WITH CHECK OPTION ]

GRANT

Creare utenti e assegnare permessi in MySQL: il comando GRANT

Il comando GRANT permette allo stesso tempo di creare un utente e di assegnargli dei

permessi specifici. Vediamone la sintassi:

GRANT <istruzioni_consentite>

ON <database>.<tabella>

TO <utente>@<host>

IDENTIFIED BY <password>;

Se l'utente non esiste, GRANT consente di crearlo. In caso contrario il comando si limiterà

ad assegnargli nuovi permessi e/o privilegi.

Come potete vedere la sintassi qui proposta è molto semplice, ma spiegamone comunque

i singoli campi:

•istruzioni_consentite: E' una lista di istruzioni di SQL che si vogliono permettere

all'utente (CREATE, SELECT, UPDATE, DELETE, ALTER, DROP, ecc..). Se si

vuole dare all'utente permessi completi si può utilizzare la parola chiave "ALL".

•database: E' il nome del database sul quale l'utente potrà eseguire le istruzioni

consentite. Se si vuole fare riferimento a tutti i database del sistema si può utilizzare

il carattere asterisco (*).

•tabella: Specificando il nome di una tabella, si fa riferimento solo ad essa: i

permessi dell'utente, quindi, riguarderanno solo questa tabella e non le altre

presenti nel database. Se si vuole fare riferimento a tutte le tabella si può utilizzare

il carattere asterisco (*).

•utente: Specifica il nome dell'utente che vogliamo creare o al quale vogliamo

assegnare nuovi permessi.

•host: Specifica il/gli host da cui è ammessa la connessione.

•password: Specifica la password associata all'utente che stiamo creando. La

password va scritta "in chiaro". Se si desidera inserire la password in forma criptata

tramite la funzione PASSWORD() di MySQL, si deve far precedere la stringa

criptata dalla parola PASSWORD.

Rimuovere i permessi ad un utente MySQL

Vediamo ora l'istruzione REVOKE che svolge la funzione opposta a GRANT, e cioè

rimuovere permessi. Ne vediamo solo la sintassi in quanto molto simile all'istruzione

GRANT:

REVOKE <istruzioni_revocate>

ON <database>.<tabella>

FROM <utente>@<host>

per la quale valgono le stesse regole sopra viste per GRANT.

Per un'azione globale è possibile utilizzare:

REVOKE ALL PRIVILEGES, GRANT OPTION

FROM <utente>@<host>

Quest'ultima sintassi elimina ogni permesso dell'utente su qualunque database del

sistema.

Le singole istruzioni INSERT, UPDATE e DELETE sono atomiche nel senso che o hanno

successo totale (su tutte le righe coinvolte) o falliscono totalmente senza alcun effetto sul

database.

È possibile combinare più istruzioni in una singola transazione atomica. Ad esempio, in

Oracle o in MySQL:

START TRANSACTION;

DELETE FROM Book WHERE Publisher = 1;

DELETE FROM Publisher WHERE ID = 1


PAGINE

21

PESO

53.29 KB

PUBBLICATO

6 mesi fa


DETTAGLI
Corso di laurea: Corso di laurea in ingegneria informatica e dell'automazione
SSD:
A.A.: 2018-2019

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher luckylucianooo di informazioni apprese con la frequenza delle lezioni di Basi di dati e sistemi informativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico delle Marche - Univpm o del prof Diamantini Claudia.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Basi di dati e sistemi informativi

Progetto Basi di Dati
Appunto
Riassunto comandi sql
Appunto
Algebra lineare e geometria - spazi vettoriali
Appunto
Riassunto esame Fondamenti di Informatica: Manuale di C/C++, prof. Dragoni
Appunto