Udostępnij za pośrednictwem


SELECT (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)

Pobiera wiersze z bazy danych i umożliwia wybór jednego lub wielu wierszy lub kolumn z jednej lub wielu tabel w a aparatu bazy danych programu SQL Server. Pełna składnia SELECT instrukcji jest złożona, ale główne klauzule można podsumować w następujący sposób:

[ Z { [ XMLNAMESPACES , ] [ common_table_expression ] } ]

SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ GDZIE search_condition ]

[ GRUPUJ WEDŁUG group_by_expression ]

[ POSIADANIE search_condition ]

[ WINDOW_EXPRESSION OKNA ]

[ ORDER BY order_expression [ ASC | DESC ] ]

Operatory UNION, EXCEPT i INTERSECT mogą służyć między zapytaniami w celu łączenia lub porównywania wyników z jednym zestawem wyników.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server i usługi 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> ]
[ ; ]

Składnia dla usług Azure Synapse Analytics i Parallel Data Warehouse i 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

Ze względu na złożoność SELECT instrukcji, szczegółowe elementy składni i argumenty są wyświetlane na klauzulę:

Kolejność klauzul w instrukcji SELECT jest znacząca. Można pominąć jedną z klauzul opcjonalnych, ale gdy są używane klauzule opcjonalne, muszą one być wyświetlane w odpowiedniej kolejności.

SELECT instrukcje są dozwolone w funkcjach zdefiniowanych przez użytkownika tylko wtedy, gdy listy select tych instrukcji zawierają wyrażenia, które przypisują wartości do zmiennych lokalnych do funkcji.

Czteroczęściowa nazwa skonstruowana z funkcją OPENDATASOURCE jako część nazwa-serwera może być używana jako źródło tabeli, gdzie niezależnie od nazwy tabeli może być wyświetlana SELECT w instrukcji . Nie można określić nazwy czteroczęściowej dla usługi Azure SQL Database.

Niektóre ograniczenia składni dotyczą SELECT instrukcji obejmujących tabele zdalne.

Kolejność przetwarzania logicznego instrukcji SELECT

Poniższe kroki pokazują kolejność przetwarzania logicznego lub kolejność powiązania dla instrukcji SELECT . Ta kolejność określa, kiedy obiekty zdefiniowane w jednym kroku są udostępniane klauzulom w kolejnych krokach. Jeśli na przykład procesor zapytań może powiązać (uzyskać dostęp) do tabel lub widoków zdefiniowanych w FROM klauzuli, te obiekty i ich kolumny są udostępniane wszystkim kolejnym krokom. Z drugiej strony, ponieważ klauzula SELECT jest krokiem 8, nie można odwoływać się do wszystkich aliasów kolumn lub kolumn pochodnych zdefiniowanych w tej klauzuli przez powyższe klauzule. Można jednak odwoływać się do nich przy użyciu kolejnych klauzul, takich jak klauzula ORDER BY . Procesor zapytań określa rzeczywiste fizyczne wykonanie instrukcji, a kolejność może się różnić od tej listy.

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

Warning

Istnieją rzadkie przypadki, w których poprzednia sekwencja może się różnić. Załóżmy, że masz indeks klastrowany w widoku, a widok wyklucza niektóre wiersze tabeli, a lista kolumn widoku SELECT używa elementu , który zmienia CONVERT typ danych z varchar na int. W takiej sytuacji CONVERT parametr może zostać wykonany przed wykonaniem klauzuli WHERE . Często istnieje sposób modyfikowania widoku, aby uniknąć innej sekwencji, jeśli ma to znaczenie w Twoim przypadku.

Permissions

Wybranie danych wymaga SELECT uprawnień do tabeli lub widoku, które mogą być dziedziczone z wyższego zakresu, takiego jak SELECT uprawnienie do schematu lub CONTROL uprawnienia w tabeli. Lub wymaga członkostwa w db_datareader lub db_owner stałych ról bazy danych lub stałej roli serwera sysadmin . Utworzenie nowej tabeli przy użyciu SELECT INTO również wymaga CREATE TABLE uprawnień oraz ALTER SCHEMA uprawnienia do schematu, który jest właścicielem nowej tabeli.

Examples

W poniższych przykładach użyto bazy danych AdventureWorksPDW2022 .

A. Użyj polecenia SELECT, aby pobrać wiersze i kolumny

W tej sekcji przedstawiono trzy przykłady kodu. Ten pierwszy przykład kodu zwraca wszystkie wiersze (nie WHERE określono klauzuli) i wszystkie kolumny (przy użyciu *elementu ) z DimEmployee tabeli.

SELECT *
FROM DimEmployee
ORDER BY LastName;

W następnym przykładzie użyjemy aliasu tabeli, aby uzyskać ten sam wynik.

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

Ten przykład zwraca wszystkie wiersze (nie WHERE określono klauzuli) i podzbiór kolumn (FirstName, LastName, StartDate) z DimEmployee tabeli w bazie danych AdventureWorksPDW2022 . Nazwa trzeciego nagłówka kolumny została zmieniona na FirstDay.

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

W tym przykładzie zwracane są tylko wiersze, dla DimEmployee których element ma EndDate wartość nie NULL i wartość MaritalStatusM (żonaty).

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

B. Używanie funkcji SELECT z nagłówkami i obliczeniami kolumn

Poniższy przykład zwraca wszystkie wiersze z DimEmployee tabeli i oblicza wynagrodzenie brutto dla każdego pracownika na podstawie ich BaseRate i 40-godzinnego tygodnia roboczego.

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

C. Używanie funkcji DISTINCT z funkcją SELECT

W poniższym przykładzie użyto DISTINCT metody do wygenerowania listy wszystkich unikatowych tytułów w DimEmployee tabeli.

SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;

D. Używanie funkcji GROUP BY

Poniższy przykład znajduje łączną kwotę dla wszystkich sprzedaży każdego dnia.

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

Ze względu na klauzulę GROUP BY zwracany jest tylko jeden wiersz zawierający sumę wszystkich sprzedaży każdego dnia.

E. Używanie funkcji GROUP BY z wieloma grupami

W poniższym przykładzie znajduje się średnia cena i suma sprzedaży internetowej dla każdego dnia, pogrupowana według daty zamówienia i klucza promocji.

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

F. Używanie funkcji GROUP BY i WHERE

Poniższy przykład umieszcza wyniki w grupach po pobraniu tylko wierszy z datami zamówienia później niż 1 sierpnia 2002 r.

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

G. Używanie funkcji GROUP BY z wyrażeniem

Poniższe przykładowe grupy według wyrażenia. Możesz grupować według wyrażenia, jeśli wyrażenie nie zawiera funkcji agregujących.

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

H. Używanie funkcji GROUP BY z usługą ORDER BY

W poniższym przykładzie znajduje się suma sprzedaży dziennie i zamówienia według dnia.

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

I. Używanie klauzuli HAVING

To zapytanie używa klauzuli , HAVING aby ograniczyć wyniki.

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