원본 링크
https://programmers.co.kr/learn/courses/30/parts/17043
개요
이번엔 기본적인 SELECT
문은 쓸 줄 안다는 전제하에 조금 응용된 문제들을 풀어보려 한다.
어떤 문제는 다른 문제와 풀이가 유사해서 다른 점만 기술하고 넘어갈 수 있다.
공통 조건
ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE
는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
문제 1 (최댓값 구하기)
가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
예를 들어 ANIMAL_INS
테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
---|---|---|---|---|---|
A399552 | Dog | 2013-10-14 15:38:00 | Normal | Jack | Neutered Male |
A379998 | Dog | 2013-10-23 11:42:00 | Normal | Disciple | Intact Male |
A370852 | Dog | 2013-11-03 15:04:00 | Normal | Katie | Spayed Female |
A403564 | Dog | 2013-11-18 17:03:00 | Normal | Anna | Spayed Female |
가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
시간 |
---|
2013-11-18 17:03:00 |
나만의 풀이 1
먼저, AS
라는 기능을 소개하려 한다.
특정 컬럼을 조회할 때, SELECT (컬럼명) AS '이름'
형태로 쓰면, 해당 컬럼의 이름을 바꿀 수 있다.
물론 이 문제에선 이름을 안 바꿔도 된다 했지만, 형태를 맞추기 위해 일부러 바꿨다.
MAX
라는 메소드를 활용해서 풀 수 있으나, 우선 이전에 썼던 LIMIT
을 써서 다음과 같이 풀어봤다.
SELECT DATETIME AS '시간' FROM ANIMAL_INS
ORDER BY DATETIME DESC LIMIT 1
어찌됐건 결과는 동일하게 나온다.
문제 2 (최솟값 구하기)
동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
예를 들어 ANIMAL_INS
테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
---|---|---|---|---|---|
A399552 | Dog | 2013-10-14 15:38:00 | Normal | Jack | Neutered Male |
A379998 | Dog | 2013-10-23 11:42:00 | Normal | Disciple | Intact Male |
A370852 | Dog | 2013-11-03 15:04:00 | Normal | Katie | Spayed Female |
A403564 | Dog | 2013-11-18 17:03:00 | Normal | Anna | Spayed Female |
가장 먼저 들어온 동물은 Jack이고, Jack은 2013-10-14 15:38:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
시간 |
---|
2013-10-14 15:38:00 |
나만의 풀이 2
이번엔 아까와 다르게 MIN
을 써서 풀었다.
해석하는데 크게 문제는 없으므로 상세 기술은 생략한다.
SELECT MIN(DATETIME) AS '시간' FROM ANIMAL_INS
ORDER BY DATETIME
문제 3 (동물 수 구하기)
동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.
예를 들어 ANIMAL_INS
테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
---|---|---|---|---|---|
A399552 | Dog | 2013-10-14 15:38:00 | Normal | Jack | Neutered Male |
A379998 | Dog | 2013-10-23 11:42:00 | Normal | Disciple | Intact Male |
A370852 | Dog | 2013-11-03 15:04:00 | Normal | Katie | Spayed Female |
A403564 | Dog | 2013-11-18 17:03:00 | Normal | Anna | Spayed Female |
동물 보호소에 들어온 동물은 4마리입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
count |
---|
4 |
나만의 풀이 3
사실 이것도 아까 것들을 적절히 조합하면 금방 풀 수 있다.
다만 COUNT
라는 기능을 추가로 쓰게 된다.
여기선 모든 열(와일드 카드: *
)을 기준으로 선택하여 COUNT
했다.
SELECT COUNT(*) AS 'count' FROM ANIMAL_INS
문제 4 (중복 제거하기)
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
예를 들어 ANIMAL_INS
테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
---|---|---|---|---|---|
A562649 | Dog | 2014-03-20 18:06:00 | Sick | NULL | Spayed Female |
A412626 | Dog | 2016-03-13 11:17:00 | Normal | *Sam | Neutered Male |
A563492 | Dog | 2014-10-24 14:45:00 | Normal | *Sam | Neutered Male |
A513956 | Dog | 2017-06-14 11:54:00 | Normal | *Sweetie | Spayed Female |
보호소에 들어온 동물의 이름은 NULL(없음), *Sam, *Sam, *Sweetie입니다. 이 중 NULL과 중복되는 이름을 고려하면, 보호소에 들어온 동물 이름의 수는 2입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
count |
---|
2 |
나만의 풀이 4
문제 3의 응용 버전이다.
여기서도 하나의 기능을 더 알아야 풀 수 있다.DISTINCT
라는 키워드가 있는데, 중복 제거를 담당한다.
특정 column이 있으면, SELECT DISTINCT(컬럼명) ..
의 형태로 해당 컬럼에서 중복된 데이터를 하나로 뭉칠 수 있다.
여기선 최종적으로 구하는 게 중복 제거된 이름의 개수이므로, 다시 COUNT
를 씌워주면 된다.
SELECT COUNT(DISTINCT NAME) AS 'count' FROM ANIMAL_INS
이번 문제들은 몇몇 메소드나 키워드만 알면 금방 풀리는 문제였다.
예전에 내가 SQL을 배웠을 때 가장 어렵고 귀찮았던 부분은 JOIN
연산 파트였던 걸로 기억난다.
그 이전까진 사실상 레퍼런스 참고하고 암기하면 금방 table 검색이 가능했던 것으로 기억난다.
따라서 적어도 아직 JOIN
연산이 나오지 않은 지금은 크게 무리 없이 이해할 수 있을 것이라 본다.
맞다, 근데 SUM
메소드는 어디 갔나고?
그러게... SUM
을 사용할 만한 문제가 안 보이는 것 같다.(내가 잘못 풀었나)
'DB, SQL' 카테고리의 다른 글
[프로그래머스] SQL String과 Date 등.. (0) | 2022.02.10 |
---|---|
[프로그래머스] SQL JOIN문 (0) | 2022.02.08 |
[프로그래머스] SQL NULL 처리하기 (0) | 2022.02.04 |
[프로그래머스] GROUP BY절 (0) | 2022.01.30 |
[프로그래머스] SQL SELECT문 (0) | 2022.01.29 |