SQL [1] Concetti essenziali di SQL 2 Il linguaggio SQL Uno dei principali motivi del successo delle basi di dati: è diventato uno standard Fornisce un interfaccia dichiarativa di alto livello, permettendo di specificare solo quel deve essere il risultato (e lasciando al DBMS l ottimizzazione e le decisioni effettive su come eseguire l interrogazione) http://en.wikipedia.org/wiki/sql
3 SQL structured query language SQL / linguaggio strutturato di interrogazione In origine era SEQUEL / structured english query language Grande sforzo di ANSI e ISO per standardizzare SQL comprende: Istruzioni per la definizione, l interrogazione e l aggiornamento dei dati (DDL e DML) Funzionalità per definire viste, specificare sicurezza e autorizzazioni di accesso, definire vincoli di integrità e specificare controlli sulle transazioni 4 I termini giusti Relazione! TABELLA Tupla! RIGA Attributo! COLONNA Ogni operazione termina con ; (punto e virgola)
5 Concetti essenziali 1. Tipi di dati e definizione dei dati in SQL 2. Specificazione dei vincoli di base in SQL 3. Interrogazioni fondamentali in SQL 4. Comandi INSERT, UPDATE, DELETE in SQL 6 1. Tipi di dati e definizione dei dati in SQL Schema: raggruppa le tabelle e altri costrutti che appartengono alla stessa applicazione di basi di dati Uno schema: È identificato da un nome di schema Contiene un identificatore di autorizzazione per indicare l utente proprietario Contiene descrittori per ciascun elemento dello schema (tabelle, vincoli, viste, domini e altri costrutti) CREATE SCHEMA AZIENDA AUTHORIZATION JSmith ; Catalogo: raccoglie più schemi Un catalogo contiene sempre uno schema speciale INFORMATION_SCHEMA che fornisce informazioni su tutti gli schemi nel catalogo Ambiente: rappresenta l installazione di un RDBMS
7 CREATE TABLE È usato per specificare una nuova relazione assegnandole un nome e specificandone attributi e vincoli Nome tabella Attributi: nome, tipo di dati, eventuali vincoli (NULL?) Chiavi e vincoli di integrità dell entità Vincoli di integrità referenziale Le tabelle create con CREATE sono dette tabelle di base e sono effettivamente memorizzate su file nel DBMS Le tabelle create con CREATE VIEWS sono tabelle virtuali 8
9 10 Domini e tipi di dati Principali tipi di dati disponibili: Numerici Stringhe di caratteri Stringhe di bit Booleani Date
11 Domini e tipi di dati: numerici Numeri interi di diverse dimensioni INTEGER INT SMALLINT Numeri reali a virgola mobile FLOAT REAL DOUBLE PRECISION Formattazioni particolari, ad esempio DECIMAL(i, j) 12 Domini e tipi di dati: stringhe di caratteri Hanno lunghezza fissa (n numero di caratteri): CHAR(n) Hanno lunghezza variabile (n numero massimo di caratteri): VARCHAR(n) n = 1 è il valore predefinito Il valore deve essere indicato tra apici con distinzione tra maiuscole e minuscole Vige la relazione di ordine lessicografico Esistono tipi di dati per documenti di grandi dimensioni (CLOB)
13 Domini e tipi di dati: stringhe di bit Hanno lunghezza fissa (n numero di bit): BIT(n) Hanno lunghezza variabile (n numero massimo di bit): BIT VARYING(n) n = 1 è il valore predefinito I valori sono posti tra apici Esistono tipi di dati per documenti di grandi dimensioni (BLOB) 14 Domini e tipi di dati: booleani Possono assumere i valori TRUE e FALSE In realtà (vista la presenza di NULL) esiste anche UNKNOWN
15 Domini e tipi di dati: date DATE: ha 10 posizioni, componenti YYYY-MM-DD TIME: ha almeno 8 posizioni, componenti HH:MM:SS TIMESTAMP comprende entrambi INTERVAL specifica un intervallo, cioè un valore relativo che può essere usato per aumentare o diminuire il valore id una data 16
17 2. Specificazione dei vincoli di base in SQL Vincoli e valori predefiniti per gli attributi (1) Per ogni attributo si può specificare se non è accettato il valore NULL utilizzando NOT NULL Per gli attributi che fanno parte della chiave primaria il vincolo NOT NULL è implicito 18 2. Specificazione dei vincoli di base in SQL Vincoli e valori predefiniti per gli attributi (2) Si può specificare un valore di default per un attributo usando DEFAULT<valore> Dove non è specificato il valore di default è NULL
19 2. Specificazione dei vincoli di base in SQL Vincoli e valori predefiniti per gli attributi (3) Si possono limitare i valori per ogni attributo usando la clausola CHECK dopo la definizione dell attributo Esempio: NUMERO_D INT NOT NULL CHECK (NUMERO_D > 0 AND NUMERO_D < 21); Il numero di dipartimento è un intero compreso tra 0 e 21 (esclusi) e non può essere nullo. 20
21 2. Specificazione dei vincoli di base in SQL Vincoli di chiave (e di integrità referenziale) La clausola PRIMARY KEY specifica uno o più attributi che costituiscono la chiave primaria di una relazione La clausola UNIQUE specifica chiavi secondarie 22 2. Specificazione dei vincoli di base in SQL Vincoli (di chiave e) di integrità referenziale L integrità referenziale è specificata tramite la clausola FOREIGN KEY In caso di violazione il DBMS di default rifiuta l operazione E possibile impostare un operazione alternativa da effettuare in caso di violazione del vincolo: SET NULL CASCADE SET DEFAULT qualificata con ON DELETE oppure ON UPDATE
23 24 3. Interrogazioni fondamentali in SQL SELECT è l istruzione fondamentale per recuperare le informazioni di una base di dati. ATTENZIONE SQL consente a una tabella di avere due o più tuple identiche in tutti i valori dei loro attributi Una tabella SQL non è un insieme di tuple piuttosto è un multinsieme (o bag di tuple)
25 3. Interrogazioni fondamentali in SQL Le interrogazioni SQL possono essere molto complesse La forma fondamentale dell istruzione SELECT è formata da tre clausole: SELECT <elenco attributi> FROM <elenco tabelle> WHERE <condizione> <elenco attributi> è un elenco dei nomi degli attributi i cui valori devono essere reperiti dall interrogazione <elenco tabelle> è un elenco dei nomi delle relazioni necessarie per eseguire l interrogazione <condizione> è un espressione condizionale (booleana) che identifica le tuple che devono essere reperite dall interrogazione 26 Esempi di interrogazioni
27 Esempi di interrogazioni 28 Esempi di interrogazioni
29 Interrogazione 0 Si trovino la data di nascita e l indirizzo del dipendente (o dei dipendenti) il cui nome è John B. Smith. SELECT FROM WHERE DATA_N, INDIRIZZO (attributi di proiezione) IMPIEGATO NOME_BATT = John AND (condizioni di sel.) INIZ_INT = B AND COGNOME = Smith ; 30 Interrogazione 0 - risultati
31 Interrogazione 1 Si trovino il nome e l indirizzo di tutti i dipendenti che lavorano per il dipartimento Ricerca. SELECT NOME_BATT, COGNOME, INDIRIZZO FROM IMPIEGATO, DIPARTIMENTO WHERE NOME_D = Ricerca AND NUMERO_D = N_D; La seconda condizione è detta condizione di JOIN perché combina due tuple: una da DIPARTIMENTO e una da IMPIEGATO ogniqualvolta il valore di NUMERO_D in DIPARTIMENTO è uguale a N_D in IMPIEGATO. 32 Interrogazione 1 - risultati
33 Interrogazione 2 Per ogni progetto con sede a Stafford si elenchi il numero del progetto, il numero del dipartimento che lo controlla, nonché il cognome, l indirizzo e la data di nascita del direttore del dipartimento. SELECT NUMERO_P, NUM_D, COGNOME, INDIRIZZO, DATA_N FROM PROGETTO, DIPARTIMENTO, IMPIEGATO WHERE NUM_D = NUMERO_D AND SSN_DIR = SSN AND SEDE_P = Stafford ; Restituisce la combinazione di un progetto, un dipartimento e un impiegato che soddisfano le condizioni di join. 34 Interrogazione 2 - risultati
35 Interrogazione 3 Per ciascun dipendente si trovino il suo nome e cognome e il nome e il cognome del suo immediato supervisore. SELECT I.NOME_BATT, I.COGNOME, S.NOME_BATT, S.COGNOME FROM IMPIEGATO AS I, IMPIEGATO AS S WHERE I.SUPER_SSN = S.SSN; Se un interrogazione si riferisce a due o più attributi con il medesimo nome si deve qualificare il nome dell attributo con il nome della relazione per evitare ambiguità. Ciò viene fatto ponendo come prefisso al nome dell attributo, il nome della relazione. Si possono dichiarare nomi di relazione alternativi (I ed S) chiamati alias. È come se ci fossero due copie diverse della relazione IMPIEGATO. 36 Interrogazione 3 - risultati
37 Interrogazione 4 Si selezionino tutti gli impiegati nella base di dati. SELECT SSN FROM IMPIEGATO; L assenza della clausola WHERE indica che non viene usata alcuna condizione per la selezione delle tuple, quindi tutte le tuple della tabella (indicata in FROM) sono considerate valide. 38 Interrogazione 4 - risultati
39 Interrogazione 5 Si selezionino tutte le combinazioni di impiegato (SSN) e dipartimento (NOME_D) nella base di dati. SELECT SSN, NOME_D FROM IMPIEGATO, DIPARTIMENTO; Se nella clausola FROM è specificata più di una tabella (e non vi è clausola WHERE) viene eseguito il prodotto cartesiano ottenendo tutte le possibili combinazioni delle tuple delle tabelle. Nel nostro esempio: non importa che quell impiegato lavori o meno in quel dipartimento! 40 Interrogazione 5- risultati
41 Interrogazione 6 Trova tutti i valori degli attributi delle tuple di IMPIEGATO relative a dipendenti che lavorano nel DIPARTIMENTO numero 5. SELECT * FROM IMPIEGATO WHERE N_D = 5; 42 Interrogazione 6 - risultati
43 Interrogazione 6bis Cosa succede con questa? SELECT * FROM IMPIEGATO, DIPARTIMENTO WHERE NOME_D = Ricerca AND N_D = NUMERO_D; 44 Tabelle come insiemi In SQL le tabelle sono multinsiemi: tuple con identici valori degli attributi possono comparire più di una volta in una tabella e nel risultato di un interrogazione. Perché? Eliminare i duplicati è oneroso L utente può voler vedere le tuple duplicate nel risultato di un interrogazione Quando una funzione di aggregazione è applicata alle tuple, nella maggior parte dei casi non si vogliono eliminare duplicati ps: in generale non è richiesto che una tabella SQL abbia una chiave
45 Parola chiave DISTINCT Quando si desidera eliminare le tuple duplicate dal risultato di un interrogazione SQL si utilizza la parola chiave DISTINCT nella clausola SELECT SELECT DISTINCT elimina i duplicati SELECT ALL (che è il default) non elimina i duplicati 46 Interrogazione 7 Si trovi il valore di stipendio di ogni dipendente e poi tutti i valori distinti di stipendio. SELECT ALL STIPENDIO FROM IMPIEGATO; SELECT DISTINCT STIPENDIO FROM IMPIEGATO;
47 Interrogazione 7 - risultati 48 Operazioni su insiemi UNION EXCEPT INTERSECT Sono operazioni prese in prestito dalla teoria degli insiemi. Ma anche dai multinsiemi: UNION ALL EXCEPT ALL INTERSECT ALL
49 Interrogazione 8 Si crei un elenco di tutti i numeri di progetto dei progetti che coinvolgono un dipendente il cui cognome è Wong, come partecipante oppure come dirigente del dipartimento che controlla il progetto. (SELECT DISTINCT NUMERO_P FROM PROGETTO, DIPARTIMENTO, IMPIEGATO WHERE NUM_D=NUMERO_D AND SSN_DIR=SSN AND COGNOME= Wong') UNION (SELECT DISTINCT NUMERO_P FROM PROGETTO, LAVORA_SU, IMPIEGATO WHERE NUMERO_P=N_P AND SSN_I=SSN AND COGNOME= Wong') 50 Esempi con multinsieme I risultati delle operazioni multinsieme SQL. (a) Due tabelle, R(A) e S(A). (b) R(A) UNION ALL S(A). (c) R(A) EXCEPT ALL S(A). (d) R(A) INTERSECT ALL S(A).
51 Confronti di sottostringhe Si può fare il confronto solo su parti di una stringa di caratteri usando l operatore LIKE Può essere usato per il confronto di stringhe rispetto a un modello. Le stringhe parziali sono specificate usando due caratteri riservati: % e _ % sostituisce un numero arbitrario di zero o più caratteri _ sostituisce un singolo carattere 52 Interrogazione 9 Si trovino tutti i dipendenti il cui indirizzo è a Houston in Texas. SELECT NOME_BATT, COGNOME FROM IMPIEGATO WHERE INDIRIZZO LIKE %Houston, TX%
53 Interrogazione 10 Si trovino tutti i dipendenti che sono nati negli anni Cinquanta. SELECT NOME_BATT, COGNOME FROM IMPIEGATO WHERE DATA_N LIKE 5 _ 54 Operatori aritmetici Gli operatori aritmetici standard (+ - * / ) possono essere applicati ai valori numerici o agli attributi con domini numerici. Per le stringhe si può utilizzare l operatore di concatenazione Per gli intervalli si può usare BETWEEN
55 Interrogazione 11 Si mostrino gli stipendi risultanti, attribuendo a ogni dipendente che lavora sul progetto ProdottoX un aumento del 10%. SELECT I.NOME_BATT, I.COGNOME, 1.1*I.STIPENDIO AS S_AUMENT FROM IMPIEGATO AS I, LAVORA_SU AS L, PROGETTO AS P WHERE I.SSN = L.SSN_I AND L.N_P = P. NUMERO_P AND P.NOME_P = ProdottoX ; 56 Interrogazione 12 Si trovino tutti i dipendenti del dipartimento 5 il cui stipendio è compreso tra 30000 e 40000 dollari. SELECT * FROM IMPIEGATO WHERE (STIPENDIO BETWEEN 30000 AND 40000) AND N_D=5; Oppure ((STIPENDIO >= 30000) AND (STIPENDIO <= 40000)) AND N_D=5;
57 Ordinamento dei risultati SQL consente di ordinare le tuple del risultato di un interrogazione rispetto ai valori di uno o più attributi che compaiono nell interrogazione Clausola ORDER BY 58 Interrogazione 13 Si determini un elenco di dipendenti e i progetti su cui lavorano ordinati per dipartimento e all interno di ciascun dipartimento li si ordini alfabeticamente per cognome e nome. SELECT D.NOME_D, I.COGNOME, I.NOME_BATT, P.NOME_P FROM DIPARTIMENTO D, IMPIEGATO I, LAVORA_SU L, PROGETTO P WHERE D.NUMERO_D=I.N_D AND I.SSN=L.SSN_I AND L.N_P=P.NUMERO_P ORDER BY D.NOME_D, I.COGNOME, I.NOME_BATT Per specificare l ordine crescente ASC (ORDER BY D.NOME_D ASC) Per specificare l ordine decrescente DESC
59 Riepilogo dell interrogazione SELECT SELECT <elenco attributi> FROM <elenco tabelle> [ WHERE <condizione> ] [ ORDER BY <elenco attributi> ] 60 INSERT Per inserire righe in una tabella. INSERT INTO IMPIEGATO VALUES ( Richard, K, Marini, 653298653, 1962-12-30, 98 Oak Forest, Katy, TX, M, 37000, 987654321, 4); Si possono omettere i valori per gli attributi che: consentono NULL hanno un valore di DEFAULT INSERT INTO IMPIEGATO (NOME_BATT, COGNOME, N_D, SSN) VALUES ( Richard, Marini, 4, 653298653 );
61 DELETE Per eliminare righe da una tabella. DELETE FROM IMPIEGATO WHERE COGNOME = Brown ; La cancellazione può propagarsi ad altre righe di altre tabelle nel caso ci siano azioni specificate da vincoli di integrità referenziale. DELETE FROM IMPIEGATO; Svuota la tabella. 62 UPDATE Per modificate righe da una tabella. UPDATE PROGETTO SET SEDE_P = Bellaire, N_D = 5 WHERE NUMERO_P = 10; L aggiornamento del valore di una chiave primaria può propagarsi ad altre righe di altre tabelle nel caso ci siano stati azioni referenziali specificate da vincoli di integrità referenziale. UPDATE IMPIEGATO SET STIPENDIO = STIPENDIO * 1.1 WHERE N_D = 5; Si può utilizzare anche NULL o DEFAULT come valore.