Semplice introduzione ai DBMS e al linguaggio SQL (con attenzione verso pgsql). Ispirato da Appunti di Informatica Libera - http://informaticalibera.net/
Introduzione al linguaggio SQL con riferimento allo standard Mysql.
Creazione e modifica tabelle, inserimento istanze, funzioni di manipolazione, funzioni di aggregazione.
The Abstract Factory pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes. In the example code, abstract factories like ContinentFactory define interfaces for creating herbivores and carnivores, while concrete factories like AfricaFactory and AmericaFactory implement the interfaces and produce animal objects appropriate for their continent. A client like AnimalWorld uses the factories to populate ecosystems with different sets of animals.
Procedures and functions are subprograms in PL/SQL. Functions return a value while procedures do not return a value. Functions are called and return a value, like sales_for_1995 := tot_sales (1504, 'C'). Procedures are called by name and can pass parameters, like apply_discount( new_company_id, 0.15 ). Parameters can be passed into functions and procedures as IN, OUT or IN OUT parameters. An example shows a function that returns the number of days in a month based on the month number and year passed in as parameters.
The Abstract Factory pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes. In the example code, abstract factories like ContinentFactory define interfaces for creating herbivores and carnivores, while concrete factories like AfricaFactory and AmericaFactory implement the interfaces and produce animal objects appropriate for their continent. A client like AnimalWorld uses the factories to populate ecosystems with different sets of animals.
Procedures and functions are subprograms in PL/SQL. Functions return a value while procedures do not return a value. Functions are called and return a value, like sales_for_1995 := tot_sales (1504, 'C'). Procedures are called by name and can pass parameters, like apply_discount( new_company_id, 0.15 ). Parameters can be passed into functions and procedures as IN, OUT or IN OUT parameters. An example shows a function that returns the number of days in a month based on the month number and year passed in as parameters.
A 5 days introduction to pure javascript programming and Angular for beginners. 際際滷s are in Italian language. Including a lot of code, some exercise and guide for "tour of heroes"
Una delle tecniche utilizzate nei giochi a due avversari in cui uno 竪 una macchina 竪 quella del min-max. Esaminiamola e costruiamone una implementazione object-oriented in C++
Il foglio elettronico a supporto dellattivit professionale [AP03-S]Andrea Maddalena
油
Il seminario presenta le funzionalit e le modalit di utilizzo del foglio elettronico (MS Excel e/o Calc Open Office) quale strumento di supporto per lattivit professionale. Il seminario, dopo una fase introduttiva, dedicata agli utenti che non hanno conoscenza pratica del foglio elettronico, entra nel dettaglio dei principali comandi di calcolo ed elaborazione dati. La funzionalit avanzate sono presentate con il supporto di esempi pratici di elaborazione e rappresentazione con lutilizzo di tabelle pivot e grafici.
The document discusses PL/SQL triggers. It provides an example of creating a trigger on a books table to log changes to a books_hist table. The trigger checks for insert, update, or delete events on the books table and inserts corresponding records into the books_hist table. It also discusses trigger events, the ability to apply triggers at the row level or with a condition, and data dictionary views for viewing trigger information.
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;