1.최댓값구하기
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 |
가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NTAKE_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.)풀이
MAX집계함수를 이용하여 최댓값을 구한다.
SELECT MAX(DATETIME) AS 시간
FROM ANIMAL_INS
2.)최솟값구하기(해당 문제TABLE의 구성은 1번과 동일.)
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NTAKE_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
3.동물 수 구하기(해당 문제TABLE의 구성은 1번과 동일.)
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NTAKE_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.)풀이
ANIMAL_INS의 테이블의 컬럼인 ANIMAL_ID를 기준으로 COUNT()함수를 써준다.
SELECT COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
4.)중복제거하기(해당 문제TABLE의 구성은 1번과 동일.)
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NTAKE_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.)풀이
중복을 제거하기위해 distinct를 사용하고, null일 경우에는 포함하지 않기때문에 밑에와 같은 코드를 작성합니다.
SELECT COUNT(distinct NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
5.고양이와 개는 몇마리 있을까(해당 문제TABLE의 구성은 1번과 동일.)
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NTAKE_CONDITION, NAME, SEX_UPON_INTAKE
A373219 | Cat | 2014-07-29 11:43:00 | Normal | Ella | Spayed Female |
A377750 | Dog | 2017-10-25 17:17:00 | Normal | Lucy | Spayed Female |
A354540 | Cat | 2014-12-11 11:48:00 | Normal | Tux | Neutered Male |
고양이는 2마리, 개는 1마리 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
ANIMAL_TYPE count
Cat | 2 |
Dog | 1 |
5.풀이)
그룹별로 나누어서 출력을 해줘야한다..
일단 COUNT()함수를 이용하여 ANIMAL_TYPE의 튜플수를 파악한 후에, GROUP BY를 이용하여 묶고,
'Cat'이 먼저 나와줘야하기때문에 ORDER BY를 이용하여 오름차순으로 정렬을 하면 원하는 값이 출력된다.
SELECT ANIMAL_TYPE, COUNT(*) count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
6.) 동명 동물 수 찾기(해당 문제TABLE의 구성은 1번과 동일.)
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NTAKE_CONDITION, NAME, SEX_UPON_INTAKE
A396810 | Dog | 2016-08-22 16:13:00 | Injured | Raven | Spayed Female |
A377750 | Dog | 2017-10-25 17:17:00 | Normal | Lucy | Spayed Female |
A355688 | Dog | 2014-01-26 13:48:00 | Normal | Shadow | Neutered Male |
A399421 | Dog | 2015-08-25 14:08:00 | Normal | Lucy | Spayed Female |
A400680 | Dog | 2017-06-17 13:29:00 | Normal | Lucy | Spayed Female |
A410668 | Cat | 2015-11-19 13:41:00 | Normal | Raven | Spayed Female |
- Raven 이름은 2번 쓰였습니다.
- Lucy 이름은 3번 쓰였습니다
- Shadow 이름은 1번 쓰였습니다.
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
NAMECOUNT
Lucy | 3 |
Raven | 2 |
6.)풀이
서브쿼리를 이용하여 문제를 해결한다.
SELECT *
FROM
(SELECT NAME, COUNT(NAME) COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME)
WHERE COUNT >=2
ORDER BY NAME
NAME컬럼의 NULL은 제외하며, NAME컬럼의 튜플의 개수를 카운팅하여 count로 지정해놓고 GROUP BY해놓아서 그룹별 나누어 놓고 count의 수가 1보다 커야하는 수만을 찾아야하기때문에 WHERE절에 조건을 설정을 해놓아서 문제를 해결합니다..
7.)입양시각구하기(해당 문제TABLE의 구성은 1번과 동일.)
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
예시
SQL문을 실행하면 다음과 같이 나와야 합니다.
HOUR COUNT
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
7.)풀이
시각에 대해to_char을 이용하여 시각만을 뽑아내고 HOUR로 선언 후, AND를 사용하여 9시부터 20시전까지로 영역을 나누고 조건에 맞게 출력을 해주면된다....
SELECT HOUR, COUNT(*) count
FROM
(SELECT to_char(DATETIME,'HH24') HOUR
FROM ANIMAL_OUTS)
WHERE HOUR >= 9 AND HOUR < 20
GROUP BY HOUR
ORDER BY HOUR
효율적..?인지는 모르겠다..
추가적으로
서브쿼리의 구분.
일반적으로 그냥 서브쿼리라고 하는데 자세히 조사를 해보면..연관성이 있는 서브쿼리 없는 서브쿼리와
SELECT절에서 쓰냐 FROM절에서 쓰냐에 따라 용어가 달라지는것입니다.
1.연관성이 있냐 없냐의 서브쿼리의 구분은 메인쿼리와 서브쿼리의 연관성(ex : 조인의 경우)이 있냐 없냐의 차이입니다.
2.SELECT절에서 서브쿼리를 사용하면 그것은 그냥 서브쿼리라고합니다.
3.FROM절에서 서브쿼리를 사용하면 인라인 뷰라고합니다. 추가적으로 인라인 뷰에 별칭을 달아주자..
4.WHERE절에서는 서브쿼리를 사용하면 중첩쿼리라고합니다.
SELECT 쿼리문을 실행되었을때의 순서는
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 순대로 진행된다.. 헷갈리지말자..
출처 및 참고
https://programmers.co.kr/learn/challenges 프로그래머스
https://goldsony.tistory.com/109 참고
'Oracle&Mysql' 카테고리의 다른 글
Mysql DB생성 및 권한 (0) | 2021.09.11 |
---|---|
프로그래머스 SQL (OracleDB) 연습문제(NULL) (0) | 2021.07.06 |
프로그래머스 SQL (OracleDB) 연습문제(SELECT) (0) | 2021.07.05 |