Share via


SELECT 문의 구성

SELECT 문의 전체 구문은 복잡하지만 주요 절은 다음과 같이 요약할 수 있습니다.

SELECT select_list

[ INTO new_table_name ]

FROM table_list

[ WHERE search_conditions ]

[ GROUP BY group_by_list ]

[ HAVING search_conditions ]

[ ORDER BY order_list [ ASC | DESC ] ]

select_list

결과 집합의 열을 설명하는 쉼표로 구분된 식 목록입니다. 각 식은 결과 집합 열 데이터의 형식(데이터 형식 및 크기)과 원본을 정의합니다. 각 SELECT 목록 식은 데이터를 가져올 원본 테이블이나 뷰에 있는 열의 참조이지만 상수나 Transact-SQL 함수와 같은 다른 식이 될 수도 있습니다. SELECT 목록에서 * 식을 사용하면 원본 테이블의 모든 열이 반환되도록 지정됩니다.

INTO new_table_name

결과 집합이 새 테이블을 만드는 데 사용되도록 지정합니다. new_table_name은 새 테이블의 이름을 지정합니다.

FROM table_list

결과 집합 데이터를 가져올 테이블의 목록이 포함됩니다. 원본 테이블에는 다음과 같은 테이블이 포함됩니다.

  • SQL Server 2005 를 실행 중인 로컬 서버의 테이블을 기반으로 합니다.
  • SQL Server 의 로컬 인스턴스에 있는 뷰입니다. SQL Server 는 내부적으로 뷰를 구성하는 기본 테이블에 대한 참조로 뷰 참조를 확인합니다.
  • 연결된 테이블입니다. SQL Server 에서 액세스할 수 있는 OLE DB 데이터 원본의 테이블입니다. 이것을 분산 쿼리라고 합니다. OLE DB 데이터 원본은 연결된 서버로 연결하거나 OPENROWSET 또는 OPENQUERY 함수에서 데이터 원본을 참조하여 SQL Server 에서 액세스할 수 있습니다.

FROM 절에는 조인 사양이 포함되어 있을 수 있습니다. 이러한 사양은 특정 경로 SQL Server 가 테이블 간의 탐색에 사용되도록 정의합니다.

FROM 절을 DELETE 및 UPDATE 문에서 사용하여 수정된 테이블을 정의할 수도 있습니다.

WHERE search_conditions

WHERE 절은 원본 테이블의 각 행이 SELECT에 적합하도록 만족시켜야 할 조건을 정의하는 필터입니다. 이러한 조건을 만족시키는 행만 결과 집합에 데이터를 추가합니다. 조건을 만족시키지 않는 행의 데이터는 사용되지 않습니다.

WHERE 절을 DELETE 및 UPDATE 문에서 사용하여 수정된 대상 테이블의 행을 정의할 수도 있습니다.

GROUP BY group_by_list

GROUP BY 절은 group_by_list 열의 값을 기준으로 결과 집합을 그룹으로 분할합니다. 예를 들어 AdventureWorksSales.SalesOrderHeader 테이블에는 TerritoryID에 10개의 값이 있습니다. GROUP BY TerritoryID 절은 결과 집합을 TerritoryID의 각 값에 대해 하나씩 10개의 그룹으로 분할합니다.

HAVING search_conditions

HAVING 절은 결과 집합에 적용되는 추가 필터입니다. 논리적으로 HAVING 절은 SELECT 문에 FROM, WHERE 또는 GROUP BY 절을 적용하여 구축된 중간 결과 집합에서 행을 필터링합니다. HAVING 절 앞에 반드시 GROUP BY 절을 사용해야 하는 것은 아니지만 HAVING 절은 대개 GROUP BY 절과 함께 사용됩니다.

ORDER BY order_list[ ASC | DESC ]

ORDER BY 절은 결과 집합의 행이 정렬되는 순서를 정의합니다. order_list는 정렬 목록을 구성하는 결과 집합 열을 지정합니다. ASC 및 DESC 키워드는 행의 오름차순 또는 내림차순 정렬 여부를 지정할 때 사용됩니다.

ORDER BY를 지정하지 않으면 결과 집합의 행에 시퀀스를 지정할 수 없으므로 ORDER BY는 중요합니다. 결과 집합의 행 순서가 중요한 모든 SELECT 문에서 ORDER BY를 사용해야 합니다.

SELECT 문의 절은 적합한 순서로 지정해야 합니다.

데이터베이스 개체에 대한 참조는 분명해야 합니다. 다음과 같은 이유로 모호해질 수 있습니다.

  • 시스템에 같은 이름을 가진 개체가 여러 개 있을 수 있습니다. 예를 들어 Schema1Schema2에 모두 TableX라는 이름의 테이블이 있을 수 있습니다. 이름이 모호하지 않도록 하고 Schema1이 소유한 TableX를 지정하려면 테이블 이름을 스키마 이름으로 한정합니다.

    SELECT *
    FROM Schema1.TableX
    
  • SELECT 문이 실행될 때 개체가 있는 데이터베이스가 현재 데이터베이스가 아닐 수도 있습니다. 현재 데이터베이스 설정에 관계없이 항상 올바른 개체가 사용되게 하려면 개체 이름을 데이터베이스와 스키마로 한정합니다.

    SELECT *
    FROM AdventureWorks.Purchasing.ShipMethod
    
  • FROM 절에 지정된 테이블과 뷰는 중복된 열 이름을 가질 수 있습니다. 외래 키는 종종 기본 키와 동일한 열 이름을 갖게 됩니다. 중복된 이름이 서로 모호하지 않도록 하려면 열 이름을 테이블이나 뷰 이름으로 한정해야 합니다.

    SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
    FROM Sales.Customer JOIN Sales.Store ON
           ( Sales.Customer.CustomerID = Sales.Store.CustomerID)
    WHERE Sales.Customer.TerritoryID = 1
    

    테이블 이름과 뷰 이름을 모두 정규화해야 할 경우 구문이 복잡해집니다. FROM 절에서 AS 키워드를 사용하여 테이블에 상관 관계 이름(범위 변수 또는 별칭이라고 함)을 할당하면 이 문제를 해결할 수 있습니다. 정규화된 테이블 이름이나 뷰 이름은 FROM 절에만 지정하고 다른 모든 테이블이나 뷰 참조는 상관 관계 이름을 사용할 수 있습니다. 위의 예제에 상관 관계 이름을 적용하고 테이블을 정규화하면 다음과 같은 SELECT 문이 작성됩니다.

    SELECT DISTINCT c.CustomerID, s.Name
    FROM Sales.Customer AS c
       JOIN
         Sales.Store AS s
       ON ( c.CustomerID = s.CustomerID)
    WHERE c.TerritoryID = 1
    

개체 이름 자격에 대한 자세한 내용은 식별자를 참조하십시오.

SQL Server 온라인 설명서에서 많은 Transact-SQL 예는 정규화된 이름을 사용하지 않고 단순화되었습니다. 예에서는 읽기 쉽게 하기 위해 이러한 요소를 생략했지만 생산 시스템의 Transact-SQL 문에서는 정규화된 이름을 사용하는 것이 좋습니다.

참고 항목

관련 자료

식(Transact-SQL)
SELECT(Transact-SQL)
IDENTITY(속성)(Transact-SQL)

도움말 및 정보

SQL Server 2005 지원 받기