SQL Structured Query Language
Introduzione ai database
Raccolta di grandi quantità di dati archiviati su supporto magnetico secondo regole generali. Esso rappresenta l’evoluzione degli archivi “cartacei” permettendo all’utente di accedere velocemente, attraverso l’utilizzo dei calcolatori, ai dati di interesse.
Possibilità di poter essere utilizzato da più utenti contemporaneamente
I dati sono raccolti sotto forma di “registrazioni” logiche ognuna delle quali è suddivisa in un certo numero di campi che possono essere utilizzati per la ricerca di archivio.
I dati sono registrati tutti in un unico archivio evitando così le duplicazioni di informazioni e ottimizzando lo spazio di memoria occupato.
Possibilità di mettere in relazione le informazioni tra gli archivi presenti in modo da formare dei gruppi di informazioni omogenei.
Gestione dati (nei primi database) In una rete di utenti l’onere di gestire i requisiti di integrità dei dati e di ridondanza minima è lasciata agli utenti che devono conoscere
quindi come è stata definita la struttura dati.
Introduzione dei DBMS Data Base Management Systems
Con l’introduzione del DBMS non è più obbligatoria la conoscenza
della struttura dati e delle regole definite per mantenere l’integrità
Caratteristiche:
Gestione dei dati contenuta dentro un unico motore
Le applicazioni che lavorano sui dati non devono tener conto delle regole di integrità che vengono gestite dal DBMS
Nessuna applicazione potrà inserire dati non validi nel Database
Vantaggi:
1. Indipendenza dei dati dall’applicazione
2*. Gestione dell’integrità fisica dei dati
3**. Gestione dell’integrità logica dei dati
4. Ottimizzazione
*Gestione integrità fisica dei dati: La gestione degli accessi contemporanei ai dati da più utenti vengono interamente gestiti da DBMS in modo automatico, in modo da non mettere a rischio l’integrità dei dati.
** Mantenimento dei dati in modo che rispettino le regole di integrità delle relazioni che vengono stabilite all’atto della creazione della struttura.(Integrità referenziale).
ad esempio: In una relazione uno a molti : se viene cancellato un cliente verranno cancellati tutti i telefoni che rispettano la relazione di appartenenza al cliente cancellato.
Sicurezza e ottimizzazione
Un altro punto a favore del DBMS è la gestione centralizzata degli utenti:
Le funzioni per la gestione degli utenti permettono al DBA (Data Base Administrator) di stabilire le regole di lettura, scrittura, modifica ecc. che ogni utente ha su ogni singola unità del database
Schema
Si può stabilire all’interno del DBMS un modello che serve a stabilire le convenzioni per definire i diversi aspetti dei dati.
Tale definizione è denominata Schema e presuppone una fase di progettazione del database.
Fasi di progettazione database
Schema concettuale -> Schema logico -> Schema fisico
Schema concettuale
E’ la rappresentazione più astratta del sistema informativo che si vuol rappresentare in modo più vicino alla logica umana.
I modelli utilizzati per la definizione dello schema concettuale sono i modelli semantici. Il modello più diffuso è il Entity-Relationship (Entità – Relazione
Modello Entity-Relationship
Entità: oggetti che fanno parte del database raggruppati in insiemi omogenei.
Le proprietà caratteristiche di un insieme di oggetti omogenei vengono chiamate attributi.
(Ad esempio l’entità è la tabella dei clienti gli attributi sono i campi che la costituiscono)
Relationship : relazioni tra le entità.
Le relazioni tra due insiemi di entità A e B viene classificato in tre tipi:
a) Relazione 1 : 1 (uno a uno) ad ogni entità in A corrisponde una sola entità in B.
b) Relazione 1 : N (uno a molti) ad ogni entità di A possono corrispondere 1 o più entità di B mentre a ogni entità di B corrisponde una sola entità di A.
c) Relazione N : N (molti a molti) ad ogni entità di A possono corrispondere più entità di B e viceversa.
Schema logico
Lo schema logico del database non è altro che l’implementazione dello schema concettuale per il DBMS che si utilizza.
Dipende quindi dal tipo di DBMS che si sta utilizzando.
Schema fisico
E’ il livello di definizione dello schema in cui si decide dove le strutture definite nello schema logico vengano effettivamente registrate nel sistema che si sta utilizzando. Quindi non solo dipende dal tipo di DBMS che si sta utilizzando ma anche dalla piattaforma hardware dove è residente il DBMS.
Tipi di comandi SQL
DDL (Data Definition Language): definizione dello schema logico del DB.
DML (Data Manipulation Language): operazioni di interrogazione, inserimento, cancellazione,modifica dei dati.
DCL (Data Control Language): controllo dati, gestione utenti, ottimizzazione
Utenti del DBMS
Utenti: Eseguono operazioni semplici di DML
Programmatori: Eseguono operazioni complesse di DML
DBA: Eseguono operazioni di gestione del database utilizzando DDL e DCL
Linguaggio SQL
Con questo linguaggio siamo in grado di gestire completamente una base dati.
Esistono comandi SQL per attuare tutti e tre i tipi di operazioni:
Definizione dati: DDL
Manipolazione dati: DML
Controllo dati: DCL
Caratteristiche di SQL
La maggior parte dei linguaggi che operano sui dati agiscono su gli archivi scorrendoli dal primo all’ultimo record e verificano la validità della condizione per eseguire una particolare operazione.
Contrariamente SQL agisce su insiemi di dati che risolvono la condizione specificata: quindi non si agisce a livello di singolo record ma su insiemi di record che risolvono una condizione.
DCL (Data Control Language): controllo dati, gestione utenti, ottimizzazione
Utenti del DBMS
Utenti: Eseguono operazioni semplici di DML
Programmatori: Eseguono operazioni complesse di DML
DBA: Eseguono operazioni di gestione del database utilizzando DDL e DCL
Linguaggio SQL
Con questo linguaggio siamo in grado di gestire completamente una base dati.
Esistono comandi SQL per attuare tutti e tre i tipi di operazioni:
Definizione dati: DDL
Manipolazione dati: DML
Controllo dati: DCL
Caratteristiche di SQL
La maggior parte dei linguaggi che operano sui dati agiscono su gli archivi scorrendoli dal primo all’ultimo record e verificano la validità della condizione per eseguire una particolare operazione.
Contrariamente SQL agisce su insiemi di dati che risolvono la condizione specificata: quindi non si agisce a livello di singolo record ma su insiemi di record che risolvono una condizione.
Interrogazione database
Tutte le informazioni nel database sono contenute sotto forma di tabelle quindi qualsiasi tipo di richiesta di informazioni al database viene eseguita con il comando per l’interrogazione delle tabelle: SELECT
Comando SELECT
SELECT [ALL|DISTINCT] []
dove può essere composto da:
[clausola WHERE]
[clausola GROUP BY]
[clausola HAVING]
Clausola FROM : Indica la tabella o le tabelle dove effettuare l’interrogazione.
= FROM [ ...]
contiene un elenco di campi che vengono visualizzati all’esecuzione del comando.
Nel caso in cui nella siano presenti più di una tabella e ci siano dei campi con lo stesso nome che vengono listati allora è obbligatorio segnalare anche la tabella di appartenenza del campo.
es.: select tabella1.campo1, tabella2.campo1 from tabella1,tabella2
Ridenominazione delle intestazioni delle colonne:
select ““, ““
from
Quando si devono listare tutte le colonne allora si utilizza il carattere jolly *
Utilizzo funzioni per la decodifica dei campi
select decode(, valore_da_decodificare1, valore_decodificato1, valore_da_decodificare2, valore_decodificato2, valore_da_decodificare3, valore_decodificato3) , from
Distinct
L’opzione distinct da anteporre alla
permette di listare l’elenco dei valori di un campo specificato senza ripetizioni.
es.: ho una tabella di impiegati in cui ho il nome della città di residenza. per listare tutte le città in cui ho almeno un impiegato eseguo:
select distinct città from impiegati
Clausola WHERE:
permette di specificare le condizioni della selezione.
= WHERE
= espressione logica che quindi può valere vero o falso. Di solito è un espressione di confronto tra un campo e un valore.
Operatori di confronto
= uguale
diverso
> maggiore
= maggiore o uguale
<= minore o uguale
Operatori logici
Servono per mettere a confronto più espressioni logiche:
AND = vero se tutte e due le condizioni sono vere
OR = vero quando una delle due condizioni è vera
NOT = vero quando la condizione e falsa
Operatori di confronto avanzati
BETWEEN verifica se l’argomento è compreso in un intervallo di valori.
sintassi:
BETWEEN AND
IN verifica se l’argomento è contenuto in un’insieme di valori.
sintassi: IN (,…)
LIKE verifica se il valore del campo confrontato contiene una certa serie di caratteri. Per specificare la serie di caratteri si possono utilizzare i caratteri jolly:
“_” un singolo carattere qualsiasi
“%” un numero qualsiasi di caratteri
esempio: campo1 like ‘A%’ è vera per tutti i record in cui campo1 inizia per “A”.
IS NULL verifica se il contenuto di un campo è nullo.
Significa che non contiene alcun valore e non che contiene 0 o uno spazio.
Calcoli
L’istruzione select può contenere non solo i nomi di colonne ma anche espressioni matematiche tra i campi, i risultati vengono visualizzati nella colonna corrispondente.
operatori: * moltiplicazione, / divisione, + somma, – sottrazione
esempio: select stipendio+straordinario from stipendi where numimpiegato = 1
Funzioni che agiscono sull’intera selezione
MAX restituisce il massimo valore presente in un campo
MIN restituisce il minimo valore presente in un campo
SUM restituisce la somma dei valori in un campo
AVG restituisce la media dei valore presenti in campo
COUNT conta le righe
Clausola GROUP BY
Tali funzioni permettono di utilizzare il raggruppamento dei dati per effettuare delle operazioni su ogni singolo gruppo ottenuto.
Esempio: Supponiamo di voler stabile la media degli straordinari di ciascun impiegato.
Dobbiamo quindi raggruppare nella tabella stipendi per numero impiegato e applicare la funzione AVG sul campo straordinario
agiremo come segue:
select avg(straordinario) from stipendi group by numimpiegato
Il raggruppamento viene effettuato per numero impiegato e per ognuno di questi gruppi verrà calcolata la media del campo straordinario.
Clausola HAVING
L’utilizzo di questa clausola è associato alla clausola GROUP BY.
Come la clausola WHERE permette di porre condizioni sulla select così la clausola HAVING pone condizioni sui gruppi da considerare ma a posteriori della selezione.
Esempio: lista delle medie degli straordinari degli impiegati ragruppati per livello inferiore al terzo.
select avg(straordinario) from stipendi group by livello having livello < 3
Clausola ORDER BY
Sintassi: = [, { …}
= | [ASC|DESC]
esempio:
select * from stipendi order by livello DESC, anno
Interrogazioni su più tabelle
L’interrogazione su più tabelle presuppone l’esistenza di colonne in comune tra le tabelle. E’ indispensabile che le colonne che mettono in relazione due tabelle siano dello stesso tipo. Nel nostro esempio abbiamo le due tabelle impiegati e stipendi che hanno in comune la colonna
numero – numimpegato.
JOIN tra tabelle
Il collegamento nella select viene implementato nel seguente modo: nella clausola FROM vanno indicate le tabelle sulle quali questa join va effettuata nella clausola WHERE va espressa una particolare condizione chiamata condizione di join
I nomi delle colonne vanno sempre indicati con .
esempio: select * from impiegati,stipendi where impiegati.numero = stipendi.numimpiegato
Nella di una select si possono inserire anche delle condizioni sulla lista che vanno combinate mediante AND con la condizione di join, ovviamente si possono applicare tutte le clausole GROUP BY, HAVING, ORDER BY.
Riprendendo l’esempio precedente:
esempio: SELECT * FROM impiegati,stipendi WHERE impiegati.numero = stipendi.numimpiegato ORDER BY impiegati.numero
otteniamo così la lista degli stipendi di ogni impiegato negli anni.
Interrogazione con operatori tra insiemi
Si possono applicare gli operatori tra insiemi unione, differenza e intersezione agli insiemi di righe risultato di interrogazioni.
Si possono trattare due select come insiemi di righe e utilizzarle come operandi in una operazione insiemistica.
UNION
L’operatore UNION si applica tra due select e restituisce tutte le righe della prima più tutte le righe della seconda.
UNION [ALL]
N.B.: Non è possibile fare l’unione di due select che contengono campi differenti.
Se i valori dei campi restituiti sono uguali non vengono ripetuti nella lista ottenuta. Se si utilizza l’opzione ALL vengono inclusi anche i duplicati.
Esempio: select * from stipendi where numimpiegato = 1 and anno =1997 union
select * from stipendi where numimpiegato=1 and anno =1998
Ottengo la lista degli stipendi dell’impiegato 1 per l’anno 1997 e 1998.
select numimpiegato from stipendi where numimpiegato=1 union select numimpiegato from stipendi where numimpiegato=2
ottengo solo i due numeri 1 e 2 perché i valori uguali vengono eliminati
MINUS
Si applica tra due select e restituisce tutte le righe della prima tabella che non si trovano nella seconda.
MINUS
ovviamente le due select devono avere la stessa struttura.
INTERSECT
Si applica tra due select e restituisce tutte le righe che sono sia nella prima che contenute nella seconda select.
INTERSECT
ovviamente le due select devono avere la stessa struttura.
SUBQUERY
Istruzioni select come argomenti all’interno di altre istruzioni select
= ()
le parentesi rotonde sono obbligatorie.
Tipi di subquery:
Scalare: restituisce un valore unico.
es.: (select max(stipendio) from stipendi where numimpiegato=3)
Colonnare: restituisce una colonna con una o più righe.
es.: (select stipendio from stipendi where numimpiegato=3)
Tabellare: restituisce più colonne con una o più righe.
Utilizzo delle Subquery
Espressioni di confronto con subquery di tipo scalare.
Espressioni ALL e ANY
Espressioni IN
Calcolo di espressioni
Espressioni di confronto
Subquery in espressioni di confronto
la subquery utilizzata dev’essere scalare.
la sintassi deve essere sempre
= ()
non può essere:
()=
Non si possono fare confronti tra subquery
Nelle subquery non è possibile utilizzare le clausole HAVING e GROUP BY
Esempio: Trovare l’impiegato che ha lo stipendio maggiore.
select * from impiegati where numero = (select numimpiegato from stipendi where stipendio = (select max(stipendio) from stipendi))
La subquery più interna restituisce lo stipendio più alto, la subquery più esterna restituisce il numero dell’impiegato che percepisce questo stipendio.
Subquery: Epressioni ALL, ANY
Sintassi:
[ALL|ANY]
Sono espressioni per confrontare il contenuto di una subquery di tipo colonnare con il contenuto di un campo.
ALL verificato quando tutti i valori contenuti nella subquery colonnare applicati restituiscono vero.(AND)
ANY verificato quando risulta vero con uno dei valori restituiti dalla subquery.(OR)
1) Esempio:
select * from stipendi where straordinario >ALL ( select AVG(straordinario) from stipendi)
in questo esempio si ottiene la lista di tutti gli straordinari superiori alla media.
2) Esempio:
select * from stipendi where livello > 2 and straordinario < ANY (select straordinario from stipendi where livello 2 e che hanno straordinario < dei dipendenti con livello inferiore.
Subquery: Espressioni IN
Al posto di utilizzare l’operatore =ANY si può utilizzare l’operatore IN.
in questo caso la subquery si può considerare come un elenco di valori che se confrontati uno per uno con il campo specificato prima di IN risolvono la condizione.
Esempio: select * from impiegati where numero in (select numimpiegato from stipendi where straordinario > 200000) . restituisce l’elenco degli impiegati con straordinario > 200000
Subquery annidate
E’ possibile , per effettuare operazioni più complesse sui dati effettuare delle subquery all’interno di subquery. Il numero di subquery annidate non ha un limite tecnico in SQL.
Esempio:
select * from impiegati where numero in (select numimpiegato from stipendi where straordinario >ALL(select AVG(straordinario) from stipendi))
Comandi DML (Data Manipulation Language)
INSERT
Serve ad inserire dati nelle tabelle.
Sintassi:
insert into []
può essere o una serie di valori o una select di un’altra tabella.
Esempio 1 (serie di valori) :
insert into impiegati (numero,cognome,nome,indirizzo,cap,città,ufficio) values (3,’Bianchi’,'Antonio’,'Piazza della Vittoria 1′,16121,’Genova’,3);
La parte di specifica dei nomi dei campi nel caso di inserimento di tutti i valori può essere omessa.
Per inserire un valore nullo si deve utilizzare la parola chiave NULL.
Nel caso che la sia una tabella deve avere la stessa struttura della tabella che si sta aggiornando.
Esempio 2 :
insert into impiegati select * from impiegati2
supponendo di avere una tabella impiegati2 strutturalmente uguale a impiegati con questo comando si aggiungono i record di impiegati2 a impiegati.
UPDATE
Serve per modificare i dati nelle tabelle.
Sintassi:
= UPDATE SET = [ = espressione ...] [WHERE ]
= tabella da aggiornare
SET specifica i campi e i valori che devono assumere
WHERE specifica una condizione sull’aggiornamento delle righe.
Esempio1:
update impiegati set cap=20100 where città = ‘Milano’;
Esempio2:
update stipendi set stipendio = stipendio * 1.1 where livello (select avg(straordinario) from stipendi))
Da notare che non è possibile utilizzare le funzioni di gruppo come avg( ) senza dover effettuare delle subquery.
DELETE
= DELETE FROM [WHERE ]
se non viene specificata nessuna condizione il contenuto della tabella viene eliminato completamente.
Se le condizioni sono influenzate ricorsivamente dall’esecuzione della cancellazione questa ricorsione non viene considerata come si vede nel seguente esempio:
Esempio:
delete from stipendi where stipendio = ( select min(stipendio) from stipendi);
come si può notare la valutazione della subquery viene effettuata prima del confronto e quindi la cancellazione verrà eseguita solo per lo stipendio minimo.