sql에서도 마찬가지로 데이터에 대한 연산을 지원한다. 우리가 다루는 야구 데이터베이스를 예로 들자면, 태어난 해와 사망한 해만 적어져 있지 실제 나이는 적혀 있지 않다. 이런 경우 활용할 수 있겠다.
SELECT 2022-1934
이렇게 말이다.
그렇다면 야구 데이터베이스에서 선수들의 한국 나이를 뱉어내주는 쿼리문을 작성해보자. 예외 처리를 위해 태어난 해, 사망한 해가 NULL이 아니고 편의상 80세 미만인 사람만 뽑아보자. 그렇다면 이런 쿼리문이 나올 것이다.
SELECT 2022 - birthYear AS KOREANAGE
FROM players
WHERE deathYear IS NULL AND birthYear IS NOT NULL AND KOREANAGE<80
ORDER BY KOREANAGE
이 쿼리문은 작동이 되지 않는다. 알고보면 WHERE 절에서 KOREANAGE가 없다는 이해가 안되는 오류를 내뿜는데... 쉽게 생각해보면 지난 시간에 SELECT FROM WHERE을 한국어 문장으로 이렇게 이해하면 되는 부분을 보면 되겠다. 해당 비유를 요약하면 FROM, WHERE, SELECT, ORDER BY 순으로 이어지는데, WHERE이 KOREANAGE를 선언한 SELECT보다 앞에 있기 때문에 해당 변수가 없다고 sql에서 인지하는 것이다.
반면에 ORDER BY에선 오류가 뜨지 않는 것은 ORDER BY는 SELECT 이후 동작하기 때문에 KOREANAGE가 정상적으로 먼저 선언되었기 때문이다.
SELECT 2022 - birthYear AS KOREANAGE
FROM players
WHERE deathYear IS NULL AND birthYear IS NOT NULL AND (2022-birthYear)<80
ORDER BY KOREANAGE
그래서 별 수 없이 이렇게 쳐줘야 한다.
물론 지금같은 단순한 사칙연산 말고도 C++ STL에서 있을 법한 기능도 sql에선 어지간하면 다 있다.
SELECT ROUND(3.14142331,3); --세번째 소수점 까지 표시, 네번째 소수점에서 반올림
SELECT POWER(2,3);--2를 3제곱한다.
SELECT COS(0);--cos(0)의 결과를 반환한다.
이외에도 공식 문서에서 나와있으니, 무작정 외우진 말고 필요할 때마다 찾아 쓰면 되겠다.
sql에선 다음과 같이 문자열을 활용할 수도 있다.
SELECT 'Hello world'
그러나 한국어로 작성한다면 ?????와 같이 글자가 깨질 것이다.
SELECT '안녕하세요'
무슨 일인고 하니... sql에서 ''을 이용한 문자열은 '한'글자가 1byte로 처리되는데, 한글의 경우 한 글자당 2byte이므로 문자가 깨지는 현상이 발생한다. 따라서 한글을 쓴다면 ''앞에 N을 별도로 붙여줘야한다.
SELECT N'안녕하세요'
C++이나 JAVA에서 문자열을 + 단위로 더할 수 있는 것처럼, sql에서도 같은 동작이 가능하다. 다음 예제는 야구 DB에서 성, 이름을 합쳐 선수들의 FullName을 반환하는 쿼리문이다.
SELECT nameFirst+' '+nameLast AS FullName
FROM players
WHERE nameFirst IS NOT NULL AND nameLast IS NOT NULL;
문자열도 마찬가지로
SELECT SUBSTRING('20220822',1,4);--첫번째부터 4번째 글자까지 자른다. 2022 반환.
SELECT TRIM(' goodgame'); --문자열의 모든 공백을 제거한다.
와 같은 편리한 기능이 있으므로, 필요하면 찾아 써보자.