본문 바로가기
IT

[TIL/SQL코딩 테스트] Lv.1 문제 해설_16일차(DISTINCT,HAVING,LIMIT,COALESCE )

by 공부하죠 2024. 4. 16.
반응형

프로그래머스에서 코딩 테스트 연습을 한동안 했는데 이걸 정리해볼까합니다.

저는 Oracle이 아닌 MySQL로 코딩합니다.

우선 프로그래머스에서는 Lv.1부터 Lv.5까지 있습니다. ( Lv.5 문제는 별로 없습니다.)

 

저번에 역순정렬은 블로그에 올려서 그거 빼고 정리하겠습니다. 

역순정렬을 보고싶다면 여기를 클릭💨

 

제가 오늘 정리할 건 Lv.1 의 정답률 80%이상의 문제들입니다.

너무 비슷한 문제는 빼고 정리합니다.


🔎 목차 📖

1. 이름이 있는 동물의 아이디

2. 중복 제거하기

3. 동물 수 구하기

4. 동명 동물 수 찾기

5. 상위 n개 레코드
6. 최솟값 구하기 
7. 어린 동물 찾기

8. 이름에 el이 들어가는 동물 찾기
9. 나이 정보가 없는 회원 수 구하기
10. 경기도에 위치한 식품창고 목록 출력하기
11. 흉부외과 또는 일반외과 의사 목록 출력하기

12. 12세 이하인 여자 환자 목록 출력하기


1. 이름이 있는 동물의 아이디

동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

SELECT ANIMAL_ID
from ANIMAL_INS
where NAME is not null
order by ANIMAL_ID

여기에서는 ' 이름이 있는 동물의 ID를 조회'가 가장 중요한 조건입니다. where절에 NAME is not null을 적습니다.

 

2. 중복 제거하기

동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

SELECT count(DISTINCT(NAME))
from ANIMAL_INS

중복 제거에서는 꼭 DISTINCT를 기억하세요.

 

DISTINCT 이란?

DISTINCT중복된 값을 제거하여 유일한 값만 반환하는 키워드입니다.

DISTINCT에 관한 내용을 알고 싶으면 여기를 클릭💨

 

3. 동물 수 구하기

동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

SELECT count(ANIMAL_ID)
from ANIMAL_INS

숫자를 셀 때는 count()를 씁니다. 그리고  count(*)을 하면 테이블에 몇 개의 행이 있는지 쉽게 알 수 있습니다.

 

4. 동명 동물 수 찾기*

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

SELECT NAME,count(NAME) COUNT
from ANIMAL_INS
where name is not null
group by name 
having count(name)>=2
order by name

이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회 ⇒ having count(name)>=2

 

HAVING 이란?

HAVING 은 SQL에서 그룹 함수(예: COUNT, SUM, AVG 등)를 사용하여 그룹화된 결과에 조건을 적용할 때 사용되는 절입니다. 일반적으로 GROUP BY와 함께 사용되며, GROUP BY로 그룹화된 결과에서 특정 조건을 가진 그룹만을 선택할 때 유용합니다.

 

4. 아픈 동물 찾기

동물 보호소에 들어온 동물 중 아픈 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요

SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where INTAKE_CONDITION = 'Sick'

'동물 중 아픈 동물'은 where절에서 특정 컬럼 지정합니다. 속성은 '따옴표'를 꼭 붙입니다.

 

5. 상위 n개 레코드

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

SELECT NAME
from ANIMAL_INS
order by DATETIME
limit 1

'가장 먼저 들어온 동물의 이름'이니까 오름차순으로 정렬해서 첫 행만 쓰면 됩니다.

 

LIMIT란?

LIMIT 은 SQL에서 사용되는 절 중 하나로, 쿼리 결과에서 반환할 행의 수를 제한하는 데 사용됩니다. 보통은 검색된 결과에서 상위 몇 개의 행만을 반환하고자 할 때 사용됩니다.

오라클에서는 LIMIT 키워드 대신에 ROWNUM을 사용하여 행의 수를 제한합니다. 보통 where 절 뒤에 씁니다.

 

6. 최솟값 구하기

동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

SELECT min(DATETIME)
from ANIMAL_INS

숫자는 최솟값 min과 최댓값 max을 쓸 수 있습니다.

 '가장 먼저 들어온 동물의 날짜'이니까 날짜가 가장 작은 것을 조회하면 됩니다.

 

7. 어린 동물 찾기

동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where INTAKE_CONDITION <> 'Aged'

INTAKE_CONDITION( 보호 시작 시 상태 )에서 'Aged'( 나이든)가 아닌 것을 조회합니다.

 

8. 이름에 el이 들어가는 동물 찾기

보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where NAME like '%EL%'and ANIMAL_TYPE='Dog'
order by name

이름에 "EL"이 들어가는 개' 라는 조건은 like문을 이용해서 NAME like '%EL%' 씁니다. 그리고 개라는 조건 떄문에 NIMAL_TYPE='Dog'을 and조건으로 이읍니다.

 

9. 나이 정보가 없는 회원 수 구하기

USER_INFO 테이블에서 나이 정보가 없는 회원이 몇 명인지 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 USERS로 지정해주세요.

SELECT count(*) USERS
from USER_INFO
where AGE is null

'나이 정보가 없는 회원이 몇 명'  where절에서 특정 컬럼 지정하고  count함수를 이용합니다.

 

10. 강원도에 위치한 생산공장 목록 출력하기

FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.

SELECT FACTORY_ID,FACTORY_NAME,ADDRESS
from FOOD_FACTORY
where ADDRESS like '%강원도%'
order by FACTORY_ID

'강원도에 위치한 식품공장'를 ADDRESS like '%강원도%'합니다.

 

11. 흉부외과 또는 일반외과 의사 목록 출력하기

DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.

SELECT DR_NAME,DR_ID,MCDP_CD,date_format(date(HIRE_YMD),'%Y-%m-%d')
from DOCTOR
where MCDP_CD ='CS'	or  MCDP_CD = 'GS'
order by HIRE_YMD desc, DR_NAME

'흉부외과(CS)이거나 일반외과(GS)' 에서 ~거나는 or을 씁니다.

고용일자는 date_format으로 바꿔줘야합니다.

정렬할 때는  내림차순desc오름차순(asc, 따로 안 적어줘도 됨)을 잘 구분합니다.

 

12. 12세 이하인 여자 환자 목록 출력하기

PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

SELECT PT_NAME,	PT_NO,GEND_CD,AGE,coalesce(TLNO, 'NONE')
from PATIENT
where GEND_CD='W' and AGE <=12
order by AGE desc,PT_NAME

'12세 이하인 여자환자'은 GEND_CD='W' and AGE <=12 조건 지정합니다.

'전화번호가 없는 경우, 'NONE'으로 출력'은 coalesce(TLNO, 'NONE') 지정합니다.

 

COALESCE 이란?

COALESCE 함수는 SQL에서 사용되는 함수로, 여러 개의 인수 중 첫 번째로 NULL이 아닌 값을 반환합니다.

주로 NULL을 처리하고 기본값을 설정하는 데 사용됩니다. 즉, 데이터베이스에서 NULL이 아닌 값을 필요로 하는 경우에 유용하게 사용됩니다.

 

 coalesce(컬럼, 대체값) → 컬럼이 null 이고 다른 값으로 대체할 때 coalesce문을 씁니다.

 

null에 관한 내용을 알고 싶으면 여기를 클릭💨

 


 

반응형