<
프로그래머스 SQL 고득점 KIT 문제
>
🌠다음 포스팅🌠

DB암호화 기법
☄이전 포스팅☄

BDD vs TDD
문제 풀이

프로그래머스 SQL 문제 풀이

🐹 SELECT

모든 레코드 조회하기

문제 링크 및 답

말이 필요없는 문제

모든 레코드 조회하기

SELECT * from ANIMAL_INS;

역순 정렬하기

문제 링크 및 답

역순 정렬하기

정렬 명령문 ORDER BY를 적용하는 문제이며 정렬 방법은 크게 오름차순 ASC 와 내림차순 DESC로 나뉜다.

SELECT NAME, DATETIME FROM ANIMAL_INS  ORDER BY ANIMAL_ID DESC;

아픈 동물 찾기

문제 링크 및 답

특정 데이터를 조회하는 방법으로 WHERE절을 사용한다.

아픈동물 찾기

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick';

어린 동물 찾기

문제 링크 및 답

특정 데이터를 조회하는 방법은 != 부호를 사용하면 특정 데이터를 제외한 나머지 데이터를 조회할 수 있다.

어린 동물 찾기

SELECT ANIMAL_ID, NAME from ANIMAL_INS where INTAKE_CONDITION !='Aged' ;

동물의 아이디와 이름

문제 링크 및 답

동물의 아이디와 이름

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC;

여러 기준으로 정렬하기

문제 링크 및 답

두 열의 데이터 정렬기준으로 서로 다르게 할 경우는 별개의 데이터 정렬 방식을 정의 해주면 된다.

` ORDER BY “1번 정렬”, “2번 정렬” `

여러기준으로 정렬하기

SELECT ANIMAL_ID,NAME,DATETIME from ANIMAL_INS order by NAME asc, DATETIME DESC;

상위 N개 레코드

문제 링크 및 답

정렬된 데이터를 위에서 혹은 아래서 N개의 데이터를 조회하고 싶은 경우는 어떠할까? LIMIT 명령어는 사용자가 원하는 데이터의 개수를 입력하면 위에서부터 데이터를 조회할 수 있도록 해준다.

상위 N 개 레코드

SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1;

🐹 SUM, MAX, MIN

최댓값 구하기

문제 링크 및 답

아래 두가지 방법을 사용할 수 있지만 정석 방식은 MAX() 혹은 MIN() 방식을 사용하여 최대 최소를

구하는 방식이다.

ORDER BY 사용범의 기본적인 방법이며 추가적으로 DESC내림차순 정렬 명령어 이다. LIMIT 는 지정된 갯수 만큼 출력하는 명령어 이다.

최댓값 구하기

SELECT MAX(DATETIME) FROM ANIMAL_INS;
                         OR
SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1;

최솟값 구하기

문제 링크 및 답

최솟값 구하기

최댓값 구하기 문제에서 오름차순 정렬 후 1개의 데이터를 뽑으면 되는 문제이다.

** 정석 **

SELECT MIN(DATETIME) FROM ANIMAL_INS;

                OR
                
SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1;

동물 수 구하기

문제 링크 및 답

동물의 수 구하기

테이블 상에서 전체 동물의 수는 행의 갯수(애트리뷰트)를 구하면 된다.

행의 갯수는 COUNT(*) 명령어 이다.

SELECT COUNT(*) FROM ANIMAL_INS;

만일 특정 테이터의 갯수를 구하고 싶다면?

“DOG” 의 갯수 구하기

SELECT COUNT(ANIMAL_TYPE) FROM ANIMAL_INS WHERE ANIMAL_TYPE = 'DOG';
                                  OR
SELECT COUNT(CASE WHEN ANIMAL_TYPE ='DOG' THEN 1 END) FROM ANIMAL_INS;

칼럼의 갯수를 구하거나 동일 데이터가 많을 경우 중복을 제거하는 명령어가 존재한다. DISTINCT별개의 라는 뜻을 가지고 있으며 중복을 제거해주는 명령어이다.

문제에서 이름 NAME 데이터으 중복성 제거와 이름의 상태가 ‘NULL’ 인 데이터를 제외한 테이블의 갯수를 요구하는 문제이다.

여기서 사용해야하는 명령어는 DISTINCT IS NOT NULL COUNT 세가지 명령어를 사용하면 된다.

중복제거하기

문제 링크 및 답

중복 제거하기

SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL;

🐹 GROUP BY

고양이와 개는 몇 마리 있을까?

문제 링크 및 답

고양이와 개는 몇 마리 있을까?

핵심은 Group By와 COUNT() 명령어를 얼마나 잘 이해하였는 지에 대한 문제이다.

출력의 결과가 타입과, 타입별 동물의 마릿수 이므로 COUNT() 명령어를 추가적으로 입력해주고

단, 동물 전체의 마리수(개+ 고양이) 가 아닌 각 동물의 마릿수가 출력될 수 있도록 group by 명령어를 추가 입력해 주도록 한다.

SELECT ANIMAL_TYPE, count(ANIMAL_TYPE) 
from ANIMAL_INS 
group by ANIMAL_TYPE
order by ANIMAL_TYPE;

동명 동물의 수 찾기

문제 링크 및 답

동명 동물의 수 찾기

집계 함수 (SUM(), COUNT() … )사용시에는 WHERE절을 사용할 수 없는 것을 꼭 알고 있어야한다.

집계함수 사용시 WHERE절과 같은 조건문을 사용하고 싶다면 HAVING 문을 사용해야 한다.

SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
GROUP BY NAME  
HAVING COUNT(NAME) >1
ORDER BY NAME;

입양 시각 구하기(1)

문제 링크 및 답

입양 시각 구하기(1)

가장 눈여겨 봐야할 문법은 시간을 관리하는 HOUR 명령어 일것이다. 동시에 시간과 시간 사이의 조건을 더해줄 AND 절까지

작성하면 될것이다.

날짜 관련 함수 모음

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <=19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)

입양 시각 구하기(2)

문제 링크 및 답

입양 시각 구하기(2)

테이플의 형태는 입양 시각 구하기(1)과 동일하나

다음 문제는 어느 시간이 가장 활발하게 이루어지는가에 대한 문제이다. 때문에 모든 시간 (00 ~ 24시)의 시간을 모두 구분하여 확인해야한다.

우선 시간에 따른 테이블을 만들어준다. (답은 아래)

@변수 를 통해 시간 증가를 튜플의 크기만큼 시간을 부여한다.

(해당 테이블은 99개의 튜플로 이루어져 있기 때문에 0 ~ 99 까지 1씩 증가하는 튜플이 만들어진다.)

SET @hour := -1

SELECT (@hour := @hour + 1)
FROM ANIMAL_OUTS;

@hour := @hour + 1는 java에서 변수++; 와 동일하다.

  1. 문제는 각 애트리 뷰트가 다른 성질을 가지고 있기때문에 별도으 SELECT문을 작성해 주어야 한다는 것이다.

HOUR에 대한 애트리뷰트를 작성은 어렵지 않다.

SET @hour := -1; -- 변수 선언

SELECT (@hour := @hour + 1) as HOUR
FROM ANIMAL_OUTS
WHERE @hour < 23
  1. 다음은 동일 시간대의 등장 회수 이므로 COUNT() 함수를 작성해 주며 변수 @hour 은 프로세스가 종료되기 까지 1씩 증가되므로

WHERE절 에 조건으로 사용해주면 동일 시간대의 갯수를 구할 수 있다.

SET @hour := -1; -- 변수 선언

SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour as `COUNT`;

  1. 마지막으로 두가지 쿼리를 합해주는 것으로 최종 쿼리가 완성이 되어진다.
SET @hour := -1; -- 변수 선언

SELECT (@hour := @hour + 1) as HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23
<추가> MySQL에서 '=' 연산자는 두 가지 의미로 해석됨 우선 SET 문이나 UPDATE 문의 SET 절에서 사용되면, 왼쪽 피연산자에 오른쪽 피연산자를 대입하는 대입 연산자로 해석 SET 문이나 UPDATE 문의 SET 절 이외에서 사용되면, 왼쪽 피연산자와 오른쪽 피연산자를 비교하는 비교 연산자로 해석 </div> </details> ### 🐹 IS NULL #### 이름이 없는 동물의 아이디
문제 링크 및 답

이름이 없는 동물의 아이디

전체 테이블을 조회 후 조건절에 null 값을 초회 해주면 되겠다.

단, 조건절에서 == 등호는 사용할 수 없으니 반드시 IS 명령어를 사용해야한다.

SELECT ANIMAL_ID from ANIMAL_INS WHERE NAME IS NULL;
#### 이름이 있는 동물의 아이디
문제 링크 및 답

이름이 있는 동물의 아이디

그렇다면 반대로 이름을 조회할 경우는 어떻게 구현할까?

IS 명령어가 WHERE 절에서 == 와 같은 의미라면

IS NOT!= 와 같은 의미 입니다.

SELECT ANIMAL_ID from ANIMAL_INS WHERE NAME IS NOT NULL;
#### NULL 처리하기
문제 링크 및 답

NULL 처리하기

테이블의 일부 데이터가 NULL 값인 경우 그 의미를 모르는 사용자 들에게 No name 을 반환 하도록 구현하려한다.

우선 NULL 값을 조회하는 쿼리를 작성 후 생각해보자.

SELECT ANIMAL_TYPE FROM ANIMAL_INS WHERE NAME IS NULL;

그 후, 출력 부분인 SELECT 부분을 통해 해당 값이 NULL 일 경우 “NO name”으로 출력 되도록 조건절을 주어야 한다.

여기서 IFNULL 명령어를 사용하면 되겠다. 동시에 WHERE문은 필요가 없으니 지워주도록 한다.

SELECT ANIMAL_TYPE, ifNULL(NAME, "No name") FROM ANIMAL_INS;

마지막으로 원하는 테이블을 출력할 수 있도록 구현해주면 된다.

SELECT ANIMAL_TYPE, IFNULL(NAME, "No name") AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS;
### 🐹 JOIN ### 🐹 String, Data
Top
Foot