Megosztás a következőn keresztül:


SELECT (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Lekéri a sorokat az adatbázisból, és lehetővé teszi egy vagy több sor vagy oszlop kiválasztását az SQL Server adatbázismotor egy vagy több táblájából. Az utasítás teljes szintaxisa SELECT összetett, de a fő záradékok a következőképpen foglalhatók össze:

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

VÁLASZD select_list [ BEFELÉ new_table ]

[ A table_source ] [ HOL search_condition ]

[ CSOPORTOS group_by_expression ]

[ EGY search_condition ]

[ ABLAK WINDOW_EXPRESSION ]

[ RENDELÉS order_expression [ ASC | LEÍRÁS ] ]

Az UNION, a EXCEPT és az INTERSECT operátorok a lekérdezések között használhatók az eredmények egyetlen eredményhalmazba való összevonására vagy összehasonlítására.

Transact-SQL szintaxis konvenciók

Syntax

Az SQL Server és az Azure SQL Database szintaxisa:

<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> ]
[ ; ]

Az Azure Synapse Analytics és a párhuzamos adattárház és a Microsoft Fabric szintaxisa:

[ 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

Az utasítás összetettsége miatt záradékonként SELECT részletes szintaxiselemek és argumentumok jelennek meg:

Az utasításban szereplő SELECT záradékok sorrendje jelentős. Az opcionális záradékok bármelyike kihagyható, de a választható záradékok használatakor a megfelelő sorrendben kell megjelenniük.

SELECT az utasítások csak akkor engedélyezettek a felhasználó által definiált függvényekben, ha az utasítások választólistái olyan kifejezéseket tartalmaznak, amelyek értékeket rendelnek a függvényekhez helyi változókhoz.

A kiszolgálónév részként a függvényrel OPENDATASOURCE létrehozott négyrészes név táblaforrásként használható, ahol egy táblanév megjeleníthető egy SELECT utasításban. Az Azure SQL Database-hez nem adható meg négyrészes név.

Bizonyos szintaxiskorlátozások távoli táblákat tartalmazó utasításokra SELECT vonatkoznak.

A SELECT utasítás logikai feldolgozási sorrendje

Az alábbi lépések egy utasítás logikai feldolgozási sorrendjét vagy kötési sorrendjét SELECT mutatják be. Ez a sorrend határozza meg, hogy az egy lépésben definiált objektumok mikor lesznek elérhetők a következő lépések záradékai számára. Ha például a lekérdezésfeldolgozó a záradékban FROM meghatározott táblákhoz vagy nézetekhez tud kapcsolódni (hozzáférni), akkor ezek az objektumok és oszlopaik minden további lépéshez elérhetővé válnak. Ezzel szemben, mivel a záradék a SELECT 8. lépés, a záradékban definiált oszlop-aliasokra vagy származtatott oszlopokra nem lehet hivatkozni az előző záradékokkal. Ezekre azonban hivatkozhatnak további záradékokkal, például a ORDER BY záradékkal. A lekérdezésfeldolgozó határozza meg az utasítás tényleges fizikai végrehajtását, és a sorrend eltérhet a listától.

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

Warning

Ritkán előfordul, hogy az előző sorozat eltérő lehet. Tegyük fel, hogy van egy fürtözött indexe egy nézetben, és a nézet kizár néhány táblázatsort, és a nézet oszloplistája SELECT olyan adattípust CONVERT használ, amely a varcharrólint értékre módosítja az adattípust. Ebben az esetben a CONVERT záradék végrehajtása előtt WHERE végrehajtható. Gyakran van mód arra, hogy módosítsa a nézetet, hogy elkerülje a különböző sorrendet, ha ez számít az Ön esetében.

Permissions

Az adatok kiválasztásához engedélyre van szükség SELECT a táblában vagy a nézetben, amely egy magasabb hatókörből örökölhető, például SELECT a sémára vagy CONTROL a tábla engedélyére. Vagy tagságot igényel a db_datareader vagy db_owner rögzített adatbázis-szerepkörökben, vagy a sysadmin rögzített kiszolgálói szerepkörben. Az új tábla létrehozásához SELECT INTO az CREATE TABLE engedély és az ALTER SCHEMA új táblát birtokló séma engedélye is szükséges.

Examples

Az alábbi példák az AdventureWorksPDW2022 adatbázist használják.

A. Sorok és oszlopok lekérése a SELECT használatával

Ez a szakasz három példakódot mutat be. Ez az első példakód az összes sort visszaadja (nincs WHERE megadva záradék), és a tábla összes oszlopát (a *használatával).DimEmployee

SELECT *
FROM DimEmployee
ORDER BY LastName;

Ez a következő példa táblaaliasítást használ ugyanahhoz az eredményhez.

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

Ez a példa az WHERE adatbázis táblájának FirstName összes sorát (nincs LastName megadva záradék) és az oszlopok (StartDate, DimEmployee, ) egy részhalmazát adja vissza. A harmadik oszlopfejléc átnevezve a következőre FirstDay: .

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

Ez a példa csak azokat a sorokat adja vissza, amelyek nem DimEmployeeEndDateNULL és a (házas) sorokkal MaritalStatus rendelkeznek.M

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

B. A SELECT használata oszlopfejlécekkel és számításokkal

Az alábbi példa a DimEmployee táblázat összes sorát visszaadja, és kiszámítja az egyes alkalmazottak bruttó bérét a 40 órás munkahét alapján BaseRate .

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

C. A DISTINCT használata a SELECT használatával

Az alábbi példa a tábla összes egyedi címének DISTINCT listáját hozza DimEmployee létre.

SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;

D. A GROUP BY használata

Az alábbi példa az egyes napok összes értékesítésének teljes összegét keresi meg.

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

A záradék miatt minden GROUP BY nap csak egy, az összes értékesítés összegét tartalmazó sort ad vissza a rendszer.

E. A GROUP BY használata több csoporttal

Az alábbi példa az egyes napok átlagos árát és internetes értékesítéseinek összegét keresi meg a rendelés dátuma és az előléptetési kulcs szerint csoportosítva.

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

F. A GROUP BY és a WHERE használata

Az alábbi példa az eredményeket csoportokba helyezi, miután csak a 2002.

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

G. A GROUP BY használata kifejezéssel

Az alábbi példa egy kifejezés szerint csoportosítja a csoportokat. Ha a kifejezés nem tartalmaz összesítő függvényeket, kifejezés szerint csoportosíthat.

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

H. A GROUP BY és az ORDER BY használata

Az alábbi példa az értékesítések napi összegét, a rendeléseket pedig a nap szerint határozza meg.

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

I. A HAVING záradék használata

Ez a lekérdezés a HAVING záradék használatával korlátozza az eredményeket.

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