track
T-SQL (Transact-SQL) är Microsofts utökning av standard-SQL, utformad specifikt för användning med Microsoft SQL Server. Förutom alla grundläggande SQL-funktioner för att fråga och hantera data lägger T-SQL till funktioner för procedurprogrammering som låter dig skriva kraftfullare och mer dynamisk databaslogik.
I den här guiden visar jag hur T-SQL fungerar och hur du använder det effektivt i verkliga scenarier. Jag går också igenom vanliga användningsområden som att fråga databaser, skriva lagrade procedurer och automatisera återkommande arbetsflöden, med praktiska exempel.
Om du är ny på SQL, börja med vår Introduktion till SQL-kurs, eller SQL på medelnivå om du har lite erfarenhet. Jag tycker också att SQL Basics Cheat Sheet, som du kan ladda ner, är en bra referens eftersom den innehåller de vanligaste SQL-funktionerna.
Vad är T-SQL och hur det skiljer sig från SQL
För att förstå T-SQL bättre kan du tänka på SQL som ett universellt språk och T-SQL som en specialiserad yrkesdialekt.
SQL (Structured Query Language) är standardspråket som används för att interagera med relationsdatabaser. Det är deklarativt, vilket innebär att du anger vilket resultat du vill ha, till exempel att välja eller filtrera data, och databasens motor avgör hur frågan ska köras.
T-SQL är å andra sidan Microsofts utökning av SQL som används i Microsoft SQL Server. Det bygger på standard-SQL genom att lägga till procedurprogrammering, så att du kan styra hur operationer genomförs steg för steg.
Utifrån denna definition introducerar T-SQL flera kraftfulla funktioner som går bortom grundläggande frågeställningar, bland annat:
-
Variabler: Du kan använda nyckelorden
DECLAREochSETför att lagra data i minnet och återanvända dem i skript -
Styrflöde: Du kan använda logik som
IF,WHILEochBEGIN...ENDför att styra körningen och bestämma vilken kod som ska köras. -
FELHANTERING: T-SQL introducerar
TRY...CATCH-block, som låter databasen fånga ett fel och hantera det smidigt utan att krascha hela operationen. -
Lagrade procedurer: Du kan skapa återanvändbara logikblock som körs inne i databasen.
Om du arbetar med SQL Server har DataCamp många bra resurser som kan hjälpa till. Som start rekommenderar jag DataCamps kurs Introduktion till SQL Server för att bemästra grunderna i SQL Server för dataanalys.
Grundläggande T-SQL-syntax och struktur
T-SQL använder samma grundläggande syntax som standard-SQL, så om du redan är bekant med SQL kommer du lätt att förstå det. I det här avsnittet går jag igenom de vanligaste T-SQL-satserna med enkla, praktiska exempel.
SELECT, INSERT, UPDATE, DELETE
Dessa kommandon är standard i de flesta SQL-dialekter, inklusive Microsoft SQL Server, som T-SQL är byggt för.
SELECT
Kommandot som används för att hämta data från specifika tabeller. Till exempel hämtar frågan nedan FirstName och LastName från tabellen Customers.
-- Retrieve data from the Customers table
SELECT FirstName, LastName
FROM Customers
WHERE Country = ‘USA’; -- Filters rows to only customers in the USA
INSERT
Detta kommando används för att lägga in ny data i tabellen. Frågan nedan lägger in en ny rad i tabellen customers.
-- Insert a new row into a table
INSERT INTO customers (FirstName, city)
VALUES (‘Alice’, ‘Nairobi’);
UPDATE
Detta kommando används för att ändra befintlig data i databasen. Till exempel ändrar frågan nedan stadsnamnet till ”Mombasa” för användaren ”Alice”.
-- Update existing data
UPDATE customers
SET city = ‘Mombasa’
WHERE FirstName= ‘Alice’; -- Always use WHERE to avoid updating all rows
DELETE
Detta kommando tar bort data från databasen. Till exempel tar frågan nedan bort raden där FirstName är ”Alice”.
-- Delete data from a table
DELETE FROM customers
WHERE FirstName= ‘Alice’; -- Filters which rows to remove
Jag rekommenderar att du provar vår kompetensväg SQL Server Fundamentals för att lära dig mer om att sammanfatta och analysera data med SQL Server-funktioner
Batchkörning
En unik egenskap hos T-SQL är hur det kör kod i batchar. En batch är en grupp av en eller flera SQL-satser som skickas till SQL Server som en enhet.
Nyckelordet GO används för att separera batchar:
-- First batch
SELECT * FROM Customers;
GO
-- Second batch (executed separately)
SELECT * FROM Orders;
GO
Det är viktigt att notera att:
-
GOär inte ett T-SQL-kommando, men det känns igen av verktyg som SQL Server Management Studio. -
Det markerar slutet på en batch och början på en annan.
-
Variablerna finns inte kvar mellan batchar. Temporära objekt finns faktiskt kvar mellan batchar i samma session.
Kommentarer och formatering
Du kan använda kommentarer i T-SQL för att göra din SQL-kod lättare att läsa och underhålla. Du kan använda antingen enradiga eller flerradiga kommentarer enligt nedan:
-- This query retrieves all customers
SELECT * FROM Customers;
/* This query retrieves customers
from the USA and Canada */
SELECT *
FROM Customers
WHERE Country IN ('USA', 'Canada');
Variabler och datatyper i T-SQL
T-SQL låter dig lagra värden i variabler och använda dem i frågor, vilket gör dina skript mer flexibla och dynamiska. Låt oss titta på hur man skapar dessa variabler.
Deklarera variabler
För att skapa en variabel använder du nyckelordet DECLARE. Enligt konvention måste alla T-SQL-variabelnamn börja med symbolen @.
-- Declares a variable to store text
DECLARE @CustomerName VARCHAR(50);
Tilldela värden
Du kan tilldela värden med antingen SET (rekommenderas för enskilda värden) eller SELECT (användbart när du hämtar från en tabell).
-- Assign using SET
SET @CustomerName = 'Alice';
-- Assign using SELECT
SELECT @Age = 30;
Till exempel returnerar frågan nedan en lista över kunder som bor i London, med en variabel i stället för att hårdkoda värdet.
-- Assign the variable city
DECLARE @City VARCHAR(50);
SET @City = 'London';
-- Use the variable in a query
SELECT name, city
FROM customers
WHERE city = @City; -- Filters results based on variable value
Vanliga datatyper
Följande är några vanligt använda T-SQL-datatyper som är standard bland SQL-datatyper:
-
INT: Heltal, till exempel 1, 100. -
VARCHAR(n): Text med variabel längd, som namn och e-postadresser. -
DATETIME: Datum- och tidsvärden -
DECIMAL(p, s): Tal med fast precision, som valuta.
Styrflöde i T-SQL (IF, WHILE, BEGIN...END)
En av fördelarna med T-SQL är att du kan lägga till programmeringslogik i dina frågor. I stället för att bara hämta data kan du styra hur och när kod körs. Nedan följer exempel på styrflödeslogik.
IF...ELSE (Villkorsstyrd körning)
Med satsen IF kan du köra ett kodblock endast om ett specifikt villkor är uppfyllt. Om villkoret är falskt kan du använda ELSE för att ange en alternativ åtgärd.
Till exempel räknar frågan nedan det totala antalet orders och skriver sedan ut ”Hög ordervolym” om det är över 100 orders eller skriver ut ”Låg ordervolym” när det är under 100.
DECLARE @TotalOrders INT;
SELECT @TotalOrders = COUNT(*)
FROM Orders; -- Count total number of orders
IF @TotalOrders > 100
BEGIN
PRINT 'High order volume'; -- Runs if condition is true
END
ELSE
BEGIN
PRINT 'Low order volume'; -- Runs if condition is false
END
WHILE-loopar (Iterativ logik)
Loopen WHILE upprepar ett kodblock så länge ett villkor är sant. Detta är användbart för uppgifter som behöver göras i ”bitar” eller för att generera testdata.
Frågan nedan initierar en räknare på 1 och använder en loop för att skriva ut det aktuella talet och öka det med 1 tills det når 5.
DECLARE @Counter INT = 1;
WHILE @Counter <= 5
BEGIN
PRINT @Counter; -- Prints numbers from 1 to 5
SET @Counter = @Counter + 1; -- Increment counter
END
BEGIN...END (Gruppera satser)
Flödet BEGIN...END används för att gruppera flera satser i ett enda block för att säkerställa att all grupperad kod körs tillsammans atomärt.
Till exempel kommer frågan nedan att skriva ut både ”Customers found in USA” och ”Proceeding with operation.” Utan BEGIN...END skulle endast den första satsen efter IF köras.
IF EXISTS (SELECT 1 FROM Customers WHERE Country = 'USA')
BEGIN
PRINT 'Customers found in USA';
PRINT 'Proceeding with operation'; -- Both statements run together
END
När är styrflöde användbart?
Styrflöde i T-SQL används ofta för:
- Automatisering: Köra schemalagda skript eller underhållsuppgifter
- Datavalidering: Kontrollera villkor innan data infogas eller uppdateras
- Batchbearbetning: Hantera data i steg eller loopar
- Affärslogik: Tillämpa regler direkt i databasen
Lagrade procedurer i T-SQL
En lagrad procedur är en sparad samling T-SQL-satser som du kan återanvända om och om igen. I stället för att skicka en massiv kodklump från din applikation till servern varje gång sparar du koden på servern och anropar bara dess namn.
Lagrade procedurer är användbara eftersom du kan återanvända dem många gånger. De förkompilerade körningsplanerna förbättrar effektiviteten och döljer komplex logik bakom ett enkelt gränssnitt.
Till exempel hämtar den här lagrade proceduren för- och efternamn för en kund baserat på det ID du anger.
-- Create a stored procedure named GetCustomerByID
CREATE PROCEDURE GetCustomerByID
@CustomerID INT -- Input parameter to pass a customer ID
AS
BEGIN
-- Select the first and last name of a customer
SELECT FirstName, LastName
FROM Customers
WHERE CustomerID = @CustomerID; -- Filter to match the given ID
END;
Du kan sedan köra den lagrade proceduren med frågan nedan:
-- Calls the procedure
EXEC GetCustomerByID @CustomerID = 1; Funktioner i T-SQL
T-SQL innehåller både inbyggda funktioner och användardefinierade funktioner (UDF:er) som används för att transformera data.
Inbyggda funktioner
Dessa funktioner finns redan tillgängliga i SQL Server och kan användas direkt i frågor.
Strängfunktion
Detta är en funktion som transformerar strängdatatyper. Till exempel hämtar frågan nedan alla förnamn från tabellen Customers och konverterar dem till versaler.
-- Converts text to uppercase
SELECT UPPER(FirstName)
FROM Customers;
Datumfunktion
Den här funktionen transformerar datumfunktioner. Frågan nedan returnerar aktuellt systemdatum och -tid.
-- Returns current date and time
SELECT GETDATE();
Aggregeringsfunktion
Dessa funktioner används för att aggregera värden i en tabell. Till exempel räknar frågan nedan det totala antalet rader (kunder) i tabellen Customers.
-- Counts rows
SELECT COUNT(*) AS TotalCustomers
FROM Customers;
Användardefinierade funktioner (UDF:er)
Du kan också skapa egna funktioner för att återanvända logik i flera frågor.
Skalfunktion
En skalfunktion returnerar ett enda värde och är användbar när du behöver ett enskilt beräknat värde, till exempel formatering eller beräkningar. I frågan nedan tar funktionen ett förnamn och efternamn som indata och returnerar dem som ett enda fullständigt namn.
-- Create a function that combines the first and last name
CREATE FUNCTION GetFullName
(@FirstName VARCHAR(50), @LastName VARCHAR(50))
RETURNS VARCHAR(100)
AS
BEGIN
RETURN @FirstName + ' ' + @LastName; -- Concatenates the two values
END;
Tabellvärda funktioner
Tabellvärda funktioner returnerar en tabell. Till exempel returnerar funktionen nedan en tabell med alla kunder som tillhör det angivna landet.
-- Create a table-valued function named GetCustomersByCountry
CREATE FUNCTION GetCustomersByCountry (@Country VARCHAR(50))
RETURNS TABLE -- Specifies that the function returns a table
AS
RETURN
(
-- Select all columns from the Customers table
SELECT *
FROM Customers
WHERE Country = @Country -- Filter rows by the given country
);
Jag rekommenderar att du provar hela karriärvägen SQL Server Developer, som inte bara ger dig färdigheter i att skapa, uppdatera och köra lagrade procedurer, utan också hjälper dig med aggregeringsfunktioner, joiner, infogning och borttagning av tabeller och mycket mer.
Felhanttering i T-SQL
T-SQL använder TRY...CATCH-block för att hantera fel utan att stoppa hela skriptet. Detta är viktigt eftersom det förhindrar att skript kraschar oväntat och låter dig returnera meningsfulla meddelanden för felsökning eller loggning.
Till exempel försöker frågan nedan köra en beräkning som orsakar ett fel, fångar det och skriver ut ett läsbart felmeddelande i stället för att krascha.
BEGIN TRY
-- Attempt to run this code
SELECT 1 / 0; -- This causes a divide-by-zero error
END TRY
BEGIN CATCH
-- Runs if an error occurs in the TRY block
PRINT 'An error occurred: ' + ERROR_MESSAGE(); -- Displays the error message
END CATCH;
Transaktioner i T-SQL
En transaktion säkerställer att en grupp operationer antingen lyckas helt eller misslyckas helt. Detta följer ACID-principen, som garanterar att din databas förblir konsekvent även om strömmen går mitt i en uppdatering.
I exemplet nedan överför transaktionen pengar från ett konto till ett annat och sparar båda ändringarna tillsammans.
BEGIN TRANSACTION; -- Start the transaction
-- Deduct money from Account 1
UPDATE Accounts
SET Balance = Balance - 100
WHERE AccountID = 1;
-- Add money to Account 2
UPDATE Accounts
SET Balance = Balance + 100
WHERE AccountID = 2;
COMMIT; -- Save all changes permanently
Om något går fel kan du använda funktionen ROLLBACK för att avbryta transaktionen och återställa data till tidigare tillstånd.
-- Undo all changes made in the current transaction
ROLLBACK;
Transaktioner i T-SQL är viktiga eftersom de säkerställer dataintegritet, särskilt i kritiska system som finansiella applikationer, där partiella uppdateringar kan leda till inkonsekvenser.
Du kan prova vår karriärväg Transactions and Error Handling in SQL Server, som täcker transaktioner och felhantering i SQL Server.
Vanliga T-SQL-funktioner för dataanalys
T-SQL innehåller några verktyg som är särskilt användbara för dataprofessionella. Låt oss titta på några exempel och hur de tillämpas i dataanalys.
Fönsterfunktioner
Fönsterfunktioner utför beräkningar över rader utan att gruppera dem till ett enda resultat. De används oftast för rankning, löpande summor och avancerad analys.
I exemplet nedan tilldelar frågan ett unikt radnummer till varje kund baserat på deras CustomerID.
-- Assigns row numbers to customers
SELECT
FirstName,
ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNum -- Assigns row numbers
FROM Customers;
I frågan:
-
ROW_NUMBER(): Tilldelar unika radnummer
-
RANK(): Tilldelar rank med luckor vid lika värden -
OVER(): Definierar fönstret (sortering/partitionering)
Jag rekommenderar att du kollar in vårt SQL Window Functions Cheat Sheet, som du kan ladda ner, där du får en praktisk referensguide till olika typer av fönsterfunktioner i SQL. Titta också på vår kurs SQL Server på medelnivå för att lära dig mer om att använda T-SQL i dataanalys, inklusive fönsterfunktioner för att sammanfatta data.
Common table expressions (CTE:er)
CTE:er (Common Table Expressions) skapar en temporär resultatmängd som du kan återanvända i en fråga. Frågan nedan skapar en temporär lista över USA-kunder och hämtar sedan data från den.
-- Define a CTE
WITH CustomerCTE AS (
SELECT FirstName, Country
FROM Customers
WHERE Country = 'USA' -- Filter only USA customers
)
-- Query the CTE
SELECT *
FROM CustomerCTE;
Å andra sidan är rekursiva CTE:er en speciell typ av CTE som refererar till sig själva i sin definition, vilket gör att frågan kan utföra upprepade operationer. Detta gör dem idealiska för att arbeta med hierarkiska data som organisationsscheman.
Jag rekommenderar att du går vår kurs Hierarkiska och rekursiva frågor i SQL Server för att lära dig skriva avancerade frågor i SQL Server, inklusive sådana som involverar CTE:er och rekursiva CTE:er, med praktiska exempel.
Temporära tabeller
Temporära tabeller lagrar data för kortvarig användning under en session. De är användbara för att mellanlagra data, förenkla flerstegstransformationer eller förbättra prestanda i komplexa frågor.
För att demonstrera hur temporära tabeller fungerar i T-SQL, betrakta följande tre frågeblock. Det första skapar en temporär tabell, fyller den sedan med kunddata och frågar den därefter inom samma session.
-- Create a temporary table
CREATE TABLE #TempCustomers (
FirstName VARCHAR(50),
Country VARCHAR(50)
);
-- Insert data into the temporary table
INSERT INTO #TempCustomers
SELECT FirstName, Country
FROM Customers;
-- Retrieve data from the temporary table
SELECT * FROM #TempCustomers;
Det är viktigt att notera att temporära tabeller inleds med # och att de automatiskt tas bort när sessionen avslutas.
T-SQL jämfört med andra SQL-dialekter
Alla SQL-dialekter delar samma grund, men varje databassystem lägger till sin egen syntax och sina egna funktioner. T-SQL är utformat specifikt för Microsoft SQL Server, vilket påverkar hur det fungerar och var det lämpar sig bäst.
T-SQL vs. PostgreSQL (PL/pgSQL)
PostgreSQL använder PL/pgSQL för procedurlogik, liknande T-SQL men med annan syntax och andra styrkor. Tabellen nedan sammanfattar dessa skillnader:
|
Kategori |
T-SQL (SQL Server) |
PostgreSQL (PL/pgSQL) |
|
Procedurspråk |
Inbyggt i T-SQL |
Använder PL/pgSQL |
|
Variabelsyntax |
|
|
|
Variabelnamn |
Använder prefixet |
Inget prefix (t.ex. |
|
Blockstruktur |
Enklare, ofta implicit eller |
Explicit: |
|
Exempelblock |
Standard T-SQL-batch |
Omslutet i |
|
Avancerade datatyper |
Begränsade |
Avancerat inbyggt stöd (JSONB, arrayer, geometriska) |
|
Verktyg och integration |
Tajt integration med SQL Server-verktyg |
Flexibelt över plattformar |
|
Ekosystem |
Optimerat för Windows, Azure, SSMS och Power BI |
Öppen källkod, plattformsoberoende |
Kolla in vår kompetensväg SQL för databashanterare för att lära dig hur du designar relationsdatabaser och strukturerar dina frågor för att förbättra prestandan.
T-SQL vs. MySQL
MySQL stödjer också procedur-SQL, men med ett enklare och mer begränsat angreppssätt. Tabellen nedan jämför syntax- och funktionsskillnaderna mellan dessa två dialekter.
|
Kategori |
T-SQL (Microsoft) |
MySQL |
|
Radbegränsning |
|
|
|
Felhanttering |
Robusta |
Mer begränsad DECLARE HANDLER-syntax |
|
Procedurlogik |
Rik, strukturerad och mycket programmerbar |
Enklare och mer begränsade procedurfunktioner |
|
Analys |
Fönsterfunktioner och CTE:er |
Grundläggande analysfunktioner (förbättras i nyare versioner) |
|
Ekosystem |
Knyten till SQL Server och Enterprise-verktyg |
Lättviktigt; hjärtat i LAMP-stacken (Linux, Apache, etc.) |
|
Bäst för |
Komplex affärslogik och data warehousing |
Webbapplikationer och snabba läsoperationer |
Användningsområden för T-SQL i verkligheten
T-SQL används i stor utsträckning bortom enkla datafrågor. Följande är exempel där jag har funnit det användbart som dataprofessionell.
Rapportfrågor
T-SQL används ofta för att skapa rapporter direkt från databasen. Till exempel kan du aggregera försäljning per region eller ranka toppresterande produkter med hjälp av fönsterfunktioner.
ETL-processer (Extract, Transform, Load)
T-SQL används i datapipelines av dataingenjörer för att förbereda och flytta data. Till exempel kan du extrahera data från mellanlagringstabeller, transformera format, rensa inkonsekvenser och ladda in i slutliga rapporttabeller.
Skript för datarensning
Om din databas har miljontals rader med inkonsekventa adressformat kan du använda ett T-SQL-skript med WHILE-loopar eller CTE:er för att identifiera dubbletter, fylla i saknade värden eller standardisera format.
Backend-logik i applikationer
Många applikationer förlitar sig på T-SQL för att hantera affärslogik inne i databasen. Du kan använda lagrade procedurer för CRUD-operationer, utföra valideringar innan data infogas eller använda transaktionshantering för kritiska operationer.
Vanliga misstag och bästa praxis
Även om T-SQL är användbart för avancerade databasfrågor är det troligt att du stöter på några vanliga problem. Följande är några vanliga misstag jag har stött på när jag använder T-SQL:
-
Överanvändning av loopar istället för mängdbaserad logik: Att använda loopar, som
WHILE, för rad-för-rad-operationer kan sakta ner prestandan. SQL är utformat för att arbeta med datamängder på en gång. -
Bristande indexmedvetenhet: Att inte använda index korrekt kan göra frågor långsamma, särskilt på stora tabeller.
-
Att inte använda transaktioner korrekt: Att köra flera relaterade operationer utan att kapsla in dem i en transaktion kan lämna dina data i ett inkonsekvent tillstånd om något misslyckas halvvägs.
-
Att ignorera felhantering: Om du hoppar över
TRY...CATCH-block blir felsökning svårare och kan göra att skript misslyckas tyst eller oförutsägbart i produktion.
Nedan följer bästa praxis som jag rekommenderar för att hjälpa dig skriva effektivare och mer tillförlitliga frågor:
-
Föredra mängdbaserade frågor: Använd
JOIN,GROUP BYoch fönsterfunktioner i stället för loopar när det är möjligt. Detta ligger i linje med hur SQL Server är utformad för att bearbeta data effektivt. -
Skriv läsbar, underhållbar kod: Använd tydliga namnkonventioner, formatera frågor konsekvent och lägg till kommentarer där det behövs. Detta gör din kod läsbar, lättare att felsöka och samarbeta kring.
-
Testa procedurer: Testa alltid lagrade procedurer och frågor med olika indata för att säkerställa att de fungerar korrekt och hanterar kantfall.
Slutsats
T-SQL utökar standard-SQL genom att lägga till programmeringsmöjligheter, vilket gör det till ett flexibelt och kraftfullt verktyg för automatisering, databehandling och analys. Med funktioner som variabler, lagrade procedurer och felhantering kan du bygga mer dynamiska och effektiva databaslösningar.
Som nästa steg rekommenderar jag att du provar vår Associate Data Analyst i SQL-karriärväg för att bli en skicklig dataanalytiker. Vår kurs Rapportering i SQL hjälper dig också att bli skicklig på att bygga komplexa rapporter. Slutligen bör du skaffa vår SQL Associate-certifiering för att visa din skicklighet i att använda SQL för att lösa affärsproblem och sticka ut bland andra yrkesverksamma.
T-SQL vanliga frågor
Hur skiljer sig T-SQL från standard-SQL?
SQL är främst deklarativt, medan T-SQL kombinerar deklarativa frågor med procedurprogrammering, vilket låter dig styra hur operationer körs.
Behöver jag lära mig SQL innan jag lär mig T-SQL?
Ja, en grundläggande förståelse för SQL är viktig eftersom T-SQL bygger direkt på kärnkoncept i SQL som SELECT, INSERT, UPDATE och DELETE.
Finns T-SQL i alla SQL-dialekter?
Nej, T-SQL är specifikt för Microsofts ekosystem och används främst med Microsoft SQL Server och relaterade verktyg som Azure SQL.
Vad är lagrade procedurer och varför är de användbara?
Lagrade procedurer är återanvändbara block av T-SQL-kod som körs i databasen. De bidrar till att förbättra prestanda, upprätthålla konsekvens och förenkla applikationslogik.
Vad används fönsterfunktioner i T-SQL till?
Fönsterfunktioner används för avancerade analysuppgifter som rankning, löpande summor och att jämföra värden över rader utan att gruppera data.