Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Il linguaggio SQL: le basi, Appunti di Elementi di Informatica

Dopo una breve introduzione sulle caratteristiche principali dell'SQL, vengono illustrati i tipi di dati e gli identificatori, i comandi DDL e DML, le funzioni di aggregazione, gli ordinamenti, le query e i join.

Tipologia: Appunti

2019/2020

In vendita dal 07/11/2020

franco-napoleoni
franco-napoleoni 🇮🇹

20 documenti

1 / 12

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Linguaggio SQL
Definizione di database
Un Data Base non è altro che un insieme di archivi di dati, strettamente correlati
e ben strutturati, memorizzati su supporti di memoria di massa, che costituiscono
una base di lavoro per più programmi applicativi e utenti diversi.
Lo scopo di tale organizzazione dei dati è quello di garantire una maggiore
efficienza (e quindi un aumento della produttività aziendale) nel loro trattamento,
superando i limiti delle strutture "tradizionali" degli archivi; in particolare devono
essere garantite la "consistenza" dei dati (ossia i dati devono risultare
"significativi"), la loro sicurezza (in modo che non vengano danneggiati da
manipolazioni non autorizzate o accidentali) e la loro "integrità" (in modo da
evitare una perdita di consistenza dei dati stessi).
L'SQL
Uno dei requisiti fondamentali per poter utilizzare un Data Base Relazionale e'
avere un linguaggio che ci permetta di "interrogarlo" opportunamente; tale
linguaggio si chiama RDBMS (Relational Data Base Management System). Nel
1986 l'ANSI, l'istituto americano per gli standard nazionali, pubblicò l'ANSI-SQL
(Structured Query Language), il primo standard del linguaggio, ma da allora sono
nate diverse versioni, che hanno differenze sostanziali l'una con l'altra. I più
diffusi linguaggi SQL oggi sono:
· Oracle SQL;
·SQLServer;
·PostgreSQL;
·MySQL;
·SQLInformix;
· Access.
Nel presente trattato si farà riferimento all'ANSI-SQL.
Il linguaggio SQL
La sigla SQL è diventata sinonimo di linguaggio standard per la gestione dei
Data Base Relazionali e la sua nascita risale al 1981, quando venne presentato
dall'IBM come prodotto per la gestione di dati in ambiente DOS/VSE, con il nome
di SQL/DS. L'SQL è un linguaggio speciale: è una specie di strato virtuale tra
tutto ciò che utilizza i dati (utenti e programmi) e la struttura dei dati stessi (Data
Base). Segue, non sempre
fedelmente, il modello relazionale ed è, in un certo senso, un linguaggio chiuso,
pf3
pf4
pf5
pf8
pf9
pfa

Anteprima parziale del testo

Scarica Il linguaggio SQL: le basi e più Appunti in PDF di Elementi di Informatica solo su Docsity!

Linguaggio SQL

Definizione di database

Un Data Base non è altro che un insieme di archivi di dati, strettamente correlati e ben strutturati, memorizzati su supporti di memoria di massa, che costituiscono una base di lavoro per più programmi applicativi e utenti diversi. Lo scopo di tale organizzazione dei dati è quello di garantire una maggiore efficienza (e quindi un aumento della produttività aziendale) nel loro trattamento, superando i limiti delle strutture "tradizionali" degli archivi; in particolare devono essere garantite la "consistenza" dei dati (ossia i dati devono risultare "significativi"), la loro sicurezza (in modo che non vengano danneggiati da manipolazioni non autorizzate o accidentali) e la loro "integrità" (in modo da evitare una perdita di consistenza dei dati stessi).

L'SQL

Uno dei requisiti fondamentali per poter utilizzare un Data Base Relazionale e' avere un linguaggio che ci permetta di "interrogarlo" opportunamente; tale linguaggio si chiama RDBMS (Relational Data Base Management System). Nel 1986 l'ANSI, l'istituto americano per gli standard nazionali, pubblicò l'ANSI-SQL (Structured Query Language), il primo standard del linguaggio, ma da allora sono nate diverse versioni, che hanno differenze sostanziali l'una con l'altra. I più diffusi linguaggi SQL oggi sono: · Oracle SQL; · SQLServer; · PostgreSQL; · MySQL; · SQLInformix; · Access. Nel presente trattato si farà riferimento all'ANSI-SQL.

Il linguaggio SQL

La sigla SQL è diventata sinonimo di linguaggio standard per la gestione dei Data Base Relazionali e la sua nascita risale al 1981, quando venne presentato dall'IBM come prodotto per la gestione di dati in ambiente DOS/VSE, con il nome di SQL/DS. L'SQL è un linguaggio speciale: è una specie di strato virtuale tra tutto ciò che utilizza i dati (utenti e programmi) e la struttura dei dati stessi (Data Base). Segue, non sempre fedelmente, il modello relazionale ed è, in un certo senso, un linguaggio chiuso,

cioè ha come elemento base le tabelle e ogni suo operatore produce sempre tabelle. Assolve alle funzioni di Data Description Language (DDL), per la definizione della struttura dei dati, e di Data Management Language (DML), per la modifica dei dati, e può essere usato sia come linguaggio di interrogazione (QL) a sé stante, di tipo non procedurale, che come linguaggio ospite (Embedded) di un linguaggio procedurale. Nel primo caso il lavoro viene impostato in modalità interattiva (non ci sono routine batch), nel secondo caso si sviluppano programmi che devono essere "immersi" in altri programmi sviluppati in un linguaggio evoluto (ad es. il Cobol) e solo in questo modo possono essere eseguiti. L'interfaccia utente varia da ambiente ad ambiente ma, quasi sempre, c'è un prompt, alcuni messaggi di aiuto (riga di stato) e una segnalazione relativa all'esecuzione del comando impostato. I dati sono organizzati in tabelle, dove le colonne sono gli attributi e le righe sono le istanze degli attributi (record). Le tabelle sono di due tipi: le tabelle-base, create dall'utente, permettono la memorizzazione fisica dei dati, e le tabelle-derivate, che sono il risultato logico (non fisico) di operazioni relazionali sulle tabelle-base. All'interno del Data Base, oltre alle tabelle relative ai dati informativi dell'utente, c'è una zona speciale, detta DataBaseSpaces, che contiene tabelle di descrizione delle tabelle dei dati, dette tabelle-catalog, nonché informazioni sull'utente che ha generato il Data Base e che risulta il solo autorizzato a gestire le tabelle lì contenute. Questo aspetto garantisce il livello di sicurezza necessario in ambiente multiutente, in cui si condividono risorse non solo fisiche ma, soprattutto, logiche. Tra gli attributi (colonne) "giocano" un ruolo importante le chiavi, che sono combinazioni di attributi che consentono di individuare univocamente una riga. Una volta comunicato al sistema se vi sia una chiave per la tabella in uso, SQL ne garantisce la coerenza, cioè non accetta due record (righe) con la stessa chiave e la chiave deve necessariamente contenere un valore definito per ogni record.

Identificatori e tipi di dati

Nel linguaggio SQL gli identificatori, cioè i nomi delle tabelle e degli attributi, sono costituiti da sequenze di caratteri con lunghezza massima di 18 caratteri, devono iniziare con una lettera e possono contenere il carattere "_" (underscore o underline). I tipi di dati standard del linguaggio SQL sono: CHARACTER(n) (o CHAR(n)): stringa di lunghezza n (con 1<n<15000); DATE: data nella forma MM/GG/AA; TIME: ora nella forma HH:MM; INTEGER(p) (o INT(p)); numero intero con precisione p (con 1<p<45); SMALLINT: numero intero con precisione 5 cifre (da -32768 a 32767); INTEGER: numero intero con precisione 10 cifre (-2.147.483.648 a 2.147.483.647); DECIMAL(p,s): numero decimale con precisione p e s numeri decimali (con

DROP INDEX MioIndice ON Studenti; ogni comando SQL viene concluso da un carattere particolare che e' normalmente il carattere ";". Finché SQL non incontra tale carattere continua ad interpretare i caratteri che legge come facenti parti della stessa istruzione. Corollario fondamentale di questo fatto e' che possiamo spezzare il comando stesso su più righe allo scopo di ottenere una migliore leggibilità senza particolari problemi (questo carattere varia da DBMS a DBMS).

Comandi DML per la manipolazione dei dati

Vediamo ora come si inseriscono i dati in una relazione: INSERT INTO Studenti (Nome, Cognome, Classe, Eta) VALUES ('Franco', 'Liburdi', 'seconda', '20'); invece, con il seguente comando modifico la mia tabella: UPDATE Studenti SET Classe = 'terza' WHERE Cognome = 'Liburdi'; quest'altro comando viene utilizzato per la cancellazione di righe: DELETE FROM Studenti WHERE Cognome = 'Liburdi';

Il comando di interrogazione SELECT

Per recuperare i dati nel nostro Data Base si utilizza il comando SELECT, con la seguente struttura generale: SELECT colonne FROM tabelle WHERE condizioni per recuperare i dati di una tabella intera usiamo: SELECT * FROM Studenti; l'asterisco (*) indica che vogliamo estrarre tutti i domini, mentre se si specificano i campi da prendere in considerazione, tramite la clausola WHERE, si indicano solo le righe da considerare. L'esempio riportato sotto mostra un'operazione di selezione (di righe) e proiezione (di colonne): SELECT Nome, Cognome, Eta FROM Studenti WHERE Cognome = 'Liburdi';

il comando SELECT possiede due predicati: ALL e DISTINCT. ALL è quello di default e sta a significare che la selezione deve prendere in considerazione tutte le righe che soddisfano la condizione. Invece con DISTINCT vengono prese in considerazione le righe che soddisfano la condizione e i duplicati si riducono ad una riga sola. Ecco un esempio con DISTINCT: SELECT DISTINCT Nome, Cognome, Eta FROM Studenti WHERE Cognome = 'Liburdi'; durante un'operazione di SELECT i campi presi in considerazione possono essere ridenominati, ossia nella tabella i nomi degli attributi rimarranno gli stessi ma verranno mostrati i risultati solo per quella query con i nomi degli attributi ridenominati. Tutto ciò è possibile tramite la clausola AS: SELECT Cognome, Stipendio * 1.10 AS NuovoStipendio FROM Lavoratori; con questa operazione si considera il campo Cognome e viene mostrato un nuovo campo, di nome NuovoStipendio, che è il risultato del campo Stipendio aumentato del 10%. Abbiamo quindi visto come è possibile svolgere il calcolo di espressioni. Un esempio simile, senza calcolo di espressioni e quindi senza l'aumento dello stipendio del 10%, è il seguente: SELECT Cognome, Stipendio AS NuovoStipendio FROM Lavoratori; Adesso vediamo come si esegue un'operazione di Join. Ad esempio, volendo recuperare i dati di uno studente con i corrispettivi dati del genitore: SELECT * FROM Genitore AS Tab1, Studenti AS Tab WHERE Tab1.codice = Tab2.codice; come si può notare, sono stati utilizzati degli "alias" per i nomi della tabella, proprio per indicare quali campi di quali tabelle confrontare. Se, ad esempio, si esegue la stessa query prendendo in considerazione solo i nomi e i cognomi degli studenti e dei genitori, si utilizzerà una SELECT simile: SELECT Tab1.Nome, Tab1.Cognome, Tab2.Nome, Tab2.Cognome FROM Genitore AS Tab1, Studenti AS Tab WHERE Tab1.codice = Tab2.codice;

Funzioni di aggregazione

Nel comando SELECT possono essere utilizzate opportune funzioni predefinite in grado di agire sui valori contenuti in un insieme di righe di una tabella; tali funzioni vengono chiamate funzioni di aggregazione.

Questa funzione calcola la media dei valori numerici contenuti in una colonna. AVG deriva dall'inglese Average che significa appunto media. Ad esempio, possiamo calcolare la media degli stipendi dei dipendenti: SELECT AVG (Stipendio) AS Totale FROM Dipendenti; funziona in modo analogo a SUM. Funzioni MIN e MAX Queste funzioni restituiscono rispettivamente il valore minimo e il valore massimo tra i valori (che possono essere numerici o alfanumerici) della colonna specificata. Ad esempio, se vogliamo i valori, minimo e massimo, degli stipendi, si scriverà: SELECT MIN (Stipendio), MAX (Stipendio) FROM Dipendenti;

Ordinamenti e raggruppamenti

Per ottenere dei valori ordinati viene utilizzata la clausola ORDER BY. Se ad esempio vogliamo il nome e il cognome degli studenti ordinati alfabeticamente, si esegue la seguente query: SELECT Cognome, Nome FROM Studenti ORDER BY Cognome ASC,Nome; vi sono due tipi di ordinamento: in ascendente (ASC) e in discendente (DESC). Si utilizza la clausola GROUP BY per raggruppare un insieme di righe aventi lo stesso valore nelle colonne indicate. Se, ad esempio, si vuole recuperare la somma degli stipendi dei dipendenti per categoria e il numero di dipendenti per categoria, conviene utilizzare la clausola GROUP BY per raggruppare i dipendenti appartenenti alla stessa categoria: SELECT Categoria,SUM (Stipendio),COUNT (*) FROM Dipendenti GROUP BY Categoria; una SELECT con funzioni di aggregazione e raggruppamenti può essere ampliata sottoponendo i gruppi al controllo di una o più condizioni. In questi casi può essere utile la clausola HAVING. Ad esempio, volendo recuperare la somma degli stipendi dei dipendenti per categoria, solo per le categorie aventi più di tre dipendenti:

SELECT Categoria,SUM (Stipendio) FROM Dipendenti GROUP BY Categoria HAVING COUNT (*) > 3; la clausola HAVING viene sempre utilizzata insieme a GROUP BY, proprio perchè rappresenta una condizione, come WHERE, con la differenza che, anziché per le righe, viene utilizzata per funzioni di aggregazione applicate a gruppi di righe.

La ricerca

Con particolari condizioni di ricerca, utilizzando la clausola WHERE, è possibile affinare le interrogazioni al Data Base con condizioni aggiuntive. BETWEEN L'operatore BETWEEN controlla se un valore è compreso in un determinato intervallo inclusi gli estremi. Ad esempio, volendo recuperare i nomi e i cognomi dei dipendenti con uno stipendio tra i 1000 e i 2000 euro, si scriverà: SELECT Cognome, Nome FROM Dipendenti WHERE Stipendio BETWEEN 1000 AND 2000; l'operatore BETWEEN può essere preceduto dall'operatore logico NOT, per prendere in considerazione la condizione opposta. IN L'operatore IN controlla se un valore appartiene ad un insieme di valori specificati. Per esempio, volendo recuperare i nomi e i cognomi dei dipendenti che risiedono a Roma e Viterbo, si esegue la query: SELECT Cognome, Nome FROM Dipendenti WHERE Citta IN ('Roma','Viterbo'); anche con IN è possibile utilizzare l'operatore logico NOT, per prendere in considerazione la condizione opposta. LIKE L'operatore LIKE confronta il valore di un attributo di tipo carattere (char) con un modello di stringa che può contenere caratteri jolly.

operazioni insiemistiche di unione, intersezione e differenza. Ora si vuole illustrare l'operazione di "congiunzione" (join) di due tabelle in base ad un attributo comune. Consideriamo due tabelle, A e B: TabellaA TabellaB id dipartimento Nome id_dipartimento 1 Architettura Gino 1 2 Economia Pino 2 3 Storia Maria 3 4 Scienze Rosa 5 5 Filosofia e immaginiamo che siano 2 insiemi. Intersecando i due insiemi otterremo una zona condivisa e due aree separate. I diversi tipi di Join si occupano di selezionare queste aree estrapolando diversi gruppi di risultati. INNER JOIN In base all'esistenza o meno della condizione (clausola WHERE), l'Inner Join restituisce solo i record verificati esistenti in entrambe le tabelle: tutte quelle righe che non hanno corrispondenza verranno escluse. Per fare un esempio pensiamo ad una query di questo tipo: SELECT * FROM TabellaA INNER JOIN TabellaB ON TabellaA.id_dipartimento = tabellaB.id; il risultato è: id dipartimento nome id_dipartimento 1 Architettura Gino 1 2 Economia Pino 2 3 Storia Maria 3 5 Filosofia Rosa 5 Il dipartimento di Scienze, non avendo iscritti, non è stato considerato. Nel caso dei due insiemi, viene presa in considerazione solo la parte che si sovrappone. OUTER JOIN L'Outer Join restituisce tutti i record che non corrispondono alle chiavi di ricerca. E' il contrario della Inner Join.

Ciò avviene solo in linea teorica, poiché verrebbero estratti solo i risultati non corrispondenti visualizzati con una serie di NULL. In realtà l'Outer Join si utilizza insieme a Left o Right diventando Left Outer Join o Right Outer Join. Nel caso dei due insiemi viene selezionato tutto ciò che sta al di fuori dall'intersezione. LEFT OUTER JOIN (RIGHT OUTER JOIN) Questo tipo di selezione si ottiene mettendo insieme il concetto di Inner Join e Outer Join. Il risultato che si ottiene è la selezione di tutti i record della TabellaA che hanno corrispondenza con la tabellaB, più i record della tabellaA che non hanno corrispondenza. I record che non trovano corrispondenza vengono impostati a valore NULL. Esiste anche la Right Outer Join ma in genere non si usa e per ottenere lo stesso risultato si cambia l'ordine delle tabelle. A volte è possibile omettere il termine OUTER, quindi rimane semplicemente LEFT JOIN o RIGHT JOIN. Vediamo un esempio: SELECT * FROM tabellaA LEFT JOIN TabellaB ON tabellaA.id_dipartimenti = tabellaB.id; Il risultato è: id dipartimento nome id_dipartimento 1 Architettura Gino 1 2 Economia Pino 2 3 Storia Maria 3 4 Scienze NULL NULL 5 Filosofia Rosa 5 In questo caso anche la riga Scienze è stata inserita, ma, dal momento che non vi sono iscritti, viene inserito NULL nel campi che non hanno corrispondenza.

Subquery

Per introdurre il concetto di Subquery, rivediamo innanzitutto l'utilizzo della specifica IN. La clausola IN controlla se un valore e' presente in una lista. In altre parole il predicato IN formulato con: campo IN (a, b, c, ...); e' equivalente a campo = a OR campo = b OR campo = c OR ... ; i valori della lista potrebbero essere quelli selezionati da uno statement SELECT