55
ing. Alfredo Cozzi 1 Il linguaggio SQL

Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

  • Upload
    vanlien

  • View
    218

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

ing. Alfredo Cozzi 1

Il linguaggio SQL

Page 2: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

2

Il linguaggio SQL

Il linguaggio SQL (Structured Query Language) è nato con l’intento di soddisfare alle seguenti richieste nei db relazionali:

- definire e creare il database

- effettuare le diverse operazioni di gestione dei dati, quali l’inserimento, la cancellazione e la variazione dei record di unarchivio

- interrogare il db a scopo informativoIl linguaggio SQL è un linguaggio non procedurale che è diventato uno standard tra i linguaggi per la gestione di database relazionali. Nato alla fine degli anni 70 è oggi usato in tutti i prodotti DBMS come linguaggio di comando per l’utente della base di dati (Oracle, Informix, MySQL, SQLServer, Access)

Page 3: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

3

Il linguaggio SQL

Il linguaggio SQL consente all’utente di:

- definire la struttura delle relazioni del db e di controllare gli accessi al db (DDL )

- modificare i dati contenuti nel db, con le operazioni di inserimento, variazione e cancellazione (DML )

- porre interrogazioni al db (Query Language)Il linguaggio SQL fornisce inoltre gli opportuni comandi per definire i tabulati di uscita dei risultati (report), per ricuperare i dati quando accade un interruzione del programma, un guasto nei supporti magnetici, per definire le viste degli utenti sul db, per garantire la sicurezza dei dati nei confronti degli accessi di più utenti.

Page 4: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

4

Identificatori e tipi di dati

Gli identificatori sono costituiti da sequenze di caratteri di lunghezza massima uguale a 18 caratteri. Il nome di un attributo(una colonna di una tabella) è identificato per mezzo della notazione abituale: NomeTabella.NomeAttributo (il nome della tabella può essere omesso se non ci sono ambiguità nell’identificazione dell’attributo)

Nella dichiarazione della struttura di una tabella occorre specificare il tipo di dati scelto per gli attributi.

Page 5: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

5

Tipi standardI tipi standard del linguaggio SQL sono:

- BOOLEAN (valore logico)

- CHARACTER (n) (stringa di lunghezza n) o CHAR

- DATE (data nella forma MM/GG/AA)

- TIME (ora nella forma HH:MM)

- INTEGER (p) (numero intero con precisione p) o INT

- SMALLINT (numero intero con precisione 5)

- INTEGER (numero intero con precisione 10)

- DECIMAL (p,s) (numero decimale con precisione p e s cifre decimali) o NUMERIC

- REAL (numero reale con mantissa di precisione 7)

- FLOAT (numero reale con mantissa di precisione 15)

- FLOAT (p) (numero reale con mantissa di precisione p)

Per i dati numerici la precisione p indica il numero massimo di cifre che il numero può contenere

Page 6: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

6

La definizione delle tabelleLe tabelle vengono definite con il comando CREATE TABLE , seguito dal nome della tabella e dall’elenco degli attributi. Per ogni attributo bisogna specificare il nome e il tipo di dato. Gli attributi possono essere qualificati mediante diverse clausole con le quali è possibile definire: la chiave primaria, le chiavi esterne, l’obbligatorietàe il valore di defaultdi un campo

Es. Creare la tabella degli Impiegati e dei Dipartimenti

CREATE TABLE Impiegati

(ID smallint primary key ,

Cognome char(30) not null ,

Nome char(20) not null ,

Stipendio decimal(9,2),

Dipartimento char(5) referencesDipartimenti(Codice));

Not null indica che in tutte le righe della tabella quella colonna deve essere riempita con un valore non nullo e rende il campo obbligatorio

La clausola REFERENCES indica che l’attributo Dipartimento è chiave esterna e definisce il vincolo di integrità referenziale con la tabella Dipartimenti

Page 7: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

7

La definizione delle tabellePer creare la tabella Dipartimenti:

CREATE TABLE Dipartimenti

(Codice char(5),

Descrizione char(20) not null ,

Sede char(20),

Manager smallint,

Primary Key (Codice),

Unique (Descrizione),

Foreign Key (Manager) referencesImpiegati(ID)

On Deleteset null

On Updatecascade);

-non ci possono essere due dipartimenti con lo stesso nome

- è possibile dichiarare la chiave esterna in una riga a sé stante (Foreign Key)

- Manager è chiave esterna associata alla tabella Impiegati

- la cancellazione di una riga di Impiegati con un valore di ID associato a valori di Manager è permessa e i valori di ID corrispondenti assumono valore nullo (On Delete set null)

- l’aggiornamento di un ID associato a Manager si riflette a catena sui valori di Manager (On Update cascade)

Page 8: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

8

La struttura di una tabella può essere modificata con il comandoALTER TABLE , per aggiungere una nuova colonna (ADD) a quelle già esistenti, oppure per togliere una colonna (DROP).

Es. ALTER TABLEALTER TABLE Impiegati

ADDADD Nascita date;

ALTER TABLEALTER TABLE Impiegati

DROPDROP Residenza;

L’istruzione CREATE INDEX viene utilizzata per creare un nuovo indice su una tabella esistente, indicando il nome della tabella e il nome dell’attributo o degli attributi ai quali associare l’indice.

Se non si vuole che ci siano valori duplicati per l’attributo associato all’indice in righe diverse, occorre usare la clausola UNIQUE .

Es. Il comando seguente crea un indice di nome IndiceImpiegati sulla tabella Impiegati secondo gli attributi Cognome e Nome e non sono ammessi duplicati

CREATE UNIQUE INDEXCREATE UNIQUE INDEX IndiceImpiegati

ONON Impiegati(Cognome Nome);

Una tabella o indice possono essere eliminati con il comando DROP, seguito dal nome della tabella o dell’indice.

Es. DROP TABLEDROP TABLE Impiegati;

DROP INDEXDROP INDEX IndiceImpiegati ON Impiegati;

Nelle versioni moderne dei prodotti DBMS le operazioni di creazione di tabelle e indici, vengono effettuate come in Access attraverso un’interfaccia interattiva che facilita il lavoro dell’utente.

Page 9: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

9

I comandi per la manipolazione dei datiI valori degli attributi nelle righe della tabella possono essere inseriti, aggiornati o cancellati rispettivamente con i comandi INSERT, UPDATE, DELETE .

�Es. Per inserire i valori di una nuova riga della tabella Impiegati:

INSERT INTO Impiegati

(ID, Nome, Cognome, Residenza, Stipendio, Dipartimento)

VALUES (20,’Mario’, ‘Rossini’, ‘Caserta’, 3100, ‘Mag’);

�Per assegnare il dipendente con ID=20, presente in anagrafica, al dipartimento di produzione:

UPDATE Impiegati

SET Dipartimento = ‘Prod’

WHERE Matricola = 20;

�Per cancellare dalla tabella Dipendenti i dati del dipendente con ID=20:

DELETE FROM Impiegati

WHERE ID = 20;

�L’uso della clausola Where nei comandi Update e Delete consente di operare su gruppi di record

Es. se si vuole aumentare del 5% lo stipendio di tutti i dipendenti del dipartimento produzione:

UPDATE Impiegati

SET Stipendio = Stipendio * 1.05

WHERE Dipartimento = ‘Prod’;

Page 10: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

10

Il comando SelectCon il comando Selectè possibile estrarre dal database le informazioni desiderate. Vengono attivate le interrogazioni sulle relazioni e le operazioni relazionali per ottenere nuove tabelle.

La struttura base del comando Select è la seguente:

SELECT Colonne

FROM Tabelle

WHERE Condizioni

Accanto alla parola Selectvengono indicati i nomi degli attributi (le colonne) da elencare (se è necessario elencare tutti gli attributi basta scrivere il segno di * dopo la parola Select); dopo From vengono indicati i nomi della tabella o delle tabelle; dopo la clausola Where si specifica una condizione logica su uno o più attributi con lo scopo di filtrare le righe delle tabelle.

Es. Effettuare interrogazioni sulla tabella Impiegati

L’elenco con cognome, nome e residenza dei dipendenti del dipartimento di codice Prod:

SELECT Cognome, Nome, Residenza

FROM Impiegati

WHERE Dipartimento = ‘Prod’;

Page 11: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

11

�L’elenco dei dipendenti che lavorano alla produzione con residenza a Torino:

SELECT Cognome, Nome, Residenza

FROM Impiegati

WHERE Dipartimento = ‘Prod’ AND Residenza = ‘Torino’;

�Tutti i dati dei dipendenti che abitano a Roma:

SELECT *

FROM Impiegati

WHERE Residenza ‘Roma’;

�Se viene specificato il predicato DISTINCT le righe duplicate nella tabella risultante vengono ridotte a una.

Es. Se si desidera ottenere l’elenco di tutte le località di residenza dei dipendenti senza duplicati:

SELECT DISTINCT Residenza

FROM Impiegati;

Page 12: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

12

�La tabella che si ottiene come risultato dell’interrogazione con Select possiede un’intestazione delle colonne che riporta i nomi degli attributi; è possibile modificare questa intestazione rinominando la colonna sfruttando la clausola AS.

Es. SELECT ID AS Matricola, Nome, Cognome

FROM Impiegati;

Con il comando SELECT si può anche richiedere il calcolo di espressionisugli attributi presenti nella tabella;la tabella risultante contiene una colonna aggiuntiva con i risultati del calcolo per ogni riga.

Es. SELECT Cognome, Nome, Stipendio AS Attuale, Stipendio*1.05 AS Nuovo

FROM Impiegati;

�In alcuni comandi vengono usati valori costanti nelle condizioni scritte dopo WHEREWHERE:

SELECT Cognome, Nome, Residenza

FROM Impiegati

WHERE Stipendio >= 5500;

�Si potrebbe invece chiedere all’utente il valore del confronto (in Access questo può essere fatto indicando tra parentesi quadre il nome del parametro):

SELECT Cognome, Nome, Residenza

FROM Impiegati

WHERE Stipendio >= [Retribuzione annuale minima?];

�Per ottenere l’elenco dei dipendenti privi di dipartimento:

SELECT ID AS Matricola, Cognome, Nome

FROM Impiegati

WHERE Dipartimento IS NULL ;

Page 13: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

13

Le operazioni relazionali nel linguaggio SQL

Il comando SELECT può operare su più tabelle, indicandone i nomi dopo la clausola FROM e scrivendo dopo la parola WHERE la condizione che fa corrispondere le righe di una tabella con quelle dell’altra. Nelle quasi totalità dei casi la congiunzione necessaria è un equi-joinper cui la condizione da scrivere nella clausola WHEREWHERE consiste nell’uguaglianza tra attributi in due tabelle; se poi si ha un join naturale, gli attributi hanno il medesimo nome. Si realizza in pratica l’operazione di congiunzionedi due tabelle secondo un attributo comune.

Es. Ottenere l’elenco di tutti i dipendenti con i dati del dipartimento dove lavorano:

SELECT *

FROM Impiegati, Dipartimenti

WHERE Dipartimento = Codice;

Per maggior chiarezza si può anche scrivere nel modo seguente:

SELECT *

FROM Impiegati, Dipartimenti

WHERE Impiegati .Dipartimento = Dipartimenti .Codice;

Poiché nella condizione scritta accanto a WhereWhere viene usato il segno uguale, la congiunzione precedente fornisce un esempio di equi-join, cioè vengono combinate solo le righe per le quali si possono trovare valori uguali negli attributi che si corrispondono.

Page 14: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

14

�Nella versione del linguaggio SQL adottata da Access l’equi-join viene indicato come inner join :

SELECT Impiegati.*, Dipartimenti.*

FROM Dipartimenti INNER JOIN Impiegati ON

Dipartimenti.Codice = Impiegati.Dipartimento;

�Ottenere l’elenco dei dipendenti che lavorano in un dipartimento con sede a Roma, con cognome, nome e descrizione del dipartimento:

SELECT Impiegati.Cognome, Impiegati.Nome, Dipartimenti.Descrizione

FROM Impiegati, Dipartimenti

WHERE Impiegati.Dipartimento = Dipartimenti.Codice AND Dipartimenti.Sede = ‘Roma’;

�La prima condizione scritta dopo Where (Dipartimento = Codice)serve a specificare l’uguaglianza tra gli attributi comuni delle tabelle coinvolte nella congiunzione, la seconda condizione (Sede = ‘Roma’) specifica il criterio per operare la selezione sulle righe di Dipartimenti.

�Per semplificare la scrittura del comando Select è possibile fare ricorso agli alias per il nome della tabella, specificando dopo il nome originale della tabella la parola AS seguita dal nuovo nome:

SELECT I.Cognome, I.Nome, D.Descrizione

FROM Impiegati AS I INNER JOIN Dipartimenti AS D ON

I.Dipartimento = D.Codice WHERE D.Sede = ‘Roma’;

Page 15: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

15

Join esterniSQL permette di costruire forme di join che rispondono all’esigenza di congiungere due tabelle includendo nella congiunzione anche quelle righe di una delle due tabelle che non hanno una riga associata nell’altra. Queste congiunzioni prendono il nome di join esternie corrispondono alle operazioni di left join, right join, full joindell’algebra relazionale.

Si consideri per es. la congiunzione tra le tabelle Impiegati e Dipartimenti. Nella tabella prodotta dal join non compaiono le informazioni sui dipendenti che non sono stati assegnati a un dipartimento e le informazioni dei dipartimenti dove non lavora nessuno. Per considerare anche queste informazioni:

SELECT Impiegati.Nome, Impiegati.Cognome, Dipartimenti.Descrizione

FROM Impiegati LEFT JOIN Dipartimenti

ON Dipartimenti.Codice = Impiegati.Dipartimento;

Analogamente volendo considerare tutti i dipartimenti bisogna includere nel join tutte le righe della seconda tabella:

SELECT Impiegati.Nome, Impiegati.Cognome, Dipartimenti.Descrizione

FROM Impiegati RIGHT JOIN Dipartimenti

ON Dipartimenti.Codice = Impiegati.Dipartimento;

Page 16: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

16

Le funzioni di aggregazioneAll’interno del comando Selectpossono essere usate funzioni predefinite che agiscono sui valori contenuti in insiemi di righe della tabella e che per questo motivo si chiamano funzioni di aggregazione. Le funzioni di aggregazione agiscono sui valori di una singola colonna e restituiscono un solo valore come il massimo o il minimo dei valori considerati.

�Funzione COUNT

La funzione COUNT conta il numero di righe selezionate dall’interrogazione; si deve specificare come argomento della funzione il nome dell’attributo o il caratter *; nel primo caso vengono conteggiate le righe che hanno valore Null nella colonna dell’attributo specificato, nel secondo caso viene calcolato il numero delle righe delle tabelle incluse quelle con i campi di tipo Null.

•Es. visualizza il numero di tutte le righe presenti nella tabella Impiegati:

SELECT COUNT (*)

FROM Impiegati;

•Specificando il nome dell’attributo Dipartimento si ottiene il numero dei dipendenti che sono assegnati a un dipartimento:

SELECT COUNT (Dipartimento)

FROM Impiegati;

Page 17: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

17

�Restituire il numero di dipendenti residenti a Roma:

SELECT COUNT (*)

FROM Impiegati

WHERE Residenza = ‘Roma’;

�La stessa funzione nella versione COUNT(DISTINCT x) consente di ottenere il numero dei valori diversi tra loro nella colonna x che soddisfano alla condizione scritta dopo Where.

Es. se si vuole conoscere da quante differenti città di residenza provengono i dipendenti del dipartimento Produzione:

SELECT COUNT (DISTINCT Residenza)

FROM Impiegati

WHERE Dipartimento = ‘Prod’;

Oppure

SELECT COUNTSELECT COUNTSELECT COUNTSELECT COUNT (DISTINCTDISTINCTDISTINCTDISTINCT Residenza) AS Provenienza

FROMFROMFROMFROM Impiegati

WHEREWHEREWHEREWHERE Dipartimento = ‘Prod’;

Page 18: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

18

Funzione SUM

La funzione SUM restituisce la somma di tutti i valori contenuti in una colonna specificata come argomento della funzione: naturalmente l’attributo utilizzato nel calcolo deve essere di tipo numerico

Es. Se si vuole ottenere la somma degli stipendi dei dipendenti che appartengono al dipartimento Marketing:

SELECT SUM (Stipendio)

FROM Impiegati

WHERE Dipartimento = ‘Mkt’;

L’argomento della funzione Sum può anche essere un’espressione numerica contenente i nomi di attributi di tipo numerico. Si supponga di avere una tabella delle fatture che contiene gli attributi prezzo unitario dei prodotti e la quantità ordinata. Il totale delle fatture viene calcolato:

SELECT SUM (PrezUnit * Qta) AS Totale

FROM Fatture;

Page 19: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

19

Funzione AVGLa funzione AVG calcola la media dei valori contenuti in una deternimata colonna, con l’eventuale aggiunta dell’opzione Distinct. La funzione AVG non include nel calcolo i valori di tipo NULL presenti nella colonna.

Es. Calcolare lo stipendio medio dei dipendenti che lavorano in dipartimenti con sede a Torino:

SELECT AVG (Stipendio)

FROM Impiegati, Dipartimenti

WHERE Dipartimento = Codice AND Sede = ‘Torino’;

Page 20: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

20

Funzioni MIN e MAX

Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e massimo tra i valori della colonna di una tabella specificata come argomento della funzione.

Es. Calcolare i valori minimo e massimo degli stipendi di tutti i dipendenti:

SELECT MIN (Stipendio), MAX (Stipendio)

FROM Impiegati;

Visualizza il primo cognome e l’ultimo nell’elenco dei dipendenti:

SELECT MIN (Cognome), MAX (Cognome)

FROM Impiegati;

Page 21: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

21

Ordinamenti e raggruppamenti

Nel comando Selectsi può inserire la clausola ORDER BY per ottenere i risultati di un interrogazione ordinati secondo i valori contenuti in una o più colonne, tra quelle elencate accanto alla parola Select. La clausola Order By deve essere l’ultimo elemento di un comando Select.

Es. mostrare l’elenco alfabetico dei dipendenti con cognome, nome, residenza:

SELECT Cognome, Nome, Residenza

FROM Impiegati

ORDER BY Cognome, Nome;

Produrre l’elenco dei dipendenti in ordine decrescente di stipendio e a parità di stipendio in ordine crescente di

cognome:

SELECT Cognome, Stipendio

FROM Impiegati

ORDER BY Stipendio DESC, Cognome;

Page 22: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

22

GROUP BYLa clausola GROUP BY permette di raggruppare un insieme di righe aventi lo stesso valore nelle colonne indicate dalla clausola. L’opzione produce una riga di risultati per ogni raggruppamento.

Es. Elencare i dipartimenti dove lavorano i dipendenti, con la somma degli stipendi e il numero dei dipendenti per ogni dipartimento:

SELECT Dipartimento, COUNT(ID), SUM(Stipendio)

FROM Impiegati

GROUP BY Dipartimento;

L’interrogazione viene eseguita per passi: 1)le righe vengono raggruppate per Dipartimento, 2) le funzioni di aggregazione vengono applicate ai singoli raggruppamenti.

�Se si desidera che compaia il nome per esteso del dipartimento bisogna includere anche la tabella Dipartimenti nell’interrogazione e effettuare il raggruppamento sul campo Descrizione:

SELECT Dipartimento, COUNT(*), SUM(Stipendio)

FROM Impiegati, Dipartimenti

WHERE Impiegati.Dipartimento = Dipartimenti.Codice

GROUP BY Dipartimento;

Page 23: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

23

Condizioni sui raggruppamentiLa struttura del comando Selectcon raggruppamenti può essere ulteriormente ampliata con la clausola HAVING con la quale è possibile sottoporre al controllo di una o più condizioni i gruppi creati con la clausola Group by (HAVING serve a visualizzare le sole righe di raggruppamento che soddisfano alle scritte accando a HAVING). HAVING pone condizioni sui gruppi, WHERE pone condizioni sulle singole righe.

Es. Visualizzare per i soli dipartimenti con più di due addetti, il numero degli addetti e la somma degli stipendi:

SELECT Dipartimento, COUNT(ID), SUM(Stipendio)

FROM Impiegati

GROUP BY Dipartimento

HAVING COUNT (ID) > 2;

�Visualizzare l’elenco dei dipartimenti con sede a Torino con più di un addetto, per questi dipartimenti viene elencato oltre al nome anche il numero di impiegati e la somma degli stipendi:

SELECT Descrizione, COUNT(*), SUM(Stipendio)

FROM Impiegati, Dipartimenti

WHERE Impiegati.Dipartimento = Dipartimenti.Codice AND Sede = ‘Torino’

GROUP BY Descrizione

HAVING COUNT (*) > 1;

Page 24: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

24

Sintetizzando le diverse clausole:

SELECT Elenco colonne da mostrare

FROM Tabelle da cui estrarre le righe

WHERE Condizioni sulle congiunzioni o sulle righe estratte

GROUP BY Campi da considerare per raggruppamenti

HAVING Condizioni sui raggruppamenti

ORDER BY Ordinamenti sulle colonne elencate nella clausola SELECT

n.b.

• le sole clausole che devono comparire obbligatoriamente in un comando Select sono le prime due dell’elenco, le altre sono facoltative

• le clausole utilizzate devono essere elencate rispettando l’ordinamento del precedente elenco

• le interrogazioni che si possono costruire con le operazioni relazionali si esprimono con le sole clausole Select, From e Where.

Page 25: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

25

Le condizioni di ricerca

Le condizioni di ricerca sono utilizzate insieme alle clausole Where e Having per determinare i criteri di selezione rispettivamente delle righe e dei raggruppamenti. Nella scrittura delle condizioni si usano i segni di confronto =, <, >, <>, >=, <=. Una condizione di ricerca è costruita anche mettendo insieme più condizioni legate tra loro con gli operatori AND e OR, precedute eventualmente dall’operatore NOT. Le condizioni di ricerca si possono esprimere utilizzando anche altre parole del linguaggio SQL:

• BETWEEN : questo operatore controlla se un valore è compreso all’interno di un intervallo di valori, inclusi gli estremi. Es. ottenere l’elenco dei dipendenti che hanno retribuzione compresa tra 30000 e 45000 euro

SELECT Cognome, Nome, Funzione

FROM Impiegati

WHERE Stipendio BETWEEN 30000 AND 45000;

Page 26: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

26

• l’operatore IN controlla se un valore appartiene a uno dei valori di una lista che viene precisata dopo la parola In all’interno della condizione. Es. Ottenere tutti i dati dei dipendenti che risiedono a Torino, Venezia e Palermo:

SELECT *

FROM Impiegati

WHERE Residenza IN (‘Torino’, ‘Venezia’, ‘Palermo’);

• LIKE : questo operatore confronta il valore di un attributo di tipo carattere con un modello di stringa che può contenere caratteri jolly (o metacaratteri). I caratteri jolly sono _ (underline) per indicare uno e un solo carattere qualsiasi in quella posizione della stringa, %(percento) per indicare una sequenza di zero o più caratteri.

Es. ottenere il cognome e il dipartimento dei dipendenti con il cognome che inizia con ‘R’

SELECT Cognome, Dipartimento

FROM Impiegati

WHERE Cognome LIKE ‘R%’;

• il predicato IS NULL confronta il valore in una colonna con il valore Null. L’uso di questo predicato è il solo modo per controllare la presenza del valore NULL in una colonna.

Es. ottenere l’elenco dei dipendenti per i quali è indicato lo stipendio:

SELECT Cognome, Nome

FROM Impiegati

WHERE Stipendio IS NOT NULL ;

Page 27: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

27

Interrogazioni nidificateSi supponga di voler conoscere il nome del manager di Mario Rossi (Mario Rossi con ID=1 lavora nel dipartimento di codice Prod

che ha come manager una persona con ID=12 -> Anita Bianco):

SELECT C.Cognome, C.Nome

FROM Impiegati I, Dipartimenti D, Impiegati C

WHERE I.Dipartimento=D.Codice AND D.Manager=C.ID AND I.Nome=‘Mario’ AND I.Cognome=‘Rossi’;

Le interrogazioni nidificate permettono di risolvere lo stesso problema nel seguente modo:

1. Estrarre da Impiegati il codice del dipartimento dove lavora Mario Rossi

2. Usare il codice dipartimento trovato al punto1 per estrarre da Dipartimenti l’identificativo del manager del dipartimento

3. Dall’identificativo ricavato al punto 2 è possibile risalire al nome del manager per mezzo della tabella Impiegati

SELECT Cognome, Nome

FROM Impiegati 3

WHERE ID=

(SELECT Manager

FROM Dipartimenti 2

WHERE Codice=

(

SELECT Dipartimento

FROM Impiegati 1

WHERE Cognome=‘Rossi’ AND Nome=‘Mario’

)

);

1

Page 28: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

28

�Elencare cognome e nome dei dipendenti che hanno lo stipendio inferiore allo stipendio medio di tutti i dipendenti:

SELECT Cognome, Nome

FROM Impiegati

WHERE Stipendio < (SELECT AVG (Stipendio)

FROM Impiegati );

Elencare i dipendenti per i quali lo stipendio risulta maggiore del valore medio di tutti gli stipendi; l’elenco deve contenere cognome, nome e descrizione del dipartimento del dipendente oltre allo scarto rispetto al valore medio degli stipendi:

SELECT Cognome, Nome, Descrizione, Stipendio – (SELECT AVG (Stipendio) FROM Impiegati)

FROM Impiegati, Dipartimenti

WHERE Dipartimento = Codice AND Stipendio = (SELECT AVG (Stipendio)

FROM Impiegati);

�Produrre l’elenco dei dipendenti che sono manager:

SELECT Cognome, Nome, ID

FROM Impiegati

WHERE ID IN (SELECT DISTINCT Manager

FROM Dipartimenti);

Page 29: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

29

ANY

ANY viene utilizzata in una clausola Where in espressioni del tipo: x > ANY Elenco; il predicato ANY è vero se il confronto è vero per almeno uno dei valori dell’elenco

Es. ottenere le informazioni dei dipendenti del dipartimento Amministrazione con lo stipendio superiore a quello di almeno un impiegato del Marketing:

SELECT Cognome, Nome

FROM Impiegati

WHERE Dipartimento = ‘Amm’ AND Stipendio > ANY ( SELECT Stipendio

FROM Impiegati

WHERE Dipartimento = ‘Mkt’);

ALL

ALL viene utilizzato in una clausola Where in espressioni del tipo x <= ALL Elenco; il predicato ALL restituisce vero se il confronto è vero per ciascuno dei valori restituiti. La condizione di ricerca è falsa se il confronto è falso per almeno uno tra i valori restituiti dalla sottoquery.

Sostituendo ALL a ANY nella precedente interrogazione si possono estrarre tutte le righe dei dipendenti dell’Amministrazione che hanno lo stipendio maggiore di quello di tutti gli impiegati del Marketing

Valgono le seguenti equivalenze:

Attributo ININININ (Select…) equivale a: Attributo = ANYANYANYANY (Select …)

Attributo NOTNOTNOTNOT ININININ (Select…) equivale a: Attributo <> ALLALLALLALL (Select …)

Page 30: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

30

EXISTSEXISTS viene utilizzato in una clausola WHERE in espressioni del tipo EXISTS Elenco

Il predicato EXISTS controlla se vengono restituite righe dall’esecuzione delle sottoquery; la condizione di ricerca è vera se la Select nidificata produce una o più righe come risultato.

Es. Ottenere l’elenco dei dipendenti con cognome e nome e scostamento dalla media degli stipendi del dipartimento Marketing, solo se esistono dipendenti che lavorano in quel dipartimento:

SELECT Cognome, Nome, Stipendio – (SELECT AVG (Stipendio)

FROM Impiegati

WHERE Dipartimento = ‘Mkt’)

FROM Impiegati

WHERE EXIXTS (SELECT *

FROM Impiegati

WHERE Dipartimento = ‘Mkt’);

Page 31: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

31

Le viste logicheIl linguaggio SQL consente di decidere le modalità con le quali gli utenti possono vedere le tabelle del DB creando una finestra, detta VIEW (vista), su alcuni o su tutti i dati contenuti in una o più tabelle. La vista viene identificata con un nome assegnato in fase di creazione con il comando CREATEVIEW . L’utente può operare sulla vista come se fosse una tabella del DB (non rimane distratto dai dati che sono ininfluenti sul tipo di elaborazione che deve fare).

La creazione della vista viene realizzata con l’uso dell’istruzione Select all’interno del comando Create View.

Es. creare una vista di nome ImpiegatiCapi contenente i dati dei manager:

CREATE VIEW ImpiegatiCapi AS

SELECT ID, Nome Cognome, Dipartimento

FROM Impiegati

WHERE ID IN (10,12,13,14);

Essendo 10,12,13,14 gli identificativi dei manager.

Una vista può essere eliminata con il comando DROP VIEW seguito dal nome assegnato alla vista in fase di creazione. Es. per eliminare la vista creata con il nome ImpiegatiCapi :

DROP VIEW ImpiegatiCapi ;

Page 32: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

32

Le viste logiche possono semplificare la progettazione di query complesse. Es. costruiamo la vista logica di nome PersonaleDipartimenti che elenca, per ogni dipartimento, il totale degli stipendi erogati e il numero dei dipendenti che lavorano nel dipartimento:

CREATE VIEW PersonaleDipartimenti

(Dipart,NumDipendenti,TotStipendi) AS

SELECT Dipartimento, Count(*), SUM(Stipendio)

FROM Impiegati

GROUP BY Dipartimenti;

Il comando Create View crea una vista logica con tre attributi di nome Dipart , NumDipendenti, TotStipendi con i quali si fa riferimento ai 3 valori prodotti dalla Select.

Partendo dalla vista logica è facile costruire le seguenti interrogazioni:

• dipartimento che spende di più:

SELECT Dipart

FROM PersonaleDipendenti

WHERE TotStipendi = (SELECT MAX (TotStipendi)

FROM PersonaleDipartimenti);

• numero medio di dipendenti per dipartimento:

SELECT AVG (NumDipendenti)

FROM PersonaleDipartimenti;

Page 33: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

33

Esempi di interrogazioni

Attività sportive studentescheLe informazioni relative alle attività sportive studentesche devono essere organizzate in una base di dati. Gli studenti frequentano gli istituti superiori e possono partecipare a una o più manifestazioni sportive. Per ogni attività sportiva le scuole indicano un professore che svolge la funzione di riferimento e di allenatore: ogni professore segue una sola manifestazione, ma una stessa manifestazione può essere seguita da professori diversi di scuole diverse. Definire il modello del DB e rappresentare le seguenti interrogazioni:

- numero di studenti che partecipano a una determinata manifestazione sportiva

- elenco anagrafico degli allenatori di un’attività sportiva

- elenco delle scuole con il numero di studenti che partecipano alle attività sportive

- elenco delle scuole con studenti che partecipano a una determinata manifestazione sportiva

- elenco allenatori e scuole di appartenenza in ordine alfabetico

- numero degli studenti partecipanti di una determinata scuola per ciascuna delle manifestazioni sportive

Page 34: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

34

Analisi di dati

Le entità che possono essere individuate nel problema sono:

- Istituto, per gli istituti di appartenenza di studenti e professori

- Studente, per gli studenti delle diverse scuole che partecipano alle manifestazioni

- Professore, per rappresentare i docenti che svolgono le funzioni di allenatore

- Manifestazione, per le attività sportive

Gli attributi di Istitutosono: codice dell’istituto, denominazione, indirizzo, telefono

Gli attributi di Studentesono: codice dello studente, cognome, nome, data di nascita, classe

Gli attributi di Professoresono: codice del professore, cognome, nome

Gli attributi di Manifestazionesono: codice della manifestazione, descrizione, luogo, data inizio per i tornei e i campionati o di svolgimento per le gare di una giornata

Page 35: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

35

Modello E/R

Studente IstitutoN 1

Frequentare

Manifestazione

N

N

Professore

1

N

Partecipare Impiegare

Coordinatore

1 N

Page 36: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

36

Modello Logico

Utilizzando le regole di derivazione si passa dal modello concettuale al modello logico, cioè alle tabelle: le associazioni uno a molti si rappresentano introducendo le chiavi esterne; nelle tabelle Studentie Istitutoper indicare l’istituto di appartenenza; nella tabella Professoriviene aggiunta anche un’altra chiave esterna per l’associazione con l’entità Manifestazioni; l’associazione molti a molti genera una nuova tabella Iscrizioniche contiene le chiavi primarie di Studentie Manifestazionipiù la data di iscrizione

Tabelle

Istituti ( CodiceIstituto,Denominazione, Indirizzo, Telefono)

Studenti (CodiceStud, CognStud, NomeStud, DataNascita, Classe, CodiceIstituto)

Manifestazioni (CodiceManif, Descrizione, Luogo, DataInizio)

Professori(CodiceProfCognProf, NomeProf, CodiceIstituto, CodiceManif)

Iscrizione (CodiceStud, CodiceManif, DataIscrizione)

Page 37: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

37

Interrogazioni

- Numero di studenti che partecipano a una determinata manifestazione sportiva

SELECT COUNT (*)

FROM Manifestazioni, Iscrizioni

WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManifAND Descrizione = [manifestazione da controllare];

- Elenco delle scuole con il numero di studenti che partecipano alle attività sportive

SELECT Denominazione, COUNT (DISTINCT CodiceStud)

FROM Studenti, Istituti

WHERE Studenti.CodiceIstituto = Istituto.CodiceIstituto

GROUP BY Denominazione;

-Elenco delle scuole con studenti che partecipano a una determinata manifestazione sportiva

SELECT Denominazione, Indirizzo, Telefono

FROM Manifestazioni, Iscrizioni, Studenti, Istituti

WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND

Studenti.CodiceStud = Iscrizioni.CodiceStud AND

Sudenti.CodiceIstituto = Istituti.CodiceIstituto AND

Descrizione = [manifestazione da controllare]

GROUP BY Denominazione, Indirizzo, Telefono;

Page 38: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

38

-Elenco allenatori e scuole di appartenenza in ordine alfabetico

SELECT CognProf, NomeProf, Denominazione

FROM Professori, Istituti

WHERE Professori.CodiceIstituto = Istituto.CodiceIstituto

ORDER BY CognProf, NomeProf;

- Numero degli studenti partecipanti di una determinata scuola per ciascuna delle manifestazioni sportive

SELECT Descrizione, COUNT(*)

FROM Manifestazioni, Iscrizioni, Studenti, Istituti

WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND

Studenti.CodiceStud = Iscrizioni.CodiceStud AND

Studenti.CodiceIstituto = Istituto.CodiceIstituto AND

Denominazione = [scuola da controllare]

GROUP BY Descrizione;

Page 39: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

39

Viaggi e vacanze

Un’agenzia di viaggi intende organizzare in una base di dati tutte le informazioni riguardanti la sua attività: i viaggi o vacanze, le organizzazioni turistiche o tour oparator, i clienti dei propri servizi, le nazioni o località o città che sono destinazione dei viaggi/vacanze. Tutte le attività proposte ai clienti sono dei pacchetti: ciascuno di essi si riferisce a un organizzazione turistica e riguardano una precisa zona del mondo o nazione o città. Ci possono essere offerte di viaggi con la stessa destinazione da parte di organizzazioni diverse. Per es. ci può essere una crociera nel Mediterraneo proposta dall’organizzazione turistica A, oppure un soggiorno di una settimana a Vienna offerta dall’organizzazione turistica B.

Di ogni pacchetto offerto occorre conoscere modalità e prezzi; di ogni località o nazione è opportuno tenere memorizzate informazioni su condizioni climatiche, moneta…….

Un cliente può acquistare in date diverse molti viaggi o vacanze.

Definire il modello del DB e rappresentare le seguenti interrogazioni :

- Elenco dei viaggi/Vacanza con prezzo inferiore a un prezzo prefissato

- Elenco dei soggiorni con prezzo in una località prefissata

- Elenco dei clienti, con nome e indirizzo, che hanno fatto un viaggio con una determinata destinazione

- Numero dei pacchetti offerti da un’organizzazione turistica prefissata

- Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad esse

Page 40: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

40

Analisi dei dati

Le entità che possono essere individuate nel problema sono:

- Nazione, per rappresentare gli stati o le località che sono destinazioni dei pacchetti di vacanze

- Organizzazione, per società di turismo che offrono i viaggi e i soggiorni di vacanze

- Cliente, per l’anagrafica dei clienti dell’agenzia di viaggi

- Pacchetto, per rappresentare i pacchetti di viaggio o soggiorno

Gli attributi di Nazionesono: codice della nazione o località, denominazione più dettagliata dello stato o della località di destinazione, moneta, clima

Gli attributi di Organizzazionesono: codice dell’organizzazione, nome, telefono

Gli attributi di Clientesono: codice del cliente, cognome e nome, indirizzo, telefono

Gli attributi di Pacchettosono: codice del pacchetto, modalità, prezzo

Page 41: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

41

Organizzazione Pacchetto1 N

OffrireClienteN N

Acquistare

Nazione

N

1Riferirsi

Page 42: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

42

Utilizzando le regole di derivazione si passa dal modello concettuale al modellologico, cioè le tabelle: le associazioni uno a molti si rappresentano introducendo le chiavi esterne nella tabella Pacchettiper indicare l’organizzazione proponente e la nazione o località di destinazione. L’associazione molti a molti genera una nuova tabella Acquistiche ha come chiave un numero progressivo di registrazione e contiene le chiavi di Pacchettie Clienti più la data in cui il cliente ha acquistato il pacchetto.

Tabelle

Nazioni (CodiceNaz, Denominazione, Moneta, Clima)

Clienti (CodiceCli, Cognome, Nome, Indirizzo, Telefono)

Organizzazioni (CodiceOrg, NomeOrg, TelefOrg)

Pacchetti(CodicePac, Descrizione, Modalità, Prezzo, CodiceNaz, CodiceOrg)

Acquisti (NumReg, CodiceCli, CodicePac, DataAcquisto)

Page 43: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

43

Interrogazioni

• Elenco dei viaggi/Vacanza con prezzo inferiore a un prezzo prefissato

SELECT *

FROM Pacchetti

WHERE Prezzo < [prezzo massimo]

• Elenco dei soggiorni con prezzo in una località prefissata

SELECT Descrizione, Modalità, Prezzo

FROM Nazioni, Pacchetti

WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz AND Denominazione = [località prefissata]

• Elenco dei clienti, con nome e indirizzo, che hanno fatto un viaggio con una determinata destinazione

SELECT Cognome, Nome, Indirizzo

FROM Nazioni, Pacchetti, Acquisti, Clienti

WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz AND

Pacchetti.CodicePac = Acquisti.CodicePac AND

Acquisti.CodiceCli = Clienti.CodiceCli AND

Denominazione = [località da controllare];

Page 44: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

44

• Numero dei pacchetti offerti da un’organizzazione turistica prefissata

SELECT COUNT (*)

FROM Pacchetti, Organizzazioni

WHERE Pacchetti.CodiceOrg = Organizzazioni.CodiceOrg AND NomeOrg = [organizzazione da controllare];

• Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad esse

SELECT Denominazione, COUNT(*)

FROM Nazioni, Pacchetti

WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz

GROUP BY Denominazione;

Page 45: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

45

Rappresentanti e fatture ai clienti

Si vogliono organizzare le informazioni relative ai clienti, ai loro rappresentanti e alle fatture emesse. Ogni rappresentante ha tanti clienti, mentre a un cliente corrisponde un solo rappresentante. Per semplicità si supponga di registrare solo la data e l’importo totale di ogni fattura, senza specificare le righe di dettaglio sugli articoli venduti.

Definire il modello del database e rappresentare le seguenti interrogazioni:

• Elenco dei clienti di un rappresentante

• Numero dei clienti affidati a un determinato rappresentante

• Cognome e nome del rappresentante di un determinato cliente

• Elenco delle fatture di un codice cliente prefissato, in ordine di data

• Fatturato raggruppato per codice rappresentante

• Numero delle fatture emesse raggruppate per codice rappresentante

• Nome del cliente e data di emissione per la fattura con importo massimo

• Codice e nome dei clienti per i quali il fatturato totale è superiore a una cifra prefissata

• Codice e nome dei rappresentanti per i quali il numero delle fatture è superiore a un numero prefissato

Page 46: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

46

Analisi dei dati

Le entità che possono essere individuate nel problema sono:

• Cliente, per i clienti ai quali vengono emesse le fatture

• Rappresentante, per gli agenti ai quali sono assegnati i clienti

• Fattura, per le vendite effettuate dai rappresentanti

Gli attributi di Clientesono: codice del cliente, ragione sociale, indirizzo, telefono, partita IVA.

Gli attributi di Rappresentantesono: codice del rappresentante, cognome, nome, zona assegnata.

Gli attributi di Fatturasono: numero della fattura, data di emissione, importo.

Page 47: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

47

Schema Entity/Relationship

Fattura Cliente RappresentanteN 1

Ricevere

N 1

Visitare

Il modello viene verificato utilizzando le regole di lettura del modello E/R:

Ogni rappresentante può visitare uno o più clienti, ogni cliente deve essere visitato da un solo rappresentante.

Ogni cliente può ricevere una o più fatture, ogni fattura deve essere ricevuta da un solo cliente.

Utilizzando le regole di derivazione si passa dal modello concettuale alle tabelle, introducendo le chiavi esterne per rappresentare le associazioni uno a molti

TABELLE

Rappresentanti(CodiceRap, CognomeRap, NomeRap, Zona)

Clienti (CodiceCli, RagioneSociale, Indirizzo, Telefono, PartitaIVA, CodiceRap)

Fatture (NumeroFatt, DataFatt, Importo, CodiceCli)

Page 48: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

48

Interrogazioni• Elenco dei clienti di un rappresentante

SELECT RagioneSociale, Indirizzo, Telefono

FROM Clienti, Rappresentanti

WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND

CognomeRap = [rappresentante da controllare];

• Numero dei clienti affidati a un determinato rappresentante

SELECT COUNT(*)

FROM Clienti, Rappresentanti

WHERE Clienti.CodiceRap = Rappresentanti.CodiceRapAND

CognomeRap = [rappresentante da controllare];

• Cognome e nome del rappresentante di un determinato cliente

SELECT CognomeRap, NomeRap

FROM Clienti, Rappresentanti

WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND

RagioneSociale = [cliente da controllare];

Page 49: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

49

• Elenco delle fatture di un codice cliente prefissato, in ordine di data

SELECT *

FROM Fatture

WHERE CodiceCli = [codice da controllare]

ORDER BY DataFatt;

• Fatturato raggruppato per codice rappresentante

1. Temp1=congiunzione di Clienti e Fatture su CodiceCli

2. Temp2=Raggruppamento di Temp1 per CodiceRap e calcolo somma Importo

3. Proiezione di Temp2 su CodiceRap, Somma

SELECT CodiceRap, SUM(Importo)

FROM Fatture, Clienti

WHERE Fatture.CodiceCli = Clienti.CodiceCli

GROUP BY CodiceRap;

Page 50: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

50

• Numero delle fatture emesse raggruppate per codice rappresentante

1. Temp1=Congiunzione di Clienti e Fatture su CodiceCli

2. Temp2=Raggruppamento di Temp1 per CodiceRap e Conteggio

3. Proiezione di Temp2 su CodiceRap, conteggio

SELECT CodiceRap, COUNT(*)

FROM Fatture, Clienti

WHERE Fatture.CodiceCli = Clienti.CodiceCli

GROUP BY CodiceRap;

Page 51: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

51

• Nome del cliente e data di emissione per la fattura con importo massimo

1. ValMax=Valore massimo importo fatture

2. Temp1=Selezione di Fatture per Importo=ValMax

3. Temp2=Congiunzione di Clienti e Temp1 su CodiceCli

4. Proiezione di Temp2 su RagioneSociale,DataFatt,Importo

SELECT RagioneSociale, DataFatt, Importo

FROM Fatture, Clienti

WHERE Fatture.CodiceCli = Clienti.CodiceCli AND

Importo = ( SELECT MAX (Importo) FROM Fatture);

• Cognome e nome del rappresentante corrispondente alla fattura con importo massimo

1. ValMax=Valore massimo importo fatture

2. Temp1=Selezione di Fatture per Importo=ValMax

3. Temp2=Congiunzione di Clienti e Temp1 su CodiceCli

4. Temp3=Congiunzione di Rappresentanti e Temp2 su CodiceRap

5. Proiezione di Temp3 su CognomeRap, NomeRap

SELECT CognomeRap, NomeRap

FROM Fatture, Rappresentanti, Clienti

WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND

Fatture.CodiceCli = Clienti.CodiceCli AND

Importo = ( SELECT MAX (Importo) FROM Fatture);

Page 52: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

52

• Codice e ragione sociale dei clienti per i quali il fatturato totale è superiore a una cifra prefissata

1. Temp1=Congiunzione di Clienti e Fatture su CodiceCli

2. Temp2=Raggruppamento di Temp1 per cliente e Somma importi

3. Temp3=selezione di Temp2 per Somma importi >[cifra prefissata]

4. Proiezione di Temp3 su CodiceCli,RagioneSociale

SELECT CodiceCli, RagioneSociale

FROM Fatture, Clienti

WHERE Clienti.CodiceCli = Fatture.CodiceCli

HAVING SUM (Importo) > [cifra prefissata];

Page 53: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

53

• Codice e nome dei rappresentanti per i quali il numero delle fatture è superiore a un numero prefissato

1. Temp1=Congiunzione di Rappresentanti e Clienti suCodiceRap

2. Temp2=Congiunzione di Temp1 e fatture su CodiceCli

3. Temp3=Raggruppamento di Temp2 per rappresentante e Conteggio

4. Temp4=Selezione di Temp3 per conteggio>[numero prefissato]

5. Proiezione di Temp4 su CodiceRap, CognomeRap, NomeRap

SELECT CodiceRap, CognomeRap, NomeRap

FROM Fattura, Rappresentanti, Clienti

WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND

Fatture.CodiceCli = Clienti.CodiceCli

GROUP BY Codice.Rap, CognomeRap, NomeRap

HAVING COUNT (*) > [numero prefissato];

Page 54: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

54

I comandi per la sicurezzaL’amministrazione della base di dati può stabilire anche il diritto di accesso per utenti specifici o per tutti gli utenti, nel caso di accessi multipli alle tabelle del DB.

Il comando GRANT concede i permessi, specificando il tipo di accesso, le tabelle sulle quali è consentito l’accesso e l’elenco degli utenti ai quali è permesso di accedere. Il tipo di accesso può riguardare il diritto di modifica della struttura della tabella con l’aggiunta di nuove colonne, oppure di modifica dei dati contenuti nella tabella, oppure l’uso del comando Select.

Per concedere il diritto di modifica sulla tabella dei dipendenti agli utenti denominati User1 e User2, si deve usare il comando:

GRANT UPDATE

ON Impiegati

TO User1, User2;

La revoca dei permessi con annullamento dei diritti di accesso viene effettuato con il comando REVOKE che ha una sintassi analoga a quella del comando Grant:

REVOKE UPDATE

ON Impiegati

FROM User1, User2

Page 55: Il linguaggio SQL · di ID corrispondenti assumono valore nullo (On Delete set null) ... Nelle quasi totalità dei casi la congiunzione necessaria è un equi-join per cui la condizione

55

I permessi che possono essere concessi (o revocati) agli utenti sono indicati con le seguenti parole chiave che vanno specificate dopo Grant o Revoke:

ALTER per aggiungere o eliminare colonne, oppure per modificare i tipi di dati

DELETE per eliminare righe dalle tabelle

INDEX per creare indici

INSERT per inserire nuove righe nelle tabelle

SELECT per ritrovare i dati dalle tabelle

UPDATE per cambiare i valori contenuti nelle tabelle

ALL per tutti i permessi precedenti

I permessi con le opzioni Select e Update, nei comandi Grant e Revoke, diventano più restrittivi specificando, tra parentesi tonde e separati con la virgola, i nomi delle colonne che l’utente può vedere o modificare

Es. Per concedere il diritto di modifica della residenza e dello stipendio dei dipendenti all’utente denominato con User3:

GRANT UPDATE (Residenza, Stipendio)

ON Impiegati

TO User3;