Istituto Tecnico Industriale Statale “Conte Michele Maria Milano” Polistena SQL Structured Query Language Prof. Rocco Ciurleo Introduzione La storia dei DBMS (Data Base Management Systems = Sistemi di Gestione delle Basi di Dati) si sviluppa negli anni '60 e '70, in seguito al crescente fabbisogno di gestire e manipolare grandi quantità di dati. Subito, in seguito all'affermarsi di una teoria con basi formali (algebra relazionale) nascono i database relazionali chiamati RDBMS (Relational Data Base Management Systems = Sistemi di Gestione delle Basi di Dati Relazionali) e di conseguenza il linguaggio SQL (Structured Query Language = Linguaggio di Interrogazione Strutturato - alcuni traducono "linguaggio per interrogazioni strutturate", ma la versione più corretta sembra essere la prima) nasce e si sviluppa con loro. Ormai il linguaggio SQL è definito da norme ANSI (American Standard Code for Information Interchange -ovvero Codice Standard Americano per lo Scambio di Informazioni) che lo rendono uno standard internazionale, anche se le varie implementazioni differiscono leggermente fra loro. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 2 Breve storia di SQL 1/3 La storia di SQL inizia nel 1974 con la definizione da parte di Donald Chamberlin e di altre persone che lavoravano presso i laboratori di ricerca dell'IBM di un linguaggio per la specificazione delle caratteristiche dei database che adottavano il modello relazionale. Questo linguaggio si chiamava SEQUEL (Structured English Query Language). Le sperimentazioni con tale prototipo portarono fra il 1976 ed il 1977 ad una revisione del linguaggio (SEQUEL/2), che in seguito cambiò nome per motivi legali, diventando SQL. Il prototipo (System R) basato su questo linguaggio venne adottato ed utilizzato internamente da IBM e da alcuni sui clienti scelti. Grazie al successo di questo sistema, che non era ancora commercializzato, anche altre compagnie iniziarono a sviluppare i loro prodotti relazionali basati su SQL. Nel corso degli anni ottanta numerose compagnie (ad esempio Oracle e Sybase, solo per citarne alcune) commercializzarono prodotti basati su SQL, che divenne lo standard industriale di fatto per quanto riguarda i database relazionali. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 3 Breve storia di SQL 2/3 Nel 1986 l'ANSI adottò SQL (sostanzialmente adottò il dialetto SQL di IBM) come standard per i linguaggi relazionali e nel 1987 esso diventò anche standard ISO. Questa versione dello standard va sotto il nome di SQL/86. Negli anni successivi esso ha subito varie revisioni: SQL/89, SQL/92 SQL/99 e SQL/2003 . La versione SQL/92 diventò uno standard fatto proprio anche dall’International Standard Organization (ISO). Il fatto di avere uno standard definito per un linguaggio per database relazionali, apre potenzialmente la strada alla intercomunicabilità fra tutti i prodotti che si basano su di esso, ma in generale ogni produttore adotta ed implementa nel proprio database solo il cuore del linguaggio SQL (il cosiddetto Entry level), mettendo sul mercato versioni personalizzate, chiamate convenzionalmente dialetti, nelle quali ai comandi essenziali di SQL se ne aggiungono altri, che in alcuni casi svolgono funzioni sostanzialmente estranee alla natura propria di SQL. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 4 Breve storia di SQL 3/3 Attualmente e’ in corso un processo di revisione del linguaggio da parte dei comitati ANSI e ISO, che dovrebbe portare alla definizione di cio’ che al momento e’ noto come SQL3. Le caratteristiche principali di questa nuova incarnazione di SQL dovrebbero essere la sua trasformazione in un linguaggio stand-alone (mentre ora viene usato come linguaggio ospitato in altri linguaggi) e l’introduzione di nuovi tipi di dato piu’ complessi per permettere, ad esempio, il trattamento di dati multimediali. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 5 I linguaggi “dentro” SQL DDL (Data Definition Language, linguaggio di definizione dei dati). Consente di descrivere la struttura delle tabelle e di tutti gli elementi di supporto (come indici, vincoli, trigger, viste ecc.). Viene utilizzato per realizzare lo schema logico e lo schema fisico del database. DML (Data Manipulation Language, linguaggio per la manipolazione dei dati). Operazioni di inserimento, modifica e cancellazione dei dati. DCL (Data Control Language, linguaggio di controllo dei dati). Limiti sui dati (permessi di accesso, vincoli di integrità). QL (Query Language, linguaggio di interrogazione) Interrogare il database al fine di individuare i dati che corrispondono ai parametri di ricerca dell’utente. SQL: Linguaggio dichiarativo Forse il problema più grosso che un esperto programmatore incontra nell’imparare a programmare in SQL è che deve dimenticare gli altri linguaggi di programmazione, SQL infatti chiede a chi lo studia di cambiare il modo di pensare circa la programmazione. Molti programmatori usano linguaggi procedurali come C++, FORTRAN, PASCAL, COBOL e altri, detti linguaggi di terza generazione; si tratta di linguaggi che fanno da ponte tra l’assembler e la lingua naturale, con i quali si scrivono programmi i cui statement descrivono passo passo, in modo preciso e rigoroso, che cosa il computer deve fare. SQL invece è un linguaggio dichiarativo, che cioè dichiara, o descrive, ciò che si vuole ottenere, e lascia al computer di decidere come ottenerlo. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 7 Linguaggio dichiarativo: esempio Per fare un’analogia, si immagini di andare in un supermercato con la lista della spesa e con una dettagliata descrizione degli spostamenti da fare per raggiungere i corridoi e gli scaffali che contengono le varie merci. Si esegue la procedura – seguendo le indicazioni – e si fanno gli acquisti: questo è un approccio procedurale. In termini di programma, i file di dati sono gli scaffali, i dati sono le merci e il programma è costituito dalle indicazioni degli spostamenti. Ora si immagini di andare in un negozio e consegnare al commesso che si trova al banco la lista della spesa, in modo che egli procuri il materiale mentre si aspetta. La lista della spesa è dichiarativa – “questo è quello che voglio!” – e il commesso è il traduttore del linguaggio, che decide come procurare la merce in base alle conoscenze che ha sul negozio, come la pianta degli scaffali, la quantità disponibili dei vari articoli e tutto quello che gli serve per soddisfare il cliente. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 8 Identificatori Il linguaggio SQL utilizza i caratteri alfabetici, le cifre decimali, gli operatori aritmetici e di confronto (+ - / * = < >) più altri caratteri che assumono particolari significati nella sintassi delle istruzioni e che verranno descritti in seguito. Gli identificatori (nomi di tabelle e di attributi) sono costituiti da sequenze di caratteri con lunghezza massima di 18 caratteri: devono iniziare con una lettera e possono anche contenere il carattere _ . Quando è necessario identificare il nome di un attributo della tabella si deve usare la notazione NomeTabella.NomeAttributo (separati dal punto). (dipende dal compilatore che si usa, basta anche solo il nome del campo) 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 9 Tipi di Dati Nella dichiarazione della struttura di una tabella occorre specificare il tipo dei dati scelto per gli attributi. I tipi standard del linguaggio SQL sono: CHARACTER(n) o CHAR(n) Stinga di lunghezza n N da 1 a 15000 DATE Data nella forma GG/MM/AA TIME Ora nella forma HH:MM INTEGER(p) o INT(p) Numero intero con precisione p P da 1 a 45 SMALLINT Numero intero con precisione 5 Da –32768 a 32767 INTEGER Numero intero con precisione 10 Da –2.147.483.648 a 2.147.483.647 DECIMAL(p,s) o DEC(p,s) Numero decimale con presicione p e s cifre decimali P da 1 a 45 ed s da 0 a p REAL Numero reale con mantissa di precisione 7 Valore 0 oppure valore assoluto da 1E-38 a 1E+38 FLOAT (o DOUBLE PRECISIN) Numero reale con mantissa di precisione 15 Valore 0 oppure valore assoluto da 1E-38 a 1E+38 FLOAT(p) Numero reale con mantissa di precisione p P da 1 a 45 Per i dati numerici la precisione p indica il numero massimo di cifre che il numero può contenere, esclusi il segno e il punto decimale. Per i numeri reali il valore s indica il numero di cifre che seguono il punto decimale. I dati numerici floating point (numeri approssimati) sono memorizzati in forma esponenziale; la precisione riguarda solo le cifre della mantissa. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 10 Come creare una tabella Il database relazionale è composto da un insieme di "relazioni" dette anche tabelle, ad esempio: NOME CITTA’ ANNO NASCITA Rocco Tritanti 1960 M Paola Vicenza 1961 F Michele Milano 1957 M SESSO Per ogni tabella è attribuito un nome che la identifica, poniamo di chiamare la precedente tabella "anagrafica" e scopriamo come costruirla in SQL. La sintassi per creare la tabella "anagrafica" è la seguente: CREATE TABLE anagrafica (nome CHAR(25), città CHAR(20), anno_di_nascita INTEGER NOT NULL, sesso CHAR(1)); Come si può capire il comando CREATE TABLE crea la tabella "anagrafica" e definisce le 4 colonne nel nome e negli attributi (numerica, alfanumerica ecc.). Accanto alla definizione dell’attributo può essere specificata la clausola NOT NULL, per indicare che in tutte le righe della tabella quella colonna deve essere inserito un valore pertinente il tipo specificato, nelle operazioni di inserimento e aggiornamento. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 11 Come modificare una tabella La struttura della tabella può essere successivamente modificata con il comando ALTER Aggiunta di una nuova colonna nella tabella ALTER TABLE nome_tabella ADD definizione_colonna nome_tabella è il nome della tabella che si vuole modificare. Nel definire la colonna dovranno quindi essere specificati il nome della colonna, il suo tipo ed eventualmente il suo valore di default e i vincoli imposti sulla colonna. Eliminazione di una colonna dalla tabella ALTER TABLE nome_tabella DROP nome_colonna nome_tabella è il nome della tabella che si vuole modificare, nome_colonna la colonna che si vuole eliminare. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 12 Inserimento dei dati L’istruzione SQL che effettua l'inserimento di una nuova tupla in una tabella è INSERT. La sintassi con cui essa viene più usata è: INSERT INTO nome_tabella [ ( elenco_campi ) ] VALUES ( elenco_valori ) dove nome_tabella è il nome della tabella in cui deve essere inserita la nuova tupla, elenco_campi è l'elenco dei nomi dei campi a cui deve essere assegnato un valore, separati fra loro da una virgola. I campi non compresi nell'elenco assumeranno il loro valore di default o nessun valore (NULL). Nel caso in cui l'elenco non venga specificato, dovranno essere specificati i valori di tutti i campi della tabella; elenco_valori è l'elenco dei valori che verranno assegnati ai campi della tabella nell'ordine e numero specificati dall'elenco_campi o in quello della definizione della tabella (se elenco_campi non viene specificato). L’esempio mostra come inserire la prima tupla nella tabella anagrafica. INSERT INTO anagrafica (nome, città, anno_di_nascita, sesso) VALUES (‘Rocco', ‘Tritanti', '1960', 'M') 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 13 Eliminazione di tuple SQL consente di eliminare o modificare tuple di una tabella, ma non si deve dimenticare che queste operazioni possono avere effetti a cascata su altre tabelle grazie ai vincoli di integrità referenziale. Per eliminare uno o più record da una tabella si può utilizzare il comando DELETE, la cui struttura sintattica è: DELETE FROM nome_tabella [WHERE condizione] Se non si utilizza la clausola WHERE, che è facoltativa, il comando cancella il contenuto di tutti i record, senza possibilità di recupero, lasciando soltanto la struttura della tabella. Esempio1: DELETE From anagrafica Where nome=“Rocco” Esempio2: DELETE From anagrafica Where nome=“Rocco” AND città=“Tritanti” 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 14 Modificare dati Le informazioni presenti in un database non sono statiche, ma evolvono nel tempo. C‘è quindi la necessità non solo di aggiungere nuovi dati, ma di modificare quelli che sono già inseriti nelle tabelle del database. L’istruzioni SQL utilizzata a questo scopo è UPDATE. La quale permette di modificare i valori presenti in una o più colonne di una o più righe di una tabella. La sintassi di UPDATE è la seguente: UPDATE nome_tabella SET elenco_assegnamenti [ WHERE espressione_condizionale ]; Gli assegnamenti vengono specificati nella forma: nome_colonna = espressione_scalare L'istruzione UPDATE aggiorna le colonne della tabella che sono state specificate nella clausola SET, utilizzando i valori che vengono calcolati dalle corrispondenti espressioni scalari. Se viene espressa anche la clausola WHERE, vengono aggiornale solo le righe che soddisfano l'espressione condizionale. Vediamo un esempio: UPDATE anagrafica SET nome = ‘Giorgio‘ WHERE città = ‘Milano‘ ; L’ istruzione cambia il valore della colonna nome della tabella anagrafica nelle righe in cui l’attributo città ha valore ‘Milano'. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 15 SELECT Interrogazione del database L’aspetto più importante del linguaggio SQL è costituito dalla possibilità di porre interrogazioni (query) in modo molto semplice alla base di dati per ritrovare le informazioni che interessano. Queste prestazioni sono fornite dal comando SELECT, che è nello stesso tempo molto potente e molto semplice da usare. Il comando SELECT è quello che viene più utilizzato nella programmazione SQL, si può considerare che l’80% o il 90% di SQL sia tutto in questo comando. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 16 SELECT Nella forma più semplice il comando SELECT restituisce semplicemente un’intera tabella, oppure colonne, oppure alcune righe, e la sua forma di base è: SELECT lista_elementi_selezione FROM tabella [ WHERE espressione_condizionale ] Quindi, dopo aver digitato la parola SELECT si elencano gli attributi (le colonne) che si vogliono includere nella query (si usa un asterisco (*) per indicare tutti gli attributi della tabella); segue la parola FROM con il nome della tabella che contiene i dati che si vuole interrogare. La clausola WHERE (facoltativa) permette di inserire eventuali condizioni (vincoli) che valgono per i dati da reperire 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 17 SELECT sintassi completa La sintassi completa dell'istruzione SELECT è la seguente: SELECT [ ALL | DISTINCT ] lista_elementi_selezione FROM lista_riferimenti_tabella [ WHERE espressione_condizionale ] [ GROUP BY lista_colonne ] [ HAVING espressione_condizionale ] [ ORDER BY lista_colonne ] Per comprendere meglio il funzionamento del comando SELECT ci aiuteremo con degli esempi, supponendo di utilizzare una tabella di nome anagrafica con i seguenti attributi: cogn, nome, città, prov, indirizzo, data_nascita. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 18 Proiezione su una tabella SELECT prov FROM anagrafica; Questo statement estrae dalla tabella anagrafica tutte le righe della colonna provincia. SELECT DISTINCT prov FROM anagrafica; Se viene specificato il predicato DISTINCT le righe duplicate nella tabella risultante vengono ridotte a una. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 19 Elencare l’intera tabella SELECT * FROM anagrafica; Il risultato produrrà una tabella con tutte le colonne nell’ordine in cui sono state descritte al momento della creazione della tabella. Se si vogliono le colonne disposte in un ordine diverso, bisogna digitare i nomi degli attributi nell’ordine desiderato separando i nomi con una virgola. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 20 Intestazioni diverse alle colonne selezionate Normalmente la tabella che si ottiene da una query con SELECT possiede un’intestazione della colonne che riporta i nomi degli attributi, se si vuole modificare l’intestazione, occorre dichiarare la stringa della nuova intestazione insieme alla clausola AS SELECT prov AS PROVINCIA FROM anagrafica; SELECT cogn AS COGNOME, prov AS PROVINCIA, FROM anagrafica; Per inserire l’intestazione formata da due parole, si devono racchiudere tra apici: ‘DATA DI NASCITA’; in ACCESS si devono racchiudere tra parentesi quadre [DATA DI NASCITA]. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 21 Ordinamento Nel comando SELECT si 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. L’ordinamento è crescente per default e va specificata la parola DESC solo se si desidera l’ordinamento decrescente. (Comunque può essere usata la parola chiave ASC per l’ordinamento crescente) SELECT cognome, nome, città FROM anagrafica ORDER BY cognome, nome; SELECT cognome, nome, classe FROM anagrafica ORDER BY cognome DESC, classe; Il primo esempio ordina in senso crescente di cognome e a parità di cognome in senso crescente di nome, il secondo esempio produce l’elenco delle persone in ordine decrescente rispetto al cognome e, a cognome uguale, in ordine crescente di classe. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 22 Funzione COUNT La funzione COUNT conta il numero di righe presenti in una tabella. La funzione conta il numero delle righe indipendentemente dei valori in esse memorizzati. SELECT COUNT (*) FROM anagrafica Lo statement restituisce il numero di tutte le righe presenti nella tabella anagrafica. Se un comando Select contiene una condizione (Where), la funzione COUNT restituisce il numero delle righe che soddisfano la condizione: SELECT COUNT (*) FROM anagrafica Where prov =“RC” 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 23 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 numerico. SELECT SUM (stipendio) FROM personale WHERE livello = 5 ; L’argomento della funzione SUM può anche essere un’espressione numerica contenente i nomi di attributi di tipo numerico SELECT SUM (prezzo_unitario * quantità ) AS totale FROM fattura ; 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 24 Funzioni MIN e MAX Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e il valore massimo tra i valori della colonna specificata come argomento della funzione SELECT MIN (stipendio), Max(stipendio) FROM personale ; Le funzioni MIN e Max consentono di determinare i valori minimi e massimi anche per campi di tipo carattere SELECT MIN (cognome), Max(cognome) FROM anagrafica ; Lo statement restituisce il primo e l’ultimo cognome in ordine alfabetico 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 25 Raggruppamento: clausola GROUP BY La clausola GROUP BY raggruppa un insieme di righe aventi lo stesso valore nelle colonne indicate: questa opzione produce una riga di risultati per ogni raggruppamento. Supponiamo di avere una tabella (ordini) con i seguenti campi: numero_ordine, cod_articolo, quantità, prezzo, la query: SELECT numero_ordine, SUM(quantità*prezzo) FROM ordini GROUP BY numero_ordine ; produce una riga per ogni tipo ordine calcolando i totali dei singoli ordini. Se nella query non mettiamo la clausola GROUP BY come risultato si otterrebbe una sola riga con il totale generale. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 26 Clausola HAVING La struttura del comando SELECT con raggruppamento 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. Consideriamo la query nella diapositiva precedente ed aggiungiamo una clausola Having: SELECT numero_ordine, SUM(quantità*prezzo) FROM ordini GROUP BY numero_ordine ; HAVING SUM(quantità*prezzo) > 200; Come risultato otteniamo solo le righe che soddisfano la condizione espressa con HAVING. 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 27 I vincoli I vincoli consentono di specificare controlli sui dati, al fine di assicurare la correttezza e consistenza dell’informazione. I vincoli possono essere: interni (o intrarelazionali) specificano controlli sulla singola tabella intesa come entità a se stante di integrità referenziale riguardano i rapporti tra una tabella e l’altra. Vincoli interni NOT NULL Impedisce di inserire un dato nullo nel campo in cui viene specificato. <NomeCampo> <Tipo> NOT NULL; PRIMARY KEY Imposta un campo (o più campi) come chiave primaria della tabella. PRIMARY KEY (<NomeCampo>); CHECK Vincoli di integrità referenziale FOREIGN KEY Imposta una chiave esterna in una tabella, con campi che fanno riferimento ad un’altra tabella del DataBase. FOREIGN KEY (<ElencoCampi>) REFERENCES <NomeTabella> (<ElencoCampiTabella>); <ElencoCampi> Elenco dei campi della tabella corrente. Integrità referenziale L’integrità referenziale viene controllata anche dalle parole chiave RESTRICT, CASCADE e SET NULL, che consentono di controllare la risposta del database a un vincolo. RESTRICT Il database rifiuta le modifiche violano un vincolo CASCADE SQL Fine 21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 32