Intro
지난달 들었던 SQL 강의는 Oracle 기반 SQL이었다.
프로그래머스 문제를 풀기 전까지만 해도 MySQL과 Oracle에서 서로 다른 문법이 사용된다는 것도 몰랐다(창피하지만 사실이고, 사실이지만 창피하다).. 이런 면에서 프로그래머스는 MySQL과 Oracle 결과를 동시에 볼 수 있다는 게 큰 장점인 것 같다.
이 문제에서 가장 헷갈렸던 부분은 MySQL과 Oracle에서 Null값을 처리할 때 사용하는 함수의 차이, Single / Double quatation mark의 활용 차이다.
해당 문제 및 나의 답안, 해결방안은 아래와 같다.
Question
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.
Answer
Oracle에서 작성한 나의 답안은 아래와 같다.
--Oracle--
SELECT ANIMAL_TYPE, NVL(NAME,'No name') AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS;
Null값을 다른 값으로 치환하기 위해 NVL함수를 사용했다.
그러나 MySQL에서 동일한 NVL 함수를 실행했더니 아래와 같은 오류가 발생하였다.
따라서 Oracle과 MySQL에서 Null값을 처리하는 함수 간 차이를 공부했다.
Solutions
[Oracle에서 Null값 처리하기]
Oracle에서 Null값을 처리하는 방법은 2가지 정도가 있다.
1) NVL, NVL2
NVL 함수는 Null 값이면 지정값을, Null 값이 아니면 기본값을 출력한다.
▶ NVL(문자열, Null 값일 때 지정값)
NVL2 함수는 Null값일 때 지정값과 Null값이 아닐 때 지정값을 설정할 수 있다.
▶ NVL2(문자열, Null 값이 아닐 때 지정값, Null값일 때 지정값)
2) DECODE
DECODE 함수는 IF문을 간단하게 구현하기 좋은 함수이다.
▶ DECODE(문자열, 조건1, 결과1, 조건2, 결과2,..., 조건 외 결과)
예를 들어, 부서번호가 10번일 때는 100, 부서번호가 20번일 때는 20, 그 외 부서번호는 0을 출력할 때 IF문을 활용한 쿼리문과 DECODE 함수를 활용한 쿼리문을 비교하면 아래와 같다.
- IF 부서번호 = 10 THEN 100 ELSE IF 부서번호 = 20 THEN 200 ELSE 0
- DECODE(부서번호, 10, 100, 20, 200, 0)
[MySQL에서 Null값 처리하기]
MySQL에서 Null값을 처리하는 방법으로는 IFNULL 함수를 들 수 있다.
IFNULL함수는 Null값일 때 지정값을 출력할 수 있고, Oracle의 NVL 함수와 비슷하다.
▶ IFNULL(문자열, Null 값일 때 지정값)
IFNULL 함수를 활용해 위 문제의 답안을 작성한 쿼리문은 아래와 같다.
--MySQL--
SELECT ANIMAL_TYPE, IFNULL(NAME,'No name') NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS;
[전체 DBMS에서 활용할 수 있는 방법]
1) CASE
CASE문은 DECODE와 같이 IF문을 구현하는 방법 중 하나이다.
CASE문이 Oracle의 DECODE와 다른 점은 DECODE는 등호(=) 비교만 가능한 반면, CASE는 등호와 부등호(>,>=,<,<=) 비교가 모두 가능하다는 것이다.
▶ CASE WHEN 조건 1 THEN 결과 1 WHEN 조건 2 THEN 결과 2 ... ELSE 조건 외 결과 END
2) COALESCE
COALESCE 함수는 Oracle의 NVL함수 및 MySQL의 IFNULL 함수와 유사하게 활용할 수 있다.
▶ COALESCE(문자열, Null 값일 때 지정값)
이외에 여러 개의 컬럼에서 Null값이 아닌 값을 반환해야 할 때도 사용할 수 있다.
▶ COALESCE(컬럼1, 컬럼2, 컬럼3,...)
이렇게 활용하면, n개의 컬럼에서 Nul값이 아닌 데이터 중 맨 첫번째 데이터만 출력하게 된다.
예를 들어 COALESCE(Null, 'a', 'b')를 실행하면 a가 출력되고, COALESCE('c', Null, 'd')을 실행하면 c가 출력되는 원리이다.
위 예시에 문자가 아닌 데이터셋의 컬럼을 넣으면 여러 컬럼 중 Null값이 아닌 값 중 가장 처음 나오는 데이터를 출력한다.
COALESCE 함수의 원리에 대해 잘 정리해 놓으신 분의 게시글을 같이 첨부해본다 :)
3) IF문
IF문은 모든 조건문의 기본 형식으로, 두 DBMS에서 모두 활용할 수 있다.
▶ IF 조건 1 THEN 결과 1 ELSE IF 조건 2 THEN 결과 2 ... ELSE 조건 외 결과 END
PS) 위 내용에 틀린 부분이나 추가할 수 있는 내용이 있다면 꼭 댓글로 남겨주세요!!
'SQL' 카테고리의 다른 글
[SQL 독학하기] 프로그래머스 오답풀이 - 조건에 맞는 회원수 구하기 (0) | 2023.07.02 |
---|---|
[SQL 독학하기] 프로그래머스 오답 풀이 - 상위 N개 레코드 추출하기 (0) | 2023.06.29 |