V minulém článku jsem zhruba popsal, jak se liší standardní SQL od T-SQL a kdo by se měl které učit. Nyní bych se rád zaměřil na rozdíly v syntaxi a tyto rozdíly ilustroval na příkladech. Pokud si myslíte, že T-SQL je rozšíření implementující všechny funkce ze standardního SQL, nemáte pravdu. V SQL Serveru však najdete téměř všechny funkce standardu SQL. V tomto článku najdete příklady některých rozdílů v syntaxi mezi standardním jazykem SQL a jazykem Transact-SQL.

#1 Názvy databázových objektů

V relačních databázových systémech pojmenováváme tabulky, pohledy a sloupce, ale někdy musíme použít stejný název jako klíčové slovo nebo použít speciální znaky. Ve standardním jazyce SQL lze takový název umístit do uvozovek („“), ale v jazyce T-SQL jej lze umístit i do závorek (). Podívejte se na tyto příklady pro název tabulky v T-SQL:

CREATE TABLE dbo.test."first name" ( Id INT, Name VARCHAR(100));CREATE TABLE dbo.test. ( Id INT, Name VARCHAR(100));

Pouze první oddělovač (uvozovky) pro speciální název je také součástí standardu SQL.

Co je jiného v příkazu SELECT?

Standard SQL nemá syntaxi pro dotaz vracející hodnoty nebo hodnoty pocházející z výrazů bez odkazu na některý sloupec tabulky, ale MS SQL Server tento typ výrazu umožňuje. Jak? Můžete použít samotný příkaz SELECT s výrazem nebo s jinými hodnotami nepocházejícími ze sloupců tabulky. V jazyce T-SQL to vypadá jako v následujícím příkladu:

SELECT 12/6 ;

V tomto výrazu nepotřebujeme tabulku pro vyhodnocení 12 děleno 6, proto lze příkaz FROM a název tabulky vynechat.

#3 Omezení počtu záznamů v souboru výsledků

Ve standardu SQL můžete omezit počet záznamů ve výsledcích pomocí níže znázorněné syntaxe:

SELECT * FROM tab FETCH FIRST 10 ROWS ONLY

T-SQL implementuje tuto syntaxi jiným způsobem. Následující příklad ukazuje syntaxi pro MS SQL Server:

SELECT * FROM tab ORDER BY col1 DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;

Jak jste si všimli, používá se zde klauzule ORDER BY. Dalším způsobem výběru řádků, ale bez ORDER BY, je použití klauzule TOP v jazyce T-SQL:

SELECT TOP 10 * FROM tab;

#4 Automatické generování hodnot

Standard SQL umožňuje vytvářet sloupce s automaticky generovanými hodnotami. Syntaxe pro tento postup je uvedena níže:

CREATE TABLE tab (id DECIMAL GENERATED ALWAYS AS IDENTITY);

V jazyce T-SQL můžeme také automaticky generovat hodnoty, ale tímto způsobem:

CREATE TABLE tab (id INTEGER IDENTITY);

#5 Matematické funkce

Součástí standardu SQL je několik běžných matematických funkcí. Jednou z těchto matematických funkcí je CEIL(x), kterou v jazyce T-SQL nenajdeme. Místo toho jazyk T-SQL poskytuje následující nestandardní funkce: SIGN(x), ROUND(x,) pro zaokrouhlení desetinné hodnoty x na počet desetinných míst, TRUNC(x) pro zkrácení na daný počet desetinných míst, LOG(x) pro vrácení přirozeného logaritmu pro hodnotu x a RANDOM() pro generování náhodných čísel. Nejvyšší nebo nejnižší číslo v seznamu ve standardu SQL vrací funkce MAX(seznam) a MIN(seznam), ale v jazyce Transact-SQL se používají funkce GREATEST(seznam) a LEAST(seznam).

T-SQL function ROUND:SELECT ROUND(col) FROM tab;

#6 Agregační funkce

U agregačních funkcí najdeme další rozdíl v syntaxi. Funkce COUNT, SUM a AVG přijímají argument týkající se počtu. Jazyk T-SQL umožňuje použít před hodnotami těchto argumentů příkaz DISTINCT, aby se řádky počítaly pouze v případě, že se jejich hodnoty liší od ostatních řádků. Standard SQL použití DISTINCT v těchto funkcích neumožňuje.

Standard SQL:SELECT COUNT(col) FROM tab;T-SQL:SELECT COUNT(col) FROM tab;SELECT COUNT(DISTINCT col) FROM tab;

V jazyce T-SQL však nenajdeme funkci populační kovariance:

#7 Získávání částí dat a časů

Většina relačních databázových systémů dodává mnoho funkcí pro práci s daty a časy.

Ve standardu SQL se funkce EXTRACT(YEAR FROM x) a podobné funkce pro výběr částí dat liší od funkcí jazyka T-SQL jako YEAR(x) nebo DATEPART(year, x).

Rozdíl je také v získávání aktuálního data a času. Standardní SQL umožňuje získat aktuální datum pomocí funkce CURRENT_DATE, ale v MS SQL Serveru podobná funkce není, takže musíme použít funkci GETDATE jako argument ve funkci CAST pro převod na datový typ DATE.

#8 Operace s řetězci

Používání funkcí pro operace s řetězci se také liší mezi standardním SQL a T-SQL. Hlavní rozdíl lze nalézt v odstraňování koncové a počáteční mezery z řetězce. Ve standardním jazyce SQL existuje funkce TRIM, ale v jazyce T-SQL existuje několik souvisejících funkcí:

Další velmi často používanou řetězcovou funkcí je SUBSTRING.

Standardní syntaxe funkce SUBSTRING v jazyce SQL vypadá takto:

SUBSTRING(str FROM start ) 

ale v jazyce T-SQL vypadá syntaxe této funkce takto:

SUBSTRING(str, start, length)

Někdy existují důvody pro přidání hodnot pocházejících z jiných sloupců a/nebo dalších řetězců. Standardní SQL k tomu umožňuje následující syntaxi:

Jak vidíte, tato syntaxe využívá operátor || k přidání jednoho řetězce k druhému.

Ale ekvivalentním operátorem v T-SQL je znak plus. Podívejte se na tento příklad:

SELECT col1 + col2 FROM tab;

V SQL Serveru máme také možnost použít funkci CONCAT spojující seznam řetězců:

SELECT CONCAT(col1, str1, col2, ...) FROM tab;

Můžeme také jeden znak několikrát opakovat. Standardní SQL k tomu definuje funkci REPEAT(str, n). Jazyk Transact-SQL poskytuje funkci REPLICATE. Například:

SELECT REPLICATE(str, x); 

kde x udává, kolikrát se má řetězec nebo znak opakovat.

#9 Operátor nerovnosti

Při filtrování záznamů v příkazu SELECT musíme někdy použít operátor nerovnosti. Standardní jazyk SQL definuje jako tento operátor <>, zatímco jazyk T-SQL umožňuje použít jak standardní operátor, tak operátor !=:

SELECT col3 FROM tab WHERE col1 != col2;

#10 Funkce ISNULL

V jazyce T-SQL máme možnost nahradit hodnoty NULL pocházející ze sloupce pomocí funkce ISNULL. Jedná se o funkci, která je specifická pro jazyk T-SQL a není ve standardu SQL.

SELECT ISNULL(col1) FROM tab;

Které části syntaxe DML se liší?

V jazyce T-SQL je základní syntaxe dotazů DELETE, UPDATE a INSERT stejná jako ve standardu SQL, ale rozdíly se objevují u pokročilejších dotazů. Podívejme se na ně.

#11 Klíčové slovo OUTPUT

Klíčové slovo OUTPUT se vyskytuje v příkazech DELETE, UPDATE a INSERT. Ve standardním jazyce SQL není definováno.

Pomocí jazyka T-SQL můžeme zobrazit další informace vrácené dotazem. Vrací staré i nové hodnoty při UPDATE nebo hodnoty přidané pomocí INSERT či smazané pomocí DELETE. Abychom tyto informace viděli, musíme použít předpony v INSERT, UPDATE a DELETE.

UPDATE tab SET col='new value' OUTPUT Deleted.col, Inserted.col;

V aktualizovaném sloupci vidíme výsledek změny záznamů s předchozími a novými hodnotami. Standard SQL tuto funkci nepodporuje.

#12 Syntaxe pro INSERT INTO … SELECT

Jinou strukturou dotazu INSERT je INSERT INTO … SELECT. Jazyk T-SQL umožňuje vložit data z jiné tabulky do cílové tabulky. Podívejte se na tento dotaz:

INSERT INTO tab SELECT col1,col2,... FROM tab_source;

Není to standardní funkce, ale vlastnost charakteristická pro SQL Server.

#13 Klauzule FROM v DELETE a UPDATE

SQL Server poskytuje rozšířenou syntaxi klauzulí UPDATE a DELETE s FROM. Pomocí DELETE s FROM můžete použít řádky z jedné tabulky k odstranění odpovídajících řádků v jiné tabulce s odkazem na primární klíč a cizí klíč. Podobně můžete pomocí UPDATE s FROM aktualizovat řádky z jedné tabulky odkazem na řádky jiné tabulky pomocí společných hodnot (primární klíč v jedné tabulce a cizí klíč v druhé, např. stejný název města). Zde je příklad:

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;

Standard SQL tuto syntaxi neposkytuje.

#14 INSERT, UPDATE a DELETE pomocí JOIN

Pro připojení k jiné tabulce můžete také použít INSERT, UPDATE a DELETE pomocí JOIN. Příklad:

DELETE ItemOrder FROM ItemOrderJOIN Item ON ItemOrder.ItemId=Item.IdWHERE YEAR(Item.DeliveredDate) <= 2017;

Tato funkce není ve standardu SQL.

Shrnutí

Tento článek nepokrývá všechny otázky týkající se syntaktických rozdílů mezi standardem SQL a jazykem T-SQL při použití systému MS SQL Server. Tato příručka však pomáhá poukázat na některé základní vlastnosti charakteristické pouze pro jazyk Transact-SQL a na to, jaká syntaxe standardu SQL není v systému MS SQL Server implementována.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.