Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 



FROM 절

일반
설명

FROM 절은 질의에서 데이터를 조회하고자 하는 테이블을 지정한다. 어떤 테이블도 참조되지 않는 경우에는 FROM 절을 생략할 수도 있다. 조회할 수 있는 경로는 다음과 같다.

  • 개별 테이블
  • 부질의
  • 유도 테이블
구문

SELECT [ <qualifier> ] <select_expressions>

                          [ FROM <table_specification> [ {, <table specification>

| <join table specification> }... ]]

 

 

<select_expressions> ::= * | <expression_comma_list> | *, <expression_comma_list>

 

<table_specification> ::=

 <single_table_spec> [ <correlation> ] [ WITH (lock_hint) ] |

 <metaclass_specification> [ <correlation> ] |

 <subquery> <correlation> |

 TABLE ( <expression> ) <correlation>

 

<correlation> ::= [ AS ] <identifier> [ ( <identifier_comma_list> ) ]

 

<single_table_spec> ::= [ ONLY ] <table_name> |

                      ALL <table_name> [ EXCEPT <table_name> ]

 

<metaclass_specification> ::= CLASS <class_name>

 

lock_hint ::=

READ UNCOMMITTED

  • select_expressions : 조회하고자 하는 컬럼 또는 연산식을 하나 이상 지정할 수 있으며, 테이블 내 모든 컬럼을 조회할 때에는 *를 지정한다. 조회하고자 하는 컬럼 또는 연산식에 대해 AS 키워드를 사용하여 별칭(alias)를 지정할 수 있으며, 지정된 별칭은 컬럼 이름으로 사용되어 GROUP BY, HAVING, ORDER BY, FOR 절 내에서 사용될 수 있다. 컬럼의 위치 인덱스(position)는 컬럼이 명시된 순서대로 부여되며, 시작 값은 1이다.
  • table_specification : FROM 절 뒤에 하나 이상의 테이블 이름이 명시되며, 부질의와 유도 테이블도 지정될 수 있다. 부질의 유도 테이블에 대한 설명은 부질의 유도 테이블을 참고한다.
  • lock_hint : 해당 테이블에 대한 격리 수준(isolation level)을 READ UNCOMMITTED 수준으로 설정할 수 있다. READ UNCOMMITTED은 오손 읽기(dirty read)가 발생할 수 있는 격리 수준으로서, CUBRID 트랜잭션의 격리 수준에 관한 자세한 설명은 트랜잭션 격리 수준을 참고한다.
예제

--FROM clause can be omitted in the statement

SELECT 1+1 AS sum_value;

    sum_value

=============

            2

 

--db_root can be used as a dummy table

SELECT 1+1 AS sum_value FROM db_root;

    sum_value

=============

            2

 

SELECT CONCAT('CUBRID', '2008' , 'R3.0') AS db_version;

  db_version

======================

  'CUBRID2008R3.0'

유도 테이블

질의문에서 FROM 절의 테이블 명세 부분에 부질의가 사용될 수 있다. 이런 형태의 부질의는 부질의 결과가 테이블로 취급되는 유도 테이블(derived table)을 만든다. 유도 테이블을 만드는 부질의가 사용될 때 반드시 상관 명세가 사용되어야 한다.

또한 유도 테이블은 집합 값을 갖는 속성의 개별 원소를 접근하는데 사용된다. 이 경우 집합 값의 한 원소는 유도 테이블에서 하나의 레코드로 생성된다.

부질의 유도 테이블
설명

유도 테이블의 각 레코드는 FROM 절에 주어진 부질의의 결과로부터 만들어진다. 부질의로부터 생성되는 유도 테이블은 임의의 개수의 컬럼과 레코드를 가질 수 있다.

구문

FROM (subquery) [ AS ] derived_table_name [( column_name [ {, column_name }_ ] )]

  • column_name 파라미터의 개수와 subquery에서 만들어지는 컬럼의 개수는 일치해야 한다.
예제 1

다음은 한국이 획득한 금메달 개수와 일본이 획득한 은메달 개수를 더한 값을 조회하는 예제이다. 이 예제는 유도 테이블을 이용하여 부질의의 중간 결과를 모으고 하나의 결과로 처리하는 방법을 보여준다. 이 질의는 nation_code 컬럼이 'KOR'인 gold값과 nation_code 컬럼이 'JPN'인 silver 값의 전체 합을 반환한다.

SELECT SUM(n) FROM (SELECT gold FROM participant WHERE nation_code='KOR'

UNION ALL SELECT silver FROM participant WHERE nation_code='JPN') AS t(n);

  sum(n)

========

      82

예제 2

부질의 유도 테이블은 외부 질의와 연관되어 있을 때 유용하게 사용할 수 있다. 예를 들어 WHERE 절에서 사용된 부질의의 FROM 절에 유도 테이블이 사용될 수 있다.

다음은 은메달 및 동메달을 하나 이상 획득한 경우, 해당 은메달과 동메달의 합의 평균보다 많은 수의 금메달을 획득한 nation_code, host_year, gold 필드를 보여주는 질의 예제이다. 이 예제에서는 질의(외부 SELECT 절)와 부질의(내부 SELECT 절)가 nation_code 속성으로 연결되어 있다.

SELECT nation_code, host_year, gold

FROM participant p

WHERE gold > ( SELECT AVG(s)

            FROM ( SELECT silver + bronze

            FROM participant

            WHERE nation_code = p.nation_code

            AND silver > 0

            AND bronze > 0

          ) AS t(s));

  nation_code          host_year          gold

=========================================

  'JPN'                       2004                16

  'CHN'                       2004                32

  'DEN'                       1996                 4

  'ESP'                       1992                13