프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
  SELECT ANIMAL_TYPE, 
         COUNT(ANIMAL_TYPE) COUNT 
    FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
  HAVING ANIMAL_TYPE IN ('Cat''Dog')
ORDER BY ANIMAL_TYPE
;
 
 

🙂 확인 사항

1. ANIMAL_INS 테이블

2. 고양이와 개 각각 몇 마리인지 조회

3. 고양이보다 개를 먼저 조회

 

😮  외의 풀이

1
2
3
4
5
6
7
8
  SELECT ANIMAL_TYPE, 
         COUNT(ANIMAL_TYPE) COUNT 
    FROM ANIMAL_INS
   WHERE ANIMAL_TYPE = 'Cat' OR ANIMAL_TYPE = 'Dog'
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
;
 
 

- 그룹 조건절 HAVING 대신 WHERE 사용

- IN 대신 OR 사용

 

⭐ HAVING과 WHERE

데이터를 필터링하거나 조작하는 데 사용

HAVING

    - 그룹화된 결과에 대한 조건을 지정하는 데 사용
    - 집계 함수 (예: COUNT, SUM) 등을 사용하여 그룹화된 결과에 대한 조건을 지정하는 데 주로 사용

HAVING

    - WHERE 절은 행 수준의 조건을 지정하는 데 사용되며, 특정 열의 값을 비교하거나 특정 조건을 만족하는 행을 필터링
    - 데이터베이스 테이블에서 특정 행을 선택할 때 사용하며, 그 결과로 나온 행들 중에서 그룹화나 집계를 하기 전에 조건을 적용

 

* WHERE절은 데이터베이스에서 레코드를 검색하기 전에 필터링을 수행하므로 검색되는 레코드의 수가 줄어들어 더 효율적

= 불필요한 데이터를 "GROUP BY" 및 "COUNT" 작업에서 제거하므로 쿼리 성능이 향상

 

⭐⭐ 데이터를 필터링할 때는 "WHERE" 절을 사용하고, 집계된 결과에 대한 조건을 지정할 때 "HAVING" 절을 사용

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
SELECT MIN(DATETIME) 시간 
  FROM ANIMAL_INS
;
 
 

🙂 확인 사항

1. ANIMAL_INS 테이블

2. 가장 먼저 들어온 동물 조회

 

😮  외의 풀이

1
2
3
4
5
6
7
8
SELECT DATETIME 시간
  FROM ANIMAL_INS
 WHERE DATETIME = (
                    SELECT MIN(DATETIME)
                      FROM ANIMAL_INS
                  )
;
 
 

중첩 서브쿼리 사용

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM'= '2022-10'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

🙂 확인 사항

1. USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블

2. 2022년 10월에 작성된

3. 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회

4. 댓글 작성일을 기준으로 오름차순 정렬 → 게시글 제목을 기준으로 오름차순 정렬

 

🚨 문자열 비교는 날짜 비교보다 느릴 수 있음

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE EXTRACT(YEAR FROM B.CREATED_DATE) = 2022
     AND EXTRACT(MONTH FROM B.CREATED_DATE) = 10
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

EXTRACT 사용

 

🚨 모든 행을 스캔하여 연도와 월을 추출한 다음 비교하는 형태로 인덱스를 효과적으로 사용하지 못할 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE B.CREATED_DATE >= DATE '2022-10-01'
     AND B.CREATED_DATE < DATE '2022-11-01'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

DATE 리터럴을 사용하여 'YYYY-MM-DD' 형식으로 날짜를 직접 지정

 

⭐ DATE 리터럴을 사용한 방법이 일반적으로 가장 효율적

- 가독성이 좋음

- SQL 표준에 가까운 형태

- 범위 기반의 조건을 사용하면 인덱스를 유용하게 활용할 수 있음

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
  SELECT * 
    FROM CAR_RENTAL_COMPANY_CAR 
   WHERE OPTIONS LIKE '%네비게이션%' 
ORDER BY CAR_ID DESC;
 
 

🙂 확인 사항

1. CAR_RENTAL_COMPANY_CAR  테이블

2. 네비게이션 옵션 포함

3. 자동차 리스트 출력

4. 자동차 ID 기준 내림차순 정렬

 

😮  외의 풀이

1
2
3
4
5
SELECT * 
  FROM CAR_RENTAL_COMPANY_CAR
 WHERE REGEXP_LIKE(OPTIONS, '네비게이션')
ORDER BY CAR_ID DESC;
 
 
 

* REGEXP_LIKE(OPTIONS, '네비게이션')

    - OPTIONS 컬럼에서 정규 표현식을 사용하여 문자열에 '네비게이션'이 있는지 확인

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
11
12
  SELECT HISTORY_ID, 
         CAR_ID, 
         TO_CHAR(START_DATE, 'YYYY-MM-DD') START_DATE, 
         TO_CHAR(END_DATE, 'YYYY-MM-DD') END_DATE,
         CASE
             WHEN (END_DATE-START_DATE) >= 30 THEN '장기 대여'
             ELSE '단기 대여'
         END RENT_TYPE
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
   WHERE TO_CHAR(START_DATE, 'YYYY-MM'= '2022-09'
ORDER BY HISTORY_ID DESC;
 
 

🙂 확인 사항

1. CAR_RENTAL_COMPANY_RENTAL_HISTORY  테이블

2. 대여 시작일이 2022년 9월

3. 대여 기간이 30일 이상 - 장기 대여 / 30일 미만 - 단기 대여

4. 컬럼명은 RENT_TYPE

5. 전체 컬럼에 RENT_TYPE 추가

6. 대여 기록 ID 기준 내림차순 정렬

+ START_DATE, END_DATE 데이터 형태 및 컬럼명 유의

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
  SELECT HISTORY_ID, 
         CAR_ID, 
         TO_CHAR(START_DATE, 'YYYY-MM-DD') START_DATE, 
         TO_CHAR(END_DATE, 'YYYY-MM-DD') END_DATE,
         CASE
           WHEN EXTRACT(DAY FROM NUMTODSINTERVAL((END_DATE - START_DATE), 'DAY TO SECOND')) >= 30 THEN '장기 대여'
           ELSE '단기 대여'
         END RENT_TYPE
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
   WHERE TO_CHAR(START_DATE, 'YYYY-MM'= '2022-09'
ORDER BY HISTORY_ID DESC;
 
 

- NUMTODSINTERVAL(expr, 'DAY TO SECOND')

    - 숫자를 시간 간격 데이터 형식으로 변환

    - DAY TO SECOND: 일(DAY)부터 초(SECOND)까지의 시간 간격

- EXTRACT(DAY FROM ... )

    - 시간 간격 데이터에서 특정 요소를 추출하는 데 사용 - 여기서는 일(DAY)을 추출

 

 

 

🔗 소스 코드
GitHub