강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
기본 SQL문 - FROM
조회 : 6,740  


기본 SQL문 - FROM
1. FROM
FROM 절은 질의에서 데이터를 조회하고자 하는 테이블을 지정한다.
데이터는 개별 테이블 또는 하나의 테이블과 그 테이블의 모든 서브테이블 또는 하나의 테이블와 EXCEPT 키워드에 의해 제외된 서브테이블 이외의 모든 서브테이블로부터 질의가 될 수 있다.
1) 구문
FROM from_specification

from_specification:
table_spec [ {, table_spec | outerjoin_table_spec}...]

table_spec:
single_table_spec [ correlation ] [ WITH(lock_hint [ {, lock_hint }_ ] ) ]
( single _table_spec [ {, single_table_spec}...] )
CLASS table_name [ correlation ]
subquery correlation
TABLE (expression) correlation

outerjoin_table_spec:
{ LEFT | RIGHT } [OUTER] JOIN table_spec ON search_condition

single_table_spec:
[ ONLY ] table_name
ALL table_name [ ( EXCEPT table_spec) ]

correlation:
[ AS ] identifier

lock_hint:
READ UNCOMMITTED
table_spec : 테이블로부터 클래스 속성을 조회하기 위해서는 키워드 CLASS가 FROM 절의 테이블 이름 앞에 사용되어야 한다.
부질의와 유도 테이블도 FROM 절에 사용될 수 있다.
lock_hint : READ UNCOMMITTED : 불필요한 읽기나 격리 수준 0을 구현한다. 이를 설정하면 커밋되지 않은 데이터나 불필요한 데이터를 읽을 수 있다.
2. 유도 테이블
질의문에서 FROM 절의 테이블 명세 부분에 부질의가 사용될 수 있다. 이런 형태의 부질의는 부질의 결과가 테이블로 취급되는 유도 테이블(derived table)을 만든다. 유도 테이블을 만드는 부질의가 사용될 때 반드시 상관 명세가 사용되어야 한다.
또한 유도 테이블은 집합 값을 갖는 속성의 개별 원소를 접근하는데 사용된다. 이 경우 집합 값의 한 원소는 유도 테이블에서 하나의 인스턴스로 생성된다.
3. 부질의 유도 테이블
INSERT 문에 질의를 사용하면 하나의 INSERT 문으로 다수의 데이터를 생성할 수 있다.
다른 테이블로부터 특정 검색 조건을 만족하는 데이터를 추출하고 싶은 경우 질의를 이용하면 조건을 만족하는 모든 데이터는 INSERT 문에 명시된 테이블의 데이터가 된다.
1) 구문
FROM (subquery) [ AS ] derived_table_name [( column_name [ {, column_name }_ ] )]
부질의로부터 생성되는 유도 테이블은 임의의 개수의 컬럼과 인스턴스를 가질 수 있다.
column_name 파라미터의 개수와 subquery에서 만들어지는 컬럼의 개수는 일치해야 한다.
2) 예제
다음은 한국이 획득한 금메달 개수와 일본이 획득한 은메달 개수를 더한 값을 조회하는 예제이다. 이 예제는 유도 테이블을 이용하여 부질의의 중간 결과를 모으고 하나의 결과로 처리하는 방법을 보여준다. 이 질의는 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);
=== <Result of SELECT Command in Line 2> ===
 sum(n)
=======
   82
1 rows selected.
부질의 유도 테이블은 외부 질의와 연관되어 있을 때 유용하게 사용할 수 있다. 예를 들어 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));
=== <Result of SELECT Command in Line 1> ===
   nation_code   host_year   gold
====================================
   'JPN'   2004   16
   'CHN'   2004   32
   'DEN'   1996   4
   'ESP'   1992   13
4 rows selected.

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1611


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
큐브리드