2. Il presente corso NON ha la pretesa di sostituire i manuali.
Quanto esposto è il risultato di esperienze maturate
nell’utilizzo di entrambi i database.
4. Raffronto terminologie
Termini di sistema IBM Termini SQL
Libreria (Library) Schema (Schema)
Comprende libreria, giornale e ricevitore
File fisico (Physical file) Tabella (Table)
Per file multi membro usare ALIAS o viste
su membri specifici
Record (Record) Riga (Row)
Campo (Field) Colonna (Column)
Vista logica senza chiavi
(Nonkeyed logical file)
Vista (View)
Le viste in SQL sono sempre *REBUILD
Vista logica con chiavi
(Keyed logical file)
Indice (Index)
Gli indici in SQL non sono articolati come le
viste logiche e non hanno join
5. Differenze MSSQL-DB2UDB
Sono moltissime: dal comportamento alla sintassi,
queste sono alcune differenze sostanziali:
Ordinamento MSSQL ASCII: NULL, numeri, lettere
ordinamento DB2UDB EBCDIC: lettere, numeri, NULL
Sintassi di clausole anche di base (es. UPDATE,
creazione tabelle da altra tabelle, selezione delle prime n
righe)
Tipi di dati e loro utilizzo (es. tipo TIMESTAMP in
MSSQL è un ROWNUMBER, in DB2UDB è una DATA +
ORA)
7. Cwbundbs
Il client standard di IBM i,
installato come componente
di System i Navigator
Espandere fino al database
locale poi selezionare
Esegui uno script SQL
10. SSMS
Microsoft SQL Server Management Studio è il client
standard di Microsoft SQL Server
A partire dalla versione 2008 è possibile utilizzare
l’intellisense per il suggerimento delle colonne e delle
funzioni
11. Management Studio
Connettersi all’istanza e selezionare Nuova query
Digitare la query desiderata
Selezionare
Includi piano
d’esecuzione
14. SQL e NOSQL
Breve parentesi storica e tipologie di motori database
SQL
Lo Structured Query Language è nato in casa IBM nel 1974
per gestire database relazionali
Standard adottato dall’ANSI nel 1986 e dall’ISO nel 1987
Utilizza schemi fissi per la memorizzazione dei dati
NOSQL
Il Not Only SQL non utilizza il modello relazionale
Non usa uno schema fisso
Usa limitatamente o per nulla le join
Utilizza spesso una sintassi stile object-oriented
15. DDL, DML, DQL, DCL
Data Definition Language
Porzione dei comandi SQL per la creazione, modifica e
cancellazione degli oggetti quali tabelle, viste ed indici
Data Modification Language
Porzione dei comandi SQL per la manipolazione dei dati
Data Query Language
Porzione dei comandi SQL per l’interrogazione dei dati
Data Control Language
Porzione dei comandi SQL per la gestione dei permessi
16. Clausole base
SELECT [ ALL | DISTINCT ] lista_elementi_selezione
FROM lista_riferimenti_tabella
[ WHERE espressione_condizionale ]
[ GROUP BY lista_colonne ]
[ HAVING espressione_condizionale ]
[ ORDER BY lista_colonne ]
17. SELECT
Elenco delle colonne da estrarre
ALL è il valore predefinito, DISTINCT estrae
esclusivamente righe univoche
Può contenere espressioni anche complesse
Alias di un campo (rename)
Espressione AS Nome_Nuovo
Solo in MSSQL: Nome_Nuovo = Espressione
18. FROM
Elenco degli archivi e relazione tra di loro
Inner join
Estrae le sole righe in comune tra i due archivi
Left (right) outer join
Estrae tutte le righe dell’archivio di sinistra (destra)
Full outer join
Estrae tutte le righe sia dell’archivio di sinistra che di quello di
destra
Left, right e full outer join riempiono di null i valori delle
colonne dell’archivio secondario in assenza di dato
20. GROUP BY
Esegue un raggruppamento per le colonne elencate
Le colonne specificate in SELECT devono essere
specificate nella GROUP BY o devono essere sottoposte
a formule (es. COUNT, SUM, MAX, ecc.)
21. HAVING
Utilizzabile in presenza di GROUP BY
Esegue condizioni sul risultato del raggruppamento
(es. MAX(col1) > 100)
Può contenere espressioni complesse
22. ORDER BY
Elenco delle colonne per le quali viene eseguito
l’ordinamento
Per ogni colonna è possibile specificare l’ordinamento
crescente (ASC, predefinito) o decrescente (DESC)
23. UNION ed UNION ALL
UNION permette di eseguire un accodamento di una
tabella o vista ad un’altra
Vincolo: tutte le tabelle o viste coinvolte devono essere
normalizzate sullo stesso numero e tipo di colonne
Il nome della colonna viene recuperato dalla prima
tabella o vista elencata
UNION esegue una DISTINCT implicita, quindi se
non necessaria utilizzare sempre UNION ALL che,
non eseguendo ulteriori operazioni, risulta più veloce
24. Uso del valore NULL
NULL indica mancanza di dato o valore sconosciuto, è un valore
speciale diverso da zero e da stringa vuota
In creazione di una tabella si può decidere se una colonna può
assumere valore NULL
NULL è diverso da NULL in una qualsiasi comparazione
per ispezionare il contenuto di un campo occorre utilizzare la sintassi
IS NULL oppure IS NOT NULL
se durante una join il valore di entrambi i campi di relazione è NULL la
join non è soddisfatta
NULL sommato o concatenato con qualsiasi valore dà risultato NULL
è possibile sostituirlo con un qualsivoglia valore utilizzando la funzione
ISNULL(campo, valore_sostitutivo) in MSSQL o, in IBM i con
IFNULL(campo, valore_sostitutivo)
Anche con tutte le colonne che non accettano valori NULL occorre
saper gestire tale valore in quanto si può presentare nelle OUTER JOIN
25. COUNT()
COUNT(*) esegue il conteggio di tutte le righe
COUNT(espressione) esegue il conteggio delle sole righe in
cui espressione non è NULL
COUNT( DISTINCT espressione) esegue il conteggio dei
valori univoci in cui espressione non è NULL
Esempi
select
count(*) as TotRighe,
count(AnaNazCod) as TotNazCodNotNull,
count(distinct AnaNazCod) as DistinctNazCodNotNull
from Ana
select AnaNazCod, count(*)
from Ana
group by AnaNazCod
having count(*) > 1
order by AnaNazCod
26. Estrazione primi «n» record
DB2UDB
SELECT * FROM Pratica
ORDER BY PraticaNum DESC
FETCH FIRST 10 ROWS ONLY
MSSQL
SELECT TOP 10 * FROM Pratica
ORDER BY PraticaNum DESC
SELECT TOP 10 PERCENT * FROM Pratica
27. Conversione tra tipi
DB2UDB
SELECT FLOAT(valore)
, DECIMAL(valore, lunghezza, decimali)
, CAST(valore as tipo)
FROM Archivio
MSSQL
SELECT CONVERT(FLOAT, valore)
, CONVERT(DECIMAL(lunghezza, decimali),
valore)
, CAST(tipo, valore)
FROM Archivio
28. Concatenazione
La concatenazione avviene tra campi alfanumerici, i
tipi numerici devono prima essere convertiti
DB2UDB
SELECT concat(fld1, fld2), fld3 || fld4
FROM Archivio
MSSQL
SELECT fld1 + fld2
FROM Archivio
31. Attenzione ai decimali
DB2UDB
CREATE TABLE QTEMP/XVALUE (XVALUE
NUMERIC(30, 9) NOT NULL WITH DEFAULT);
INSERT INTO QTEMP/XVALUE VALUES(0);
UPDATE QTEMP/XVALUE SET XVALUE = (1 +
(10.25/100)) * 69.50;
[SQL0406] Errore di conversione o di
assegnazione alla colonna XVALUE.
UPDATE QTEMP/XVALUE SET XVALUE = (1 +
(10.25/100.00)) * 69.50;
UPDATE QTEMP/XVALUE SET XVALUE = (1 +
DECIMAL((10.25/100),10,6)) * 69.50
32. Row number
Numera le righe eventualmente all’interno di una
partizione nell’ordine richiesto
Esempio DB2UDB (valido anche per MSSQL):
select STDITR, STLICD, count(*) as righe,
row_number() over (partition by STDITR
order by STLICD) as riga
from STBORD
group by STDITR, STLICD
order by STDITR, STLICD
35. Data / ora attuali
DB2UDB
SELECT CURRENT_TIMESTAMP FROM
SYSIBM.SYSDUMMY1
MSSQL
Print GetDate()
36. SUBQUERY
L’SQL permette l’uso di sottoquery che risultano molto
comode per una elaborazione a più livelli
Esempio query nidificata
select * from Dipendenti
where Stipendio > (select avg(Stipendio) from Ana)
Esempio query derivata
select *
from Anagrafica a
left join
(select *
from Contatti where Tipo = 'FAX') c
on c.chiaveAna = a.chiave
37. Archivi temporanei
DB2UDB
DECLARE GLOBAL TEMPORARY TABLE
Crea una tabella in QTEMP
Referenziabile con QTEMP. o SESSION.
MSSQL
CREATE TABLE #nome
Tabella temporanea del job
CREATE TABLE ##nome
Tabella temporanea globale (da evitare)
DECLARE inmem TABLE (col1 int)
Tabella inmem creata in memoria
38. Creazione archivi da query
DB2UDB
CREATE TABLE QTEMP.nuova_tabella AS
(SELECT * FROM query_complessa)
WITH DATA;
MSSQL
SELECT * INTO #nuova_tabella FROM
query_complessa
39. Transazione
DB2UDB
La singola operazione DELETE o UPDATE avviene
all’interno di una transazione solo su richiesta e solo se
l’archivio si trova sotto journal
MSSQL
La singola operazione DELETE o UPDATE avviene
sempre sotto unica transazione
40. Comandi di sistema
DB2UDB
CALL QSYS.QCMDEXC('comando_di_sistema',
lungh.)
CALL QSYS.QCMDEXC('addlible schema1',
000000016.00000);
CL: comando_di_sistema
CL: DSPPGMREF PGM(libreria/(*ALL))
OUTPUT(*OUTFILE) OBJTYPE(*ALL)
OUTFILE(qtemp/dsppgmref);
SELECT * FROM qtemp.dsppgmref;
41. Comandi di sistema
MSSQL
Attivazione comandi di sistema
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE;
Esecuzione comandi di sistema
EXECUTE xp_cmdshell 'comando_di_sistema';
Altre utili procedure estese
sys.xp_delete_file
sys.xp_dirtree
sys.xp_fileexist
sys.xp_fixeddrives
sys.xp_subdirs
43. Integrità referenziale
Si attiva a livello di database applicando un legame tra
due tabelle: primaria e correlata
La chiave univoca della tabella primaria viene associata
ad una o più colonne della tabella secondaria
Il legame può seguire diverse regole e viene applicato
in caso di cancellazione della riga o dell’aggiornamento
della chiave sulla tabella primaria
44. Integrità referenziale
Regole tipiche su modifica e cancellazione:
Nessuna azione
le richieste sono rifiutate quando la chiave esiste su una tabella
correlata
Cascata
applica la cancellazione o l’aggiornamento richiesto alla tabella
correlata
Imposta valore nullo
se modificata o eliminata la chiave primaria il valore sulla correlata
viene impostato a nullo
Imposta valore predefinito
se modificata o eliminata la chiave primaria il valore sulla correlata
viene impostato al valore predefinito
45. Identity
È un attributo da assegnare ad una colonna numerica
che attiva l’assegnazione automatica del progressivo
Utilizzato per l’identificazione univoca del record
Esempio DB2UDB
CREATE TABLE Anagra (Chiave INTEGER
GENERATED ALWAYS AS IDENTITY (START WITH
1 INCREMENT BY 1), Nome CHAR(35))
Esempio MSSQL
CREATE TABLE Anagra (Chiave INT
IDENTITY(1, 1), Nome CHAR(35))
46. Unique identifier o row id
Assegnato quale tipologia di dato ad una colonna
Utilizzato per l’identificazione univoca del record in
alternativa ad Identity
Esempio di GUID:
E6514E30-EE82-4B22-B8C3-5DE076F9DFB3
47. Unique identifier o row id
Creazione tabella con chiave GUID
Esempio DB2UDB
CREATE TABLE Test
(col1 ROWID GENERATED ALWAYS
, col2 DATE)
Esempio MSSQL
CREATE TABLE Test (TestKy uniqueidentifier
ROWGUIDCOL NOT NULL, TestNum int)
ALTER TABLE Test ADD CONSTRAINT
DF_Test_TestKy DEFAULT (newid()) FOR TestKy
48. Timestamp
Assegnato quale tipologia di dato ad una colonna
DB2UDB
Se impostato anche il valore predefinito SQL inserirà un
valore univoco alla riga identificandone il momento
esatto di ultima modifica
CREATE TABLE Pratica (PraticaTimeStamp
TIMESTAMP DEFAULT CURRENT TIMESTAMP)
MSSQL
Sempre impostato automaticamente dal DB
CREATE TABLE Pratica (PraticaTimeStamp
TIMESTAMP)
50. Comandi SQL
Vi sono diversi tipi di comandi SQL, ci
concentreremo sulle chiamate d’interrogazione,
ovvero la query di selezione.
51. Esecuzione di una query
Passaggi
Parsing
Verifica correttezza
Identificazione delle parti, normalmente trasformata in un
albero (query tree)
Standardizzazione
Eliminazione clausole ridondanti
Arrangiamento albero
Ottimizzazione
52. Esecuzione di una query
Tipi di ottimizzazione
Sintattica
Basata sulla «fiducia» in chi ha scritto la query
Cost-based (la più utilizzata)
Basata su statistiche (dimensione tabelle, distribuzione dei
dati, disponibilità di indici, ecc.)
Euristica
Trasformazione albero in espressioni algebrico-relazionali e
riduzione ai termini di base
Semantica
Eliminazione di rami inutili, l’ottimizzatore deve
«conoscere» il db sottostante
53. Esecuzione di una query
Processo di ottimizzazione (cost-based)
Scelta degli indici
Richiede una corrispondenza esatta dei primi campi
dell’indice con la join e/o con la condizione where
Selezione delle join
Il motore elabora una coppia di archivi alla volta, l’ordine di
elaborazione è basato sul costo attribuito ad ogni join ed il
risultato potrebbe essere diverso da quello che ci si aspetta
54. Scelta vista (indice) su host
Tramite Visual Explain è possibile visualizzare
graficamente il piano di esecuzione utilizzato dal
motore SQL per estrarre i dati richiesti
Nel seguente esempio, nonostante la query sia richiesta
sulla vista MOVCON07, l’ottimizzatore decide di usare
l’indice MOVCON10 che gli permette di estrarre i dati
più velocemente per il campo REGGDT
select *
from MOVCON07
where REGGDT between 20000000 and 20009999
56. • IBM – Knowledge Center
http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_61/welcome.html?lang=en
• IBM - V6R1 DB2 for i SQL Reference
http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/db2/rbafz.pdf
• IBM - V6R1 Database SQL programming
http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/sqlp/rbafy.pdf
• Microsoft – MSDN
http://msdn.microsoft.com/it-it/library/bb545450(v=msdn.10%20).aspx