1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

27
1 Basi di Dati S S tructured tructured Q Q uery uery L L anguage anguage Appunti Appunti Matteo Longhi

Transcript of 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

Page 1: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

1

Basi di Dati

SStructuredtructured Q Queryuery L Languageanguage

AppuntiAppunti

Matteo Longhi

Page 2: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

2

Introduzione

• Standard creato nel 1976 da IBM

• Aggiornato (versione 2) nel 1992 (ANSI X3.135 e ISO 9075)

• Consente di:– DDL: definire la struttura del DB– DML: modificare i dati contenuti nel DB

Page 3: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

3

DDL: Data Definition LanguageCREATE TABLE Personale(

matricola char(5), cognome char(30),

nome char(20),codFiscale char(16) not null,dataAssunzione date,filiale smallint,Funzione char(15),livello smallint,stipBase float,via char(25),cap char(5),citta char(20),prov char(2)

);

Esempio:

Page 4: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

4

Tipi di dato

• CHARACTER(n)

CHAR(n) Stringa di lunghezza n• DATE Data nella forma mm/gg/aa• TIME Ora nel formato hh:mm• INTEGER Numero intero da -2147483648 a -21474836487

• SMALLINT Numero da -32768 a 32767• REAL• FLOAT

Page 5: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

5

Modifica dei DatiPer inserire un nuovo record:

INSERT INTO Personale(matricola,cognome,nome,…,prov)VALUES(‘AB541’,’Rossi’,’Mario’,…,’CO’);

Per aggiornare record esistenti:UPDATE PersonaleSET livello = 6WHERE livello=5;

Per cancellare record esistenti:DELETE FROM PersonaleWHERE stipBase<750;

Page 6: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

6

Query

Le principali operazioni di query (interrogazione) sono:

Proiezione: visualizzare solo le colonne (campi) specificati

Selezione: visualizzare solo le righe (record) che soddisfano una certa condizione

Congiunzione (Join): unire più tabelle

Page 7: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

7

Simple Query

Sintassi generale:

SELECT [DISTINCT] { <campo-expr> [AS <Alias>] }FROM { <tabella> [AS <Alias>] }[WHERE <Predicato>]

Legenda:[…] Opzionale{…} Almeno uno, separati dalla virgola

Page 8: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

8

Simple Query: esempiTabelle:

PERSONALE (matricola, cognome, nome, codFiscale, dataAssunzione, filiale, funzione, livello, stipBase, via, cap, citta, prov)

DIPENDENZA (codFiliale, descrizione, indirizzo)

Query - cognome, nome e codice fiscale di tutto il personale:

SELECT cognome, nome, codFiscaleFROM Personale

Query - cognome, nome e codice fiscale degli impiegati:

SELECT cognome, nome, codFiscaleFROM PersonaleWHERE funzione=‘impiegato’

Page 9: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

9

Simple Query: DISTINCT

DISTINCT: elimina le righe duplicate nella tabella risultante.

Query – elenco delle professioni presenti in azienda:

SELECT DISTINCT funzione

FROM Personale

Senza l’uso il distinct:

SELECT funzione

FROM Personale

funzione

Impiegato

Dirigente

Segretario

…funzione

Impiegato

Impiegato

Impiegato

Dirigente

Segretario

Segretario

Page 10: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

10

Simple Query: * e AS

Il simbolo * sostituisce l’elenco di tutti i campi.

Query – tutti i dati dei dipendenti che abitano in provincia di milano:

SELECT *FROM PersonaleWHERE prov=‘MI’

La clausola AS permette di modificare l’intestazione di una colonna.

Query – l’elenco delle province da cui provengono i dipendenti:

SELECT DISTINCT prov AS ProvinciaFROM Personale

Page 11: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

11

Query : congiunzione (JOIN)

Query – cognome, nome e indirizzo della filiale in cui lavora ogni dipendente

SELECT Personale.cognome, Personale.nome, Dipendenza.indirizzo

FROM Personale, Dipendenza

WHERE Personale.filiale=Dipendenza.codFiliale

E’ necessario specificare la corrispondenza tra la chiave primaria di una tabella e la chiave esterna dell’altra (condizione di join).

Page 12: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

12

Query : JOIN (2)

Query – cognome, nome e indirizzo della filiale in cui lavora ogni dipendente

SELECT P.cognome, P.nome, D.indirizzo

FROM Personale AS P, Dipendenza AS D

WHERE P.filiale=D.codFiliale

Page 13: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

13

Query : JOIN (3)

Nel caso sia necessario effettuare la congiunzione di tre tabelle:

SELECT *

FROM Tab1, Tab2, Tab3

WHERE Tab1.chiave=Tab2.chiaveExt AND Tab2.chiave=Tab3.chiaveExt

Page 14: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

14

Query : Funzioni di Aggregazione

Funzione Valore restituito

COUNT numero di righe

SUM somma

AVG media

MIN valore minimo

MAX valore massimo

Il risultato è UN SOLO valore!

Page 15: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

15

Query : Funzioni di Aggregazione (2)

Query – Numero di impiegati

SELECT COUNT(*)FROM PersonaleWHERE funzione=‘impiegato’

Query – Numero di province di provenienza degli impiegati

SELECT COUNT( DISTINCT(prov) )FROM PersonaleWHERE funzione=‘impiegato’

Page 16: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

16

Query : Funzioni di Aggregazione (3)

Query – La somma degli stipendi che appartengono al livello 3

SELECT SUM(StipBase)FROM PersonaleWHERE livello=3

Query – Lo stipendio medio degli impiegati

SELECT AVG(StipBase)FROM PersonaleWHERE funzione=‘impiegato’

Query – Lo stipendio minimo e massimo

SELECT MIN(StipBase), MAX(StipBase)FROM Personale

Page 17: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

17

Query : Condizioni di ricerca (1)

BETWEEN: controlla se un valore è compreso in un intervallo, estremi compresi

Query – Cognome e nome dei dipendenti assunti nel 2002

SELECT Cognome, NomeFROM PersonaleWHERE dataAss BETWEEN 01/01/2001 AND 31/12/2001

(NOT) IN: controlla se un valore appartiene ad un insiemeQuery – Cognome e nome dei dipendenti che risiedono nelle province

di Milano, Como, Lecco e Bergamo.

SELECT Cognome, NomeFROM PersonaleWHERE prov IN (‘MI’, ‘CO’, ‘LC’, ‘BG’)

Page 18: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

18

Query : Condizioni di ricerca (2)

(NOT) LIKE: confronta un valore usando caratteri jollyQuery – I cognomi dei dipendenti che iniziano per “Ros”.

SELECT CognomeFROM PersonaleWHERE Cognome LIKE ‘Ros%’

IS (NOT) NULL: controlla se un campo non è stato compilatoQuery – Cognome e nome dei dipendenti di cui non si conosce la

provincia di residenza.

SELECT Cognome, NomeFROM PersonaleWHERE prov IS NULL

Page 19: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

19

Query : Ordinamenti

ORDER BY ASC|DESC: ordina i risultati in senso crescente (ASC, di default) o decrescente (DESC)

Query – I cognomi dei dipendenti in ordine crescente

SELECT CognomeFROM PersonaleORDER BY Cognome

Query – I cognomi degli impiegati in ordine di decrescente di stipendio e, a parità di stipendio, in ordine di cognome crescente

SELECT Cognome, stipBaseFROM PersonaleWHERE funzione=‘impiegato’ORDER BY stipBase DESC, Cognome

Page 20: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

20

Query : Raggruppamenti

GROUP BY: raggruppa le righe aventi lo stesso valore nelle colonne indicate.

le funzioni di aggregazione restituiscono un valore per ogni raggruppamento

Query – Il numero di impiegati in ciascuna filiale.

SELECT filiale, COUNT(*) AS NumeroDipendentiFROM PersonaleWHERE funzione=‘impiegato’GROUP BY filiale

Page 21: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

21

Query : Raggruppamenti (2)

HAVING: aggiunge una condizione al GROUP BY. Si possono usare le funzioni di aggregazione (anche in

questo caso riferite ad ogni singolo raggruppamento).

Query – Lo stipendio medio degli impiegati nelle filiali con più di 10 dipendenti.

SELECT filiale, AVG(stipBase) AS StipendioMedioFROM PersonaleWHERE funzione=‘impiegato’GROUP BY filialeHAVING COUNT(*)>10

Page 22: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

22

Query nidificate

Nella condizione (WHERE) è possibile confrontare un valore con il risultato di un’altra query.

Query – Cognome e nome dei dipendenti con stipendio inferiore alla media

SELECT cognome, nomeFROM PersonaleWHERE stipBase < ( SELECT AVG(stipBase)

FROM Personale )

NB: il confronto “<“ è possibile perché la seconda query, grazie alla funzione di aggregazione, restituisce UN SOLO risultato.

Page 23: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

23

Query nidificate (2)

Query – Cognome, nome e indirizzo della filiale in cui lavorano i dipendenti per i quali lo stipendio è superiore alla media degli stipendi degli impiegati.

SELECT P.cognome, P.nome, D.indirizzoFROM Personale AS P, Dipendenza AS DWHERE P.filiale=D.codFiliale AND P.stipBase > ( SELECT AVG(stipBase)

FROM Personale WHERE funzione=‘impiegato’

)

Page 24: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

24

Query nidificate: ANY

ANY: la condizione è vera se il confronto è vero per almeno uno dei valori restituiti dalla seconda query.

Query – Dipendenti che non sono impiegati e che hanno lo stipendio superiore a quello di un qualsiasi impiegato.

SELECT cognome, nome, funzioneFROM PersonaleWHERE funzione <>’impiegato’ AND stipBase > ANY ( SELECT stipBase

FROM Personale WHERE funzione=‘impiegato’

)

Page 25: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

25

Query nidificate: ALL

ALL: la condizione è vera se il confronto è vero per ciascuno dei valori restituiti dalla seconda query.

Query – Dipendenti che non sono impiegati e che hanno lo stipendio superiore a quello di tutti gli impiegati.

SELECT cognome, nome, funzioneFROM PersonaleWHERE funzione <>’impiegato’ AND stipBase > ALL ( SELECT stipBase

FROM Personale WHERE funzione=‘impiegato’

)

Page 26: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

26

Query nidificate: IN

(NOT) IN: la condizione è vera se il valore è compreso tra i valori restituiti dalla seconda query

Query – Cognome e nome dei dipendenti che lavorano in filiali con più di 10 dipendenti.

SELECT cognome, nomeFROM PersonaleWHERE filiale IN ( SELECT filiale

FROM Personale GROUP BY Filiale

HAVING count(*)>10 )

Page 27: 1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.

27

Query nidificate: EXIST

(NOT) EXIST: la condizione è vera se la seconda query restituisce almeno un risultato

Query – Elenco dei dipendenti solo se non esistono dipendenti di sesto livello.

SELECT cognome, nomeFROM PersonaleWHERE NOT EXIST ( SELECT *

FROM Personale WHERE livello=6

)