Sdílet prostřednictvím


VYBRAT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Načte řádky z databáze a povolí výběr jednoho nebo více řádků nebo sloupců z jedné nebo více tabulek v databázovém stroji SQL Serveru. Úplná syntaxe SELECT příkazu je složitá, ale hlavní klauzule lze shrnout následujícím způsobem:

[ S { [ XMLNAMESPACES , ] [ common_table_expression ] } ] ]

VYBERTE select_list [ DO new_table ]

[ OD table_source ] [ KDE search_condition ]

[ SKUPINA OD group_by_expression ]

[ MÍT search_condition ]

[ OKNO window_expression ]

[ ORDER BY order_expression [ ASC | DESC ] ]

Operátory UNION, EXCEPT a INTERSECT lze mezi dotazy použít ke kombinování nebo porovnání výsledků do jedné sady výsledků.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server a 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> ]
[ ; ]

Syntaxe pro Azure Synapse Analytics a paralelní datový sklad a 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

Z důvodu složitosti SELECT příkazu se pro jednotlivé klauzule zobrazují podrobné prvky syntaxe a argumenty:

Pořadí klauzulí v SELECT příkazu je významné. Některou z volitelných klauzulí je možné vynechat, ale pokud se použijí volitelné klauzule, musí se zobrazit v příslušném pořadí.

SELECT příkazy jsou povoleny v uživatelem definovaných funkcích pouze v případě, že výběrové seznamy těchto příkazů obsahují výrazy, které přiřazují hodnoty proměnným, které jsou místním funkcím.

Čtyřdílný název vytvořený funkcí OPENDATASOURCE jako část název serveru lze použít jako zdroj tabulky, kdykoli se název tabulky může v SELECT příkazu objevit. Pro Službu Azure SQL Database není možné zadat název čtyřdílné části.

Některá omezení syntaxe se vztahují na SELECT příkazy, které zahrnují vzdálené tabulky.

Pořadí logického zpracování příkazu SELECT

Následující kroky ukazují pořadí logického zpracování nebo pořadí vazeb pro SELECT příkaz. Toto pořadí určuje, kdy jsou objekty definované v jednom kroku zpřístupněny klauzulemi v dalších krocích. Pokud například procesor dotazů může svázat (přístup) k tabulkám nebo zobrazením definovaným v FROM klauzuli, zpřístupní se tyto objekty a jejich sloupce všem následným krokům. Naopak vzhledem k tomu, že SELECT klauzule je krok 8, není možné odkazovat na aliasy sloupců ani odvozené sloupce definované v této klauzuli. Na tyto klauzule ale můžou odkazovat následující klauzule, jako ORDER BY je klauzule. Procesor dotazů určuje skutečné fyzické spuštění příkazu a pořadí se může lišit od tohoto seznamu.

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

Warning

Existují neobvyklé případy, kdy se předchozí sekvence může lišit. Předpokládejme, že máte v zobrazení clusterovaný index a zobrazení vyloučí některé řádky tabulky a seznam sloupců zobrazení SELECT používá CONVERT datový typ, který změní datový typ z varchar na int. V takovém případě CONVERT se může provést před provedením WHERE klauzule. Často existuje způsob, jak změnit zobrazení, abyste se vyhnuli odlišné sekvenci, pokud je to v případě vašeho případu důležité.

Permissions

Výběr dat vyžaduje SELECT oprávnění k tabulce nebo zobrazení, které může být zděděno z vyššího oboru, například SELECT oprávnění ke schématu nebo CONTROL oprávnění k tabulce. Nebo vyžaduje členství v db_datareader nebo db_owner pevné databázové role nebo pevné role serveru správce systému . Vytvoření nové tabulky pomocí SELECT INTO také vyžaduje CREATE TABLE oprávnění i ALTER SCHEMA oprávnění ke schématu, které vlastní novou tabulku.

Examples

Následující příklady používají databázi AdventureWorksPDW2022 .

A. Použití příkazu SELECT k načtení řádků a sloupců

Tato část ukazuje tři příklady kódu. Tento první příklad kódu vrátí všechny řádky (není zadána klauzule WHERE ) a všechny sloupce (pomocí *) z DimEmployee tabulky.

SELECT *
FROM DimEmployee
ORDER BY LastName;

Tento další příklad s použitím aliasů tabulky k dosažení stejného výsledku.

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

Tento příklad vrátí všechny řádky (není WHERE zadána klauzule) a podmnožinu sloupců (FirstName, LastName) StartDatez DimEmployee tabulky v databázi AdventureWorksPDW2022 . Nadpis třetího sloupce se přejmenuje na FirstDay.

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

Tento příklad vrátí pouze řádky DimEmployee , které mají EndDate ten, který není NULL a MaritalStatus ženatý M (ženatý).

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

B. Použití příkazu SELECT s záhlavími sloupců a výpočty

Následující příklad vrátí všechny řádky z DimEmployee tabulky a vypočítá hrubou mzdu každého zaměstnance na základě jejich BaseRate a 40hodinového pracovního týdne.

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

C. Použití FUNKCE DISTINCT s select

Následující příklad používá DISTINCT k vygenerování seznamu všech jedinečných názvů v DimEmployee tabulce.

SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;

D. Použití FUNKCE GROUP BY

Následující příklad najde celkovou částku pro všechny prodeje každý den.

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

GROUP BY Z důvodu klauzule se pro každý den vrátí jenom jeden řádek obsahující součet všech prodejů.

E. Použití GROUP BY s více skupinami

Následující příklad najde průměrnou cenu a součet internetových prodejů za každý den, seskupený podle data objednávky a klíče propagační akce.

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

F. Použití FUNKCE GROUP BY a WHERE

Následující příklad vloží výsledky do skupin po načtení pouze řádků s daty objednávky pozdější než 1. srpna 2002.

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

G. Použití FUNKCE GROUP BY s výrazem

Následující příklad seskupí podle výrazu. Pokud výraz neobsahuje agregační funkce, můžete ho seskupit podle výrazu.

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

H. Použití GROUP BY s ORDER BY

Následující příklad najde součet prodejů za den a objednávky podle dne.

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

I. Použití klauzule HAVING

Tento dotaz používá klauzuli HAVING k omezení výsledků.

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