SELECT (Transact-SQL)
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
데이터베이스에서 행을 검색하고 SQL Server 데이터베이스 엔진 하나 이상의 테이블에서 하나 이상의 행 또는 열을 선택할 수 있습니다. 문의 전체 구문 SELECT
은 복잡하지만 주 절은 다음과 같이 요약할 수 있습니다.
[ WITH { [ XMLNAMESPACES , ] [ common_table_expression ] } ]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ORDER BY order_expression [ ASC | DESC ]]
UNION, EXCEPT 및 INTERSECT 연산자를 쿼리 간에 사용하여 결과를 하나의 결과 집합으로 결합하거나 비교할 수 있습니다.
구문
SQL Server 및 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> ]
[ ; ]
Azure Synapse Analytics 및 병렬 데이터 웨어하우스 및 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 ] ) ]
설명
문의 복잡성 SELECT
으로 인해 절당 자세한 구문 요소와 인수가 표시됩니다.
- WITH XMLNAMESPACES
- HAVING
- WITH common_table_expression
- UNION
- SELECT 절
- EXCEPT 및 INTERSECT
- INTO 절
- ORDER BY
- FROM
- FOR 절
- WHERE
- OPTION 절
- GROUP BY
문에 있는 SELECT
절의 순서는 중요합니다. 선택 사항인 절은 생략할 수 있지만 이러한 절을 사용할 때는 적절한 순서로 표시해야 합니다.
SELECT
문은 이러한 문의 선택 목록에 함수에 로컬인 변수에 값을 할당하는 식을 포함하는 경우에만 사용자 정의 함수에서 허용됩니다.
서버 이름 부분으로 함수를 사용하여 OPENDATASOURCE
생성된 네 부분으로 구성된 이름은 문에 SELECT
테이블 이름이 표시될 수 있는 모든 곳에서 테이블 원본으로 사용할 수 있습니다. Azure SQL Database의 경우 네 부분으로 된 이름을 지정할 수 없습니다.
일부 구문 제한은 원격 테이블을 포함하는 문에 적용됩니다 SELECT
.
SELECT 문의 논리적 처리 순서
다음 단계에서는 문의 논리적 처리 순서 또는 바인딩 순서를 SELECT
보여 둡니다. 이 순서에 따라 특정 단계에서 정의한 개체를 후속 단계의 절에 사용할 수 있는 시기가 결정됩니다. 예를 들어 쿼리 프로세서가 절에 정의된 테이블 또는 뷰에 FROM
바인딩(액세스)할 수 있는 경우 이러한 개체와 해당 열은 모든 후속 단계에서 사용할 수 있습니다. 반대로 SELECT
절이 8단계이므로 해당 절에 정의된 열 별칭 또는 파생 열은 이전 절에서 참조할 수 없습니다. 그러나 절과 같은 ORDER BY
후속 절에서 참조할 수 있습니다. 쿼리 프로세서는 문의 실제 실제 실행을 결정하며 순서는 이 목록과 다를 수 있습니다.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
또는WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Warning
이전 시퀀스가 다를 수 있는 드문 경우가 있습니다. 뷰에 클러스터형 인덱스가 있고 뷰가 일부 테이블 행을 제외하고 뷰의 SELECT
열 목록에서 varchar에서 int로 데이터 형식을 변경하는 것을 사용 CONVERT
한다고 가정합니다. 이 경우 절이 실행되기 CONVERT
전에 WHERE
실행할 수 있습니다. 경우에 따라 다른 시퀀스를 방지하도록 보기를 수정하는 방법이 있는 경우가 많습니다.
사용 권한
데이터를 선택하려면 테이블 또는 뷰에 대한 사용 권한이 필요하며SELECT
, 스키마에 대한 사용 권한 또는 CONTROL
테이블에 대한 사용 권한과 같은 SELECT
상위 범위에서 상속될 수 있습니다. 또는 db_datareader 또는 db_owner 고정 데이터베이스 역할이거나 sysadmin 고정 서버 역할의 멤버 자격이 필요합니다. 또한 새 테이블을 사용하여 SELECT INTO
만들려면 새 테이블을 소유하는 스키마에 대한 권한과 ALTER SCHEMA
권한이 모두 CREATE TABLE
필요합니다.
예제
다음 예에서는 AdventureWorksPDW2022 데이터베이스를 사용합니다.
A. SELECT를 사용하여 행 및 열 검색
이 섹션에서는 세 가지 코드 예를 보여 줍니다. 이 첫 번째 코드 예제에서는 테이블에서 모든 행(절이 지정되지 않음WHERE
)과 모든 열(사용)을 *
DimEmployee
반환합니다.
SELECT *
FROM DimEmployee
ORDER BY LastName;
이 다음 예제에서는 테이블 별칭을 사용하여 같은 결과를 냅니다.
SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;
다음은 AdventureWorksPDW2022 데이터베이스의 테이블에서 모든 행(절이 지정되지 않음WHERE
)과 열의 하위 집합(FirstName
, LastName
, StartDate
)DimEmployee
을 반환하는 예제입니다. 세 번째 열 머리글 이름이 FirstDay
로 변경됩니다.
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
이 예제에서는 없는 행과 DimEmployee
M
EndDate
MaritalStatus
결혼하지 않은 NULL
행만 반환합니다.
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
AND MaritalStatus = 'M'
ORDER BY LastName;
B. SELECT에 열 머리글 및 계산 사용
다음 예제에서는 DimEmployee
테이블의 모든 행을 반환하며 BaseRate
및 40시간 근무 주를 기준으로 각 직원의 총 급여를 계산합니다.
SELECT FirstName,
LastName,
BaseRate,
BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;
C. SELECT에 DISTINCT 사용
다음 예제에서는 DISTINCT
를 사용하여 DimEmployee
테이블의 모든 고유한 이름 목록을 생성합니다.
SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;
D. GROUP BY 사용
다음 예제에서는 일별 총 판매액을 모두 찾습니다.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
GROUP BY
절을 사용했으므로 각 날짜에 대해 모든 판매의 합계를 포함하는 한 행만 반환됩니다.
E. GROUP BY에 여러 그룹 사용
다음 예제에서는 주문일과 프로모션 키별로 그룹화된 일별 총 인터넷 판매 합계와 평균 금액을 찾습니다.
SELECT OrderDateKey,
PromotionKey,
AVG(SalesAmount) AS AvgSales,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;
F. GROUP BY 및 WHERE 사용
다음 예에서는 가격이 주문일이 2002년 8월 1일 이후인 행만 검색한 후 그 결과를 그룹화합니다.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
G. GROUP BY에 식 사용
다음 예에서는 식으로 그룹화를 수행합니다. 식에 집계 함수가 포함되지 않은 경우 식별로 그룹화할 수 있습니다.
SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);
H. GROUP BY 및 ORDER BY 사용
다음 예제에서는 일별 판매 합계와 일별 주문을 찾습니다.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
9\. HAVING 절 사용
이 쿼리에서는 HAVING
절을 사용하여 결과를 제한합니다.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;