FROM(Transact-SQL)
SQL Server 2012에서 DELETE, SELECT, UPDATE 문에 사용되는 테이블, 뷰, 파생된 테이블 문 조인된 테이블을 지정합니다. SELECT 문에서 SELECT 목록에 상수, 변수 및 산술식(열 이름 없이)만 포함되는 경우를 제외하고는 FROM 절이 필요합니다.
구문
[ FROM { <table_source> } [ ,...n ] ]
<table_source> ::=
{
table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ]
[ WITH ( < table_hint > [ [ , ]...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
[ ( bulk_column_alias [ ,...n ] ) ]
| user_defined_function [ [ AS ] table_alias ] ]
| OPENXML <openxml_clause>
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| <joined_table>
| <pivoted_table>
| <unpivoted_table>
| @variable [ [ AS ] table_alias ]
| @variable.function_call ( expression [ ,...n ] ) [ [ AS ] table_alias ] [ (column_alias [ ,...n ] ) ]
}
<tablesample_clause> ::=
TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )
[ REPEATABLE ( repeat_seed ) ]
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
<pivoted_table> ::=
table_source PIVOT <pivot_clause> [ AS ] table_alias
<pivot_clause> ::=
( aggregate_function ( value_column [ [ , ]...n ])
FOR pivot_column
IN ( <column_list> )
)
<unpivoted_table> ::=
table_source UNPIVOT <unpivot_clause> [ AS ] table_alias
<unpivot_clause> ::=
( value_column FOR pivot_column IN ( <column_list> ) )
<column_list> ::=
column_name [ ,...n ]
인수
<table_source>
Transact-SQL 문에서 사용할 테이블, 뷰, 테이블 변수 또는 파생된 테이블 원본을 별칭과 함께 또는 별칭 없이 지정합니다. 사용 가능한 메모리 및 쿼리에 있는 다른 식의 복잡성에 따라 다르지만 최대 256개의 테이블 원본을 문에 사용할 수 있습니다. 개별 쿼리는 최대 256개 테이블 원본을 지원하지 않을 수 있습니다.[!참고]
쿼리에서 많은 수의 테이블을 참조하면 쿼리 성능이 저하될 수 있습니다. 컴파일 및 최적화 시간 역시 다른 요소들의 영향을 받습니다. 이러한 요소에는 각 <table_source>에 대한 인덱스 및 인덱싱된 뷰 존재 여부와 SELECT 문의 <select_list> 크기 등이 있습니다.
FROM 키워드 뒤의 테이블 원본 순서는 반환되는 결과 집합에 영향을 주지 않습니다. SQL Server는 FROM 절에 중복된 이름이 있으면 오류를 반환합니다.
table_or_view_name
테이블 또는 뷰의 이름입니다.테이블 또는 뷰가 동일한 SQL Server 인스턴스의 다른 데이터베이스에 있는 경우에는 database.schema.object_name 형식의 정규화된 이름을 사용합니다.
테이블 또는 뷰가 SQL Server 인스턴스 밖에 있는 경우에는 네 부분으로 구성된 linked_server.catalog.schema.object 형식의 이름을 사용합니다. 자세한 내용은 sp_addlinkedserver(Transact-SQL)를 참조하십시오. 이름을 네 부분으로 구성하여 원격 테이블 원본으로 지정할 경우 OPENDATASOURCE 함수를 사용해서 서버 이름 부분을 구성할 수도 있습니다. OPENDATASOURCE를 지정할 경우 database_name 및 schema_name은 일부 데이터 원본에 적용되지 않을 수 있으며 원격 개체에 액세스하는 OLE DB 공급자 기능의 영향을 받습니다.
[AS] table_alias
table_source의 별칭은 편의를 위해, 또는 자체 조인이나 하위 쿼리에서 테이블이나 뷰를 구별하기 위해 사용합니다. 별칭은 조인 내의 테이블의 특정 열을 지칭하는 데 사용하는 단축 테이블 이름인 경우가 많습니다. 조인의 여러 테이블에 동일한 열 이름이 있는 경우에는 열 이름은 테이블 이름, 뷰 이름 또는 별칭으로 한정되어야 합니다. 별칭이 정의되어 있으면 테이블 이름을 사용할 수 없습니다.파생된 테이블, 행 집합, 테이블 반환 함수 또는 연산자 절(예: PIVOT 또는 UNPIVOT)을 사용할 경우 절 끝 부분에 지정되는 table_alias는 그룹화 열을 포함하여 반환되는 모든 열에 대한 테이블 이름이어야 합니다.
WITH (<table_hint> )
쿼리 최적화 프로그램이 이 테이블과 이 문에 최적화 또는 잠금 전략을 사용하도록 지정합니다. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하십시오.rowset_function
테이블 참조 대신 사용할 수 있는 개체를 반환하는 행 집합 함수 중 하나(예: OPENROWSET)를 지정합니다. 행 집합 함수의 목록은 행 집합 함수(Transact-SQL)를 참조하십시오.OPENROWSET 및 OPENQUERY 함수를 사용하여 원격 개체를 지정하는 것은 개체를 액세스하는 OLE DB 공급자의 기능에 따라 달라집니다.
bulk_column_alias
결과 집합의 열 이름을 대체할 선택적인 별칭입니다. 열의 별칭은 BULK 옵션과 함께 OPENROWSET 함수를 사용하는 SELECT 문에서만 허용됩니다. bulk_column_alias를 사용할 때는 파일의 열 순서와 동일한 순서로 모든 테이블 열에 별칭을 지정하십시오.[!참고]
이 별칭은 XML 서식 파일(있는 경우)의 COLUMN 요소에 있는 NAME 특성보다 우선합니다.
user_defined_function
테이블 반환 함수를 지정합니다.OPENXML <openxml_clause>
XML 문서를 통해 행 집합 뷰를 제공합니다. 자세한 내용은 OPENXML(Transact-SQL)을 참조하십시오.derived_table
데이터베이스의 행을 검색하는 하위 쿼리입니다. derived_table은 외부 쿼리에 대한 입력으로 사용됩니다.derived_table은 Transact-SQL 테이블 값 생성자 기능을 사용하여 여러 행을 지정할 수 있습니다. 예를 들면 SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);와 같습니다. 자세한 내용은 테이블 값 생성자(Transact-SQL)를 참조하십시오.
column_alias
파생된 테이블의 결과 집합에서 열 이름을 대체할 선택적인 별칭입니다. SELECT 목록의 각 열당 한 개의 열 별칭을 포함하고 열 별칭의 전체 목록을 괄호로 묶습니다.<tablesample_clause>
테이블의 데이터 샘플이 반환되도록 지정합니다. 샘플은 근사치일 수 있습니다. 이 절은 SELECT, UPDATE 또는 DELETE 문에서 기본 테이블 또는 조인된 테이블에 사용될 수 있습니다. 뷰를 대상으로 TABLESAMPLE을 지정할 수는 없습니다.[!참고]
SQL Server로 업그레이드된 데이터베이스에 대해 TABLESAMPLE을 사용할 때는 데이터베이스의 호환성 수준을 110 이상으로 설정해야 합니다. PIVOT이 CTE(공통 테이블 식) 쿼리에서 허용되지 않습니다. 자세한 내용은 ALTER DATABASE 호환성 수준(Transact-SQL)을 참조하십시오.
SYSTEM
ISO 표준에 의해 지정된 구현 방식에 따라 달라지는 샘플링 방법입니다. SQL Server에서는 이 방법이 사용 가능한 유일한 샘플링 방법이므로 기본적으로 적용됩니다. SYSTEM은 테이블의 임의 페이지 집합을 샘플로 선택하는 페이지 기반 샘플링 방법을 적용하고 해당 페이지의 모든 행을 샘플 하위 집합으로 반환합니다.sample_number
행의 비율 또는 개수를 나타내는 정확하거나 대략적인 상수 식입니다. PERCENT를 사용해 지정하면 sample_number는 암시적으로 float 값으로 변환되거나 bigint로 변환됩니다. PERCENT는 기본값입니다.PERCENT
테이블 행의 sample_number%를 검색하도록 지정합니다. PERCENT를 지정하면 SQL Server는 지정된 비율에 가장 가까운 결과를 반환합니다. PERCENT를 지정할 경우 sample_number 식의 값은 0부터 100까지여야 합니다.ROWS
대략 sample_number개의 행을 검색하도록 지정합니다. ROWS가 지정되면 SQL Server는 지정된 행 개수에 가장 가까운 결과를 반환합니다. ROWS를 지정할 경우 sample_number 식의 값은 0보다 큰 정수여야 합니다.REPEATABLE
선택된 샘플이 다시 반환될 수 있음을 나타냅니다. 동일한 repeat_seed 값을 사용하여 지정하면 SQL Server는 테이블에 변경된 행이 없는 한 동일한 하위 집합의 행을 반환합니다. 서로 다른 repeat_seed 값을 사용하여 지정하면 SQL Server는 테이블에서 서로 차이가 있는 샘플 행을 반환합니다. 이 경우 테이블을 변경하는 것으로 간주되는 동작으로는 삽입, 업데이트, 삭제, 인덱스 다시 작성 또는 조각 모음 및 데이터베이스 복원 또는 연결이 있습니다.repeat_seed
난수를 생성하기 위해 SQL Server에서 사용하는 상수 식입니다. repeat_seed는 bigint입니다. repeat_seed를 지정하지 않으면 SQL Server는 임의로 값을 할당합니다. 테이블이 변경되지 않는 한 특정 repeat_seed 값에 대한 샘플링 결과는 항상 동일합니다. repeat_seed 식의 값은 0보다 큰 정수여야 합니다.<joined_table>
두 개 이상의 테이블을 곱한 결과 집합입니다. 여러 조인이 있을 경우 괄호를 사용하여 조인의 기본 순서를 바꿀 수 있습니다.<join_type>
조인 작업의 유형을 지정합니다.INNER
일치하는 모든 행의 쌍이 반환되도록 지정합니다. 양 테이블에서 서로 일치하지 않는 행은 제외됩니다. 조인 유형을 지정하지 않는 경우 이것이 기본값입니다.FULL [OUTER]
조인 조건에 맞지 않는 왼쪽 또는 오른쪽 테이블의 행을 결과 집합에 포함시키고 다른 테이블에 해당되는 출력 열을 NULL로 설정하도록 지정합니다. 여기에는 INNER JOIN에서 일반적으로 반환되는 모든 행도 포함됩니다.LEFT [OUTER]
왼쪽 테이블에서 조인 조건에 맞지 않는 모든 행을 결과 집합에 포함시키고 내부 조인에서 반환된 모든 행과 오른쪽 테이블의 출력 열을 NULL로 설정하도록 지정합니다.RIGHT [OUTER]
오른쪽 테이블에서 조인 조건에 맞지 않는 모든 행을 결과 집합에 포함하고 내부 조인에서 반환된 모든 행과 다른 테이블에 해당되는 출력 열을 NULL로 설정하도록 지정합니다.<join_hint>
SQL Server 쿼리 최적화 프로그램이 쿼리의 FROM 절에 지정된 조인당 한 개의 조인 힌트, 즉 실행 알고리즘을 사용하도록 지정합니다. 자세한 내용은 조인 힌트(Transact-SQL)를 참조하십시오.JOIN
지정된 테이블 원본 또는 뷰 간에 지정된 조인 작업이 이루어져야 함을 나타냅니다.ON <search_condition>
조인의 기준이 되는 조건을 지정합니다. 열과 비교 연산자를 주로 사용하지만 조건에서는 모든 조건자를 지정할 수 있습니다. 예를 들어 다음과 같습니다.USE AdventureWorks2012 ; GO SELECT p.ProductID, v.BusinessEntityID FROM Production.Product AS p JOIN Purchasing.ProductVendor AS v ON (p.ProductID = v.ProductID);
조건에 지정된 열은 이름이나 데이터 형식이 동일할 필요는 없습니다. 하지만 데이터 형식이 다를 경우 서로 호환이 가능하거나 SQL Server에서 암시적으로 변환할 수 있는 형식이어야 합니다. 데이터 형식을 암시적으로 변환할 수 없을 경우 조건에서는 CONVERT 함수를 사용하여 데이터 형식을 명시적으로 변환해야 합니다.
ON 절에 단 하나의 조인된 테이블을 수반하는 조건자가 있을 수 있습니다. 또한 쿼리의 WHERE 절에도 이러한 조건자가 있을 수 있습니다. INNER 조인의 경우에는 이러한 조건자가 있어도 아무런 차이가 없지만 OUTER 조인에는 다른 결과가 만들어질 수 있습니다. ON 절의 조건자는 조인 이전의 테이블에 적용되는 반면 WHERE 절은 기능적으로 조인의 결과에 적용되기 때문입니다.
검색 조건과 조건자에 대한 자세한 내용은 검색 조건(Transact-SQL)을 참조하십시오.
CROSS JOIN
두 테이블의 교차곱을 지정합니다. SQL-92 형식이 아닌 이전 형식의 조인에서 WHERE 절이 지정되지 않은 경우와 동일한 행을 반환합니다.left_table_source{ CROSS | OUTER } APPLY right_table_source
right_table_source의 모든 행에 대해 APPLY 연산자의 left_table_source가 계산되도록 지정합니다. 이 기능은 left_table_source의 열 값을 인수의 하나로 가져오는 테이블 반환 함수가 right_table_source에 포함되어 있을 때 유용합니다.CROSS 또는 OUTER를 APPLY와 함께 지정해야 합니다. CROSS를 지정하면 left_table_source의 지정된 행에 대해 right_table_source를 계산할 때 아무 행도 생성되지 않으며 빈 결과 집합을 반환합니다.
OUTER를 지정하면 left_table_source의 각 행에 대해 right_table_source를 계산하여 빈 결과 집합이 반환되더라도 해당 행에 대해 하나의 행이 생성됩니다.
자세한 내용은 주의 섹션을 참조하십시오.
left_table_source
이전 인수에 정의된 테이블 원본입니다. 자세한 내용은 주의 섹션을 참조하십시오.right_table_source
이전 인수에 정의된 테이블 원본입니다. 자세한 내용은 주의 섹션을 참조하십시오.table_source PIVOT <pivot_clause>
pivot_column을 기준으로 table_source를 피벗하도록 지정합니다. table_source는 테이블 또는 테이블 식입니다. pivot_column 및 value_column을 제외한 table_source의 모든 열이 포함된 테이블이 출력됩니다. pivot_column 및 value_column을 제외한 table_source의 열을 PIVOT 연산자의 그룹화 열이라고 합니다.PIVOT은 그룹화 열과 관련해 입력 테이블에서 그룹화 연산을 수행하고 각각의 그룹마다 한 개의 행을 반환합니다. 또한 출력에는 input_table의 pivot_column에 있는 column_list에서 지정한 각 값에 대해 하나의 열이 포함됩니다.
자세한 내용은 다음에 나오는 주의 섹션을 참조하십시오.
aggregate_function
하나 이상의 입력을 받는 시스템 또는 사용자 정의 집계 함수입니다. 집계 함수는 Null 값에 따라 결과가 달라지지 않아야 합니다. Null 값에 영향을 받지 않는 집계 함수는 집계 값을 계산하는 동안 그룹의 Null 값을 계산에 감안하지 않습니다.COUNT(*) 시스템 집계 함수는 허용되지 않습니다.
value_column
PIVOT 연산자의 값 열입니다. UNPIVOT과 함께 사용할 경우 value_column은 입력 table_source의 기존 열 이름이 될 수 없습니다.FOR pivot_column
PIVOT 연산자의 피벗 열입니다. pivot_column은 nvarchar()로 암시적 또는 명시적으로 변환할 수 있는 유형이어야 합니다. 이 열은 image 또는 rowversion일 수 없습니다.UNPIVOT을 사용하는 경우 pivot_column은 table_source에서 좁혀진 출력 열의 이름입니다. table_source에 이 이름을 가진 기존 열이 있으면 안 됩니다.
IN (column_list )
PIVOT 절에서 출력 테이블의 열 이름이 될 pivot_column의 값을 나열합니다. 이 목록에서 피벗되는 입력 table_source에 이미 있는 열 이름을 지정할 수는 없습니다.UNPIVOT 절에서는 하나의 pivot_column으로 좁혀질 table_source의 열을 나열합니다.
table_alias
출력 테이블의 별칭 이름입니다. pivot_table_alias를 지정해야 합니다.UNPIVOT < unpivot_clause >
column_list의 여러 열에서 pivot_column이라는 하나의 열로 입력 테이블이 좁혀지도록 지정합니다.
주의
FROM 절은 조인된 테이블과 파생된 테이블에 대해 SQL-92-SQL 구문을 지원합니다. SQL-92 구문은 INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, CROSS 조인 연산자를 제공합니다.
FROM 절의 UNION과 JOIN은 뷰, 파생된 테이블 및 하위 쿼리에서 지원됩니다.
자체 조인은 자신을 조인하는 테이블을 말합니다. 자체 조인을 기반으로 하는 삽입이나 업데이트 작업은 FROM 절에 지정된 순서를 따릅니다.
SQL Server는 열 배포 통계를 제공하는 연결된 서버에서 배포 통계와 카디널리티 통계를 고려하므로, 조인을 원격에서 수행하기 위해 REMOTE 조인 힌트가 필요하지는 않습니다. SQL Server 쿼리 프로세서는 원격 통계를 고려하여 원격 조인 전략이 적절한지 결정합니다. REMOTE 조인 힌트는 열 배포 통계를 제공하지 않는 공급자에게 유용합니다.
APPLY 사용
APPLY 연산자의 좌우 피연산자는 모두 테이블 식입니다. 이 피연산자 간의 주된 차이점은 right_table_source가 left_table_source의 열을 함수의 인수 중 하나로 사용하는 테이블 반환 함수를 사용할 수 있다는 것입니다. left_table_source는 테이블 반환 함수를 포함할 수 있지만 right_table_source의 열인 인수는 포함할 수 없습니다.
APPLY 연산자는 다음과 같은 방식으로 FROM 절에 지정될 테이블 원본을 생성합니다.
left_table_source의 각 행에 대해 right_table_source를 계산하여 행 집합을 생성합니다.
right_table_source 값은 left_table_source에 따라 달라집니다. right_table_source는 다음과 같이 표현될 수 있습니다. TVF(left_table_source.row)와 같이 표현될 수 있습니다. 여기서 TVF는 테이블 반환 함수입니다.
UNION ALL 연산을 수행하여 right_table_source 계산 시 각 행에 대해 생성된 결과 집합을 left_table_source와 결합합니다.
APPLY 연산자의 결과로 생성된 열 목록은 right_table_source의 열 목록과 결합된 left_table_source의 열 집합입니다.
PIVOT 및 UNPIVOT 사용
pivot_column 및 value_column은 PIVOT 연산자에 사용되는 그룹화 열입니다. PIVOT은 다음과 같은 방식으로 출력 결과 집합을 가져옵니다.
input_table에서 그룹화 열을 기준으로 GROUP BY를 수행해 각 그룹당 한 개의 출력 행을 생성합니다.
출력 행의 그룹화 열은 input_table의 해당 그룹에 대한 열 값을 가져옵니다.
다음 작업을 수행해 각각의 출력 행에 대한 열 목록의 열 값을 생성합니다.
이전 단계에서 GROUP BY를 수행하여 생성된 행을 pivot_column을 기준으로 추가 그룹화합니다.
column_list의 각 출력 열에 대해 조건을 만족하는 하위 그룹을 선택합니다.
pivot_column = CONVERT(<data type of pivot_column>, 'output_column')
이 하위 그룹의 value_column에 대해 aggregate_function이 계산되고 그 결과는 해당하는 output_column의 값으로 반환됩니다. 하위 그룹이 비어 있으면 SQL Server는 해당 output_column의 값으로 Null을 생성합니다. 집계 함수가 COUNT이고 하위 그룹이 비어 있으면 0이 반환됩니다.
사용 권한
DELETE, SELECT 또는 UPDATE 문의 사용 권한이 필요합니다.
예
1.간단한 FROM 절 사용
다음 예에서는 AdventureWorks2012 샘플 데이터베이스에서 SalesTerritory 테이블의 TerritoryID 및 Name을 검색합니다.
USE AdventureWorks2012 ;
GO
SELECT TerritoryID, Name
FROM Sales.SalesTerritory
ORDER BY TerritoryID ;
결과 집합은 다음과 같습니다.
TerritoryID Name
----------- ------------------------------
1 Northwest
2 Northeast
3 Central
4 Southwest
5 Southeast
6 Canada
7 France
8 Germany
9 Australia
10 United Kingdom
(10 row(s) affected)
2.TABLOCK 및 HOLDLOCK 최적화 프로그램 힌트 사용
다음의 부분 트랜잭션은 Employee에 명시적인 공유 테이블 잠금을 설정하고 인덱스를 읽는 방법을 보여 줍니다. 잠금은 전체 트랜잭션 동안 유지됩니다.
USE AdventureWorks2012 ;
GO
BEGIN TRAN
SELECT COUNT(*)
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK) ;
3.SQL-92 CROSS JOIN 구문 사용
다음 예에서는 Employee 및 Department라는 두 테이블의 교차곱을 반환합니다. BusinessEntityID 행과 모든 Department 이름 행의 가능한 모든 조합 목록이 반환됩니다.
USE AdventureWorks2012 ;
GO
SELECT e.BusinessEntityID, d.Name AS Department
FROM HumanResources.Employee AS e
CROSS JOIN HumanResources.Department AS d
ORDER BY e.BusinessEntityID, d.Name ;
4.SQL-92 FULL OUTER JOIN 구문 사용
다음 예에서는 SalesOrderDetail 테이블의 제품 이름 및 해당되는 모든 판매 주문을 반환합니다. 또한 Product 테이블에 나열되어 있는 제품이 없는 모든 판매 주문, 그리고 Product 테이블에 나열된 것 이외의 주문된 모든 제품을 반환합니다.
USE AdventureWorks2012 ;
GO
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product AS p
FULL OUTER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL OR sod.ProductID IS NULL
ORDER BY p.Name ;
5.SQL-92 LEFT OUTER JOIN 구문 사용
다음 예에서는 ProductID로 두 테이블을 조인하고 왼쪽 테이블에서 일치하지 않는 행도 함께 반환합니다. Product 테이블은 ProductID 열에서 각 SalesOrderDetail 테이블과 일치합니다. 모든 제품은 주문 여부에 관계없이 결과 집합에 나타납니다.
USE AdventureWorks2012 ;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product AS p
LEFT OUTER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name ;
6.SQL-92 INNER JOIN 구문 사용
다음 예에서는 모든 제품 이름과 판매 주문 ID를 반환합니다.
USE AdventureWorks2012 ;
GO
-- By default, SQL Server performs an INNER JOIN if only the JOIN
-- keyword is specified.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name ;
7.SQL-92 RIGHT OUTER JOIN 구문 사용
다음 예에서는 TerritoryID로 두 테이블을 조인하고 오른쪽 테이블에서 일치하지 않는 행도 함께 반환합니다. SalesTerritory 테이블은 TerritoryID 열에서 각 SalesPerson 테이블과 일치합니다. 판매 직원에게 담당 구역이 할당되었는지 여부에 관계없이 모든 판매 직원이 결과 집합에 표시됩니다.
USE AdventureWorks2012 ;
GO
SELECT st.Name AS Territory, sp.BusinessEntityID
FROM Sales.SalesTerritory AS st
RIGHT OUTER JOIN Sales.SalesPerson AS sp
ON st.TerritoryID = sp.TerritoryID ;
8.HASH 및 MERGE 조인 힌트 사용
다음 예에서는 Product, ProductVendor 및 Vendor 테이블 간의 3개 테이블 조인을 수행하여 제품 및 제품 공급업체 목록을 생성합니다. 쿼리 최적화 프로그램은 MERGE 조인을 사용하여 Product와 ProductVendor(p와 pv)를 조인합니다. 그런 다음 Product와 ProductVendor(p와 pv)의 MERGE 조인이 Vendor 테이블에 HASH 조인되어 (p와 pv) 및 v를 생성합니다.
중요 |
---|
조인 힌트를 지정한 이후에는 INNER 키워드가 더 이상 선택 사항이 아니며 INNER JOIN을 수행하도록 명시적으로 지정해야 합니다. |
USE AdventureWorks2012 ;
GO
SELECT p.Name AS ProductName, v.Name AS VendorName
FROM Production.Product AS p
INNER MERGE JOIN Purchasing.ProductVendor AS pv
ON p.ProductID = pv.ProductID
INNER HASH JOIN Purchasing.Vendor AS v
ON pv.BusinessEntityID = v.BusinessEntityID
ORDER BY p.Name, v.Name ;
9.파생된 테이블 사용
다음 예에서는 파생된 테이블과 SELECT 문을 FROM 절 다음에 사용하여 모든 직원의 성과 이름, 직원이 거주하는 도시를 반환합니다.
USE AdventureWorks2012 ;
GO
SELECT RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS Name, d.City
FROM Person.Person AS p
INNER JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID
INNER JOIN
(SELECT bea.BusinessEntityID, a.City
FROM Person.Address AS a
INNER JOIN Person.BusinessEntityAddress AS bea
ON a.AddressID = bea.AddressID) AS d
ON p.BusinessEntityID = d.BusinessEntityID
ORDER BY p.LastName, p.FirstName;
10.TABLESAMPLE을 사용하여 테이블의 행 샘플 데이터 읽기
다음 예에서는 FROM 절에 TABLESAMPLE을 사용하여 Customer 테이블에 있는 모든 행 중 대략 10 퍼센트를 반환합니다.
USE AdventureWorks2012 ;
GO
SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM (10 PERCENT) ;
11.APPLY 사용
다음 예에서는 다음 스키마를 가진 테이블이 데이터베이스에 존재하는 것으로 가정합니다.
Departments: DeptID, DivisionID, DeptName, DeptMgrID
EmpMgr: MgrID, EmpID
Employees: EmpID, EmpLastName, EmpFirstName, EmpSalary
또 다른 테이블 반환 함수인 GetReports(MgrID)는 지정된 MgrID에 직접 또는 간접적으로 보고하는 모든 직원의 목록(EmpID, EmpLastName, EmpSalary)을 반환합니다.
이 예에서는 APPLY를 사용하여 모든 부서와 해당 부서의 모든 직원을 반환합니다. 특정 부서에 직원이 한 명도 없으면 해당 부서에 대해서는 행이 반환되지 않습니다.
SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary
FROM Departments d CROSS APPLY dbo.GetReports(d.DeptMgrID) ;
쿼리가 직원이 없는 부서의 행도 생성하도록 하려면 OUTER APPLY를 사용하십시오. 이 때 EmpID, EmpLastName 및 EmpSalary 열에 대해서는 Null 값이 생성됩니다.
SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary
FROM Departments d OUTER APPLY dbo.GetReports(d.DeptMgrID) ;
12.PIVOT 및 UNPIVOT 사용
다음 예에서는 공급업체 ID별로 분류된 직원 ID 164, 198, 223, 231 및 233에 의해 작성된 구매 주문 번호를 반환합니다.
USE AdventureWorks2012;
GO
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5
FROM
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) AS p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [250], [251], [256], [257], [260] )
) AS pvt
ORDER BY VendorID;
다음은 결과 집합의 일부입니다.
VendorID Emp1 Emp2 Emp3 Emp4 Emp5
----------------------------------------------------------------
1 4 3 5 4 4
2 4 1 5 5 5
3 4 3 5 4 4
4 4 2 5 5 4
5 5 1 5 5 5
테이블의 피벗을 해제하기 위해 앞의 예에서 생성된 결과 집합이 pvt에 저장된다고 가정합니다. 쿼리는 다음과 같습니다.
--Create the table and insert values as portrayed in the previous example.
CREATE TABLE dbo.pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO dbo.pvt VALUES
(1,4,3,5,4,4)
,(2,4,1,5,5,5)
,(3,4,3,5,4,4)
,(4,4,2,5,5,4)
,(5,5,1,5,5,5);
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM dbo.pvt) AS p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO
다음은 결과 집합의 일부입니다.
VendorID Employee Orders
------------------------------
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5
13.CROSS APPLY 사용
다음 예제는 sys.dm_exec_cached_plans 동적 관리 뷰를 쿼리하여 캐시에 있는 모든 쿼리 계획의 계획 핸들을 검색함으로써 계획 캐시에 있는 모든 쿼리 계획의 스냅숏을 검색합니다. 그런 다음 sys.dm_exec_query_plan에 계획 핸들을 전달할 CROSS APPLY 연산자를 지정합니다. 계획 캐시에 있는 각 계획의 XML 실행 계획 출력은 현재 반환된 테이블의 query_plan 열에 있습니다.
USE master;
GO
SELECT dbid, object_id, query_plan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);
GO