I min förra artikel beskrev jag grovt hur standard SQL skiljer sig från T-SQL och vem som bör lära sig vad. Nu vill jag fokusera på syntaxskillnaderna och illustrera dessa skillnader med exempel. Om du tror att T-SQL är ett tillägg som implementerar alla funktioner från standard-SQL har du inte rätt. I SQL Server hittar du dock nästan alla funktioner från SQL-standarden. I den här artikeln hittar du exempel på några av skillnaderna i syntax mellan standard-SQL och Transact-SQL.

#1 Namn på databasobjekt

I relationella databassystem namnger vi tabeller, vyer och kolumner, men ibland behöver vi använda samma namn som ett nyckelord eller använda specialtecken. I standard-SQL kan du placera den här typen av namn inom citationstecken (””), men i T-SQL kan du också placera det inom parentes (). Titta på de här exemplen för namnet på en tabell i T-SQL:

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

Endast den första avgränsaren (citattecknen) för specialnamnet ingår också i SQL-standarden.

Vad är annorlunda i ett SELECT-uttalande?

SQL-standarden har inte någon syntax för en fråga som returnerar värden eller värden som kommer från uttryck utan att hänvisa till några kolumner i en tabell, men MS SQL Server tillåter denna typ av uttryck. Hur? Du kan använda ett SELECT-uttalande enbart med ett uttryck eller med andra värden som inte kommer från kolumner i tabellen. I T-SQL ser det ut som i exemplet nedan:

SELECT 12/6 ;

I det här uttrycket behöver vi inte en tabell för att utvärdera 12 dividerat med 6, därför kan FROM-angivelsen och namnet på tabellen utelämnas.

#3 Begränsning av poster i en resultatuppsättning

I SQL-standarden kan du begränsa antalet poster i resultaten med hjälp av syntaxen som illustreras nedan:

SELECT * FROM tab FETCH FIRST 10 ROWS ONLY

T-SQL implementerar denna syntax på ett annat sätt. Exemplet nedan visar syntaxen för MS SQL Server:

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

Som du märker används här en ORDER BY-klausul. Ett annat sätt att välja rader, men utan ORDER BY, är att använda TOP-klausulen i T-SQL:

SELECT TOP 10 * FROM tab;

#4 Automatiskt genererade värden

SQL-standarden gör det möjligt att skapa kolumner med automatiskt genererade värden. Syntaxen för att göra detta visas nedan:

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

I T-SQL kan vi också generera värden automatiskt, men på detta sätt:

CREATE TABLE tab (id INTEGER IDENTITY);

#5 Matematiska funktioner

Flera vanliga matematiska funktioner ingår i SQL-standarden. En av dessa matematiska funktioner är CEIL(x), som vi inte hittar i T-SQL. Istället tillhandahåller T-SQL följande icke-standardiserade funktioner: SIGN(x), ROUND(x,) för att avrunda decimalvärdet x till antalet decimaler, TRUNC(x) för att avrunda till ett givet antal decimaler, LOG(x) för att återge den naturliga logaritmen för ett värde x och RANDOM() för att generera slumptal. Det högsta eller lägsta talet i en lista i SQL-standarden returneras av funktionerna MAX(list) och MIN(list), men i Transact-SQL använder du funktionerna GREATEST(list) och LEAST(list).

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

#6 Aggregerade funktioner

Vi hittar en annan syntaxskillnad med de aggregerade funktionerna. Funktionerna COUNT, SUM och AVG tar alla ett argument som är relaterat till ett antal. T-SQL tillåter användning av DISTINCT före dessa argumentvärden så att rader räknas endast om värdena skiljer sig från andra rader. SQL-standarden tillåter inte användning av DISTINCT i dessa funktioner.

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

Men i T-SQL hittar vi ingen funktion för befolkningskovarians: COVAR_POP(x,y), som definieras i SQL-standarden.

#7 Hämta delar av datum och tider

De flesta relationella databassystem levererar många funktioner för att bearbeta datum och tider.

I standard-SQL skiljer sig funktionen EXTRACT(YEAR FROM x) och liknande funktioner för att välja delar av datum från T-SQL-funktioner som YEAR(x) eller DATEPART(year, x).

Det finns också en skillnad när det gäller att få fram aktuellt datum och aktuell tid. Standard-SQL gör det möjligt att få fram det aktuella datumet med funktionen CURRENT_DATE, men i MS SQL Server finns det ingen liknande funktion, så vi måste använda funktionen GETDATE som ett argument i CAST-funktionen för att konvertera till en DATE-datatyp.

#8 Operera på strängar

Användning av funktioner för att operera på strängar skiljer sig också mellan SQL-standard och T-SQL. Den största skillnaden finns när det gäller att ta bort avslutande och inledande mellanslag från en sträng. I standard-SQL finns funktionen TRIM, men i T-SQL finns det flera relaterade funktioner: TRIM (tar bort efterföljande och ledande mellanslag), LTRIM (tar bort ledande mellanslag) och RTRIM (tar bort efterföljande mellanslag).

En annan mycket ofta använd strängfunktion är SUBSTRING.

Standard-SQL-syntaxen för SUBSTRING-funktionen ser ut som:

SUBSTRING(str FROM start ) 

Men i T-SQL ser syntaxen för den här funktionen ut som:

SUBSTRING(str, start, length)

Det finns ibland skäl att lägga till värden som kommer från andra kolumner och/eller ytterligare strängar. Standard SQL möjliggör följande syntax för att göra detta:

Som du kan se använder syntaxen operatorn || för att lägga till en sträng till en annan.

Men motsvarande operator i T-SQL är plustecknet. Titta på det här exemplet:

SELECT col1 + col2 FROM tab;

I SQL Server har vi också möjlighet att använda CONCAT-funktionen som sammanfogar en lista med strängar:

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

Vi kan också upprepa ett tecken flera gånger. Standard SQL definierar funktionen REPEAT(str, n) för att göra detta. Transact-SQL tillhandahåller funktionen REPLICATE. Till exempel:

SELECT REPLICATE(str, x); 

där x anger hur många gånger strängen eller tecknet ska upprepas.

#9 Olikhetsoperator

Under filtrering av poster i ett SELECT-utdrag måste vi ibland använda en olikhetsoperator. Standard-SQL definierar <> som denna operatör, medan T-SQL tillåter både standardoperatorn och !=-operatören:

SELECT col3 FROM tab WHERE col1 != col2;

#10 ISNULL-funktion

I T-SQL har vi möjlighet att ersätta NULL-värden som kommer från en kolumn med hjälp av ISNULL-funktionen. Detta är en funktion som är specifik för T-SQL och som inte finns i SQL-standarden.

SELECT ISNULL(col1) FROM tab;

Vilka delar av DML-syntaxen är annorlunda?

I T-SQL är den grundläggande syntaxen för DELETE-, UPDATE- och INSERT-förfrågningar densamma som i SQL-standarden, men skillnader förekommer i mer avancerade frågor. Låt oss titta på dem.

#11 Nyckelordet OUTPUT

Nyckelordet OUTPUT förekommer i DELETE-, UPDATE- och INSERT-satser. Det är inte definierat i standard-SQL.

Med hjälp av T-SQL kan vi se extra information som returneras av en fråga. Det returnerar både gamla och nya värden i UPDATE eller de värden som lagts till med INSERT eller tagits bort med DELETE. För att se den här informationen måste vi använda prefix i INSERT, UPDATE och DELETE.

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

Vi ser resultatet av att ändra poster med de tidigare och nya värdena i en uppdaterad kolumn. SQL-standarden stöder inte den här funktionen.

#12 Syntax för INSERT INTO … SELECT

En annan struktur för en INSERT-fråga är INSERT INTO … SELECT. T-SQL gör det möjligt att infoga data från en annan tabell till en måltabell. Titta på den här frågan:

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

Det är inte en standardfunktion utan en funktion som är karakteristisk för SQL Server.

#13 FROM-klausul i DELETE och UPDATE

SQL Server tillhandahåller utökad syntax för UPDATE och DELETE med FROM-klausuler. Du kan använda DELETE with FROM för att använda rader från en tabell för att ta bort motsvarande rader i en annan tabell genom att hänvisa till en primärnyckel och en främmande nyckel. På samma sätt kan du använda UPDATE with FROM för att uppdatera rader från en tabell genom att hänvisa till rader i en annan tabell med hjälp av gemensamma värden (primärnyckel i en tabell och främmande nyckel i den andra, t.ex. samma stadsnamn). Här är ett exempel:

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;

SQL-standarden tillhandahåller inte den här syntaxen.

#14 INSERT, UPDATE och DELETE med JOIN

Du kan också använda INSERT, UPDATE och DELETE med JOIN för att ansluta till en annan tabell. Ett exempel på detta är:

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

Denna funktion finns inte i SQL-standarden.

Sammanfattning

Denna artikel täcker inte alla frågor om syntaxskillnader mellan SQL-standarden och T-SQL som använder MS SQL Server-systemet. Den här guiden hjälper dock till att peka på vissa grundläggande funktioner som endast är karakteristiska för Transact-SQL och vilken syntax för SQL-standarden som inte implementeras av MS SQL Server.

Lämna ett svar

Din e-postadress kommer inte publiceras.