Darren's Devlog

[불친절한SQL] 기초쿼리, SELECT문 - 2 본문

SQL

[불친절한SQL] 기초쿼리, SELECT문 - 2

Darren Gwon 2022. 11. 17. 23:22
반응형

○ 기본요소

리터럴(literal)은 변하지 않는 값이다.

다른 프로그래밍 언어의 상수와 유사하다.

문자 리터럴, 숫자 리터럴, 날짜 리터럴, 인터벌 리터럴 등이 있다.

 

널(NULL)

값이 없더나 정해지지 않는 것을 의미한다.

오라클 DB는 NULL과 빈 문자('')를 동일하게 처리한다.

 

연산자(operator)

피연산자(operand)에 대한 연산을 수행한다.

산술 연산자, 연결 연산자, 집합 연산자, 계층 쿼리 연산자 MULTISET 연산자 등이 있다.

 

산술 연산자

숫자 값이나 날짜 값에 대한 산술 연산을 수행한다.

나눗셈의 제수가 0이면 에러가 발생한다.

SELECT 1+2-3*4/5 AS c1, 1+2-((3*4)/5) AS c2 FROM DUAL;
SELECT 1/0 FROM DUAL; --에러

 

연결 연산자

피연산자를 연결한 문자 값을 반환한다.

문자 값이 아닌 피연산자는 문자 값으로 변환된다.

NULL은 무시된다.

SELECT 1 || NULL || 'A' AS c1 FROM DUAL;

결과: 1A

 

연산자 우선순위에 따라 계산되기 때문에 상단 쿼리는 에러가 발생한다.

명시적으로 괄호를 사용하는 편이 바람직하다.

SELECT '$' || 1+2 AS c1 FROM DUAL; --에러 수치가 부적합합니다.
SELECT 1+2 || '$' AS c1 FROM DUAL; --3$
SELECT '$' || (1+2) AS c1 FROM DUAL; --3$

 

표현식

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

다양한 표현식 중 이번 주제에는 CASE 표현식을 살펴본다.

 

CASE 표현식

IF THEN ELSE 논리를 평가할 수 있다.

단순 CASE 표현식과 검색 CASE 표현식을 사용할 수 있다.

 

단순표현식은 expr과 comparison_expr이 일치하는 첫 번째 return_expr을,

일치하는 comparison_expr이 없으면 else_expr을 반환한다.

CASE expr
	{WHEN comparison_expr THEN return_expr}···
    [ELSE else_expr]
END
SELECT deptno, 
  CASE deptno WHEN 10 THEN 1 WHEN 20 THEN 2 ELSE 9 END AS c1 
FROM dept;

단순 표현식은 expr과 comparison_expr의 데이터 타입이 동일해야 한다.

return_expr과 else_expr도 데이터 타입이 동일해야 한다.

SELECT deptno
	, CASE deptno WHEN '10' THEN 1 WHEN 20 THEN 2 ELSE 9 END AS c1 
FROM dept; --에러. 일관성 없는 데이터 유형

SELECT deptno
	, CASE deptno WHEN 10 THEN '1' WHEN 20 THEN 2 ELSE 9 END AS c1 
FROM dept; --에러. 일관성 없는 데이터 유형

 

검색 CASE 표현식

condition이 TRUE인 첫 번째 return_expr를 반환하고 없으면 else_expr이 반환된다.

검색 CASE 문은 WHEN 절의 기술 순서에 주의해야 한다.

CASE expr
	{WHEN condition THEN return_expr}···
    [ELSE else_expr]
END
SELECT deptno
	, CASE
		WHEN deptno BETWEEN 10 AND 20 THEN 1
		WHEN deptno BETWEEN 20 AND 30 THEN 2
		ELSE 9
	END AS c1 
FROM dept;

 

바인드 변수

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

VAR[IABLE] 명령어로 바인드 변수를 선언하고  EXEC[UTE] 명령어로 바인드 변수에 값을 할당한다.

VAR v1 NUMBER; --변수선언 변수명 변수타입
EXEC :v1 := 1; --값 할당

SELECT :v1 AS c1 FROM DUAL;
반응형
Comments