데이터 모델과 SQL

[데이터 모델과 SQL] 3. SQL - SELECT 명령 - 표현식(Expression)

영바이트 2022. 12. 25. 16:18

표현식(Expression)에 대해 본격적으로 살펴보기 전에 SQL의 표준 데이터 타입과 타입 캐스트(type cast, 형 변환)에 대해 알고 넘어갈 필요가 있다. 왜냐하면 표현식의 대상이 되는 데이터의 타입이 무엇이냐에 따라 허용되는 표현식이 다르고, 때로는 서로 다른 데이터 타입 사이에 표현식을 적용하기 위해 타입 캐스트(형 변환)가 필요할 수 있기 때문이다.

 

아래는 ANSI SQL에서 정의하는 기본적인 데이터 타입들이다.

데이터 타입 정의 설명
CHARACTER 문자열 ASCII 형태의 문자열이다. 알파벳과 숫자 등만 표현 가능하다.
NATIONAL CHARACTER 문자열 UTF 형태의 문자열이다. 다양한 국가의 언어들이 표현 가능하다.
BINARY 이진 데이터 파일 등과 같이 1과 0으로 이루어진 2진 형태의 데이터 저장 가능하다.
EXACT NUMBER 정수  
APPROXIMATE NUMERIC 실수  
BOOLEAN 논리값 참(true) 또는 거짓(false)
DATETIME 시점 연:월:일:오전/오후:시:분:초.소수점 아래 초
INTERVAL 기간 연:월:일:오전/오후:시:분:초.소수점 아래 초

 

위의 기본 데이터 타입 외에도 많은 데이터베이스 시스템(DBMS)들에서 기본형에서 파생되는 데이터 형을 사용한다. 예를 들면 DATETIME 형식 중 날짜와 시간만을 따로 다루는 DATE(날짜), TIME(시간) 형 등이다.

 

데이터들은 경우에 따라 서로 변환이 가능하다. 예를 들어 정수(EXACT NUMBER) ↔ 실수(APPROXIMATE NUMERIC) 변환은 자주 사용된다.

 

CAST 명령을 이용해서 데이터 형 변환(type cast)을 할 수 있다.

CAST <대상 데이터(컬럼)> AS <목표 형식>
예) SELECT CAST(ShipTime AS DATE) FROM orders;

 

CAST 연산을 수행하기 전에 반드시 아래 경우를 생각해야 한다.

· 목표 형식이 대상 데이터의 모든 범위를 포함하는가? 예) DATE는 DATETIME형 데이터 중 일부만 표현한다.

· 변환이 불가능한 데이터이지 않은가? 예) 문장 부호 → 숫자 변환은 알 수 없는 결과가 나타난다.

· 실수 → 정수. 값이 유실되거나 오류가 발생한다.

 


 

이제 본격적으로 표현식에 대해 알아보자. 표현식의 정의는 아래와 같다.

표현식(Expression): 표현식은 SELECT 명령의 결과를 가공(manupulation)하는 가공자(manipulator)이다.

표현식의 예로 쿼리 결과에 상수를 더한다거나 쿼리 결과에 문자열을 붙이는 경우를 생각해 볼 수 있다.

 

표현식에는 3가지 종류가 있다.

 

ⓐ 문자열 합치기(concatenation, 컨캐트네이션)

쿼리 결과에 주어진 문자열을 합친다. 보통 SELECT 결과 셋의 가독성(readability)을 높이기 위해 사용한다.

예) SELECT 'Customer first name: ' || CustFirstName FROM customers;
예) SELECT CONCAT('Customer first name: ', CustFirstName) FROM customers;

Concatenation을 위한 대표적인 기호는 || 이고 DBMS에 따라 전용 함수를 제공하기도 한다. 예를 들어 MySQL에서는 CONCAT( ) 함수를 사용한다.

 

수리 연산(mathematical operation)

쿼리 결과 셋에 추가적인 계산을 행한다. 연산 종류는 사칙연산 기호로 지정한다.

예) SELECT RetailPrice-200 FROM products;

 

ⓒ 날짜, 시간 연산(date or time operation)

쿼리 결과 셋의 두 시점 사이의 기간을 계산하거나 주어진 시점에서 일정 기간 후의 시점을 구한다. 날짜, 시간 연산은 연산 대상이 시점(time, date)인가 기간(interval)인가에 따라 다양한 형태로 이루어진다.

 

ⓒ-1 DATE - DATE = INTERVAL

예) SELECT ShipDate - OrderDate FROM orders;
예) SELECT DATEDIFF(ShipDate, OrderDate) FROM orders;

 

ⓒ-2 DATE + INTERVAL = DATE

예) SELECT ShipDate + 5 FROM orders;
예) SELECT DATE_ADD(ShipDate, INTERVAL 5 DAY) FROM orders;

 

ⓒ-3 TIME - TIME = INTERVAL

SELECT TIMEDIFF(EndTime, StartTime) FROM classes;

 

ⓒ-4 TIME + INTERVAL = TIME

예) SELECT DATE_ADD(StartTime, INTERVAL Duration MINUTE) AS EndTime FROM classes;

날짜(DATE), 시간(TIME) 형식 데이터 계산을 위해 DBMS마다 여러 함수들을 제공하는 경우가 많다. 예를 들어 MySQL의 경우 두 날짜 데이터 사이의 차이를 계산하기 위해 DATEDIFF( ) 함수를 제공하고 있다. 날짜, 시간을 대상으로 계산을 수행할 때는 DBMS 매뉴얼을 참고해야 한다.

 

DATE + DATE, TIME + TIME 연산도 가능하지만 보통 쓸 경우가 흔하지 않다. 

 

표현식을 사용 할 때 유의해야 할 내용들을 아래와 같이 정리해 볼 수 있다.

 

· 표현식은 SELECT 명령에 부속되어 있는 것이다. 즉, 'SELECT + 표현식'과 같은 형태로 사용하여야 한다.

· 표현식이 값(value, 하나의 상수 또는 문자열 등)을 반환한다면 다른 표현식의 입력으로 사용될 수 있다.

예) SELECT CONCAT('Employee ', CONCAT('First ', CONCAT('Name ', EmpFirstName))) FROM employees;

· 데이터에 따라 값이 존재하지 않는 항목(컬럼)이 있을 수 있다(예, 선택형 응답에 해당하는 데이터). 이러한 경우 해당 항목을 대상으로 표현식을 사용하는 것이 의미가 있는 것인지 다시 한 번 생각해 볼 필요가 있다.