Home 5. SELECT 문
Post
Cancel

5. SELECT 문

기본 SELECT 문은 SELECT 절과 FROM 절로 구성된다.

  • SELECT - 조회할 열이나 표현식을 기술
  • FROM - 조회할 테이블을 기술

FROM 절이 수행된 후, SELECT 절이 수행된다.

[어휘 단위]

용어설명예시
키워드개별적인 SQL 요소DISTINCT
SQL의 한 부분SELECT DISTINCT
2개 이상의 절이 결합된 문장SELECT DISTINCT deptno FROM emp;

5.1 SELECT 절

SELECT 절에 조회할 열이나 표현식을 기술할 수 있다.

5.1.1 애스터리스크

SELECT절에 애스터리스크(*)를 기술하면 테이블의 전체 열이 조회된다.

**SQL*Plus의 DESC 명령어로 테이블의 열 정보를 확인할 수 있다.

5.1.2 열

SELECT절에 조회할 열을 기술할 수 있다. 열은 쉼표로 구분한다.

1
SELECT dname, deptno FROM dept;

5.1.3 열 별칭

열은 별칭을 지정할 수 있다. 별칭을 지정하면 열이나 표현식을 간결하게 사용할 수 있다. 별칭은 대소문자를 구분하지 않고, 숫자로 시작할 수 없으며, 공백이나 특수 문자를 포함할 수 없다. 그리고 “ 큰따옴표로 감싸면 제약을 회피할 수 있다.

1
2
## 별칭 사용 방법
SELECT deptno dept_no, dname AS dept_nm, loc AS "Location" FROM dept;

가급적 AS 키워드를 사용하도록 하고, 큰 따옴표는 되도록 사용하지 말자

5.1.4 DISTINCT 키워드

SELECT 절에 DISTINCT 키워드나 UNIQUE 키워드를 기술하면 중복 행이 제거된 결과가 반환된다. ALL 키워드를 기술하면 중복 행을 제거하지 않는다.(기본 값은 ALL)

5.2 FROM 절

FROM 절에는 조회할 테이블을 기술할 수 있다. 테이블은 쉼표로 구분한다. 2개 이상의 테이블을 기술하면 조인이 수행된다.

5.2.1 스키마

테이블에 스키마를 지정하면 해당 스키마의 테이블을 조회할 수 있다. 지정하지 않는 경우 현재 사용자의 테이블, 전용 시노님, 공용 시노님 순서로 구문이 해석된다.

1
2
3
4
SELECT * FROM t1;
SELECT * FROM u1.t1;
SELECT * FROM u2.t1;
SELECT * FROM u3.t1;

5.2.2 테이블 별칭

테이블에도 별칭을 지정할 수 있다.

1
SELECT a.deptno FROM dept a;

5.2.3 SAMPLE 절

SAMPLE 절을 사용하면 테이블을 샘플링하여 조회할 수 있다. 대용량 테이블에 대한 통계 값을 생성할 때 활용할 수 있다.

  • BLOCK - 블록 샘플링을 사용
  • sample_percent - 샘플링 비율
  • SEED - 항상 동일한 샘플을 반환

5.3 기본 요소

5.3.1 리터럴

리터럴은 변하지 않는 값이다.(상수와 유사)

  • 문자 리터럴 - 문자열은 작은 따옴표를 감싸서 기술한다. 10.1버전부터 인용 방식의 문자 리터럴을 사용할 수 있다. [], {}, <>, ()등 사용, 리터럴은 전체 행에서 동일한 값을 반환한다. ``` – 문자열에 작은 따옴표를 기술하려면 작은 따옴표를 2개 연속 기술하면 된다. select ‘1!A’ AS c1, ‘2’‘B’ AS c2 from dual; – 결과 1!A | 2’B

select q’[2’B]’ AS c1, q’{[3C]}’ AS c2 from dual; – 결과 2’B | [3C]

1
* 숫자 리터럴

select 1 as c1, -2 as c2, 3.4 as c3, -5.6 as c4, 1.2E2 as c5, -3.4E-2 as c6 from dual; – 결과 1 | -2 | 3.4 | -5.6 | 120 | -0.034

1
* 날짜 리터럴 - 날짜 리터럴은 날짜 값을 지정한다. DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE 리터럴을 사용할 수 있다. NLS 파라미터 설정에 따라 출력 포멧을 결정할 수 있다.

ALTER SESSION SET NLS_DATE_FORMAT = “YYYY-MM-DD HH24:MI:SS”; ALTER SESSION SET NLS_TIMESTAMP_FORMAT = “YYYY-MM-DD HH24:MI:SS.FF”; ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = “YYYY-MM-DD HH24:MI:SS.FF TZH:TZM”;

– DATE 리터럴은 연월일을 지정한다. 시분초까지 지정하려면 TO_DATE 함수를 사용해야 한다. SELECT DATE ‘2022-12-04’ AS c1, TO_DATE(‘2022-12-04 20:07:00’, ‘YYYY-MM-DD HH24:MI:SS’) AS c2 FROM dual;

– TIMESTAMP 리터럴은 소수점 이하 초를 지정할 수 있다. SELECT TIMESTAMP ‘2022-12-04 20:07:00.9999999999’ AS c1 FROM dual;

– TIMESTAMP WITH TIME ZONE 리터럴은 TIMESTAMP에 시간대 변위 값을 포함시킬 수 있다. SELECT TIMESTAMP ‘2022-12-04 20:07:00.9999999999 +09:00’ AS c1 FROM dual;

1
* 인터벌 리터럴 - 시간 간격을 지정하는 리터럴로 YEAR TO MONTH, DAY TO SECOND 리터럴을 사용할 수 있다.

SELECT INTERVAL ‘99’ YEAR AS c1, INTERVAL ‘99’ MONTH AS c2, INTERVAL ‘99-11’ YEAR TO MONTH AS c3 –11월까지 지정 FROM dual;

SELECT INTERVAL ‘99’ DAY AS c1, INTERVAL ‘863999.999999999’ SECOND(1,9) AS c2, – SECOND만 기술한 경우 쉼표로 정밀도 지정 가능, 쉼표 앞자리는 일 정밀도, 뒷자리는 초 정밀도 INTERVAL ‘9 23:59:59.999999999’ DAY(1) TO SECOND(9) AS c3, INTERVAL ‘239:59’ HOUR(1) TO MINUTE AS c4 FROM dual;

1
2
3
4
5
6
7
8
DUAL 테이블 : DUAL 테이블은 Dummy 열로 구성되며 1개의 행을 가지고 있다. 리터럴 조회, 행 복제 등의 다양한 용도로 활용할 수 있다.

### 5.3.2 널
null은 값이 없거나 정해지지 않은 것을 의미한다. 오라클에서는 __널과 빈문자를 동일__ 하게 처리한다.

### 5.3.3 연산자
* 산술 연산자 - 숫자 값과 날짜 값에 대한 연산을 수행한다.

– c1, c2의 결과 값은 같다. 가독성을 위해 괄호를 사용하자 SELECT 1+2-34/5 AS c1, ((34)/5) AS c2 FROM dual;

– 날짜 값의 산술 연산에 사용되는 숫자 값은 일수로 계산된다. SELECT DATE ‘2050-01-31’ + 31 AS c1, DATE ‘2050-01-31’ + (1/24/60/60) AS c2, DATE ‘2050-01-31’ + INTERVAL ‘1’ SECOND AS c3 FROM dual;

–TIMESTAMP 값에 숫자 값을 연산하면 소수점 이하 초가 유실된다. 인터벌 값을 사용하면 소수점 이하 초를 유지할 수 있다. SELECT TIMESTAMP ‘2050-01-31 23:59:59.999999999’ + 31 AS c1, TIMESTAMP ‘2050-01-31 23:59:59.999999999’ + INTERVAL ‘31’ DAY AS c2 FROM dual;

– 날짜 값의 월 연산은 ADD_MONTHS 함수를 사용해야 한다. SELECT ADD_MONTH(DATE ‘2050-01-31’, 1) AS c1 FROM dual;

1
* 연결 연산자 - 연결 연산자는 피연산자를 연결한 문자 값을 반환한다. 문자 값이 아닌 피연산자는 문자 값으로 변환되고 널은 무시된다.

SELECT 1 || NULL || ‘A’ AS c1 FROM dual; – 결과 1A

1
2
3
4
5
6
7
8
9
* 연산자 우선순위 - 표현식은 연산자 우선순위에 따라 계산된다. 우선순위가 동일한 경우 좌측부터 계산된다. 1)단항 산술 연산자(+,-), 2)다항 산술 연산자(*, /), 3)다항산술연산자(+,-), 연결연산자(||)

### 5.3.4 표현식
표현식은 값으로 평가될 수 있는 리터럴, 연산자, SQL 함수 등의 조합이다.

__CASE 표현식__

CASE 표현식을 사용하면 IF THEN ELSE 논리를 평가할 수 있다.
1. 단순 CASE 표현식

– expr과 comparison_expr이 일치하는 첫번째 return_expr을 반환하고, 일치하는 값이 없으면 else_expr을 반환한다. – CASE 표현식은 expr과 comparison_expr의 데이터 타입이 동일하지 않으면 에러가 발생한다. – return_expr와 else_expr도 데이터 타입이 일치해야 한다. CASE expr {WHEN comparison_expr THEN return_expr}… [ELSE else_expr] END

1
2. 검색 CASE 표현식

– condition이 TRUE인 첫번째 return_expr을 반환한다. CASE {WHEN condition THEN return_expr}… [ELSE else_expr] END

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
### 5.3.5 슈도 칼럼
슈도 칼럼은 테이블에 저장되지 않은 의사 칼럼으로 쿼리 수행 시점에 값이 결정된다.
* 일반 - ROWID, ROWNUM, ORA_ROWSCN
* 계층 쿼리 - LEVEL, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE
* 시퀀스 - CURRVAL, NEXTVAL
* 버전 쿼리 - VERSIONS_STARTSCN, VERSIONS_STARTTIME,...

### 5.3.6 주석
* 단일 행 주석 : --로 시작함
* 다중 행 주석 : /* 로 시작해서 */ 로 끝남

### 5.3.7 힌트
힌트는 옵티마이저에 명령을 전달하는 특별한 형태의 주석이다. 힌트의 대부분은 실행계획을 수립할 때 사용되지만 일부 힌트는 SQL 문의 동작을 제어한다.
* 단일 행 힌트 : --+로 시작함
* 다중 행 힌트 : /*+로 시작해서 */로 끝남

## 5.4 바인드 변수
바인드 변수를 사용하면 쿼리의 재사용성을 높일 수 있다.

VAR v1 NUMBER; – 바인드 변수 선언 EXEC :v1 :=1; – 바인드 변수에 값을 할당

SELECT :v1 AS c1 FROM DUAL;

– 12.1 버전부터 선언한 변수에 값을 할당할 수 있는 기능이 추가되었다. VAR v1 NUMBER :=3; SELECT :v1 AS c1 FROM DUAL; ```

This post is licensed under CC BY 4.0 by the author.