際際滷

際際滷Share a Scribd company logo
22/07/04 Ing. Ronchi Sergio 1
QUERIES (proiezione)
Visualizzare tutti i dati contenuti in una tabella:
SELECT * FROM PRODOTTI;
Selezione delle colonne (o dei campi)
SELECT NOME,PREZZO FROM PRODOTTI;
Selezione delle colonne (o dei campi) con alias
SELECT NOME As Prodotto FROM PRODOTTI;
(As 竪 opzionale)
Selezione delle colonne con esecuzioni di operazioni sulle colonne:
SELECT NOME prodotto,
PREZZO*(1+IVA /100) Prezzo con IVA FROM PRODOTTI;
In Oracle esiste una pseudotabella denominata DUAL che serve per effettuare
prove e per disporre di dati non memorizzati:
SELECT SYSDATE FROM DUAL;
SELECT SYSTIMESTAMP FROM DUAL
22/07/04 Ing. Ronchi Sergio 2
FUNZIONI STRINGA
Concatenazione
SELECT COGNOME || ',' || NOME FROM STUDENTI;
SELECT CONCAT(COGNOME, ',' , NOME) FROM STUDENTI;
Sottostringa
SELECT SUBSTR(NOME,1,3) FROM STUDENTI;
Altre funzioni stringa:
UPPER(str), LOWER(str) trasforma in maiuscolo o in minuscolo
INITCAP(str) pone la prima lettera maiuscola
TRIM(str), LTRIM(str), RTRIM(str) elimina spazi a destra e/o a sinistra 竪 anche possibile
specificare il carattere da eliminare
LTRIM(descrizione,.) oppure RTRIM(descrizione,.)
TRIM(. from descrizione)
LPAD(str,n,[car]), RPAD(str,n,[car]) riempie la stringa con n caratteri
LENGTH(str) lunghezza
INSTR(str,'p') d la posizione della prima occorrenza di 'p
ASCII(Str), CHR(n) codice ascii da un carattere o il viceversa
SOUNDEX(str) d un codice associato al suono di una stringa in
Inglese: permette di confrontare stringhe simili
TRANSLATE(str,maschera,sostituto) sostituisce I caratteri uguali nella stringa di origine
select TRANSLATE('ABCDEF','AXC','123') from dual;
restutuisce 1B3DEF
22/07/04 Ing. Ronchi Sergio 3
Funzioni per le date
In Oracle ai campi DATE si applica laritmetica delle date, (somma e sottrazione in giorni)
select ename, hiredate, sysdate-hiredate from emp;
select ename, hiredate, ROUND(sysdate)-hiredate from emp; (elimina le frazioni)
Ad esempio mi ritorna il numero di giorni (e frazioni) dalla data di assunzione.
ADD_MONTHS(data,n) aggiunge n mesi alla data (o sottrae se n 竪 negativo)
LAST_DAY(data) ultimo giorno del mese
MONTHS_BETWEEN(d2,d1) differenza tra date in mesi
NEXT_DAY(data,VENERDI) d il prossimo VENERDI
TO_CHAR(data,formato) d una sctringa contenente una data
TO_DATE(stringa,formato) ottiene una data da una stringa
TRUNC(data, formato), ROUND(data, formato) tronca/arrotonda una data nel formato dato
il formato pu嘆 essere MONTH, YEAR,
Principali formati nelle date:
MM (mese a due cifre), MON(iniziali del mese), MONTH (mese esteso), RM mese romano
DD (giorno del mese), DDD (giorno dellanno), D giorno della settimana, DAY (nome)
YYYY (anno 4 cifre), YY (Anno 2 cifre)
Q (Trimestre)
WW (settimana nellanno), W settimana nel mese
HH (ora) HH24(ora base 24), MI (minuti), SS(Secondi)
22/07/04 Ing. Ronchi Sergio 4
Funzioni aritmetiche
Esiste un insieme notevole di tutte le principali funzioni aritmetiche e logiche
tra le quali sicuramente importante 竪 la funzione di arrotondamento:
ROUND(X,2) arrotonda con due decimali
Si notino anche le seguenti funzioni che operano su elenchi di valori:
GREATEST(v1,v2,v3,.) d il valore pi湛 alto
LEAST(v1,v2,v3,) d il valore pi湛 basso
Per i formati numerici 竪 anche importante la funt湛zione TO_CHAR(number,formato), questa
permette di ottenere tutti formati comuni, ad esempio
SELECT ename, TO_CHAR(sal,$9,990.00) FROM EMP
Per altro esiste anche la possibilt inversa di un parsing da stringa a numero
TO_NUMBER(stringa,formato)
22/07/04 Ing. Ronchi Sergio 5
Funzioni per i valori NULL
NVL(valore, sostituto) specifica un sostituto se valore 竪 NULL
NVL2(valore,espr1,espr2) se valore 竪 nullo torna espr2 altrimenti espr1
NULLIF(espr1,espr2) ritorna NULL se espr1=espr2, altrimenti torna espr1
COALESCE(v1,v2,v3,.) d il primo valore non nullo
22/07/04 Ing. Ronchi Sergio 6
Funzioni di controllo
In oracle esiste una funzione molto particolare per realizzare una struttura di tipo if..then..else,
si tratta anzi di una struttura simile a uno switch.
DECODE (valore, if1,then1,if2,then2,if3,.,else)
La funzione accetta solo confronti diretti di uguaglainza, non permette cio竪 confronti > <
Per ovviare a questo 竪 possibile usare in modo opportuno la funzione SIGN(val) che d 1 se il
valore 竪 positivo, -1 se negativo e 0 se nullo.
Ad esempio DECODE(SIGN(voto-5.9),1,sufficiente,insufficiente)
Esiste poi anche una vera e propria struttura CASE
SELECT
CASE voto
when 5 then 'insufficiente'
when 6 then 'sufficiente'
when 7 then 'discreto'
else 'voto sconosciuto'
END
FROM valutazioni
22/07/04 Ing. Ronchi Sergio 7
Query di Selezione
La clausola where estrae solo i record che rispettano la condizione:
SELECT COGNOME, NOME
FROM ANAGRAFICA
WHERE PROVINCIA='MI'
Ovviamente sono possibili tutti i tipi di confronti logici, i vari operatori logici
AND OR NOT e l'uso di funzioni o operatori aritmetici:
SELECT COGNOME, NOME, ALTEZZA
FROM ANAGRAFICA
WHERE PROVINCIA!='MI' AND ALTEZZA>1.70
AND (TO_CHAR(DATA,'YYYY') BETWEEN '1980' AND '1981');
22/07/04 Ing. Ronchi Sergio 8
Query di Selezione
Ordinamento del risultato di una query:
SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA
WHERE PROVINCIA!='MI' ORDER BY COGNOME, NOME;
Ovviamente 竪 possibile invertire l'ordine utilizzando DESC:
SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA
ORDER BY ALTEZZA DESC;
Nell'order by 竪 possibile utilizzare anche gli ALIAS:
SELECT COGNOME, PESO-ALTEZZA*100 SOVRAPPESO
FROM ANAGRAFICA
ORDER BY SOVRAPPESO;
22/07/04 Ing. Ronchi Sergio 9
Uso di LIKE
Loperatore LIKE permette di effettuare filtri parziali su un campo di cui non si
conosce il valore in modo completo.
% jolly per n caratteri
_ jolly per un carattere
Ad esempio per avere tutti quelli che iniziano con S
SELECT ename FROM emp where ename LIKE S%
Ad esempio per avere tutti quelli la cui seconda lettera 竪 una o
SELECT ename FROM emp where ename LIKE _o%
Ad esempio per avere tutti quelli che iniziano son SA_
SELECT ename FROM emp where JOB_ID LIKE SA_% ESCAPE
22/07/04 Ing. Ronchi Sergio 10
Altri operatori (IS, IN)
Loperatore IS consente di confrontare un valore null
SELECT * FROM PRODOTTI WHERE CATEGORIA IS NULL
LOperatore IN consente di verificare lappartenenza di un valore in un insieme
SELECT * FROM STUDENTI WHERE PROVINCIA IN (MI,BG,BS)
22/07/04 Ing. Ronchi Sergio 11
Funzioni di Raggruppamento
Permettere di ottenere totalizzazioni su tutta la tabella o
su dati congruenti e raggruppati.
SELECT AVG(ALTEZZA) FROM ANAGRAFICA; MEDIA
Altre funzioni di raggruppamento sono
SUM() (somma) COUNT() (conteggio)
MIN() (minimo) MAX() (massimo)
STDDEV() (deviazione standard) VARIANCE() (Varianza)
竪 possibile ovviamente utilizzare la clausola WHERE
22/07/04 Ing. Ronchi Sergio 12
Funzioni di Raggruppamento
Se si vuole calcolare un valore per raggruppamenti:
SELECT PROVINCIA, AVG(ALTEZZA)
FROM ANAGRAFICA GROUP BY PROVINCIA;
SELECT PROVINCIA, SESSO, AVG(ALTEZZA)
FROM ANAGRAFICA GROUP BY PROVINCIA,SESSO;
Uso di WHERE  GROUP BY  ORDER BY:
SELECT PROVINCIA, SESSO, AVG(ALTEZZA) MEDIA
FROM ANAGRAFICA WHERE PESO>50
GROUP BY PROVINCIA, SESSO
ORDER BY MEDIA;
da notare l'uso dell'alias nel ORDER BY
SELECT PROVINCIA, SESSO, AVG(ALTEZZA) MEDIA
FROM ANAGRAFICA
GROUP BY PROVINCIA, SESSO
HAVING PROVINCIA!=EE
ORDER BY MEDIA;
La clausola having 竪 differente dalla where perch辿 si applica solo alle colonne
raggruppate e viene applicata dopo che la where ha gi eventualmente eliminato
alcune righe
22/07/04 Ing. Ronchi Sergio 13
Query con Join tra tabelle
Riportiamo ora la sintassi delle JOIN in Oracle che tuttavia differisce da quella
standard di SQL.
JOIN NATURALE (EQUIJOIN o INNER JOIN)
SELECT COGNOME, ANAGRAFICA.NOME, PROVINCE.NOME
FROM ANAGRAFICA, PROVINCE
WHERE ANAGRAFICA.PROVINCIA=PROVINCE.SIGLA
vengono visualizzati solo i record che hanno il codice (sigla) corrispondente.
(Attenzione omettendo la condizione WHERE o sbagliando tale condizione si pu嘆
ottenere il prodotto cartesiano delle due tabelle)
Per semplicit 竪 possibile dichiarare degli alias per le tabelle in modo da non dover
ripetere sempre tutto il nome per esteso.
SELECT COGNOME, ANAGRAFICA.NOME, PROVINCE.NOME
FROM ANAGRAFICA A, PROVINCE P
WHERE A.PROVINCIA=P.SIGLA
22/07/04 Ing. Ronchi Sergio 14
Nonequijoin
Pu嘆 succedere che la join tra due tabelle non sia semplicemente determinata da un
legame di uguaglianza tra PK e FK. Ma che la relazione sia pi湛 complessa.
Vogliamo trovare tutti coloro che hanno un salario allinterno del range del loro
grado:
SELECT last_name,salary,grade
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
22/07/04 Ing. Ronchi Sergio 15
OUTER JOIN
- RIGHT JOIN
SELECT COGNOME, PROVINCIA.NOME
FROM ANAGRAFICA , PROVINCE
WHERE ANAGRAFICA.PROVINCIA(+)=PROVINCE.SIGLA
mostra tutti i record della tabella di destra e solo quelli corrispondenti
della tabella di sinistra. In questo caso mostrano tutte le province, anche se non hanno
persone in anagrafica.
Il simbolo (+) va messa dalla parte della tabella dove linformazione 竪 mancante
- LEFT JOIN
SELECT COGNOME, PROVINCIA.NOME
FROM ANAGRAFICA , PROVINCE
WHERE ANAGRAFICA.PROVINCIA=PROVINCE.SIGLA(+)
mostra tutti i record della tabella di sinistra. In questo caso mostra tutte le persone
anche se non dovessero avere una provincia associata.
22/07/04 Ing. Ronchi Sergio 16
SELF JOIN
In alcuni casi 竪 necessario eseguire una join su campi della stessa tabella:
Ad esempio se volessi trovare tutti coloro che hanno nome e cognome uguali,
ma codici diversi.
SELECT A1.COGNOME, A1.NOME, A1.DATA, A2.DATA
FROM ANAGRAFICA A1 , ANAGRAFICA A2
WHERE A1.COGNOME=A2.COGNOME AND A1.NOME=A2.NOME
AND A1.CODICE>A2.CODICE;
22/07/04 Ing. Ronchi Sergio 17
SELF OUTER JOIN
Voglio visualizzare cognome e nome di una persona e cognome e nome della madre.
Tutte le persone si trovano nella stessa tabella
SELECT CONCAT(FIGLIO.COGNOME,, ,FIGLIO.NOME) PERSONA,
CONCAT(MADRE.COGNOME,, , MADRE.NOME) MAMMA
FROM ANAGRAFICA FIGLIO, ANAGRAFICA MADRE
WHERE FIGLIO.GENITORE=MADRE.CODICE(+);
22/07/04 Ing. Ronchi Sergio 18
Query con Join multiple
Tabelle relazionate pi湛 volte con la stessa tabella. Ad esempio la relazione tra I Voli
(origine e destinazione) e gli Aeroporti.
SELECT CODVOLO,ORIGINE.NOME, DESTINAZIONE.NOME, DATA
FROM VOLI, AEROPORTI ORIGINE, AEROPORTI DESTINAZIONE
WHERE VOLI.ORIGINE=ORIGINE.CODICE AND
VOLI.DEST=DESTINAZIONE.CODICE;
22/07/04 Ing. Ronchi Sergio 19
JOIN CON SINTASSI STANDARD
Oracle accetta per le join anche una sintassi SQL standard
EQUIJOIN:
select ename, dname from emp inner join dept on emp.deptno=dept.deptno
OUTER JOIN:
select ename, dname from emp left join dept on emp.deptno=dept.deptno
select ename, dname from emp right join dept on emp.deptno=dept.deptno
select ename, dname from emp full join dept on emp.deptno=dept.deptno
22/07/04 Ing. Ronchi Sergio 20
Subqueries
Permettono diverse operazioni che altrimenti dovrebbero essere realizzate con
pi湛 di una query.
Estrae le persone con altezza superiore alla media
SELECT COGNOME, NOME, ALTEZZA
FROM ANAGRAFICA
WHERE ALTEZZA> (SELECT AVG(ALTEZZA) FROM ANAGRAFICA);
Estrae le persone della lombardia
SELECT COGNOME, NOME, ALTEZZA
FROM ANAGRAFICA WHERE PROVINCIA IN (SELECT SIGLA FROM PROVINCE
WHERE REGIONE='Lombardia');
La stessa fatta con una JOIN
SELECT COGNOME, NOME, ALTEZZA
FROM ANAGRAFICA, PROVINCE WHERE
ANAGRAFICA.PROVINCIA=PROVINCE.SIGLA AND
PROVINCE.REGIONE='Lombardia';
22/07/04 Ing. Ronchi Sergio 21
Errori da evitare
Questa query 竪 corretta, ma non 竪 efficiente:
SELECT Titolo FROM Biblioteca
WHERE Titolo NOT IN (Select Titolo from BIBLIOTECA_PRESTITO)
ORDER BY TITOLO;
E molto meglio usare una JOIN:
SELECT distinct B.Titolo
FROM Biblioteca_PRESTITO BP right join BIBLIOTECA B
on BP.Titolo=B.Titolo
Where BP.Titolo is NULL
Order by B.Titolo
Si noti infattin che in una outer join nella colonna dove non c竪 una corrispondenza si
vha un valor NULL:
22/07/04 Ing. Ronchi Sergio 22
Uso di EXISTS
EXISTS effettua un controllo di esistenza, pu嘆 essere usato a volte in sostituzione della clausola IN
con le subquery.
Ad esempio:
SELECT NomeAutore, Titolo FROM Biblioteca_Autore BA
WHERE NomeAutore IN
(SELECT NomeAutore FROM Biblioteca_Autore
GROUP BY NomeAutore
HAVING COUNT(Titolo)>1)
ORDER BY NomeAutore,Titolo
Pu嘆 essese sostituita da questa con una subquery correlata alla query principale:
SELECT NomeAutore, Titolo FROM Biblioteca_Autore BA
WHERE EXISTS
(SELECT * FROM Biblioteca_Autore BA2
WHERE BA.NomeAutore=BA2.NomeAutore
GROUP BY BA2.NomeAutore
HAVING COUNT(BA2.Titolo)>1)
ORDER BY NomeAutore,Titolo
22/07/04 Ing. Ronchi Sergio 23
UNION
Permettono di ottenere una vista in cui record provenienti da pi湛
tabelle vengono uniti. Si pensi ad due insiemi ora saranno possibile le seguenti
situazioni:
- estrarre tutti gli elementi sia del primo che del secondo insieme senza elencare I
doppioni
SELECT CODICE, NOME FROM LIBRI
UNION
SELECT CODICE, NOME FROM SOFTWARE;
- estrarre tutti gli elementi sia del primo che del secondo insieme elencando anche I
doppioni
SELECT CODICE, NOME FROM LIBRI
UNION ALL
SELECT CODICE, NOME FROM SOFTWARE;
22/07/04 Ing. Ronchi Sergio 24
INTERSECT - MINUS
Ipotizziamo sempre di avere due insiemi. Questa volta si vogliono vedere solo le voci
presenti in entrambi
SELECT CODICE, TITOLO FROM LIBRI
INTERSECT
SELECT CODICE, TITOLO FROM LIBRI_ORDINATI;
Questa volta si vogliono vedere solo le voci nuove non presenti nel primo insieme
SELECT CODICE, TITOLO FROM LIBRI_ORDINATI
MINUS
SELECT CODICE, TITOLO FROM LIBRI;

More Related Content

Viewers also liked (19)

Java lezione 9
Java lezione 9Java lezione 9
Java lezione 9
Sergio Ronchi
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
Sergio Ronchi
Design Patterns
Design PatternsDesign Patterns
Design Patterns
Sergio Ronchi
Java lezione 14
Java lezione 14Java lezione 14
Java lezione 14
Sergio Ronchi
Oracle 3 (sq lnet)
Oracle 3 (sq lnet)Oracle 3 (sq lnet)
Oracle 3 (sq lnet)
Sergio Ronchi
Sql 4
Sql 4Sql 4
Sql 4
Sergio Ronchi
Java lezione 13
Java lezione 13Java lezione 13
Java lezione 13
Sergio Ronchi
Java lezione 15
Java lezione 15Java lezione 15
Java lezione 15
Sergio Ronchi
Oracle 2 (sqlplus)
Oracle 2 (sqlplus)Oracle 2 (sqlplus)
Oracle 2 (sqlplus)
Sergio Ronchi
Sql 1
Sql 1Sql 1
Sql 1
Sergio Ronchi
Java lezione 2
Java lezione 2Java lezione 2
Java lezione 2
Sergio Ronchi
Oracle PL sql 2
Oracle PL sql 2Oracle PL sql 2
Oracle PL sql 2
Sergio Ronchi
MySQL
MySQLMySQL
MySQL
Sergio Ronchi
Sql 2
Sql 2Sql 2
Sql 2
Sergio Ronchi
Java lezione 11
Java lezione 11Java lezione 11
Java lezione 11
Sergio Ronchi
Java lezione 8
Java lezione 8Java lezione 8
Java lezione 8
Sergio Ronchi
Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
Sergio Ronchi
Oracle PL sql 3
Oracle PL sql 3Oracle PL sql 3
Oracle PL sql 3
Sergio Ronchi
Java lezione 10
Java lezione 10Java lezione 10
Java lezione 10
Sergio Ronchi

Similar to Sql 3 (14)

Oracle PL sql 1
Oracle PL sql 1Oracle PL sql 1
Oracle PL sql 1
Sergio Ronchi
primi comandi SQL con Mysql
primi comandi SQL con Mysqlprimi comandi SQL con Mysql
primi comandi SQL con Mysql
I.S.I.S. "Antonio Serra" - Napoli
Base dati capitolo_5
Base dati capitolo_5Base dati capitolo_5
Base dati capitolo_5
gestlab
Dispensa di PL-SQL
Dispensa di PL-SQLDispensa di PL-SQL
Dispensa di PL-SQL
Antonio Tandoi
Corso js and angular
Corso js and angularCorso js and angular
Corso js and angular
Giuseppe Viggiano
Introduction Dax
Introduction DaxIntroduction Dax
Introduction Dax
Marco Pozzan
Umano vs Computer: un esempio pratico
Umano vs Computer: un esempio praticoUmano vs Computer: un esempio pratico
Umano vs Computer: un esempio pratico
Francesco Sblendorio
IBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL ServerIBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL Server
Riccardo De Mattia
Informatica - uso di excel
Informatica - uso di excelInformatica - uso di excel
Informatica - uso di excel
Dario
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
PasqualeRuocco5
Sql stored procedures
Sql stored proceduresSql stored procedures
Sql stored procedures
Matteo Ceserani
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
Pasquale Paola
Il foglio elettronico a supporto dellattivit professionale [AP03-S]
Il foglio elettronico a supporto dellattivit professionale [AP03-S]Il foglio elettronico a supporto dellattivit professionale [AP03-S]
Il foglio elettronico a supporto dellattivit professionale [AP03-S]
Andrea Maddalena
Informatica - Excel Intermedio
Informatica - Excel IntermedioInformatica - Excel Intermedio
Informatica - Excel Intermedio
Francesco Venuto
Base dati capitolo_5
Base dati capitolo_5Base dati capitolo_5
Base dati capitolo_5
gestlab
Introduction Dax
Introduction DaxIntroduction Dax
Introduction Dax
Marco Pozzan
Umano vs Computer: un esempio pratico
Umano vs Computer: un esempio praticoUmano vs Computer: un esempio pratico
Umano vs Computer: un esempio pratico
Francesco Sblendorio
IBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL ServerIBM i db2 udb vs Microsoft SQL Server
IBM i db2 udb vs Microsoft SQL Server
Riccardo De Mattia
Informatica - uso di excel
Informatica - uso di excelInformatica - uso di excel
Informatica - uso di excel
Dario
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
PasqualeRuocco5
Sql stored procedures
Sql stored proceduresSql stored procedures
Sql stored procedures
Matteo Ceserani
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
Pasquale Paola
Il foglio elettronico a supporto dellattivit professionale [AP03-S]
Il foglio elettronico a supporto dellattivit professionale [AP03-S]Il foglio elettronico a supporto dellattivit professionale [AP03-S]
Il foglio elettronico a supporto dellattivit professionale [AP03-S]
Andrea Maddalena
Informatica - Excel Intermedio
Informatica - Excel IntermedioInformatica - Excel Intermedio
Informatica - Excel Intermedio
Francesco Venuto

More from Sergio Ronchi (13)

Java lezione 18
Java lezione 18Java lezione 18
Java lezione 18
Sergio Ronchi
Java lezione 17
Java lezione 17Java lezione 17
Java lezione 17
Sergio Ronchi
Java lezione 16
Java lezione 16Java lezione 16
Java lezione 16
Sergio Ronchi
Java lezione 12
Java lezione 12Java lezione 12
Java lezione 12
Sergio Ronchi
Java lezione 7
Java lezione 7Java lezione 7
Java lezione 7
Sergio Ronchi
Java lezione 6
Java lezione 6Java lezione 6
Java lezione 6
Sergio Ronchi
Java lezione 5
Java lezione 5Java lezione 5
Java lezione 5
Sergio Ronchi
Java lezione 4
Java lezione 4Java lezione 4
Java lezione 4
Sergio Ronchi
Java lezione 3
Java lezione 3Java lezione 3
Java lezione 3
Sergio Ronchi
Java introduzione
Java introduzioneJava introduzione
Java introduzione
Sergio Ronchi
Oracle PLSql 4
Oracle PLSql 4Oracle PLSql 4
Oracle PLSql 4
Sergio Ronchi
Oracle 1
Oracle 1Oracle 1
Oracle 1
Sergio Ronchi
Sql 5
Sql 5Sql 5
Sql 5
Sergio Ronchi

Sql 3

  • 1. 22/07/04 Ing. Ronchi Sergio 1 QUERIES (proiezione) Visualizzare tutti i dati contenuti in una tabella: SELECT * FROM PRODOTTI; Selezione delle colonne (o dei campi) SELECT NOME,PREZZO FROM PRODOTTI; Selezione delle colonne (o dei campi) con alias SELECT NOME As Prodotto FROM PRODOTTI; (As 竪 opzionale) Selezione delle colonne con esecuzioni di operazioni sulle colonne: SELECT NOME prodotto, PREZZO*(1+IVA /100) Prezzo con IVA FROM PRODOTTI; In Oracle esiste una pseudotabella denominata DUAL che serve per effettuare prove e per disporre di dati non memorizzati: SELECT SYSDATE FROM DUAL; SELECT SYSTIMESTAMP FROM DUAL
  • 2. 22/07/04 Ing. Ronchi Sergio 2 FUNZIONI STRINGA Concatenazione SELECT COGNOME || ',' || NOME FROM STUDENTI; SELECT CONCAT(COGNOME, ',' , NOME) FROM STUDENTI; Sottostringa SELECT SUBSTR(NOME,1,3) FROM STUDENTI; Altre funzioni stringa: UPPER(str), LOWER(str) trasforma in maiuscolo o in minuscolo INITCAP(str) pone la prima lettera maiuscola TRIM(str), LTRIM(str), RTRIM(str) elimina spazi a destra e/o a sinistra 竪 anche possibile specificare il carattere da eliminare LTRIM(descrizione,.) oppure RTRIM(descrizione,.) TRIM(. from descrizione) LPAD(str,n,[car]), RPAD(str,n,[car]) riempie la stringa con n caratteri LENGTH(str) lunghezza INSTR(str,'p') d la posizione della prima occorrenza di 'p ASCII(Str), CHR(n) codice ascii da un carattere o il viceversa SOUNDEX(str) d un codice associato al suono di una stringa in Inglese: permette di confrontare stringhe simili TRANSLATE(str,maschera,sostituto) sostituisce I caratteri uguali nella stringa di origine select TRANSLATE('ABCDEF','AXC','123') from dual; restutuisce 1B3DEF
  • 3. 22/07/04 Ing. Ronchi Sergio 3 Funzioni per le date In Oracle ai campi DATE si applica laritmetica delle date, (somma e sottrazione in giorni) select ename, hiredate, sysdate-hiredate from emp; select ename, hiredate, ROUND(sysdate)-hiredate from emp; (elimina le frazioni) Ad esempio mi ritorna il numero di giorni (e frazioni) dalla data di assunzione. ADD_MONTHS(data,n) aggiunge n mesi alla data (o sottrae se n 竪 negativo) LAST_DAY(data) ultimo giorno del mese MONTHS_BETWEEN(d2,d1) differenza tra date in mesi NEXT_DAY(data,VENERDI) d il prossimo VENERDI TO_CHAR(data,formato) d una sctringa contenente una data TO_DATE(stringa,formato) ottiene una data da una stringa TRUNC(data, formato), ROUND(data, formato) tronca/arrotonda una data nel formato dato il formato pu嘆 essere MONTH, YEAR, Principali formati nelle date: MM (mese a due cifre), MON(iniziali del mese), MONTH (mese esteso), RM mese romano DD (giorno del mese), DDD (giorno dellanno), D giorno della settimana, DAY (nome) YYYY (anno 4 cifre), YY (Anno 2 cifre) Q (Trimestre) WW (settimana nellanno), W settimana nel mese HH (ora) HH24(ora base 24), MI (minuti), SS(Secondi)
  • 4. 22/07/04 Ing. Ronchi Sergio 4 Funzioni aritmetiche Esiste un insieme notevole di tutte le principali funzioni aritmetiche e logiche tra le quali sicuramente importante 竪 la funzione di arrotondamento: ROUND(X,2) arrotonda con due decimali Si notino anche le seguenti funzioni che operano su elenchi di valori: GREATEST(v1,v2,v3,.) d il valore pi湛 alto LEAST(v1,v2,v3,) d il valore pi湛 basso Per i formati numerici 竪 anche importante la funt湛zione TO_CHAR(number,formato), questa permette di ottenere tutti formati comuni, ad esempio SELECT ename, TO_CHAR(sal,$9,990.00) FROM EMP Per altro esiste anche la possibilt inversa di un parsing da stringa a numero TO_NUMBER(stringa,formato)
  • 5. 22/07/04 Ing. Ronchi Sergio 5 Funzioni per i valori NULL NVL(valore, sostituto) specifica un sostituto se valore 竪 NULL NVL2(valore,espr1,espr2) se valore 竪 nullo torna espr2 altrimenti espr1 NULLIF(espr1,espr2) ritorna NULL se espr1=espr2, altrimenti torna espr1 COALESCE(v1,v2,v3,.) d il primo valore non nullo
  • 6. 22/07/04 Ing. Ronchi Sergio 6 Funzioni di controllo In oracle esiste una funzione molto particolare per realizzare una struttura di tipo if..then..else, si tratta anzi di una struttura simile a uno switch. DECODE (valore, if1,then1,if2,then2,if3,.,else) La funzione accetta solo confronti diretti di uguaglainza, non permette cio竪 confronti > < Per ovviare a questo 竪 possibile usare in modo opportuno la funzione SIGN(val) che d 1 se il valore 竪 positivo, -1 se negativo e 0 se nullo. Ad esempio DECODE(SIGN(voto-5.9),1,sufficiente,insufficiente) Esiste poi anche una vera e propria struttura CASE SELECT CASE voto when 5 then 'insufficiente' when 6 then 'sufficiente' when 7 then 'discreto' else 'voto sconosciuto' END FROM valutazioni
  • 7. 22/07/04 Ing. Ronchi Sergio 7 Query di Selezione La clausola where estrae solo i record che rispettano la condizione: SELECT COGNOME, NOME FROM ANAGRAFICA WHERE PROVINCIA='MI' Ovviamente sono possibili tutti i tipi di confronti logici, i vari operatori logici AND OR NOT e l'uso di funzioni o operatori aritmetici: SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA WHERE PROVINCIA!='MI' AND ALTEZZA>1.70 AND (TO_CHAR(DATA,'YYYY') BETWEEN '1980' AND '1981');
  • 8. 22/07/04 Ing. Ronchi Sergio 8 Query di Selezione Ordinamento del risultato di una query: SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA WHERE PROVINCIA!='MI' ORDER BY COGNOME, NOME; Ovviamente 竪 possibile invertire l'ordine utilizzando DESC: SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA ORDER BY ALTEZZA DESC; Nell'order by 竪 possibile utilizzare anche gli ALIAS: SELECT COGNOME, PESO-ALTEZZA*100 SOVRAPPESO FROM ANAGRAFICA ORDER BY SOVRAPPESO;
  • 9. 22/07/04 Ing. Ronchi Sergio 9 Uso di LIKE Loperatore LIKE permette di effettuare filtri parziali su un campo di cui non si conosce il valore in modo completo. % jolly per n caratteri _ jolly per un carattere Ad esempio per avere tutti quelli che iniziano con S SELECT ename FROM emp where ename LIKE S% Ad esempio per avere tutti quelli la cui seconda lettera 竪 una o SELECT ename FROM emp where ename LIKE _o% Ad esempio per avere tutti quelli che iniziano son SA_ SELECT ename FROM emp where JOB_ID LIKE SA_% ESCAPE
  • 10. 22/07/04 Ing. Ronchi Sergio 10 Altri operatori (IS, IN) Loperatore IS consente di confrontare un valore null SELECT * FROM PRODOTTI WHERE CATEGORIA IS NULL LOperatore IN consente di verificare lappartenenza di un valore in un insieme SELECT * FROM STUDENTI WHERE PROVINCIA IN (MI,BG,BS)
  • 11. 22/07/04 Ing. Ronchi Sergio 11 Funzioni di Raggruppamento Permettere di ottenere totalizzazioni su tutta la tabella o su dati congruenti e raggruppati. SELECT AVG(ALTEZZA) FROM ANAGRAFICA; MEDIA Altre funzioni di raggruppamento sono SUM() (somma) COUNT() (conteggio) MIN() (minimo) MAX() (massimo) STDDEV() (deviazione standard) VARIANCE() (Varianza) 竪 possibile ovviamente utilizzare la clausola WHERE
  • 12. 22/07/04 Ing. Ronchi Sergio 12 Funzioni di Raggruppamento Se si vuole calcolare un valore per raggruppamenti: SELECT PROVINCIA, AVG(ALTEZZA) FROM ANAGRAFICA GROUP BY PROVINCIA; SELECT PROVINCIA, SESSO, AVG(ALTEZZA) FROM ANAGRAFICA GROUP BY PROVINCIA,SESSO; Uso di WHERE GROUP BY ORDER BY: SELECT PROVINCIA, SESSO, AVG(ALTEZZA) MEDIA FROM ANAGRAFICA WHERE PESO>50 GROUP BY PROVINCIA, SESSO ORDER BY MEDIA; da notare l'uso dell'alias nel ORDER BY SELECT PROVINCIA, SESSO, AVG(ALTEZZA) MEDIA FROM ANAGRAFICA GROUP BY PROVINCIA, SESSO HAVING PROVINCIA!=EE ORDER BY MEDIA; La clausola having 竪 differente dalla where perch辿 si applica solo alle colonne raggruppate e viene applicata dopo che la where ha gi eventualmente eliminato alcune righe
  • 13. 22/07/04 Ing. Ronchi Sergio 13 Query con Join tra tabelle Riportiamo ora la sintassi delle JOIN in Oracle che tuttavia differisce da quella standard di SQL. JOIN NATURALE (EQUIJOIN o INNER JOIN) SELECT COGNOME, ANAGRAFICA.NOME, PROVINCE.NOME FROM ANAGRAFICA, PROVINCE WHERE ANAGRAFICA.PROVINCIA=PROVINCE.SIGLA vengono visualizzati solo i record che hanno il codice (sigla) corrispondente. (Attenzione omettendo la condizione WHERE o sbagliando tale condizione si pu嘆 ottenere il prodotto cartesiano delle due tabelle) Per semplicit 竪 possibile dichiarare degli alias per le tabelle in modo da non dover ripetere sempre tutto il nome per esteso. SELECT COGNOME, ANAGRAFICA.NOME, PROVINCE.NOME FROM ANAGRAFICA A, PROVINCE P WHERE A.PROVINCIA=P.SIGLA
  • 14. 22/07/04 Ing. Ronchi Sergio 14 Nonequijoin Pu嘆 succedere che la join tra due tabelle non sia semplicemente determinata da un legame di uguaglianza tra PK e FK. Ma che la relazione sia pi湛 complessa. Vogliamo trovare tutti coloro che hanno un salario allinterno del range del loro grado: SELECT last_name,salary,grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal
  • 15. 22/07/04 Ing. Ronchi Sergio 15 OUTER JOIN - RIGHT JOIN SELECT COGNOME, PROVINCIA.NOME FROM ANAGRAFICA , PROVINCE WHERE ANAGRAFICA.PROVINCIA(+)=PROVINCE.SIGLA mostra tutti i record della tabella di destra e solo quelli corrispondenti della tabella di sinistra. In questo caso mostrano tutte le province, anche se non hanno persone in anagrafica. Il simbolo (+) va messa dalla parte della tabella dove linformazione 竪 mancante - LEFT JOIN SELECT COGNOME, PROVINCIA.NOME FROM ANAGRAFICA , PROVINCE WHERE ANAGRAFICA.PROVINCIA=PROVINCE.SIGLA(+) mostra tutti i record della tabella di sinistra. In questo caso mostra tutte le persone anche se non dovessero avere una provincia associata.
  • 16. 22/07/04 Ing. Ronchi Sergio 16 SELF JOIN In alcuni casi 竪 necessario eseguire una join su campi della stessa tabella: Ad esempio se volessi trovare tutti coloro che hanno nome e cognome uguali, ma codici diversi. SELECT A1.COGNOME, A1.NOME, A1.DATA, A2.DATA FROM ANAGRAFICA A1 , ANAGRAFICA A2 WHERE A1.COGNOME=A2.COGNOME AND A1.NOME=A2.NOME AND A1.CODICE>A2.CODICE;
  • 17. 22/07/04 Ing. Ronchi Sergio 17 SELF OUTER JOIN Voglio visualizzare cognome e nome di una persona e cognome e nome della madre. Tutte le persone si trovano nella stessa tabella SELECT CONCAT(FIGLIO.COGNOME,, ,FIGLIO.NOME) PERSONA, CONCAT(MADRE.COGNOME,, , MADRE.NOME) MAMMA FROM ANAGRAFICA FIGLIO, ANAGRAFICA MADRE WHERE FIGLIO.GENITORE=MADRE.CODICE(+);
  • 18. 22/07/04 Ing. Ronchi Sergio 18 Query con Join multiple Tabelle relazionate pi湛 volte con la stessa tabella. Ad esempio la relazione tra I Voli (origine e destinazione) e gli Aeroporti. SELECT CODVOLO,ORIGINE.NOME, DESTINAZIONE.NOME, DATA FROM VOLI, AEROPORTI ORIGINE, AEROPORTI DESTINAZIONE WHERE VOLI.ORIGINE=ORIGINE.CODICE AND VOLI.DEST=DESTINAZIONE.CODICE;
  • 19. 22/07/04 Ing. Ronchi Sergio 19 JOIN CON SINTASSI STANDARD Oracle accetta per le join anche una sintassi SQL standard EQUIJOIN: select ename, dname from emp inner join dept on emp.deptno=dept.deptno OUTER JOIN: select ename, dname from emp left join dept on emp.deptno=dept.deptno select ename, dname from emp right join dept on emp.deptno=dept.deptno select ename, dname from emp full join dept on emp.deptno=dept.deptno
  • 20. 22/07/04 Ing. Ronchi Sergio 20 Subqueries Permettono diverse operazioni che altrimenti dovrebbero essere realizzate con pi湛 di una query. Estrae le persone con altezza superiore alla media SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA WHERE ALTEZZA> (SELECT AVG(ALTEZZA) FROM ANAGRAFICA); Estrae le persone della lombardia SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA WHERE PROVINCIA IN (SELECT SIGLA FROM PROVINCE WHERE REGIONE='Lombardia'); La stessa fatta con una JOIN SELECT COGNOME, NOME, ALTEZZA FROM ANAGRAFICA, PROVINCE WHERE ANAGRAFICA.PROVINCIA=PROVINCE.SIGLA AND PROVINCE.REGIONE='Lombardia';
  • 21. 22/07/04 Ing. Ronchi Sergio 21 Errori da evitare Questa query 竪 corretta, ma non 竪 efficiente: SELECT Titolo FROM Biblioteca WHERE Titolo NOT IN (Select Titolo from BIBLIOTECA_PRESTITO) ORDER BY TITOLO; E molto meglio usare una JOIN: SELECT distinct B.Titolo FROM Biblioteca_PRESTITO BP right join BIBLIOTECA B on BP.Titolo=B.Titolo Where BP.Titolo is NULL Order by B.Titolo Si noti infattin che in una outer join nella colonna dove non c竪 una corrispondenza si vha un valor NULL:
  • 22. 22/07/04 Ing. Ronchi Sergio 22 Uso di EXISTS EXISTS effettua un controllo di esistenza, pu嘆 essere usato a volte in sostituzione della clausola IN con le subquery. Ad esempio: SELECT NomeAutore, Titolo FROM Biblioteca_Autore BA WHERE NomeAutore IN (SELECT NomeAutore FROM Biblioteca_Autore GROUP BY NomeAutore HAVING COUNT(Titolo)>1) ORDER BY NomeAutore,Titolo Pu嘆 essese sostituita da questa con una subquery correlata alla query principale: SELECT NomeAutore, Titolo FROM Biblioteca_Autore BA WHERE EXISTS (SELECT * FROM Biblioteca_Autore BA2 WHERE BA.NomeAutore=BA2.NomeAutore GROUP BY BA2.NomeAutore HAVING COUNT(BA2.Titolo)>1) ORDER BY NomeAutore,Titolo
  • 23. 22/07/04 Ing. Ronchi Sergio 23 UNION Permettono di ottenere una vista in cui record provenienti da pi湛 tabelle vengono uniti. Si pensi ad due insiemi ora saranno possibile le seguenti situazioni: - estrarre tutti gli elementi sia del primo che del secondo insieme senza elencare I doppioni SELECT CODICE, NOME FROM LIBRI UNION SELECT CODICE, NOME FROM SOFTWARE; - estrarre tutti gli elementi sia del primo che del secondo insieme elencando anche I doppioni SELECT CODICE, NOME FROM LIBRI UNION ALL SELECT CODICE, NOME FROM SOFTWARE;
  • 24. 22/07/04 Ing. Ronchi Sergio 24 INTERSECT - MINUS Ipotizziamo sempre di avere due insiemi. Questa volta si vogliono vedere solo le voci presenti in entrambi SELECT CODICE, TITOLO FROM LIBRI INTERSECT SELECT CODICE, TITOLO FROM LIBRI_ORDINATI; Questa volta si vogliono vedere solo le voci nuove non presenti nel primo insieme SELECT CODICE, TITOLO FROM LIBRI_ORDINATI MINUS SELECT CODICE, TITOLO FROM LIBRI;