Sei sulla pagina 1di 63

di

Franchini Roberto
Corso SQL

DEFINIZIONE DI DATABASE

Un database è un archivio strutturato di dati, solitamente organizzato in un file, al quale possono


accedere programmi ed applicazioni per effettuare delle operazioni.
La finalità principale di un database è di memorizzare i dati e di mettere in relazione le informazioni
rappresentate da quei dati, attraverso un sistema di gestione.

STRUTTURA DI UN DATABASE ORACLE

Un database Oracle è un archivio in grado di gestire enormi quantità di dati in un ambiente


multiutente.
Le caratteristiche principali di un database Oracle sono:

§ organizzazione dei dati in tabelle per evitare la ridondanza degli stessi;


§ esistenza di meccanismi per la sicurezza dei dati che ne garantiscono la protezione da
accessi non autorizzati
§ esistenza di meccanismi per il ripristino dei dati in seguito a guasti di tipo hardware o
software.

Questo consiste di una struttura logica e di una struttura fisica tra loro indipendenti.
La struttura logica è determinata da più tablespace e da uno o più schemi.
Le tablespaces rappresentano delle unità logiche di memoria in cui il database è suddiviso in modo
logico. La figura dell’amministratore del database, il DBA, userà le tablespaces per:
§ controllare lo spazio di memoria concesso all’allocazione dei dati;
§ assegnare delle specifiche quote di spazio agli utenti del database;
§ eseguire parziali operazioni di backup e recovery del database.

Gli schemi sono strutture logiche di memorizzazione dei dati, associate agli utenti del database e
rappresentano l’insieme degli oggetti del database di cui è proprietario un utente. Ogni schema di
oggetti include tabelle, viste, sequenze, snapshots, cluster, stored procedure, stored function,
package, ecc… Oracle immagazzina uno schema in modo logico all’interno della tablespaces del
database. I dati inseriti dall’utente vengono, invece, memorizzati in apposite tablespaces datafiles.
La struttura fisica del database è determinata dai file del sistema operativo che costituiscono il
database: uno o più file di dati, due o più file di redo log e uno o più file di controllo. Questi file
consentano la reale allocazione fisica delle informazioni.

L’ISTANZA ORACLE
La SGA (System Global Area) è una regione di memoria condivisa che contiene dati e informazioni
di controllo per un’istanza Oracle.
L’istanza Oracle si compone dell’unione della SGA e dei processi in background.
Ogni istanza ha al propria SGA.
User

User User User User User Process

Pagina 0 di 63
Corso SQL
System Global Area

Oracle Process
Reco Pmon Smon Dbwr … Background
Process
Figura 1: Istanza di Oracle
La SGA viene allocata ogni volta che viene fatto partire il database e deallocata quando il database
viene portato in stato di shout-down.

Un’istanza Oracle possiede due tipi di processi:


§ utente: eseguono il codice di un programma applicativo o di un tool Oracle
§ oracle: gestiscono le richieste dei processi utente. Per ogni istanza, Oracle crea una serie di
processi di background.

TIPI DI DATABASE
Esistono diversi tipi di database:

Gerarchico I dati vengono organizzati in insiemi legati fra loro da relazioni di


"possesso", in cui un insieme di dati può possedere altri insiemi di dati, ma
un insieme può appartenere solo ad un altro insieme. La struttura risultante e'
un albero di insiemi di dati.
Reticolare Il modello reticolare è molto simile a quello gerarchico, ed infatti nasce
come estensio ne di quest'ultimo. Anche in questo modello insiemi di dati
sono legati da relazioni di possesso, ma ogni insieme di dati può appartenere
a uno o più insiemi. La struttura risultante è una rete di insiemi di dati.
Relazionale I database appartenenti a questa categoria si basano sul modello relazionale
la cui struttura principale è la relazione, cioè una tabella bidimensionale
composta da righe e colonne. Ciascuna riga, che in terminologia relazionale
viene chiamata tupla, rappresenta un' entità che si intende memorizzare nel
database. Le caratteristiche di ciascuna entità sono definite invece dalle
colonne delle relazioni, che vengono chiamate attributi. Entità con
caratteristiche comuni, cioè descritte dallo stesso insieme di attributi, faranno
parte della stessa relazione.
Figura 2: TIPI DI DATABASE

VANTAGGI DI UNA DATABASE RELAZIONALE


Il database più utilizzato tra quelli presentati è senza dubbio il database relazionale, poiché possiede
numerosi vantaggi:
§ Organizzazione e ricerca veloce delle informazioni
§ Minore occupazione di spazio
§ Condivisione dei dati tra più utenti
§ Si assicura la sicurezza dei dati
§ Si evita l’inconsistenza e la ridondanza

PROGETTAZIONE DI UN DATABASE
La progettazione di un database consta di 5 passi fondamentali, che sono di seguito schematizzati:

Pagina 1 di 63
Corso SQL

ANALYST

DESIGN

BUILD
TEST

TRANSITION

Figura 3: fasi della progettazione


La fase di analisi è uno studio dettagliato dei processi richiesti dal mercato e delle informazioni
necessari per eseguire tali processi. Al termine della fase di analisi è possibile avere una prima
bozza del modello concettuale Entità/Relazione.
La fase di progettazione prevede la figura del designer o progettista che avrà il compito di creare
uno schema basato sul modello entità relazione e di fornire una documentazione delle specifiche.
La terza fase riguarda lo sviluppo reale del progetto, al quale farà seguito la fase di controllo di
quanto elaborato ed, in conclusione, l’implementazione del prodotto per la commercializzazione
finale .

RDBMS

Un database possiede un sistema di gestione per le informazioni memorizzate.


RDBMS rappresenta proprio il sistema di gestione del database relazionale e si compone di:
• Software di gestione del database relazionale (kernel)
• Linguaggio SQL per l’accesso ai dati
• Insieme di Tools per la gestione del database
• Insieme di oggetti:
Tabelle,Viste,Stored procedure or function,Package, Indici,
Sequenze, Sinonimi, Snapshot, Cluster, Rollback Segment,
Database link.

Le caratteristiche principali di un RDBMS sono:

Pagina 2 di 63
Corso SQL

Compatibilità Nei confronti dello standard SQL

Portabilità Sulla quasi totalità delle piattaforme

Multiutenza Possibilità di condivisione dati in multiutenza con gestione dei LOCK a


livello di riga per l’aggiornamento concorrente di record diversi della
stessa tabella da parte di più utenti

Connettibilità Capacità di accedere a dati presenti su macchine diverse integrando fonti di


dati ORACLE e non.

Transazione Esecuzione di operazioni di manipolazione su due o più DB su nodi


distribuita diversi.
(Two-phase
Commit)
Figura 4: caratteristiche RDBMS

Connettibilità

CLIENT 1

DB SERVER CLIENT 2
ORACLE

Autonomia DB - Applicazioni

CLIENT N Pagina 3 di 63
Corso SQL

Figura 5: Processing Distribuito

Pagina 4 di 63
Corso SQL

Transazione distribuita
La caratteristica RDBMS della transazione distribuita è facilmente riscontrabile nei database
distribuiti. Questi rappresentano un database di rete gestito da un database remoto, che funge da
server nella comunicazione con qualsiasi archivio di dati locale, che rappresenta il client. Da
annotare che il database distribuito appare all’utente come un unico database logico. La transazione
distribuita gestisce un meccanismo di commit in due tempi (two phase commit ) per assicurare la
consistenza dei dati all’interno della rete, alla quale accedono più utenti contemporaneamente,
apportando modifiche in simultanea.

CLIENT

DB SERVER DB SERVER DB SERVER


ORACLE 1 ORACLE 2 ORACLE N

PRINCIPI

1. Location Transparency

2. Site Autonomy
Figura 6: Database Distribuito

TOOLS ORACLE
Oracle dispone di un insieme di strumenti necessari per lo sviluppo completo di un progetto.

Pagina 5 di 63
Corso SQL

SERVER MANAGER
E’ il tool di amministrazione del database della Oracle. La componente grafica di Server Manager
(Server Manager / GUI) permette l’esecuzione dei compiti dell’amministratore del database con la
comodità di un interfaccia grafica utente (GUI).

SQL *PLUS
Il tool SQL *PLUS comporta un ambiente usato per creare, modificare ed interrogare il database
attraverso l’impiego dei comandi SQL e dei blocchi PL/SQL.
SQL *PLUS permette di:
§ inserire, modificare, memorizzare ed eseguire comandi in linguaggio SQL e PL/SQL;
§ elaborare facili interrogazioni di operazioni di calcolo, il cui risultato verrà stampato a
video;
§ visualizzare le colonna che compongono la struttura di una tabella del database;
§ accedere e copiare dati tra due database.

SQL *FORMS
Il tool SQL *FORMS permette allo sviluppatore di creare delle applicazioni che verranno adoperate
dall’utente per ricavare, inserire o cancellare dati dal database. Questo tool si appoggia sull’utilizzo
di particolari oggetti, quali trigger, procedure e gestione degli errori, che vengono stilati in
linguaggio SQL con la combinazione dei blocchi procedurali PL/SQL e che possono fare
riferimento ad ogni azione compiuta sul componente della maschera creata.

SQL *REPORT
Il tool SQL *REPORT consente la creazione di report specifici sui dati presenti nel database.

SQL *LOADER
Il tool SQL *LOADER permette di caricare dati provenienti da file esterni all’interno del database.
Le informazioni possono essere rappresentate in qualsiasi formato: sarà compito del sistema
gestione di filtrare i dati corretti.
I dati da caricare sono archiviati in un file, detto control file. Al momento della fase di caricamento,
SQL *LOADER si occuperà di memorizzate le informazioni di quanto sta avvenendo in un log file.
I dati scartati dal caricamento, perché errati, verranno registrati nel bad file. Infine, viene creato un
ultimo file, denominato discard file necessario per trattenere i dati che sono stati scartati perché non
soddisfacenti un criterio di selezione.

Pagina 6 di 63
Corso SQL

Input Datafile Loader Control


File

Loader Control SQL *Loader Bad File


File

Discard File

Figura 7: SQL* LOADER


DB
SQL *NET
Il tool SQL *NET consente la comunicazione in un ambiente di rete tra il server Oracle e i client
oppure tra il server Oracle e altri server. Le informazioni vengono inviate sotto forma di istruzioni
SQL o di dati di risposta. Al termine della sessione di lavoro, SQL *NET chiude la connessione con
la rete. Se al momento della richiesta, il tool riconosce che sono coinvolte più macchine, quindi non
si lavora in ambiente locale, allora avvia una sua richiesta al TNS (livello inferiore) perché la
trasmetta ut ilizzando l’appropriato protocollo di comunicazione.

EXPORT
Il tool EXPORT permette il trasferimento degli oggetti tra database Oracle. Questo estrae la
definizione dell’oggetto e i dati di un database Oracle e li memorizza in un file di appoggio con
formato binario, situato generalmente su disco.

IMPORT
Il tool IMPORT provvede all’inserimento dei dati estratti da un database Oracle tramite EXPORT
in un altro database Oracle. Il file di appoggio creato dall’EXPORT verrà letto dall’IMPORT, il
quale avrà tutte le informazioni riguardanti la definizione della struttura e dei dati della tavola .

Pagina 7 di 63
Corso SQL

OGGETTI ORACLE

TABELLE
La tabella rappresenta l’oggetto dello schema in cui vengono memorizzati i dati. Una tabella è
composta da colonne e righe, dove ogni colonna rappresenta una caratteristica, definita come
attributo e ogni riga rappresenta un occorrenza dei dati, definita come tupla.
colonna

occorrenza

INDICI
L’ indice è un oggetto dello schema che contiene un entry ordinato per ogni elemento presente in
una o più colonne indicizzate della tabella. Il vantaggio principale nell’uso di questo oggetto è la
facilità di accesso alle righe.

SEQUENZE
La sequenza è un oggetto dello schema che genera valori interi che possono essere impostati come
non ripetibili. Questa caratteristica rende utile la sequenza nel momento della creazione del valore
della chiave primaria in una tavola.

SINONIMI
Il sinonimo è un oggetto dello schema utilizzato per rinominare un oggetto esistente. Può essere
pubblico, permettendone l’accesso a tutti gli utenti oppure privato permettendo l’accesso al solo
proprietario dello schema in cui è stato creato.

VISTE
La vista è un oggetto dello schema che rappresenta una selezione dinamica della struttura e dei dati
di una o più tabelle anch’esse presenti nello schema, che vengono denominate based tables. Una
vista non può possedere dati propri.

CLUSTER
Un cluster è un oggetto dello schema contenente una o più tabelle che hanno in comune almeno una
colonna.
Questo raggruppamento consente un maggior controllo sulla memorizzazione fisica all’interno del
database, poiché le righe di una o più tabelle che condividono lo stesso valore nelle colonne comuni
sono archiviate fisicamente insieme nel database.

SNAPSHOT
Lo snapshot è un oggetto dello schema che memorizza il risultato di una query tra una o più tabelle,
spesso situate su un database remoto. Questo oggetto è utilizzato soprattutto nei database
distribuiti. Consente di ottenere una copia in sola lettura dei dati remoti nel nodo proprio locale. I
dati sono comunque costantemente aggiornati tramite un refresh.

Pagina 8 di 63
Corso SQL

STORED PROCEDURE or STORED FUNCTION


Le stored procedure sono blocchi di comandi eseguibili dall’utente, che vengono memorizzate
all’interno del database e diventano quindi un oggetto dello stesso.
Anche le stored function sono dei blocchi di comandi eseguibili dall’utente memorizzate nel
database; rispetto alle stored procedure hanno la caratteristica di restituire un valore di ritorno
calcolato.

PACKAGE
Il package è un oggetto dello schema che contiene procedure, funzioni archiviate nel database e
variabili.
L’uso dei package presenta dei vantaggi contro l’uso delle stored procedure o stored function
singole:
§ può contenere delle variabili globali, necessarie per tutti i sottoprogrammi che lo
compongono;
§ organizza lo sviluppo dell’applicazioni in modo più efficiente;
§ consente un sovraccarico di funzioni e procedure.

ROLLBACK SEGMENT
Il rollback segment è un oggetto dello schema in cui vengono temporaneamente memorizzati i dati
seguenti ad una transazione per un eventuale ripristino degli stessi in seguito ad un cambiamento.

DATABASE LINK
Il database link è un oggetto dello schema che permette il collegamento tra un database locale e un
database remoto anche diverso da Oracle al fine di accedere ai suoi oggetti.

Pagina 9 di 63
Corso SQL

DATA DICTIONARY
L’istallazione di un database Oracle include la creazione di tre utenti Oracle standard:
§ SYS: è l’utente proprietario di tutte le tavole e le viste presenti nel data dictionary.
Possiede il più alto privilegio di gestire gli oggetti e le strutture del database,
come creare un nuovo utente.
§ SYSTEM: è il proprietario delle tavole usate dai tool SQL *PLUS, SQL *FORMS.
Possiede meno privilegi di SYS.
§ PUBLIC: è un utente irreale del database Oracle. Tutti i privilegi assegnati a questo
utente sono automaticamente assegnati ad ogni utente riconosciuto nel
database.

Le tabelle e le viste che compongono il data dictionary contengono informazioni circa:


§ gli utenti e i loro privilegi;
§ le tavole, le colonne che le costituiscono, le constraint, gli indici;
§ i privilegi garantiti sugli ogge tti del database.
La selezione del contenuto del data dictionary è possibile attraverso il comando SQL:

SELECT * FROM DICTIONARY;


o nella forma ridotta:

SELECT * FROM DICT;


Inoltre, Oracle restituisce le informazione relative alle tavole:

SELECT * FROM TAB;


o alle corrispondenti colonne
SELECT * FROM COL;

Nel data dictionary, gli oggetti sono raggruppati in tre viste:

• USER_ : ogni riga della vista USER contiene informazioni sugli oggetti del corrente
utente, connesso al database, che possono essere restituite con il
comando SELECT:
§ USER_TABLES: ritorna le tavole con il nome e il numero delle
o colonne (TABS).
§ USER_CATALOG: ritorna le tavole, le viste e i sinonimi (CAT).
§ USER_COL_COMMENTS: ritorna i commenti assegnati alle colonne.
§ USER_CONSTRAINTS: ritorna la definizione delle constraint sulle tavole.
§ USER_INDEXS: ritorna le informazioni sugli indici presenti sulla tavola
(IND).
§ USER_OBJECTS: ritorna tutti gli oggetti di cui è proprietario l’utente
connesso (OBJ).
§ USER_TAB_COLUMNS: ritorna le colonne delle tavole e delle viste
dell’utente connesso (COL).
§ USER_TAB_COMMENTS: ritorna i commenti assegnati alla tavola.
§ USER_USERS: ritorna informazioni sul corrente utente.
§ USER_VIEWS: ritorna le viste definite dall’utente.
§ ALL_: ogni riga della vista ALL contiene tutte le informazioni contenute nella vista
USER_ e le informazioni che sono accessibili dal seguente utente. La
struttura di questa vista è analoga a quella della vista USER_

Pagina 10 di 63
Corso SQL

§ DBA_: contiene tutte le informazioni circa gli oggetti dell’intero database,


riguardanti ogni utente. L’accesso a questa vista è possibile solo agli utenti
con privilegi da DBA.

TIPI DI DATO
Ad ogni tipo di dato Oracle associa delle proprietà, che generano una gestione diversa dei valori con
tipi di dato differenti, come ad esempio il dominio di valori possibili.
I tipi di dato vengono associati alle singole colonne di una tavola o ad un valore variabile o
costante. Bisogna tener presente che la colonna di una tabella non potrà mai assumere come tipo di
dato il BOOLEAN.

CHAR (dimensione)
Stringa di caratteri con lunghezza fissa di dimensione byte. Il valore minimo è di 1 byte; il massimo
di 2000.

VARCHAR2(dimensione)
Stringa di caratteri di lunghezza variabile, aventi un massimo di dimensione byte. Il valore minimo
è 1 byte; quello estremo è 4000 nella versione 8, mentre possiede un massimo di 2000 byte nella
versione 7. Il valore di dimensione deve essere obbligatoriamente espresso.

NUMBER (precisione, scala)


Dati di tipo numerico con valori positivi e negativi a virgola mobile e a virgola fissa, in cui
precisione può assumere valori da un minimo di 1 ad un massimo di 38. Il valore di scala ha un
insieme di valori da –84 a 127.

DATE
Valori rappresentanti la data con un range di valori compreso tra 1 Gennaio 4712 A.C. a 31
Dicembre 4712 D.C.
Con questo tipo di dato è possibile esprimere una precisione riferita ad ore, minuti e secondi.

ROWID
Stringa espressa in codice esadecimale rappresentante l’indirizzo univoco di una riga nella tabella in
cui è memorizzata. Questo tipo di dato è utilizzato principalmente per il valore restituito dalla
pseudocolonna ROWID.

RAW(dimensione)
Sono tipi di dati che non vengono interpretati da Oracle e servono per memorizzare, ad esempio file
binari o file stringa.
Vengono utilizzati soprattutto per archiviare documenti provenienti da altre applicazioni. La
dimensione massima è di 2000 byte e il valore di dimensione deve essere obbligatoriamente
indicato.

LONG RAW
Possiede le stesse funzionalità del tipo Raw, ma la dimensione massima è di 2GB.

LOB
Consente la memorizzazione di dati con dimensione fino a 4GB.

Pagina 11 di 63
Corso SQL

MODELLAZIONE DEI DATI


Un modello dati è la rappresentazione semplificata della realtà che si intende analizzare, in modo da
mettere in evidenza gli elementi dominanti e i legami che intercorrono tra questi.
La progettazione di un modello di dati si svolge in tre livelli:

§ livello concettuale: rappresenta con l’uso di uno schema grafico la realtà dei dati e le
relazioni tra essi;
§ livello logico: descrive il formato e la composizione dei dati con cui verranno memorizzati
negli archivi elettronici;
§ livello fisico: rappresenta l’effettiva installazione negli archivi elettronici.

Livello concettuale

Livello logico

Livello fisico

Figura 8: Modellazione dei dati

Pagina 12 di 63
Corso SQL

MODELLO DATI E/R


Il modello dati concettuale è il modello di rappresentazione dei dati ad alto livello. Su questo si basa
la rappresentazione grafica, detta E/R (Entità / Relazione), che mette in evidenza le associazioni tra
le varie tabelle presenti nel database.
Lo schema E/R è costituito da tre elementi:
§ entità;
§ associazioni;
§ attributi.
Le entità sono oggetti reali e concreti che posseggono un significato proprio ed isolato. Ogni entità
diviene un tabella nel database.
Nella rappresentazione grafica un’ entità è rappresentata come un rettangolo dagli angli smussati.

Le associazioni rappresentano dei legami che uniscono più entità.


Una prima distinzione delle associazioni è che questa può essere obbligatoria oppure opzionale. La
prima viene raffigurata da una linea continua congiungente le entità, mentre la seconda con una
linea tratteggiata.
Le associazioni vengono suddivise in tre categorie principali:
§ 1:1(uno - a - uno) in cui ogni elemento del dominio corrisponde ad un solo elemento del
codominio e viceversa. La rappresentazione grafica è di seguito raffigurata:

§ 1: M(uno – a - molti) in cui ad ogni elemento del dominio appartengono più elementi del
codominio. La rappresentazione grafica è di seguito raffigurata:

§ N:M(molti – a - molti) in cui ad ogni elemento del dominio appartengono più elemento del
codominio e viceversa. Questo tipo di associazione da origine ad una nuova tabella del
database. La rappresentazione grafica è di seguito raffigurata:

Gli attributi sono le proprietà delle entità o delle associazioni. Ogni attributo diviene una colonna
della tabella. Il loro nome deve obbligatoriamente essere unico.
Questi sono caratterizzati da:
§ formato, ossia dal tipo di dato;
§ dimensione massima di caratteri o di cifre da inserire;
§ opzionalità di essere o meno valorizzato (NULL o NOT NULL).
Un attributo o un insieme di attributi che identificano in modo univoco l’entità vengono denominati
Chiavi Primarie (PRIMARY KEY).
Nell’associazione uno – a - molti, l’identificatore univoco dell’entità di partenza diviene chiave
esterna (FOREIGN KEY) dell’entità di arrivo associa ta.
Nella rappresentazione grafica, gli attributi vengono raffigurati da una linea che parte dall’entità o
dall’associazione e termina con il nome assegnato a tale attributo.

IMPIEGATO Pagina 13 di 63
Corso SQL

Data_Assunzione
Nome

OPERAZIONI RELAZIONALICodice
Le operazioni relazioni consentono di effettuare delle interrogazioni alla base di dati per estrarre
della informazioni da una tabella singola o da più tabelle combinate.

1. SELEZIONE

L’operazione di selezione estrae dalla tabella le righe che soddisfano un criterio dato,
creando una nuova relazione.

2. PROIEZIONE
L’operazione di proiezione crea una nuova relazione estraendo dalla tabella di
partenza una o più colonne corrispondenti agli attributi prefissati.

3. GIUNZIONE (JOIN)
L’operazione di giunzione serve a combinare due tabelle aventi uno o più attributi in comune,
creando una nuova relazione contenente le righe della prima tavola e le righe della seconda
tavola combinate tramite l’attributo comune.
Questo tipo di giunzione prende il nome di natural join.

Pagina 14 di 63
Corso SQL

A B
a1 b1 B C
b1 c1
a2 b2
b2 c2
a3 b3
b3 c3

T1
T2

A B C
a1 b1 c1
Esistono altri tipi di a2 b2 c2 giunzione, oltre alla natural join.
Equi join è una giunzione a3 b3 c3 che combina le due relazioni attraverso
un comparatore di uguaglianza.
Self join è una giunzione eseguita sulla tabella T1 con se stessa nel caso in cui vi siano attributi con
lo stesso dominio. In questo tipo di giunzione, la tavola deve fare l’uso di un alias, con il quale è
possibile effettuare una distinzione logica.
Outer join è una giunzione eseguita sulle tabelle T1 e T2 e vengono restituite le righe di entrambe
le tavole anche se non vi sono valori corrispettivo, oppure il valore corrispondente è uguale a
NULL. In questo caso, è necessario aggiungere i carattere
“ ( + ) ” accanto alla colonna della tavola, della quale dovranno essere restituite tutte le righe.

Teoria della normalizzazione

La normalizzazione e' una tecnica di progettazione dei database, mediante la quale si elimina la
ridondanza dei dati al fine di evitare anomalie nella loro consistenza in seguito a operazioni di
inserimento, cancellazione o modifica.
La normalizzazione viene eseguita in varie fasi al fine di ottenere una corrispondenza logica tra
ogni tabella e il singolo oggetto nella realtà. Al termine di ciascuna fase il database si trova in uno
degli stati di normalizzazione, o come si dice di solito, è in una delle "forme normali".

Prima forma normale (1FN)


Una relazione si dice in prima forma normale, se rispetta i requisiti principali di un modello
relazionale:
• le colonne non sono ripetute;
• i valori che compaiono in una colonna sono di uguale tipo;
• tutte le righe posseggono le stesse colonne;

Seconda forma normale (2FN)


Una relazione si dice in seconda forma normale se è in prima forma normale ed inoltre tutti i suoi
attributi non-chiave dipendono funzionalmente dall’intera chiave,che potrebbe essere composta.

Terza forma normale (3FN)


Una relazione si dice in terza formale se è in seconda forma normale ed inoltre nessuno dei suoi
attributi dipende in modo transitivo dalla chiave, cioè non dipende da una chiave, che a sua volta
subordinata dalla chiave primaria.
Pagina 15 di 63
Corso SQL

Pagina 16 di 63
Corso SQL

I COMANDI SQL *PLUS

SQL *Plus è l’ambiente Oracle che permette l’esecuzione dei comandi SQL e PL/SQL. L’accesso
ai dati dello schema è possibile attraverso una login e password identificativi dell’utente.

REGOLE PER I COMANDI DI SQL *PLUS

• I comandi SQL *Plus possono essere scritti in maiuscolo o in minuscolo indifferentemente.


• I comandi SQL *Plus devono essere scritti su una sola riga e se scritti su più righe, ognuna
di queste deve terminare con il simbolo “ - ”.
• I comandi SQL *Plus possono essere abbreviati.
• Non vengono memorizzati nel buffer, quindi non possono essere richiamati.
• Restano attivi fino alla chiusura della sessione di lavoro.
• Non terminano con il simbolo “ ; ”.

Di seguito verranno elencati i comandi di maggiore utilità in ambiente SQL *Plus.

COMANDO DESCRIZIONE
@path (“at”) Esegue lo specifico file di istruzioni indicato nel path
/ (“slash”) Esegue il comando SQL o il blocco PL/SQL precedentemente stilato
ACC[EPT] Legge una riga di input e la memorizza in una variabile
A[PPEND] Aggiunge uno specifico testo alla fine della riga corrente nel buffer
ATTRIBUTE Specifica la caratteristica per un dato attributo della colonna di Tipo Oggetto e
lista la corrente caratteristica per un singolo attributo o per tutti gli attributi
BRE[AK] Specifica come e dove verranno formattati i cambiamenti in un report
BTI[TLE] Posiziona e formatta uno specifico titolo in fondo ad ogni pagina di report o
lista la corrente definizione di BTITLE.
C[HANGE] Cambia il testo nella corrente linea del buffer
CL[EAR] Resetta o cancella il corrente valore
COL[UMN] Visualizza le caratteristiche di una data colonna
COMP[UTE] Calcola e stampa il totale delle linee, usando diversi standard di calcolo, su un
raggruppamento di righe selezionate
CONN[ECT] Connette un dato utente al database
COPY Copia i dati da una query in una tabella di database locale o remoto
DE[FINE] Definisce una variabile o lista il valore e il tipo di dato di una variabile
DEL Cancella una o più righe nel buffer
DESC[RIBE] Lista le specifiche di una tavola, vista o sinonimo o le specifiche di una
procedura o funzione
DISC[ONNECT] Disconnette l’utente senza uscire dall’ambiente SQL *PLUS
ED[IT] Invoca un nuovo ambiente di testo, nel quale memorizzare un file
EXEC[UTE] Esegue un singolo statement PL/SQL
EXIT o QUIT Termina la sessione di lavoro SQL *PLUS e ritorna il controllo al sistema
operativo
GET Carica un file host del sistema operativo nel buffer SQL
HELP Accede al sistema di Help di SQL *PLUS
HO[ST] Esegue un comando del sistema operativo host senza abbandonare l’ambiente
SQL *PLUS
I[NPUT] Aggiunge una o più nuove righe dopo quella corrente nel buffer
L[IST] Lista una o più righe del buffer SQL
Pagina 17 di 63
Corso SQL

PASSW[ORD] Permette di cambiare la password senza diffonderla sul dispositivo di input


PAU[SE] Visualizza una linea vuota successiva alla linea contenente testo, poi attende
che l’utente prema il tasto di Return [invio]
PRI[NT] Visualizza il corrente valore di una variabile di appoggio
PROMPT Invia lo specifico messaggio o una linea bianca sullo schermo
REM[ARK] Inizia un commento in una linea di commando
REPF[OOTER] Definisce l’intestazione a piè di pagina di una report
REPH[EADER] Definisce l’intestazione in testa alla pagina del report
R[UN] Lista ed esegue un comando SQL o un blocco PL/SQL attualmente
memorizzati nel buffer SQL
SAV[E] Salva il contenuto del buffer SQL in un file di appoggio
SET Setta una variabile di sistema che modifica l’ambiente di lavoro per la sessione
in corso
SHO[W] Visualizza il valore di una variabile del sistema SQL *PLUS o il corrente
ambiente SQL *PLUS
SPO[OL] Memorizza il risultato di una query in un file e opzionalmente lo invia ad una
stampante
STA[RT] Esegue il contenuto di uno specifico file di comandi
STORE Salva gli attributi di uno specifica ambiente SQL *PLUS in un file di
appoggio
TIMI[NG] Memorizza il valore di un periodo di tempo trascorso
TTI[TLE] Posiziona e setta uno specifico titolo come intestazione della pagina del report
UNDEF[INE] Elimina qualsiasi variabile precedentemente creata con il comando DEFINE
sia in modo esplicito che implicito
VAR[IABLE] Dichiara una variabile alla quale si può fare riferimento in PL/SQL
WHENEVER Termina la sessione di lavoro in SQL *PLUS se viene riscontrato un qualsiasi
OSERROR errore nel sistema operativo
WHENEVER Termina la sessione di lavoro in SQL *PLUS se SQL o PL/SQL genera un
SQLERROR errore
Figura 9: comandi SQL *PLUS

IL LINGUAGGIO SQL
Il linguaggio SQL (Structured Query Language) è il linguaggio standard non procedurale utilizzato
per l’interrogazione ai database relazionali. E’ un linguaggio molto semplice da comporre, ma allo
stesso tempo molto potente nell’esecuzione.
I comandi SQL si suddividono i tre categorie:

Pagina 18 di 63
Corso SQL

• DDL, (Data Definition Language) comandi per la definizione dei dati. Consente di creare
(create), modificare (alter) ed eliminare (drop) gli oggetti, di garantire (grant) e di revocare
(revoke) privilegi e ruoli.

• DML, (Data Manipulation Language) comandi per la manipolazione e l’interrogazione


dei dati. Consente di eseguire query (select), inserire (insert), cancellare (delete), aggiornare
(update) i record presenti in una tabella o di bloccare la stessa (lock).

• DCL, (Data Control Language) comandi per il controllo delle transazioni.

REGOLE PER IL LINGUAGGIO SQL

• I comandi SQL possono essere scritti su più righe;


• Non vi sono differenze di interpretazione tra caratteri maiuscoli e minuscoli;
• Il simbolo “ ; ” rappresenta l’esecuzione del comando SQL;
• I comandi SQL non possono essere abbreviati;
• Nel tool SQL *Plus i comandi vengono memorizzati in un buffer, dal quale possono essere
richiamati per una nuova esecuzione o per una modifica.

COMANDI DDL
I comandi DDL vengono utilizzati per eseguire delle specifiche operazioni quali:

§ creare, eliminare e modificare gli oggetti dello schema;


§ garantire e revocare privilegi e ruoli;
§ analizzare le informazioni su tabelle, indici e cluster.

E’ utile avere una definizione di privilegi e ruoli.


I privilegi sono dei diritti che vengono concessi agli utenti per poter eseguire del comandi SQL
all’interno del proprio schema oppure su oggetti che non appartengono all’utente. I privilegi si
suddividono in due categorie:
§ di sistema;
§ sugli oggetti.
I privilegi di sistema permettono agli utenti di svolgere delle operazioni di sistema come ad esempio
di collegarsi al database, di creare, modificare o eliminare un oggetto. Esistono, inoltre dei privilegi
di sistema di maggiore importanza che riguardano solo particolari figure, quali l’amministratore del
database e che permettono ad esempio di creare o di eliminare un utente oppure di eseguire il
backup dei dati di tutti gli utenti.
I privilegi sugli oggetti permettono agli utenti di eseguire particolari operazioni su specifici oggetti,
come ad esempio rimuovere alcune righe da una tavola.
È compito dell’amministratore, il DBA, di assegnare i privilegi ad ogni singolo utente all’atto della
sua creazione, attraverso il comando DDL grant.

I ruoli rappresentano un gruppo di privilegi sui quali a loro volta vengono garantiti dei privilegi. Ad
esempio è possibile creare un ruolo pippo, al quale corrisponde il privilegio di inserire o selezionare
dati dalla tavola comuni. Assegnando il gruppo di privilegi pippo su un nuovo utente pluto, questo
prenderà in modo automatico il privilegio di selezionare e inserire dati su una data tavola.

RUOLI PRIVILEGI DI SISTEMA E RUOLI GARANTITI


CONNECT Alter session Create cluster Create sequence
Pagina 19 di 63
Corso SQL

Create database link Create session Create view


Create synonym Create table
RESOURCE Create cluster Create procedure
Create sequence Create table
Create trigger
DBA Tutti i privilegi di sistema
Figura 10. Ruoli standard

COMANDO FUNZIONE
ALTER FUNCTION Ricompila una stored function
ALTER INDEX Ridefinisce le caratteristiche di un indice di allocazione di memoria
ALTER PACKAGE Ricompila uno stored package
ALTER PROCEDURE Ricompila una stored procedure
ALTER ROLE Modifica le autorizzazioni necessarie per accedere ad un ruolo
ALTER SEQUENCE Modifica le caratteristiche di una sequenza creata in precedenza
ALTER TABLE Modifica la struttura di una tavola:
§ aggiungendo una nuova colonna o una constraint
§ abilitando o disabilitando un constraint di integrità
§ abilitando o disabilitando un lock della tavola
ALTER TRIGGER Abilita o disabilita un trigger
ALTER TYPE Modifica un tipo di dato creato dall’utente
ALTER VIEW Ricompila una vista
COMMENT Aggiunge un commento su una colonna della tavola, su una tavola o su
una vista
CREATE FUNCTION Crea una stored function
CREATE INDEX Crea un indice per una tabella
CREATE LIBRARY Crea una libreria, con la quale SQL o PL/SQL possono richiamare dei
blocchi di programmi esterni
CREATE PACKAGE Crea la parte dichiarativa di uno stored package
CREATE PACKAGE Crea la parte body di uno stored package
BODY
CREATE PROCEDURE Crea una stored procedure
CREATE ROLE Crea un nuovo ruolo
CREATE SEQUENCE Crea un sequenza per generare valori sequenziali
CREATE SYNONYM Crea un sinonimo per un oggetto dello schema
CREATE TABLE Crea una tavola definendone le colonne e le constraint
CREATE TRIGGER Crea un trigger
CREATE TYPE Crea un nuovo tipo di dato
CREATE VIEW Crea una vista basata su una o più tabelle o su un’altra vista
DROP FUNCTION Elimina una stored function dal database
DROP INDEX Elimina un indice dal database
DROP PACKAGE Elimina uno stored package dal database
DROP PROCEDURE Elimina una stored procedure dal database
DROP ROLE Rimuove un ruolo dal database
DROP SEQUENCE Rimuove una sequenza dal database
DROP SYNONYM Rimuove un sinonimo dal database
DROP TABLE Rimuove una tavola dal database
DROP TRIGGER Rimuove un trigger dal database
DROP TYPE Rimuove un tipo di creato dall’utente dal database
Pagina 20 di 63
Corso SQL

DROP VIEW Rimuove una vista dal database


GRANT Concede un privilegio di sistema, un privilegio sugli oggetti, un ruolo
dal database
RENAME Modifica il nome di un oggetto nello schema
REVOKE Revoca privilegio di sistema, un privilegio sugli oggetti, un ruolo
TRUNCATE Elimina tutte le righe da una tabella e libera lo spazio che le righe
occupavano nelle locazioni di memoria
Figura 11: comandi DDL

Considerazioni:
Il comando di CREATE TABLE consta anche della definizione di constraint e si presenta nella
seguente forma standard:
CREATE TABLE nome_tavola
(colonna1 tipo1 [constraint1] [colonna1 tipo2 [constraint2] …. )

Dove constraint può assumere 5 valori diversi:

VALORE SIGNIFICATO
NOT NULL Impone che i valori inseriti nella colonna non abbiano valore NULL.

CONSTRAINT nome_constraint NOT NULL (nome_colonna);

PRIMARY KEY Definisce la colonna cui si riferisce come Chiave Primaria della tavola,
per cui i valori che la popoleranno dovranno essere NOT NULL e non
ripetuti.

CONSTRAINT nome_constraint PRIMARY_KEY (nome_colonna);

FOREIGN KEY Definisce la colonna cui si riferisce come Chiave Esterna della tavola,
creando un vincolo di integrità tra i dati della tavola figlia e i dati della
tavole madre.

CONSTRAINT nome_constraint FOREIGN KEY (nome_colonna)


REFERENCES nome_tavola_madre(nome_colonna_tavola_madre);

CHECK Impone che i dati inseriti nella colonna abbiano un valore presente in un
insieme di valori dati.
CONSTRAINT nome_constraint CHECK (valore1,
valore2,…valoreN);

UNIQUE Impone che i valori inseriti nella colonna siano unici nell’intera tavola.

CONSTRAINT nome_constraint UNIQUE (nome_colonna);

Figura 12: constraint

Il comando ALTER TABLE accompagnato dalla clausola MODIFY possiede la seguente sintassi:

ALTER TABLE nome_tavola

Pagina 21 di 63
Corso SQL

MODIFY (colonna tipo [constraint]);

e presenta alcune limitazioni. Infatti non è possibile:

§ modificare da NULL a NOT NULL una colonna nella quale sono presenti valori nulli;
§ aggiungere una colonna NOT NULL tranne se la tavola è vuota;
§ diminuire la grandezza della colonna tranne se la tavola è vuota;
§ cambiare il tipo di dato di una colonna tranne se la tavola è vuota.

Il comando DROP TABLE rimuove una tavola presente nel database e nell’eseguire questa
operazione bisogna tener conto che:

§ cancellando la tavola andranno perduti tutti i dati in essa contenuti e gli indici associati;
§ possiede il privilegio di cancellare la tavola solo l’utente che l’ha creata;
§ le viste associate alla tavola non verranno anch’esse eliminate, ma saranno comunque
inutilizzabili;
§ i sinonimi pubblici e privati per la tavola non verranno rimossi.

Con l’aggiunta della clausola CASCADE CONSTRAINT alla sintassi generale del comando
saranno disabilitati tutti i vincoli di integrità che la legano la tavola da rimuovere con altre tavole
dello schema.

Il comando TRUNCATE TABLE consente la rimozione di tutti i dati della tavola, mantenendone
intatta la struttura. Dal punto di vista delle prestazioni è più utile poiché evita l’uso di Rollback
Segment. È un comando che deve essere utilizzato con accuratezza in quanto, come tutti i comandi
DDL non ammette l’esecuzione del Rollback.

Riportiamo alcuni esempi che aiuteranno ad avere maggiore conoscenza dei comandi DDL.

Esempio 1
Si intende creare una tavola IMPIEGATO in una forma semplice:

CREATE TABLE impiegato (


Id_imp NUMBER( 15 ),
Nome VARCHAR2( 50 ),
Data_Assunzione DATE,
Stipendio_in_lire NUMBER ( 9 ),
Stipendio_in_euro NUMBER ( 9,2 ),
Num_reparto NUMBER( 2 ),
Livello NUMBER( 3 ),
);

Esempio 2
Si intende creare una tavola NEW_IMPIEGATO avente la stessa struttura e gli stessi dati della
tavola già presente nello schema IMPIEGATO:

Pagina 22 di 63
Corso SQL

CREATE TABLE new_impiegato AS SELECT * FROM impiegato;

si può supporre che dalla tavola origine si voglia copiare solo la struttura priva di dati, modificando
il comando in:

CREATE TABLE new_impiegato AS SELECT * FROM impiegato WHERE 1=2;

Esempio 3
Si intende creare una vista denominata V_IMP basata sulla tavola IMPIEGATO dalla quale prende
solo le colonne nome,cognome, stipendio_in_lire:

CREATE VIEW v_imp


AS SELECT nome, cognome, stipendio_in_lire FROM impiegato;

Esempio 4
Si intende modificare il nome della tavola IMPIEGATO in IMPIEGATI:

RENAME impiegato TO impiegati;


Esempio 5
Si intende creare una sequenza denominata SEQ che generi valori partendo da un minimo di 1 fino
ad un massimo di 50, con un incremento di 2:

CREATE SEQUENCE seq


START WITH 1
INCREMENT BY 2
MAXVALUE 50;

Esempio 6
Si intende modificare la tavola IMPIEGATI aggiungendo la constraint di NOT NULL sul campo
stipendio_in_lire:

ALTER TABLE impiegato


ADD CONSTRAINT sal_NN NOT NULL (stipendio_in_euro);

Esempio 7
Si intende assegnare il privilegio di inserire nuovi dati nella tavola IMPIEGATI da parte dell’utente
PIPPO:

GRANT insert ON impiegati TO pippo;

Pagina 23 di 63
Corso SQL

Pagina 24 di 63
Corso SQL

COMANDI DML
I comandi DML vengono utilizzati per interrogare il database e per manipolare i dati presenti
all’interno di tabelle o altri oggetti dello stesso.

COMANDO FUNZIONE
DELETE Rimuove alcune righe da una tabella
INSERT Inserisce nuove righe in un tabella
LOCK TABLE Blocca una tabella limitandone l’accesso da altri utenti
SELECT Seleziona i dati da righe e colonne di una tavola
UPDATE Modifica i dati presenti in una tavola
Figura 13: comandi DML

Per avere una maggiore conoscenza dei comandi fin qui elencati, riportiamo alcuni esempi.

Esempio 1
Si intende selezionare tutte le tabelle appartenenti allo schema dell’utente connesso al database:

SELECT * FROM cat;

N.B. CAT rappresenta una vista in cui sono memorizzati tutti gli oggetti appartenenti ad uno
schema.

Digitando il comando sopra indicato in ambiente SQL *Plus, si otterrà un output simile:

SQL > TABLE_NAME TABLE_TYPE


----------- -----------
IMPIEGATO TABLE
V_IMP VIEW
SEQ SEQUENCE

Esempio 2
Si intende inserire una nuovo record nella tavola IMPIEGATO:

INSERT INTO impiegato


VALUES ( 12, ‘ROSSI’, ’12-GEN-2001’ ,1500000,778.26, 30,2 ) ;

I valori da inserire devono essere posti tra apice singolo nel caso il tipo di dato della colonna in cui
devono essere inseriti sia CHAR, VARCHAR2, DATE.

Esempio 3
Si intende inserire solo alcuni campi del record nella tavola IMPIEGATO:

INSERT INTO impiegato (codice, nome,livello)


VALUES ( 12, ‘ROSSI’ ,2);

Pagina 25 di 63
Corso SQL

In questo caso è necessario elencare subito dopo il nome della tavola le colonne in cui tali dati
devono essere inseriti. L’ordine può essere anche sparso, ma vi deve essere corrispondenza tra
colonna e dato.
Se si omette l’elenco delle colonne, per default verranno considerate tutte interessate
dall’inserimento.

Esempio 4
Si intende bloccare la tabella NEW_IMPIEGATO in modalità esclusiva:

LOCK TABLE new_impiegato


IN EXCLUSIVE MODE
NO WAIT;

Il comando LOCK TABLE garantisce il blocco della tavola al fine di evitare più interventi
contemporanei sui dati della tabella che potrebbero metterne in discussione la consistenza.

Esempio 5
Si intende eliminare tutti i dati della tavola NEW_IMPIEGATO:

DELETE [FROM] new_impiegato;

Esempio 6
Si intende modificare il valore del campo stipendio_in_euro con il valore di stipendio_in_lire
moltiplicato per 1927.36 nella tavola IMPIEGATO:

UPDATE impiegato
SET stipendio_in_euro = stipendio_in_lire / 1927.36;

La sintassi generale del comando UPDATE è di seguito riportata:

UPDATE nome_tavola
SET nome_colonna1 = valore1, nome_colonna2 = valore2
[WHERE condizione];

COMANDI DCL

I comandi DCL sono utilizzati per il controllo delle transazioni.


Le transazioni sono definite come un set di istruzioni SQL che modificano il database e che Oracle
considera come unità logiche di lavoro. Una transazione ha inizio con la prima istruzione che segue
un COMMIT o un ROLLABACK e termina con un COMMIT, ROLLBACK o LOGOUT.

COMMIT
È la transazione che rende permanenti tutte le modifiche apportate ai dati fino a quel momento.
Deve quindi essere utilizzato con cura. La sintassi è

COMMIT;

SAVEPOINT

Pagina 26 di 63
Corso SQL

Identifica un punto all’interno del blocco di comandi in cui si può tornare. La sintassi è

SAVEPOINT nome_savepoint;

Ed ogni nome deve essere univoco. Una ripetizione del nome comporta l’eliminazione del primo
savepoint dichiarato. Si può fare riferimento al medesimo savepoint più volte.

ROLLBACK
Ignora tutte le modifiche effettuate sui dati del database nella corrente transazione.
La sintassi del comando ROLLBACK può essere completata dalla specifica del punto di ritorno,
SAVEPOINT:

ROLLBACK TO [SAVEPOINT] nome_savepoint;

In questo modo verranno non considerate tutte le istruzione poste tra la transazione di SAVEPOINT
e ROLLBACK.

COMANDO SELECT

Il comando SELECT permette l’interrogazione al database, selezionando determinati dati da tabelle,


viste o altri oggetti della base di dati. Per poter eseguire questo comando è necessario averne il
privilegio.
La sintassi di tale comando è molto semplice:

SELECT colonna1, colonna2, colonnaN FROM nome_tabella [WHERE condizione];

dove:
§ colonna1, colonna2, colonnaN rappresentano i campi della tabella che si intende
visualizzare come risultato della query. Questo elenco è detto select list ;
§ nome_tabella indica l’oggetto dello schema dal quale si selezioneranno i dati;
§ condizione è un facoltativo criterio di ricerca dei dati. La clausola WHERE potrebbe essere
omessa.

La semplice forma base del comando può essere sviluppata con l’ausilio di numerose clausole e
parole chiave.

DISTINCT
Restituisce solo una copia per ogni serie di righe selezionate che risultano duplicate. Nell’ordine
sintattico, questa clausola viene posta prima della select list e riguarderà tutti i campi elencati.
SELECT DISTINCT select list FROM nome_tavola[WHERE condizione];

ALL
Restituisce tutte le righe selezionate, anche quelle che presentano valori duplicati

* (asterisco)
Clausola che sostituisce l’elencazione di tutti i campi di una tavola nella select list.

SELECT * FROM nome_tavola [WHERE condizione];

Pagina 27 di 63
Corso SQL

La clausola “ * ” può fare riferimento anche a tutte le colonne di una singola tabella, nel caso in
cui nella clausola FORM siano elencate più tabelle dalle quali ricavare i dati, utilizzando la
notazione puntata.

SELECT nome_tavola1.*, nome_tavola2.colonna1


FROM nome_tavola1, nome_tavola2 [WHERE condizione];

FROM
La clausola FORM determina la tavola o le tavole dalle quali verranno estratti i valori. Le tavole in
questione possono essere rinominate momentaneamente attraverso degli alias posti subito dopo il
nome dell’oggetto nella clausola FORM.

WHERE
La clausola WHERE agisce da filtro sulle righe di una o più tavole, poiché consente la selezione
delle sole righe che soddisfano la condizione che questa clausola esprime.
Nella clausola WHERE di un comando SELECT gli operandi possono essere di vari tipi:
§ una colonna di una tavola;
§ una costante numerica;
§ una costante alfanumerica;
§ una data;
§ una espressione;
§ una subquery.

Gli operandi verranno confrontati tramite i seguenti operatori:

OPERATORE SIGNIFICATO
!= oppure <> Diverso da
= Uguale a
> Maggiore di
>= Maggiore o uguale a
< Minore di
<= Minore o uguale a
IN Contenuto in una lista di valori
LIKE Coincidente ad un modello o pattern di ricerca
IS NULL Valore uguale a NULL
BETWEEN Compreso in un range i valori
EXISTS Valore booleano che assume TRUE se viene restituito almeno un
valore dalla subquery
Figura 14: operatori di confronto

Se il confronto viene effettuato tra operandi con tipo diverso, Oracle tenterà una conversione
implicita. Ma non sempre questa operazione è consentita, motivo per cui è necessario prestare
maggiore attenzione ai tipi comparati.

È necessario tenere conto anche della precedenza, ossia dell’ordine con cui Oracle eseguirà una
serie di diversi operatori presenti nella stessa espressione.

OPERATORE OPERAZIONE
+,- Identità, negazione
*, / Moltiplicazione, divisione
Pagina 28 di 63
Corso SQL

+, -, || Addizione, sottrazione, concatenazione


=, !=, <, >, <=, >=, IS NULL, LIKE, Comparazione
BETWEEN, IN
NOT Negazione
AND Congiunzione
OR Disgiunzione
Figura 15: Tabella delle precedenze

OPERATORE IN
L’operatore IN consente di selezionare da una tabella le righe, i cui valori rientrano in una lista data.
Es.
SQL > SELECT nome, data_assunzione
FROM impiegato
WHERE id_imp IN ( 7844,7368) ;

L’output del comando SELECT corrisponderà a:

SQL > NOME DATA_ASSUNZIONE


---------- ----------------
SMITH 08-SET-81
TURNER 17-DIC-80

OPERATORE LIKE
L’operatore LIKE è un particolare operatore che permette la selezione da una tabella di righe che
soddisfano un certo pattern o modello. Il pattern deve essere composto da caratteri alfanumerici che
possono essere completati da “ caratteri JOLLY ”:

• _ (underscore) : sostituisce un solo carattere

• % (percentuale): sostituisce una stringa di caratteri


Es.
SQL > SELECT id_imp, nome
FROM impiegato
WHERE nome LIKE ‘S%’;

L’output del comando SELECT corrisponderà a:

SQL > ID_IMP NOME


------ ------
7788 SCOTT
7368 SMITH

Es.
SQL > SELECT id_imp, nome
FROM impiegato
WHERE nome LIKE ‘_I%’;

L’output del comando SELECT corrisponderà a:

Pagina 29 di 63
Corso SQL

SQL > ID_IMP NOME


------ ------
7839 KING
7934 MILLER

OPERATORE BETWEEN
L’operatore BETWEEN consente di selezionare da una tabella dei dati, il cui valore è compreso in
un insieme predefinito. Nel confronto, sono inclusi gli estremi.
Es.
SQL > SELECT id_imp, nome, stipendio_in_lire
FROM impiegato
WHERE stipendio_in_lire BETWEEN 2000000 AND 2500000;

L’output del comando SELECT corrisponderà a:

SQL > ID_IMP NOME STIPENDIO_IN_LIRE


------ ------ -----------------
7839 KING 2200000
7654 ALLEN 2340000

OPERATORE IS NULL
L’operatore IS NULL seleziona una riga da una tabella solo se il suo operando possiede valore
NULL.

Es.
SQL > SELECT id_imp, nome, stipendio_in_euro
FROM impiegato
WHERE stipendio_in_euro IS NULL;

L’output dell’istruzione SELECT sarà:

SQL > ID_IMP NOME STIPENDIO_IN_EURO


---------- ----------- -----------------
7788 SCOTT
7368 SMITH
7844 TURNER
7654 MARTIN
7934 MILLER

OPERATORE ANY
L’operatore ANY restituisce il valore logico TRUE se viene restituita almeno una riga dal comando
di SELECT.

Es.
SQL > SELECT id_imp, nome, stipendio_in_lire
Pagina 30 di 63
Corso SQL

FROM impiegato
WHERE stipendio_in_lire < ANY(SELECT stipendio_in_lire
FROM impiegato
WHERE livello = 1) ;

L’output dell’istruzione SELECT sarà:

SQL > ID_IMP NOME STIPENDIO_IN_LIRE


---------- ----------- -----------------
7369 SMITH 1750000
7844 TURNER 1780000
7934 MILLER 1580000

OPERATORI NEGATIVI
Gli operatori fin qui elencati possono anche avere la funzione di negare una condizione al fine di
estrarre da una tavola le righe che non soddisfano il criterio di ricerca dato.

OPERATORE NEGATIVO SIGNIFICATO


!= Diverso da
<> Diverso da
NOT IN Non presente in un elenco di valori
IS NOT NULL Valore diverso da NULL
NOT LIKE Non soddisfacente un pattern dato
Figura 16: operatori negativi

OPERATORI LOGICI
Gli operatori logici vengono utilizzati per legare tra loro due condizioni all’intero di una clausola
WHERE.

Operatore Significato
AND Congiunzione di due elementi.
OR Disgiunzione di due elementi.
NOT Negazione di un elemento
Figura 17: operatori logici

L’operatore logico AND impone che siano soddisfatte entrambe le condizioni collegate perché
vengano selezionate le righe da una tavola, mentre l’operatore logico OR permette la selezione
anche se è solo una o l’altra condizione ad essere verificata.

Es.
SQL > SELECT nome, stipendio_in_lire
FROM impiegato
WHERE nome LIKE ‘_M%’ AND stipendio_in_lire=1750000;

SQL > NOME STIPENDIO_IN_LIRE


-------------- ------------------
SMITH 1750000

Es.
SQL >SELECT id_imp, nome
Pagina 31 di 63
Corso SQL

FROM impiegato
WHERE id_imp =7788 OR nome LIKE ‘M%’;

SQL > ID_IMP NOME


------ --------
7788 SCOTT
7654 MARTIN
7934 MILLER

CLAUSOLA ORDER BY
La clausola ORDER BY consente una visualizzazione ordinata in modo crescente o decrescente
delle righe estratte da una tavola in base ad un attributo della stessa. L’ordine di default è il
crescente. Per modificarlo, è necessario digitare la parola-chiave DESC dopo il nome della colonna
di riferimento.

Es.
SQL > SELECT id_imp, nome, data_assunzione
FROM impiegato
ORDER BY id_imp;

SQL > ID_IMP NOME DATA_ASSUNZIONE


---------- ---------- ----------------
7369 SMITH 17-DIC-80
7654 MARTIN 28-SET-81
7654 ALLEN 20-FEB-81
7788 SCOTT 09-DIC-82
7839 KING 17-NOV-81
7844 TURNER 08-SET-81
7934 MILLER 23-GEN-82

Es.
SQL > SELECT id_imp, nome, data_assunzione
FROM impiegato
ORDER BY id_imp DESC;

SQL > ID_IMP NOME DATA_ASSUNZIONE


---------- ---------- ----------------
7934 MILLER 23-GEN-82
7844 TURNER 08-SET-81
7839 KING 17-NOV-81
7788 SCOTT 09-DIC-82
7654 ALLEN 20-FEB-81
7369 MARTIN 28-SET-81
7369 SMITH 17-DIC-80

CLAUSOLA GROUP BY
Pagina 32 di 63
Corso SQL

La clausola GROUP BY raggruppa le righe selezionate e ritorna una sola riga riassuntiva. Ogni
singolo è basato su un valore specificato nella clausola GROUP BY.
Se un comando SELECT contiene una GROUP BY, la select list può contenere solo i segue nti tipi
di espressione:

§ costanti
§ funzioni di gruppo
§ valori che vengono richiamati nella GROUP BY.

CLAUSOLA HAVING
La clausola HAVING viene utilizzata come restrizione dei gruppi di righe raggruppati dalla
clausola GROUP BY secondo un dato criterio. Oracle elabora un comando SELECT contenente le
clausole WHERE, GROUP BY, HAVING nel seguente modo:

1. se il comando possiede una clausola WHERE, vengono eliminate tutte le righe non
soddisfacenti la condizione;
2. Oracle calcola e definisce i gruppi espressi dalla GROUP BY;
3. Oracle rimuove tutti i gruppi che non rispettano quanto il criterio di ricerca dichiara.

La clausola HAVING ha significato simile alla clausola WHERE, ma riguarda solo i


raggruppamenti.

Pagina 33 di 63
Corso SQL

PSEUDOCOLONNE
Una pseudocolonna si comporta come una vera e propria colonna del database, pur non essendo,
poiché non è memorizzata all’interno del database. Su queste colonne è possibile effettuare solo il
comando di SELECT; i valori contenuti non possono essere inseriti, cancellati o modificati.

Oracle prevede 4 pseudocolonne:


§ CURRVAL e NEXTVAL;
§ LEVEL;
§ ROWID;
§ ROWNUM.

CURRVAL e NEXTVAL
Le pseudocolonne CURRVAL e NEXTVAL vengono utilizzate solo per estrarre valori dall’oggetto
SEQUENCE. CURRVAL corrisponde al valore corrente che la sequenza ha restituito, mentre
NEXTVAL corrisponde al valore successivo che la sequenza restituirà.
La sintassi per ritrarre valori dalle pseudocolonne sono rispettivamente:

SELECT nome_sequenza.CURRVAL FROM DUAL;


SELECT nome_sequenza.NEXTVAL FROM DUAL;

La selezione dei valori delle pseudocolonne CURRVAL e NEXTVAL appartenenti ad un altro


utente, è possibile solo se si possiede il privilegio di SELECT ANY SEQUENCE.
Queste pseudocolonne hanno validità anche come valore da inserire in un comando INSERT:

INSERT INTO nome_tavola (colonna1, colonna2)


VALUES(nome_sequenza.nexval, valore2);

LEVEL
La pseudocolonna LEVEL viene utilizzata nelle query gerarchiche, ritornando valore 1 per il nodo
appartenente al nodo radice, in una struttura indicativa simile ad uno schema ad albero. Il valore
ritornato aumenta, se aumenta il numero di nodi che intercorrono tra il nodo radice e quello
corrente.

ROWID
La pseudocolonna ROWID identifica l’indirizzo della riga con un valore esadecimale. È composto
da informazioni sulla riga stessa:
§ segmento di base;
§ file di dati che contiene la tupla, riferito alla tablespace;
§ blocco di dati, che contiene la tupla;
§ la tupla nel blocco.

L’uso della pseudocolonna ROWID ritorna utile per:


§ un veloce e facile accesso alla singola riga;
§ visualizzare come le righe sono memorizzate nella tavola;
§ identificare in modo univoco le righe nella tavola.

Es.
SQL > SELECT ROWID,nome FROM impiegato WHERE id_imp<7788;

SQL > ROWID NOME


Pagina 34 di 63
Corso SQL

-------------------- -------
AAANQTAAeAAAEtjAAC SMITH
AAANQTAAeAAAEtjAAE MARTIN
AAANQTAAeAAAEtjAAG ALLEN

ROWNUM
Per ogni riga ritornata da una query, la pseudocolonna ROWNUM ritorna un valore numerico
ordinato con cui Oracle ha selezionato le righe da una tavola o da una giunzione tra tavole.

Es.
SQL > SELECT ROWNUM,nome FROM impiegato WHERE id_imp<7788;

SQL > ROWNUM NOME


--------- -------
1 SMITH
2 MARTIN
3 ALLEN
FUNZIONI IN SQL
Le funzioni SQL standard sono simili agli operatori in quanto manipolano una dato al fine di
ottenere un valore di ritorno, ma differiscono nella forma in cui si presentano. La forma base di una
funzione SQL è:

nome_funzione(argomento1, argomento2, … , argomentoN )

Una funzione possiede viene utilizzata per:

§ eseguire calcoli sui dati;


§ manipolare singolarmente i dati;
§ manipolare l’output per gruppo di righe;
§ modificare il formato di visualizzazione di una data o una stringa;
§ cambiare il tipo di dato.

Il linguaggio SQL possiede varie funzioni, che vengono classificate in base al tipo di dato che
restituiscono:

§ di stringa
§ numeriche
§ di data

o in base al loro utilizzo:

§ di conversione
§ generali
§ di gruppo

Tutte le funzioni fin qui elencate, tranne le funzioni di gruppi hanno il comune la caratteristiche di:

§ agire su ogni singola riga ritrovata dalla query;


§ restituire un risultato per ogni riga;
§ accettare uno o più argomenti;
§ poter essere ovunque in una istruzione SQL, come una colonna, un valore o un’espressione;
Pagina 35 di 63
Corso SQL

§ poter essere innestate.

Da annotare che il valore calcolato viene estratto con un comando SELECT da una tavola generica
con nome DUAL. Questa tabella viene creata automaticamente da Oracle nel data dictionary ed è
accessibile a tutti gli utenti.

FUNZIONI DI STRINGA

Vengono applicate su ogni singola riga. Il valore di input è di tipo carattere e il valore di ritorno può
essere sia carattere sia numerico.
Se la lunghezza del valore ritornato supera il limite di 2000 byte per il tipo CHAR e di 4000 byte
per il tipo VARCHAR2, il risultato verrà troncato senza esprimere nessun messaggio di errore.
Di seguito sono riportate le funzioni di maggiore utilizzo.

CHR
CHR (n)

Ritorna il carattere avente codice ASCII corrispettivo al numero che viene passato
come argomento.

SQL > SELECT CHR(75) FROM DUAL;

SQL > CHR(75)


-----------
K

CONCAT
CONCAT(stringa1, stringa2)

Ritorna una nuova stringa risultante dalla concatenazione delle stringhe in input. È
l’equivalente del simbolo di concatenazione “ || ”.
SQL > SELECT CONCAT(CONCAT(nome,‘ è stato assunto in
data’),data_assunzione)
FROM impiegato;

SQL > CONCAT(CONCAT(nome,‘ è stato assunto in data ’),


data_assunzione)
--------------------------------------------------------
KING è stato assunto in data 17/11/1981
SCOTT è stato assunto in data 09/12/1980
SMITH è stato assunto in data 17/12/1980
TURNER è stato assunto in data 08/09/1981
MARTIN è stato assunto in data 28/09/1981
MILLER è stato assunto in data 23/01/1982
ALLEN è stato assunto in data 20/02/1981

INITCAP
INITCAP(stringa)

Pagina 36 di 63
Corso SQL

Restituisce il primo carattere di ogni parola presente nell’argomento stringa in formato


maiuscolo, tralasciando invariato il resto della stringa.

SQL > SELECT INITCAP( ‘funzione initcap’ ) FROM DUAL;

SQL > INITCAP( ‘funzione initcap’)


------------------------------
Funzione Initcap

LOWER
LOWER(stringa)

Restituisce l’argomento di input con tutte le lettere in formato minuscolo.

SQL > SELECT LOWER( ‘FUNZIONE LOWER’ ) FROM DUAL;

SQL > LOWER( ‘FUNZIONE LOWER’ )


---------------------------
funzione lower

REPLACE
REPLACE (colonna/stringa, stringa_da_trovare[, stringa_da_sostituire] )

Restituisce un valore di tipo carattere in cui ogni occorrenza di stringa_da_trovare,


viene sostituita con stringa_da_sostituire. Se quest’ultima viene omessa oppure
possiede valore NULL, allora i caratteri corrispondenti a stringa_da_trovare vengono
rimossi. Se stringa_da_trovare possiede valore NULL oppure non vengono riscontrati
valori, allora la funzione restituirà l’intera stringa espressa come primo argomento.

SQL > SELECT REPLACE( ‘FUNZIONE REPLACE’, ‘E’, ‘M’ )


FROM DUAL;

SQL > REPLACE( ‘FUNZIONE REPLACE’, ‘E’, ‘M’ )


------------------------------------------
FUNZIONM RMPLACM

SUBSTR
SUBSTR(colonna/valore, m[, n])

Restituisce una porzione della stringa espressa come primo argomento della
funzione, partendo dal carattere posto in posizione m per una lunghezza totale di n
caratteri. Se m equivale a valore 0, viene comunque considerato come valore 1. Se
m è positivo, Oracle conta il numero di posizioni dall’inizio della stringa fin quando
non trova il carattere. Se m è negativo, Oracle conta a ritroso fino alla fine della
stringa. Se n è omesso, verrà restituita l’intera stringa, mentre se n è minore di 1,
verrà ritornato va lore NULL.

SQL > SELECT SUBSTR( ‘FUNZIONE SUBSTR’, 10, 6 ) FROM DUAL;

Pagina 37 di 63
Corso SQL

SQL > SUBSTR( ‘FUNZIONE SUBSTR’, 10, 6 )


------------------------------------------
SUBSTR

SQL > SELECT SUBSTR( ‘FUNZIONE SUBSTR’, -12, 4 ) FROM DUAL;

SQL > SUBSTR( ‘FUNZIONE SUBSTR’, -12, 4 )


------------------------------------------
ZION

TRANSLATE
TRANSLATE(colonna/valore, sorgente, destinazione)

Restituisce la stringa con tutte le occorrenze di ogni carattere sorgente sostituito dal
corrispondente carattere destinazione che si trova nella stessa posizione .
L’argomento sorgente può contenere più caratteri rispetto a destinazione. In questo
caso, i caratteri in eccesso non avranno corrispondenti caratteri destinazione e
verranno rimossi dal valore risultante. Se la stringa destinazione è vuota, rimuoverà
tutti i caratteri di sorgente, poiché Oracle interpreterà la stringa come NULL.
Ritornerà valore NULL.

SQL > SELECT TRANSLATE( ‘FUNZIONE TRANSLATE’, ‘AEIOU’, ‘12345’ )


FROM DUAL;

SQL > TRANSLATE( ‘FUNZIONE TRANSLATE’, ‘AEIOU’, ‘12345’ )


------------------------------------------------------
F5NZ34N2 TR1NSL1T2

UPPER
UPPER(stringa)

Restituisce l’argomento di input stringa con tutte le lettere in formato maiuscolo.

SQL > SELECT UPPER( ‘funzione upper’ ) FROM DUAL;

SQL > UPPER( ‘funzione upper’ )


------------------------------------------
FUNZIONE UPPER

Esistono funzioni SQL che pur essendo funzioni di stringa restituiscono valori di tipo numerico.

ASCII
ASCII(carattere)

Restituisce il corrispettivo valore del codice ASCII di carattere, argomento che deve
avere una lunghezza obbligatoria di 1, altrimenti verrà considerato ai fini del risultato
Pagina 38 di 63
Corso SQL

solo il primo carattere.

SQL > SELECT ASCII( ‘S’ ) FROM DUAL;

SQL > ASCII( ‘S’ )


--------------
83

INSTR
INSTR (colonna/valore, carattere)

Restituisce il valore numerico della posizione dell’argomento carattere all’interno della


stringa in esame rappresentata da colonna/valore.

SQL > SELECT INSTR( ‘Funzione INSTR’, ‘T’ ) FROM DUAL;

SQL > INSTR( ‘Funzione INSTR’, ‘T’ )


------------------------------
13

LENGTH
LENGTH(colonna/valore)

Restituisce il valore numerico della lunghezza del valore in input colonna/valore.

SQL > SELECT LENGTH( ‘FUNZIONE LENGTH’ ) FROM DUAL;

SQL > LENGTH( ‘FUNZIONE LENGTH’ )


-----------------------------
15

FUNZIONI DI DATA

Le funzioni di data operano con valori di tipo DATE. Tutte le funzioni di data ritornano valori di
tipo DATE, tranne la MONTHS_BETWEEN che ritorna un valore numerico.

Oracle dispone di una funzione che permette di ottenere in output il valore corrente della data e del
tempo, espresso in ore, minuti e secondi. Tale funzione è SYSDATE.

ADD_MONTHS
ADD_MONTHS(data, n)

Restituisce la data posta come primo argomento della funzione incrementata di n


mesi. L’argomento n può essere solo un numerico intero.

SQL > SELECT ADD_MONTHS( SYSDATE, 5 ) FROM DUAL;

SQL > ADD_MONTHS( SYSDATE, 5 )

Pagina 39 di 63
Corso SQL

--------------------------------
19-MAG-02

LAST_DAY
LAST_DAY(data)

Restituisce la data espressa in formato ‘DD-MON-YY’ corrispondente all’ultimo


giorno del mese riportato nell’argomento data.

SQL > SELECT LAST_DAY(‘19-NOV-01‘ ) FROM DUAL;

SQL > LAST_DAY(‘19-NOV-01‘ )


------------------------------
30-NOV-01

MONTHS_BETWEEN
MONTHS_BETWEEN(data1, data2)

Restituisce il numero dei mesi intercosi tra le due date che rappresentano gli
argomenti della funzione. Se il valore di data1 risulta posticipata rispetto a data2, il
valore risultante sarà positivo; se anticipata, negativo. Se data1 e data2
rappresentano lo stesso giorno nel mese o sono entrambi l’ultimo giorno del mese, si
avrà come soluzione sempre un valore numerico intero. L’output potrebbe essere
espresso some valore frazionario, poiché Oracle considera ogni mese basato su 31
giorni.

SQL > SELECT MONTHS_BETWEEN(‘19-NOV-01‘, ’16-OTT-01’ )


FROM DUAL;

SQL > MONTHS_BETWEEN(‘19-NOV-01‘, ’16-OTT-01’ )


------------------------------------------
1,09677419

SQL > SELECT MONTHS_BETWEEN(‘19-NOV-01‘, ’19-OTT-01’ )


FROM DUAL;

SQL > MONTHS_BETWEEN(‘19-NOV-01‘, ’19-OTT-01’ )


---------------------------------------------
1

NEXT_DAY
NEXT_DAY(data, stringa)

Restituisce il primo giorno posticipato alla data rappresentata dall’argomento data


e avente come nome la stringa dichiarata dal secondo argomento della funzione.
Tale stringa deve essere digitata nel formato di lingua con cui il database è stato
installato e può essere esposta anche in forma abbreviata. Qualsiasi carattere
che seguirà il nome logico del giorno verrà ignorato da Oracle.
Pagina 40 di 63
Corso SQL

SQL > SELECT NEXT_DAY(‘19-NOV-01‘, ‘lunedì’ ) FROM DUAL;

SQL > NEXT_DAY(‘19-NOV-01‘, ‘lunedì’ )


-----------------------------------
26-NOV-01

ROUND
ROUND(data[, formato] )

Ritorna la data arrotondata all’unità rappresentata dall’argomento facoltativo formato.


Se tale argomento è omesso, la funzione restituisce il giorno prossimo.

SQL > SELECT ROUND(‘19-NOV-01‘, ‘MONTH’ ) FROM DUAL;

SQL > ROUND(‘19-NOV-01‘, ‘MONTH’ )


-------------------------
01-DIC-01

SYSDATE
SYSDATE

È una funzione che non richiede argomenti, che ritorna il valore corrente della data e
dell’orario espresso in ore, minuti e secondi.

SQL > SELECT SYSDATE FROM DUAL;

SQL > SYSDATE


---------
19-NOV-01

TRUNC
TRUNC(data[, formato] )

Restituisce l’output di data con il valore troncato secondo l’unità di tempo prescelta e
dichiarata dall’argomento formato. Se tale argomento viene omesso la data è
troncata al giorno successivo. Questa funzione necessita di una conversione in tipo
DATE del valore da troncare.

SQL > SELECT TRUNC(TO_DATE(‘19-NOV-01’), ‘ YEAR ’)


FROM DUAL;

SQL > TRUNC( ‘19-NOV-01’, ‘YEAR’)


------------------------------
01-GEN-01

Pagina 41 di 63
Corso SQL

La tabella seguente può essere di riferimento per il formato da utilizzare nelle funzioni di data
ROUND e TRUNC.

FORMATO SIGNIFICATO
YEAR Anno
YYYY
MONTH Mese
MON
MM
WW Stesso girono della settimana come il primo girono dell’anno
W Giorno della settimana uguale al primo girono del mese
DDD Giorno
DD
J
DAY Giorno di inizio della settimana
DY
D
HH Ore
HH12
HH24
MI Minuti
Figura 18: tabella formato funzioni TRUNC e ROUND

FUNZIONI NUMERICHE
Le funzioni numeriche accettano in ingresso valori numerici e restituiscono dati di tipo NUMBER
con un massimo di 38 cifre. Questo perché il tipo di dato NUMBER prevede una lunghezza
massima di 38 valori.
Esistono comunque funzioni quali COS, LOG, SIN che consentono risultato con un totale di 36
cifre, oppure ACOS, ATAN che ne ammettono 30.

ABS
ABS(n)

Ritorna il valore assoluto dell’argomento n.

SQL > SELECT ABS(-25) FROM DUAL;

SQL > ABS( -25)


------------
25

ACOS
ACOS(n)

Ritorna il valore numerico dell’arco coseno di n. Accetta in ingresso valori compresi


tra –1 e 1e restituisce un risultato compreso tra 0 e π espresso in radianti.

Pagina 42 di 63
Corso SQL

SQL > SELECT ABS(-25) FROM DUAL;

SQL > ACOS( -0.6)


-------------------
2,21429744

ASIN
ASIN(n)

Ritorna il valore numerico dell’arco seno di n . Accetta in ingresso valori compresi tra
–1e 1 e restituisce valori compresi tra - π / 2 e π / 2 espresso in radianti.

SQL > SELECT ASIN(0.6) FROM DUAL;

SQL > ASIN(0.6)


-----------
0,643501109
ATAN
ATAN(n)

Ritorna il valore dell’arco tangente di n. Accetta in input qualsiasi valore numerico e


restituisce un valore compreso tra - π / 2 e π / 2 .

SQL > SELECT ATAN(10) FROM DUAL;

SQL > ATAN(10)


----------
1,47112767

CEIL
CEIL(n)

Restituisce un arrotondamento al prossimo valore intero di n.

SQL > SELECT CEIL(25.0369) FROM DUAL;

SQL > CEIL(25.0369)


-------------
26

COS
COS(n)

Ritorna il valore del coseno di un angolo di ampiezza n, il quale deve essere espresso
in radianti.

SQL > SELECT COS(45) FROM DUAL;

SQL > COS( 45)


-----------
0,525321989
Pagina 43 di 63
Corso SQL

EXP
EXP(n)

Ritorna il valore di e elevato alla potenza n, considerando e = 2.71828183 ...

SQL > SELECT EXP (5) FROM DUAL;

SQL > EXP ( 5)


----------
148,413159

FLOOR
FLOOR(n)

Ritorna l’arrotondamento per difetto al primo intero minore di n.

SQL > SELECT FLOOR(2.525) FROM DUAL;

SQL > FLOOR( 2.525)


-------------------
2

LN
LN(n)

Ritorna il valore numerico del logaritmo naturale di n , con n maggiore di 1.

SQL > SELECT LN(10) FROM DUAL;

SQL > LN(10)


-----------
2,30258509

LOG
LOG(m,n)

Ritorna il valore numerico del logaritmo di n in base m. Quest’ultimo può accettare


qualsiasi intero positivo diverso da 0 o 1, mentre n può assumere qualsiasi intero
positivo.

SQL > SELECT LOG(2,6) FROM DUAL;

Pagina 44 di 63
Corso SQL

SQL > LOG( 2,6)


---------
2,5849625

MOD
MOD(m,n)

Restituisce il resto intero, ottenuto dalla divisione tra i valori m e n. Restituirà m se il n


è uguale a 0.

SQL > SELECT MOD(45,9) FROM DUAL;

SQL > MOD( 46,9)


-----------------
1

POWER
POWER(m,n)

Restituisce il valore di m elevato alla potenza n. I due argomenti della funzione


possono assumere qualsiasi numero; se m è negativo, n deve essere un intero.

SQL > SELECT POWER(6,2) FROM DUAL;

SQL > POWER(6,2)


----------------
36
ROUND
ROUND(n[ , m] )

Restituisce il valore di n arrotondato alla m posizione a destra del separatore


decimale. Se ad m è attribuito valore negativo, l’arrotondamento verrà effettuato a
sinistra del separatore. Il valore che m può assumere deve rientrare nel dominio dei
numeri positivi. L’argomento m potrebbe essere omesso; in tal caso l’arrotondamento
verrà effettuato al valore intero.

SQL > SELECT ROUND(29.653) FROM DUAL;

SQL > ROUND(29.653, 2)


------------------------
29.65

SIGN
SIGN(n)

Restituisce tre possibili valori:


§ -1 , se n <0;
§ 0 , se n =0;
§ 1 , se n >0;
Pagina 45 di 63
Corso SQL

SQL > SELECT SIGN(-27) FROM DUAL;

SQL > SIGN(-27)


-----------------
-1

SIN
SIN(n)

Restituisce il valore del seno di un angolo di ampiezza n, che deve essere espressa in
radianti.

SQL > SELECT SIN(45) FROM DUAL;

SQL > SIN(45)


-----------------
0,850903525

SQRT
SQRT(n)

Restituisce il valore della radice quadrata di n. L’argomento non può assumere valore
negativo.

SQL > SELECT SQRT(25) FROM DUAL;

SQL > SQRT(25)


-------------
5

TAN
TAN(n)

Ritorna il valore della tangente di un angolo di ampiezza n, espressa in radianti.

SQL > SELECT TAN(90) FROM DUAL;

SQL > TAN(90)


----------------
-1,9952004

TRUNC
TRUNC(n [ , m] )

Restituisce il valore dell’argomento n troncato alla posizione m. Il valore di m può


anche essere omesso; in tal caso n verrebbe troncato al valore intero.

SQL > SELECT TRUNC(27.364) FROM DUAL;


Pagina 46 di 63
Corso SQL

SQL > TRUNC(27.364)


----------------------
27
FUNZIONI DI CONVERSIONE

Le funzioni di conversione vengono utilizzate per cambiare il tipo di dato di un valore. Queste
sono conversioni esplicite, poiché richieste dall’utente.
Alcune funzioni di conversione richiedono un formato di modello, nel quale si intende rinnovare la
visualizzazione del dato. Un formato di modello è un carattere che descrive il formato del valore di
tipo DATE o NUMBER da memorizzare come valore di tipo carattere. Il formato modello viene
genericamente utilizzato come argomento nelle funzioni di conversione TO_CHAR oppure
TO_DATE al fine di:

• specificare il formato che Oracle usa per ritornare un valore dal database;
• specificare il formato per un valore che si intende memorizzare nel database.

Le principali funzioni di conversione verranno di seguito trattate.

TO_CHAR -conversione da tipo DATE-


TO_CHAR(data[, formato] )
Converte un valore di tipo DATE in un carattere, secondo il formato specificato come
secondo argomento della funzione.

FORMATO SIGNIFICATO
D Valore della cifra giorno nella settimana
DD Valore della cifra giorno nel mese
DAY Nome completo del giorno espresso su una lunghezza massima di 9 caratteri
DY Nome abbreviato del giorno
HH Ora del giorno (1-12)
HH12 Ora del giorno (1-12)
HH24 Ora del giorno (0-23)
MI Valore dei minuti (0-59)
MM Valore della cifra del mese nell’anno
MON Nome abbreviato del mese
MONTH Nome completo del mese espresso su una lunghezza massima di 9 caratteri
RRRR Valore dell’anno arrotondato. Può essere su 2 o 4 cifre
SS Secondi in un minuto (0-59)
YY Valore dell’anno espresso su 2 cifre
YYYY Valore dell’anno espresso su 4 cifre
Figura 19: formato data

SQL > SELECT TO_CHAR( ‘19-NOV-01’, ‘DD/MONTH/YYYY’)


FROM DUAL;

SQL > TO_CHAR( ‘19-NOV-01’, ‘DD/MONTH/YYYY’)


----------------------------------------------
19-NOVEMBRE-2001

Pagina 47 di 63
Corso SQL

TO_CHAR - conversione da tipo NUMBER –


TO_CHAR(colonna / valore[, formato [ , parametro ]] )

Converte un valore di tipo NUMBER in un valore di tipo CHAR o VARCHAR2. L’argomento


parametro quali caratteri devono essere ritornati dal formato scelto:
§ caratteri decimali;
§ separatori di gruppo;
§ simbolo monetario locale;
§ simbolo monetario internazionale.
Se questo valore è omesso, Oracle prenderà in considerazione il default di sistema.

Anche questa conversione richiede un formato di modello.

FORMATO ESEMPIO SIGNIFICATO


9 9999 Ritorna il valore con un numero di cifre pari a quelle espresse nel
formato
0 0999 Ritorna il valore con cifra 0 anteposta o posposta al numero
$ $9999 Ritorna il valore anteposto dal simbolo del dollaro
L L9999 Ritorna il valore anteposto dal simbolo di moneta locale
S S9999 Ritorna il valore anteposto dal segno positivo o negativo
D 99D999 Ritorna il valore con il separatore di decimali ( . )posto nella specifica
posizione D.
G 99G99 Ritorna il valore con il separatore di gruppo nella specifica posizione
G.
, (virgola) 99,99 Ritorna il valore con il simbolo , (virgola) nella posizione specificata.
. (punto) 99.99 Ritorna il valore con il simbolo . (punto) nella posizione specificata.
V 99V99 Ritorna il valore moltiplicato per 10n , dove n rappresenta il numero di
cifre poste dopo il simbolo V.
EEEE 9.9EEE Ritorna il valore visualizzato con notazione scientifica.
MI 9999MI Ritorna il valore seguito da simbolo negativo ( - ).
Formato 20: elementi formato numerico

Es.
SQL > SELECT TO_CHAR (127.63, ‘L9999’ ) FROM DUAL;

SQL > TO_CHAR (127.63, ‘L9999’ )


---------------------------
L.128

Es.
SQL > SELECT TO_CHAR (127.63, ‘$999,999.999’ ) FROM DUAL;

SQL > TO_CHAR (127.63, ‘L9999’ )


-------------------------------
$127.630

Pagina 48 di 63
Corso SQL

TO_DATE
TO_DATE(colonna / valore [ , formato [ , parametro]] )

La funzione di conversione TO_DATE converte un valore di tipo CHAR o VARCHAR2 in un


valore di tipo DATE. Omettendo l’argomento formato nella funzione verrà eseguita una
conversione nel formato di default di Oracle ‘ DD-MON-YY ’.
I formati possibili sono stati rappresentati nella tabella in figura 15.

SQL > SELECT TO_DATE(‘ 250287’ , ‘ DD-MM-YY ’) FROM DUAL;

SQL > TO_DATE(‘ 250287’ , ‘ DD-MM-YY ’)


---------------------------------------
25-FEB-87

TO_NUMBER
TO_NUMBER(colonna/valore [ , formato [ , parametro ]])

La conversione TO_NUMBER converte una stringa di tipo CHAR o VARCHAR2 contenente


caratteri numerici in un valore di tipo NUMBER.
L’argomento formato è rappresentato nella tabella in figura 16.

Es.
SQL > SELECT TO_NUMBER ( '100.00' , '9999.99') FROM DUAL;

SQL > TO_NUMBER ( '100.00' , '9999.99')


-----------------------------------------
100

Pagina 49 di 63
Corso SQL

FUNZIONI GENERALI

Le funzioni generali sono funzioni che non rientrano nei gruppi trattati in precedenza e agiscono su
ogni singola riga.
Di seguito sono analizzate le funzioni generali di maggiore importanza.

DECODE
DECODE(colonna/valore, espr1, val1 [ , espr2, val2, … , esprN, valN] )

La funzione DECODE consente di ottenere dalla stessa istruzione SQL diverse


soluzioni, in base al valore individuato tra gli argomenti della funzione. In tal modo,
se viene soddisfatto il criterio espr1, verrà restituito il valore val1; oppure se viene
soddisfatto il criterio espr2, verrà restituito il valore val2.

NVL
NVL(espr1, espr2)

La funzione NVL restituisce un valore sostituivo espr2, solo nel caso in cui espr1 sia
uguale a NULL, altrimenti verrà preso in esame espr1.
I due argomenti della funzione possono avere tipi di dato diversi; Oracle tenterà una
conversione implicita. Il tipo di dato del valore di ritorno corrisponde sempre al tipo di
dato del primo argomento della funzione.

Es.
SQL > SELECT id_imp,nome,NVL(stipendio_in_euro,‘Non Convertito’)
FROM impiegato;

SQL > ID_IMP NOME NVL(stipendio_in_euro,‘Non Convertito ’)


------- --------- -------------------------------------
7844 TURNER Non Convertito
7839 KING 1456.36
7654 MARTIN Non Convertito
7369 SMITH Non Convertito
7934 MILLER 1480.75

UID
UID

Ritorna un valore numerico intero che identifica univocamente l’utente della sessione
corrente. La funzione non possiede argomenti.

Es.
SQL > SELECT UID FROM DUAL;

SQL > UID


----
32

Pagina 50 di 63
Corso SQL

USER
USER

Ritorna il corrente utente Oracle con un valore di tipo VARCHAR2. Questa funzione
viene spesso combinata con UID per identificare l’utente connesso al database
locale.

Es.
SQL > SELECT USER FROM DUAL;

SQL > USER


------------
SCOTT

Pagina 51 di 63
Corso SQL

FUNZIONI DI GRUPPO
Le funzioni di gruppo ritornano risultati basati su un gruppo di righe rispetto alle funzioni viste
finora che si basano su una singola riga. Tutte le funzioni eccetto la funzione COUNT(*) ignorano i
valori NULL.
Se un comando SQL ritorna valori NULL oppure non ritorna righe alla funzione di gruppo, questa a
sua volta restituirà valore NULL.

AVG
AVG ( [ DISTINCT | ALL ] n)

Restituisce il valore della media aritmetica di n.

SQL > SELECT AVG(stipendio_in_lire) FROM impiegato;

SQL > AVG(stipendio_in_lire)


----------------------
1910000

COUNT
COUNT( * | [ DISTINCT | ALL] espr)

Ritorna il valore del contatore di righe presenti che soddisfano la query. Specificando
il valore di espr la funzione restituirà le righe in cui il valore espr non è NULL.

SQL > SELECT COUNT(*) FROM impiegato;

SQL > COUNT(*)


--------
7

SQL > SELECT COUNT(stipendio_in_euro) FROM impiegato;

SQL > COUNT(stipendio_in_euro)


------------------------
2

MAX
MAX( [ DISTINCT | ALL] espr )

Ritorna il valore massimo tra tutti gli elementi del gruppo.

SQL > SELECT MAX(id_imp) FROM impiegato;

SQL > MAX( ID_IMP )


---------------------
7934

MIN
Pagina 52 di 63
Corso SQL

MIN( [ DISTINCT | ALL] espr )

Ritorna il valore minimo tra tutti gli elementi del gruppo.

SQL > SELECT MIN(id_imp) FROM impiegato;

SQL > MIN ( ID_IMP )


----------------------
7368

STDDEV
STDDEV( [ DISTINCT | ALL ] x )
Ritorna il valore della deviazione standard di del numero x. Oracle definisce la
deviazione standard come la radice quadrata della varianza, calcolata tramite la
funzione di gruppo VARIANCE.

SQL > SELECT STDDEV(stipendio_in_lire) FROM impiegato;

SQL > STDDEV( STIPENDIO_IN_LIRE )


-----------------------------------
266520,793

SUM
SUM( [ DISTINCT | ALL ] x )

Restituisce la somma algebrica dei valori di x.

SQL > SELECT SUM(stipendio_in_lire) FROM impiegato;

SQL > SUM( STIPENDIO_IN_LIRE )


--------------------------------
13370000

VARIANCE
VARIANCE([ DISTINCT | ALL ] x )

Restituisce il valore della varianza o deviazione standard dei valori di x.

SQL > SELECT VARIANCE(stipendio_in_euro) FROM impiegato;

SQL > VARIANCE ( STIPENDIO_IN_EURO )


------------------------------
297,43605

Le funzioni di gruppo sono utili per estrarre un calcolo relativo ad ogni raggruppamento ottenuto
mediante clausola GROUP BY.

SQL > SELECT SUM(stipendio_in_lire), num_reparto


FROM impiegato
Pagina 53 di 63
Corso SQL

GROUP BY num_reparto;

SQL > SUM(STIPENDIO_IN_LIRE) NUM_REPARTO


---------------------- ---------------
3780000 10
4220000 20
5370000 30

SQL > SELECT SUM(stipendio_in_lire), num_reparto


FROM impiegato
GROUP BY num_reparto
HAVING SUM (stipendio_in_lire)>4000000;

SQL > SUM(STIPENDIO_IN_LIRE) NUM_REPARTO


---------------------- ---------------
4220000 20
5370000 30

Pagina 54 di 63
Corso SQL

SQL AVANZATO
SQL AVANZATO comprende tutte le opzioni del linguaggio SQL che consentono di ricercare dati
provenienti da più tabelle, creare query innestate, eseguire operazioni insiemistiche sulle tavole del
database.

JOIN
Una JOIN è una relazione che combina le righe appartenenti ad una o più tabelle, viste o snapshot.
Oracle elabora una join ogni volta che nella clausola FORM di un comando SELECT appaiono più
tavole. La select list dell’interrogazione può selezionare solo alcune colonne delle tavole riferendole
alla tabella di origine, utilizzando la notazione puntata, per evitare ambiguità.

SELECT TAVOLA1.COLONNA1, TAVOLA1.COLONNA2,TAVOLA2.COLONNA1


FROM TAVOLA1, TAVOLA2
WHERE TAVOLA1.COLONNA1=TAVOLA2.COLONNA1;

Prodotto Cartesiano
Il prodotto cartesiano è la combinazione tra tutte le righe della prima tavola e le righe della seconda
tavola, anche se non hanno nessuna condizione di giunzione valida. Il prodotto cartesiano è
raramente utilizzato e restituisce un numero elevato di righe. Basti pensare che ,ad esempio, due
semplici tabelle, composte entrambe da 10 righe, porterebbero ad un prodotto cartesiano 100 righe.

Join Conditions

La condizione join viene espressa nel comando SELECT nella clausola WHERE, dove si specifica
il criterio da soddisfare. La condizione si compone di due operandi o colonne appartenenti alle due
tavole prese in esame; Oracle effettua un confronto tra ogni riga della riga della prima tabella e la
corrispettiva riga nella seconda tabella. Se la condizione è accettata, verrà restituito un valore di tipo
BOOLEAN equivale nte a TRUE. Non è necessario che le colonne interessate nella comparazione
siano presenti nella select list.

Le condizioni di join si suddividono in tre tipi:

§ Equijoin

In questo tipo di giunzione i due operandi sono confrontati mediante un operatore di


uguaglianza. Quindi restituisce solo le righe di due tavole che hanno uguale valore nella
colonna specificata.

Ipotizzando di possedere nel proprio schema la tavola REPARTO, strutturata come segue:

COLUMN_NAME TYPE NOT NULL?


------------------------------------ ----------------------------------- -----------------------------------
ID_REPARTO NUMBER ( 2 ) NOT NULL
NOME_REPARTO VARCHAR2 ( 30 )

e popolata dai seguenti valori:

Pagina 55 di 63
Corso SQL

ID_REPARTO NOME_REPARTO
------------------------ --------------------------------------------------
10 MAGAZZINO
20 UFFICI GENERALI
30 REPARTO IMBALLAGGIO
40 VENDITA

relazionata alla tavola IMPIEGATO mediante una relazione di tipo uno a molti. Il
campo num_reparto della tavola IMPIEGATO rappresenta la chiave esterna della
medesima tavola referenziata alla colonna id_reparto della tavola REPARTO. È
possibile eseguire una giunzione con il seguente comando:

SELECT reparto.nome_reparto, impiegato.nome


FROM reparto, impiegato
WHERE reparto.id_reparto = impiegato.num_reparto;

Ottenendo come output:

SQL > NOME_REPARTO NOME


-------------------- ----------
MAGAZZINO KING
REPARTO IMBALLAGGIO SCOTT
REPARTO IMBALLAGGIO SMITH
REPARTO IMBALLAGGIO TURNER
UFFICI GENERALI MARTIN
MAGAZZINO MILLER § Outer join
UFFICI GENERALI ALLEN L’outer join è una semplice
estensione della equijoin, poiché questa giunzione include nelle righe da restituire anche
quelle che hanno il corrispettivo elemento che non soddisfa la condizione. Per individuare
la tabella che visualizzerà tutte le sue righe, anche le non corrispondenti viene utilizzato il
simbolo dell’addizione posto tra parentesi “ ( + ) ” accanto alla colonna interessata.
Esistono alcune limitazioni:
» il simbolo ( + ) è ammesso solo nella clausola WHERE;
» la colonna con associato il simbolo ( + ) non può essere combinata in altre condizioni
o utilizzando un operatore logico OR;
» il simbolo ( + ) non consente che la condizione sia presente nell’insieme di valori di
un operatore IN;
» il simbolo ( + ) non consente che la condizione sia presente in un subquery.

Il comando SELECT che estrae le righe collegata da un outer join a destra è come segue:

SELECT impiegato.nome,reparto.nome_reparto
FROM impiegato, reparto
WHERE impiegato.num_reparto ( + ) = reparto.id_reparto;

Ottenendo come output:

Pagina 56 di 63
Corso SQL

SQL > NOME NOME_REPARTO


------- ------------------
KING MAGAZZINO
MILLER MAGAZZINO
MARTIN UFFICI GENERALI
ALLEN UFFICI GENERALI
SCOTT REPARTO IMBALLAGGIO
SMITH REPARTO IMBALLAGGIO
TURNER REPARTO IMBALLAGGIO
VENDITA

§ Self join
Una self join è una giunzione che la tavola effettua con se stessa. Il nome della
tavola è ripetuto due volte nella clausola FROM e distinto da un alias.

SELECT a.nome|| ‘ ha un livello minore di ’ ||b.nome


FROM impiegato a, impiegato b
WHERE a.livello > b.livello;

Ottenendo come output:

SQL > A.NOME|| ‘ HA UN LIVELLO MINORE DI ’||B.NOME


----------------------------------------------
SCOTT ha un livello minore di KING
SMITH ha un livello minore di KING
TURNER ha un livello minore di KING
SCOTT ha un livello minore di MILLER
SMITH ha un livello minore di MILLER
TURNER ha un livello minore di MILLER

SELECT INNESTATE
Una select innestata o subquery è un comando SELECT posto all’interno di un altro comando
SQL. Le righe restituite dalla subquery verranno utilizzate dalla SELECT principale.
È utile usare un subquery quando:
§ non sono ben conosciuti i criteri di ricerca per una condizione della clausola WHERE e
devono essere calcolati in una query separata;
§ si devono definire le righe da includere in un comando di INSERT o di CREATE TABLE;
§ si devono definire uno o più valori da assegnare ad una data colonna nel comando
UPDATE;

Pagina 57 di 63
Corso SQL

es.
SQL > SELECT nome, livello
FROM impiegato
WHERE num_reparto IN (SELECT id_reparto
FROM reparto
WHERE nome_reparto=‘MAGAZZINO’);

SQL > NOME LIVELLO


------- -------
KING 1
MILLER 1

QUERY SINCRONIZZATE

§ Sono composte da una query principale e una secondaria.

§ Esiste una elemento che lega le due select e viene detto elemento di sincronizzazione.

§ Il valore dell’elemento di sincronizzazione di ogni riga della tavola principale viene


elaborato nella query secondaria.

OPERAZIONI INSIEMISTICHE
Le operazioni insiemistiche effettuate sulle tavole del database sono più veloci delle query simili
che eseguono la stessa operazione. Hanno la funzione di combinare i risultati di due query separate,
restituendo un unico output. Le colonne ottenute come risultato avranno le caratteristiche delle
colonna della prima istruzione SELECT.
Le query legate da operazioni insiemistiche possono contenere le clausole di GROUP BY, WHERE
e select innestate.
Non sono ammesse nelle operazioni insiemistiche le colonne con tipo di dato LONG e le query con
clausola ORDER BY. Quest’ultima può essere posta solo alla fine nell’intero comando per
visualizzare in modo ordinato l’output dello stesso.

Esistono 4 tipi di operazioni insiemistiche:


§ UNION
§ UNION ALL
§ INTERSECT
§ MINUS

UNION

Restituisce tutte le righe selezionate tra entrambe le query, ignorandone le duplicate. Considerando
le due tavole IMPIEGATO e NEW_IMPIEGATO, può essere richiesta la seguente operazione
insiemistica.

SQL > SELECT nome,livello


FROM impiegato

Pagina 58 di 63
Corso SQL

WHERE livello = 1

UNION

SELECT nome,stipendio_in_lire
FROM new_impiegato
WHERE livello=1;

ottenendo come output:

SQL > NOME LIVELLO


------- -------
KING 1
KING 2200000
MILLER 1
MILLER 1580000

UNION ALL

Restituisce tutte le righe ottenute dalla combinazione tra le due query visualizzando anche le righe
duplicate.

SQL > SELECT nome, livello


FROM impiegato
WHERE livello = 1

UNION ALL

SELECT nome, stipendio_in_lire


FROM new_impiegato
WHERE livello=1;

ottenendo come output:

SQL > NOME LIVELLO


------- -------
KING 1
MILLER 1
KING 2200000
MILLER 1580000

INTERSECT

L’operazione insiemistica INTERSECT restituisce solo le righe in comune tra i risultati delle due
query.

Pagina 59 di 63
Corso SQL

SQL > SELECT nome, livello


FROM impiegato
WHERE livello = 2

INTERSECT

SELECT nome, livello


FROM new_impiegato
WHERE livello=2;

ottenendo come output:

SQL > NOME LIVELLO


------- -------
TURNER 2

Pagina 60 di 63
Corso SQL

MINUS
L’operazione insiemistica MINUS restituisce tutte le righe ottenute dalla prima query che non sono
presenti nella seconda.

SQL > SELECT nome, livello


FROM impiegato
WHERE livello = 2

MINUS

SELECT nome, livello


FROM new_impiegato
WHERE livello=2;

ottenendo come output:

SQL > NOME LIVELLO


------- -------
SCOTT 2
SMITH 2

Pagina 61 di 63