TIL_[SQL] 프로그래머스_코딩테스트 회고를 통한 sql 문법 공부

김희정·2023년 11월 30일

TIL

목록 보기
3/57
post-thumbnail

프로그래머스_SQL문제 / 동명 동물 수 찾기

Q. 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성하시오. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회하시오.

이름이 두개 이상인 애들을 이름으로 묶어서 카운트하는데에서 막혔다.
group by name 으로 묶는건 알겠는데 이름이 두개 이상인걸 어떻게 거르지?
찾아보니 having count 로 쓰면 되는 거였다.

정답
SELECT name, count(name)
from animal_ins
group by 1
having count(name) >= 2
order by 1

count(distinct name)이 아닌점, where name is not null 이 아닌점이 뭔지 잘 생각해보니
having count(name) >= 2 에서 이미 걸러졌기 때문에 작성할 필요가 없다는 걸 깨달았다.

++ having 에 대한 추가 조사

HAVING

  • 가져올 데이터 그룹에 조건을 지정해주는 키워드
  • having 조건식 형식으로 사용함
  • 조건식 = True(참)이 되는 그룹만 선택
  • HAVING절의 조건식에는 그룹함수 활용
  • 작성 방법
    select
    from
    where
    group by
    having <조건문>
    order by

그룹함수 종류

  1. count
  2. sum
  3. avg
  4. min
  5. max
  • 이 다섯가지 함수는 워낙 유명하니 따로 설명은 안적겠다
  • 그룹함수에서 가장 중요한 특징은 NULL 값을 제외하고 작업을 진행한다

상위 n개 레코드

Q. 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성하시오.

프로세스 정리
1. 조회할 컬럼 : 이름
2. 가장 먼저들어온 순으로 정렬
3. 그중 제일 빠른 컬럼 추출

3에서 막혀서 정답지를 보면서 나름의 풀이를 해봤다.
3을 해결하기 위해선 2가지 방법이 있다.

LIMIT 함수 사용

  • 가져올 데이터의 로우 개수를 지정 (데이터의 일부만 확인하고 싶을때)
  • 'LIMIT 로우수' 형식으로 사용
  • 쿼리의 가장 마지막에 위치
  • 만약 입력한 숫자가 전체 row 수 보다 크다면, 있는 row 까지만 가져옴
정답
SELECT name
from animal_ins
order by datetime
limit 1

서브쿼리

정답
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)

WHERE 절의 서브쿼리 (= 중첩 서브쿼리)

  • where 절의 서브쿼리는 반드시 결과값이 하나의 컬럼 이어야 함 (exists 제외)
    - 하나의 컬럼에는 여러 개의 값이 존재 할 수 있음
  • 연산자와 함께 사용
select a
from b
where c [연산자] [서브쿼리]

++추가로

서브쿼리에 사용하는 연산자

  1. 비교 연산자 (>,<,<>,!=)
    • 비교 연산자만 사용시, where절의 서브쿼리는 반드시 결과값이 하나의 값이어야 함
  2. 주요 연산자
연산자활용의미
INA IN (서브쿼리)A가 (서브쿼리)의 결과값 내에 있다
ALLA < ALL(서브쿼리)A가 모든 (서브쿼리)의 결과값보다 작다
ALLA > ALL(서브쿼리)A가 모든 (서브쿼리)의 결과값보다 크다
ANYA < ANY(서브쿼리)A가 (서브쿼리)의 결과값보다 하나라도 작다
ANYA > ANY(서브쿼리)A가 (서브쿼리)의 결과값보다 하나라도 크다
EXISTSEXISTS(서브쿼리)(서브쿼리)의 결과값이 존재한다
EXISTSNOT EXISTS(서브쿼리)(서브쿼리)의 결과값이 존재하지 않는다
- 주요 연산자 사용시, where절의 서브쿼리는 반드시 결과값이 하나의 컬럼이어야 함
- 단, exists는 단독으로 사용하며, 결과값이 여러 컬럼이어도 상관 없다
  1. WHERE절 서브쿼리 예제
//평균 점수보다 낮은 학생들 이름 가져오기
select name
from class
where score < (select avg(score) from class)
profile
데이터 애널리스트가 되고 싶은

0개의 댓글