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ýtBlobStoragetabulka . 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).

Viz také