81
Funzioni in SQL

Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Embed Size (px)

Citation preview

Page 1: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni in SQL

Page 2: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Tipi di Funzione

Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Page 3: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni in SQL

Funzioni numeriche

Page 4: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Classi di funzioni numeriche

Le funzioni di Oracle si applicano a tre classi di numeri:

● Valori singoli• O un numero vero e proprio 3365.4573• O una variabile PL/SQL• Un numero tratto da una colonna o da una riga del database

● Gruppi di valoriSono numeri di una colonna tratti da una serie di righe

● Elenchi di valori serie di numeri che può comprendere

● Elenchi di numeri veri e propri 34, 4, 23.45, 45.3● elenchi di variabili PL/SQL● Colonne

Page 5: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Alcune funzioni numeriche a valori singoli

Addizione Sottrazione Moltiplicazione DivisioneValore assolutoParte intera superioreParte intera inferioreLogaritmo naturaleLogaritmo in base 10Esponenziale in base e Valore elevato a esponente Radice quadrataModuloSostituto di valore se il valore è nulloArrotondamento a valore di precisioneValore troncato a precisione

valore1+valore2valore1-valore2valore1*valore2valore1/valore2ABS(valore)CEIL(valore)FLOOR(valore)LN(valore)LOG(valore)EXP(valore) POWER(Valore, esponente) SQRT(valore)MOD(valore, divisore)NVL(valore, sostituto)ROUND(valore, precisione)TRUNC(valore, precisione)

Page 6: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

La tabella DUALOracle fornisce la definizione di una piccola tabella, chiamata DUAL, di una riga e una colonna che permette di calcolare il risultati delle funzioni su valori specifici.L’unico valore rappresentato nella tabella sarà il risultato della funzione (o composizione di funzioni) rappresentato come unica colonna

Esempio: se si vuole calcolare Mod(63,5) basta scrivere

Select mod(63,5) from DUAL

In questo modo si può testare il funzionamento delle varie funzioni su dei valori particolari

Page 7: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizi• Calcolare 34.8 modulo 4• Calcolare il valore assoluto di -2349.25• Calcolare la parte intera inferiore di 34.3• Calcolare la parte intera inferiore di -34.3• Calcolare la parte intera superiore di 234.534• Calcolare la parte intera superiore di -3253.34245• Arrotondare il valore 2345.5563 alla 1a cifra decimale• Arrotondare il valore -4686.3455 alla 2a cifra decimale• Calcolare 878.8712.3

• Calcolare -878.87-12.3

• Calcolare la radice quadrata di 45.67• Calcolare e11.3

• Calcolare il logaritmo naturale di 11.3• Calcolare il logaritmo in base 10 di 11.3

Page 8: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizi

Esercizio: calcolare per ogni articolo il prezzo lordo, inclusivo di spese di trasporto. Per gli elementi per cui l’IVA non è definita, imporre il valore del 10%, e considerare gratuite le spese di trasporto là dove non sono definite.

Select art_nome, art_prezzo*(1+NVL(art_IVA, 10)/100)+NVL(art_spese_trasporto, 0),FROM Articoli

Page 9: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni di gruppo

Già viste… COUNT, SUM,AVG,MAX,MIN + altre funzioni di tipo statistico (vedi guida Oracle 9)

Nelle funzioni di gruppo i valori nulli non sono considerati, tranne che per la funzione COUNT dove si può richiedere (mediante la specifica (*)) di considerare anche le righe nulle.

Page 10: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni di gruppo e funzioni su valori singoli (1)

Le funzioni su valori singoli possono essere composte fra di loro a piacimento, rispettando il numero dei parametri. Esempio:

Mod(abs(34.5-56.32), ceil(sqrt(abs(234*(-24)))))

L’argomento di una funzione di gruppo può essere una composizione di funzioni su valori singoli applicati alle righe. Esempio:

AVG(power(round(sqrt(art_prezzo(1+IVA/100))))), 2)

Non si possono invece comporre due funzioni di gruppo

Sum(AVG(temperature)) (?????)

Page 11: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni numeriche di elenco

Coalesce(valore1,valore2,…)

Greatest(valore1,valore2,…)

Least(valore1,valore2,…)

Restituisce il primo valore non null nell’elenco delle espressioni

Il valore più grande dell’elenco

Il valore più piccolo nell’elenco

Mentre le funzioni di gruppo operano su diverse righe, le funzioni di elenco operano su diverse colonne all’interno di un’unica riga. Le funzioni di elenco sono:

Page 12: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Data PA

CT

AG

ME

14-Mar-07 17 18 15 13

15-Mar-07 20 18 17 15

16-Mar-07 18 21 19 19

17-Mar-07 --- --- 20 18

18-Mar-07 --- 17 19 15

Select data, Greatest (PA, CT, AG,ME) GST, Least (PA, CT, AG, ME) LST,

Coalesce (PA, CT, AG , ME) COAFrom Temperature

Data GST

LST

COA

14-Mar-07 18 13 17

15-Mar-07 20 15 20

16-Mar-07 21 18 18

17-Mar-07 20 18 20

18-Mar-07 19 15 17

Calcolare per ogni giorno la temperatura massima, la temperatura minima e la prima temperatura non nulla nell’elenco

Page 13: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio

Select Greatest (art_prezzo,art_prezzo*art_IVA/100+art_spese_trasporto), Least (art_prezzo,art_prezzo*art_IVA/100+art_spese_trasporto), Coalesce(art_prezzo, art_spese_trasporto) FROM Articoli

Stabilire per ogni riga della tabella articoli, il massimo e il minimo fra il prezzo dell’articolo o la somma del costo dell’IVA e delle spese di trasporto, e il primo valore non null tra la colonna art_prezzo e la colonna art_spese_trasporto

Page 14: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni in SQL

Funzioni su stringhe

Page 15: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni su stringhe

In Oracle le funzioni su stringhe operano in due modi: alcune creano oggetti nuovi a partire dai vecchi, modificando i valori di input, per esempio trasformando i valori minuscoli in maiuscoli.Altre forniscono un’informazione sulla stringa, come per esempio la sua lunghezza.

Page 16: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Alcune funzioni di stringa

• Concatenazione• Intero corrispondente codice ASCIIdel 1o carattere di str• Carattere corrispondente all’intero int dato in input nel codice ASCII• Trova la posizione del carattere chr nella stringa str.• Fornisce la lunghezza di una stringa str• Rende minuscoli tutti i caratteri di str• Rende maiuscoli tutti i caratteri di str• Rende maiuscolo il primo carattere di una stringa str

str1||str2, concat(str1, str2)ASCII(str)

Chr(int)

Instr(str, chr)

Length(str)Lower (str)Upper(str)Initcap(str)

Page 17: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Alcune funzioni di stringa

• Estrae dalla stringa str la sottostringa che inizia nella posizione i ed è lunga k caratteri• Trova la posizione di un carattere chr in una stringa str• Riempie una stringa str fino a una certa lunghezza l aggiungendo a sinistra una serie di caratteri car• Riempie una stringa str fino a una certa lunghezza l aggiungendo a destra una serie di caratteri car• Elimina tutti i caratteri che rientrano in una serie specificata chr dalla parte sinistra di una stringa str• Elimina tutti i caratteri che rientrano in una serie specificata chr dalla parte sinistra di una stringa str• Elimina tutti i caratteri che rientrano in una serie specificata chr dalla parte da entrambe le estremità di una stringa str

Substr (str, i,k)

Instr(str, chr)

LPAD(str,l [,car])

RPAD(str,l [,car])

LTRIM(str, chr)

RTRIM(str, chr)

TRIM(str, chr)

Page 18: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Concatenazione di stringhe

Per concatenare due stringhe si può utilizzare o l’operatore || oppure la funzione CONCAT. Questi operatori vengono applicati ai nomi di colonne e ad elementi letterali.

Esempio: Visualizzare in un’unica colonna il nome e cognome di ogni Impiegato.

ImpiegatoSelect Nome || ‘ ’ || CognomeFrom Impiegato

Matricola

Nome

Cognome

Settore

123456 Luca Rossi segreteria

564387 Mara Bruni produzione

776213 Ugo Verdi marketing

342091 Fabio Neri produzione

Nome || ‘ ’ || Cognome

Luca Rossi

Mara Bruni

Ugo Verdi

Fabio Neri

Page 19: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Concatenazione di stringhe

Alternativamente si può usare la funzione CONCAT.

Impiegato

Select Concat(Concat(Nome, ‘ ’), Cognome)From Impiegato

Matricola

Nome

Cognome

Settore

123456 Luca Rossi segreteria

564387 Mara Bruni produzione

776213 Ugo Verdi marketing

342091 Fabio Neri produzione

Concat(Nome, ‘ ’, Cognome)

Luca Rossi

Mara Bruni

Ugo Verdi

Fabio Neri

Page 20: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio

Scrivere il nome di ogni componente, seguito dal suo codice fra parentesi

Select (com_descrizione || ‘ (‘ ||com_cod || ‘)’)FROM Componenti

Page 21: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Rpad ed LpadSono due funzioni che permettono di aggiungere dei simboli rispettivamente alla destra e alla sinistra della stringa considerata. Sintassi:

Rpad(str, lungh [,chr])Lpad(str, lungh [,chr])

Dove str è la stringa considerata, lungh indica la lunghezza della stringa risultante (di conseguenza il numero di simboli aggiunti sarà lungh - length(str)) e chr indica il tipo di carattere che si vuole aggiungere. Se tale carattere viene omesso, il default è lo spazio.Questa funzione ha senso quando si utilizza l’interfaccia a riga di comando, dove le tabelle non sono graficamente ben definite come nella nostra interfaccia

Page 22: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Rpad, esempio

Si vogliono aggiungere dei puntini alla fine di ogni nome per collegarli al cognome

Impiegato

Matricola

Nome

Cognome

Settore

123456 Luca Rossi segreteria

564387 Mara Bruni produzione

776213 Ugo Verdi marketing

342091 Fabio Neri produzione

Select Rpad(nome, 18, ‘.’) , CognomeFrom Impiegato

Rpad(nome,18,‘.’) | Cognome----------------------------Luca..............|RossiMara..............|BruniUgo...............|VerdiFabio.............|Neri

Page 23: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Lpad, esempio

Si vogliono formattare i nomi, giustificandoli a destra

Impiegato

Matricola

Nome

Cognome

Settore

123456 Luca Rossi segreteria

564387 Mara Bruni produzione

776213 Ugo Verdi marketing

342091 Fabio Neri produzione

Select Lpad(nome, 18) , CognomeFrom Impiegato

Lpad(nome,14) | Cognome---------------------------- Luca|Rossi Mara|Bruni Ugo|Verdi Fabio|Neri

Page 24: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Rtrim, Ltrim, Trim

Queste funzioni servono ad eliminare alcuni caratteri rispettivamente all’inizio, alla fine, e da entrambi i lati di una stringa. Sintassi:

Rtrim(str, chr)Ltrim(str, chr)Trim(str,chr)

Dove str è la stringa considerata e chr è un carattere o una sequenza di caratteri che si vuole eliminare rispettivamente dall’inizio, dalla fine e da entrambi i lati della lista.

Page 25: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Ltrim: esempio

Autore Titolo Collocazione

D. Alighieri “la divina Commedia”

483291

D. Brown Il codice Da Vinci. 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri “Il ladro di merendine.”

887625

E. Morante La storia. 443213

E. Hemingway “Il vecchio e il mare” 534853Select Ltrim(titolo, '"' ) TitoloFrom Libri

Titolo

la divina Commedia”

Il codice Da Vinci.

Cent’anni di solitudine

Il ladro di merendine.”

La storia.

il vecchio e il mare”

Libri

Page 26: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Rtrim: esempio

Autore Titolo Collocazione

D. Alighieri “la divina Commedia”

483291

D. Brown Il codice Da Vinci. 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri “Il ladro di merendine.”

887625

E. Morante La storia. 443213

E. Hemingway “Il vecchio e il mare” 534853Select Rtrim(titolo, '."') TitoloFrom Libri

Titolo

“la divina Commedia

Il codice Da Vinci

Cent’anni di solitudine

“Il ladro di merendine

La storia

“Il vecchio e il mare

Libri

Page 27: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Ltrim ed Rtrim: esempio

Autore Titolo Collocazione

D. Alighieri “la divina Commedia”

483291

D. Brown Il codice Da Vinci. 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri “Il ladro di merendine.”

887625

E. Morante La storia. 443213

E. Hemingway “Il vecchio e il mare” 534853Select Ltrim(Rtrim(titolo, '."'), '"') TitoloFrom Libri

Titolo

la divina Commedia

Il codice Da Vinci

Cent’anni di solitudine

Il ladro di merendine

La storia

Il vecchio e il mare

Libri

Page 28: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Ltrim, Rtrim: attenzione!!

Autore Titolo Collocazione

D. Alighieri “la divina Commedia”

483291

D. Brown Il codice Da Vinci. 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri “Il ladro di merendine.”

887625

E. Morante La storia. 443213

E. Hemingway “Il vecchio e il mare” 534853

Select Ltrim(titolo, '"Il ') TitoloFrom Libri

Titolo

a divina Commedia

codice Da Vinci

Cent’anni di solitudine

adro di merendine

La storia

vecchio e il mare

Libri

Quello che c’è tra apici è un insieme e non una sequenza. Vengono eliminati dall’inizio tutti i simboli (case-sensitive) che appartengono all’insieme, indipendentemente dall’ordine

Page 29: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Trim, Esempio

Autore Titolo Collocazione

D. Alighieri “la divina Commedia”

483291

D. Brown Il codice Da Vinci. 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri “Il ladro di merendine.”

887625

E. Morante La storia. 443213

E. Hemingway “Il vecchio e il mare” 534853

Select Trim('"'FROM titolo) TitoloFrom Libri

Titolo

La divina Commedia

Il codice Da Vinci.

Cent’anni di solitudine

Il ladro di merendine.

La storia.

Il vecchio e il mare

Libri

In questo modo si possono eliminare le virgolette ad entrambi i lati del titolo

Page 30: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Lower, Upper ed Initcap•Lower(str) rende minuscolo ogni carattere della stringa str.•Upper(str) rende maiuscolo ogni carattere della stringa str.•Initcap(str) rende maiuscola la prima lettera di ogni parola della stringa str.

Page 31: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esempio

Autore Titolo Collocazione

D. Alighieri la divina commedia 483291

D. Brown Il codice Da Vinci 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri Il ladro di merendine

887625

E. Morante La storia 443213

Libri

Select Upper(titolo), Lower(titolo), Initcap(titolo)From Libri

Upper(titolo) Lower(Titolo) Initcap(titolo)

LA DIVINA COMMEDIA La divina commedia La Divina Commedia

IL CODICE DA VINCI Il codice Da Vinci Il Codice Da Vinci

CENT’ANNI DI SOLITUDINE Cent’anni di solitudine

Cent’Anni Di Solitudine

IL LADRO DI MERENDINE Il ladro di merendine

Il Ladro Di Merendine

LA STORIA La storia La Storia

Page 32: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Substr

Substr(str, pos, ncar) estrae dalla stringa str la sottostringa che inizia dalla posizione pos e che ha ncar caratteri.Se ncar non è specificata, si sottointendono tutti i caratteri fino alla fineE’ possibile anche inserire un numero negativo in pos, intendendo che il carattere di inizio viene contato a partire da pos elementi dalla fine.

Page 33: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esempio

Select substr(collocazione, 1, 2) Scaffale substr(collocazione, -4) CollocFrom Libri

Supponiamo che i primi due caratteri della collocazione rappresentino lo scaffale e che le ultime 4 rappresentino la collocazione nel suo scaffale

Scaffale

Colloc

48 3291

53 2244

43 2457

88 7625

44 3213

Autore Titolo Collocazione

D. Alighieri “La divina Commedia”

483291

D. Brown Il codice Da Vinci. 532244

G. Garcia Marquez

Cent’anni di solitudine

432457

A. Camilleri “Il ladro di merendine.”

887625

E. Morante La storia. 443213

Libri

Page 34: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Instr

La funzione Instr(str, set [, inizio[, occorrenza]]) fornisce la posizione (se esiste) in cui la stringa set è presente nella stringa str a partire dalla posizione inizio. Se il parametro inizio non è specificato, assume valore 1 per default. Il parametro occorrenza indica l’occorrenza che si vuole trovare della stringa set. Se per esempio occorrenza è 3, vengono saltate le prime due occorrenze.Select Instr(titolo, 'Il', 1,1) from Libri

Select titolo, Instr(titolo, 'di') DoveFrom Libri

Titolo Dove

“La divina Commedia”

5

Il codice Da Vinci. 6

Cent’anni di solitudine

11

“Il ladro di merendine.”

11

La storia. 0

Page 35: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni in SQL

Funzioni di date e funzioni di conversione

Page 36: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Il tipo date

In Oracle il tipo date è memorizzato in un formato che comprende giorno, mese, anno, ma anche ora, minuti e secondi.

E’ poi possibile formattare la colonna in modo da mostrare solo la data, la data e l’ora, la data l’ora e i minuti, oppure la data l’ora i minuti e i secondi. Se non viene specificata nessuna formattazione, appare solo la data con giorno, mese e anno.

Per le frazioni di secondo è possibile utilizzare il tipo timestamp

Page 37: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni di date

Add_Months (n, data)Current_DateCurrent_Timestamp

Extract (UT FROM data)

Greatest(data1,data2,…)Least(data1, data2…)Last_day(data)

Months_Between(data2,data1)

Next_Day(data, ‘giorno’)

Round(data, ‘formato’)

Somma n mesi a dataData corrente nel fuso orario della sessioneIndicatore orario nel fuso orario della sessioneEstrae una porzione di data (UT=unità di tempo) da un valore dataLa più recente fra le date elencateLa meno recente fra le date elencateLa data dell’ultimo giorno del mese a cui appartiene la dataFornisce data2-data1 in mesi (eventualmente numero frazionario)Data del giorno successivo a date dove giorno=‘Monday’, ‘Tuesday’ etcSenza un formato specificato arrotonda una data a 12 A.M.se l’ora della data è prima di mezzogiorno, altrimenti alle 12 A.M del giorno successivo.

Page 38: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Sysdate, Current_date e Systimestamp

Sysdate è una funzione che da come risultato la data e l’ora correnti

Systimestamp segnala la data di sistema nel formato del tipo di dati timestamp

Select Sysdate From Dual

Select Systimestamp From Dual

Page 39: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Differenza fra due date

La differenza fra due date restituisce il tempo, espresso in giorni, che intercorre fra le due date.

EsercizioPer ogni coppia di ordini distinti, trovare il tempo che intercorre fra essi.

Select o.ord_cod, d.ord_cod, o.ord_data-d.ord_dataFrom ordini o, ordini dWhere o.ord_cod>d.ord_cod

Page 40: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Aggiunta di mesi

Add_Months(data,n) aggiunge n mesi alla data considerata. Se n è un numero negativo, si ottiene la sottrazione di n mesi dalla data.

EsercizioNella tabella ordini, visualizzare una colonna “scadenza”, che avviene due mesi dopo la data in cui l’ordine è effettuato

Select ordini.*, Add_months(ord_data,2) ScadenzaFrom Ordini

Page 41: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Greatest e Least

Greatest(data1, data2,…) seleziona la massima fra le date dell’elenco.Least(data1,data2,…) seleziona la minima fra le date dell’elenco.

Page 42: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esempio

Nome Laurea Matrimonio Assunzione

Rossi 14-Lug-2003

23-Set-2005 12-Mar-2003

Verdi 16-Apr-2005

4-Gen-2006 13-Set-2000

Bruni 2-Dic-2002 24-Set-2001 19-Gen-2003

Gialli 18-Dic-2002

7-Feb-2004 11-Lug-2003

Select Nome, Greatest(Laurea, Matrimonio, Assunzione) Least(Laurea, Matrimonio, Assunzione)From Persone

Persone

Creare la tabella descritta sopra e inserire i dati. Per ogni persona, trovare la data più antica e la data più recente tra quella di laurea, quella di matrimonio e quella di assunzione.

Page 43: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Greatest e least coi letterali

Se si applicano le funzioni greatest e least sui letterali, insorge un problema.

Select Least (’12-Gen-2004’, ‘12-Dic-2007’) From Dual

La funzione least restituisce il valore 12-Dic-2007. Questo perché Oracle interpreta i valori tra virgolette come stringhe, e quindi utilizza l’ordine lessicografico. Per ottenere il risultato corretto occorre usare la funzione di conversione TO_DATE

Select Least (To_date(‘12-Gen-2006’), To_date(‘12-Dic-2007’))

Page 44: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Next_day

Next_day(data, ‘giorno sett’) calcola la data del prossimo giorno della settimana (giorno_sett) successivo alla data specificata.

Esercizio: calcolare la data della prossima domenica

Select next_day(sysdate, ‘domenica’) From Dual

Page 45: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Last_day

Last_day (data) restituisce l’ultimo giorno del mese contenuto nella data.

Esercizio: trovare quanti giorni aveva il mese di febbraio nell’anno 2004. E nel 2000? E nel 1900?

Select Last_day(to_date(1-Feb-2004)) from Dual

Select Last_day(to_date(1-Feb-2000)) from Dual

Select Last_day(to_date(1-Feb-1900)) from Dual

Page 46: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Months Between

Months_Between(data1, data2) calcola i mesi che intercorrono tra la data2 e la data1

Esercizio: creare la seguente tabella e trovare l’età delle persone nella tabella:

Nome Cognome

Data di Nascita

Piero Viola 25-Apr-1970

Giorgio

Rossi 30-Giu-1966

Marco Neri 16-Set-1977

Luca Verdi 12-Gen-1972Select Compleanni.*, Floor(months_between(Sysdate, "data di nascita")/12) etaFrom Compleanni

Compleanni

Page 47: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio

Determinare chi è la persona più anziana,specificandone nome, cognome, data di nascita ed età, tra quelle nella tabella precedente

Select Compleanni.*,Floor(months_between(sysdate, "data di nascita")/12) etaFrom CompleanniWhere Floor(months_between(sysdate,"data di nascita")/12) =(select max(Floor(months_between(sysdate, "data di nascita")/12)) From Compleanni)

Page 48: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Round e Trunc

Una variabile di tipo date in genere contiene anche l’informazione su ora, minuti e secondi. A volte può essere importante “liberarsi” di questi dettagli per evitare la presenza di cifre decimali nell’utilizzo di alcune funzioni.

Per questo a volte è utile fare degli arrotondamenti

Page 49: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Round e Trunc

• A una data inserita come letterale è assegnata come ora predefinita le 12 A.M. dell’inizio della giornata

Sysdate contiene sia la data che l’ora. In questo caso secondo l’applicazione si può applicare:• ROUND, che arrotonda l’ora alla mezzanotte precedente, se l’ora è precedente a mezzogiorno, o alla mezzanotte seguente se l’ora è successiva a mezzogiorno. • Altrimenti si può usare la funzione TRUNC che imposta sempre l’ora alla mezzanotte precedente dello stesso giorno.

Page 50: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio

Trovare quanti giorni mancano alla prossima domenica, arrotondando la data di sistema alla mezzanotte precedente

Select Round(NEXT_DAY(sysdate, 'Domenica'))-Round(sysdate)From Dual

Page 51: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni in SQL

Funzioni di conversione

Page 52: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Formattazione

La funzione to_date converte una stringa di caratteri in una data La funzione to_char converte una data o un numero in una stringa di caratteriLa funzione to_number trasforma una stringa in un numero

Page 53: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

SintassiTo_char(data [, ‘formato’]) o To_char(numero)To_date(stringa [, ‘formato’]) To_number(stringa)

Nella conversione to_date, stringa è una stringa letterale, un numero vero e proprio o una colonna di un database che contiene una stringa o un numero. In ogni caso il formato di stringa deve essere quello definito da formato. Solo se stringa è nel formato predefinito, si può evitare di descrivere il formato. Il valore predefinito è DD-MON-YYYY

Page 54: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Modificare il formato

Il formato della sessione può essere modificato mediante l’istruzione

Alter session set NLS_DATE_FORMAT = “nuovo_formato”

I vari tipi di formato si trovano nel manuale ORACLE 9 nella tabella a pagina 171-172

Page 55: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

To_char, Esempio

Select "data di nascita", to_char("data di nascita", 'MM/DD/YY') FormattatoFrom Compleanni

Nome Cognome

Data di Nascita

Piero Viola 25-Apr-1970

Giorgio

Rossi 30-Giu-1966

Marco Neri 16-Set-1977

Luca Verdi 12-Gen-1972

Compleanni

Data di Nascita

Formattato

25-Apr-1970 04/25/70

30-Giu-1966 06/30/66

16-Set-1977 09/16/77

12-Gen-1972 01/12/72

Page 56: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Trasformazione di data come letterale

Select to_char(to_date('12-Mar-1970'), 'DD Month YY') formattatoFrom dual

Per trasformare il formato di una data inserita come letterale possiamo scrivere:

Formattato

12 Marzo 70

Dual

Page 57: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Visualizzare l’orarioLa funzione to_char permette anche di visualizzare l’orario. Infatti una variabile date contiene anche l’orario, anche se per default viene visualizzato solo giorno mese e anno.Un modo per visualizzare l’orario è di trasformarlo in formato carattere, specificando nella formattazione che si intende visualizzare l’orarioSelect to_char(sysdate, ‘hh:mi:ss’) from dual

Select to_char("data di nascita", 'hh24, mi, ss') From Compleanni

N.B. Minuti è indicato da mi e non da mm (mese)

Page 58: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

To_char sui numeri

La funzione to_char può anche essere applicata a un oggetto di tipo number. In questo caso un tipo numerico viene trasformato in una stringa. Questo permetterà di applicare a un tipo numerico funzioni definite su stringhe

Esempio Supponiamo che in una tabella rubrica il numero civico e il CAP siano definiti come number.Per visualizzare l’indirizzo completo comprensivo di numero civico e cap si può scrivere

Select Via || ', ' ||to_char(num) ||' - '|| to_char(cap)From Rubrica

Page 59: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

In realtà…

In realtà se noi scriviamo

Select Via || ', ' ||num ||' - '||capFrom Rubrica

Otteniamo lo stesso risultato.Questo perché spesso Oracle opera queste conversioni in maniera automatica

Page 60: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

To date

L’istruzione to_date serve a convertire una stringa o un numero in una data.Ovviamente la stringa o la data deve essere in un formato compatible con quello della data.Sintassi:

To_date(string [,formato])

In questo caso formato può essere omesso solo nel caso in cui la stringa rappresenta una data nel formato predefinito

Select to_date(’15-Mag-2007’) from Dual

Page 61: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Date non in formato predefinito

Se, per esempio, la stringa contiene una data nella forma MM/GG/AA, allora devo specificare in quale formato inserisco la stringa da trasformare in data.Esempio:

Select to_date( ‘05/15/07’, ‘MM/GG/AA’) from dual

La data sarà comunque visualizzata nel formato predefinito ‘15-Mag-2007’

n.b. 07 può significare 2007 o 1907. Questo dipenderà dalle impostazioni predefinite del database

Page 62: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Trasformazione di un numero in data

Select to_date((120370), 'DDMMYY') Data From dual

Anche un numero, se espresso in una certa forma, può rappresentare una data. La funzione to_date, applicata a un numero, e specificandone il formato, converte il numero in una data

Data

12-Mar-1970

Dual

Page 63: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Limitazioni della stringa

Ovviamente non qualunque stringa può essere trasformata in data.

La stringa è infatti soggetta alle seguenti limitazioni:1. Non sono consentite stringhe letterali che non

hanno a che fare con date. Esempio to_date(‘Donald Duck’);

2. I giorni non possono essere scritti in lettere. Devono essere dei numeri;

3. Sono consentiti i segni di interpunzione (per separare le varie unità di misura)

4. Se viene utilizzata Month il mese nella stringa deve essere scritto per esteso in lettere. Se è utilizzato Mon, deve essere un’abbreviazione di tre lettere. Le lettere maiuscole o minuscole vengono ignorate.

Page 64: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

To number

To number trasforma una stringa in un numero, se la stringa contiene solo cifre.

select to_number('243434534')+1 from dual

Page 65: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Conversione automatica

Spesso Oracle effettua automaticamente alcune conversioni.

Ci sono comunque certi casi in cui le conversioni automatiche non vengono effettuate.

Page 66: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Conversione automatica, regole Qualsiasi number o date può essere convertito in

stringa di caratteri. Dunque una qualsiasi funzione di stringa può essere applicata a una colonna di tipo date o number, senza bisogno di convertirle.

Un valore char o varchar è convertito in number solo se contiene cifre, un punto decimale e un segno – (meno) prima delle cifre

Un valore char è convertito in data solo se è espresso nel formato predefinito ‘DD-Mon-YYYY’. Questo vale per tutte le funzioni tranne che per GREATEST e LEAST per cui vengono considerati in ogni caso come stringhe e vale per Between solo se la colonna a sinistra di between è di tipo date

Page 67: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Funzioni in SQL

Decode e Case

Page 68: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

La funzione decode

La funzione Decode realizza in SQL il costrutto if…then…else presente nei vari linguaggi di programmazione.

Page 69: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Decode, sintassiDECODE(valore, if1,then1,if2,then2,…, ifn,thenn, else)

Qui valore rappresenta un qualsiasi attributo della tabella, o qualsiasi risultato di un calcolo. Il valore viene calcolato per ogni riga. Se è uguale a if1 allora il risultato è then1, se è uguale a if2, il risultato è then2, etc. Se il valore non è uguale a nessuno dei valori, allora il risultato è elseCiascuno degli if, then, else può essere una colonna o il risultato di una funzione o calcolo. Fra parentesi è possibile racchiudere fino a 255 elementi

Page 70: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esempio

Nome

Titolo

Dataprest

Datarest

Biblio-Prestiti

Biblioteca

Si vuole dare una diversa scadenza per i prestiti in base al genere di libro, in quanto ci sono dei libri che si leggono più in fretta e degli altri per cui occorre piu tempo.La penale da pagare dipenderà anche dal genere

Autore

Titolo

Editore

Genere

Pagine

Anno

Collocazione

Page 71: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esempio

Per ogni persona che prende in prestito un libro, elencare nome, ritardo rispetto alla scadenza e mora, considerando che il prestito per i romanzi scade dopo 14 giorni, per i libri per bambini dopo 25 giorni, per i saggi dopo 20 giorni e per tutti gli altri libri dopo 18 giorni, e che la mora è di 0.5 euro al giorno per i romanzi, di 0.2 euro al giorno per i libri per bambini, di 0.5 per i saggi e di 0.8 per tutti gli altri libri

Nome

Titolo

Dataprest

Datarest

Prestiti

Biblioteca

Autore

Titolo

Editore

Genere

Pagine

Anno

Collocazione

Page 72: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esempio, soluzione

Select nome, titolo, Decode(Genere, ‘Romanzo’, Datarest-Dataprest-14, ‘Bambini’, Datarest-Dataprest-25, ‘Saggio’, Datarest-Dataprest-20, Datarest-Dataprest-18) Ritardo, Decode(Genere, ‘Romanzo’, (Datarest-Dataprest-14)*0.5 ‘Bambini’ (Datarest-Dataprest-25)*0.3, ‘Saggio’, (Datarest-Dataprest-20)*0.5, (Datarest-dataprest-18)*0.8) MoraFrom prestiti, Biblioteca Where Prestiti.titolo=Biblioteca.titolo and datarest-dataprest> Decode(Genere, ‘Romanzo’,14, ‘Bambini’, 25, ‘Saggio’, 20, 18)

Nome

Titolo

Dataprest

Datarest

Prestiti

Biblioteca

Autore

Titolo

Editore

Genere

Pagine

Anno

Collocazione

Page 73: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Decode annidati

Così come nei linguaggi di programmazione, le funzioni decode possono essere annidate una dentro l’altra.Supponiamo per esempio che fra i libri della stessa categoria vogliamo discriminare il ritardo rispetto al nome dell’autore. Infatti potrebbero esserci degli autori che sono più difficili da leggere.In tal caso ci sarà un decode che dipende dal genere e degli altri che dipendono dal nome dell’autore.

Page 74: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

EsempioSelect nome, titolo, Decode (Genere, ‘Romanzo’, Decode(Autore, ‘A. Camilleri’, Datarest-Dataprest-10, ‘Dante’, Datarest-Dataprest-30, Datarest-Dataprest-15) ‘Bambini’, Decode (Autore, ‘G. Stilton’, Datarest-Dataprest-20 ‘J.K. Rowling’, Datarest-Dataprest-45, Datarest – Dataprest -25) ‘Saggio’, Datarest-Dataprest-20, Datarest-Dataprest-18) Ritardo, Decode (Genere, ……………) MoraFrom Prestiti, BibliotecaWhere Prestiti.titolo=Biblioteca.titolo and datarest-dataprest> Decode(Genere, ‘Romanzo’,Decode…, ‘Bambini’, Decode… 25, ‘Saggio’, 20, 18)

Page 75: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Case

A partire da Oracle 9, è possibile usare anche la funzione Case.Sintassi:

Case attributo when valore1 then1

when valore2 then2

... when valoren thenn

else … end

Page 76: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

EsempioSelect nome, titolo, Case Genere when ‘Romanzo’ then Datarest-Dataprest-14 when ‘Bambini’ then Datarest-Dataprest-25 when ‘Saggio’ then Datarest-Dataprest-20 else Datarest-Dataprest-18 end as Ritardo, Case Genere when ‘Romanzo’ then (Datarest-Dataprest-14)*0.5 when ‘Bambini’ then (Datarest-Dataprest-25)*0.3 when ‘Saggio’, (Datarest-Dataprest-20)*0.5 else (Datarest-dataprest-18)*0.8 end as MoraFrom prestiti P, Biblioteca BWhere P.titolo=B.titolo and datarest-dataprest> Case Genere when ‘Romanzo’ then 14 when ‘Bambini’ then 25, when ‘Saggio’ then 20 else 18 end

Page 77: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Case annidati

Come per il decode, è possibile annidare diversi costrutti case.

Esercizio:Riscrivere la query dell’esempio dei decode annidati utilizzando il costrutto CASE

Page 78: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio

Consideriamo il nostro Database e supponiamo che ci chiedano uno sconto su una fornitura di articoli. Lo sconto viene effettuato solo sugli articoli che costano più di 500 euro, nella misura seguente:sui tavoli è possibile applicare uno sconto del 15%, sui mobili del 10%, sulle librerie del 18% sugli armadi del 5%. Calcolare lo sconto effettuato su ciascun articolo

Page 79: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio, Soluzione Decode

select art_descrizione, art_prezzo, decode(cat_descrizione, 'Tavolo', art_prezzo*15/100, 'Mobile', art_prezzo*10/100, 'Libreria', art_prezzo*18/100, 'Armadio', art_prezzo*5/100) ScontoFrom Articoli, Categoriewhere Articoli.cat_cod=Categorie.cat_codand art_prezzo>500

Page 80: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio, soluzione Case

select art_descrizione, art_prezzo, Case cat_descrizione when 'Tavolo' then art_prezzo*15/100 when 'Mobile' then art_prezzo*10/100 when 'Libreria' then art_prezzo*18/100 when 'Armadio' then art_prezzo*5/100end as ScontoFrom Articoli, Categoriewhere Articoli.cat_cod=Categorie.cat_codand art_prezzo>500

Page 81: Funzioni in SQL. Tipi di Funzione Funzioni numeriche Funioni di stringhe Funzioni di date Funzioni di conversione Funzioni di selezione

Esercizio (casa)

Fare lo stesso esercizio precedente supponendo che per i Tavoli, il limite minimo di spesa sia 400 euro, per i mobili di 550 euro, per le librerie di 350 euro e per gli armadi di 700 euro