Differenze tra database nativo IBM i
e Microsoft SQL Server
Riccardo De Mattia
Il presente corso NON ha la pretesa di sostituire i manuali.
Quanto esposto è il risultato di esperienze maturate
nell’utilizzo di entrambi i database.
Differenze tra DB2 nativo IBM i e Microsoft SQL
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
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)
Client standard IBM i e SQL Server
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
Cwbundbs
 Con Esegui e spiega
eseguiamo l’SQL e
visualizziamo il
piano d’esecuzione
Cwbundbs
 Visualizzazione del
piano d’esecuzione
tramite il Visual
Explain
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
Management Studio
 Connettersi all’istanza e selezionare Nuova query
 Digitare la query desiderata
 Selezionare
Includi piano
d’esecuzione
Management Studio
 Visualizzazione del piano di esecuzione di un
comando SQL
Clausole e funzioni di base
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
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
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 ]
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
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
WHERE
 Condizione di selezione
 Può contenere espressioni complesse
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.)
HAVING
 Utilizzabile in presenza di GROUP BY
 Esegue condizioni sul risultato del raggruppamento
(es. MAX(col1) > 100)
 Può contenere espressioni complesse
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)
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
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
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
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
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
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
Attenzione alle conversioni
 1.938/5 = 0.3876
 DB2UDB
 SELECT DECIMAL(1.938/5, 10, 3) FROM
SYSIBM.SYSDUMMY1;
 Risultato: 0.387
 SELECT ROUND(1.938/5, 3) FROM
SYSIBM.SYSDUMMY1;
 Risultato: 0.388
 MSSQL
 print convert(decimal(10, 3), 1.938/5);
 Risultato: 0.388
 print round(1.938/5, 3, 1);
 Risultato: 0.387
Attenzione all’uso di float
 DB2UDB
 SELECT FLOAT(1)/1 * 0.310 FROM
SYSIBM.SYSDUMMY1;
 Risultato: 0.310
 SELECT DECIMAL(FLOAT(1)/1 * 0.310, 10,
3) FROM SYSIBM.SYSDUMMY1;
 Risultato: 0.309 (!)
 MSSQL
 print convert(decimal(10, 3),
(convert(float, 1)/1 * 0.310));
 Risultato: 0.310
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
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
Special register
 DB2UDB (esempi)
 CURRENT_SERVER
 USER, SESSION_USER, SYSTEM_USER
 CURRENT SCHEMA, CURRENT_PATH
 CURRENT_DATE
 CURRENT_TIME, CURRENT_TIMESTAMP
 CURRENT_TIMEZONE
Built-in functions
 MSSQL (esempi)
 @@SERVERNAME
 HOST_NAME(), HOST_ID()
 SUSER_SNAME(), CURRENT_USER
 DB_NAME()
 GETDATE(), CURRENT_TIMESTAMP
 GETUTCDATE()
Data / ora attuali
 DB2UDB
 SELECT CURRENT_TIMESTAMP FROM
SYSIBM.SYSDUMMY1
 MSSQL
 Print GetDate()
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
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
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
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
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;
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
Integrità referenziale, campi identity, unique identifier,
timestamp
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
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
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))
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
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
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)
Come funziona il motore SQL
Comandi SQL
 Vi sono diversi tipi di comandi SQL, ci
concentreremo sulle chiamate d’interrogazione,
ovvero la query di selezione.
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
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
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
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
Alcuni esempi di comandi SQL
• 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

IBM i db2 udb vs Microsoft SQL Server

  • 1.
    Differenze tra databasenativo IBM i e Microsoft SQL Server Riccardo De Mattia
  • 2.
    Il presente corsoNON ha la pretesa di sostituire i manuali. Quanto esposto è il risultato di esperienze maturate nell’utilizzo di entrambi i database.
  • 3.
    Differenze tra DB2nativo IBM i e Microsoft SQL
  • 4.
    Raffronto terminologie Termini disistema 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  Sonomoltissime: 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)
  • 6.
    Client standard IBMi e SQL Server
  • 7.
    Cwbundbs  Il clientstandard di IBM i, installato come componente di System i Navigator  Espandere fino al database locale poi selezionare Esegui uno script SQL
  • 8.
    Cwbundbs  Con Eseguie spiega eseguiamo l’SQL e visualizziamo il piano d’esecuzione
  • 9.
    Cwbundbs  Visualizzazione del pianod’esecuzione tramite il Visual Explain
  • 10.
    SSMS  Microsoft SQLServer 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  Connettersiall’istanza e selezionare Nuova query  Digitare la query desiderata  Selezionare Includi piano d’esecuzione
  • 12.
    Management Studio  Visualizzazionedel piano di esecuzione di un comando SQL
  • 13.
  • 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 dellecolonne 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 degliarchivi 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
  • 19.
    WHERE  Condizione diselezione  Può contenere espressioni complesse
  • 20.
    GROUP BY  Esegueun 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 inpresenza di GROUP BY  Esegue condizioni sul risultato del raggruppamento (es. MAX(col1) > 100)  Può contenere espressioni complesse
  • 22.
    ORDER BY  Elencodelle colonne per le quali viene eseguito l’ordinamento  Per ogni colonna è possibile specificare l’ordinamento crescente (ASC, predefinito) o decrescente (DESC)
  • 23.
    UNION ed UNIONALL  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 valoreNULL  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(*) esegueil 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 concatenazioneavviene 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
  • 29.
    Attenzione alle conversioni 1.938/5 = 0.3876  DB2UDB  SELECT DECIMAL(1.938/5, 10, 3) FROM SYSIBM.SYSDUMMY1;  Risultato: 0.387  SELECT ROUND(1.938/5, 3) FROM SYSIBM.SYSDUMMY1;  Risultato: 0.388  MSSQL  print convert(decimal(10, 3), 1.938/5);  Risultato: 0.388  print round(1.938/5, 3, 1);  Risultato: 0.387
  • 30.
    Attenzione all’uso difloat  DB2UDB  SELECT FLOAT(1)/1 * 0.310 FROM SYSIBM.SYSDUMMY1;  Risultato: 0.310  SELECT DECIMAL(FLOAT(1)/1 * 0.310, 10, 3) FROM SYSIBM.SYSDUMMY1;  Risultato: 0.309 (!)  MSSQL  print convert(decimal(10, 3), (convert(float, 1)/1 * 0.310));  Risultato: 0.310
  • 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  Numerale 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
  • 33.
    Special register  DB2UDB(esempi)  CURRENT_SERVER  USER, SESSION_USER, SYSTEM_USER  CURRENT SCHEMA, CURRENT_PATH  CURRENT_DATE  CURRENT_TIME, CURRENT_TIMESTAMP  CURRENT_TIMEZONE
  • 34.
    Built-in functions  MSSQL(esempi)  @@SERVERNAME  HOST_NAME(), HOST_ID()  SUSER_SNAME(), CURRENT_USER  DB_NAME()  GETDATE(), CURRENT_TIMESTAMP  GETUTCDATE()
  • 35.
    Data / oraattuali  DB2UDB  SELECT CURRENT_TIMESTAMP FROM SYSIBM.SYSDUMMY1  MSSQL  Print GetDate()
  • 36.
    SUBQUERY  L’SQL permettel’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 daquery  DB2UDB  CREATE TABLE QTEMP.nuova_tabella AS (SELECT * FROM query_complessa) WITH DATA;  MSSQL  SELECT * INTO #nuova_tabella FROM query_complessa
  • 39.
    Transazione  DB2UDB  Lasingola 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
  • 42.
    Integrità referenziale, campiidentity, unique identifier, timestamp
  • 43.
    Integrità referenziale  Siattiva 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  Regoletipiche 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  È unattributo 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 orow 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 orow 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 qualetipologia 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)
  • 49.
    Come funziona ilmotore SQL
  • 50.
    Comandi SQL  Visono diversi tipi di comandi SQL, ci concentreremo sulle chiamate d’interrogazione, ovvero la query di selezione.
  • 51.
    Esecuzione di unaquery  Passaggi  Parsing  Verifica correttezza  Identificazione delle parti, normalmente trasformata in un albero (query tree)  Standardizzazione  Eliminazione clausole ridondanti  Arrangiamento albero  Ottimizzazione
  • 52.
    Esecuzione di unaquery  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 unaquery  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
  • 55.
    Alcuni esempi dicomandi SQL
  • 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