Delen via


SELECT (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Haalt rijen op uit de database en maakt het mogelijk om een of meer rijen of kolommen te selecteren uit een of meer tabellen in de SQL Server Database Engine. De volledige syntaxis van de SELECT instructie is complex, maar de belangrijkste componenten kunnen als volgt worden samengevat:

[ WITH { [ XMLNAMESPACES , ] [ common_table_expression ] } ]

SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ]

[ HAVING search_condition ]

[ VENSTER window_expression ]

[ ORDER BY order_expression [ ASC | DESC ] ]

De operators UNION, EXCEPT en INTERSECT kunnen worden gebruikt tussen query's om hun resultaten te combineren of te vergelijken in één resultatenset.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor SQL Server en 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> ]
[ ; ]

Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse en 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

Vanwege de complexiteit van de SELECT instructie worden gedetailleerde syntaxiselementen en argumenten per component weergegeven:

De volgorde van de componenten in de SELECT instructie is belangrijk. Een van de optionele componenten kan worden weggelaten, maar wanneer de optionele componenten worden gebruikt, moeten ze in de juiste volgorde worden weergegeven.

SELECT instructies zijn alleen toegestaan in door de gebruiker gedefinieerde functies als de selectielijsten van deze instructies expressies bevatten die waarden toewijzen aan variabelen die lokaal zijn voor de functies.

Een vierdelige naam die is samengesteld met de OPENDATASOURCE functie als het servernaamonderdeel kan worden gebruikt als een tabelbron, waar een tabelnaam ook in een SELECT instructie kan worden weergegeven. Een vierdelige naam kan niet worden opgegeven voor Azure SQL Database.

Sommige syntaxisbeperkingen zijn van toepassing op SELECT instructies die betrekking hebben op externe tabellen.

Volgorde van logische verwerking van de SELECT-instructie

In de volgende stappen ziet u de logische verwerkingsvolgorde of bindingsvolgorde voor een SELECT instructie. Deze volgorde bepaalt wanneer de objecten die in één stap zijn gedefinieerd, beschikbaar worden gesteld aan de componenten in de volgende stappen. Als de queryprocessor bijvoorbeeld kan binden aan (access) de tabellen of weergaven die in de FROM component zijn gedefinieerd, worden deze objecten en de bijbehorende kolommen beschikbaar gesteld voor alle volgende stappen. Daarentegen, omdat de SELECT component stap 8 is, kunnen eventuele kolomaliassen of afgeleide kolommen die in die component zijn gedefinieerd, niet worden verwezen door voorgaande componenten. Er kan echter naar worden verwezen door volgende componenten, zoals de ORDER BY component. De queryprocessor bepaalt de werkelijke fysieke uitvoering van de instructie en de volgorde kan afwijken van deze lijst.

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

Warning

Er zijn ongebruikelijke gevallen waarin de vorige reeks kan verschillen. Stel dat u een geclusterde index in een weergave hebt en dat de weergave enkele tabelrijen uitsluit en de kolomlijst van SELECT de weergave een CONVERT gegevenstype wijzigt van varchar in int. In deze situatie kan de CONVERT component worden uitgevoerd voordat de WHERE component wordt uitgevoerd. Vaak is er een manier om uw weergave te wijzigen om de verschillende volgorde te voorkomen, als dit in uw geval van belang is.

Permissions

Voor het selecteren van gegevens is een machtiging vereist SELECT voor de tabel of weergave, die kan worden overgenomen van een hoger bereik, zoals SELECT machtigingen voor het schema of CONTROL de machtiging voor de tabel. Of vereist lidmaatschap van de db_datareader of db_owner vaste databaserollen of de vaste serverfunctie sysadmin . Voor het maken van een nieuwe tabel is SELECT INTO ook zowel de CREATE TABLE machtiging als de ALTER SCHEMA machtiging vereist voor het schema dat eigenaar is van de nieuwe tabel.

Examples

In de volgende voorbeelden wordt de database AdventureWorksPDW2022 gebruikt.

A. SELECT gebruiken om rijen en kolommen op te halen

In deze sectie ziet u drie codevoorbeelden. Dit eerste codevoorbeeld retourneert alle rijen (geen WHERE component is opgegeven) en alle kolommen (met behulp van de *) uit de DimEmployee tabel.

SELECT *
FROM DimEmployee
ORDER BY LastName;

In dit volgende voorbeeld wordt tabelalias gebruikt om hetzelfde resultaat te bereiken.

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

In dit voorbeeld worden alle rijen (geen WHERE component opgegeven) en een subset van de kolommen (FirstName, LastName, StartDate) uit de DimEmployee tabel in de database AdventureWorksPDW2022 geretourneerd. De naam van de derde kolomkop wordt gewijzigd in FirstDay.

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

In dit voorbeeld worden alleen de rijen DimEmployee geretourneerd waarvoor een EndDate niet NULL en een MaritalStatus van M (getrouwd) is.

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

B. SELECT gebruiken met kolomkoppen en berekeningen

In het volgende voorbeeld worden alle rijen uit de DimEmployee tabel geretourneerd en wordt de brutoloon voor elke werknemer berekend op basis van hun BaseRate en een werkweek van 40 uur.

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

C. DISTINCT gebruiken met SELECT

In het volgende voorbeeld wordt een DISTINCT lijst met alle unieke titels in de DimEmployee tabel gegenereerd.

SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;

D. GROUP BY gebruiken

In het volgende voorbeeld wordt het totale bedrag voor alle verkopen per dag gevonden.

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

Vanwege de GROUP BY component wordt slechts één rij met de som van alle verkopen voor elke dag geretourneerd.

E. GROUP BY gebruiken met meerdere groepen

In het volgende voorbeeld vindt u de gemiddelde prijs en de som van de internetverkopen voor elke dag, gegroepeerd op orderdatum en de promotiesleutel.

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

F. GROUP BY en WHERE gebruiken

In het volgende voorbeeld worden de resultaten in groepen geplaatst na het ophalen van alleen de rijen met orderdatums later dan 1 augustus 2002.

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

G. GROUP BY gebruiken met een expressie

In het volgende voorbeeld wordt gegroepeerd op een expressie. U kunt groeperen op een expressie als de expressie geen statistische functies bevat.

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

H. GROUP BY gebruiken met ORDER BY

In het volgende voorbeeld wordt de som van de verkoop per dag en orders per dag gevonden.

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

I. De HAVING-component gebruiken

Deze query maakt gebruik van de HAVING component om de resultaten te beperken.

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