Académique Documents
Professionnel Documents
Culture Documents
no 2007
SQL
Il nome SQL un acronimo per Structured Query Language. un linguaggio utilizzato per la gestione dei database che assolve le funzioni di:
DDL (Data Definition Language ):
descrizione dei dati e delle strutture (definizione di domini, tabelle, indici, autorizzazioni, viste, vincoli, procedure, trigger) DML (Data Manipulation Language): manipolazione dei dati ed interrogazione
Transact-SQL (da qui in avanti, T-SQL) la versione di SQL utilizzata da Microsoft SQL Server. una versione proprietaria di SQL, di cui mantiene i costrutti base, ma fornisce funzionalit aggiuntive per la manipolazione e l'estrazione dei dati. Il T-SQL a tutti gli effetti un linguaggio di programmazione completo, che fornisce tutte le istruzioni e le 2 clausole per la definizione di variabili, flussi di controllo,
no 2007
DDL
Il Data Definition Language (DDL) contiene le parole chiavi e le istruzione necessarie per definire, modificare o eliminare tutti gli oggetti di un database: tabelle, viste procedure, funzioni, ruoli, privilegi Permette anche di definire degli indici (delle chiavi di ricerca), specificare dei collegamenti tra le tabelle ed imporre dei vincoli relazionale tra le tabelle del database. I comandi pi importanti sono:
CREATE ALTER DROP
Identificatori
Il nome completo di un oggetto composto da 4 identificatori: [ [ [ server. ] [ database ] . ] [ schema ] . ] oggetto Quando si fa riferimento a un oggetto, non sempre necessario specificare i qualificatori server, database e proprietario. In tal caso verranno considerati server e database correnti. Se non specificato il qualificatore dello schema, il motore assume che stiamo lavorando sullo schema di default dbo.
CREATE
Tramite la parola chiave CREATE possibile definire qualunque nuova entit all'interno del database. La clausola CREATE seguita dalla tipologia di oggetto che vogliamo definire (TABLE, VIEW, INDEX) e dal nome che intendiamo assegnargli:
CREATE [ TABLE | VIEW | FUNCTION | ] entit
ALTER
La parola chiave ALTER permette di modificare una qualsiasi entit del database. Ha la stessa sintassi di CREATE:
ALTER [TABLE | VIEW | FUNCTION | ] entit
Per quanto riguarda le tabelle, ad esempio, tramite ALTER possibile aggiungere o rimuovere colonne, ridefinire le colonne esistenti, creare o modificare i vincoli relazionali e cos via.
DROP
La parola chiave DROP permette di eliminare qualunque entit del database, compreso il database stesso. Si tratta dunque di un'istruzione da utilizzare con una certa cautela La sintassi la stessa di CREATE e ALTER:
DROP [TABLE | VIEW | FUNCTION | ] entit
NOTA BENE: L'istruzione di DROP, cos come tutte le istruzioni di tipo DDL, non transazionale: questo significa che una volta eseguita non possibile tornare indietro!
default, vincoli... la chiave primaria, se presente i vincoli relazionali (chiavi esterne) il filegroup sul quale risieder la tabella lo schema di appartenenza
da -2^63 (-9,223,372,036,854,775,808) a 2^63-1 (9,223,372,036,854,775,807) int da -2^31 (-2,147,483,648) a 2^31-1 (2,147,483,647) smallint da -2^15 (-32,768) a 2^15-1 (32,767) tinyint da 0 a 255 bit 0/1, TRUE/FALSE decimal(p,s) p (precisione), numero massimo di cifre, sia intere che decimali, 1 <= p <= 18 (default 18)
1,79E+308
3,40E + 38
dal 1 gennaio 1753 al 31 dicembre 9999 (accuratezza 3,33 millisecondi) smalldatetime dal 1 gennaio 1900 al 6 giugno 2079 (accuratezza 1 minuto)
12
stringhe non-unicode a lunghezza fissa con lunghezza di n byte, dove n rappresenta un valore compreso tra 1 e 8.000 (default 1) varchar(n|max) stringhe non-unicode a lunghezza variabile con lunghezza di n byte, 1 <= n <= 8.000 (default 1) max = 2^311 byte (2.147.483.647 caratteri) text stringhe non-unicode a lunghezza variabile con lunghezza massima di 2^31-1 byte (2.147.483.647 caratteri) nchar(n) stringhe unicode a lunghezza fissa con lunghezza di n byte, dove n rappresenta un valore compreso tra 1 e 4.000 (default 1) nvarchar(n|max) stringhe unicode a lunghezza variabile con lunghezza di n byte, 1 <= n <= 4.000 (default 1) max = 2^301 byte (1.073.741.823 caratteri) 13
dove n rappresenta un valore compreso tra 1 e 8.000 varbinary(n|max) dati binari a lunghezza variabile con lunghezza di n byte, 1 <= n <= 8.000
Formato table l formato table un tipo di dati speciale utilizzabile per archiviare un set di risultati per l'elaborazione successiva. Viene utilizzato principalmente come spazio di archiviazione temporanea di un set di righe restituito, ad esempio come set di risultati di una funzione valutata a livello di tabella. La loro definizione in tutto e per tutto simile alla definizione di una tabella: 14 DECLARE @tabella TABLE (campo varchar(10))
Vincoli intrarelazionali
I vincoli intrarelazionali sono vincoli che interessano una sola tabella. Si possono suddividere in tre tipologie:
Vincoli di definizione (o di cella) - il valore contenuto in una
Tipo dato: definisce se il contenuto della colonna sar numerico, alfanumerico, ecc. Null / not null: specifica se la colonna accetta / non accetta valori NULL
Identity: il valore della colonna viene assegnato in modo automatico e univoco Primary key: identifica la colonna (o il set di colonne) contenente valori che identificano in modo univoco una riga in una tabella Unique: garantisce l'univocit dei valori in una colonna Check:(sulla colonna): assicura l'integrit di dominio limitando i valori accettati da una colonna
15
Vincoli interrelazionali
Sono vincoli che definiscono legami tra due o pi tabelle:
FOREIGN KEY:
Il vincolo interrelazionale pi utilizzato quello di integrit referenziale: gli attributi di una data tabella possono assumere soltanto dei valori specificati in un'altra tabella, ossia definiscono il cosiddetto dominio dei dati.
16
PRIMARY KEY
Identifica la colonna o il set di colonne contenente valori che identificano in modo univoco una riga in una tabella. Si pu utilizzare una sola volta per ogni tabella. Tutte le colonne definite in un vincolo PRIMARY KEY devono essere definite come NOT NULL. Pu essere dichiarata
in fase di creazione della tabella, nella definizione dell'attributo,
ad esempio: Matricola varchar(6) PRIMARY KEY oppure successivamente tramite una clausola di ALTER TABLE, ad esempio:
ALTER TABLE nometabella ADD CONSTRAINT nomePrimaryKey PRIMARY KEY (campo1 [ASC | DESC], campo2 [ASC | DESC], ) ON [PRIMARY]
17
Altri vincoli
CHECK condizione Assicura l'integrit di dominio tramite la limitazione dei valori che possibile inserire in una colonna DEFAULT valore Indica il valore che deve assumere l'attributo quando viene inserita una riga nella tabella senza che sia specificato un valore per l'attributo stesso. Se non specificato, il valore di default NULL . IDENTITY(inizio, incremento) Indica che l'attributo un contatore che verr incremetato automaticamente ad ogni inserimento nella tabella. Bisogna specificare il numero da cui partire e l'unit di incremento per ogni successivo inserimento - di solito, IDENTITY(1, 1).
18
Viste
Una vista una tabella virtuale il cui contenuto definito da una query. In modo analogo a una tabella, una vista costituita da un set di colonne e righe di dati denominate. Tuttavia, una vista non esiste come set archiviato di valori di dati in un database. Le righe e le colonne di dati provengono da tabelle a cui fa riferimento la query che definisce la vista e sono prodotte dinamicamente quando, in una qualunque istruzione di SELECT, INSERT, ecc., si fa riferimento alla vista stessa. La sintassi per la creazione di una vista la seguente: CREATE VIEW nome_vista AS SELECT
19
Indici (1)
Gli indici consentono di accedere in modo rapido a informazioni specifiche di una tabella di database. L'indice fornisce dei puntatori ai valori dei dati memorizzati in determinate colonne della tabella disponendoli in base al criterio di ordinamento impostato . Come regola generale, necessario creare un indice in una tabella solo se vengono eseguite query frequenti sui dati di colonne indicizzate. Gli indici occupano spazio su disco e rallentano le operazioni di aggiunta, eliminazione e aggiornamento di righe. In SQL Server vengono creati automaticamente indici univoci per imporre i requisiti di univocit dei vincoli PRIMARY KEY e UNIQUE. La sintassi per la creazione di un indice la seguente:
CREATE [ CLUSTERD | NONCLUSTERED ] INDEX indice ON tabella ( colonna1 [ ASC | DESC ], colonna2 [ ASC | DESC ], 20
Indici (2)
Nella creazione degli indici importante avere chiara la differenza fra indici di tipo CLUSTERED e indici di tipo NONCLUSTERED:
CLUSTERED: Crea un indice in cui l'ordine logico dei valori di
chiave determina l'ordine fisico delle righe corrispondenti di una tabella. Il livello inferiore, o foglia, dell'indice cluster contiene le righe di dati effettive della tabella. possibile creare un solo indice cluster alla volta per una tabella o una vista.
NONCLUSTERED: Crea un indice che specifica l'ordinamento
logico di una tabella. Quando si utilizza un indice non cluster, l'ordine fisico delle righe di dati indipendente dall'ordine delle righe indicizzato. Per ogni tabella possibile definire al massimo 999 indici non cluster, indipendentemente dal fatto che vengano creati in modo implicito tramite vincoli PRIMARY KEY e UNIQUE oppure in modo esplicito tramite CREATE INDEX.
21
LINKED SERVER
possibile effettuare query su altri server collegati (linked server). Esistono due modi per accedere ai dati di un linked server: usando gli identificatori: SELECT * FROM NomeLinkedServer.NomeDb.NomeOwner.NomeTabella oppure con la clausola OPENQUERY: SELECT * FROM OPENQUERY (NomeLinkedServer, 'query') in questo caso la query viene eseguita nel database remoto.
22
no 2007
DML
La parte di SQL denominata Data Manipulation Language (DML) definisce i comandi per accedere ai dati delle tabelle del database. Tali comandi permettono dunque di eseguire delle interrogazioni (query) sulle tabelle, ma anche di inserire, modificare o cancellare i dati. I comandi fondamentali sono:
SELECT INSERT UPDATE DELETE
Ne esistono poi altri di uso meno comune ma comodi in situazioni specifiche, ad esempio:
TRUNCATE
24
SELECT (1)
Recupera righe dal database e consente la selezione di una o pi espressioni da una o pi tabelle o viste.
SELECT [ ALL | DISTINCT ] [ TOP n [ PERCENT ] ] [lista espressioni
|*] [ INTO nuova tabella ] FROM lista tabelle [ WHERE condizioni semplici ] [ GROUP BY lista attributi di raggruppamento [ HAVING condizioni aggregate ]
] [ ORDER BY lista attributi di ordinamento [ ASC | DESC ] ] Un'espressione una combinazione di simboli e operatori che vengono valutati in modo da restituire un singolo valore. Le espressioni semplici possono essere costituite da un'unica costante, variabile, colonna o funzione scalare. possibile utilizzare gli operatori per unire due o pi espressioni semplici25
SELECT (2)
possibile specificare alcune clausole che agiscono sul numero di righe estratto dalla query:
ALL
Specifica che nel set di risultati possono essere visualizzate righe duplicate. Il valore predefinito ALL. DISTINCT Specifica che nel set di risultati devono essere visualizzate solo righe univoche. I valori NULL vengono considerati valori uguali. TOP n [PERCENT] Specifica che dal set di risultati devono essere incluse nell'output solo le prime n righe. Se si specifica PERCENT, nell'output viene incluso solo il numero di righe corrispondente al primo n percento.
26
SELECT (3)
Tramite l'istruzione SELECT possibile indicare le colonne del set di dati che andranno a costituire il risultato della nostra interrogazione. Tali dati possono essere di varie tipologie:
colonne delle tabelle indicate dalla clausola FROM espressioni calcolate a partire da una o pi colonne costanti risultati di funzioni
Per ognuna delle colonne possibile definire un alias tramite la clausola AS, ad esempio:
SELECT colonna1, --estrazione di una colonna singola
colonna2 + colonna3 AS somma, --colonna calcolata come somma 'ciao mondo!' AS saluto, --costante (tutte le righe avranno lo stesso valore), LTRIM(RTRIM(colonna3)) --risultato di una funzione
27
Operatori aritmetici
Gli operatori aritmetici eseguono operazioni matematiche su due espressioni di uno o pi tipi di dati appartenenti alla categoria dei tipi di dati numerici: + (addizione) - (sottrazione) * (moltiplicazione) / (divisione) % (modulo): restituisce il resto di una divisione, ad esempio:
SELECT 23 % 5 restituisce 3
Il segno pi (+) inoltre l'operatore che consente di concatenare pi stringhe fra loro, ad esempio: SELECT 'Ciao' + ' ' + 'Mondo!' restituisce la stringa 'Ciao Mondo!'
28
INTO
Sintassi:
SELECT lista attributi o espressioni
INTO nuova tabella FROM lista tabelle Lo statement esegue l'istruzione SELECT e inserisce i dati estratti in una nuova tabella, dopo averla opportunamente creata con la stessa formattazione dei campi estratti.
29
FROM
La clausola FROM specifica la tabella, o l'insieme di tabelle, da cui recuperare i dati, ossia definisce il set complessivo di colonne che sar possibile selezionare, o comunque utilizzare, nella clausola SELECT. La clausola FROM obbligatoria. Contiene le condizioni di join. Esempio di estrazione da una tabella singola:
SELECT lista attributi o espressioni
30
JOIN
Consentono di mettere in relazione due o pi tabelle fra loro. Esistono varie tipologie di join che restituiscono insiemi pi o meno ampi di risultati: CROSS JOIN INNER JOIN LEFT OUTER JOIN RIGTH OUTER JOIN FULL OUTER JOIN
31
CROSS JOIN
Consente di ottenere il prodotto cartesiano delle tabelle specificate nella join. Ogni riga della prima tabella viene combinata con tutte le righe della seconda. Esistono due sintassi alternative. Quella pi corretta: SELECT T1.*, T2.* FROM Tabella1 as T1 CROSS JOIN Tabella2 as T2 E quella pi tradizionale: SELECT T1.*, T2.* FROM Tabella1 as T1, Tabella2 as T2
32
T2.campo)
33
34
SELF JOIN
possibile mettere in relazione una tabella con se stessa. In tal caso si parla di SELF JOIN. Poich tale tipo di query comporta l'esecuzione di un join di una tabella con se stessa, tale tabella svolge due ruoli, che quindi devono essere distinti assegnando due alias diversi nella clausola FROM. I due alias vengono utilizzati per qualificare i nomi delle colonne nella parte rimanente della query, ad esempio: SELECT T1.*, T2.* FROM Tabella1 AS T1 INNER JOINTabella1 AS T2 ON T1.campo = T2.campo
35
36
37
38
40
WHERE
Tramite la clausola WHERE possibile specificare le condizioni per le righe restituite nel set dei risultati di un'istruzione SELECT, per le righe da aggiornare in un'istruzione UPDATE e quelle da cancellare in un'istruzione DELETE. Non sono previsti limiti per il numero di condizioni che possibile includere. Tali condizioni sono collegate fra loro tramite gli operatori logici AND, OR, NOT.
AND: Restituisce TRUE se entrambe le condizioni sono TRUE OR: Restituisce TRUE se almeno una delle due condizioni TRUE NOT: Inverte il valore della precedente condizione.
NOT l'operatore con precedenza massima, seguito da AND e da OR. Tramite le parentesi tonde comunque possibile raggruppare i predicati per ottenere l'ordine di precedenza richiesto.
41
Operatori di confronto
Gli operatori di confronto consentono di confrontare due espressioni, restituendo un valore di tipo booleano: TRUE se il confronto verificato, FALSE altrimenti. In T-SQL sono possibile utilizzare i seguenti operatori di confronto:
= uguale a <> / != diverso da > maggiore di < minore di >= maggiore o uguale a <= minore o uguale a !< non minore di equivalente a >= !> non maggiore di equivalente a <=
42
43
nel set ([xyz]) specificato [^x-y], [^xyz]: carattere singolo NON compreso nell'intervallo ([x-y]) o nel set ([xyz]) specificato
mentre con ESCAPE carattere (opzionale) possibile indicare un carattere che, posto davanti a un carattere jolly, indica che il carattere jolly deve essere interpretato come carattere normale, ad esempio: WHERE colonna LIKE '%sconto 10!%%' ESCAPE '!' cerca tutti le righe in cui colonna contiene l'espressione 44
2 <= ALL (subquery) => TRUE (2 minore o uguale sia di 2 che di 3) 2 = ALL (subquery) => FALSE (2 uguale a 2 ma diverso da 3) 2 < SOME (subquery) => TRUE (2 almeno minore di 3) 4 < SOME (subquery) => FALSE (4 non minore n di 2 n di 3)
46
47
'italian')
identifica tutte le trame che contengono la parola "ospedale" e delle parole che iniziano per "figl" (figlio, figlia, ecc.)
WHERE CONTAINS(Trama, ' FORMSOF(INFLECTIONAL, figlio) ',
LANGUAGE 'italian')
identifica tutte le trame che abbiano una qualche forma della parola "figlio"
WHERE CONTAINS(Trama, ' FORMSOF(THESAURUS, amore) ',
LANGUAGE 'italian')
identifica tutte le trame che contengano qualche parola correlate alla parola "amore"
WHERE CONTAINS(Trama, ' "figli*" NEAR incidente ', LANGUAGE
'italian')
GROUP BY
Specifica i gruppi su cui calcolare un valore aggregato quando l'elenco di selezione della clausola SELECT include funzioni di aggregazione. Quando si specifica GROUP BY, necessario che l'elenco GROUP BY includa tutte le colonne di un'espressione non di aggregazione dell'elenco di selezione oppure che l'espressione GROUP BY corrisponda esattamente all'espressione dell'elenco di selezione.
49
HAVING
Specifica una condizione di ricerca per un gruppo o una funzione di aggregazione. La clausola HAVING utilizzata in combinazione con la clausola GROUP BY.
50
ORDER BY (1)
Serve ad ordinare il risultato di una query in base determinati campi : possibile specificare il nome della colonna, il suo alias o un valore intero che rappresenta la posizione della colonna nell'elenco di selezione.
SELECT Colonna1 FROM Tabella1 ORDER BY Colonna1 SELECT Colonna1 as X FROM Tabella1 ORDER BY X SELECT Colonna1 FROM Tabella1 ORDER BY 1
L'opzione DESC ordina i risultati in modo decrescente, ASC in modo crescente. Se non specificato, il default ASC. Nota bene: i valori nulli sono considerati i pi piccoli in assoluto.
51
ORDER BY (2)
La clausola ORDER BY pu includere elementi non inclusi nell'elenco di selezioni a meno che non sia stata specificata la clausola DISTINCT, oppure nella query sia presente un operatore di GROUP BY o di UNION. Ad esempio, corretto scrivere: SELECT Colonna1 FROM Tabella1 ORDER BY Colonna2 Mentre la query seguente non valida: SELECT Colonna1 FROM Tabella1 UNION SELECT ColonnaA FROM Tabella ORDER BY Colonna2
52
53
INTERSECT / EXCEPT
I due operatori restituiscono i valori distinti eseguendo un confronto dei risultati di due query. Si differenziano in quanto:
EXCEPT restituisce tutti i valori distinti della query a sinistra
dell'operando non presenti nella query a destra; INTERSECT restituisce tutti i valori distinti restituiti da entrambe le query a sinistra e a destra dell'operando.
Tutte le query devono includere lo stesso numero di colonne nello stesso ordine. I tipi di dati devono essere compatibili. Sintassi: SELECT Colonna1, Colonna2 FROM Tabella1 INTERSECT SELECT ColonnaA, ColonnaB FROM Tabella1
54
Funzioni predefinite
In T-SQL sono incluse numerose funzioni predefinite che possono essere utilizzate per l'elaborazione di colonne e espressioni. La sintassi per l'utilizzo delle funzioni la seguente: SELECT function_name ( param1, param2, , paramN ) Esistono sia funzioni scalari, che restituiscono un unico valore, sia funzioni di tabella che restituiscono l'equivalente di una tabella. Le funzioni scalari possono a loro volta essere suddivise, a seconda del tipo dati che trattano, in funzioni di testo, funzioni matematiche e funzioni di data e ora. Di seguito vediamo alcuni esempi delle funzioni principali per 55 ognuna di tali tipologie.
56
57
58
59
61
espressione.
NULLIF ( espressione , espressione_confronto ) Se espressione uguale a espressione_confronto restituisce NULL, altrimenti restituisce espressione.
62
63
espressioni semplici per determinare il risultato. Avanzata: valuta un set di espressioni booleane per determinare il risultato.
Entrambi i formati supportano un argomento facoltativo ELSE. possibile utilizzare CASE in tutti i casi in cui consentita un'espressione valida, ad esempio, nelle espressioni quali SELECT, UPDATE, DELETE e SET e nelle clausole quali IN, WHERE, ORDER BY e HAVING.
64
65
Funzioni di aggregazione
Le funzioni di aggregazione eseguono un calcolo su un set di valori e restituiscono un valore singolo. Ad eccezione della funzione COUNT, le funzioni di aggregazione ignorano i valori Null. Vengono spesso utilizzate con la clausola GROUP BY dell'istruzione SELECT. Le funzioni principali sono:
COUNT( expression a ) Restituisce il numero di righe (escludendo
quelle con valore NULL) di una colonna COUNT( * ) Restituisce il numero di righe selezionate COUNT( DISTINCT expression a ) Restituisce il numero di righe diverse selezionate AVG( expression ) Restituisce il valore medio di una colonna MAX( expression ) Il valore massimo in una colonna MIN( expression ) Il valore minimo SUM( expression ) La somma dei valori di una colonna
66
COUNT / COUNT_BIG
COUNT ( * | [ ALL | DISTINCT ] expression ) Restituisce il numero di elementi in un gruppo. Il funzionamento di COUNT_BIG analogo a quello della funzione COUNT. L'unica differenza il valore restituito. COUNT_BIG infatti restituisce sempre un valore di tipo bigint mentre COUNT restituisce sempre un valore di tipo int. Pu precedere la clausola OVER.
*
Conta le righe restituite dalla query ALL Applica la funzione di aggregazione a tutti i valori. il valore predefinito. DISTINCT Indica che la funzione AVG deve essere eseguita solo in ogni istanza univoca di un valore, indipendentemente dal numero di occorrenze del valore. expression Colonna o espressione sulla quale deve essere 67 eseguito il conteggio.
AVG
AVG ( [ ALL | DISTINCT ] expression ) Restituisce la media dei valori di un gruppo. I valori Null vengono ignorati. Pu precedere la clausola OVER.
ALL
Applica la funzione di aggregazione a tutti i valori. DISTINCT Indica che la funzione AVG deve essere eseguita solo in ogni istanza univoca di un valore, indipendentemente dal numero di occorrenze del valore. expression Colonna o espressione sulla quale deve essere eseguito il calcolo.
68
MIN / MAX
MIN (expression) / MAX (expression) Restituiscono rispettivamente il valore minimo e il valore massimo dell'espressione. Pu precedere la clausola OVER.
expression
eseguito il calcolo.
Le funzioni MIN e MAX ignorano i valori Null. Con colonne di dati di tipo carattere, MIN e MAX consentono di individuare il valore minore o, rispettivamente maggiore, rispetto alla sequenza di confronto.
69
SUM
SUM ( [ ALL | DISTINCT ] expression ) Restituisce la somma di tutti i valori o solo dei valori DISTINCT dell'espressione. La funzione SUM pu essere utilizzata solo con colonne numeriche. I valori Null vengono ignorati. Pu precedere la clausola OVER.
ALL
Applica la funzione di aggregazione a tutti i valori. il valore predefinito. DISTINCT Indica che la funzione SUM deve essere eseguita solo in ogni istanza univoca di un valore, indipendentemente dal numero di occorrenze del valore. expression Colonna o espressione sulla quale deve essere eseguito il calcolo.
70
Clausola OVER
aggregate functions OVER (PARTITION BY expression) ranking functions OVER ( [ PARTITION BY expression, ] ORDER BY expression ) La clausola OVER determina il partizionamento e l'ordinamento del set di righe prima dell'applicazione della funzione finestra associata. Con funzione finestra si intende una funzione che lavora su un set di righe definite, detto finestra, e calcola un valore per ognuna di tali righe. Ne esistono due tipologie: funzioni di aggregazione (le stesse che si usano con la clausola GROUP BY) e funzioni di rango.
PARTITION BY Suddivide il set di risultati in partizioni. La funzione
finestra viene applicata a ogni singola partizione e il calcolo viene riavviato per ogni partizione. ORDER BY Specifica l'ordine di applicazione della funzione 71 finestra di rango.
Funzioni di rango
Le funzioni di rango restituiscono un valore di rango, ad esempio il numero di riga, per ogni riga di una partizione. In base alla funzione utilizzata, possibile che venga assegnato lo stesso valore a pi righe.
ROW_NUMBER() OVER (PARTITION BY expression, ORDER BY
expression) Restituisce il numero sequenziale di una riga all'interno di una partizione di un set di risultati, a partire da 1 per la prima riga di ogni partizione. RANK() OVER (PARTITION BY expression, ORDER BY expression) Restituisce il rango di ogni riga all'interno della partizione di un set di risultati. DENSE_RANK() OVER (PARTITION BY expression, ORDER BY expression) Restituisce il rango delle righe nella partizione di un set dei risultati, senza gap nell'assegnazione dei ranghi. NTILE(number) OVER (PARTITION BY expression, ORDER BY expression)
72
INSERT (1)
Ha la funzione di inserire i dati nelle tabelle. Le colonne di destinazione dei valori possono essere o meno dichiarate nel comando. Se non vengono dichiarate, necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l'ordine delle colonne stesse. Se, invece, le colonne di destinazione vengono dichiarate, possibile indicare le sole colonne per le quali vengono passati dei valori, purch vengano inseriti comunque i valori per tutte le colonne NOT NULL (che non possono essere nulle) della tabella.
73
INSERT (2)
Sintassi semplice: INSERT INTO nome_tabella [ (elenco_campi ) ] VALUES ('elenco_valori') Sintassi con query: INSERT INTO nome_tabella [ (elenco_campi ) ] SELECT ... FROM
74
UPDATE
Ha la funzione di modificare i dati contenuti in una tabella. Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave SET. Sintassi: UPDATE nome_tabella SET nome_campo = 'valore' WHERE Specifica le condizioni che limitano le righe da aggiornare. Se viene omesso aggiorna tutte le righe della tabella. FROM Specifica che una tabella, vista o origine di tabella derivata viene utilizzata per fornire i criteri per l'operazione di aggiornamento
75
DELETE
Ha la funzione di cancellare i dati dalle tabelle. Sintassi: DELETE [ FROM ] nome_tabella WHERE condizione Se la clausola WHERE viene omessa, l'istruzione DELETE elimina tutte le righe della tabella.
76
TRUNCATE
Rimuove tutte le righe da una tabella, ma non rimuove la struttura della tabella e le relative colonne, i vincoli, gli indici e cos via. Dal punto di vista funzionale TRUNCATE TABLE equivale all'istruzione DELETE senza clausola WHERE. pi rapida e utilizza un numero minore di risorse di sistema e del log delle transazioni rispetto alla DELETE. Sintassi: TRUNCATE TABLE nome_tabella
77
no 2007
Introduzione
Transact-SQL (abbreviato in T-SQL) lestensione proprietaria di Microsoft per avere a disposizione un linguaggio di programmazione completo per la gestione dei propri database SqlServer. un linguaggio che integra le clausole specifiche dellSQL con le clausole necessarie a qualsiasi linguaggio di programmazione, ossia, per fare qualche esempio:
definizione di variabili; istruzioni di controllo del flusso; gestione degli errori.
79
accettare dei parametri ed eseguono una serie di istruzioni; non restituiscono nulla;
FUNCTION: programmi che possono accettare dei
tabelle che si attivano in automatico al verificarsi di determinate condizioni, ad esempio laggiornamento o la cancellazione di una riga.
80
Commenti
In T-SQL, come in qualsiasi linguaggio di programmazione, la prima regola di sintassi da imparare e di solito, anche la prima che si dimentica di applicare - la scrittura dei commenti. In T-SQL ne esistono di due tipi: -- questo un commento su una riga singola /* questo un commento su pi righe */
81
Variabili
Per dichiarare una variabile la sintassi la seguente: DECLARE @nome_variabile tipo_dato il suo valore iniziale viene impostato a NULL. Il nome della variabile deve obbligatoriamente iniziare con il carattere chiocciola @. Esistono due modi per valorizzare la variabile dichiarata. Quando si tratta di una semplice assegnazione si usa la sintassi: SET @nome_variabile = espressione nel caso in cui invece il valore da assegnare deriva da un'interrogazione, la sintassi la seguente: SELECT @nome_variabile = espressione FROM Con questa seconda sintassi possibile assegnare
82
83
BEGIN END
Tramite la clausola BEGIN END possibile specificare un blocco di istruzioni che devono essere eseguite una di seguito all'altra. I blocchi BEGIN END possono essere nidificati fra loro. La sintassi la seguente: BEGIN blocco diistruzioni END Ad esempio: BEGIN SET @varibile = 'ciao mondo!' PRINT @varibile END
84
IF ELSE (1)
Se si vuole che un'azione venga eseguita se una condizione vera, ed un'altra se la condizione falsa, occorre utilizzare l'istruzione IF. Il blocco di istruzioni dopo ELSE saranno eseguite qualora la condizione dovesse risultare falsa. L' ELSE non obbligatorio. possibile nidificare condizioni IF dopo un'altra condizione IF o una parola chiave ELSE. Nel caso di un blocco di istruzioni, necessario racchiuderle tra le parole chiave BEGIN e END
85
IF ELSE (2)
Sintassi: IF condizione istruzione ELSE istruzione Oppure: IF espressione BEGIN istruzione istruzione END ELSE BEGIN istruzioni END
86
WHILE (1)
Tramite la clausola WHILE una serie di istruzioni vengono eseguite ripetutamente per tutto il tempo in cui la condizione specificata risulta vera. possibile controllare l'esecuzione di istruzioni nel ciclo WHILE dall'interno del ciclo tramite le parole chiave BREAK e CONTINUE, generalmente tramite un'istruzione IF ELSE. Sintassi: WHILE condizione BEGIN blocco diistruzioni IF condizione [BREAK | CONTINUE] blocco diistruzioni END
BREAK consente di uscire dal ciclo WHILE pi interno. Vengono
eseguite le istruzioni che si trovano dopo la parola chiave END, che segna la fine del ciclo. CONTINUE consente il riavvio del ciclo WHILE, ignorando tutte le istruzioni che seguono.
87
WHILE (2)
Ad esempio, il seguente blocco di codice utilizza un blocco WHILE per scrivere i numeri da 1 a 10: DECLARE @valore int SET @valore = 1 WHILE @valore <= 10 BEGIN PRINT @valore SET @valore = @valore + 1 END
88
Cursori (1)
Nei database relazionali le operazioni vengono eseguite su set di righe completi. Le applicazioni non sono sempre in grado di gestire in modo efficiente un intero set di risultati come singola unit. In tali casi deve essere pertanto disponibile un meccanismo per l'elaborazione di una riga singola o di un blocco di righe di dimensioni ridotte. I cursori sono un'estensione dei set di risultati che implementano appunto tale meccanismo. I cursori estendono l'elaborazione dei risultati nel modo seguente:
Consentono il posizionamento su righe specifiche del set di
risultati. Recuperano una riga o un blocco di righe dalla posizione corrente del set di risultati. Supportano la modifica dei dati delle righe in corrispondenza della posizione corrente del set di risultati.
89
Cursori (2)
L'utilizzo di un cursore richiede generalmente le seguenti istruzioni:
dichiarazione : DECLARE apertura: OPEN l'assegnazione dei campi a varibili: FETCH l'elaborazione delle righe tramite un ciclo WHILE chiusura: CLOSE rimozione dei riferimenti al cursore: DEALLOCATE
Vediamo di seguito un esempio completo relativo a un cursore che lavora ciclicamente su 2 colonne di un set di righe e utilizza le informazioni per scrivere dei messaggi.
90
Cursori (3)
DECLARE @Nome varchar(10), @Anno int DECLARE cur_persone CURSOR FOR SELECT Nome, Anno FROM dbo.Persone OPEN cur_persone FETCH NEXT FROM cur_persone INTO @ Nome, @Anno WHILE @@FETCH_STATUS = 0 BEGIN PRINT(@Nome + ' ha ' + cast(2011 - @Anno as varchar) + ' anni') FETCH NEXT FROM cur_persone INTO @Nome, @Anno END CLOSE cur_persone DEALLOCATE cur_persone
91
92
93
di errore. Il testo include i valori specificati per eventuali parametri sostituibili, ad esempio lunghezze, nomi di oggetti o orari. ERROR_SEVERITY() restituisce la gravit dell'errore. ERROR_LINE() restituisce il numero di riga nella routine che ha causato l'errore. ERROR_PROCEDURE() restituisce il nome della stored procedure o del trigger in cui si verificato l'errore.
94
completamento dell'istruzione. Il valore della variabile potr essere utilizzato in un secondo momento.
Un'altra variabile di sistema che pu rivelarsi utile per la gestione di situazioni non previste @@ROWCOUNT che restituisce il numero di righe lette o elaborate dall'istruzione precedente e permette quindi di fare delle verifiche sul buon 95
Transazioni
Con il termine transazione si intende una singola unit di lavoro - generalmente costituita da una o pi operazioni di inserimento, modifica o cancellazione - che deve essere eseguita interamente. Se tutte le operazioni vanno a buon fine, le modifiche ai dati vengono rese persistenti, ossia viene effettuato il commit della transazione. Se, al contrario, si verificano errori viene effettuato il rollback e quindi tutte le modifiche ai dati andranno perse. SQL Server supporta le modalit per le transazioni seguenti.
Transazioni con autocommit: ogni istruzione corrisponde a una
transazione. l'impostazione di default. Transazioni esplicite: ogni transazione viene avviata in modo esplicito tramite l'istruzione BEGIN TRANSACTION e terminata con un'istruzione esplicita COMMIT o ROLLBACK. Transazioni implicite: una nuova transazione viene avviata in modo implicito al termine di una transazione precedente, ma tutte le transazioni vengono terminate in modo esplicito con
96
Transazioni esplicite
Per transazione esplicita si intende una transazione di cui vengono definiti in modo esplicito l'inizio e la fine. Per definire tali transazioni vengono utilizzate le istruzioni BEGIN TRANSACTION, COMMIT TRANSACTION, ROLLBACK TRANSACTION.
BEGIN TRANSACTION: Contrassegna il punto iniziale di una
transazione esplicita per una connessione. COMMIT TRANSACTION: Consente di completare una transazione se non si sono verificati errori. Tutte le modifiche dei dati eseguite nella transazione vengono integrate in modo permanente nel database e le risorse utilizzate dalla transazione vengono liberate. ROLLBACK TRANSACTION: Consente di annullare una transazione in cui si sono verificati errori. Per tutti i dati modificati dalla transazione viene ripristinato lo stato precedente l'inizio della transazione e le risorse utilizzate dalla transazione vengono liberate.
97
98
READ COMMITTED
Specifica che le istruzioni possono leggere le righe modificate da
altre transazioni soltanto quando sia stato eseguito il commit. Questa l'opzione predefinita in SQL Server.
99
Tabelle temporanee
Nel caso si debbano eseguire operazioni complesse che richiedono pi passaggi, risulta molto comodo utilizzare le tabelle temporanee. Tali tabelle - il cui nome deve iniziare con il simbolo cancelletto # - non esistono fisicamente sul database sul quale stiamo lavorando, ma risultano disponibile, dopo la loro creazione, soltanto durante il ciclo di vita della connessione che le ha create su un apposito database temporaneo. Dalle altre connessioni risulter non solo non disponibile la stessa tabella denominata "#tmpTable" ma sar addirittura possibile crearne un'altra con lo stesso nome. Sar compito del motore mantenere nettamente separate e distinte le due tabelle tra le diverse connessioni. I modi per crearle sono essenzialmente:
con i normali comandi T-SQL di tipo DDL, ad esempio CREATE
100
FUNCTION (1)
Le funzioni sono delle routine T-SQL che restituiscono un valore. Non possibile utilizzare funzioni definite dall'utente per eseguire azioni che modificano lo stato del database. In modo analogo alle funzioni di sistema, le funzioni definite dall'utente possono essere richiamate da una query. Per crearla: CREATE FUNCTION nome_funzione Per modificarla: ALTER FUNCTION nome_funzione Per eliminarla DROP FUNCTION nome_funzione Per eseguirla: SELECT nome_procedura(param1, , paramN)
103
FUNCTION (2)
Vediamo un esempio di dichiarazione di una procedura : CREATE FUNCTION nome_funzione ( @param1 int, @param2 varchar(5) ) RETURNS tipo_dato [(lunghezza )] AS BEGIN codice T-SQL RETURN valore END
104
TRIGGER (1)
Un trigger un tipo speciale di stored procedure, definita su una specifica tabella o vista, che viene eseguita automaticamente quando si verifica un evento nel server di database. Esistono sia trigger DML che trigger DDL. I trigger DML possono essere attivati da un o pi eventi specifici di INSERT, UPDATE o DELETE e possono essere due tipi:.
AFTER: il trigger viene attivato solo al termine dell'esecuzione di
tutte le operazioni specificate nell'istruzione che lo ha attivato. Affinch il trigger venga attivato, inoltre necessario che siano stati completati tutti i controlli dei vincoli e le operazioni referenziali di propagazione. INSTEAD OF: il trigger viene eseguito al posto dell'istruzione che lo ha attivato, che quindi non verranno eseguite.
105
TRIGGER (2)
Vediamo un semplice esempio di difinizione di un trigger DML che viene attivato DOPO lesecuzione su una tabella di unoperazione di INSERT o di UPDATE: CREATE TRIGGER nome_trigger ON tabella AFTER INSERT, UPDATE AS codice T-SQL
106
Riferimento
Per avere i riferimenti dettagliati di tutte le istruzioni e le funzioni a cui si fatto riferimento in queste slide, si consiglia di consultare la sezione del sito MSDN di Microsoft relativa al linguaggio Transact-SQL, allindirizzo: http://msdn.microsoft.com/itit/library/ms189826%28v=sql.90%29.aspx
107