Basi di Dati Matteo Longhi Structured Query Language 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 Appunti 1 2 DDL: Data Definition Language Tipi di dato Esempio: CREATE 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 ; 3 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 4 Modifica dei Dati Per inserire un nuovo record: INSERT INTO Personale (matricola,cognome,nome,,prov VALUES ( AB541, Rossi, Mario,, CO ; Per aggiornare record esistenti: UPDATE Personale SET livello = 6 WHERE livello=5; Per cancellare record esistenti: DELETE WHERE stipbase<750; 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 5 6 1
Simple Query Sintassi generale: SELECT [DISTINCT] { <campo-expr> [AS <Alias>] } { <tabella> [AS <Alias>] } [WHERE <Predicato>] Legenda: [ ] Opzionale { } Almeno uno, separati dalla virgola Simple Query: esempi Tabelle: 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:, codfiscale Query - cognome, nome e codice fiscale degli impiegati:, codfiscale 7 8 Simple Query: DISTINCT DISTINCT: elimina le righe duplicate nella tabella risultante. Simple Query: * e AS Il simbolo * sostituisce l elenco di tutti i campi. Query elenco delle professioni presenti in azienda: Query tutti i dati dei dipendenti che abitano in provincia di milano: SELECT DISTINCT funzione funzione Dirigente SELECT * WHERE prov= MI Senza l uso il distinct: funzione La clausola AS permette di modificare l intestazione di una colonna. Query l elenco delle province da cui provengono i dipendenti: SELECT funzione Dirigente SELECT DISTINCT prov AS Provincia 9 10 Query : congiunzione (JOIN Query cognome, nome e indirizzo della filiale in cui lavora ogni dipendente SELECT Personale.cognome, Personale.nome, Dipendenza.indirizzo Query : JOIN (2 Query cognome, nome e indirizzo della filiale in cui lavora ogni dipendente Personale, Dipendenza SELECT P.cognome, P.nome, D.indirizzo WHERE Personale.filiale=Dipendenza.codFiliale Personale AS P, Dipendenza AS D E necessario specificare la corrispondenza tra la chiave primaria di una tabella e la chiave esterna dell altra (condizione di join. WHERE P.filiale=D.codFiliale 11 12 2
Query : JOIN (3 Nel caso sia necessario effettuare la congiunzione di tre tabelle: SELECT * Tab1, Tab2, Tab3 WHERE Tab1.chiave=Tab2.chiaveExt AND Tab2.chiave=Tab3.chiaveExt 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! 13 14 Query : Funzioni di Aggregazione (2 Query Numero di impiegati SELECT COUNT(* Query Numero di province di provenienza degli impiegati SELECT COUNT( DISTINCT(prov Query : Funzioni di Aggregazione (3 Query La somma degli stipendi che appartengono al livello 3 SELECT SUM(StipBase WHERE livello=3 Query Lo stipendio medio degli impiegati SELECT AVG(StipBase Query Lo stipendio minimo e massimo SELECT MIN(StipBase, MAX(StipBase 15 16 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 WHERE dataass BETWEEN 01/01/2001 AND 31/12/2001 (NOT IN: controlla se un valore appartiene ad un insieme Query Cognome e nome dei dipendenti che risiedono nelle province di Milano, Como, Lecco e Bergamo. WHERE prov IN ( MI, CO, LC, BG Query : Condizioni di ricerca (2 (NOT LIKE: confronta un valore usando caratteri jolly Query I cognomi dei dipendenti che iniziano per Ros. SELECT Cognome WHERE Cognome LIKE Ros% IS (NOT NULL: controlla se un campo non è stato compilato Query Cognome e nome dei dipendenti di cui non si conosce la provincia di residenza. WHERE prov IS NULL 17 18 3
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 Cognome ORDER 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, stipbase ORDER BY stipbase DESC, Cognome 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 NumeroDipendenti GROUP BY filiale 19 20 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 StipendioMedio GROUP BY filiale HAVING COUNT(*>10 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 WHERE stipbase < ( SELECT AVG(stipBase NB: il confronto < è possibile perché la seconda query, grazie alla funzione di aggregazione, restituisce UN SOLO risultato. 21 22 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.indirizzo AS P, Dipendenza AS D WHERE P.filiale=D.codFiliale AND P.stipBase > ( SELECT AVG(stipBase 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., funzione WHERE funzione <> impiegato AND stipbase > ANY ( SELECT stipbase 23 24 4
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., funzione WHERE funzione <> impiegato AND stipbase > ALL ( SELECT stipbase 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. WHERE filiale IN ( SELECT filiale GROUP BY Filiale HAVING count(*>10 25 26 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. WHERE NOT EXIST ( SELECT * WHERE livello=6 27 5