Informazioni di riferimento sul linguaggio SQL per l'accelerazione delle query
L'accelerazione delle query supporta un linguaggio simile a ANSI SQL per esprimere le query sul contenuto del BLOB. Il dialetto SQL di accelerazione della query è un subset di SQL ANSI, con un set limitato di tipi di dati supportati, operatori e così via, ma si espande anche su ANSI SQL per supportare query su formati di dati semistrutturati gerarchici, ad esempio JSON.
Sintassi SELECT
L'unica istruzione SQL supportata dall'accelerazione delle query è l'istruzione SELECT. Questo esempio restituisce ogni riga per cui l'espressione restituisce true.
SELECT * FROM table [WHERE expression] [LIMIT limit]
Per i dati formattati in CSV, la tabella deve essere BlobStorage
. Ciò significa che la query verrà eseguita su qualsiasi BLOB specificato nella chiamata REST. Per i dati formattati JSON, la tabella è un descrittore di tabella. Vedere la sezione Descrittori tabella di questo articolo.
Nell'esempio seguente, per ogni riga per cui l'espressione WHERE restituisce true, questa istruzione restituirà una nuova riga creata dalla valutazione di ognuna delle espressioni di proiezione.
SELECT expression [, expression ...] FROM table [WHERE expression] [LIMIT limit]
È possibile specificare una o più colonne specifiche come parte dell'espressione SELECT , ad esempio SELECT Title, Author, ISBN
.
Nota
Il numero massimo di colonne specifiche che è possibile usare nell'espressione SELECT è 49. Se è necessaria l'istruzione SELECT per restituire più di 49 colonne, usare un carattere jolly () per l'espressione SELECT (*
ad esempio: SELECT *
).
Nell'esempio seguente viene restituito un calcolo aggregato , ad esempio il valore medio di una colonna specifica, su ognuna delle righe per cui l'espressione restituisce true.
SELECT aggregate_expression FROM table [WHERE expression] [LIMIT limit]
Nell'esempio seguente vengono restituiti offset appropriati per la suddivisione di un BLOB formattato csv. Vedere la sezione Sys.Split di questo articolo.
SELECT sys.split(split_size)FROM BlobStorage
Tipi di dati
Tipo di dati | Descrizione |
---|---|
INT | Intero con segno a 64 bit. |
FLOAT | 64 bit ("precisione doppia") a virgola mobile. |
STRING | Stringa Unicode a lunghezza variabile. |
timestamp | Un punto nel tempo. |
BOOLEAN | True o false. |
Durante la lettura dei valori dai dati formattati csv, tutti i valori vengono letti come stringhe. I valori stringa possono essere convertiti in altri tipi usando espressioni CAST. I valori possono essere cast implicitamente in altri tipi a seconda del contesto. per altre informazioni, vedere Precedenza del tipo di dati (Transact-SQL).
Espressioni
Campi di riferimento
Per i dati formattati JSON o i dati formattati in FORMATO CSV con una riga di intestazione, i campi possono essere a cui si fa riferimento per nome. I nomi dei campi possono essere virgolette o senza virgolette. I nomi dei campi virgolette sono racchiusi tra virgolette doppie ("
), possono contenere spazi e sono distinzione tra maiuscole e minuscole. I nomi dei campi senza virgolette sono senza distinzione tra maiuscole e minuscole e potrebbero non contenere caratteri speciali.
Nei dati formattati in CSV, i campi possono anche essere a cui si fa riferimento per ordinale, preceduto da un carattere di sottolineatura (_
). Ad esempio, il primo campo può essere fatto riferimento a _1
, o il campo di undici può essere fatto riferimento a _11
. I campi di riferimento per ordinale sono utili per i dati formattati csv che non contengono una riga di intestazione, nel qual caso l'unico modo per fare riferimento a un determinato campo è ordinale.
Operatori
Sono supportati gli operatori SQL standard seguenti:
Operatore | Descrizione |
---|---|
= |
Esegue un confronto per determinare se due espressioni sono uguali (operatore di confronto). |
!= |
Verifica se un'espressione è diversa da un'altra espressione (operatore di confronto). |
<> |
Confronta due espressioni per non uguali a (un operatore di confronto). |
< |
Confronta due espressioni per minore di (un operatore di confronto). |
<= |
Confronta due espressioni per minore o uguale (un operatore di confronto). |
> |
Confronta due espressioni per maggiore di (operatore di confronto). |
>= |
Confronta due espressioni e verifica la presenza di valori maggiori o uguali (operatore di confronto). |
+ |
Esegue la somma di due numeri. Questo operatore aritmetico di addizione consente inoltre di aggiungere un numero, espresso in giorni, a una data. |
- |
Sottrae due numeri (operatore aritmetico di sottrazione). |
/ |
Divide un numero per un altro (operatore aritmetico di divisione). |
* |
Moltiplica due espressioni (operatore aritmetico di moltiplicazione). |
% |
Viene restituito il resto di una divisione. |
AND |
Esegue un'operazione con AND logico bit per bit tra due valori integer. |
OR |
Esegue un'operazione con OR logico bit per bit tra i due valori interi specificati convertiti in espressioni binarie in istruzioni Transact-SQL. |
NOT |
Nega un input booleano. |
CAST |
Converte un'espressione da un tipo di dati a un altro. |
BETWEEN |
Specifica un intervallo da testare. |
IN |
Determina se il valore specificato corrisponde a un valore in una sottoquery o in un elenco. |
NULLIF |
Restituisce un valore Null se le due espressioni specificate sono uguali. |
COALESCE |
Valuta gli argomenti in ordine e restituisce il valore corrente della prima espressione che inizialmente non restituisce NULL. |
Se i tipi di dati a sinistra e a destra di un operatore sono diversi, la conversione automatica verrà eseguita in base alle regole specificate qui: precedenza del tipo di dati (Transact-SQL).
Il linguaggio SQL di accelerazione query supporta solo un subset molto piccolo dei tipi di dati descritti in tale articolo. Vedere la sezione Tipi di dati di questo articolo.
Cast
Il linguaggio SQL di accelerazione query supporta l'operatore CAST, in base alle regole riportate di seguito: conversione del tipo di dati (motore di database).
Il linguaggio SQL di accelerazione query supporta solo un piccolo subset dei tipi di dati descritti in tale articolo. Vedere la sezione Tipi di dati di questo articolo.
Funzioni per i valori stringa
Il linguaggio SQL di accelerazione query supporta le funzioni di stringa SQL standard seguenti:
Funzione | Descrizione |
---|---|
CHAR_LENGTH | Restituisce la lunghezza in caratteri dell'espressione stringa, se l'espressione stringa è di un tipo di dati di carattere; in caso contrario, restituisce la lunghezza in byte dell'espressione stringa (il numero intero più piccolo non minore del numero di bit divisi da 8). Questa funzione è uguale alla funzione CHARACTER_LENGTH. |
CHARACTER_LENGTH | Restituisce la lunghezza in caratteri dell'espressione stringa, se l'espressione stringa è di un tipo di dati di carattere; in caso contrario, restituisce la lunghezza in byte dell'espressione stringa (il numero intero più piccolo non minore del numero di bit divisi da 8). Questa funzione è la stessa della funzione CHAR_LENGTH |
LOWER | Restituisce un'espressione di caratteri dopo aver convertito i caratteri maiuscoli in caratteri minuscoli. |
UPPER | Restituisce un'espressione di caratteri con dati di tipo carattere minuscoli convertiti in maiuscolo. |
SUBSTRING | Restituisce parte di un'espressione di tipo carattere, binario, testo o immagine in SQL Server. |
TRIM | Rimuove il carattere di spazio char(32) o altri caratteri specificati dall'inizio e dalla fine di una stringa. |
LEADING | Rimuove il carattere di spazio char(32) o altri caratteri specificati dall'inizio di una stringa. |
TRAILING | Rimuove il carattere di spazio char(32) o altri caratteri specificati dalla fine di una stringa. |
Ecco alcuni esempi:
Funzione | Esempio | Risultato |
---|---|---|
CHARACTER_LENGTH | SELECT CHARACTER_LENGTH('abcdefg') from BlobStorage |
7 |
CHAR_LENGTH | SELECT CHAR_LENGTH(_1) from BlobStorage |
1 |
LOWER | SELECT LOWER('AbCdEfG') from BlobStorage |
abcdefg |
UPPER | SELECT UPPER('AbCdEfG') from BlobStorage |
ABCDEFG |
SUBSTRING | SUBSTRING('123456789', 1, 5) |
23456 |
TRIM | TRIM(BOTH '123' FROM '1112211Microsoft22211122') |
Microsoft |
Funzioni di data
Sono supportate le funzioni di data SQL standard seguenti:
DATE_ADD
DATE_DIFF
EXTRACT
TO_STRING
TO_TIMESTAMP
Attualmente vengono convertiti tutti i formati di data dello standard IS08601 .
funzione DATE_ADD
Il linguaggio SQL di accelerazione query supporta anno, mese, giorno, ora, minuto, secondo per la DATE_ADD
funzione.
Esempi:
DATE_ADD(datepart, quantity, timestamp)
DATE_ADD('minute', 1, CAST('2017-01-02T03:04:05.006Z' AS TIMESTAMP)
funzione DATE_DIFF
Il linguaggio SQL di accelerazione query supporta anno, mese, giorno, ora, minuto, secondo per la DATE_DIFF
funzione.
DATE_DIFF(datepart, timestamp, timestamp)
DATE_DIFF('hour','2018-11-09T00:00+05:30','2018-11-09T01:00:23-08:00')
Funzione EXTRACT
Per EXTRACT diverso dalla parte data supportata per la DATE_ADD
funzione, il linguaggio SQL di accelerazione query supporta timezone_hour e timezone_minute come parte della data.
Esempi:
EXTRACT(datepart FROM timestampstring)
EXTRACT(YEAR FROM '2010-01-01T')
funzione TO_STRING
Esempi:
TO_STRING(TimeStamp , format)
TO_STRING(CAST('1969-07-20T20:18Z' AS TIMESTAMP), 'MMMM d, y')
Questa tabella descrive le stringhe che è possibile usare per specificare il formato di output della TO_STRING
funzione.
Stringa di formato | Output |
---|---|
yy | Anno in formato a 2 cifre - 1999 come '99' |
y | Anno in formato a 4 cifre |
aaaa | Anno in formato a 4 cifre |
M | Mese dell'anno - 1 |
MM | Zero padded Month - 01 |
MMM | Abbr. mese dell'anno - JAN |
MMMM | Mese completo - Maggio |
d | Giorno del mese (1-31) |
gg | Zero padded day of Month (01-31) |
a | AM o PM |
h | Ora del giorno (1-12) |
hh | Zero padded Hours od day (01-12) |
H | Ora del giorno (0-23) |
HH | Ora di riempimento zero del giorno (00-23) |
m | Minuto di ora (0-59) |
MM | Minuto riempito zero (00-59) |
s | Secondo minuto (0-59) |
ss | Zero padded Seconds (00-59) |
S | Frazione di secondi (0,1-0,9) |
SS | Frazione di secondi (0,01-0,99) |
SSS | Frazione di secondi (0,001-0,999) |
X | Offset in ore |
XX o XXXX | Offset in ore e minuti (+0430) |
XXX o XXXXX | Offset in ore e minuti (-07:00) |
x | Offset in ore (7) |
xx o xxxx | Offset in ora e minuto (+0530) |
Xxx o xxxxx | Offset in ora e minuto (+05:30) |
funzione TO_TIMESTAMP
Sono supportati solo i formati IS08601.
Esempi:
TO_TIMESTAMP(string)
TO_TIMESTAMP('2007T')
Nota
È anche possibile usare la UTCNOW
funzione per ottenere l'ora di sistema.
Espressioni di aggregazione
Un'istruzione SELECT può contenere una o più espressioni di proiezione o una singola espressione di aggregazione. Sono supportate le espressioni di aggregazione seguenti:
Expression | Descrizione |
---|---|
COUNT(*) | Restituisce il numero di record corrispondenti all'espressione del predicato. |
COUNT(expression) | Restituisce il numero di record per cui expression è diverso da Null. |
AVG(expression) | Restituisce la media dei valori non Null dell'espressione. |
MIN(expression) | Restituisce il valore minimo non Null dell'espressione. |
MAX(expression) | Restituisce il valore massimo non Null dell'espressione. |
SUM(expression) | Restituisce la somma di tutti i valori non Null dell'espressione. |
MANCANTE
L'operatore IS MISSING
è l'unico non standard supportato dal linguaggio SQL di accelerazione query. Per i dati JSON, se un campo manca da un determinato record di input, il campo IS MISSING
dell'espressione valuterà il valore booleano true.
Descrittori di tabella
Per i dati CSV, il nome della tabella è sempre BlobStorage
. Ad esempio:
SELECT * FROM BlobStorage
Per i dati JSON sono disponibili opzioni aggiuntive:
SELECT * FROM BlobStorage[*].path
Ciò consente query sui subset dei dati JSON.
Per le query JSON, è possibile menzionare il percorso nella parte della clausola FROM. Questi percorsi consentono di analizzare il subset di dati JSON. Questi percorsi possono fare riferimento ai valori matrice JSON e Object.
Si supponga di prendere un esempio per comprendere questo aspetto in modo più dettagliato.
Si tratta dei dati di esempio:
{
"id": 1,
"name": "mouse",
"price": 12.5,
"tags": [
"wireless",
"accessory"
],
"dimensions": {
"length": 3,
"width": 2,
"height": 2
},
"weight": 0.2,
"warehouses": [
{
"latitude": 41.8,
"longitude": -87.6
}
]
}
È possibile essere interessati solo all'oggetto warehouses
JSON dai dati precedenti. L'oggetto warehouses
è un tipo di matrice JSON, quindi è possibile menzionare questo oggetto nella clausola FROM. La query di esempio può essere simile a questa.
SELECT latitude FROM BlobStorage[*].warehouses[*]
La query ottiene tutti i campi, ma seleziona solo la latitudine.
Se si vuole accedere solo al valore dell'oggetto dimensions
JSON, è possibile usare il riferimento a tale oggetto nella query. Ad esempio:
SELECT length FROM BlobStorage[*].dimensions
Ciò limita anche l'accesso ai membri dell'oggetto dimensions
. Se si desidera accedere ad altri membri di campi JSON e valori interni di oggetti JSON, è possibile usare una query come illustrato nell'esempio seguente:
SELECT weight,warehouses[0].longitude,id,tags[1] FROM BlobStorage[*]
Nota
BLOBStorage e BLOBStorage[*] fanno entrambi riferimento all'intero oggetto. Tuttavia, se si dispone di un percorso nella clausola FROM, sarà necessario usare BLOBStorage[*].path
Sys.Split
Si tratta di una forma speciale dell'istruzione SELECT, disponibile solo per i dati formattati csv.
SELECT sys.split(split_size) FROM BlobStorage
Usare questa istruzione nei casi in cui si vuole scaricare e quindi elaborare i record di dati CSV in batch. In questo modo è possibile elaborare i record in parallelo anziché dover scaricare tutti i record alla volta. Questa istruzione non restituisce record dal file CSV. Restituisce invece una raccolta di dimensioni batch. È quindi possibile usare ogni dimensione batch per recuperare un batch di record di dati.
Usare il parametro split_size per specificare il numero di byte che si desidera che ogni batch contenga. Ad esempio, se si desidera elaborare solo 10 MB di dati alla volta, l'istruzione sarà simile al seguente: SELECT sys.split(10485760)FROM BlobStorage
perché 10 MB è uguale a 10.485.760 byte. Ogni batch conterrà il numero massimo di record che possono essere inseriti in tali 10 MB.
Nella maggior parte dei casi, le dimensioni di ogni batch saranno leggermente superiori al numero specificato. Questo perché un batch non può contenere un record parziale. Se l'ultimo record in un batch inizia prima della fine della soglia, il batch sarà più grande in modo che possa contenere il record completo. Le dimensioni dell'ultimo batch saranno probabilmente inferiori alle dimensioni specificate.
Nota
Il split_size deve essere almeno 10 MB (10485760).