Nel mio ultimo articolo, ho descritto approssimativamente come SQL standard differisce da T-SQL e chi dovrebbe imparare quale. Ora vorrei concentrarmi sulle differenze di sintassi e illustrare queste differenze con esempi. Se pensate che T-SQL sia un’estensione che implementa tutte le caratteristiche di SQL standard, non avete ragione. Tuttavia, in SQL Server, troverete quasi tutte le caratteristiche dello standard SQL. In questo articolo, troverete esempi di alcune delle differenze di sintassi tra SQL standard e Transact-SQL.
#1 Nomi degli oggetti del database
Nei sistemi di database relazionali, diamo un nome a tabelle, viste e colonne, ma a volte abbiamo bisogno di usare lo stesso nome come una parola chiave o usare caratteri speciali. In SQL standard, potete mettere questo tipo di nome tra virgolette (“”), ma in T-SQL, potete anche metterlo tra parentesi (). Guardate questi esempi per il nome di una tabella in T-SQL:
CREATE TABLE dbo.test."first name" ( Id INT, Name VARCHAR(100));CREATE TABLE dbo.test. ( Id INT, Name VARCHAR(100));
Solo il primo delimitatore (le virgolette) per il nome speciale fa parte dello standard SQL.
Cosa c’è di diverso in una frase SELECT?
Lo standard SQL non ha una sintassi per una query che restituisce valori o valori provenienti da espressioni senza riferimento a nessuna colonna di una tabella, ma MS SQL Server permette questo tipo di espressione. Come? È possibile utilizzare un’istruzione SELECT da sola con un’espressione o con altri valori non provenienti da colonne della tabella. In T-SQL, si presenta come l’esempio qui sotto:
SELECT 12/6 ;
In questa espressione, non abbiamo bisogno di una tabella per valutare 12 diviso 6, quindi, l’istruzione FROM e il nome della tabella possono essere omessi.
#3 Limitare i record in un set di risultati
Nello standard SQL, è possibile limitare il numero di record nei risultati usando la sintassi illustrata qui sotto:
SELECT * FROM tab FETCH FIRST 10 ROWS ONLY
T-SQL implementa questa sintassi in un modo diverso. L’esempio qui sotto mostra la sintassi di MS SQL Server:
SELECT * FROM tab ORDER BY col1 DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;
Come si nota, questo usa una clausola ORDER BY. Un altro modo di selezionare le righe, ma senza ORDER BY, è usando la clausola TOP in T-SQL:
SELECT TOP 10 * FROM tab;
#4 Generazione automatica dei valori
Lo standard SQL permette di creare colonne con valori generati automaticamente. La sintassi per farlo è mostrata qui sotto:
CREATE TABLE tab (id DECIMAL GENERATED ALWAYS AS IDENTITY);
In T-SQL possiamo anche generare automaticamente dei valori, ma in questo modo:
CREATE TABLE tab (id INTEGER IDENTITY);
#5 Funzioni matematiche
Diverse funzioni matematiche comuni fanno parte dello standard SQL. Una di queste funzioni matematiche è CEIL(x), che non troviamo in T-SQL. Invece, T-SQL fornisce le seguenti funzioni non standard: SIGN(x), ROUND(x,) per arrotondare il valore decimale x al numero di posizioni decimali, TRUNC(x) per troncare a un dato numero di posizioni decimali, LOG(x) per restituire il logaritmo naturale di un valore x, e RANDOM() per generare numeri casuali. Il numero più alto o più basso in una lista nello standard SQL è restituito dalle funzioni MAX(list) e MIN(list), ma in Transact-SQL, si usano le funzioni GREATEST(list) e LEAST(list).
T-SQL function ROUND:SELECT ROUND(col) FROM tab;
#6 Funzioni aggregate
Troviamo un’altra differenza di sintassi con le funzioni aggregate. Le funzioni COUNT, SUM e AVG prendono tutte un argomento relativo a un conteggio. T-SQL permette l’uso di DISTINCT prima dei valori di questi argomenti in modo che le righe siano contate solo se i valori sono diversi dalle altre righe. Lo standard SQL non permette l’uso di DISTINCT in queste funzioni.
Standard SQL:SELECT COUNT(col) FROM tab;T-SQL:SELECT COUNT(col) FROM tab;SELECT COUNT(DISTINCT col) FROM tab;
Ma in T-SQL non troviamo una funzione di covarianza della popolazione: COVAR_POP(x,y), che è definita nello standard SQL.
#7 Recuperare parti di date e orari
La maggior parte dei sistemi di database relazionali forniscono molte funzioni per operare su date e orari.
In SQL standard, la funzione EXTRACT(YEAR FROM x) e funzioni simili per selezionare parti di date sono diverse dalle funzioni T-SQL come YEAR(x) o DATEPART(year, x).
C’è anche una differenza nell’ottenere la data e l’ora correnti. L’SQL standard permette di ottenere la data attuale con la funzione CURRENT_DATE, ma in MS SQL Server, non c’è una funzione simile, quindi dobbiamo usare la funzione GETDATE come argomento nella funzione CAST per convertire in un tipo di dati DATE.
#8 Operare su stringhe
Anche l’uso di funzioni per operare su stringhe è diverso tra l’SQL standard e il T-SQL. La differenza principale si trova nella rimozione degli spazi iniziali e finali da una stringa. In SQL standard, c’è la funzione TRIM, ma in T-SQL, ci sono diverse funzioni correlate: TRIM (rimozione degli spazi iniziali e finali), LTRIM (rimozione degli spazi iniziali), e RTRIM (rimozione degli spazi finali).
Un’altra funzione di stringa usata molto spesso è SUBSTRING.
La sintassi standard SQL per la funzione SUBSTRING assomiglia a:
SUBSTRING(str FROM start )
ma in T-SQL, la sintassi di questa funzione assomiglia a:
SUBSTRING(str, start, length)
A volte ci sono ragioni per aggiungere valori provenienti da altre colonne e/o stringhe aggiuntive. SQL standard permette la seguente sintassi per fare questo:
Come potete vedere, questa sintassi fa uso dell’operatore || per aggiungere una stringa all’altra.
Ma l’operatore equivalente in T-SQL è il carattere più. Guardate questo esempio:
SELECT col1 + col2 FROM tab;
In SQL Server, abbiamo anche la possibilità di usare la funzione CONCAT che concatena una lista di stringhe:
SELECT CONCAT(col1, str1, col2, ...) FROM tab;
Possiamo anche ripetere un carattere più volte. L’SQL standard definisce la funzione REPEAT(str, n) per fare questo. Transact-SQL fornisce la funzione REPLICATE. Per esempio:
SELECT REPLICATE(str, x);
dove x indica quante volte ripetere la stringa o il carattere.
#9 Operatore di disuguaglianza
Durante il filtraggio dei record in una dichiarazione SELECT, a volte dobbiamo usare un operatore di disuguaglianza. SQL standard definisce <> come questo operatore, mentre T-SQL permette sia l’operatore standard che l’operatore !=:
SELECT col3 FROM tab WHERE col1 != col2;
#10 Funzione ISNULL
In T-SQL, abbiamo la possibilità di sostituire i valori NULL provenienti da una colonna usando la funzione ISNULL. Questa è una funzione specifica per T-SQL e non è nello standard SQL.
SELECT ISNULL(col1) FROM tab;
Quali parti della sintassi DML sono diverse?
In T-SQL, la sintassi di base delle query DELETE, UPDATE e INSERT è la stessa dello standard SQL, ma le differenze appaiono nelle query più avanzate. Vediamole.
#11 Parola chiave OUTPUT
La parola chiave OUTPUT si trova nelle istruzioni DELETE, UPDATE e INSERT. Non è definita in SQL standard.
Utilizzando il T-SQL, possiamo vedere informazioni extra restituite da una query. Restituisce sia i vecchi che i nuovi valori in UPDATE o i valori aggiunti usando INSERT o cancellati usando DELETE. Per vedere queste informazioni, dobbiamo usare i prefissi in INSERT, UPDATE e DELETE.
UPDATE tab SET col='new value' OUTPUT Deleted.col, Inserted.col;
Vediamo il risultato della modifica dei record con i valori precedenti e nuovi in una colonna aggiornata. Lo standard SQL non supporta questa caratteristica.
#12 Sintassi per INSERT INTO … SELECT
Un’altra struttura di una query INSERT è INSERT INTO … SELECT. T-SQL permette di inserire dati da un’altra tabella in una tabella di destinazione. Guardate questa query:
INSERT INTO tab SELECT col1,col2,... FROM tab_source;
Non è una funzione standard ma una caratteristica di SQL Server.
#13 Clausola FROM in DELETE e UPDATE
SQL Server fornisce una sintassi estesa delle clausole UPDATE e DELETE con FROM. Potete usare DELETE with FROM per usare le righe di una tabella per rimuovere le righe corrispondenti in un’altra tabella facendo riferimento a una chiave primaria e una chiave esterna. Allo stesso modo, è possibile utilizzare UPDATE with FROM per aggiornare le righe di una tabella facendo riferimento alle righe di un’altra tabella utilizzando valori comuni (chiave primaria in una tabella e chiave esterna nella seconda, ad esempio lo stesso nome di città). Ecco un esempio:
DELETE FROM BookFROM AuthorWHERE Author.Id=Book.AuthorId AND Author.Name IS NULL;
UPDATE BookSET Book.Price=Book.Price*0.2FROM AuthorWHERE Book.AuthorId=Author.Id AND Author.Id=12;
Lo standard SQL non fornisce questa sintassi.
#14 INSERT, UPDATE, and DELETE With JOIN
Puoi anche usare INSERT, UPDATE, and DELETE usando JOIN per collegarti ad un’altra tabella. Un esempio di questo è:
DELETE ItemOrder FROM ItemOrderJOIN Item ON ItemOrder.ItemId=Item.IdWHERE YEAR(Item.DeliveredDate) <= 2017;
Questa caratteristica non è nello standard SQL.
Sommario
Questo articolo non copre tutte le questioni sulle differenze di sintassi tra lo standard SQL e il T-SQL usando il sistema MS SQL Server. Tuttavia, questa guida aiuta a sottolineare alcune caratteristiche di base caratteristiche solo di Transact-SQL e quale sintassi standard SQL non è implementata da MS SQL Server.
.