카테고리 없음

2024-03-25 [PROGRAMMERS SQL 다양한 문제풀이]

Glen_check 2024. 3. 25. 17:57

SQL 문제를 풀며, 문제를 많이 푸는 것보다 한문제 한문제 완벽하게 이해하는 것, 다양한 작성방법을 공부하는 것이 집중하고 있다.

금일 작성한 쿼리 중 새롭게 깨달은 부분이나 기억하고 싶은 것들을 중점으로 기록해보려 한다.

 

문제 1

아래는 종합병원에 등록된 환자정보를 담은 PATIENT 테이블입니다. 

PATIENT 테이블은 다음과 같으며 PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.

문제1 테이블 구조

12세 이하인 여자 환자의 환자 이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성

이때 전화번호가 없는 경우, 'NONE'으로 출력

결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬

 

문제 1 작성 쿼리

SELECT PT_NAME,
       PT_NO,
       GEND_CD,
       AGE,
       IF(TLNO IS NULL, 'NONE', TLNO) TLNO
FROM PATIENT
WHERE AGE <= '12' AND GEND_CD = 'W'
ORDER BY 4 DESC, 1

IF 함수를 활용 전화번호(TINO)가 NULL일 경우, 'NONE'이라는 텍스트를 출력하고, False일 경우 기존 값을 출력하도록 다음과 같이 작성하였고 정답이었다.

혹시나 다른 풀이가 있을까 찾아보았고, 모르는 함수가 있어 하단에 내용을 정리해본다.

 

NVL 함수 활용 쿼리와 활용 방법

SELECT  PT_NAME,    
        PT_NO,  
        GEND_CD,    
        AGE,    
        NVL(TLNO, 'NONE') AS TLNO
FROM    PATIENT
WHERE   AGE <= 12
AND     GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC

해당 칼럼의 값이 NULL 값인 경우 특정값으로 출력하고 싶으면 NVL 함수를 사용하고,

NULL 값이 아닐 경우 특정값으로 출력하고 싶으면 NVL2 함수를 사용할 수 있다.

함수 구조  :  NVL("값", "지정값")

 

문제 2

자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다.

CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며 CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 의미.

문제 2 테이블 구조

자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 구성

 

테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성

이때 자동차 수에 대한 컬럼명은 CARS로 지정,

결과는 자동차 종류를 기준으로 오름차순 정렬

 

문제 2 작성 쿼리

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS IN ('통풍시트', '열선시트', '가죽시트')
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE

처음 IN 연산자를 활용하여 작성했으나 데이터가 추출되지 않는 문제가 발생

왜 안될까 생각해 IN 함수의 기능을 찾아보니 입력한 문자열이 포함되는 것이 아닌, 일치한 경우 추출되며 옵션 리스트 중 포함될 경우이니 문자열이 완전 일치되지 않아도 포함되어야 했다.

이전에 TIL에 작성한 REGEXP 함수를 참고하여 추가적으로 답안을 구성해보았고 아래와 같이 올바른 쿼리를 작성할 수 있었다.

* https://hongjinkwon.tistory.com/6 해당 링크 참고

 

문제 2 REGEXP 정규식 활용 쿼리

SELECT CAR_TYPE,
       COUNT(*) CARS
FROM        CAR_RENTAL_COMPANY_CAR
WHERE       REGEXP_LIKE(OPTIONS, '통풍시트|열선시트|가죽시트')
GROUP BY    CAR_TYPE
ORDER BY    1

# 하단과 같이 작성 또한 가능
SELECT      CAR_TYPE
        ,   COUNT(1) AS  CARS
FROM        CAR_RENTAL_COMPANY_CAR
WHERE       OPTIONS  REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY    CAR_TYPE
ORDER BY    1

 

(총정리)

최초 IN 절을 사용하여 처리를 하였으나, 데이터가 추출되지 않아 IN 함수의 기능을 확인해보니 입력한 문자열이 포함이 아닌 일치한 경우 추출
EX_ DATA = '홍진권스파르타코딩' 인 경우 IN ('홍진권') x / IN ('홍진권스파르타코딩') O
1. LIKE OR을 반복하여 작성이 가능하나 쿼리가 길어지니,
2. REGEXP 정규식 사용하여 처리