Referenční informace k jazyku SQL pro akceleraci dotazů
Akcelerace dotazů podporuje jazyk podobný ANSI SQL pro vyjádření dotazů na obsah objektů blob. Dialekt SQL akcelerace dotazů je podmnožinou ANSI SQL s omezenou sadou podporovaných datových typů, operátorů atd., ale rozšiřuje se také o ANSI SQL a podporuje dotazy nad hierarchickými částečně strukturovanými datovými formáty, jako je JSON.
Syntaxe SELECT
Jediným příkazem SQL podporovaným akcelerací dotazů je příkaz SELECT. Tento příklad vrátí každý řádek, pro který výraz vrátí hodnotu true.
SELECT * FROM table [WHERE expression] [LIMIT limit]
U dat ve formátu CSV musí býtBlobStorage
tabulka . To znamená, že dotaz se spustí s libovolným objektem blob zadaným ve volání REST. U dat ve formátu JSON je tabulka "deskriptor tabulky". Viz část Popisovače tabulek v tomto článku.
V následujícím příkladu pro každý řádek, pro který výraz WHERE vrátí hodnotu true, vrátí tento příkaz nový řádek, který se vytvoří z vyhodnocení jednotlivých výrazů projekce.
SELECT expression [, expression ...] FROM table [WHERE expression] [LIMIT limit]
Jako součást výrazu SELECT můžete zadat jeden nebo více konkrétních sloupců (například SELECT Title, Author, ISBN
).
Poznámka
Maximální počet konkrétních sloupců, které můžete použít ve výrazu SELECT, je 49. Pokud potřebujete, aby příkaz SELECT vrátil více než 49 sloupců, použijte pro výraz SELECT zástupný znak (*
) (například SELECT *
).
Následující příklad vrátí agregovaný výpočet (například průměrnou hodnotu určitého sloupce) nad každým řádkem, pro který výraz vrátí hodnotu true.
SELECT aggregate_expression FROM table [WHERE expression] [LIMIT limit]
Následující příklad vrátí vhodné posuny pro rozdělení objektu blob ve formátu CSV. Viz část Sys.Split tohoto článku.
SELECT sys.split(split_size)FROM BlobStorage
Typy dat
Typ dat | Popis |
---|---|
INT | 64bitové celé číslo se signoumi sadou. |
FLOAT | 64bitová ("dvojitá přesnost") s plovoucí desetinou čárkou. |
ŘETĚZEC | Řetězec Unicode s proměnnou délkou. |
ČASOVÉ RAZÍTKO | Bod v čase. |
BOOLEAN | True nebo false |
Při čtení hodnot z dat ve formátu CSV se všechny hodnoty čtou jako řetězce. Řetězcové hodnoty mohou být převedeny na jiné typy pomocí výrazů CAST. Hodnoty se můžou implicitně přetypovat na jiné typy v závislosti na kontextu. Další informace najdete v tématu Priorita datových typů (Transact-SQL).
Výrazy
Odkazování na pole
U dat ve formátu JSON nebo u dat ve formátu CSV s řádkem záhlaví se na pole může odkazovat podle názvu. Názvy polí mohou být uvozovány nebo bez citace. Názvy polí v uvozovkách jsou uzavřeny znaky s dvojitými uvozovkami ("
), mohou obsahovat mezery a rozlišují malá a velká písmena. V názvech polí bez citací se nerozlišují malá a velká písmena a nesmí obsahovat žádné speciální znaky.
V datech formátovaných ve formátu CSV může na pole odkazovat také pořadový řádek s předponou s podtržítkem (_
). Například první pole může být odkazováno jako _1
, nebo jedenácté pole může být odkazováno jako _11
. Odkazování na pole podle řad je užitečné pro data ve formátu CSV, která neobsahují řádek záhlaví. V takovém případě je jediným způsobem, jak odkazovat na konkrétní pole, podle řad.
Operátory
Podporují se následující standardní operátory SQL:
Operátor | Popis |
---|---|
= |
Porovná rovnost dvou výrazů (operátor porovnání). |
!= |
Testuje, jestli se jeden výraz nerovná jinému výrazu (relační operátor). |
<> |
Porovná dva výrazy pro nerovnající se (relační operátor). |
< |
Porovná dva výrazy pro menší než (operátor porovnání). |
<= |
Porovná dva výrazy pro menší než nebo rovno (operátor porovnání). |
> |
Porovná dva výrazy pro operátor větší než (operátor porovnání). |
>= |
Porovná dva výrazy pro větší než nebo rovno (relační operátor). |
+ |
Sečte dvě čísla. Tento aritmetický operátor sčítání může k datu také přidat číslo ve dnech. |
- |
Odčítá dvě čísla (operátor aritmetického odčítání). |
/ |
Vydělí jedno číslo jiným (aritmetický operátor dělení). |
* |
Vynásobí dva výrazy (aritmetický operátor násobení). |
% |
Vrátí zbytek jednoho čísla vydělený jiným číslem. |
AND |
Provede bitové logické operace AND mezi dvěma celočíselnými hodnotami. |
OR |
Provádí bitové logické operace OR mezi dvěma zadanými celočíselnými hodnotami přeloženými na binární výrazy v rámci příkazů Jazyka Transact-SQL. |
NOT |
Neguje logický vstup. |
CAST |
Převede výraz jednoho datového typu na jiný. |
BETWEEN |
Určuje oblast, která se má testovat. |
IN |
Určuje, zda se zadaná hodnota shoduje s libovolnou hodnotou v poddotazu nebo seznamu. |
NULLIF |
Vrátí hodnotu null, pokud jsou dva zadané výrazy rovny. |
COALESCE |
Vyhodnotí argumenty v pořadí a vrátí aktuální hodnotu prvního výrazu, který se zpočátku nevyhodnocuje jako NULL. |
Pokud se datové typy na levé a pravé straně operátoru liší, provede se automatický převod podle zde zadaných pravidel: Priorita datového typu (Transact-SQL).
Jazyk SQL pro akceleraci dotazů podporuje pouze velmi malou podmnožinu datových typů probíraných v tomto článku. Viz část Datové typy tohoto článku.
Vrhá
Jazyk SQL pro akceleraci dotazů podporuje operátor CAST podle pravidel zde: Převod datového typu (databázový stroj).
Jazyk SQL pro akceleraci dotazů podporuje pouze malou podmnožinu datových typů probíraných v tomto článku. Viz část Datové typy tohoto článku.
Funkce řetězců
Jazyk SQL pro akceleraci dotazů podporuje následující standardní řetězcové funkce SQL:
Funkce | Popis |
---|---|
CHAR_LENGTH | Vrátí délku řetězcového výrazu ve znaménce, pokud je řetězcový výraz datového typu znaku; v opačném případě vrátí délku řetězcového výrazu v bajtech (nejmenší celé číslo ne menší než počet bitů dělený číslem 8). (Tato funkce je stejná jako funkce CHARACTER_LENGTH.) |
CHARACTER_LENGTH | Vrátí délku řetězcového výrazu ve znaménce, pokud je řetězcový výraz datového typu znaku; v opačném případě vrátí délku řetězcového výrazu v bajtech (nejmenší celé číslo ne menší než počet bitů dělený číslem 8). (Tato funkce je stejná jako funkce CHAR_LENGTH |
LOWER | Vrátí výraz znaku po převodu dat velkých písmen na malá písmena. |
UPPER | Vrátí znakový výraz s daty malými písmeny převedenými na velká písmena. |
PODŘETĚZEC | Vrátí část znaku, binárního výrazu, textu nebo obrázku v SQL Server. |
TRIM | Odebere mezeru znaku char(32) nebo jiné zadané znaky ze začátku a konce řetězce. |
VEDOUCÍ | Odebere znak mezery char(32) nebo jiné zadané znaky od začátku řetězce. |
KONCOVÉ | Odebere znak mezery char(32) nebo jiné zadané znaky z konce řetězce. |
Tady je několik příkladů:
Funkce | Příklad | Výsledek |
---|---|---|
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 |
Datové funkce
Podporují se následující standardní funkce data SQL:
DATE_ADD
DATE_DIFF
EXTRACT
TO_STRING
TO_TIMESTAMP
V současné době jsou převedeny všechny formáty data standardního IS08601 .
DATE_ADD funkce
Jazyk SQL pro akceleraci dotazů pro funkci podporuje rok, měsíc, den, hodinu, minutu a sekundu DATE_ADD
.
Příklady:
DATE_ADD(datepart, quantity, timestamp)
DATE_ADD('minute', 1, CAST('2017-01-02T03:04:05.006Z' AS TIMESTAMP)
DATE_DIFF funkce
Jazyk SQL pro akceleraci dotazů pro funkci podporuje rok, měsíc, den, hodinu, minutu a sekundu DATE_DIFF
.
DATE_DIFF(datepart, timestamp, timestamp)
DATE_DIFF('hour','2018-11-09T00:00+05:30','2018-11-09T01:00:23-08:00')
FUNKCE EXTRACT
Pro funkci EXTRACT, která DATE_ADD
není podporovaná pro funkci data, podporuje jazyk SQL akcelerace dotazů timezone_hour a timezone_minute jako část s datem.
Příklady:
EXTRACT(datepart FROM timestampstring)
EXTRACT(YEAR FROM '2010-01-01T')
TO_STRING funkce
Příklady:
TO_STRING(TimeStamp , format)
TO_STRING(CAST('1969-07-20T20:18Z' AS TIMESTAMP), 'MMMM d, y')
Tato tabulka popisuje řetězce, které můžete použít k určení výstupního TO_STRING
formátu funkce.
Formátovací řetězec | Výstup |
---|---|
RR | Year in 2 digit format – 1999 as '99' |
y | Rok ve 4ciferném formátu |
rrrr | Rok ve 4ciferném formátu |
M | Měsíc roku – 1 |
MM | Měsíc s nulovou polstrovanou hodnotou – 01 |
MMM | Abbr. month of Year - JAN |
MMMM | Celý měsíc - květen |
d | Den v měsíci (1–31) |
dd | Nula polstrovaný den měsíce (01-31) |
pro | AM nebo PM |
h | Hodina dne (1–12) |
hh | Nula polstrovaných hodin od dne (01-12) |
H | Hodina dne (0–23) |
HH | Žádná hodina dne (00–23) |
m | Minuta hodiny (0–59) |
mm | Nula minut (00–59) |
s | Sekunda z minut (0–59) |
ss | 00–59 sekund |
S | Zlomek sekund (0,1–0,9) |
SS | Zlomek sekundy (0,01–0,99) |
SSS | Zlomek sekundy (0,001–0,999) |
× | Posun v hodinách |
XX nebo XXXX | Posun v hodinách a minutách (+0430) |
XXX nebo XXXXX | Posun v hodinách a minutách (-07:00) |
x | Posun v hodinách (7) |
xx nebo xxxx | Posun v hodinách a minutách (+0530) |
Xxx nebo xxxxx | Posun v hodině a minutě (+05:30) |
TO_TIMESTAMP funkce
Podporují se jenom formáty IS08601.
Příklady:
TO_TIMESTAMP(string)
TO_TIMESTAMP('2007T')
Poznámka
K získání systémového UTCNOW
času můžete použít také funkci .
Agregační výrazy
Příkaz SELECT může obsahovat jeden nebo více výrazů projekce nebo jeden agregační výraz. Podporují se následující agregační výrazy:
Výraz | Popis |
---|---|
COUNT(*) | Vrátí počet záznamů, které odpovídaly výrazu predikátu. |
COUNT(výraz) | Vrátí počet záznamů, jejichž výraz nemá hodnotu null. |
AVG(výraz) | Vrátí průměr hodnot výrazu, které nejsou null. |
MIN(výraz) | Vrátí minimální hodnotu výrazu, která není null. |
MAX(výraz) | Vrátí maximální hodnotu výrazu, která není null. |
SUMA(výraz) | Vrátí součet všech hodnot výrazu, které nejsou null. |
CHYBĚJÍCÍ
Operátor IS MISSING
je jediný nestandardní, který jazyk SQL akcelerace dotazů podporuje. Pokud u dat JSON v konkrétním vstupním záznamu chybí nějaké pole, vyhodnotí se pole IS MISSING
výrazu jako logická hodnota true.
Deskriptory tabulky
Pro data CSV je název tabulky vždy BlobStorage
. Příklad:
SELECT * FROM BlobStorage
Pro data JSON jsou k dispozici další možnosti:
SELECT * FROM BlobStorage[*].path
To umožňuje dotazovat se na podmnožinu dat JSON.
V případě dotazů JSON můžete cestu zmínit v části klauzule FROM. Tyto cesty vám pomůžou parsovat podmnožinu dat JSON. Tyto cesty mohou odkazovat na hodnoty pole JSON a objektu.
Pojďme se podívat na příklad, abychom to pochopili podrobněji.
Toto jsou naše ukázková data:
{
"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
}
]
}
Může vás zajímat pouze warehouses
objekt JSON z výše uvedených dat. Objekt warehouses
je typ pole JSON, takže ho můžete zmínit v klauzuli FROM. Ukázkový dotaz může vypadat přibližně takto.
SELECT latitude FROM BlobStorage[*].warehouses[*]
Dotaz získá všechna pole, ale vybere jenom zeměpisnou šířku.
Pokud byste chtěli získat přístup pouze k hodnotě objektu dimensions
JSON, mohli byste v dotazu použít odkaz na tento objekt. Příklad:
SELECT length FROM BlobStorage[*].dimensions
Tím se také omezí přístup ke členům objektu dimensions
. Pokud chcete získat přístup k dalším členům polí JSON a vnitřním hodnotám objektů JSON, můžete použít dotazy, jako je znázorněno v následujícím příkladu:
SELECT weight,warehouses[0].longitude,id,tags[1] FROM BlobStorage[*]
Poznámka
Objekt BlobStorage i BlobStorage[*] odkazují na celý objekt. Pokud ale máte v klauzuli FROM cestu, budete muset použít BlobStorage[*].path.
Sys.Split
Jedná se o speciální formu příkazu SELECT, který je k dispozici pouze pro data ve formátu CSV.
SELECT sys.split(split_size) FROM BlobStorage
Tento příkaz použijte v případech, kdy chcete stáhnout a pak zpracovat datové záznamy CSV v dávkách. Díky tomu můžete zpracovávat záznamy paralelně a nemusíte stahovat všechny záznamy najednou. Tento příkaz nevrací záznamy ze souboru CSV. Místo toho vrátí kolekci velikostí dávek. Každou velikost dávky pak můžete použít k načtení dávky datových záznamů.
Pomocí parametru split_size určete počet bajtů, které má každá dávka obsahovat. Pokud například chcete zpracovat jenom 10 MB dat najednou, vypadalo by to takto: SELECT sys.split(10485760)FROM BlobStorage
protože 10 MB se rovná 10 485 760 bajtům. Každá dávka bude obsahovat tolik záznamů, kolik se do těchto 10 MB vejde.
Ve většině případů bude velikost každé dávky o něco větší než zadané číslo. Je to proto, že dávka nemůže obsahovat částečný záznam. Pokud poslední záznam v dávce začíná před koncem prahové hodnoty, dávka bude větší, aby mohl obsahovat celý záznam. Velikost poslední dávky bude pravděpodobně menší než velikost, kterou zadáte.
Poznámka
Split_size musí mít aspoň 10 MB (10485760).