[데이터 모델과 SQL] 3. SQL - SELECT 명령 - 표현식(Expression)
표현식(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;
· 데이터에 따라 값이 존재하지 않는 항목(컬럼)이 있을 수 있다(예, 선택형 응답에 해당하는 데이터). 이러한 경우 해당 항목을 대상으로 표현식을 사용하는 것이 의미가 있는 것인지 다시 한 번 생각해 볼 필요가 있다.
■