Dela via


SELECT (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Hämtar rader från databasen och aktiverar valet av en eller flera rader eller kolumner från en eller flera tabeller i SQL Server Database Engine. Den fullständiga syntaxen för -instruktionen SELECT är komplex, men huvudsatserna kan sammanfattas på följande sätt:

[ MED { [ XMLNAMESPACES , ] [ common_table_expression ] } ] ]

VÄLJ select_list [ IN I new_table ]

[ FRÅN table_source ] [ VAR search_condition ]

[ GRUPPERA EFTER group_by_expression ]

[ MED search_condition ]

[ FÖNSTER window_expression ]

[ ORDER BY order_expression [ ASC | DESC ] ] ]

Operatorerna UNION, EXCEPT och INTERSECT kan användas mellan frågor för att kombinera eller jämföra deras resultat med en resultatuppsättning.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server och Azure SQL Database:

<SELECT statement> ::=
    [ WITH { [ XMLNAMESPACES , ] [ <common_table_expression> [ , ...n ] ] } ]
    <query_expression>
    [ ORDER BY <order_by_expression> ]
    [ <FOR Clause> ]
    [ OPTION ( <query_hint> [ , ...n ] ) ]
<query_expression> ::=
    { <query_specification> | ( <query_expression> ) }
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [ ...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
    [ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
    <select_list>
    [ INTO new_table ]
    [ FROM { <table_source> } [ , ...n ] ]
    [ WHERE <search_condition> ]
    [ <GROUP BY> ]
    [ HAVING <search_condition> ]
[ ; ]

Syntax för Azure Synapse Analytics och Parallel Data Warehouse och Microsoft Fabric:

[ WITH <common_table_expression> [ , ...n ] ]
SELECT <select_criteria>
[ ; ]

<select_criteria> ::=
    [ TOP ( top_expression ) ]
    [ ALL | DISTINCT ]
    { * | column_name | expression } [ , ...n ]
    [ FROM { table_source } [ , ...n ] ]
    [ WHERE <search_condition> ]
    [ GROUP BY <group_by_clause> ]
    [ HAVING <search_condition> ]
    [ ORDER BY <order_by_expression> ]
    [ OPTION ( <query_option> [ , ...n ] ) ]

Remarks

På grund av instruktionens SELECT komplexitet visas detaljerade syntaxelement och argument per sats:

Ordningen på satserna i -instruktionen SELECT är betydande. Någon av de valfria satserna kan utelämnas, men när de valfria satserna används måste de visas i rätt ordning.

SELECT -instruktioner tillåts endast i användardefinierade funktioner om de valda listorna för dessa instruktioner innehåller uttryck som tilldelar värden till variabler som är lokala för funktionerna.

Ett namn i fyra delar som konstruerats med OPENDATASOURCE funktionen som servernamnsdel kan användas som tabellkälla varhelst ett tabellnamn kan visas i en SELECT -instruktion. Det går inte att ange ett namn i fyra delar för Azure SQL Database.

Vissa syntaxbegränsningar gäller för SELECT instruktioner som omfattar fjärrtabeller.

Logisk bearbetningsordning för SELECT-instruktionen

Följande steg visar den logiska bearbetningsordningen eller bindningsordningen för en SELECT -instruktion. Den här ordningen avgör när objekten som definierats i ett steg görs tillgängliga för satserna i efterföljande steg. Om frågeprocessorn till exempel kan binda till (komma åt) tabellerna eller vyerna som definierats i FROM -satsen görs dessa objekt och deras kolumner tillgängliga för alla efterföljande steg. Omvänt, eftersom SELECT satsen är steg 8, kan kolumnalias eller härledda kolumner som definierats i den satsen inte refereras till av föregående satser. De kan dock refereras till av efterföljande satser, till exempel ORDER BY satsen. Frågeprocessorn avgör den faktiska fysiska körningen av -instruktionen, och ordningen kan variera från den här listan.

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE eller WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

Warning

Det finns ovanliga fall där den tidigare sekvensen kan skilja sig åt. Anta att du har ett grupperat index i en vy, och vyn exkluderar vissa tabellrader, och vyns SELECT kolumnlista använder en CONVERT som ändrar en datatyp från varchar till int. I den här situationen CONVERT kan köras innan WHERE satsen körs. Ofta finns det ett sätt att ändra vyn för att undvika den olika sekvensen, om det är viktigt i ditt fall.

Permissions

Att välja data kräver SELECT behörighet i tabellen eller vyn, som kan ärvas från ett högre omfång, till exempel SELECT behörighet för schemat eller CONTROL behörigheten i tabellen. Eller kräver medlemskap i db_datareader - eller db_owner fasta databasroller, eller den fasta serverrollen sysadmin . Att skapa en ny tabell med hjälp av SELECT INTO kräver också både behörigheten CREATE TABLE och behörigheten ALTER SCHEMA för schemat som äger den nya tabellen.

Examples

I följande exempel används databasen AdventureWorksPDW2022 .

A. Använd SELECT för att hämta rader och kolumner

Det här avsnittet visar tre kodexempel. Det första kodexemplet returnerar alla rader (ingen WHERE sats har angetts) och alla kolumner (med hjälp av *) från DimEmployee tabellen.

SELECT *
FROM DimEmployee
ORDER BY LastName;

I nästa exempel används tabellalias för att uppnå samma resultat.

SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;

Det här exemplet returnerar alla rader (ingen WHERE sats har angetts) och en delmängd av kolumnerna (FirstName, LastName, StartDate) från DimEmployee tabellen i databasen AdventureWorksPDW2022 . Den tredje kolumnrubriken har bytt namn till FirstDay.

SELECT FirstName,
       LastName,
       StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;

Det här exemplet returnerar endast raderna för DimEmployee som har en EndDate som inte NULL är och en MaritalStatus av M (gift).

SELECT FirstName,
       LastName,
       StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
      AND MaritalStatus = 'M'
ORDER BY LastName;

B. Använda SELECT med kolumnrubriker och beräkningar

Följande exempel returnerar alla rader från DimEmployee tabellen och beräknar bruttolönen för varje anställd baserat på deras BaseRate och en 40-timmars arbetsvecka.

SELECT FirstName,
       LastName,
       BaseRate,
       BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;

C. Använda DISTINCT med SELECT

I följande exempel används DISTINCT för att generera en lista över alla unika rubriker i DimEmployee tabellen.

SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;

D. Använda GROUP BY

I följande exempel hittar du det totala beloppet för all försäljning varje dag.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

På grund av GROUP BY -satsen returneras endast en rad som innehåller summan av all försäljning för varje dag.

E. Använda GROUP BY med flera grupper

I följande exempel hittar du det genomsnittliga priset och summan av Internetförsäljningen för varje dag, grupperat efter orderdatum och kampanjnyckeln.

SELECT OrderDateKey,
       PromotionKey,
       AVG(SalesAmount) AS AvgSales,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;

F. Använda GROUP BY och WHERE

I följande exempel placeras resultatet i grupper efter att endast raderna med orderdatum har hämtats senare än den 1 augusti 2002.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

G. Använda GROUP BY med ett uttryck

I följande exempel grupperas efter ett uttryck. Du kan gruppera efter ett uttryck om uttrycket inte innehåller aggregeringsfunktioner.

SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);

H. Använda GROUP BY med ORDER BY

I följande exempel hittas summan av försäljningen per dag och order per dag.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

I. Använda HAVING-satsen

Den här frågan använder HAVING -satsen för att begränsa resultatet.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;