Sdílet prostřednictvím


Referenční příručka jazyka SQL pro akceleraci dotazů

Akcelerace dotazů podporuje jazyk podobný jazyku ANSI SQL pro vyjádření dotazů nad obsahem 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é na ANSI SQL, aby podporovala dotazy v hierarchických částečně strukturovaných datových formátech, 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]

Pro data ve formátu CSV musí být tabulka správně nastavena. To znamená, že dotaz se spustí proti objektu blob zadanému ve volání REST. Pro data ve formátu JSON je tabulka "popisovač 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, tento příkaz vrátí nový řádek, který se vytvoří z vyhodnocení každého výrazu 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 příkaz SELECT k vrácení více než 49 sloupců, použijte zástupný znak (*) pro výraz SELECT (například: SELECT *).

Následující příklad vrátí agregovaný výpočet (například: průměrná hodnota konkrétního sloupce) u každého řádku, 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é offsety pro rozdělení objektu blob formátovaného jako CSV. Viz část Sys.Split tohoto článku.

SELECT sys.split(split_size)FROM BlobStorage

Datové typy

Datový typ Popis
INT 64-bitové celé číslo se znaménkem.
PLOVAT 64bitová ("dvojitá přesnost") s plovoucí desetinnou čárkou.
ŘETĚZEC Řetězec Unicode s proměnnou délkou
ČASOVÁ ZNAČKA Bod v čase.
BOOLEOVSKÝ Pravda nebo nepravda.

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 mohou být implicitně přetypovávat na jiné typy v závislosti na kontextu. Další informace naleznete v tématu Priorita datového typu (Transact-SQL).

Výrazy

Odkazování na pole

U dat ve formátu JSON nebo dat ve formátu CSV s řádkem záhlaví můžou být pole odkazována podle názvu. Názvy polí můžou být citované nebo necitované. Názvy polí uzavřené v dvojitých uvozovkách (") mohou obsahovat mezery a rozlišují velká a malá písmena. Necitované názvy polí nerozlišují malá a velká písmena a nesmí obsahovat žádné speciální znaky.

V datech formátovaných ve formátu CSV můžou být pole také odkazována pořadovým znakem s předponou podtržítka (_). Na první pole lze například odkazovat jako _1, nebo na jedenácté pole lze odkazovat jako _11. Odkazování na pole podle poř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 pořadí.

Operátoři

Podporují se následující standardní operátory SQL:

Operátor Popis
= Porovná rovnost dvou výrazů (relační operátor).
!= Testuje, zda se jeden výraz nerovná jinému výrazu (relační operátor).
<> Porovná dva výrazy, které se nerovnají (relační operátor).
< Porovnává dva výrazy pro menší než (porovnávací operátor).
<= Porovná dva výrazy pomocí operátoru menší nebo rovno (relační operátor).
> Porovná dva výrazy pro větší než (relační operátor).
>= Porovnává dva výrazy, zda jsou větší nebo rovny (porovnávací operátor).
+ Sečte dvě čísla. Tento aritmetický operátor sčítání může také přidat k datu číslo vyjádřené v dnech.
- Odečte dvě čísla (aritmetický operátor 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 děleného jiným číslem.
AND Provede bitovou logickou operaci A mezi dvěma celočíselnými hodnotami.
OR Provede bitovou logickou operaci OR mezi dvěma zadanými celočíselnými hodnotami převedenými na binární výrazy v rámci příkazů Transact-SQL.
NOT Neguje logický vstup.
CAST Převede výraz jednoho datového typu na jiný.
BETWEEN Určuje rozsah, který se má testovat.
IN Určuje, zda zadaná hodnota odpovídá libovolné hodnotě v poddotazu nebo seznamu.
NULLIF Vrátí hodnotu null, pokud jsou dva zadané výrazy stejné.
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 pravidel uvedených zde: priorita datového typu (Transact-SQL).

Jazyk SQL akcelerace dotazů podporuje pouze velmi malou podmnožinu datových typů probíraných v tomto článku. Viz část Datové typy tohoto článku.

Předvádí

Jazyk SQL akcelerace dotazů podporuje operátor CAST podle pravidel zde: Převod datového typu (databázový stroj).

Jazyk SQL akcelerace dotazů podporuje pouze malou podmnožinu datových typů, které jsou popsány v tomto článku. Viz část Datové typy tohoto článku.

Řetězcové funkce

Jazyk SQL akcelerace dotazů podporuje následující standardní funkce řetězce SQL:

Funkce Popis
CHAR_LENGTH Vrátí délku znaků řetězcového výrazu, pokud je řetězcový výraz datový typ znaku; v opačném případě vrátí délku v bajtech řetězcového výrazu (nejmenší celé číslo není menší než počet bitů dělený číslem 8). (Tato funkce je stejná jako funkce CHARACTER_LENGTH.)
Délka_znaku Vrátí délku znaků řetězcového výrazu, pokud je řetězcový výraz datový typ znaku; v opačném případě vrátí délku v bajtech řetězcového výrazu (nejmenší celé číslo není menší než počet bitů dělený číslem 8). (Tato funkce je stejná jako funkce CHAR_LENGTH
DOLNÍ Vrátí výraz znaku po převodu velkých písmen na malá písmena.
HORNÍ Vrátí textový výraz, ve kterém jsou malá písmena převedena na velká písmena.
podřetězec Vrátí část znaku, binárního, textového nebo obrázkového výrazu v SQL Serveru.
ZASTŘIHNOUT Odebere znak mezery 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.
STOPOVÁNÍ Odebere znak mezery char(32) nebo jiné určené znaky na konci řetězce.

Zde je několik příkladů:

Funkce Příklad Výsledek
Délka_znaku SELECT CHARACTER_LENGTH('abcdefg') from BlobStorage 7
CHAR_LENGTH SELECT CHAR_LENGTH(_1) from BlobStorage 1
DOLNÍ SELECT LOWER('AbCdEfG') from BlobStorage abcdefg
VRCHNÍ SELECT UPPER('AbCdEfG') from BlobStorage ABCDEFG
PODŘETĚZEC SUBSTRING('123456789', 1, 5) 23456
ZASTŘIHNOUT TRIM(BOTH '123' FROM '1112211Microsoft22211122') Microsoft

Datumové 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 dat standardu ISO8601.

Funkce DATE_ADD

Jazyk SQL akcelerace dotazů podporuje rok, měsíc, den, hodinu, minutu, sekundu DATE_ADD pro funkci.

Příklady:

DATE_ADD(datepart, quantity, timestamp)
DATE_ADD('minute', 1, CAST('2017-01-02T03:04:05.006Z' AS TIMESTAMP)

funkce DATE_DIFF

Jazyk SQL akcelerace dotazů podporuje rok, měsíc, den, hodinu, minutu, sekundu DATE_DIFF pro funkci.

DATE_DIFF(datepart, timestamp, timestamp)
DATE_DIFF('hour','2018-11-09T00:00+05:30','2018-11-09T01:00:23-08:00') 

FUNKCE EXTRACT

Pokud jde o funkci EXTRACT jinou než část data, kterou podporuje jazyk SQL pro akceleraci dotazů, jsou jako část data podporovány timezone_hour a timezone_minute.

Příklady:

EXTRACT(datepart FROM timestampstring)
EXTRACT(YEAR FROM '2010-01-01T')

Funkce TO_STRING

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át řetězce Výstup
Rr Rok ve formátu 2 číslic – 1999 jako 99
y Rok ve formátu 4 číslic
yyyyy Rok ve formátu 4 číslic
M Měsíc roku – 1
MILIMETR Měsíc s nulovým doplněním - 01
MMM Zkrácený měsíc roku – JAN
MMMM Celý měsíc – květen
d Den v měsíci (1–31)
Dd Nulový den v měsíci (01–31)
a DOM nebo PM
h Hodina dne (1–12)
Hh Nulami doplněné hodiny dne ve dvanáctihodinovém formátu (01-12)
H Hodina dne (0–23)
HH Nulová hodina dne (00–23)
m Minuta hodiny (0–59)
milimetr Nulová minuta (00–59)
s Druhá v rámci minut (0–59)
ß Nula v sekundách (00–59)
S Zlomek sekund (0,1-0,9)
ß Díl sekundy (0,01-0,99)
SSS Zlomek sekund (0,001-0,999)
X 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 Časový posun v hodinách (7)
xx nebo xxxx Posun za hodinu a minutu (+0530)
Xxx nebo xxxxx Posun v hodině a minutě (+05:30)

TO_TIMESTAMP funkce

Podporují se pouze IS08601 formáty.

Příklady:

TO_TIMESTAMP(string)
TO_TIMESTAMP('2007T')

Poznámka:

Funkci můžete také použít UTCNOW k získání systémového času.

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ídají výrazu predikátu.
COUNT(výraz) Vrátí počet záznamů, pro které je výraz nenulový.
AVG(výraz) Vrátí průměr nenulových hodnot výrazu.
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 nenulových hodnot výrazu.

NEPŘÍTOMNÝ

Operátor IS MISSING je jediným nestandardním kódem, který jazyk SQL akcelerace dotazů podporuje. Pokud v datech JSON chybí pole v určitém vstupním záznamu, výraz IS MISSING se vyhodnotí jako logickou hodnotou true.

Popisovače tabulek

U dat CSV je název tabulky vždy BlobStorage. Například:

SELECT * FROM BlobStorage

Pro data JSON jsou k dispozici další možnosti:

SELECT * FROM BlobStorage[*].path

To umožňuje dotazy nad podmnožinami dat JSON.

U dotazů JSON můžete zmínit cestu v části klauzule FROM. Tyto cesty vám pomůžou analyzovat podmnožinu dat JSON. Tyto cesty můžou odkazovat na hodnoty pole JSON a objektu.

Podívejme se na příklad, abychom ho podrobněji pochopili.

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 jenom 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 chcete získat přístup pouze k hodnotě objektu dimensions JSON, můžete použít odkaz na tento objekt v dotazu. Například:

SELECT length FROM BlobStorage[*].dimensions

Tím také omezíte přístup k členům objektu dimensions . Pokud chcete získat přístup k ostatním členům polí JSON a vnitřním hodnotám objektů JSON, můžete použít dotaz, například v následujícím příkladu:

SELECT weight,warehouses[0].longitude,id,tags[1] FROM BlobStorage[*]

Poznámka:

BlobStorage a BlobStorage[*] odkazují na celý objekt. Pokud však máte v klauzuli FROM cestu, budete muset použít BlobStorage[*].path.

Sys.Split

Toto je speciální forma 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 zpracovat datové záznamy CSV v dávkách. Díky tomu můžete zpracovávat záznamy paralelně, 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, bude příkaz vypadat 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 vejde do těchto 10 MB.

Ve většině případů bude velikost každé dávky o něco vyšší než zadané číslo. Je to proto, že dávka nemůže obsahovat částečný záznam. Pokud se poslední záznam v dávce spustí před koncem prahové hodnoty, dávka bude větší, aby obsahovala úplný záznam. Velikost poslední dávky bude pravděpodobně menší než zadaná velikost.

Poznámka:

Split_size musí být aspoň 10 MB (10485760).

Viz také