Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
S Q L
Structured Query Language
Prof. Rocco Ciurleo
Istituto Tecnico Industriale Statale“Conte Michele Maria Milano” Polistena
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 2
IntroduzioneLa 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 manipolaregrandi quantità di dati.
Subito, in seguito all'affermarsi di una teoria con basi formali(algebra relazionale) nascono i database relazionali chiamatiRDBMS (Relational Data Base Management Systems = Sistemidi Gestione delle Basi di Dati Relazionali) e di conseguenza illinguaggio SQL (Structured Query Language = Linguaggio diInterrogazione Strutturato - alcuni traducono "linguaggio perinterrogazioni strutturate", ma la versione più corretta sembraessere la prima) nasce e si sviluppa con loro.
Ormai il linguaggio SQL è definito da norme ANSI(American Standard Code for Information Interchange -ovvero CodiceStandard Americano per lo Scambio di Informazioni) che lo rendonouno standard internazionale, anche se le varie implementazionidifferiscono leggermente fra loro.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 3
Breve storia di SQL 1/3
La storia di SQL inizia nel 1974 con la definizione da parte di DonaldChamberlin e di altre persone che lavoravano presso i laboratori diricerca dell'IBM di un linguaggio per la specificazione dellecaratteristiche dei database che adottavano il modello relazionale.Questo linguaggio si chiamava SEQUEL (Structured English QueryLanguage). Le sperimentazioni con tale prototipo portarono fra il1976 ed il 1977 ad una revisione del linguaggio (SEQUEL/2), che inseguito cambiò nome per motivi legali, diventando SQL. Il prototipo(System R) basato su questo linguaggio venne adottato ed utilizzatointernamente da IBM e da alcuni sui clienti scelti. Grazie al successodi questo sistema, che non era ancora commercializzato, anche altrecompagnie iniziarono a sviluppare i loro prodotti relazionali basati suSQL. Nel corso degli anni ottanta numerose compagnie (ad esempioOracle e Sybase, solo per citarne alcune) commercializzaronoprodotti basati su SQL, che divenne lo standard industriale di fattoper quanto riguarda i database relazionali.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 4
Breve storia di SQL 2/3
Nel 1986 l'ANSI adottò SQL (sostanzialmente adottò il dialetto SQL diIBM) come standard per i linguaggi relazionali e nel 1987 essodiventò anche standard ISO. Questa versione dello standard va sottoil nome di SQL/86. Negli anni successivi esso ha subito varierevisioni: SQL/89, SQL/92 SQL/99 e SQL/2003 . La versione SQL/92diventò uno standard fatto proprio anche dall’International StandardOrganization (ISO).
Il fatto di avere uno standard definito per un linguaggio per databaserelazionali, apre potenzialmente la strada alla intercomunicabilità fratutti i prodotti che si basano su di esso, ma in generale ogniproduttore adotta ed implementa nel proprio database solo il cuoredel linguaggio SQL (il cosiddetto Entry level), mettendo sul mercatoversioni personalizzate, chiamate convenzionalmente dialetti, nellequali ai comandi essenziali di SQL se ne aggiungono altri, che inalcuni casi svolgono funzioni sostanzialmente estranee alla naturapropria di SQL.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 5
Breve storia di SQL 3/3
Attualmente e’ in corso un processo di revisionedel linguaggio da parte dei comitati ANSI e ISO,che dovrebbe portare alla definizione di cio’ cheal momento e’ noto come SQL3.
Le caratteristiche principali di questa nuovaincarnazione di SQL dovrebbero essere la suatrasformazione in un linguaggio stand-alone(mentre ora viene usato come linguaggio ospitatoin altri linguaggi) e l’introduzione di nuovi tipi didato piu’ complessi per permettere, ad esempio,il trattamento di dati multimediali.
I linguaggi “dentro” SQLDDL (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.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 7
SQL: Linguaggio dichiarativo
Forse il problema più grosso che un esperto programmatoreincontra nell’imparare a programmare in SQL è che devedimenticare gli altri linguaggi di programmazione, SQL infattichiede a chi lo studia di cambiare il modo di pensare circa laprogrammazione.
Molti programmatori usano linguaggi procedurali come C++,FORTRAN, PASCAL, COBOL e altri, detti linguaggi di terzagenerazione; si tratta di linguaggi che fanno da ponte tral’assembler e la lingua naturale, con i quali si scrivonoprogrammi i cui statement descrivono passo passo, in modopreciso 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 didecidere come ottenerlo.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 8
Linguaggio dichiarativo: esempio
Per fare un’analogia, si immagini di andare in un supermercatocon la lista della spesa e con una dettagliata descrizione deglispostamenti da fare per raggiungere i corridoi e gli scaffali checontengono le varie merci. Si esegue la procedura – seguendole indicazioni – e si fanno gli acquisti: questo è un approccioprocedurale. In termini di programma, i file di dati sono gliscaffali, i dati sono le merci e il programma è costituito dalleindicazioni degli spostamenti.
Ora si immagini di andare in un negozio e consegnare alcommesso che si trova al banco la lista della spesa, in modoche egli procuri il materiale mentre si aspetta. La lista dellaspesa è dichiarativa – “questo è quello che voglio!” – e ilcommesso è il traduttore del linguaggio, che decide comeprocurare la merce in base alle conoscenze che ha sul negozio,come la pianta degli scaffali, la quantità disponibili dei variarticoli e tutto quello che gli serve per soddisfare il cliente.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 9
Identificatori
Il linguaggio SQL utilizza i caratteri alfabetici, le cifre decimali,gli operatori aritmetici e di confronto (+ - / * = < >) più altricaratteri che assumono particolari significati nella sintassi delleistruzioni e che verranno descritti in seguito.
Gli identificatori (nomi di tabelle e di attributi) sono costituiti dasequenze di caratteri con lunghezza massima di 18 caratteri:devono iniziare con una lettera e possono anche contenere ilcarattere _ .
Quando è necessario identificare il nome di un attributo dellatabella si deve usare la notazione
NomeTabella.NomeAttributo
(separati dal punto).
(dipende dal compilatore che si usa, basta anche solo il nomedel campo)
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 10
Tipi di DatiNella dichiarazione della struttura di una tabella occorre specificare il tipo dei dati scelto per gli attributi.
I tipi standard del linguaggio SQL sono:
Per i dati numerici la precisione p indica il numero massimo di cifre che il numero può contenere, esclusi ilsegno 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 precisioneriguarda solo le cifre della mantissa.
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
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 11
Come creare una tabella
Il database relazionale è composto da un insieme di "relazioni" dette anche tabelle, ad esempio:
Per ogni tabella è attribuito un nome che la identifica, poniamo di chiamare la precedente tabella "anagrafica" escopriamo 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 nomee negli attributi (numerica, alfanumerica ecc.).
Accanto alla definizione dell’attributo può essere specificata la clausola NOT NULL, per indicare che in tutte lerighe della tabella quella colonna deve essere inserito un valore pertinente il tipo specificato, nelle operazioni diinserimento e aggiornamento.
NOME CITTA’ ANNO NASCITA SESSO
Rocco Tritanti 1960 M
Paola Vicenza 1961 F
Michele Milano 1957 M
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 12
Come modificare una tabella
La struttura della tabella può essere successivamente modificata con ilcomando 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 lacolonna dovranno quindi essere specificati il nome della colonna, il suo tipo edeventualmente 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 lacolonna che si vuole eliminare.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 13
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 nuovatupla, elenco_campi è l'elenco dei nomi dei campi a cui deve essere assegnatoun valore, separati fra loro da una virgola. I campi non compresi nell'elencoassumeranno il loro valore di default o nessun valore (NULL).
Nel caso in cui l'elenco non venga specificato, dovranno essere specificati ivalori di tutti i campi della tabella; elenco_valori è l'elenco dei valori che verrannoassegnati ai campi della tabella nell'ordine e numero specificatidall'elenco_campi o in quello della definizione della tabella (se elenco_campi nonviene 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 14
Eliminazione di tuple
SQL consente di eliminare o modificare tuple di una tabella, ma non si devedimenticare che queste operazioni possono avere effetti a cascata su altretabelle grazie ai vincoli di integrità referenziale.
Per eliminare uno o più record da una tabella si può utilizzare il comandoDELETE, la cui struttura sintattica è:
DELETE FROM nome_tabella
[WHERE condizione]
Se non si utilizza la clausola WHERE, che è facoltativa, il comando cancella ilcontenuto di tutti i record, senza possibilità di recupero, lasciando soltanto lastruttura 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 15
Modificare datiLe 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 inuna 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 anchela 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 16
S E L E C TInterrogazione 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 17
S E L E C TNella forma più semplice il comando SELECT restituisce
semplicemente un’intera tabella, oppure colonne, oppure alcunerighe, e la sua forma di base è:
SELECT lista_elementi_selezione
FROM tabella
[ WHERE espressione_condizionale ]
Quindi, dopo aver digitato la parola SELECT si elencano gliattributi (le colonne) che si vogliono includere nella query (si usaun asterisco (*) per indicare tutti gli attributi della tabella); seguela parola FROM con il nome della tabella che contiene i dati chesi vuole interrogare. La clausola WHERE (facoltativa) permette diinserire eventuali condizioni (vincoli) che valgono per i dati dareperire
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 18
SELECTsintassi 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 ciaiuteremo con degli esempi, supponendo di utilizzare una tabella di nomeanagrafica con i seguenti attributi: cogn, nome, città, prov, indirizzo,data_nascita.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 19
Proiezione su una tabella
SELECT prov
FROM anagrafica;
Questo statement estrae dalla tabella anagrafica tutte le righedella colonna provincia.
SELECT DISTINCT prov
FROM anagrafica;
Se viene specificato il predicato DISTINCT le righe duplicatenella tabella risultante vengono ridotte a una.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 20
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 21
Intestazioni diverse alle colonne
selezionate
Normalmente la tabella che si ottiene da una query con SELECTpossiede un’intestazione della colonne che riporta i nomi degli attributi,se si vuole modificare l’intestazione, occorre dichiarare la stringa dellanuova 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 racchiuderetra apici: ‘DATA DI NASCITA’; in ACCESS si devono racchiudere traparentesi quadre [DATA DI NASCITA].
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 22
Ordinamento
Nel comando SELECT si può inserire la clausola ORDER BY per ottenere i risultati diun’interrogazione ordinati secondo i valori contenuti in una o più colonne tra quelleelencate accanto alla parola SELECT. L’ordinamento è crescente per default e vaspecificata 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 insenso crescente di nome, il secondo esempio produce l’elenco delle persone inordine decrescente rispetto al cognome e, a cognome uguale, in ordine crescente diclasse.
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 23
Funzione COUNT
La funzione COUNT conta il numero di righe presenti in una tabella. Lafunzione conta il numero delle righe indipendentemente dei valori in essememorizzati.
SELECT COUNT (*)
FROM anagrafica
Lo statement restituisce il numero di tutte le righe presenti nella tabellaanagrafica.
Se un comando Select contiene una condizione (Where), la funzioneCOUNT 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 24
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 25
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 26
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 27
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.
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
Indica un controllo su un’espressione tra i
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
Il database propaga a cascata le modifiche
21/04/2016 ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo 32
S Q L
Fine